aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/CONTRIBUTING.md27
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml20
-rw-r--r--ARCHITECTURE.md12
-rw-r--r--CHANGELOG.md314
-rw-r--r--CREDITS.md61
-rw-r--r--FAQ.md44
-rw-r--r--README.md126
-rw-r--r--SECURITY.md15
-rw-r--r--client/e2e/src/po/video-watch.po.ts2
-rw-r--r--client/package.json63
-rw-r--r--client/src/app/+about/about-instance/about-instance.component.html67
-rw-r--r--client/src/app/+about/about-instance/about-instance.component.scss16
-rw-r--r--client/src/app/+about/about-instance/about-instance.component.ts27
-rw-r--r--client/src/app/+about/about-instance/contact-admin-modal.component.html50
-rw-r--r--client/src/app/+about/about-instance/contact-admin-modal.component.scss11
-rw-r--r--client/src/app/+about/about-instance/contact-admin-modal.component.ts77
-rw-r--r--client/src/app/+about/about-peertube/about-peertube.component.html4
-rw-r--r--client/src/app/+about/about.module.ts4
-rw-r--r--client/src/app/+accounts/account-about/account-about.component.ts4
-rw-r--r--client/src/app/+accounts/account-videos/account-videos.component.ts4
-rw-r--r--client/src/app/+accounts/accounts.component.html11
-rw-r--r--client/src/app/+accounts/accounts.component.ts12
-rw-r--r--client/src/app/+admin/admin.module.ts6
-rw-r--r--client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html480
-rw-r--r--client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts234
-rw-r--r--client/src/app/+admin/follows/followers-list/followers-list.component.html9
-rw-r--r--client/src/app/+admin/follows/followers-list/followers-list.component.scss10
-rw-r--r--client/src/app/+admin/follows/followers-list/followers-list.component.ts10
-rw-r--r--client/src/app/+admin/follows/following-add/following-add.component.ts8
-rw-r--r--client/src/app/+admin/follows/following-list/following-list.component.html11
-rw-r--r--client/src/app/+admin/follows/following-list/following-list.component.scss11
-rw-r--r--client/src/app/+admin/follows/following-list/following-list.component.ts17
-rw-r--r--client/src/app/+admin/follows/shared/follow.service.ts8
-rw-r--r--client/src/app/+admin/follows/shared/redundancy-checkbox.component.ts21
-rw-r--r--client/src/app/+admin/jobs/jobs-list/jobs-list.component.ts8
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/index.ts2
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html22
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.scss7
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.ts58
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html23
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss7
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.ts57
-rw-r--r--client/src/app/+admin/moderation/moderation.component.html4
-rw-r--r--client/src/app/+admin/moderation/moderation.component.scss1
-rw-r--r--client/src/app/+admin/moderation/moderation.component.ts8
-rw-r--r--client/src/app/+admin/moderation/moderation.routes.ts23
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html9
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts27
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html10
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts29
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html12
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts27
-rw-r--r--client/src/app/+admin/users/user-edit/index.ts1
-rw-r--r--client/src/app/+admin/users/user-edit/user-create.component.ts10
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.component.html14
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.component.scss22
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.ts14
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.html21
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.scss22
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.ts64
-rw-r--r--client/src/app/+admin/users/user-edit/user-update.component.ts23
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.html56
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.scss12
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.ts131
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html26
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.scss7
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.ts56
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html27
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.scss7
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.ts57
-rw-r--r--client/src/app/+my-account/my-account-history/my-account-history.component.html27
-rw-r--r--client/src/app/+my-account/my-account-history/my-account-history.component.scss99
-rw-r--r--client/src/app/+my-account/my-account-history/my-account-history.component.ts107
-rw-r--r--client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html13
-rw-r--r--client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss25
-rw-r--r--client/src/app/+my-account/my-account-notifications/my-account-notifications.component.ts14
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html3
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts9
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html4
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-ownership.component.ts39
-rw-r--r--client/src/app/+my-account/my-account-routing.module.ts40
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts7
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts8
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-notification-preferences/index.ts1
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html19
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.scss25
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts99
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts6
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-settings.component.html11
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-settings.component.ts8
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html17
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts12
-rw-r--r--client/src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts6
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts9
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channel-edit.ts4
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts20
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html2
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss2
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts21
-rw-r--r--client/src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts8
-rw-r--r--client/src/app/+my-account/my-account-videos/my-account-videos.component.html6
-rw-r--r--client/src/app/+my-account/my-account-videos/my-account-videos.component.scss13
-rw-r--r--client/src/app/+my-account/my-account-videos/my-account-videos.component.ts22
-rw-r--r--client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html9
-rw-r--r--client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts16
-rw-r--r--client/src/app/+my-account/my-account.component.html23
-rw-r--r--client/src/app/+my-account/my-account.component.scss15
-rw-r--r--client/src/app/+my-account/my-account.component.ts96
-rw-r--r--client/src/app/+my-account/my-account.module.ts16
-rw-r--r--client/src/app/+my-account/shared/actor-avatar-info.component.ts10
-rw-r--r--client/src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts11
-rw-r--r--client/src/app/+verify-account/verify-account-email/verify-account-email.component.html2
-rw-r--r--client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts9
-rw-r--r--client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts2
-rw-r--r--client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts8
-rw-r--r--client/src/app/+video-channels/video-channels-routing.module.ts2
-rw-r--r--client/src/app/+video-channels/video-channels.component.ts4
-rw-r--r--client/src/app/app-routing.module.ts3
-rw-r--r--client/src/app/app.component.html19
-rw-r--r--client/src/app/app.component.scss5
-rw-r--r--client/src/app/app.component.ts13
-rw-r--r--client/src/app/app.module.ts6
-rw-r--r--client/src/app/core/auth/auth-user.model.ts14
-rw-r--r--client/src/app/core/auth/auth.service.ts18
-rw-r--r--client/src/app/core/auth/index.ts1
-rw-r--r--client/src/app/core/confirm/index.ts1
-rw-r--r--client/src/app/core/core.module.ts25
-rw-r--r--client/src/app/core/index.ts1
-rw-r--r--client/src/app/core/notification/index.ts2
-rw-r--r--client/src/app/core/notification/notifier.service.ts41
-rw-r--r--client/src/app/core/notification/user-notification-socket.service.ts41
-rw-r--r--client/src/app/core/routing/login-guard.service.ts10
-rw-r--r--client/src/app/core/routing/redirect.service.ts21
-rw-r--r--client/src/app/core/routing/user-right-guard.service.ts2
-rw-r--r--client/src/app/core/server/server.service.ts23
-rw-r--r--client/src/app/core/theme/theme.service.ts4
-rw-r--r--client/src/app/header/header.component.html6
-rw-r--r--client/src/app/header/header.component.scss11
-rw-r--r--client/src/app/login/login.component.html10
-rw-r--r--client/src/app/login/login.component.ts29
-rw-r--r--client/src/app/menu/avatar-notification.component.html23
-rw-r--r--client/src/app/menu/avatar-notification.component.scss91
-rw-r--r--client/src/app/menu/avatar-notification.component.ts65
-rw-r--r--client/src/app/menu/index.ts2
-rw-r--r--client/src/app/menu/language-chooser.component.html7
-rw-r--r--client/src/app/menu/language-chooser.component.scss7
-rw-r--r--client/src/app/menu/menu.component.html6
-rw-r--r--client/src/app/menu/menu.component.scss17
-rw-r--r--client/src/app/menu/menu.component.ts2
-rw-r--r--client/src/app/reset-password/reset-password.component.ts13
-rw-r--r--client/src/app/search/search-filters.component.ts6
-rw-r--r--client/src/app/search/search.component.html2
-rw-r--r--client/src/app/search/search.component.scss4
-rw-r--r--client/src/app/search/search.component.ts22
-rw-r--r--client/src/app/shared/account/account.model.ts9
-rw-r--r--client/src/app/shared/actor/actor.model.ts2
-rw-r--r--client/src/app/shared/blocklist/account-block.model.ts14
-rw-r--r--client/src/app/shared/blocklist/blocklist.service.ts135
-rw-r--r--client/src/app/shared/blocklist/index.ts2
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.html30
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.scss34
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.ts18
-rw-r--r--client/src/app/shared/buttons/button.component.html2
-rw-r--r--client/src/app/shared/buttons/button.component.scss35
-rw-r--r--client/src/app/shared/buttons/button.component.ts7
-rw-r--r--client/src/app/shared/buttons/delete-button.component.html2
-rw-r--r--client/src/app/shared/buttons/edit-button.component.html2
-rw-r--r--client/src/app/shared/buttons/edit-button.component.ts2
-rw-r--r--client/src/app/shared/confirm/confirm.component.html (renamed from client/src/app/core/confirm/confirm.component.html)3
-rw-r--r--client/src/app/shared/confirm/confirm.component.scss (renamed from client/src/app/core/confirm/confirm.component.scss)0
-rw-r--r--client/src/app/shared/confirm/confirm.component.ts (renamed from client/src/app/core/confirm/confirm.component.ts)2
-rw-r--r--client/src/app/shared/forms/form-reactive.ts48
-rw-r--r--client/src/app/shared/forms/form-validators/form-validator.service.ts33
-rw-r--r--client/src/app/shared/forms/form-validators/index.ts1
-rw-r--r--client/src/app/shared/forms/form-validators/instance-validators.service.ts48
-rw-r--r--client/src/app/shared/forms/form-validators/user-validators.service.ts24
-rw-r--r--client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts8
-rw-r--r--client/src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts15
-rw-r--r--client/src/app/shared/forms/form-validators/video-channel-validators.service.ts28
-rw-r--r--client/src/app/shared/forms/form-validators/video-validators.service.ts4
-rw-r--r--client/src/app/shared/forms/index.ts1
-rw-r--r--client/src/app/shared/forms/markdown-textarea.component.ts2
-rw-r--r--client/src/app/shared/forms/peertube-checkbox.component.html6
-rw-r--r--client/src/app/shared/forms/peertube-checkbox.component.scss6
-rw-r--r--client/src/app/shared/forms/peertube-checkbox.component.ts5
-rw-r--r--client/src/app/shared/forms/reactive-file.component.ts17
-rw-r--r--client/src/app/shared/forms/textarea-autoresize.directive.ts25
-rw-r--r--client/src/app/shared/guards/can-deactivate-guard.service.ts4
-rw-r--r--client/src/app/shared/icons/global-icon.component.html0
-rw-r--r--client/src/app/shared/icons/global-icon.component.scss4
-rw-r--r--client/src/app/shared/icons/global-icon.component.ts48
-rw-r--r--client/src/app/shared/instance/instance.service.ts36
-rw-r--r--client/src/app/shared/menu/top-menu-dropdown.component.html21
-rw-r--r--client/src/app/shared/menu/top-menu-dropdown.component.scss18
-rw-r--r--client/src/app/shared/menu/top-menu-dropdown.component.ts83
-rw-r--r--client/src/app/shared/misc/from-now.pipe.ts5
-rw-r--r--client/src/app/shared/misc/help.component.html5
-rw-r--r--client/src/app/shared/misc/help.component.scss43
-rw-r--r--client/src/app/shared/misc/help.component.ts2
-rw-r--r--client/src/app/shared/misc/peertube-local-storage.ts6
-rw-r--r--client/src/app/shared/misc/utils.ts20
-rw-r--r--client/src/app/shared/moderation/user-ban-modal.component.html9
-rw-r--r--client/src/app/shared/moderation/user-ban-modal.component.ts33
-rw-r--r--client/src/app/shared/moderation/user-moderation-dropdown.component.html7
-rw-r--r--client/src/app/shared/moderation/user-moderation-dropdown.component.ts261
-rw-r--r--client/src/app/shared/overview/videos-overview.model.ts1
-rw-r--r--client/src/app/shared/renderer/html-renderer.service.ts35
-rw-r--r--client/src/app/shared/renderer/index.ts3
-rw-r--r--client/src/app/shared/renderer/linkifier.service.ts (renamed from client/src/app/videos/+video-watch/comment/linkifier.service.ts)7
-rw-r--r--client/src/app/shared/renderer/markdown.service.ts (renamed from client/src/app/videos/shared/markdown.service.ts)0
-rw-r--r--client/src/app/shared/rest/component-pagination.model.ts11
-rw-r--r--client/src/app/shared/rest/rest-extractor.service.ts5
-rw-r--r--client/src/app/shared/rest/rest-table.ts29
-rw-r--r--client/src/app/shared/rest/rest.service.ts2
-rw-r--r--client/src/app/shared/shared.module.ts48
-rw-r--r--client/src/app/shared/user-subscription/remote-subscribe.component.ts23
-rw-r--r--client/src/app/shared/user-subscription/subscribe-button.component.ts30
-rw-r--r--client/src/app/shared/users/index.ts1
-rw-r--r--client/src/app/shared/users/user-history.service.ts45
-rw-r--r--client/src/app/shared/users/user-notification.model.ts155
-rw-r--r--client/src/app/shared/users/user-notification.service.ts86
-rw-r--r--client/src/app/shared/users/user-notifications.component.html101
-rw-r--r--client/src/app/shared/users/user-notifications.component.scss51
-rw-r--r--client/src/app/shared/users/user-notifications.component.ts87
-rw-r--r--client/src/app/shared/users/user.model.ts38
-rw-r--r--client/src/app/shared/users/user.service.ts52
-rw-r--r--client/src/app/shared/video-abuse/video-abuse.service.ts4
-rw-r--r--client/src/app/shared/video-blacklist/video-blacklist.service.ts7
-rw-r--r--client/src/app/shared/video/abstract-video-list.html19
-rw-r--r--client/src/app/shared/video/abstract-video-list.scss25
-rw-r--r--client/src/app/shared/video/abstract-video-list.ts21
-rw-r--r--client/src/app/shared/video/feed.component.html (renamed from client/src/app/shared/video/video-feed.component.html)9
-rw-r--r--client/src/app/shared/video/feed.component.scss18
-rw-r--r--client/src/app/shared/video/feed.component.ts11
-rw-r--r--client/src/app/shared/video/syndication.model.ts7
-rw-r--r--client/src/app/shared/video/video-details.model.ts13
-rw-r--r--client/src/app/shared/video/video-edit.model.ts4
-rw-r--r--client/src/app/shared/video/video-feed.component.scss19
-rw-r--r--client/src/app/shared/video/video-feed.component.ts10
-rw-r--r--client/src/app/shared/video/video-miniature.component.html3
-rw-r--r--client/src/app/shared/video/video-miniature.component.scss4
-rw-r--r--client/src/app/shared/video/video-miniature.component.ts9
-rw-r--r--client/src/app/shared/video/video.model.ts4
-rw-r--r--client/src/app/shared/video/video.service.ts8
-rw-r--r--client/src/app/signup/signup.component.html7
-rw-r--r--client/src/app/signup/signup.component.ts34
-rw-r--r--client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html2
-rw-r--r--client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.ts8
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.html5
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.scss33
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.ts11
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html13
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss45
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts27
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html14
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss37
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts20
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-send.scss54
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-send.ts12
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.html22
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss42
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts48
-rw-r--r--client/src/app/videos/+video-edit/video-add.component.html8
-rw-r--r--client/src/app/videos/+video-edit/video-add.component.ts19
-rw-r--r--client/src/app/videos/+video-edit/video-update.component.html4
-rw-r--r--client/src/app/videos/+video-edit/video-update.component.ts37
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment-add.component.html2
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment-add.component.ts15
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.component.scss6
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.component.ts29
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.model.ts2
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.service.ts14
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comments.component.html2
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comments.component.scss2
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comments.component.ts37
-rw-r--r--client/src/app/videos/+video-watch/modal/video-blacklist.component.html9
-rw-r--r--client/src/app/videos/+video-watch/modal/video-blacklist.component.ts19
-rw-r--r--client/src/app/videos/+video-watch/modal/video-download.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-download.component.ts6
-rw-r--r--client/src/app/videos/+video-watch/modal/video-report.component.html7
-rw-r--r--client/src/app/videos/+video-watch/modal/video-report.component.scss4
-rw-r--r--client/src/app/videos/+video-watch/modal/video-report.component.ts24
-rw-r--r--client/src/app/videos/+video-watch/modal/video-share.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-share.component.ts6
-rw-r--r--client/src/app/videos/+video-watch/modal/video-support.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-support.component.ts3
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.html24
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.scss82
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.ts155
-rw-r--r--client/src/app/videos/+video-watch/video-watch.module.ts6
-rw-r--r--client/src/app/videos/shared/index.ts1
-rw-r--r--client/src/app/videos/video-list/video-local.component.ts16
-rw-r--r--client/src/app/videos/video-list/video-overview.component.ts10
-rw-r--r--client/src/app/videos/video-list/video-recently-added.component.ts4
-rw-r--r--client/src/app/videos/video-list/video-trending.component.ts23
-rw-r--r--client/src/app/videos/video-list/video-user-subscriptions.component.ts4
-rw-r--r--client/src/assets/images/global/add.html (renamed from client/src/assets/images/global/add.svg)6
-rw-r--r--client/src/assets/images/global/alert.html (renamed from client/src/assets/images/video/alert.svg)9
-rw-r--r--client/src/assets/images/global/circle-tick.html12
-rw-r--r--client/src/assets/images/global/cloud-download.html11
-rw-r--r--client/src/assets/images/global/cloud-error.html11
-rw-r--r--client/src/assets/images/global/cog.html9
-rw-r--r--client/src/assets/images/global/cross.html (renamed from client/src/assets/images/global/cross.svg)6
-rw-r--r--client/src/assets/images/global/delete-black.svg14
-rw-r--r--client/src/assets/images/global/delete-grey.svg14
-rw-r--r--client/src/assets/images/global/delete.html (renamed from client/src/assets/images/global/delete-white.svg)14
-rw-r--r--client/src/assets/images/global/download.html (renamed from client/src/assets/images/video/download-black.svg)9
-rw-r--r--client/src/assets/images/global/edit-black.svg15
-rw-r--r--client/src/assets/images/global/edit.html (renamed from client/src/assets/images/global/edit-grey.svg)9
-rw-r--r--client/src/assets/images/global/help.html (renamed from client/src/assets/images/global/help.svg)12
-rw-r--r--client/src/assets/images/global/im-with-her.html (renamed from client/src/assets/images/global/im-with-her.svg)13
-rw-r--r--client/src/assets/images/global/no.html10
-rw-r--r--client/src/assets/images/global/sparkle.html11
-rw-r--r--client/src/assets/images/global/syndication.html (renamed from client/src/assets/images/global/syndication.svg)4
-rw-r--r--client/src/assets/images/global/tick.html (renamed from client/src/assets/images/global/tick.svg)6
-rw-r--r--client/src/assets/images/global/undo.html9
-rw-r--r--client/src/assets/images/global/undo.svg11
-rw-r--r--client/src/assets/images/global/user-add.html11
-rw-r--r--client/src/assets/images/global/validate.html (renamed from client/src/assets/images/global/validate.svg)6
-rw-r--r--client/src/assets/images/video/blacklist.svg15
-rw-r--r--client/src/assets/images/video/dislike-white.svg14
-rw-r--r--client/src/assets/images/video/dislike.html (renamed from client/src/assets/images/video/dislike-grey.svg)6
-rw-r--r--client/src/assets/images/video/download-grey.svg16
-rw-r--r--client/src/assets/images/video/download-white.svg16
-rw-r--r--client/src/assets/images/video/heart.html (renamed from client/src/assets/images/video/heart.svg)8
-rw-r--r--client/src/assets/images/video/like-white.svg15
-rw-r--r--client/src/assets/images/video/like.html (renamed from client/src/assets/images/video/like-grey.svg)9
-rw-r--r--client/src/assets/images/video/more.html (renamed from client/src/assets/images/video/more.svg)6
-rw-r--r--client/src/assets/images/video/share.html (renamed from client/src/assets/images/video/share.svg)9
-rw-r--r--client/src/assets/images/video/upload.html (renamed from client/src/assets/images/header/upload.svg)9
-rw-r--r--client/src/assets/images/video/upload.svg16
-rw-r--r--client/src/assets/player/images/tick-white.svg (renamed from client/src/assets/player/images/tick.svg)0
-rw-r--r--client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts143
-rw-r--r--client/src/assets/player/p2p-media-loader/segment-url-builder.ts28
-rw-r--r--client/src/assets/player/p2p-media-loader/segment-validator.ts63
-rw-r--r--client/src/assets/player/peertube-player-local-storage.ts21
-rw-r--r--client/src/assets/player/peertube-player-manager.ts466
-rw-r--r--client/src/assets/player/peertube-player.ts284
-rw-r--r--client/src/assets/player/peertube-plugin.ts262
-rw-r--r--client/src/assets/player/peertube-videojs-typings.ts98
-rw-r--r--client/src/assets/player/resolution-menu-button.ts85
-rw-r--r--client/src/assets/player/resolution-menu-item.ts64
-rw-r--r--client/src/assets/player/utils.ts17
-rw-r--r--client/src/assets/player/videojs-components/p2p-info-button.ts (renamed from client/src/assets/player/webtorrent-info-button.ts)25
-rw-r--r--client/src/assets/player/videojs-components/peertube-link-button.ts (renamed from client/src/assets/player/peertube-link-button.ts)10
-rw-r--r--client/src/assets/player/videojs-components/peertube-load-progress-bar.ts (renamed from client/src/assets/player/peertube-load-progress-bar.ts)9
-rw-r--r--client/src/assets/player/videojs-components/resolution-menu-button.ts109
-rw-r--r--client/src/assets/player/videojs-components/resolution-menu-item.ts83
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-button.ts (renamed from client/src/assets/player/settings-menu-button.ts)25
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-item.ts (renamed from client/src/assets/player/settings-menu-item.ts)49
-rw-r--r--client/src/assets/player/videojs-components/theater-button.ts (renamed from client/src/assets/player/theater-button.ts)10
-rw-r--r--client/src/assets/player/webtorrent/peertube-chunk-store.ts (renamed from client/src/assets/player/peertube-chunk-store.ts)20
-rw-r--r--client/src/assets/player/webtorrent/video-renderer.ts (renamed from client/src/assets/player/video-renderer.ts)18
-rw-r--r--client/src/assets/player/webtorrent/webtorrent-plugin.ts (renamed from client/src/assets/player/peertube-videojs-plugin.ts)379
-rw-r--r--client/src/environments/environment.ts7
-rw-r--r--client/src/index.html4
-rw-r--r--client/src/locale/source/angular_en_US.xml2386
-rw-r--r--client/src/locale/source/server_en_US.xml20
-rw-r--r--client/src/locale/target/angular_ar_001.xml1187
-rw-r--r--client/src/locale/target/angular_ca_ES.xml515
-rw-r--r--client/src/locale/target/angular_cs_CZ.xml1292
-rw-r--r--client/src/locale/target/angular_de_DE.xml1653
-rw-r--r--client/src/locale/target/angular_eo.xml602
-rw-r--r--client/src/locale/target/angular_es_ES.xml3085
-rw-r--r--client/src/locale/target/angular_eu_ES.xml1641
-rw-r--r--client/src/locale/target/angular_fa_IR.xml142
-rw-r--r--client/src/locale/target/angular_fr_FR.xml1940
-rw-r--r--client/src/locale/target/angular_gl_ES.xml206
-rw-r--r--client/src/locale/target/angular_it_IT.xml1668
-rw-r--r--client/src/locale/target/angular_ja_JP.xml563
-rw-r--r--client/src/locale/target/angular_jbo.xml1388
-rw-r--r--client/src/locale/target/angular_nl_NL.xml4558
-rw-r--r--client/src/locale/target/angular_oc.xml1979
-rw-r--r--client/src/locale/target/angular_pl_PL.xml862
-rw-r--r--client/src/locale/target/angular_pt_BR.xml911
-rw-r--r--client/src/locale/target/angular_ru_RU.xml648
-rw-r--r--client/src/locale/target/angular_sv_SE.xml1416
-rw-r--r--client/src/locale/target/angular_ta.xml514
-rw-r--r--client/src/locale/target/angular_zh_Hans_CN.xml1375
-rw-r--r--client/src/locale/target/angular_zh_Hant_TW.xml1672
-rw-r--r--client/src/locale/target/iso639_nl_NL.xml22
-rw-r--r--client/src/locale/target/iso639_pl_PL.xml695
-rw-r--r--client/src/locale/target/player_ar_001.xml28
-rw-r--r--client/src/locale/target/player_de_DE.json2
-rw-r--r--client/src/locale/target/player_it_IT.json1
-rw-r--r--client/src/locale/target/player_nl_NL.xml4
-rw-r--r--client/src/locale/target/player_oc.json2
-rw-r--r--client/src/locale/target/player_pl_PL.json1
-rw-r--r--client/src/locale/target/player_pl_PL.xml383
-rw-r--r--client/src/locale/target/player_ru_RU.json1
-rw-r--r--client/src/locale/target/player_sv_SE.json2
-rw-r--r--client/src/locale/target/player_zh_Hans_CN.json2
-rw-r--r--client/src/locale/target/server_ar_001.xml22
-rw-r--r--client/src/locale/target/server_ca_ES.json2
-rw-r--r--client/src/locale/target/server_cs_CZ.json2
-rw-r--r--client/src/locale/target/server_de_DE.json2
-rw-r--r--client/src/locale/target/server_eo.json2
-rw-r--r--client/src/locale/target/server_es_ES.json2
-rw-r--r--client/src/locale/target/server_eu_ES.json2
-rw-r--r--client/src/locale/target/server_fr_FR.json2
-rw-r--r--client/src/locale/target/server_gl_ES.xml4
-rw-r--r--client/src/locale/target/server_it_IT.json1
-rw-r--r--client/src/locale/target/server_nl_NL.xml36
-rw-r--r--client/src/locale/target/server_oc.json2
-rw-r--r--client/src/locale/target/server_pl_PL.json1
-rw-r--r--client/src/locale/target/server_pl_PL.xml151
-rw-r--r--client/src/locale/target/server_pt_BR.json2
-rw-r--r--client/src/locale/target/server_ru_RU.json1
-rw-r--r--client/src/locale/target/server_sv_SE.json2
-rw-r--r--client/src/locale/target/server_zh_Hans_CN.json2
-rw-r--r--client/src/locale/target/server_zh_Hant_TW.json2
-rw-r--r--client/src/main.ts4
-rw-r--r--client/src/manifest.webmanifest2
-rw-r--r--client/src/polyfills.ts53
-rw-r--r--client/src/sass/application.scss13
-rw-r--r--client/src/sass/include/_bootstrap-variables.scss5
-rw-r--r--client/src/sass/include/_mixins.scss58
-rw-r--r--client/src/sass/include/_variables.scss9
-rw-r--r--client/src/sass/player/settings-menu.scss4
-rw-r--r--client/src/sass/primeng-custom.scss178
-rw-r--r--client/src/shims/noop.ts2
-rw-r--r--client/src/standalone/videos/embed.html3
-rw-r--r--client/src/standalone/videos/embed.ts182
-rw-r--r--client/src/standalone/videos/test-embed.ts6
-rw-r--r--client/src/tsconfig.app.json2
-rw-r--r--client/src/typings.d.ts5
-rw-r--r--client/tsconfig.json6
-rw-r--r--client/tslint.json16
-rw-r--r--client/yarn.lock4218
-rw-r--r--config/default.yaml30
-rw-r--r--config/production.yaml.example28
-rw-r--r--config/test-1.yaml3
-rw-r--r--config/test-2.yaml4
-rw-r--r--config/test-3.yaml3
-rw-r--r--config/test-4.yaml3
-rw-r--r--config/test-5.yaml3
-rw-r--r--config/test-6.yaml3
-rw-r--r--config/test.yaml10
-rw-r--r--package.json51
-rwxr-xr-xscripts/build/client.sh2
-rwxr-xr-xscripts/clean/server/test.sh1
-rwxr-xr-xscripts/dev/server.sh2
-rwxr-xr-xscripts/generate-api-doc.sh5
-rwxr-xr-xscripts/generate-cli-doc.sh5
-rwxr-xr-xscripts/generate-code-contributors.ts12
-rwxr-xr-xscripts/help.sh1
-rwxr-xr-xscripts/i18n/create-custom-files.ts13
-rwxr-xr-xscripts/i18n/pull-hook.sh1
-rwxr-xr-xscripts/openapi-peertube-version.sh6
-rw-r--r--scripts/optimize-old-videos.ts67
-rwxr-xr-xscripts/prune-storage.ts17
-rwxr-xr-xscripts/release.sh14
-rwxr-xr-xscripts/travis.sh20
-rwxr-xr-xscripts/update-host.ts18
-rwxr-xr-xscripts/upgrade.sh17
-rw-r--r--server.ts35
-rw-r--r--server/controllers/activitypub/client.ts86
-rw-r--r--server/controllers/activitypub/inbox.ts6
-rw-r--r--server/controllers/api/accounts.ts18
-rw-r--r--server/controllers/api/config.ts77
-rw-r--r--server/controllers/api/search.ts3
-rw-r--r--server/controllers/api/server/contact.ts28
-rw-r--r--server/controllers/api/server/follows.ts16
-rw-r--r--server/controllers/api/server/index.ts4
-rw-r--r--server/controllers/api/server/server-blocklist.ts132
-rw-r--r--server/controllers/api/server/stats.ts7
-rw-r--r--server/controllers/api/users/index.ts33
-rw-r--r--server/controllers/api/users/me.ts165
-rw-r--r--server/controllers/api/users/my-blocklist.ts125
-rw-r--r--server/controllers/api/users/my-history.ts57
-rw-r--r--server/controllers/api/users/my-notifications.ts108
-rw-r--r--server/controllers/api/users/my-subscriptions.ts170
-rw-r--r--server/controllers/api/video-channel.ts18
-rw-r--r--server/controllers/api/videos/abuse.ts5
-rw-r--r--server/controllers/api/videos/blacklist.ts31
-rw-r--r--server/controllers/api/videos/captions.ts4
-rw-r--r--server/controllers/api/videos/comment.ts15
-rw-r--r--server/controllers/api/videos/import.ts21
-rw-r--r--server/controllers/api/videos/index.ts72
-rw-r--r--server/controllers/api/videos/rate.ts17
-rw-r--r--server/controllers/bots.ts101
-rw-r--r--server/controllers/client.ts21
-rw-r--r--server/controllers/feeds.ts12
-rw-r--r--server/controllers/index.ts1
-rw-r--r--server/controllers/static.ts24
-rw-r--r--server/controllers/tracker.ts46
-rw-r--r--server/helpers/activitypub.ts72
-rw-r--r--server/helpers/captions-utils.ts4
-rw-r--r--server/helpers/core-utils.ts80
-rw-r--r--server/helpers/custom-jsonld-signature.ts4
-rw-r--r--server/helpers/custom-validators/activitypub/activity.ts99
-rw-r--r--server/helpers/custom-validators/activitypub/actor.ts29
-rw-r--r--server/helpers/custom-validators/activitypub/announce.ts13
-rw-r--r--server/helpers/custom-validators/activitypub/cache-file.ts28
-rw-r--r--server/helpers/custom-validators/activitypub/flag.ts14
-rw-r--r--server/helpers/custom-validators/activitypub/misc.ts24
-rw-r--r--server/helpers/custom-validators/activitypub/rate.ts15
-rw-r--r--server/helpers/custom-validators/activitypub/undo.ts20
-rw-r--r--server/helpers/custom-validators/activitypub/video-comments.ts11
-rw-r--r--server/helpers/custom-validators/activitypub/videos.ts34
-rw-r--r--server/helpers/custom-validators/activitypub/view.ts10
-rw-r--r--server/helpers/custom-validators/misc.ts10
-rw-r--r--server/helpers/custom-validators/servers.ts11
-rw-r--r--server/helpers/custom-validators/user-notifications.ts23
-rw-r--r--server/helpers/custom-validators/users.ts10
-rw-r--r--server/helpers/custom-validators/video-captions.ts4
-rw-r--r--server/helpers/custom-validators/video-imports.ts4
-rw-r--r--server/helpers/custom-validators/videos.ts22
-rw-r--r--server/helpers/express-utils.ts7
-rw-r--r--server/helpers/ffmpeg-utils.ts209
-rw-r--r--server/helpers/image-utils.ts17
-rw-r--r--server/helpers/peertube-crypto.ts128
-rw-r--r--server/helpers/regexp.ts23
-rw-r--r--server/helpers/requests.ts21
-rw-r--r--server/helpers/utils.ts37
-rw-r--r--server/helpers/video.ts4
-rw-r--r--server/helpers/webtorrent.ts6
-rw-r--r--server/helpers/youtube-dl.ts8
-rw-r--r--server/initializers/checker-after-init.ts14
-rw-r--r--server/initializers/checker-before-init.ts13
-rw-r--r--server/initializers/constants.ts196
-rw-r--r--server/initializers/database.ts44
-rw-r--r--server/initializers/installer.ts26
-rw-r--r--server/initializers/migrations/0120-video-null.ts3
-rw-r--r--server/initializers/migrations/0195-support.ts9
-rw-r--r--server/initializers/migrations/0245-user-blocked.ts3
-rw-r--r--server/initializers/migrations/0250-video-abuse-state.ts3
-rw-r--r--server/initializers/migrations/0255-video-blacklist-reason.ts3
-rw-r--r--server/initializers/migrations/0260-upload-quota-daily.ts1
-rw-r--r--server/initializers/migrations/0275-video-file-unique.ts6
-rw-r--r--server/initializers/migrations/0280-webtorrent-policy-user.ts28
-rw-r--r--server/initializers/migrations/0285-description-support.ts53
-rw-r--r--server/initializers/migrations/0290-account-video-rate-url.ts46
-rw-r--r--server/initializers/migrations/0295-video-file-extname.ts49
-rw-r--r--server/initializers/migrations/0300-user-videos-history-enabled.ts27
-rw-r--r--server/initializers/migrations/0305-fix-unfederated-videos.ts52
-rw-r--r--server/initializers/migrations/0310-drop-unused-video-indexes.ts32
-rw-r--r--server/initializers/migrations/0315-user-notifications.ts47
-rw-r--r--server/initializers/migrations/0320-blacklist-unfederate.ts27
-rw-r--r--server/initializers/migrations/0325-video-abuse-fields.ts37
-rw-r--r--server/initializers/migrations/0330-video-streaming-playlist.ts51
-rw-r--r--server/lib/activitypub/actor.ts157
-rw-r--r--server/lib/activitypub/cache-file.ts23
-rw-r--r--server/lib/activitypub/crawl.ts7
-rw-r--r--server/lib/activitypub/process/index.ts8
-rw-r--r--server/lib/activitypub/process/process-accept.ts1
-rw-r--r--server/lib/activitypub/process/process-announce.ts8
-rw-r--r--server/lib/activitypub/process/process-create.ts122
-rw-r--r--server/lib/activitypub/process/process-dislike.ts52
-rw-r--r--server/lib/activitypub/process/process-flag.ts49
-rw-r--r--server/lib/activitypub/process/process-follow.ts14
-rw-r--r--server/lib/activitypub/process/process-like.ts6
-rw-r--r--server/lib/activitypub/process/process-undo.ts14
-rw-r--r--server/lib/activitypub/process/process-update.ts3
-rw-r--r--server/lib/activitypub/process/process-view.ts35
-rw-r--r--server/lib/activitypub/process/process.ts35
-rw-r--r--server/lib/activitypub/send/send-create.ts74
-rw-r--r--server/lib/activitypub/send/send-dislike.ts41
-rw-r--r--server/lib/activitypub/send/send-flag.ts39
-rw-r--r--server/lib/activitypub/send/send-like.ts2
-rw-r--r--server/lib/activitypub/send/send-undo.ts17
-rw-r--r--server/lib/activitypub/send/send-update.ts2
-rw-r--r--server/lib/activitypub/send/send-view.ts40
-rw-r--r--server/lib/activitypub/share.ts31
-rw-r--r--server/lib/activitypub/url.ts19
-rw-r--r--server/lib/activitypub/video-comments.ts21
-rw-r--r--server/lib/activitypub/video-rates.ts41
-rw-r--r--server/lib/activitypub/videos.ts280
-rw-r--r--server/lib/avatar.ts3
-rw-r--r--server/lib/blocklist.ts40
-rw-r--r--server/lib/cache/actor-follow-score-cache.ts46
-rw-r--r--server/lib/cache/index.ts1
-rw-r--r--server/lib/client-html.ts61
-rw-r--r--server/lib/emailer.ts261
-rw-r--r--server/lib/hls.ts164
-rw-r--r--server/lib/job-queue/handlers/activitypub-follow.ts9
-rw-r--r--server/lib/job-queue/handlers/activitypub-http-broadcast.ts8
-rw-r--r--server/lib/job-queue/handlers/activitypub-http-fetcher.ts2
-rw-r--r--server/lib/job-queue/handlers/activitypub-http-unicast.ts11
-rw-r--r--server/lib/job-queue/handlers/activitypub-refresher.ts54
-rw-r--r--server/lib/job-queue/handlers/email.ts3
-rw-r--r--server/lib/job-queue/handlers/utils/activitypub-http-utils.ts29
-rw-r--r--server/lib/job-queue/handlers/video-file.ts106
-rw-r--r--server/lib/job-queue/handlers/video-import.ts27
-rw-r--r--server/lib/job-queue/handlers/video-views.ts21
-rw-r--r--server/lib/job-queue/job-queue.ts15
-rw-r--r--server/lib/notifier.ts455
-rw-r--r--server/lib/oauth-model.ts3
-rw-r--r--server/lib/peertube-socket.ts52
-rw-r--r--server/lib/redis.ts33
-rw-r--r--server/lib/schedulers/abstract-scheduler.ts18
-rw-r--r--server/lib/schedulers/actor-follow-scheduler.ts (renamed from server/lib/schedulers/bad-actor-follow-scheduler.ts)23
-rw-r--r--server/lib/schedulers/remove-old-jobs-scheduler.ts6
-rw-r--r--server/lib/schedulers/update-videos-scheduler.ts32
-rw-r--r--server/lib/schedulers/videos-redundancy-scheduler.ts201
-rw-r--r--server/lib/schedulers/youtube-dl-update-scheduler.ts2
-rw-r--r--server/lib/user.ts34
-rw-r--r--server/lib/video-comment.ts6
-rw-r--r--server/lib/video-transcoding.ts63
-rw-r--r--server/middlewares/activitypub.ts97
-rw-r--r--server/middlewares/cache.ts7
-rw-r--r--server/middlewares/csp.ts44
-rw-r--r--server/middlewares/dnt.ts2
-rw-r--r--server/middlewares/index.ts2
-rw-r--r--server/middlewares/oauth.ts38
-rw-r--r--server/middlewares/validators/activitypub/signature.ts16
-rw-r--r--server/middlewares/validators/blocklist.ts172
-rw-r--r--server/middlewares/validators/config.ts19
-rw-r--r--server/middlewares/validators/index.ts3
-rw-r--r--server/middlewares/validators/redundancy.ts33
-rw-r--r--server/middlewares/validators/search.ts38
-rw-r--r--server/middlewares/validators/server.ts78
-rw-r--r--server/middlewares/validators/sort.ts11
-rw-r--r--server/middlewares/validators/user-history.ts26
-rw-r--r--server/middlewares/validators/user-notifications.ts63
-rw-r--r--server/middlewares/validators/users.ts14
-rw-r--r--server/middlewares/validators/videos/index.ts2
-rw-r--r--server/middlewares/validators/videos/video-blacklist.ts15
-rw-r--r--server/middlewares/validators/videos/video-rates.ts55
-rw-r--r--server/middlewares/validators/videos/video-shares.ts38
-rw-r--r--server/middlewares/validators/videos/video-watch.ts7
-rw-r--r--server/middlewares/validators/videos/videos.ts165
-rw-r--r--server/models/account/account-blocklist.ts142
-rw-r--r--server/models/account/account-video-rate.ts60
-rw-r--r--server/models/account/account.ts25
-rw-r--r--server/models/account/user-notification-setting.ts150
-rw-r--r--server/models/account/user-notification.ts472
-rw-r--r--server/models/account/user-video-history.ts33
-rw-r--r--server/models/account/user.ts217
-rw-r--r--server/models/activitypub/actor-follow.ts148
-rw-r--r--server/models/activitypub/actor.ts1
-rw-r--r--server/models/avatar/avatar.ts5
-rw-r--r--server/models/oauth/oauth-token.ts6
-rw-r--r--server/models/redundancy/video-redundancy.ts158
-rw-r--r--server/models/server/server-blocklist.ts121
-rw-r--r--server/models/server/server.ts6
-rw-r--r--server/models/utils.ts22
-rw-r--r--server/models/video/video-abuse.ts24
-rw-r--r--server/models/video/video-blacklist.ts31
-rw-r--r--server/models/video/video-channel.ts25
-rw-r--r--server/models/video/video-comment.ts140
-rw-r--r--server/models/video/video-file.ts32
-rw-r--r--server/models/video/video-format-utils.ts69
-rw-r--r--server/models/video/video-import.ts4
-rw-r--r--server/models/video/video-share.ts2
-rw-r--r--server/models/video/video-streaming-playlist.ts158
-rw-r--r--server/models/video/video.ts372
-rw-r--r--server/tests/activitypub.ts35
-rw-r--r--server/tests/api/activitypub/client.ts67
-rw-r--r--server/tests/api/activitypub/fetch.ts87
-rw-r--r--server/tests/api/activitypub/helpers.ts182
-rw-r--r--server/tests/api/activitypub/index.ts5
-rw-r--r--server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json93
-rw-r--r--server/tests/api/activitypub/json/mastodon/bad-http-signature.json93
-rw-r--r--server/tests/api/activitypub/json/mastodon/bad-public-key.json3
-rw-r--r--server/tests/api/activitypub/json/mastodon/create-bad-signature.json81
-rw-r--r--server/tests/api/activitypub/json/mastodon/create.json81
-rw-r--r--server/tests/api/activitypub/json/mastodon/http-signature.json93
-rw-r--r--server/tests/api/activitypub/json/mastodon/public-key.json3
-rw-r--r--server/tests/api/activitypub/json/peertube/announce-without-context.json13
-rw-r--r--server/tests/api/activitypub/json/peertube/invalid-keys.json6
-rw-r--r--server/tests/api/activitypub/json/peertube/keys.json4
-rw-r--r--server/tests/api/activitypub/refresher.ts93
-rw-r--r--server/tests/api/activitypub/security.ts187
-rw-r--r--server/tests/api/check-params/accounts.ts14
-rw-r--r--server/tests/api/check-params/blocklist.ts498
-rw-r--r--server/tests/api/check-params/config.ts9
-rw-r--r--server/tests/api/check-params/contact-form.ts96
-rw-r--r--server/tests/api/check-params/follows.ts8
-rw-r--r--server/tests/api/check-params/index.ts5
-rw-r--r--server/tests/api/check-params/jobs.ts18
-rw-r--r--server/tests/api/check-params/redundancy.ts2
-rw-r--r--server/tests/api/check-params/search.ts8
-rw-r--r--server/tests/api/check-params/services.ts10
-rw-r--r--server/tests/api/check-params/user-notifications.ts297
-rw-r--r--server/tests/api/check-params/user-subscriptions.ts14
-rw-r--r--server/tests/api/check-params/users.ts60
-rw-r--r--server/tests/api/check-params/video-abuses.ts14
-rw-r--r--server/tests/api/check-params/video-blacklist.ts126
-rw-r--r--server/tests/api/check-params/video-captions.ts4
-rw-r--r--server/tests/api/check-params/video-channels.ts16
-rw-r--r--server/tests/api/check-params/video-comments.ts10
-rw-r--r--server/tests/api/check-params/video-imports.ts12
-rw-r--r--server/tests/api/check-params/videos-filter.ts127
-rw-r--r--server/tests/api/check-params/videos-history.ts72
-rw-r--r--server/tests/api/check-params/videos.ts21
-rw-r--r--server/tests/api/index-4.ts2
-rw-r--r--server/tests/api/index.ts1
-rw-r--r--server/tests/api/redundancy/index.ts1
-rw-r--r--server/tests/api/redundancy/redundancy.ts (renamed from server/tests/api/server/redundancy.ts)279
-rw-r--r--server/tests/api/search/search-activitypub-video-channels.ts6
-rw-r--r--server/tests/api/search/search-activitypub-videos.ts4
-rw-r--r--server/tests/api/search/search-videos.ts2
-rw-r--r--server/tests/api/server/config.ts62
-rw-r--r--server/tests/api/server/contact-form.ts86
-rw-r--r--server/tests/api/server/email.ts16
-rw-r--r--server/tests/api/server/follow-constraints.ts225
-rw-r--r--server/tests/api/server/follows.ts67
-rw-r--r--server/tests/api/server/handle-down.ts22
-rw-r--r--server/tests/api/server/index.ts4
-rw-r--r--server/tests/api/server/jobs.ts12
-rw-r--r--server/tests/api/server/no-client.ts36
-rw-r--r--server/tests/api/server/reverse-proxy.ts6
-rw-r--r--server/tests/api/server/stats.ts14
-rw-r--r--server/tests/api/server/tracker.ts4
-rw-r--r--server/tests/api/users/blocklist.ts511
-rw-r--r--server/tests/api/users/index.ts4
-rw-r--r--server/tests/api/users/user-notifications.ts1053
-rw-r--r--server/tests/api/users/user-subscriptions.ts19
-rw-r--r--server/tests/api/users/users-multiple-servers.ts10
-rw-r--r--server/tests/api/users/users-verification.ts13
-rw-r--r--server/tests/api/users/users.ts62
-rw-r--r--server/tests/api/videos/index.ts3
-rw-r--r--server/tests/api/videos/multiple-servers.ts23
-rw-r--r--server/tests/api/videos/services.ts12
-rw-r--r--server/tests/api/videos/single-server.ts4
-rw-r--r--server/tests/api/videos/video-abuse.ts6
-rw-r--r--server/tests/api/videos/video-blacklist-management.ts193
-rw-r--r--server/tests/api/videos/video-blacklist.ts305
-rw-r--r--server/tests/api/videos/video-captions.ts15
-rw-r--r--server/tests/api/videos/video-change-ownership.ts4
-rw-r--r--server/tests/api/videos/video-channels.ts12
-rw-r--r--server/tests/api/videos/video-comments.ts6
-rw-r--r--server/tests/api/videos/video-description.ts6
-rw-r--r--server/tests/api/videos/video-hls.ts139
-rw-r--r--server/tests/api/videos/video-imports.ts8
-rw-r--r--server/tests/api/videos/video-nsfw.ts17
-rw-r--r--server/tests/api/videos/video-privacy.ts12
-rw-r--r--server/tests/api/videos/video-schedule-update.ts5
-rw-r--r--server/tests/api/videos/video-transcoder.ts90
-rw-r--r--server/tests/api/videos/videos-filter.ts130
-rw-r--r--server/tests/api/videos/videos-history.ts87
-rw-r--r--server/tests/api/videos/videos-overview.ts4
-rw-r--r--server/tests/cli/create-import-video-file-job.ts4
-rw-r--r--server/tests/cli/create-transcoding-job.ts4
-rw-r--r--server/tests/cli/index.ts1
-rw-r--r--server/tests/cli/optimize-old-videos.ts120
-rw-r--r--server/tests/cli/peertube.ts4
-rw-r--r--server/tests/cli/reset-password.ts2
-rw-r--r--server/tests/cli/update-host.ts19
-rw-r--r--server/tests/client.ts2
-rw-r--r--server/tests/feeds/feeds.ts6
-rw-r--r--server/tests/fixtures/video_short.avibin0 -> 584656 bytes
-rw-r--r--server/tests/fixtures/video_short.mkvbin0 -> 40642 bytes
-rw-r--r--server/tests/fixtures/video_short_240p.mp4bin0 -> 14082 bytes
-rw-r--r--server/tests/helpers/comment-model.ts25
-rw-r--r--server/tests/helpers/core-utils.ts98
-rw-r--r--server/tests/helpers/index.ts2
-rw-r--r--server/tests/index.ts1
-rw-r--r--server/tests/misc-endpoints.ts82
-rw-r--r--server/tests/real-world/populate-database.ts2
-rw-r--r--server/tests/real-world/real-world.ts4
-rw-r--r--server/tests/utils/miscs/email.ts25
-rw-r--r--server/tests/utils/videos/video-history.ts14
-rw-r--r--server/tools/README.md82
-rw-r--r--server/tools/cli.ts2
-rw-r--r--server/tools/peertube-auth.ts113
-rw-r--r--server/tools/peertube-get-access-token.ts2
-rw-r--r--server/tools/peertube-import-videos.ts34
-rw-r--r--server/tools/peertube-repl.ts76
-rw-r--r--server/tools/peertube-upload.ts4
-rwxr-xr-xserver/tools/peertube.ts3
-rw-r--r--shared/models/activitypub/activity.ts31
-rw-r--r--shared/models/activitypub/activitypub-ordered-collection.ts5
-rw-r--r--shared/models/activitypub/objects/cache-file-object.ts4
-rw-r--r--shared/models/activitypub/objects/common-objects.ts60
-rw-r--r--shared/models/activitypub/objects/dislike-object.ts3
-rw-r--r--shared/models/activitypub/objects/object.model.ts1
-rw-r--r--shared/models/actors/actor.model.ts2
-rw-r--r--shared/models/blocklist/account-block.model.ts7
-rw-r--r--shared/models/blocklist/index.ts2
-rw-r--r--shared/models/blocklist/server-block.model.ts9
-rw-r--r--shared/models/i18n/i18n.ts9
-rw-r--r--shared/models/index.ts1
-rw-r--r--shared/models/search/videos-search-query.model.ts3
-rw-r--r--shared/models/server/contact-form.model.ts5
-rw-r--r--shared/models/server/custom-config.model.ts8
-rw-r--r--shared/models/server/index.ts6
-rw-r--r--shared/models/server/job.model.ts3
-rw-r--r--shared/models/server/server-config.model.ts22
-rw-r--r--shared/models/server/server-stats.model.ts1
-rw-r--r--shared/models/users/index.ts2
-rw-r--r--shared/models/users/user-notification-setting.model.ts17
-rw-r--r--shared/models/users/user-notification.model.ts83
-rw-r--r--shared/models/users/user-right.enum.ts9
-rw-r--r--shared/models/users/user-role.ts6
-rw-r--r--shared/models/users/user-update-me.model.ts4
-rw-r--r--shared/models/users/user-update.model.ts2
-rw-r--r--shared/models/users/user.model.ts7
-rw-r--r--shared/models/videos/blacklist/video-blacklist-create.model.ts1
-rw-r--r--shared/models/videos/blacklist/video-blacklist.model.ts1
-rw-r--r--shared/models/videos/index.ts1
-rw-r--r--shared/models/videos/video-query.type.ts2
-rw-r--r--shared/models/videos/video-rate.type.ts2
-rw-r--r--shared/models/videos/video-resolution.enum.ts68
-rw-r--r--shared/models/videos/video-streaming-playlist.model.ts12
-rw-r--r--shared/models/videos/video-streaming-playlist.type.ts3
-rw-r--r--shared/models/videos/video-transcoding-fps.model.ts6
-rw-r--r--shared/models/videos/video.model.ts9
-rw-r--r--shared/utils/cli/cli.ts (renamed from server/tests/utils/cli/cli.ts)0
-rw-r--r--shared/utils/feeds/feeds.ts (renamed from server/tests/utils/feeds/feeds.ts)0
-rw-r--r--shared/utils/index.ts (renamed from server/tests/utils/index.ts)7
-rw-r--r--shared/utils/miscs/email-child-process.js27
-rw-r--r--shared/utils/miscs/email.ts64
-rw-r--r--shared/utils/miscs/miscs.ts (renamed from server/tests/utils/miscs/miscs.ts)43
-rw-r--r--shared/utils/miscs/sql.ts38
-rw-r--r--shared/utils/miscs/stubs.ts14
-rw-r--r--shared/utils/overviews/overviews.ts (renamed from server/tests/utils/overviews/overviews.ts)0
-rw-r--r--shared/utils/requests/activitypub.ts43
-rw-r--r--shared/utils/requests/check-api-params.ts (renamed from server/tests/utils/requests/check-api-params.ts)2
-rw-r--r--shared/utils/requests/requests.ts (renamed from server/tests/utils/requests/requests.ts)25
-rw-r--r--shared/utils/search/video-channels.ts (renamed from server/tests/utils/search/video-channels.ts)0
-rw-r--r--shared/utils/search/videos.ts (renamed from server/tests/utils/search/videos.ts)4
-rw-r--r--shared/utils/server/activitypub.ts (renamed from server/tests/utils/server/activitypub.ts)5
-rw-r--r--shared/utils/server/clients.ts (renamed from server/tests/utils/server/clients.ts)0
-rw-r--r--shared/utils/server/config.ts (renamed from server/tests/utils/server/config.ts)11
-rw-r--r--shared/utils/server/contact-form.ts28
-rw-r--r--shared/utils/server/follows.ts (renamed from server/tests/utils/server/follows.ts)6
-rw-r--r--shared/utils/server/jobs.ts (renamed from server/tests/utils/server/jobs.ts)23
-rw-r--r--shared/utils/server/redundancy.ts (renamed from server/tests/utils/server/redundancy.ts)0
-rw-r--r--shared/utils/server/servers.ts (renamed from server/tests/utils/server/servers.ts)36
-rw-r--r--shared/utils/server/stats.ts (renamed from server/tests/utils/server/stats.ts)2
-rw-r--r--shared/utils/socket/socket-io.ts13
-rw-r--r--shared/utils/users/accounts.ts (renamed from server/tests/utils/users/accounts.ts)4
-rw-r--r--shared/utils/users/blocklist.ts197
-rw-r--r--shared/utils/users/login.ts (renamed from server/tests/utils/users/login.ts)0
-rw-r--r--shared/utils/users/user-notifications.ts437
-rw-r--r--shared/utils/users/user-subscriptions.ts (renamed from server/tests/utils/users/user-subscriptions.ts)2
-rw-r--r--shared/utils/users/users.ts (renamed from server/tests/utils/users/users.ts)29
-rw-r--r--shared/utils/videos/services.ts (renamed from server/tests/utils/videos/services.ts)0
-rw-r--r--shared/utils/videos/video-abuses.ts (renamed from server/tests/utils/videos/video-abuses.ts)4
-rw-r--r--shared/utils/videos/video-blacklist.ts (renamed from server/tests/utils/videos/video-blacklist.ts)11
-rw-r--r--shared/utils/videos/video-captions.ts (renamed from server/tests/utils/videos/video-captions.ts)4
-rw-r--r--shared/utils/videos/video-change-ownership.ts (renamed from server/tests/utils/videos/video-change-ownership.ts)0
-rw-r--r--shared/utils/videos/video-channels.ts (renamed from server/tests/utils/videos/video-channels.ts)4
-rw-r--r--shared/utils/videos/video-comments.ts (renamed from server/tests/utils/videos/video-comments.ts)16
-rw-r--r--shared/utils/videos/video-history.ts39
-rw-r--r--shared/utils/videos/video-imports.ts (renamed from server/tests/utils/videos/video-imports.ts)10
-rw-r--r--shared/utils/videos/video-playlists.ts51
-rw-r--r--shared/utils/videos/videos.ts (renamed from server/tests/utils/videos/videos.ts)22
-rw-r--r--support/doc/api/accounts.yaml7
-rw-r--r--support/doc/api/commons.yaml23
-rw-r--r--support/doc/api/html/index.html8540
-rw-r--r--support/doc/api/html/javascripts/spectacle.js242
-rw-r--r--support/doc/api/html/javascripts/spectacle.min.js1
-rw-r--r--support/doc/api/html/stylesheets/foundation.css2285
-rw-r--r--support/doc/api/html/stylesheets/foundation.min.css1
-rw-r--r--support/doc/api/html/stylesheets/spectacle.css1375
-rw-r--r--support/doc/api/html/stylesheets/spectacle.min.css1
-rw-r--r--support/doc/api/openapi.yaml2665
-rw-r--r--support/doc/api/quickstart.md16
-rw-r--r--support/doc/api/users.yaml7
-rw-r--r--support/doc/api/video-channels.yaml7
-rw-r--r--support/doc/api/video-comments.yaml13
-rw-r--r--support/doc/api/videos.yaml92
-rw-r--r--support/doc/development/server/code.md10
-rw-r--r--support/doc/docker.md1
-rw-r--r--support/doc/production.md5
-rw-r--r--support/doc/redundancy.md52
-rw-r--r--support/doc/tools.md280
-rw-r--r--support/doc/user/decentralized.pngbin22099 -> 0 bytes
-rw-r--r--support/doc/user/decentralized.xml1
-rw-r--r--support/doc/user/redundancy.pngbin29641 -> 0 bytes
-rw-r--r--support/doc/user/redundancy.xml1
-rw-r--r--support/doc/user/watch-p2p.pngbin16838 -> 0 bytes
-rw-r--r--support/doc/user/watch-p2p.xml1
-rw-r--r--support/doc/user/watch-video.pngbin21543 -> 0 bytes
-rw-r--r--support/doc/user/watch-video.xml1
-rw-r--r--support/docker/dev/Dockerfile54
-rw-r--r--support/docker/dev/setup_postgres.sql6
-rw-r--r--support/docker/dev/usage.md20
-rw-r--r--support/docker/janitor/Dockerfile32
-rw-r--r--support/docker/janitor/create_user.sql (renamed from support/docker/dev/create_user.sql)0
-rw-r--r--support/docker/janitor/janitor.json (renamed from support/docker/dev/janitor.json)0
-rw-r--r--support/docker/janitor/supervisord.conf (renamed from support/docker/dev/supervisord.conf)0
-rw-r--r--support/docker/production/.env8
-rw-r--r--support/docker/production/Dockerfile.stretch31
-rw-r--r--support/docker/production/config/custom-environment-variables.yaml33
-rw-r--r--support/docker/production/config/production.yaml2
-rw-r--r--support/docker/production/config/traefik.toml3
-rw-r--r--support/docker/production/docker-compose.yml16
-rwxr-xr-xsupport/docker/production/docker-entrypoint.sh4
-rwxr-xr-xsupport/freebsd/peertube5
-rw-r--r--support/nginx/peertube35
-rw-r--r--support/systemd/peertube.service19
-rw-r--r--tslint.json2
-rw-r--r--yarn.lock4234
888 files changed, 54077 insertions, 32883 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 4b352922e..b5d7ede72 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,14 +1,16 @@
1# Welcome to the contributing guide for PeerTube 1# Welcome to the contributing guide for PeerTube
2 2
3Interesting in contributing? Awesome! 3Interested in contributing? Awesome!
4 4
5**Quick Links:** 5**This guide will present you the following contribution topics:**
6 6
7 * [Translate](#translate) 7 * [Translate](#translate)
8 * [Give your feedback](#give-your-feedback) 8 * [Give your feedback](#give-your-feedback)
9 * [Write documentation](#write-documentation) 9 * [Write documentation](#write-documentation)
10 * [Develop](#develop) 10 * [Develop](#develop)
11 11 * [Improve the website](#improve-the-website)
12 * [Troubleshooting](#troubleshooting)
13 * [Tutorials](#tutorials)
12 14
13## Translate 15## Translate
14 16
@@ -37,6 +39,15 @@ Some hints:
37 * Models sent/received by the controllers are defined in [/shared/models](/shared/models) directory 39 * Models sent/received by the controllers are defined in [/shared/models](/shared/models) directory
38 40
39 41
42## Improve the website
43
44PeerTube's website is [joinpeertube.org](https://joinpeertube.org), where people can learn about the project and how it works – note that it is not a PeerTube instance, but rather the project's homepage.
45
46You can help us improve it too!
47
48It is not hosted on GitHub but on [Framasoft](https://framasoft.org/)'s own [GitLab](https://about.gitlab.com/) instance, [FramaGit](https://framagit.org): https://framagit.org/framasoft/peertube/joinpeertube
49
50
40## Develop 51## Develop
41 52
42Don't hesitate to talk about features you want to develop by creating/commenting an issue 53Don't hesitate to talk about features you want to develop by creating/commenting an issue
@@ -122,7 +133,7 @@ and the web server is automatically restarted.
122$ npm run dev 133$ npm run dev
123``` 134```
124 135
125### Federation 136### Testing the federation of PeerTube servers
126 137
127Create a PostgreSQL user **with the same name as your username** in order to avoid using the *postgres* user. 138Create a PostgreSQL user **with the same name as your username** in order to avoid using the *postgres* user.
128Then, we can create the databases (if they don't already exist): 139Then, we can create the databases (if they don't already exist):
@@ -176,3 +187,11 @@ $ npm run mocha -- --exit --require ts-node/register/type-check --bail server/te
176 187
177Instance configurations are in `config/test-{1,2,3,4,5,6}.yaml`. 188Instance configurations are in `config/test-{1,2,3,4,5,6}.yaml`.
178Note that only instance 2 has transcoding enabled. 189Note that only instance 2 has transcoding enabled.
190
191### Troubleshooting
192
193Please check out the issues and [list of common errors](https://docs.joinpeertube.org/lang/en/devdocs/troubleshooting.html).
194
195### Tutorials
196
197Please check out the related section in the [development documentation](https://docs.joinpeertube.org/lang/en/devdocs/index.html#tutorials). Contribute tutorials at [framagit.org/framasoft/peertube/documentation](https://framagit.org/framasoft/peertube/documentation).
diff --git a/.gitignore b/.gitignore
index 22478c444..a31da70a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
9/test4/ 9/test4/
10/test5/ 10/test5/
11/test6/ 11/test6/
12/server/tests/fixtures/video_high_bitrate_1080p.mp4
12 13
13# Production 14# Production
14/storage/ 15/storage/
diff --git a/.travis.yml b/.travis.yml
index 9fd54447c..d252ae625 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,7 +14,10 @@ addons:
14 - g++-4.9 14 - g++-4.9
15 postgresql: "9.4" 15 postgresql: "9.4"
16 16
17cache: yarn 17cache:
18 directories:
19 - $HOME/.cache/yarn
20 - $HOME/fixtures
18 21
19sudo: false 22sudo: false
20 23
@@ -39,17 +42,18 @@ matrix:
39 - env: TEST_SUITE=api-1 42 - env: TEST_SUITE=api-1
40 - env: TEST_SUITE=api-2 43 - env: TEST_SUITE=api-2
41 - env: TEST_SUITE=api-3 44 - env: TEST_SUITE=api-3
45 - env: TEST_SUITE=api-4
42 - env: TEST_SUITE=cli 46 - env: TEST_SUITE=cli
43 - env: TEST_SUITE=lint 47 - env: TEST_SUITE=lint
44 - env: TEST_SUITE=jest 48 - env: TEST_SUITE=jest
45 49
46script: 50script:
47 - travis_retry npm run travis -- "$TEST_SUITE" 51 - NODE_PENDING_JOB_WAIT=1000 travis_retry npm run travis -- "$TEST_SUITE"
48 52
49after_failure: 53after_failure:
50 - cat test1/logs/all-logs.log 54 - cat test1/logs/peertube.log
51 - cat test2/logs/all-logs.log 55 - cat test2/logs/peertube.log
52 - cat test3/logs/all-logs.log 56 - cat test3/logs/peertube.log
53 - cat test4/logs/all-logs.log 57 - cat test4/logs/peertube.log
54 - cat test5/logs/all-logs.log 58 - cat test5/logs/peertube.log
55 - cat test6/logs/all-logs.log 59 - cat test6/logs/peertube.log
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 160d6fc4f..f3254d2d6 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -2,10 +2,16 @@
2 2
3## Vocabulary 3## Vocabulary
4 4
5 - **Fediverse:** several servers following each others. 5 - **Fediverse:** several servers following one another, several users
6 following each other. Designates federated communities in general.
7 - **Vidiverse:** same as Fediverse, but federating videos specifically.
6 - **Instance:** a server which runs PeerTube in the fediverse. 8 - **Instance:** a server which runs PeerTube in the fediverse.
7 - **Origin instance:** the instance on which the video was uploaded and which 9 - **Origin instance:** the instance on which the video was uploaded and which
8 is seeding (through the WebSeed protocol) the video. 10 is seeding (through the WebSeed protocol) the video.
11 - **Cache instance:** an instance that decided to make available a WebSeed
12 of its own for a video originating from another instance. It sends a `ptCache`
13 activity to notify the origin instance, which will then update its list of
14 WebSeeds for the video.
9 - **Following:** the action of a PeerTube instance which will follow another 15 - **Following:** the action of a PeerTube instance which will follow another
10 instance (subscribe to its videos). 16 instance (subscribe to its videos).
11 17
@@ -22,8 +28,8 @@
22 * All the requests are retried several times if they fail. 28 * All the requests are retried several times if they fail.
23 29
24### Instance 30### Instance
25 * An instance has a websocket tracker which is responsible for all the video 31 * An instance has a websocket tracker which is responsible for all videos
26 uploaded in it. 32 uploaded by its users.
27 * An instance has an administrator that can follow other instances. 33 * An instance has an administrator that can follow other instances.
28 * An instance can be configured to follow back automatically. 34 * An instance can be configured to follow back automatically.
29 * An instance can blacklist other instances (only used in "follow back" 35 * An instance can blacklist other instances (only used in "follow back"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea6007b4c..13bec7535 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,317 @@
1# Changelog 1# Changelog
2 2
3## v1.2.0
4
5### BREAKING CHANGES
6
7 * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
8 * **Docker:** Check you have all the storage fields in your `/config/production.yaml` file: https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/config/production.yaml#L34
9 * **nginx:** Add redundancy endpoint in static file. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
10 * **nginx:** Add socket io endpoint. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
11 * Moderators can manage users now (add/delete/update/block)
12 * Add `tmp` and `redundancy` directories in configuration file. **You should configure them in your production.yaml**
13
14### Maintenance
15
16 * Check free storage before upgrading in upgrade script ([@Nutomic](https://github.com/nutomic))
17 * Explain that PeerTube must be stopped in prune storage script
18 * Add some security directives in the systemd unit configuration file ([@rigelk](https://github.com/rigelk) & [@mkoppmann](https://github.com/mkoppmann))
19 * Update FreeBSD startup script ([@gegeweb](https://github.com/gegeweb))
20
21### Docker
22
23 * Patch docker entrypoint to speed up the chown at startup ([LecygneNoir](https://github.com/LecygneNoir))
24
25### Features
26
27 * Add Russian, Polish and Italian languages
28 * Add user notifications:
29 * Notification types:
30 * Comment on my video
31 * New video from my subscriptions
32 * New video abuses (for moderators)
33 * Blacklist/Unblacklist on my video
34 * Video import finished (error or success)
35 * Pending video published (after transcoding or a scheduled update)
36 * My account or one of my channel has a new follower
37 * Someone (except muted accounts) mentioned me in comments
38 * A user registered on the instance (for moderators)
39 * Notification actions:
40 * Add a web notification
41 * Send an english email
42 * Add contact form in about page (**enabled by default**)
43 * Add ability to unfederate a local video in blacklist modal (**checkbox checked by default**)
44 * Support additional video extensions if transcoding is enabled (**enabled by default**)
45 * Redirect to the last url on login
46 * Add ability to automatically set the video caption in URL. Example: https://peertube2.cpy.re/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d?subtitle=ru
47 * Automatically enable the last selected caption when watching a video
48 * Add ability to disable, clear and list user videos history
49 * Add a button to help to translate peertube
50 * Add text in the report modal to explain to whom the report will be sent
51 * Open my account menu entries on hover
52 * Explain what features are enabled on the instance in the about page
53 * Add an error message in the forgot password modal if the instance email system is not configured
54 * Add sitemap
55 * Add well known url to change password ([@rigelk](https://github.com/rigelk))
56 * Remove 8GB video upload limit on client side. There may still be such limit depending on the reverse proxy configuration ([@scanlime](https://github.com/scanlime))
57 * Add CSP ([@rigelk](https://github.com/rigelk) & [@Nutomic](https://github.com/nutomic))
58 * Update title and description HTML tags when rendering video HTML page
59 * Add webfinger support for remote follows ([@acid-chicken](https://github.com/acid-chicken))
60 * Add tooltip to explain how the trending algorithm works ([@auberanger](https://github.com/auberanger))
61 * Warn users when they want to delete a channel because they will not be able to create another channel with the same name
62 * Warn users when they leave the video upload/update (on page refresh/tab close)
63 * Set max user name, user display name, channel name and channel display name lengths to 50 characters ([@McFlat](https://github.com/mcflat))
64 * Increase video abuse length to 3000 characters
65 * Add totalLocalVideoFilesSize in the stats endpoint
66
67## Bug fixes
68
69 * Fix the addition of captions to a video
70 * Fix federation of some videos
71 * Fix NSFW blur on search
72 * Add error message when trying to upload .ass subtitles
73 * Fix default homepage in the progressive web application
74 * Don't crash on queue error
75 * Fix EXDEV errors if you have multiple mount points
76 * Fix broken audio in transcoding with some videos
77 * Fix crash on getVideoFileStream issue
78 * Fix followers search
79 * Remove trailing `/` in CLI import script ([@HesioZ](https://github.com/HesioZ/))
80 * Use origin video url in canonical tag
81 * Fix captions in HTTP fallback
82 * Automatically refresh remote actors to fix deleted remote actors that are still displayed on some instances
83 * Add missing translations in video embed page
84 * Fix some styling issues in dark mode
85 * Fix transcoding issues with some videos
86 * Fix Mac OS mkv/avi upload
87 * Fix menu overflow on mobile
88 * Fix ownership button icons ([@joshmorel](https://github.com/joshmorel))
89
90
91## v1.1.0
92
93***Since v1.0.1***
94
95### BREAKING CHANGES
96
97 * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
98
99### Maintenance
100
101 * Improve REST API documentation: https://docs.joinpeertube.org/api.html ([@rigelk](https://github.com/rigelk))
102 * Add basic ActivityPub documentation: https://docs.joinpeertube.org/lang/en/devdocs/federation.html ([@rigelk](https://github.com/rigelk))
103 * Add CLI option to run PeerTube without client ([@rigelk](https://github.com/rigelk))
104 * Add manpage to peertube CLI ([@rigelk](https://github.com/rigelk))
105 * Make backups of files in optimize-old-videos script ([@Nutomic](https://github.com/nutomic))
106 * Allow peertube-import-videos.ts CLI script to run concurrently ([@McFlat](https://github.com/mcflat))
107
108### Scripts
109
110 * Use DB information from config/production.yaml in upgrade script ([@ldidry](https://github.com/ldidry))
111 * Add REPL script ([@McFlat](https://github.com/mcflat))
112
113### Docker
114
115 * Add search and import settings env settings env variables ([@kaiyou](https://github.com/kaiyou))
116 * Add docker dev image ([@am97](https://github.com/am97))
117 * Improve docker compose template ([@Nutomic](https://github.com/nutomic))
118 * Add postfix image
119 * Redirect HTTP -> HTTPS
120 * Disable Træfik web UI
121
122### Features
123
124 * Automatically resume videos if the user is logged in
125 * Hide automatically the menu when the window is resized ([@BO41](https://github.com/BO41))
126 * Remove confirm modal for JavaScript/CSS injection ([@scanlime](https://github.com/scanlime))
127 * Set bitrate limits for transcoding ([@Nutomic](https://github.com/nutomic))
128 * Add moderation tools in the account page
129 * Add bulk actions in users table (Delete/Ban for now)
130 * Add search filter in admin users table
131 * Add search filter in admin following
132 * Add search filter in admin followers
133 * Add ability to list all local videos
134 * Add ability for users to mute an account or an instance
135 * Add ability for administrators to mute an account or an instance
136 * Rename "News" category to "News & Politics" ([@daker](https://github.com/daker))
137 * Add explicit error message when changing video ownership ([@lucas-dclrcq](https://github.com/lucas-dclrcq))
138 * Improve description of the HTTP video import feature ([@rigelk](https://github.com/rigelk))
139 * Set shorter keyframe interval for transcoding (2 seconds) ([@Nutomic](https://github.com/nutomic))
140 * Add ability to disable webtorrent (as a user) ([@rigelk](https://github.com/rigelk))
141 * Make abuse-delete clearer ([@barbeque](https://github.com/barbeque))
142 * Adding minimum signup age conforming to ceiling GPDR age ([@rigelk](https://github.com/rigelk))
143 * Feature/description support fields length 1000 ([@McFlat](https://github.com/mcflat))
144 * Add background effect to activated menu entry
145 * Improve video upload error handling
146 * Improve message visibility on signup
147 * Auto login user on signup if email verification is disabled
148 * Speed up PeerTube startup (in particular the first one)
149 * Delete invalid or deleted remote videos
150 * Add ability to admin to set email as verified ([@joshmorel](https://github.com/joshmorel))
151 * Add separators in user moderation dropdown
152
153### Bug fixes
154
155 * AP mimeType -> mediaType
156 * PeerTube is not in beta anymore
157 * PeerTube is not in alpha anymore :p
158 * Fix optimize old videos script
159 * Check follow constraints when getting a video
160 * Fix application-config initialization in CLI tools ([Yetangitu](https://github.com/Yetangitu))
161 * Fix video pixel format compatibility (using yuv420p) ([@rigelk](https://github.com/rigelk))
162 * Fix video `state` AP context ([tcitworld](https://github.com/tcitworld))
163 * Fix Linked Signature compatibility
164 * Fix AP collections pagination
165 * Fix too big thumbnails (when using URL import)
166 * Do not host remote AP objects: use redirection instead
167 * Fix video miniature with a long name
168 * Fix video views inconsistencies inside the federation
169 * Fix video embed in Wordpress Gutenberg
170 * Fix video channel videos url when scrolling
171 * Fix player progress bar/seeking when changing resolution
172 * Fix search tab title with no search
173 * Fix YouTube video import with some videos
174
175***Since v1.1.0-rc.1***
176
177### Bug fixes
178
179 * Fix AP infinite redirection
180 * Fix trending page
181
182
183## v1.1.0-rc.1 (since v1.1.0-alpha.2)
184
185### Maintenance
186
187 * Improve REST API documentation: https://docs.joinpeertube.org/api.html ([@rigelk](https://github.com/rigelk))
188 * Add basic ActivityPub documentation: https://docs.joinpeertube.org/lang/en/devdocs/federation.html ([@rigelk](https://github.com/rigelk))
189 * Add CLI option to run PeerTube without client ([@rigelk](https://github.com/rigelk))
190 * Add manpage to peertube CLI ([@rigelk](https://github.com/rigelk))
191 * Make backups of files in optimize-old-videos script ([@Nutomic](https://github.com/nutomic))
192 * Allow peertube-import-videos.ts CLI script to run concurrently ([@McFlat](https://github.com/mcflat))
193
194### Docker
195
196 * Improve docker compose template ([@Nutomic](https://github.com/nutomic))
197 * Add postfix image
198 * Redirect HTTP -> HTTPS
199 * Disable Træfik web UI
200 * Add ability to set an array in `PEERTUBE_TRUST_PROXY` ([LecygneNoir](https://github.com/LecygneNoir))
201
202### Features
203
204 * Add background effect to activated menu entry
205 * Improve video upload error handling
206 * Improve message visibility on signup
207 * Auto login user on signup if email verification is disabled
208 * Speed up PeerTube startup (in particular the first one)
209 * Delete invalid or deleted remote videos
210 * Add ability to admin to set email as verified ([@joshmorel](https://github.com/joshmorel))
211 * Add separators in user moderation dropdown
212
213### Bug fixes
214
215 * Check follow constraints when getting a video
216 * Fix application-config initialization in CLI tools ([Yetangitu](https://github.com/Yetangitu))
217 * Fix video pixel format compatibility (using yuv420p) ([@rigelk](https://github.com/rigelk))
218 * Fix video `state` AP context ([tcitworld](https://github.com/tcitworld))
219 * Fix Linked Signature compatibility
220 * Fix AP collections pagination
221 * Fix too big thumbnails (when using URL import)
222 * Do not host remote AP objects: use redirection instead
223 * Fix video miniature with a long name
224 * Fix video views inconsistencies inside the federation
225 * Fix video embed in Wordpress Gutenberg
226 * Fix video channel videos url when scrolling
227 * Fix player progress bar/seeking when changing resolution
228 * Fix search tab title with no search
229 * Fix YouTube video import with some videos
230
231
232## v1.1.0-alpha.2 (since v1.1.0-alpha.1)
233
234### Security/Maintenance/Federation
235
236 * Add HTTP Signature in addition to Linked Signature:
237 * It's faster
238 * Will allow us to use RSA Signature 2018 in the future without too much incompatibilities in the peertube federation
239
240### Features
241
242 * Set shorter keyframe interval for transcoding (2 seconds) ([@Nutomic](https://github.com/nutomic))
243 * Add ability to disable webtorrent (as a user) ([@rigelk](https://github.com/rigelk))
244 * Make abuse-delete clearer ([@barbeque](https://github.com/barbeque))
245 * Adding minimum signup age conforming to ceiling GPDR age ([@rigelk](https://github.com/rigelk))
246 * Feature/description support fields length 1000 ([@McFlat](https://github.com/mcflat))
247
248### Bug fixes
249
250 * Scale bitrate linearly with FPS ([@Nutomic](https://github.com/nutomic))
251 * AP mimeType -> mediaType
252 * PeerTube is not in beta anymore
253 * PeerTube is not in alpha anymore :p
254 * Fix optimize old videos script
255
256
257## v1.0.1
258
259### Security/Maintenance/Federation
260
261 * Add HTTP Signature in addition to Linked Signature:
262 * It's faster
263 * Will allow us to use RSA Signature 2018 in the future without too much incompatibilities in the peertube federation
264
265
266## v1.1.0-alpha.1
267
268We released this alpha version because some admins/users need some moderation tools we implemented in recent weeks.
269This release could contain bugs. Don't expect a stable v1.1.0 until December :)
270
271### Scripts
272
273 * Use DB information from config/production.yaml in upgrade script ([@ldidry](https://github.com/ldidry))
274 * Add REPL script ([@McFlat](https://github.com/mcflat))
275
276### Docker
277
278 * Add search and import settings env settings env variables ([@kaiyou](https://github.com/kaiyou))
279 * Add docker dev image ([@am97](https://github.com/am97))
280
281### Features
282
283 * Automatically resume videos if the user is logged in
284 * Hide automatically the menu when the window is resized ([@BO41](https://github.com/BO41))
285 * Remove confirm modal for JavaScript/CSS injection ([@scanlime](https://github.com/scanlime))
286 * Set bitrate limits for transcoding ([@Nutomic](https://github.com/nutomic))
287 * Add moderation tools in the account page
288 * Add bulk actions in users table (Delete/Ban for now)
289 * Add search filter in admin users table
290 * Add search filter in admin following
291 * Add search filter in admin followers
292 * Add ability to list all local videos
293 * Add ability for users to mute an account or an instance
294 * Add ability for administrators to mute an account or an instance
295 * Rename "News" category to "News & Politics" ([@daker](https://github.com/daker))
296 * Add explicit error message when changing video ownership ([@lucas-dclrcq](https://github.com/lucas-dclrcq))
297 * Improve description of the HTTP video import feature ([@rigelk](https://github.com/rigelk))
298
299
300## v1.0.0
301
302### SECURITY
303
304 * Add more headers to HTTP signature to avoid actor impersonation by replaying modified signed HTTP requests (thanks Thibaut Girka)
305
306### Bug fixes
307
308 * Check video exists before extending expiration
309 * Correctly delete redundancy files
310 * Fix account URI in remote comment modal ([@rigelk](https://github.com/rigelk))
311 * Fix avatar update
312 * Avoid old issue regarding duplicated hosts in database
313
314
3## v1.0.0-rc.2 315## v1.0.0-rc.2
4 316
5### Bug fixes 317### Bug fixes
@@ -87,7 +399,7 @@
87 399
88### Features 400### Features
89 401
90 * Video redundancy system (experimental, see [the doc](/support/doc/redundancy.md)) 402 * Video redundancy system (experimental, see [the doc](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html#redundancy-between-instances))
91 * Add peertube script (see [the doc](/support/doc/tools.md#cli-wrapper)) ([@rigelk](https://github.com/rigelk)) 403 * Add peertube script (see [the doc](/support/doc/tools.md#cli-wrapper)) ([@rigelk](https://github.com/rigelk))
92 * Improve download modal ([@rigelk](https://github.com/rigelk)) 404 * Improve download modal ([@rigelk](https://github.com/rigelk))
93 * Add redirect after login ([@BO41](https://github.com/BO41)) 405 * Add redirect after login ([@BO41](https://github.com/BO41))
diff --git a/CREDITS.md b/CREDITS.md
index e0e647dc9..509f9800d 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -3,65 +3,82 @@
3 * [Chocobozzz](https://github.com/Chocobozzz) 3 * [Chocobozzz](https://github.com/Chocobozzz)
4 * [rigelk](https://github.com/rigelk) 4 * [rigelk](https://github.com/rigelk)
5 * [gegeweb](https://github.com/gegeweb) 5 * [gegeweb](https://github.com/gegeweb)
6 * [Nutomic](https://github.com/Nutomic)
6 * [Jorropo](https://github.com/Jorropo) 7 * [Jorropo](https://github.com/Jorropo)
8 * [BO41](https://github.com/BO41)
9 * [joshmorel](https://github.com/joshmorel)
10 * [buoyantair](https://github.com/buoyantair)
7 * [bnjbvr](https://github.com/bnjbvr) 11 * [bnjbvr](https://github.com/bnjbvr)
8 * [DavidLibeau](https://github.com/DavidLibeau) 12 * [DavidLibeau](https://github.com/DavidLibeau)
9 * [jankeromnes](https://github.com/jankeromnes) 13 * [jankeromnes](https://github.com/jankeromnes)
14 * [JohnXLivingston](https://github.com/JohnXLivingston)
15 * [kaiyou](https://github.com/kaiyou)
16 * [McFlat](https://github.com/McFlat)
10 * [DimitriGilbert](https://github.com/DimitriGilbert) 17 * [DimitriGilbert](https://github.com/DimitriGilbert)
11 * [floSoX](https://github.com/floSoX) 18 * [floSoX](https://github.com/floSoX)
12 * [Green-Star](https://github.com/Green-Star) 19 * [Green-Star](https://github.com/Green-Star)
13 * [joshmorel](https://github.com/joshmorel) 20 * [thomaskuntzz](https://github.com/thomaskuntzz)
14 * [rezonant](https://github.com/rezonant) 21 * [rezonant](https://github.com/rezonant)
15 * [kaiyou](https://github.com/kaiyou) 22 * [ldidry](https://github.com/ldidry)
16 * [Nutomic](https://github.com/Nutomic)
17 * [JohnXLivingston](https://github.com/JohnXLivingston)
18 * [okhin](https://github.com/okhin) 23 * [okhin](https://github.com/okhin)
24 * [daftaupe](https://github.com/daftaupe)
25 * [LecygneNoir](https://github.com/LecygneNoir)
19 * [fflorent](https://github.com/fflorent) 26 * [fflorent](https://github.com/fflorent)
20 * [ldidry](https://github.com/ldidry)
21 * [dedesite](https://github.com/dedesite) 27 * [dedesite](https://github.com/dedesite)
22 * [Nautigsam](https://github.com/Nautigsam) 28 * [Nautigsam](https://github.com/Nautigsam)
23 * [BO41](https://github.com/BO41) 29 * [scanlime](https://github.com/scanlime)
24 * [daftaupe](https://github.com/daftaupe) 30 * [tcitworld](https://github.com/tcitworld)
31 * [am97](https://github.com/am97)
25 * [dadall](https://github.com/dadall) 32 * [dadall](https://github.com/dadall)
26 * [jonathanraes](https://github.com/jonathanraes) 33 * [jonathanraes](https://github.com/jonathanraes)
27 * [LecygneNoir](https://github.com/LecygneNoir) 34 * [anoadragon453](https://github.com/anoadragon453)
28 * [rhaamo](https://github.com/rhaamo) 35 * [rhaamo](https://github.com/rhaamo)
29 * [mrflos](https://github.com/mrflos) 36 * [mrflos](https://github.com/mrflos)
30 * [jocelynj](https://github.com/jocelynj) 37 * [jocelynj](https://github.com/jocelynj)
38 * [lucas-dclrcq](https://github.com/lucas-dclrcq)
31 * [lucaspontoexe](https://github.com/lucaspontoexe) 39 * [lucaspontoexe](https://github.com/lucaspontoexe)
32 * [flyingrub](https://github.com/flyingrub) 40 * [flyingrub](https://github.com/flyingrub)
33 * [tcitworld](https://github.com/tcitworld) 41 * [SerCom-KC](https://github.com/SerCom-KC)
34 * [valvin1](https://github.com/valvin1) 42 * [valvin1](https://github.com/valvin1)
35 * [am97](https://github.com/am97)
36 * [taziden](https://github.com/taziden) 43 * [taziden](https://github.com/taziden)
37 * [sticmac](https://github.com/sticmac) 44 * [sticmac](https://github.com/sticmac)
45 * [barbeque](https://github.com/barbeque)
38 * [luzpaz](https://github.com/luzpaz) 46 * [luzpaz](https://github.com/luzpaz)
47 * [acid-chicken](https://github.com/acid-chicken)
39 * [louistio](https://github.com/louistio) 48 * [louistio](https://github.com/louistio)
40 * [qsypoq](https://github.com/qsypoq) 49 * [qsypoq](https://github.com/qsypoq)
50 * [daker](https://github.com/daker)
51 * [xyproto](https://github.com/xyproto)
41 * [Anton-Latukha](https://github.com/Anton-Latukha) 52 * [Anton-Latukha](https://github.com/Anton-Latukha)
42 * [noplanman](https://github.com/noplanman) 53 * [noplanman](https://github.com/noplanman)
54 * [auberanger](https://github.com/auberanger)
43 * [austinheap](https://github.com/austinheap) 55 * [austinheap](https://github.com/austinheap)
44 * [benabbottnz](https://github.com/benabbottnz) 56 * [benabbottnz](https://github.com/benabbottnz)
45 * [ewft](https://github.com/ewft) 57 * [ewft](https://github.com/ewft)
46 * [bradsk88](https://github.com/bradsk88) 58 * [bradsk88](https://github.com/bradsk88)
47 * [WildYorkies](https://github.com/WildYorkies)
48 * [Ealhad](https://github.com/Ealhad) 59 * [Ealhad](https://github.com/Ealhad)
60 * [clementbrizard](https://github.com/clementbrizard)
49 * [DeeJayBro](https://github.com/DeeJayBro) 61 * [DeeJayBro](https://github.com/DeeJayBro)
50 * [Edznux](https://github.com/Edznux) 62 * [Edznux](https://github.com/Edznux)
51 * [ebrehault](https://github.com/ebrehault) 63 * [ebrehault](https://github.com/ebrehault)
52 * [DatBewar](https://github.com/DatBewar) 64 * [DatBewar](https://github.com/DatBewar)
53 * [ReK2Fernandez](https://github.com/ReK2Fernandez) 65 * [ReK2Fernandez](https://github.com/ReK2Fernandez)
66 * [Yetangitu](https://github.com/Yetangitu)
54 * [grizio](https://github.com/grizio) 67 * [grizio](https://github.com/grizio)
55 * [Glandos](https://github.com/Glandos) 68 * [Glandos](https://github.com/Glandos)
56 * [lanodan](https://github.com/lanodan) 69 * [lanodan](https://github.com/lanodan)
70 * [HesioZ](https://github.com/HesioZ)
71 * [jagannathBhat](https://github.com/jagannathBhat)
57 * [jlebras](https://github.com/jlebras) 72 * [jlebras](https://github.com/jlebras)
58 * [alcalyn](https://github.com/alcalyn) 73 * [alcalyn](https://github.com/alcalyn)
59 * [mkody](https://github.com/mkody) 74 * [mkody](https://github.com/mkody)
60 * [lucas-dclrcq](https://github.com/lucas-dclrcq) 75 * [pichouk](https://github.com/pichouk)
61 * [zapashcanon](https://github.com/zapashcanon) 76 * [zapashcanon](https://github.com/zapashcanon)
62 * [mart-e](https://github.com/mart-e) 77 * [mart-e](https://github.com/mart-e)
63 * [scanlime](https://github.com/scanlime) 78 * [0mp](https://github.com/0mp)
79 * [mkoppmann](https://github.com/mkoppmann)
64 * [1000i100](https://github.com/1000i100) 80 * [1000i100](https://github.com/1000i100)
81 * [roipoussiere](https://github.com/roipoussiere)
65 * [zeograd](https://github.com/zeograd) 82 * [zeograd](https://github.com/zeograd)
66 * [PhieF](https://github.com/PhieF) 83 * [PhieF](https://github.com/PhieF)
67 * [Quenty31](https://github.com/Quenty31) 84 * [Quenty31](https://github.com/Quenty31)
@@ -77,6 +94,7 @@
77 * [imbsky](https://github.com/imbsky) 94 * [imbsky](https://github.com/imbsky)
78 * [ctlaltdefeat](https://github.com/ctlaltdefeat) 95 * [ctlaltdefeat](https://github.com/ctlaltdefeat)
79 * [jomo](https://github.com/jomo) 96 * [jomo](https://github.com/jomo)
97 * [lsde](https://github.com/lsde)
80 * [memoryboxes](https://github.com/memoryboxes) 98 * [memoryboxes](https://github.com/memoryboxes)
81 * [norrist](https://github.com/norrist) 99 * [norrist](https://github.com/norrist)
82 * [osauzet](https://github.com/osauzet) 100 * [osauzet](https://github.com/osauzet)
@@ -88,11 +106,13 @@
88 106
89# Translations 107# Translations
90 108
109 * [abdhessuk](https://trad.framasoft.org/zanata/profile/view/abdhessuk)
91 * [abidin24](https://trad.framasoft.org/zanata/profile/view/abidin24) 110 * [abidin24](https://trad.framasoft.org/zanata/profile/view/abidin24)
92 * [aditoo](https://trad.framasoft.org/zanata/profile/view/aditoo) 111 * [aditoo](https://trad.framasoft.org/zanata/profile/view/aditoo)
93 * [alice](https://trad.framasoft.org/zanata/profile/view/alice) 112 * [alice](https://trad.framasoft.org/zanata/profile/view/alice)
94 * [anastasia](https://trad.framasoft.org/zanata/profile/view/anastasia) 113 * [anastasia](https://trad.framasoft.org/zanata/profile/view/anastasia)
95 * [autom](https://trad.framasoft.org/zanata/profile/view/autom) 114 * [autom](https://trad.framasoft.org/zanata/profile/view/autom)
115 * [balaji](https://trad.framasoft.org/zanata/profile/view/balaji)
96 * [bristow](https://trad.framasoft.org/zanata/profile/view/bristow) 116 * [bristow](https://trad.framasoft.org/zanata/profile/view/bristow)
97 * [butterflyoffire](https://trad.framasoft.org/zanata/profile/view/butterflyoffire) 117 * [butterflyoffire](https://trad.framasoft.org/zanata/profile/view/butterflyoffire)
98 * [chocobozzz](https://trad.framasoft.org/zanata/profile/view/chocobozzz) 118 * [chocobozzz](https://trad.framasoft.org/zanata/profile/view/chocobozzz)
@@ -103,22 +123,30 @@
103 * [ehsaan](https://trad.framasoft.org/zanata/profile/view/ehsaan) 123 * [ehsaan](https://trad.framasoft.org/zanata/profile/view/ehsaan)
104 * [esoforte](https://trad.framasoft.org/zanata/profile/view/esoforte) 124 * [esoforte](https://trad.framasoft.org/zanata/profile/view/esoforte)
105 * [fkohrt](https://trad.framasoft.org/zanata/profile/view/fkohrt) 125 * [fkohrt](https://trad.framasoft.org/zanata/profile/view/fkohrt)
126 * [giqtaqisi](https://trad.framasoft.org/zanata/profile/view/giqtaqisi)
106 * [goofy](https://trad.framasoft.org/zanata/profile/view/goofy) 127 * [goofy](https://trad.framasoft.org/zanata/profile/view/goofy)
107 * [gorkaazk](https://trad.framasoft.org/zanata/profile/view/gorkaazk) 128 * [gorkaazk](https://trad.framasoft.org/zanata/profile/view/gorkaazk)
108 * [gwendald](https://trad.framasoft.org/zanata/profile/view/gwendald) 129 * [gwendald](https://trad.framasoft.org/zanata/profile/view/gwendald)
109 * [h3zjp](https://trad.framasoft.org/zanata/profile/view/h3zjp) 130 * [h3zjp](https://trad.framasoft.org/zanata/profile/view/h3zjp)
131 * [jfblanc](https://trad.framasoft.org/zanata/profile/view/jfblanc)
110 * [jhertel](https://trad.framasoft.org/zanata/profile/view/jhertel) 132 * [jhertel](https://trad.framasoft.org/zanata/profile/view/jhertel)
133 * [jmf](https://trad.framasoft.org/zanata/profile/view/jmf)
111 * [jorropo](https://trad.framasoft.org/zanata/profile/view/jorropo) 134 * [jorropo](https://trad.framasoft.org/zanata/profile/view/jorropo)
135 * [kairozen](https://trad.framasoft.org/zanata/profile/view/kairozen)
112 * [kedemferre](https://trad.framasoft.org/zanata/profile/view/kedemferre) 136 * [kedemferre](https://trad.framasoft.org/zanata/profile/view/kedemferre)
113 * [kousha](https://trad.framasoft.org/zanata/profile/view/kousha) 137 * [kousha](https://trad.framasoft.org/zanata/profile/view/kousha)
114 * [krkk](https://trad.framasoft.org/zanata/profile/view/krkk) 138 * [krkk](https://trad.framasoft.org/zanata/profile/view/krkk)
139 * [landrok](https://trad.framasoft.org/zanata/profile/view/landrok)
140 * [leeroyepold48](https://trad.framasoft.org/zanata/profile/view/leeroyepold48)
115 * [m4sk1n](https://trad.framasoft.org/zanata/profile/view/m4sk1n) 141 * [m4sk1n](https://trad.framasoft.org/zanata/profile/view/m4sk1n)
116 * [matograine](https://trad.framasoft.org/zanata/profile/view/matograine) 142 * [matograine](https://trad.framasoft.org/zanata/profile/view/matograine)
143 * [medow](https://trad.framasoft.org/zanata/profile/view/medow)
117 * [mhu](https://trad.framasoft.org/zanata/profile/view/mhu) 144 * [mhu](https://trad.framasoft.org/zanata/profile/view/mhu)
118 * [midgard](https://trad.framasoft.org/zanata/profile/view/midgard) 145 * [midgard](https://trad.framasoft.org/zanata/profile/view/midgard)
119 * [nbrucy](https://trad.framasoft.org/zanata/profile/view/nbrucy) 146 * [nbrucy](https://trad.framasoft.org/zanata/profile/view/nbrucy)
120 * [nitai](https://trad.framasoft.org/zanata/profile/view/nitai) 147 * [nitai](https://trad.framasoft.org/zanata/profile/view/nitai)
121 * [noncommutativegeo](https://trad.framasoft.org/zanata/profile/view/noncommutativegeo) 148 * [noncommutativegeo](https://trad.framasoft.org/zanata/profile/view/noncommutativegeo)
149 * [nopsidy](https://trad.framasoft.org/zanata/profile/view/nopsidy)
122 * [nvivant](https://trad.framasoft.org/zanata/profile/view/nvivant) 150 * [nvivant](https://trad.framasoft.org/zanata/profile/view/nvivant)
123 * [osoitz](https://trad.framasoft.org/zanata/profile/view/osoitz) 151 * [osoitz](https://trad.framasoft.org/zanata/profile/view/osoitz)
124 * [outloudvi](https://trad.framasoft.org/zanata/profile/view/outloudvi) 152 * [outloudvi](https://trad.framasoft.org/zanata/profile/view/outloudvi)
@@ -129,6 +157,7 @@
129 * [s8321414](https://trad.framasoft.org/zanata/profile/view/s8321414) 157 * [s8321414](https://trad.framasoft.org/zanata/profile/view/s8321414)
130 * [sato_ss](https://trad.framasoft.org/zanata/profile/view/sato_ss) 158 * [sato_ss](https://trad.framasoft.org/zanata/profile/view/sato_ss)
131 * [sercom_kc](https://trad.framasoft.org/zanata/profile/view/sercom_kc) 159 * [sercom_kc](https://trad.framasoft.org/zanata/profile/view/sercom_kc)
160 * [severo](https://trad.framasoft.org/zanata/profile/view/severo)
132 * [silkevicious](https://trad.framasoft.org/zanata/profile/view/silkevicious) 161 * [silkevicious](https://trad.framasoft.org/zanata/profile/view/silkevicious)
133 * [sosha](https://trad.framasoft.org/zanata/profile/view/sosha) 162 * [sosha](https://trad.framasoft.org/zanata/profile/view/sosha)
134 * [spla](https://trad.framasoft.org/zanata/profile/view/spla) 163 * [spla](https://trad.framasoft.org/zanata/profile/view/spla)
@@ -139,11 +168,17 @@
139 * [thibaultmartin](https://trad.framasoft.org/zanata/profile/view/thibaultmartin) 168 * [thibaultmartin](https://trad.framasoft.org/zanata/profile/view/thibaultmartin)
140 * [tirifto](https://trad.framasoft.org/zanata/profile/view/tirifto) 169 * [tirifto](https://trad.framasoft.org/zanata/profile/view/tirifto)
141 * [tuxayo](https://trad.framasoft.org/zanata/profile/view/tuxayo) 170 * [tuxayo](https://trad.framasoft.org/zanata/profile/view/tuxayo)
171 * [unextro](https://trad.framasoft.org/zanata/profile/view/unextro)
142 * [unzarida](https://trad.framasoft.org/zanata/profile/view/unzarida) 172 * [unzarida](https://trad.framasoft.org/zanata/profile/view/unzarida)
173 * [vincent](https://trad.framasoft.org/zanata/profile/view/vincent)
143 * [wanhua](https://trad.framasoft.org/zanata/profile/view/wanhua) 174 * [wanhua](https://trad.framasoft.org/zanata/profile/view/wanhua)
144 * [xinayder](https://trad.framasoft.org/zanata/profile/view/xinayder) 175 * [xinayder](https://trad.framasoft.org/zanata/profile/view/xinayder)
145 * [xosem](https://trad.framasoft.org/zanata/profile/view/xosem) 176 * [xosem](https://trad.framasoft.org/zanata/profile/view/xosem)
146 * [zveryok](https://trad.framasoft.org/zanata/profile/view/zveryok) 177 * [zveryok](https://trad.framasoft.org/zanata/profile/view/zveryok)
178 * [aditoo](https://trad.framasoft.org/zanata/profile/view/aditoo)
179 * [autom](https://trad.framasoft.org/zanata/profile/view/autom)
180 * [curupira](https://trad.framasoft.org/zanata/profile/view/curupira)
181 * [leeroyepold48](https://trad.framasoft.org/zanata/profile/view/leeroyepold48)
147 182
148 183
149# Design 184# Design
diff --git a/FAQ.md b/FAQ.md
index dba6bb1d0..e335868f8 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -5,6 +5,7 @@
5<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> 5<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
6 6
7 7
8- [Why did you create PeerTube?](#why-did-you-create-peertube)
8- [I don't like the name "PeerTube"](#i-dont-like-the-name-peertube) 9- [I don't like the name "PeerTube"](#i-dont-like-the-name-peertube)
9- [If nobody watches a video, is it seeded?](#if-nobody-watches-a-video-is-it-seeded) 10- [If nobody watches a video, is it seeded?](#if-nobody-watches-a-video-is-it-seeded)
10- [What is WebSeed?](#what-is-webseed) 11- [What is WebSeed?](#what-is-webseed)
@@ -12,15 +13,40 @@
12- [Will an index of all the videos of servers you follow be too large for small servers?](#will-an-index-of-all-the-videos-of-servers-you-follow-be-too-large-for-small-servers) 13- [Will an index of all the videos of servers you follow be too large for small servers?](#will-an-index-of-all-the-videos-of-servers-you-follow-be-too-large-for-small-servers)
13- [Which container formats can I use for the videos I want to upload?](#which-container-formats-can-i-use-for-the-videos-i-want-to-upload) 14- [Which container formats can I use for the videos I want to upload?](#which-container-formats-can-i-use-for-the-videos-i-want-to-upload)
14- [I want to change my domain name, how can I do that?](#i-want-to-change-my-domain-name-how-can-i-do-that) 15- [I want to change my domain name, how can I do that?](#i-want-to-change-my-domain-name-how-can-i-do-that)
16- [Why do we have to put our Twitter username in PeerTube configuration?](#why-do-we-have-to-put-our-twitter-username-in-peertube-configuration)
17- [How video views are calculated?](#how-video-views-are-calculated)
15- [Should I have a big server to run PeerTube?](#should-i-have-a-big-server-to-run-peertube) 18- [Should I have a big server to run PeerTube?](#should-i-have-a-big-server-to-run-peertube)
16- [Can I seed videos with my classic BitTorrent client (Transmission, rTorrent...)?](#can-i-seed-videos-with-my-classic-bittorrent-client-transmission-rtorrent) 19- [Can I seed videos with my classic BitTorrent client (Transmission, rTorrent...)?](#can-i-seed-videos-with-my-classic-bittorrent-client-transmission-rtorrent)
17- [Why host on GitHub and Framagit?](#why-host-on-github-and-framagit) 20- [Why host on GitHub and Framagit?](#why-host-on-github-and-framagit)
18- [Are you going to use the Steem blockchain?](#are-you-going-to-use-the-steem-blockchain) 21- [Are you going to use the Steem blockchain?](#are-you-going-to-use-the-steem-blockchain)
19- [Are you going to support advertisements?](#are-you-going-to-support-advertisements) 22- [Are you going to support advertisements?](#are-you-going-to-support-advertisements)
20- [What is "creation dynamic" and why not modify it?](#what-is-creation-dynamic-and-why-not-modify-it) 23- [What is "creation dynamic" and why not modify it?](#what-is-creation-dynamic-and-why-not-modify-it)
24- [I have found a security vulnerability in PeerTube. Where and how should I report it?](#i-have-found-a-security-vulnerability-in-peertube-where-and-how-should-i-report-it)
21 25
22<!-- END doctoc generated TOC please keep comment here to allow auto update --> 26<!-- END doctoc generated TOC please keep comment here to allow auto update -->
23 27
28## Why did you create PeerTube?
29
30We can't build a FOSS video streaming alternative to YouTube, Dailymotion,
31Vimeo... with centralized software. One organization alone may not have
32enough money to pay for bandwidth and video storage of its servers.
33
34Our stance is that only a decentralized network of servers can provide an
35acceptable answer to technical issues (bandwidth, transcoding expenses, etc.)
36and social answers (need for a particular moderation policy, preserving
37content, etc.).
38
39While a paragraph is not enough to answer all these problems, PeerTube has
40very early prouded itself for using a contributory design, both for creating
41communities as federated nodes (as [Mastodon](https://joinmastodon.org/) for
42example), and for seeding videos (instances can seed each other's videos). But it's not
43enough because one video could become popular and overload the server. That is
44why we need to use a P2P protocol to limit the server load. Thanks to
45[WebTorrent](https://github.com/feross/webtorrent), we can use BitTorrent
46inside most modern web browsers, and users become seeds as the video gets
47more viewers.
48
49
24## I don't like the name "PeerTube" 50## I don't like the name "PeerTube"
25 51
26PeerTube is just the name of the software. You can install it on your 52PeerTube is just the name of the software. You can install it on your
@@ -32,7 +58,7 @@ is named "Framatube".
32 58
33Yes, the origin server always seeds videos uploaded on it thanks to 59Yes, the origin server always seeds videos uploaded on it thanks to
34[Webseed](http://www.bittorrent.org/beps/bep_0019.html). 60[Webseed](http://www.bittorrent.org/beps/bep_0019.html).
35It can also be helped by other servers using [redundancy](/support/doc/redundancy.md). 61It can also be helped by other servers using [redundancy](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html#redundancy-between-instances).
36 62
37 63
38## What is WebSeed? 64## What is WebSeed?
@@ -65,6 +91,18 @@ WEBM, MP4 or OGV videos.
65You can't. You'll need to reinstall an instance and reupload your videos. 91You can't. You'll need to reinstall an instance and reupload your videos.
66 92
67 93
94## Why do we have to put our Twitter username in PeerTube configuration?
95
96You don't have to: we set a default value if you don't have a Twitter account.
97We need this information because Twitter requires an account for links share/videos embed on their platform.
98
99
100## How video views are calculated?
101
102Your web browser sends a view to the server after 30 seconds of playback. Then, the IP cannot send another view in the next hour.
103Views are buffered, so don't panic if the view counter stays the same after you watched a video.
104
105
68## Should I have a big server to run PeerTube? 106## Should I have a big server to run PeerTube?
69 107
70Not really. For instance, the demonstration server [https://peertube.cpy.re](https://peertube.cpy.re) has 2 vCore and 2GB of RAM and consumes on average: 108Not really. For instance, the demonstration server [https://peertube.cpy.re](https://peertube.cpy.re) has 2 vCore and 2GB of RAM and consumes on average:
@@ -120,3 +158,7 @@ If you still want to use a functionality potentially altering that state of thin
120 158
121With that being said, know that we are not against these features *per se*. 159With that being said, know that we are not against these features *per se*.
122We are always open to discussion about potential PRs bringing in features, even of that kind. But we certainly won't dedicate our limited resources to develop them ourselves when there is so much to be done elsewhere. 160We are always open to discussion about potential PRs bringing in features, even of that kind. But we certainly won't dedicate our limited resources to develop them ourselves when there is so much to be done elsewhere.
161
162## I have found a security vulnerability in PeerTube. Where and how should I report it?
163
164We have a policy for contributions related to security. Please refer to [SECURITY.md](./SECURITY.md)
diff --git a/README.md b/README.md
index c3a39eb1d..a9b4eb54a 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,29 @@
1<h1 align="center"> 1<h1 align="center">
2 <a href="https://joinpeertube.org"> 2 <a href="https://joinpeertube.org">
3 <img src="https://joinpeertube.org/img/brand.png" alt="PeerTube"> 3 <img src="https://joinpeertube.org/img/brand.png" alt="PeerTube">
4 <a> 4 </a>
5</h1> 5</h1>
6 6
7<p align=center> 7<p align=center>
8 <strong><a href="https://joinpeertube.org">Website</a></strong> 8 <strong><a href="https://joinpeertube.org">Website</a></strong>
9 | <strong><a href="https://instances.joinpeertube.org">Join an instance</a></strong> 9 | <strong><a href="https://instances.joinpeertube.org">Join an instance</a></strong>
10 | <strong><a href="#package-create-your-own-instance">Create one</a></strong> 10 | <strong><a href="#package-create-your-own-instance">Create an instance</a></strong>
11 | <strong><a href="#contact">Chat with us</a></strong> 11 | <strong><a href="#contact">Chat with us</a></strong>
12 | <strong><a href="https://framasoft.org/en/#soutenir">Donate</a></strong>
12</p> 13</p>
13 14
14<p align="center"> 15<p align="center">
15Federated (ActivityPub) video streaming platform using P2P (BitTorrent) 16Be part of a network of multiple small federated, interoperable video hosting providers. Follow video creators and create videos. No vendor lock-in. All on a platform that is community-owned and ad-free.
16directly in the web browser with <a href="https://github.com/feross/webtorrent">WebTorrent</a>.
17</p> 17</p>
18 18
19<p align="center"> 19<p align="center">
20<strong>We have run <a href="https://www.kisskissbankbank.com/en/projects/peertube-a-free-and-federated-video-platform">a crowdfunding campaign</a> to pave the road to version 1.0 of PeerTube. Thanks to everyone who pitched in and shared the news around. You can now check out <a href="https://github.com/Chocobozzz/PeerTube/milestone/1">the corresponding milestone</a> and help its development!</strong> 20 <strong>Developed with &#10084; by <a href="https://framasoft.org">Framasoft</a></strong>
21</p>
22
23<p align="center">
24 <a href="https://framasoft.org">
25 <img width="150px" src="http://lutim.cpy.re/Prd3ci7G.png" alt="Framasoft logo"/>
26 </a>
21</p> 27</p>
22 28
23<p align="center"> 29<p align="center">
@@ -59,11 +65,25 @@ directly in the web browser with <a href="https://github.com/feross/webtorrent">
59<br /> 65<br />
60 66
61<p align="center"> 67<p align="center">
62 <a href="https://peertube.cpy.re/videos/watch/a8ea95b8-0396-49a6-8f30-e25e25fb2828"> 68 <a href="https://framatube.org/videos/watch/217eefeb-883d-45be-b7fc-a788ad8507d3">
63 <img src="https://lutim.cpy.re/8cZDRIEF.png" alt="screenshot" /> 69 <img src="https://lutim.cpy.re/8cZDRIEF.png" alt="screenshot" />
64 </a> 70 </a>
65</p> 71</p>
66 72
73Introduction
74----------------------------------------------------------------
75
76PeerTube is a free, decentralized and federated video platform developed as an alternative to other platforms that centralize our data and attention, such as YouTube, Dailymotion or Vimeo. :clapper: But one organization hosting PeerTube alone may not have enough money to pay for bandwidth and video storage of its servers, all servers of PeerTube are interoperable as a federated network, and non-PeerTube servers can be part of the larger Vidiverse (federated video network) by talking our implementation of ActivityPub. Video load is reduced thanks to P2P (BitTorrent) in the web browser via <a href="https://github.com/feross/webtorrent">WebTorrent</a>.
77
78To learn more, see:
79* This [two-minute video](https://framatube.org/videos/watch/217eefeb-883d-45be-b7fc-a788ad8507d3) (hosted on PeerTube) explaining what PeerTube is and how it works
80* PeerTube's project homepage, [joinpeertube.org](https://joinpeertube.org)
81* Demonstration instances:
82 * [peertube.cpy.re](https://peertube.cpy.re)
83 * [peertube2.cpy.re](https://peertube2.cpy.re)
84 * [peertube3.cpy.re](https://peertube3.cpy.re)
85* This [video](https://peertube.cpy.re/videos/watch/da2b08d4-a242-4170-b32a-4ec8cbdca701) demonstrating the communication between PeerTube and [Mastodon](https://github.com/tootsuite/mastodon) (a decentralized Twitter alternative)
86
67:sparkles: Features 87:sparkles: Features
68---------------------------------------------------------------- 88----------------------------------------------------------------
69 89
@@ -79,7 +99,7 @@ Just upload your videos, and be sure they will stream anywhere. Add a descriptio
79 99
80<h3 align="right">Keep in touch with video creators</h3> 100<h3 align="right">Keep in touch with video creators</h3>
81<p align="right"> 101<p align="right">
82Follow your favorite channels from PeerTube or really any other place. No need to have an account on the instance you watched a video to follow its author, you can do all of that from the Fediverse (Mastodon, Pleroma and plenty others), or just with good ol' RSS. 102Follow your favorite channels from PeerTube or really any other place. No need to have an account on the instance you watched a video to follow its author, you can do all of that from the Fediverse (Mastodon, Pleroma, and plenty others), or just with good ol' RSS.
83</p> 103</p>
84 104
85--- 105---
@@ -95,38 +115,29 @@ Be it as a user or an instance administrator, you can decide what your experienc
95 115
96<h3 align="right">Communities that help each other</h3> 116<h3 align="right">Communities that help each other</h3>
97<p align="right"> 117<p align="right">
98In addition to visitors using WebTorrent to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our <a href="/support/doc/redundancy.md">redundancy guide</a>). 118In addition to visitors using WebTorrent to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our <a href="https://docs.joinpeertube.org/lang/en/devdocs/architecture.html#redundancy-between-instances">redundancy guide</a>).
99</p> 119</p>
100<p align="right"> 120<p align="right">
101Content creators can get help from their viewers in the simplest way possible: a support button showing a message linking to their donation accounts or really anything else. No more pay-per-view and advertisments that hurt visitors and <strike>incentivize</strike> alter creativity (more about that in our <a href="./FAQ.md">FAQ</a>). 121Content creators can get help from their viewers in the simplest way possible: a support button showing a message linking to their donation accounts or really anything else. No more pay-per-view and advertisements that hurt visitors and <strike>incentivize</strike> alter creativity (more about that in our <a href="./FAQ.md">FAQ</a>).
102</p> 122</p>
103 123
104--- 124:raised_hands: Contributing
105 125----------------------------------------------------------------
106Want to see it in action?
107 126
108 * Demonstration servers: 127You don't need to be a coder to help!
109 * [peertube.cpy.re](https://peertube.cpy.re)
110 * [peertube2.cpy.re](https://peertube2.cpy.re)
111 * [peertube3.cpy.re](https://peertube3.cpy.re)
112 * [Video](https://framatube.org/videos/watch/217eefeb-883d-45be-b7fc-a788ad8507d3) What is PeerTube?
113 * [Video](https://peertube.cpy.re/videos/watch/f78a97f8-a142-4ce1-a5bd-154bf9386504)
114 to see what the "decentralization feature" looks like
115 * [Video](https://peertube.cpy.re/videos/watch/da2b08d4-a242-4170-b32a-4ec8cbdca701) to see
116 the communication between PeerTube and [Mastodon](https://github.com/tootsuite/mastodon)
117 128
118:question: Motivation 129You can give us your feedback, report bugs, help us translate PeerTube, write documentation, and more. Check out the [contributing
119---------------------------------------------------------------- 130guide](/.github/CONTRIBUTING.md) to know how, it takes less than 2 minutes to get started. :wink:
120 131
121We can't build a FOSS video streaming alternative to YouTube, Dailymotion, 132You can also join the cheerful bunch that makes our community:
122Vimeo... with centralized software. One organization alone may not have
123enough money to pay for bandwidth and video storage of its servers.
124 133
125So we need to have a decentralized network of servers seeding videos (as 134* Chat<a name="contact"></a>:
126[Diaspora](https://github.com/diaspora/diaspora) for example). But it's not 135 * IRC : **[#peertube on chat.freenode.net:6697](https://kiwiirc.com/client/irc.freenode.net/#peertube)**
127enough because one video could become popular and overload the server. That is 136 * Matrix (bridged on IRC and [Discord](https://discord.gg/wj8DDUT)) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)**
128why we need to use a P2P protocol to limit the server load. Thanks to 137* Forum:
129[WebTorrent](https://github.com/feross/webtorrent), we can make BitTorrent inside the web browser, as of today. 138 * Framacolibri: [https://framacolibri.org/c/peertube](https://framacolibri.org/c/peertube)
139
140Feel free to reach out if you have any questions or ideas! :speech_balloon:
130 141
131:package: Create your own instance 142:package: Create your own instance
132---------------------------------------------------------------- 143----------------------------------------------------------------
@@ -144,20 +155,6 @@ See the [production guide](/support/doc/production.md), which is the recommended
144 155
145See the [community packages](https://docs.joinpeertube.org/lang/en/docs/install.html), which cover various platforms (including [YunoHost](https://install-app.yunohost.org/?app=peertube) and [Docker](/support/doc/docker.md)). 156See the [community packages](https://docs.joinpeertube.org/lang/en/docs/install.html), which cover various platforms (including [YunoHost](https://install-app.yunohost.org/?app=peertube) and [Docker](/support/doc/docker.md)).
146 157
147:wrench: Contribute/Translate/Test
148----------------------------------------------------------------
149
150*Spoiler alert*: you don't need to be a coder to help!
151
152See the [contributing
153guide](/.github/CONTRIBUTING.md). Or simply join the cheerful bunch that makes our community:
154
155 * Chat<a name="contact"></a>:
156 * IRC : **[#peertube on chat.freenode.net:6697](https://kiwiirc.com/client/irc.freenode.net/#peertube)**
157 * Matrix (bridged on the IRC channel) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)**
158 * Forum:
159 * Framacolibri: [https://framacolibri.org/c/peertube](https://framacolibri.org/c/peertube)
160
161:book: Documentation 158:book: Documentation
162---------------------------------------------------------------- 159----------------------------------------------------------------
163 160
@@ -177,44 +174,23 @@ See the more general [admin documentation](https://docs.joinpeertube.org/lang/en
177 174
178 * [Import videos (YouTube, Dailymotion, Vimeo...)](/support/doc/tools.md) 175 * [Import videos (YouTube, Dailymotion, Vimeo...)](/support/doc/tools.md)
179 * [Upload videos from the CLI](/support/doc/tools.md) 176 * [Upload videos from the CLI](/support/doc/tools.md)
180 * [Admin server tools (create transcoding jobs, prune storage...)](/develop/support/doc/tools.md#server-tools) 177 * [Admin server tools (create transcoding jobs, prune storage...)](/support/doc/tools.md#server-tools)
181 178
182### Technical documentation 179### Technical documentation
183 180
184See [ARCHITECTURE.md](/ARCHITECTURE.md) for a more detailed explanation of the architectural choices. 181See the [architecture blueprint](https://docs.joinpeertube.org/lang/en/devdocs/architecture.html) for a more detailed explanation of the architectural choices.
185
186#### Backend
187
188 * REST API:
189 * Quick Start: [/support/doc/api/quickstart.md](/support/doc/api/quickstart.md)
190 * Swagger/OpenAPI schema: [/support/doc/api/openapi.yaml](/support/doc/api/openapi.yaml)
191 * HTML explorer: [/support/doc/api/html/index.html](https://htmlpreview.github.io/?https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/api/html/index.html)
192 * Servers communicate with each other with [Activity
193 Pub](https://www.w3.org/TR/activitypub/).
194 * Each server has its own users who query it (search videos, query where the
195 torrent URI of this specific video is...).
196 * When a user uploads a video, the server sends its followers metadata about the video (name, short description, torrent URI...).
197 * A server is a tracker responsible for all the videos uploaded on it.
198 * Even if nobody watches a video, it is seeded by the server (through
199 [WebSeed protocol](http://www.bittorrent.org/beps/bep_0019.html)) where the
200 video was uploaded.
201
202Here are some simple schemes:
203 182
204<p align="center"> 183See our REST API documentation:
205 184 * OpenAPI 3.0.0 schema: [/support/doc/api/openapi.yaml](/support/doc/api/openapi.yaml)
206<img src="support/doc/user/decentralized.png" alt="Decentralized" /> 185 * Spec explorer: [docs.joinpeertube.org/api.html](http://docs.joinpeertube.org/api.html)
207
208<img src="support/doc/user/watch-video.png" alt="Watch a video" />
209
210<img src="support/doc/user/watch-p2p.png" alt="Watch a P2P video" />
211
212</p>
213 186
187See our [ActivityPub documentation](https://docs.joinpeertube.org/lang/en/devdocs/federation.html).
214 188
215:heart: Supports of our crowdfunding 189:heart: Supports of our crowdfunding
216---------------------------------------------------------------- 190----------------------------------------------------------------
217 191
192We have run [a crowdfunding campaign](https://www.kisskissbankbank.com/en/projects/peertube-a-free-and-federated-video-platform) to pave the road to the version 1.0.0 of PeerTube. Thanks to everyone who pitched in and shared the news around!
193
218Quonfucius, IP Solution, \_Laure\_, @lex666, 0x010C, 3dsman, 3rw4n-G3D, aallrd, Abel-Berger, Adam-Odell, adechambost, adim, adngdb, Adrien Thurotte, Adrien-BARAN, Adrien-Hamraoui, Adrien-Horcholle, Adrien-Luxey, Adrien-Polar, Adrien-Touminet, Agathe Begault, Agence-Différente, Ahmed-Al-Ahmed, aiprole, akpoptro, Al-Nimr, Alain-Delgrange, Alain-Fyon, Alain-Girard, Alain-MICHEL, Aleksandar-Aleksandrov, Alex-Chancellé, Alex-Dufournet, Alex-Gleason, Alexander-Murray-Watters, Alexandre-Alapetite, Alexandre-Badez, Alexandre-Giuliani, Alexandre-Mercier, Alexandre-Roux-2, Alexandre-SIMON, Alexandre29, Alexia-Monsavoir, Alexis-Frn, Alexis-Gros, Alexis-Kauffmann, alfajet, Alias, alinemont, Aliocha-Lang, Alllightlong, aloisdg, Amanda Hinault, André-Rabe, Anne-PROTAS, antoine, Antoine Derouin, Antoine-Beauvillain, Antoine-Deléron, antomoro, Antón López, Antonin-DENIS, Antonin-Segault, aokami, Apichat-Apichat, Ar-To, ARIAS-Frédéric-2, ariasuni, Aris-Papathéodorou, Arnaud -Vigoureux , Arnaud-Mounier, Arnaud-Risler, Arnaud-Vigouroux, Arnulf, Arthur-Bellier, arthur-bello, Arthur-Charron, Arthur-De Kimpe, Arthur.Ball, Arthur.Frin, Arvi-LEFEVRE, athanael.fr, auber38, Auguste Psqr, Aurélien-Tamisier, Avel-Musicavel, axel-guegant, Axel-Plat, Aymeric-Dlv, Ayst, Azenilion, Bandino, baptiste-lemoine, Baptiste-Rochez, baruica, Bastien-Dangin, batlab, bcourtine, Bea-Schaack-2, beaufils, beaumme, Belmont1, Ben-Geeraerts, Ben-Meijering, Benjamin-Baratta, Benjamin-Roussel, Benoît Joffre, Benoîtdd, Bernard-Legrand, Bernard-Vauquelin, Bernhard-Hayden, bertrand.arlabosse, bigsicret, bjg, bnjbvr, bob\_isat, bobstechsite, Bolton-Allan, Boov', Boris-ARGAUD, Brice.Francois, broz42, Bruno Lefèvre, Bruno-Douville, Bruno-Fortabat, Bruno-Gadaleta, Bruno-VASTA, Bumblebee, Butchcassidy, Cadiou-Christophe, calendros, Candy-Ming, cappitaine, Carmen-Drocourt, carrigns, case, Cathy-Barbet, CBach, ccazin, Cecile-Obernesser, Cecilia-:), Cédric-Bleschet, Cédric.Bayle, Cestdoncvrai, cgay, champ contrechamp, chapa, charlerlin, charles-jacquin, Charlie-Duclut, charlotte-cgondre78, Chris-Doe, chris-louba, Christel-Berthelot, Christian-FERRARIS, christiannavelot, Christophe-Bastin, christophe-beziers la fosse, Christophe-Pieret, Christophe-Verhaege, christophec, Christopher-Bero, chtfn, chud, Claire-C, clairezed, Claude-POUGHEON, Clément-Hubert, Clément-Morelle, clydeb, Comamanel, Côme Chilliet, Confederac.io, Consulting-AZAPTEC, Corentin3892, CryoGen, cyp, Cypher-Goat, Cyril, Cyril\_M\_, Cyril-MONMOUTON, Cyril-Waechter, Damien-Gabard, Damien-Garaud, Dams3132, Daniel Kuebler, Daniel Waxweiler, Daniel-Bartsch, Daniel-PIPALA, Daniel-Struck, Daniel-Thul, Danny-Joerger, DansLeRuSH, DantSu, Dany-Marcoux, Daouzli-Adel, Darfeld, Darth\_Judge, Dashcom, David-BADOIL, David-Benoist, David-Dormoy, David-Gil-2, David-Velasco, David-Wagner, David-writ, davlgd, davyg2, dbudo72300, de Folleville -Matthieu , DeBugs, Denis-Lecourtiller, Denis-Vannier, Desmu, Didier-Bove, Diego-Crespo, Dimitri-Stouney, dino, Dinosaure, Doc Skellington, Dominique-Brun, dr4Ke, DreamClassier, DRogueRonin, dussydelf, Dylan-Moonfire, Ealhad, Edouard-SCHWEISGUTH, Elanndelh--, ElodieEtJimmy, Éloi-Rivard, Elric-Noel, Elwan-Héry, Emilie-Wietzke, Emilien-Ghomi, eparth, Eric-Bouhana, Eric-Hendricks, Eric.Vales, Erwan-Moreau, Erzender, ESS\_Clem, Etienne-Baqué, Etienne-Botek, Etienne-Lmn, Ex-Serv, fabeveynes, Fabien BERINI ( Rehvaro ) , Fabien Freling, Fabien-Roualdes, Fabien.Abraini, Fabien.Bonneval, fabrice-simon, farlistener, Felix-ROBICHON, FelixDouet, FHE, Fiamoa-McBenson, flamwenco, Flopômpôm, FloraGC, Florent-Deschamps, Florent-Fayolle, Florent-Mallet, Florent-Vasseur, Florent.Duveau, Florestan Fournier, Florian Kohrt, Florian-Bellafont, Florian-Douay, Florian-LE GOFF, Florian-Siegenthaler, Florian.Freyss, fobrice, FOKUZA, Fol-De Dol, FP45, Francis.Moraud, François-Dambrine, François-Deguerry, Francois-Goer, François-Lecomte, François-Lemaire, François-Malterre, François-MORLET, François-Schoubben, François-Xavier-Davanne, François-Zajéga, francois.peyratout, Frathom, Fred-Fred-2, Frédéric GUÉLEN, Frédéric-Blumstein, Frédéric-Meurou, Frederic-Reynaud, Frédéric-Sagot, Frek, FrenchHope, freyja, FugazziPL, Funky-Whale, Gabriel-Devillers, Gabriel-Mirété, Galedas, GardoToF, Gaspard-Kemlin, GauthierPLM, Gauvain "GovanifY" Roussel-Tarbouriech, Gavy, gdquest, Geek Faëries, Geneviève-Perello, Geoffroy-MANAUD, Geojulien, Georges-Dutreix, Georges-Sempéré, Gerald-Vannier, Gérard-Brasquet, Gérard-Sensevy, Gerrit-Großkopf, GGBNM, Ghislain-Fabre, Gil-Felot, Gilles-Brossier, Gilles-Moisan, Gilles-SACLIER, Gilles-Trossevin, Gilou, GinGa, ginkgopr, glazzara, Glen-Lomax, Gof, Gonçalves-Daniel, goofy-goofy, grandlap, GRAP-Groupement Régional Alimentaire de Proximité, greg-chapuis, Grégoire-Delbeke, Grégory-Becq, Grégory-Goulaouic, Gregouw, Grizix, GrosCaillou, Grummfy, grumph, guiaug, Guillaume-Allart, Guillaume-Chambert, Guillaume-Chaslot, Guillaume-David, Guillaume-Duc, Guillaume-Gay, Guillaume-Lecoquierre, Guillaume007, guillaumefavre, Guiraud-Dominique, Guy-Torreilles, GwendalL, gwlolos, Hanna-E, Hanno-Wagner, Harald-Eilertsen, Harpocrate, Hebus82, Hellmut, Henri-ROS, hervelc, hguilbert, Hisham-Muhammad, Hoang-Mai-Lesaffre, Homerc, homosapienssapiens, hoper, Hoshin, Hugo-Lagouge, Hugo-SIMANCAS, Hugo-Simon, Hylm, IchbinRob, Ivan-Ogai, Ivan.D'halluin, Ivar-Troost, J-C-2, Jacques-Roos, James-Moore, James-Valleroy, Jan-Aagaard, Jan-Keromnes, Jancry, Janko-Mihelić, jano31coa, Jboot, jcgross, Jean CHARPENTIER, jean claude-skowron, Jean Dos, jean luc-PERROT, Jean-Baptiste-Maneyrol, Jean-charles-Surbayrole, Jean-claude-Jouanne, jean-dreyfus, jean-FISCHER, JEAN-FRANCOIS-BOUDEAU, Jean-Francois-Ducrot, Jean-François-PETITBON, Jean-François-Tomasi, Jean-Galland, Jean-louis-Bergamo, Jean-Luc-PIPO, Jean-Marie-Graïc, Jean-Martin Laval, Jean-Noel-Bruletout, Jean-Paul-GIBERT, Jean-Paul-Lescat, jean-philippe-bénétrix, Jean-Philippe-Eisenbarth, Jean-Philippe-Renaudet, Jean-Philippe-Rennard, Jean-Sébastien-Renaud, Jean-Yves Kiger, Jean-Yves-DUPARC, Jeanne-Corvellec, jeansebastien, Jelv, Jérémie -Wach, Jeremie-Lestel, Jérémy-Korwin, Jérôme-Avond, Jerome-Bu, Jerome-Denis, Jérôme-ISNARD, jerome-simonato, JeromeD, Jery, Jezza, Jim-McDoniel, jl-M-2, jlanca, jlcpuzzle, jn-m, jnthnctt, joakim.faiss, Joe-Riche, Joévin-SOULENQ, Johann-FONTAINE, John-Devor, John-Doe, Jojo-Boulix, Jonas-Aparicio, Jonathan-Dollé, Jonathan-Kohler, Jonathan-LAURENT, Jos-van den Oever, Joseph-Lawson, Jozef-Knaperek, jroger, ju, jubarbu, Julianoe-G, Julie-Bultez, Julien Loudet, Julien Maulny (alcalyn), Julien-AILHAUD, Julien-Aubin, Julien-Biaudet, Julien-Bréchet, Julien-Cochennec, Julien-Duroure, Julien-Huon, Julien-Lemaire, Julien-Weber, jyb, K-\_, KalambakA, Kanor, kari-kimber, Karim-Jouini, karl-bienfait, Kdecherf, Keplerpondorskell, kevin-Beranger, Kevin-Nguyen, King-Of Peons, Kioob, kloh, kokoklems, Konstantin-Kovar, Kriĉjo, Kyâne-PICHOU, L'elfe-Sylvain, La Gonz, Lara-Dufour, lareinedeselfes, Laurence-Giroud, laurent-fuentes, Laurent-HEINTZ, Laurent-PICQUENOT, ldubost, lebidibule, LeChi, LeDivinBueno, Legrave, Les Assortis, Leyokki-Tk, LibreEnFete-en Tregor, LilO. Moino, Liloumuloup, Linuxine-T, lionel-lachaud, Lionel-Schinckus, Loïc-L'Anton, Loïc.Guérin, Louis-Gatin, Louis-Marie-BAER, Louis-Rémi.Babé, Louis-Roche, Louisclement, Lu, ludovic-lainard, Ludovic-Pénet, Lukas-Steiblys, lusoheart, Mad Sugar, maguy-giorgi, mahen, maiido, Malphas, ManetteBE, Manon-Amalric, Manuel-Vazquez, ManuInzesky, Manumerique, Marc-BESSIERES, Marc-DUFOURNET, Marc-GASSER, Marc-Honnorat, marc-wilzius, marc.ribault.1, Marco-Heisig, Marie-PACHECO, Marien-Fressinaud, Marius-Lemonnier, Mark-O'Donovan, marliebo, marmat8951, mart1n, martensite, Mathdatech, Mathias-Bocquet, Mathieu-Amirault, Mathieu-B., Mathieu-Cornic, Mathieu-VIRAMAN, Matías-Pérez, Matilin-Torre, matt.faure, Mattéo-Delabre, Matthias-Devlamynck, Matthieu-Bollot, Matthieu-De Beule, Matthieu-DEVILLERS, Matthieu-Dupont de Dinechin, Matthieu-Gaudé, Matthieu-Sauboua-Beneluz, matthieublanco, MatthieuSchneider, Max-PENY, Maxime-de WYROW, Maxime-Desjardin, Maxime-Forest, maxime-haag, Maxime-Mangel, Maximilian Praeger, Mayeul-Cantan, Mayeul-Guiraud, mcg1712, metalvinze, Mewen, mheiber, Michael-Koppmann, Michael-Loew, Michael-Q. Bid, Michal-Herda, Michal-Noga, Michel-DUPONT, Michel-Le Lagadec, Michel-POUSSIER, Michel-Roux, Mickaël-Gauvin, Mickael-Liegard, MicMP3Man, Miguel-de la Cruz, Mike-Kasprzak, Mimon-Lapompe, Mister-Ocelot, mjhvc, Moutmout, MouTom, MP, mphdp, Mr-Tea, msellebulle, Mushussu, mylainos, nanouckd, Nasser-Debruyere, Nat-Tuck, Nathan.B, nayya, nazgulz666, Neal-Wilson, neeev, neodarz-neodarz, NepsKi, Nestorvep, NHenry, Nialix, NicoD, Nicolas-Auvray, nicolas-k, Nicolas-Pinault, Nicolas-Ruffel, NicolasCARPi, nicolaslegland, niconil, Niles, nitot, Nono1965, Norbert, Norde, Numcap, obergix, Obrow, Okki, Olivier-Calzi, Olivier-Ganneval, Olivier-Marouzé, Olivier-Mondoloni, olivier-pierret, Oncela-Petit Chat, Óskar-Sturluson, p3n15634n7, Paindesegle, Pas De-Panique, Pascal-BLEUSE, Pascal-Larramendy, Patrice-Jabeneau, patrice-maertens, patrick-bappel, PATRICK-GRANDIN, Patrick-MERCIER, Patrickl , Paul-Härle, Paul-Tardy, pbramy, Pedro-CADETE, Perrine-de Coëtlogon, Peter\_Fillgod, Petter-Joelson, Philippe-BATTMANN, Philippe-Cabaud, Philippe-Debar, philippe-giffard, Philippe-Lallemant, Philippe-Le Van, philippe-lhardy, Philippe-Thébault, Philippe-VINCENT-2, PhilOGM, Pierre 'catwell' Chapuis, Pierre Gros, Pierre-Antoine-Champin, Pierre-Bresson-2, Pierre-d'Alençon, Pierre-Equoy, Pierre-Girardeau, Pierre-Houmeau, Pierre-Marijon, Pierre-petch, Pierrick-Couturier, Pilou-CaraGk, Piotr-Miszczak, Pla, Plastic Yogi, PME2050, pmiossec, Pofilo, Polioman, Polios63, Poutchiny, PRALLET-Claude, PtrckVllnv, Pulov Yuran, queertube, Quentin-Dugne, Quentin-PAGÈS, ra-mon, Radhwan-Ben Madhkour, Raphaël-Brocq, Raphaël-Grolimund, Raphaël-Piédallu, raphane, Raphip, Raven, Raymond-Lutz, Razael, Rebecca-Breu, Remi-Durand, Rémi-Herrmann, Rémi-Verschelde, Remigho, Remix-the commons, Remy-Grauby, Rémy-Pradier, Renaud-Vincent, rgggn, rigelk, rip, Rivinbeg, Robert-Riemann, Robin Biechy, Roger-FRATTE, roipoussiere, Rolindes-Arroyo, Romain Théry-Hermain, Romain-Bouyé, Romain-Ortiz, RomainVENNE, Romuald-EYRAUD, royhome, Rudy-aparicio, Rusty-Dwyer, rverchere, sajous.net, Salah-ZERGUI, Sam-R, Samh, Samuel Tardieu, Samuel-FAYET, Samuel-Verschelde, Sanpi, Sascha-Brendel, Schwartz, Se7h, Sebastiaan-Glazenborg, Sebastian-Hugentobler, Sébastien Adam, Septie, Ser Eole, Severin-Suveren, severine-roger, shlagevuk-shlagevuk, Siegfried-Ehret, Simon-Hemery, Simon-Larcher, Simon-Reiser, Simounet, Siri-Louie, sissssou, skarab, Skurious, skynebula, Sohga-Sohga, Solène-Rapenne, solinux, Sophie-Imbach , Sosthen, Spiderweak, Stanislas-ANDRE, Stanislas-Michalak, starmatt, Steef, Stefan-Petrovski, Stéphane-Girardon, Stéphanie-Baltus, Stev-3d, Stoori, SuckyStrike, Sufflope, Sulfurax, SundownDEV, Swann-Fournial, Syk, Syluban, Sylv1c, Sylvain Bellone, Sylvain P, Sylvain\_M, Sylvain-Cazaux, Sylvain-GLAIZE, sylvain.arrachart, Sylvestre Ledru, sylvie-boutet, Sylvie-TORRES, tael67, tang35, tangi\_b, Tarulien, Taunya-Debolt, Tazimut-Khaelyor, terry-maire, Thanaen, Thatoo, Théophile-Noiré, Thibault-Vlieghe, Thierry-Chancé, Thierry-Fenasse, Thomas-Aurel, Thomas-CALVEZ, thomas-constans, Thomas-Kuntz, thomassin-loucas, Thosbk, ticosc, Tim-Albers, Tinapa -Itastri, TkPx, TM, tnntwister, TomR, Tomus, Tonio-Bilos, tony-carnide, Toover, toto-leroidelasaucisse, ToumToum, TP., trigrou, Tristan-Porteries, Tryph, Tursiops, tzilliox, U-&\_\`HbAAe4onnpN9!e+/#42\*5>k^E, Ulrich-Norbisrath, Un Sur Quatre, Valerio-Paladino, Valerio-Pilo, Valeryan\_24, Valou69, Vegattitude, Velome, Vergogne, Vero-Pajot, vianneyb, Victo-Sab, Victor -Hery, Victorien-Labalette, Vincent-Corrèze, Vincent-Fromentin, Vincent-Lamy, Vincent-Lasseur, VINCENT-PEYRET, vmorel, Walter-van Holst, Watsdesign, Wesley-Moore, williampolletdev, win100, wyk, Xaloc-Xaloc, Xavier ALT, Xavier-Chantry, Xavier-Godard, XoD, Yaaann, Yann-Delaunoy, Yann-Nave, yannick-grenzinger, yanselmetti, Ykatsot, Yohann-Bacha, yopox, Youen-Toupin, Yves-Caniou, Yves-Gerech, zar-rok, ZeBlackPearl, ZeGreg 194Quonfucius, IP Solution, \_Laure\_, @lex666, 0x010C, 3dsman, 3rw4n-G3D, aallrd, Abel-Berger, Adam-Odell, adechambost, adim, adngdb, Adrien Thurotte, Adrien-BARAN, Adrien-Hamraoui, Adrien-Horcholle, Adrien-Luxey, Adrien-Polar, Adrien-Touminet, Agathe Begault, Agence-Différente, Ahmed-Al-Ahmed, aiprole, akpoptro, Al-Nimr, Alain-Delgrange, Alain-Fyon, Alain-Girard, Alain-MICHEL, Aleksandar-Aleksandrov, Alex-Chancellé, Alex-Dufournet, Alex-Gleason, Alexander-Murray-Watters, Alexandre-Alapetite, Alexandre-Badez, Alexandre-Giuliani, Alexandre-Mercier, Alexandre-Roux-2, Alexandre-SIMON, Alexandre29, Alexia-Monsavoir, Alexis-Frn, Alexis-Gros, Alexis-Kauffmann, alfajet, Alias, alinemont, Aliocha-Lang, Alllightlong, aloisdg, Amanda Hinault, André-Rabe, Anne-PROTAS, antoine, Antoine Derouin, Antoine-Beauvillain, Antoine-Deléron, antomoro, Antón López, Antonin-DENIS, Antonin-Segault, aokami, Apichat-Apichat, Ar-To, ARIAS-Frédéric-2, ariasuni, Aris-Papathéodorou, Arnaud -Vigoureux , Arnaud-Mounier, Arnaud-Risler, Arnaud-Vigouroux, Arnulf, Arthur-Bellier, arthur-bello, Arthur-Charron, Arthur-De Kimpe, Arthur.Ball, Arthur.Frin, Arvi-LEFEVRE, athanael.fr, auber38, Auguste Psqr, Aurélien-Tamisier, Avel-Musicavel, axel-guegant, Axel-Plat, Aymeric-Dlv, Ayst, Azenilion, Bandino, baptiste-lemoine, Baptiste-Rochez, baruica, Bastien-Dangin, batlab, bcourtine, Bea-Schaack-2, beaufils, beaumme, Belmont1, Ben-Geeraerts, Ben-Meijering, Benjamin-Baratta, Benjamin-Roussel, Benoît Joffre, Benoîtdd, Bernard-Legrand, Bernard-Vauquelin, Bernhard-Hayden, bertrand.arlabosse, bigsicret, bjg, bnjbvr, bob\_isat, bobstechsite, Bolton-Allan, Boov', Boris-ARGAUD, Brice.Francois, broz42, Bruno Lefèvre, Bruno-Douville, Bruno-Fortabat, Bruno-Gadaleta, Bruno-VASTA, Bumblebee, Butchcassidy, Cadiou-Christophe, calendros, Candy-Ming, cappitaine, Carmen-Drocourt, carrigns, case, Cathy-Barbet, CBach, ccazin, Cecile-Obernesser, Cecilia-:), Cédric-Bleschet, Cédric.Bayle, Cestdoncvrai, cgay, champ contrechamp, chapa, charlerlin, charles-jacquin, Charlie-Duclut, charlotte-cgondre78, Chris-Doe, chris-louba, Christel-Berthelot, Christian-FERRARIS, christiannavelot, Christophe-Bastin, christophe-beziers la fosse, Christophe-Pieret, Christophe-Verhaege, christophec, Christopher-Bero, chtfn, chud, Claire-C, clairezed, Claude-POUGHEON, Clément-Hubert, Clément-Morelle, clydeb, Comamanel, Côme Chilliet, Confederac.io, Consulting-AZAPTEC, Corentin3892, CryoGen, cyp, Cypher-Goat, Cyril, Cyril\_M\_, Cyril-MONMOUTON, Cyril-Waechter, Damien-Gabard, Damien-Garaud, Dams3132, Daniel Kuebler, Daniel Waxweiler, Daniel-Bartsch, Daniel-PIPALA, Daniel-Struck, Daniel-Thul, Danny-Joerger, DansLeRuSH, DantSu, Dany-Marcoux, Daouzli-Adel, Darfeld, Darth\_Judge, Dashcom, David-BADOIL, David-Benoist, David-Dormoy, David-Gil-2, David-Velasco, David-Wagner, David-writ, davlgd, davyg2, dbudo72300, de Folleville -Matthieu , DeBugs, Denis-Lecourtiller, Denis-Vannier, Desmu, Didier-Bove, Diego-Crespo, Dimitri-Stouney, dino, Dinosaure, Doc Skellington, Dominique-Brun, dr4Ke, DreamClassier, DRogueRonin, dussydelf, Dylan-Moonfire, Ealhad, Edouard-SCHWEISGUTH, Elanndelh--, ElodieEtJimmy, Éloi-Rivard, Elric-Noel, Elwan-Héry, Emilie-Wietzke, Emilien-Ghomi, eparth, Eric-Bouhana, Eric-Hendricks, Eric.Vales, Erwan-Moreau, Erzender, ESS\_Clem, Etienne-Baqué, Etienne-Botek, Etienne-Lmn, Ex-Serv, fabeveynes, Fabien BERINI ( Rehvaro ) , Fabien Freling, Fabien-Roualdes, Fabien.Abraini, Fabien.Bonneval, fabrice-simon, farlistener, Felix-ROBICHON, FelixDouet, FHE, Fiamoa-McBenson, flamwenco, Flopômpôm, FloraGC, Florent-Deschamps, Florent-Fayolle, Florent-Mallet, Florent-Vasseur, Florent.Duveau, Florestan Fournier, Florian Kohrt, Florian-Bellafont, Florian-Douay, Florian-LE GOFF, Florian-Siegenthaler, Florian.Freyss, fobrice, FOKUZA, Fol-De Dol, FP45, Francis.Moraud, François-Dambrine, François-Deguerry, Francois-Goer, François-Lecomte, François-Lemaire, François-Malterre, François-MORLET, François-Schoubben, François-Xavier-Davanne, François-Zajéga, francois.peyratout, Frathom, Fred-Fred-2, Frédéric GUÉLEN, Frédéric-Blumstein, Frédéric-Meurou, Frederic-Reynaud, Frédéric-Sagot, Frek, FrenchHope, freyja, FugazziPL, Funky-Whale, Gabriel-Devillers, Gabriel-Mirété, Galedas, GardoToF, Gaspard-Kemlin, GauthierPLM, Gauvain "GovanifY" Roussel-Tarbouriech, Gavy, gdquest, Geek Faëries, Geneviève-Perello, Geoffroy-MANAUD, Geojulien, Georges-Dutreix, Georges-Sempéré, Gerald-Vannier, Gérard-Brasquet, Gérard-Sensevy, Gerrit-Großkopf, GGBNM, Ghislain-Fabre, Gil-Felot, Gilles-Brossier, Gilles-Moisan, Gilles-SACLIER, Gilles-Trossevin, Gilou, GinGa, ginkgopr, glazzara, Glen-Lomax, Gof, Gonçalves-Daniel, goofy-goofy, grandlap, GRAP-Groupement Régional Alimentaire de Proximité, greg-chapuis, Grégoire-Delbeke, Grégory-Becq, Grégory-Goulaouic, Gregouw, Grizix, GrosCaillou, Grummfy, grumph, guiaug, Guillaume-Allart, Guillaume-Chambert, Guillaume-Chaslot, Guillaume-David, Guillaume-Duc, Guillaume-Gay, Guillaume-Lecoquierre, Guillaume007, guillaumefavre, Guiraud-Dominique, Guy-Torreilles, GwendalL, gwlolos, Hanna-E, Hanno-Wagner, Harald-Eilertsen, Harpocrate, Hebus82, Hellmut, Henri-ROS, hervelc, hguilbert, Hisham-Muhammad, Hoang-Mai-Lesaffre, Homerc, homosapienssapiens, hoper, Hoshin, Hugo-Lagouge, Hugo-SIMANCAS, Hugo-Simon, Hylm, IchbinRob, Ivan-Ogai, Ivan.D'halluin, Ivar-Troost, J-C-2, Jacques-Roos, James-Moore, James-Valleroy, Jan-Aagaard, Jan-Keromnes, Jancry, Janko-Mihelić, jano31coa, Jboot, jcgross, Jean CHARPENTIER, jean claude-skowron, Jean Dos, jean luc-PERROT, Jean-Baptiste-Maneyrol, Jean-charles-Surbayrole, Jean-claude-Jouanne, jean-dreyfus, jean-FISCHER, JEAN-FRANCOIS-BOUDEAU, Jean-Francois-Ducrot, Jean-François-PETITBON, Jean-François-Tomasi, Jean-Galland, Jean-louis-Bergamo, Jean-Luc-PIPO, Jean-Marie-Graïc, Jean-Martin Laval, Jean-Noel-Bruletout, Jean-Paul-GIBERT, Jean-Paul-Lescat, jean-philippe-bénétrix, Jean-Philippe-Eisenbarth, Jean-Philippe-Renaudet, Jean-Philippe-Rennard, Jean-Sébastien-Renaud, Jean-Yves Kiger, Jean-Yves-DUPARC, Jeanne-Corvellec, jeansebastien, Jelv, Jérémie -Wach, Jeremie-Lestel, Jérémy-Korwin, Jérôme-Avond, Jerome-Bu, Jerome-Denis, Jérôme-ISNARD, jerome-simonato, JeromeD, Jery, Jezza, Jim-McDoniel, jl-M-2, jlanca, jlcpuzzle, jn-m, jnthnctt, joakim.faiss, Joe-Riche, Joévin-SOULENQ, Johann-FONTAINE, John-Devor, John-Doe, Jojo-Boulix, Jonas-Aparicio, Jonathan-Dollé, Jonathan-Kohler, Jonathan-LAURENT, Jos-van den Oever, Joseph-Lawson, Jozef-Knaperek, jroger, ju, jubarbu, Julianoe-G, Julie-Bultez, Julien Loudet, Julien Maulny (alcalyn), Julien-AILHAUD, Julien-Aubin, Julien-Biaudet, Julien-Bréchet, Julien-Cochennec, Julien-Duroure, Julien-Huon, Julien-Lemaire, Julien-Weber, jyb, K-\_, KalambakA, Kanor, kari-kimber, Karim-Jouini, karl-bienfait, Kdecherf, Keplerpondorskell, kevin-Beranger, Kevin-Nguyen, King-Of Peons, Kioob, kloh, kokoklems, Konstantin-Kovar, Kriĉjo, Kyâne-PICHOU, L'elfe-Sylvain, La Gonz, Lara-Dufour, lareinedeselfes, Laurence-Giroud, laurent-fuentes, Laurent-HEINTZ, Laurent-PICQUENOT, ldubost, lebidibule, LeChi, LeDivinBueno, Legrave, Les Assortis, Leyokki-Tk, LibreEnFete-en Tregor, LilO. Moino, Liloumuloup, Linuxine-T, lionel-lachaud, Lionel-Schinckus, Loïc-L'Anton, Loïc.Guérin, Louis-Gatin, Louis-Marie-BAER, Louis-Rémi.Babé, Louis-Roche, Louisclement, Lu, ludovic-lainard, Ludovic-Pénet, Lukas-Steiblys, lusoheart, Mad Sugar, maguy-giorgi, mahen, maiido, Malphas, ManetteBE, Manon-Amalric, Manuel-Vazquez, ManuInzesky, Manumerique, Marc-BESSIERES, Marc-DUFOURNET, Marc-GASSER, Marc-Honnorat, marc-wilzius, marc.ribault.1, Marco-Heisig, Marie-PACHECO, Marien-Fressinaud, Marius-Lemonnier, Mark-O'Donovan, marliebo, marmat8951, mart1n, martensite, Mathdatech, Mathias-Bocquet, Mathieu-Amirault, Mathieu-B., Mathieu-Cornic, Mathieu-VIRAMAN, Matías-Pérez, Matilin-Torre, matt.faure, Mattéo-Delabre, Matthias-Devlamynck, Matthieu-Bollot, Matthieu-De Beule, Matthieu-DEVILLERS, Matthieu-Dupont de Dinechin, Matthieu-Gaudé, Matthieu-Sauboua-Beneluz, matthieublanco, MatthieuSchneider, Max-PENY, Maxime-de WYROW, Maxime-Desjardin, Maxime-Forest, maxime-haag, Maxime-Mangel, Maximilian Praeger, Mayeul-Cantan, Mayeul-Guiraud, mcg1712, metalvinze, Mewen, mheiber, Michael-Koppmann, Michael-Loew, Michael-Q. Bid, Michal-Herda, Michal-Noga, Michel-DUPONT, Michel-Le Lagadec, Michel-POUSSIER, Michel-Roux, Mickaël-Gauvin, Mickael-Liegard, MicMP3Man, Miguel-de la Cruz, Mike-Kasprzak, Mimon-Lapompe, Mister-Ocelot, mjhvc, Moutmout, MouTom, MP, mphdp, Mr-Tea, msellebulle, Mushussu, mylainos, nanouckd, Nasser-Debruyere, Nat-Tuck, Nathan.B, nayya, nazgulz666, Neal-Wilson, neeev, neodarz-neodarz, NepsKi, Nestorvep, NHenry, Nialix, NicoD, Nicolas-Auvray, nicolas-k, Nicolas-Pinault, Nicolas-Ruffel, NicolasCARPi, nicolaslegland, niconil, Niles, nitot, Nono1965, Norbert, Norde, Numcap, obergix, Obrow, Okki, Olivier-Calzi, Olivier-Ganneval, Olivier-Marouzé, Olivier-Mondoloni, olivier-pierret, Oncela-Petit Chat, Óskar-Sturluson, p3n15634n7, Paindesegle, Pas De-Panique, Pascal-BLEUSE, Pascal-Larramendy, Patrice-Jabeneau, patrice-maertens, patrick-bappel, PATRICK-GRANDIN, Patrick-MERCIER, Patrickl , Paul-Härle, Paul-Tardy, pbramy, Pedro-CADETE, Perrine-de Coëtlogon, Peter\_Fillgod, Petter-Joelson, Philippe-BATTMANN, Philippe-Cabaud, Philippe-Debar, philippe-giffard, Philippe-Lallemant, Philippe-Le Van, philippe-lhardy, Philippe-Thébault, Philippe-VINCENT-2, PhilOGM, Pierre 'catwell' Chapuis, Pierre Gros, Pierre-Antoine-Champin, Pierre-Bresson-2, Pierre-d'Alençon, Pierre-Equoy, Pierre-Girardeau, Pierre-Houmeau, Pierre-Marijon, Pierre-petch, Pierrick-Couturier, Pilou-CaraGk, Piotr-Miszczak, Pla, Plastic Yogi, PME2050, pmiossec, Pofilo, Polioman, Polios63, Poutchiny, PRALLET-Claude, PtrckVllnv, Pulov Yuran, queertube, Quentin-Dugne, Quentin-PAGÈS, ra-mon, Radhwan-Ben Madhkour, Raphaël-Brocq, Raphaël-Grolimund, Raphaël-Piédallu, raphane, Raphip, Raven, Raymond-Lutz, Razael, Rebecca-Breu, Remi-Durand, Rémi-Herrmann, Rémi-Verschelde, Remigho, Remix-the commons, Remy-Grauby, Rémy-Pradier, Renaud-Vincent, rgggn, rigelk, rip, Rivinbeg, Robert-Riemann, Robin Biechy, Roger-FRATTE, roipoussiere, Rolindes-Arroyo, Romain Théry-Hermain, Romain-Bouyé, Romain-Ortiz, RomainVENNE, Romuald-EYRAUD, royhome, Rudy-aparicio, Rusty-Dwyer, rverchere, sajous.net, Salah-ZERGUI, Sam-R, Samh, Samuel Tardieu, Samuel-FAYET, Samuel-Verschelde, Sanpi, Sascha-Brendel, Schwartz, Se7h, Sebastiaan-Glazenborg, Sebastian-Hugentobler, Sébastien Adam, Septie, Ser Eole, Severin-Suveren, severine-roger, shlagevuk-shlagevuk, Siegfried-Ehret, Simon-Hemery, Simon-Larcher, Simon-Reiser, Simounet, Siri-Louie, sissssou, skarab, Skurious, skynebula, Sohga-Sohga, Solène-Rapenne, solinux, Sophie-Imbach , Sosthen, Spiderweak, Stanislas-ANDRE, Stanislas-Michalak, starmatt, Steef, Stefan-Petrovski, Stéphane-Girardon, Stéphanie-Baltus, Stev-3d, Stoori, SuckyStrike, Sufflope, Sulfurax, SundownDEV, Swann-Fournial, Syk, Syluban, Sylv1c, Sylvain Bellone, Sylvain P, Sylvain\_M, Sylvain-Cazaux, Sylvain-GLAIZE, sylvain.arrachart, Sylvestre Ledru, sylvie-boutet, Sylvie-TORRES, tael67, tang35, tangi\_b, Tarulien, Taunya-Debolt, Tazimut-Khaelyor, terry-maire, Thanaen, Thatoo, Théophile-Noiré, Thibault-Vlieghe, Thierry-Chancé, Thierry-Fenasse, Thomas-Aurel, Thomas-CALVEZ, thomas-constans, Thomas-Kuntz, thomassin-loucas, Thosbk, ticosc, Tim-Albers, Tinapa -Itastri, TkPx, TM, tnntwister, TomR, Tomus, Tonio-Bilos, tony-carnide, Toover, toto-leroidelasaucisse, ToumToum, TP., trigrou, Tristan-Porteries, Tryph, Tursiops, tzilliox, U-&\_\`HbAAe4onnpN9!e+/#42\*5>k^E, Ulrich-Norbisrath, Un Sur Quatre, Valerio-Paladino, Valerio-Pilo, Valeryan\_24, Valou69, Vegattitude, Velome, Vergogne, Vero-Pajot, vianneyb, Victo-Sab, Victor -Hery, Victorien-Labalette, Vincent-Corrèze, Vincent-Fromentin, Vincent-Lamy, Vincent-Lasseur, VINCENT-PEYRET, vmorel, Walter-van Holst, Watsdesign, Wesley-Moore, williampolletdev, win100, wyk, Xaloc-Xaloc, Xavier ALT, Xavier-Chantry, Xavier-Godard, XoD, Yaaann, Yann-Delaunoy, Yann-Nave, yannick-grenzinger, yanselmetti, Ykatsot, Yohann-Bacha, yopox, Youen-Toupin, Yves-Caniou, Yves-Gerech, zar-rok, ZeBlackPearl, ZeGreg
219 195
220 196
diff --git a/SECURITY.md b/SECURITY.md
index 5c668a2a3..b80f8ad00 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,8 +1,6 @@
1**Introduction**
2
3Security is core to our values, and we value the input of hackers acting in good faith to help us maintain a high standard for the security and privacy for our users. This includes encouraging responsible vulnerability research and disclosure. This policy sets out our definition of good faith in the context of finding and reporting vulnerabilities, as well as what you can expect from us in return. 1Security is core to our values, and we value the input of hackers acting in good faith to help us maintain a high standard for the security and privacy for our users. This includes encouraging responsible vulnerability research and disclosure. This policy sets out our definition of good faith in the context of finding and reporting vulnerabilities, as well as what you can expect from us in return.
4 2
5**Expectations** 3## Expectations
6 4
7When working with us according to this policy, you can expect us to: 5When working with us according to this policy, you can expect us to:
8- Extend Safe Harbor (see below) for your vulnerability research that is related to this policy; 6- Extend Safe Harbor (see below) for your vulnerability research that is related to this policy;
@@ -10,7 +8,7 @@ When working with us according to this policy, you can expect us to:
10- Work to remediate discovered vulnerabilities in a timely manner; and 8- Work to remediate discovered vulnerabilities in a timely manner; and
11- Recognize your contribution to improving our security if you are the first to report a unique vulnerability, and your report triggers a code or configuration change. 9- Recognize your contribution to improving our security if you are the first to report a unique vulnerability, and your report triggers a code or configuration change.
12 10
13**Safe Harbor** 11## Safe Harbor
14 12
15When conducting vulnerability research according to this policy, we consider this research to be: 13When conducting vulnerability research according to this policy, we consider this research to be:
16- Authorized in accordance with the law, and we will not initiate or support legal action against you for accidental, good faith violations of this policy; 14- Authorized in accordance with the law, and we will not initiate or support legal action against you for accidental, good faith violations of this policy;
@@ -22,7 +20,7 @@ You are expected, as always, to comply with all applicable laws.
22 20
23If at any time you have concerns or are uncertain whether your security research is consistent with this policy, please submit a report through one of our Official Channels before going any further. 21If at any time you have concerns or are uncertain whether your security research is consistent with this policy, please submit a report through one of our Official Channels before going any further.
24 22
25**Ground Rules** 23## Ground Rules
26 24
27To encourage vulnerability research and to avoid any confusion between good-faith hacking and malicious attack, we ask that you: 25To encourage vulnerability research and to avoid any confusion between good-faith hacking and malicious attack, we ask that you:
28- Play by the rules. This includes following this policy, as well as any other relevant agreements. If there is any inconsistency between this policy and any other relevant terms, the terms of this policy will prevail. 26- Play by the rules. This includes following this policy, as well as any other relevant agreements. If there is any inconsistency between this policy and any other relevant terms, the terms of this policy will prevail.
@@ -35,10 +33,15 @@ To encourage vulnerability research and to avoid any confusion between good-fait
35- You should only interact with test accounts you own or with explicit permission from the account holder. 33- You should only interact with test accounts you own or with explicit permission from the account holder.
36- Do not engage in extortion. 34- Do not engage in extortion.
37 35
38**Official Channels** 36## Disclosure Terms
37
38The vulnerability is kept private until a majority of instances known on instances.joinpeertube.org have updated to a safe version of PeerTube or applied a hotfix. The PeerTube development team coordinates efforts to update once the patch is issued.
39
40## Official Channels
39 41
40To help us receive vulnerability submissions we use the following official reporting channels: 42To help us receive vulnerability submissions we use the following official reporting channels:
41- chocobozzz@cpy.re (GPG: [583A612D890159BE](https://keybase.io/chocobozzz/pgp_keys.asc?fingerprint=c44aad638367912ca93edd57583a612d890159be)) 43- chocobozzz@cpy.re (GPG: [583A612D890159BE](https://keybase.io/chocobozzz/pgp_keys.asc?fingerprint=c44aad638367912ca93edd57583a612d890159be))
44- sendmemail@rigelk.eu (GPG: [EA12971B0E438F36](https://api.github.com/users/rigelk/gpg_keys))
42 45
43If you think you have found a vulnerability, please include the following details with your report and be as descriptive as possible: 46If you think you have found a vulnerability, please include the following details with your report and be as descriptive as possible:
44- The location and nature of the vulnerability, 47- The location and nature of the vulnerability,
diff --git a/client/e2e/src/po/video-watch.po.ts b/client/e2e/src/po/video-watch.po.ts
index e17aebc29..d1e2a73b8 100644
--- a/client/e2e/src/po/video-watch.po.ts
+++ b/client/e2e/src/po/video-watch.po.ts
@@ -23,7 +23,7 @@ export class VideoWatchPage {
23 getVideosListName () { 23 getVideosListName () {
24 return element.all(by.css('.videos .video-miniature .video-miniature-name')) 24 return element.all(by.css('.videos .video-miniature .video-miniature-name'))
25 .getText() 25 .getText()
26 .then((texts: any) => texts.map(t => t.trim())) 26 .then((texts: any) => texts.map((t: any) => t.trim()))
27 } 27 }
28 28
29 waitWatchVideoName (videoName: string, isMobileDevice: boolean, isSafari: boolean) { 29 waitWatchVideoName (videoName: string, isMobileDevice: boolean, isSafari: boolean) {
diff --git a/client/package.json b/client/package.json
index 76a4eedad..3eea661f1 100644
--- a/client/package.json
+++ b/client/package.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "peertube-client", 2 "name": "peertube-client",
3 "version": "1.0.0-rc.2", 3 "version": "1.2.0",
4 "private": true, 4 "private": true,
5 "licence": "GPLv3", 5 "licence": "GPLv3",
6 "author": { 6 "author": {
@@ -28,7 +28,8 @@
28 "resolutions": { 28 "resolutions": {
29 "video.js": "^7", 29 "video.js": "^7",
30 "webtorrent/create-torrent/junk": "^1", 30 "webtorrent/create-torrent/junk": "^1",
31 "simple-get": "^2.8.1" 31 "simple-get": "^2.8.1",
32 "punycode": "^1.4.1"
32 }, 33 },
33 "jest": { 34 "jest": {
34 "globals": { 35 "globals": {
@@ -63,29 +64,31 @@
63 "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts" 64 "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts"
64 }, 65 },
65 "devDependencies": { 66 "devDependencies": {
66 "@angular-devkit/build-angular": "^0.8.3", 67 "@angular-devkit/build-angular": "~0.13.1",
67 "@angular/animations": "~6.1.4", 68 "@angular/animations": "~7.2.4",
68 "@angular/cli": "~6.2.3", 69 "@angular/cli": "~7.3.1",
69 "@angular/common": "~6.1.4", 70 "@angular/common": "~7.2.4",
70 "@angular/compiler": "~6.1.4", 71 "@angular/compiler": "~7.2.4",
71 "@angular/compiler-cli": "~6.1.4", 72 "@angular/compiler-cli": "~7.2.4",
72 "@angular/core": "~6.1.4", 73 "@angular/core": "~7.2.4",
73 "@angular/forms": "~6.1.4", 74 "@angular/forms": "~7.2.4",
74 "@angular/http": "~6.1.4", 75 "@angular/http": "~7.2.4",
75 "@angular/language-service": "~6.1.4", 76 "@angular/language-service": "~7.2.4",
76 "@angular/platform-browser": "~6.1.4", 77 "@angular/platform-browser": "~7.2.4",
77 "@angular/platform-browser-dynamic": "~6.1.4", 78 "@angular/platform-browser-dynamic": "~7.2.4",
78 "@angular/router": "~6.1.4", 79 "@angular/router": "~7.2.4",
79 "@angular/service-worker": "~6.1.4", 80 "@angular/service-worker": "~7.2.4",
80 "@angularclass/hmr": "^2.1.3", 81 "@angularclass/hmr": "^2.1.3",
81 "@neos21/bootstrap3-glyphicons": "^1.0.1", 82 "@neos21/bootstrap3-glyphicons": "^1.0.1",
82 "@ng-bootstrap/ng-bootstrap": "^3.1.0", 83 "@ng-bootstrap/ng-bootstrap": "^4.0.0",
83 "@ngx-loading-bar/core": "^2.2.0", 84 "@ngx-loading-bar/core": "^3.0.0",
84 "@ngx-loading-bar/http-client": "^2.2.0", 85 "@ngx-loading-bar/http-client": "^3.0.0",
85 "@ngx-loading-bar/router": "^2.2.0", 86 "@ngx-loading-bar/router": "^3.0.0",
86 "@ngx-meta/core": "^6.0.0-rc.1", 87 "@ngx-meta/core": "^6.0.0-rc.1",
87 "@ngx-translate/i18n-polyfill": "^1.0.0", 88 "@ngx-translate/i18n-polyfill": "^1.0.0",
89 "@streamroot/videojs-hlsjs-plugin": "^1.0.7",
88 "@types/core-js": "^2.5.0", 90 "@types/core-js": "^2.5.0",
91 "@types/hls.js": "^0.12.0",
89 "@types/jasmine": "^2.8.7", 92 "@types/jasmine": "^2.8.7",
90 "@types/jasminewd2": "^2.0.3", 93 "@types/jasminewd2": "^2.0.3",
91 "@types/jest": "^23.3.1", 94 "@types/jest": "^23.3.1",
@@ -94,10 +97,10 @@
94 "@types/markdown-it": "^0.0.5", 97 "@types/markdown-it": "^0.0.5",
95 "@types/node": "^10.9.2", 98 "@types/node": "^10.9.2",
96 "@types/sanitize-html": "1.18.0", 99 "@types/sanitize-html": "1.18.0",
97 "@types/video.js": "6.2.7", 100 "@types/socket.io-client": "^1.4.32",
101 "@types/video.js": "^7.2.5",
98 "@types/webtorrent": "^0.98.4", 102 "@types/webtorrent": "^0.98.4",
99 "angular2-hotkeys": "^2.1.2", 103 "angular2-hotkeys": "^2.1.2",
100 "angular2-notifications": "^1.0.2",
101 "awesome-typescript-loader": "5.2.1", 104 "awesome-typescript-loader": "5.2.1",
102 "bootstrap": "^4.1.3", 105 "bootstrap": "^4.1.3",
103 "buffer": "^5.1.0", 106 "buffer": "^5.1.0",
@@ -109,6 +112,7 @@
109 "extract-text-webpack-plugin": "4.0.0-beta.0", 112 "extract-text-webpack-plugin": "4.0.0-beta.0",
110 "file-loader": "^2.0.0", 113 "file-loader": "^2.0.0",
111 "focus-visible": "^4.1.5", 114 "focus-visible": "^4.1.5",
115 "hls.js": "^0.12.2",
112 "html-loader": "^0.5.5", 116 "html-loader": "^0.5.5",
113 "html-webpack-plugin": "^3.2.0", 117 "html-webpack-plugin": "^3.2.0",
114 "https-browserify": "^1.0.0", 118 "https-browserify": "^1.0.0",
@@ -129,32 +133,33 @@
129 "ngx-clipboard": "11.1.7", 133 "ngx-clipboard": "11.1.7",
130 "ngx-pipes": "^2.1.7", 134 "ngx-pipes": "^2.1.7",
131 "ngx-qrcode2": "^0.0.9", 135 "ngx-qrcode2": "^0.0.9",
132 "ngx-textarea-autosize": "^2.0.0",
133 "node-sass": "^4.9.3", 136 "node-sass": "^4.9.3",
134 "npm-font-source-sans-pro": "^1.0.2", 137 "npm-font-source-sans-pro": "^1.0.2",
138 "p2p-media-loader-hlsjs": "^0.4.0",
135 "path-browserify": "^1.0.0", 139 "path-browserify": "^1.0.0",
136 "primeng": "^6.1.2", 140 "primeng": "^7.0.0",
137 "process": "^0.11.10", 141 "process": "^0.11.10",
138 "protractor": "^5.3.2", 142 "protractor": "^5.3.2",
139 "purify-css": "^1.2.5", 143 "purify-css": "^1.2.5",
140 "purifycss-webpack": "^0.7.0", 144 "purifycss-webpack": "^0.7.0",
141 "raw-loader": "^0.5.1", 145 "raw-loader": "^0.5.1",
142 "rxjs": "^6.1.0", 146 "rxjs": "^6.3.3",
143 "sanitize-html": "^1.18.4", 147 "sanitize-html": "^1.18.4",
144 "sass-loader": "^7.1.0", 148 "sass-loader": "^7.1.0",
145 "sass-resources-loader": "^1.2.1", 149 "sass-resources-loader": "^2.0.0",
150 "socket.io-client": "^2.2.0",
146 "stream-browserify": "^2.0.1", 151 "stream-browserify": "^2.0.1",
147 "stream-http": "^2.8.3", 152 "stream-http": "^3.0.0",
148 "terser-webpack-plugin": "^1.1.0", 153 "terser-webpack-plugin": "^1.1.0",
149 "ts-jest": "^23.1.4", 154 "ts-jest": "^23.1.4",
150 "tslint": "^5.7.0", 155 "tslint": "^5.7.0",
151 "tslint-config-standard": "^8.0.1", 156 "tslint-config-standard": "^8.0.1",
152 "typescript": "2.9", 157 "typescript": "3.1.6",
153 "video.js": "^7", 158 "video.js": "^7",
154 "videojs-contextmenu-ui": "^5.0.0", 159 "videojs-contextmenu-ui": "^5.0.0",
160 "videojs-contrib-quality-levels": "^2.0.9",
155 "videojs-dock": "^2.0.2", 161 "videojs-dock": "^2.0.2",
156 "videojs-hotkeys": "^0.2.21", 162 "videojs-hotkeys": "^0.2.21",
157 "webpack": "^4.17.1",
158 "webpack-bundle-analyzer": "^3.0.2", 163 "webpack-bundle-analyzer": "^3.0.2",
159 "webpack-cli": "^3.0.8", 164 "webpack-cli": "^3.0.8",
160 "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d", 165 "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d",
diff --git a/client/src/app/+about/about-instance/about-instance.component.html b/client/src/app/+about/about-instance/about-instance.component.html
index 5970cac01..8c700752e 100644
--- a/client/src/app/+about/about-instance/about-instance.component.html
+++ b/client/src/app/+about/about-instance/about-instance.component.html
@@ -1,39 +1,52 @@
1<div i18n class="about-instance-title"> 1<div class="row">
2 About {{ instanceName }} instance 2 <div class="col-md-12 col-xl-6">
3</div> 3 <div class="about-instance-title">
4 <div i18n>About {{ instanceName }} instance</div>
4 5
5<div class="short-description"> 6 <div *ngIf="isContactFormEnabled" (click)="openContactModal()" i18n role="button" class="contact-admin">Contact administrator</div>
6 <div>{{ shortDescription }}</div> 7 </div>
7</div>
8 8
9<div class="description"> 9 <div class="short-description">
10 <div i18n class="section-title">Description</div> 10 <div>{{ shortDescription }}</div>
11 </div>
11 12
12 <div [innerHTML]="descriptionHTML"></div> 13 <div class="description">
13</div> 14 <div i18n class="section-title">Description</div>
14 15
15<div class="terms" id="terms-section"> 16 <div [innerHTML]="descriptionHTML"></div>
16 <div i18n class="section-title">Terms</div> 17 </div>
17 18
18 <div [innerHTML]="termsHTML"></div> 19 <div class="terms" id="terms-section">
19</div> 20 <div i18n class="section-title">Terms</div>
20 21
21<div class="signup"> 22 <div [innerHTML]="termsHTML"></div>
22 <div i18n class="section-title">Signup</div> 23 </div>
23 24
24 <div *ngIf="isSignupAllowed"> 25 <div class="signup">
25 <ng-container i18n>User registration is allowed and</ng-container> 26 <div i18n class="section-title">Signup</div>
26 27
27 <ng-container i18n *ngIf="userVideoQuota !== -1"> 28 <div *ngIf="isSignupAllowed">
28 this instance provides a baseline quota of {{ userVideoQuota | bytes: 0 }} space for the videos of its users. 29 <ng-container i18n>User registration is allowed and</ng-container>
29 </ng-container>
30 30
31 <ng-container i18n *ngIf="userVideoQuota === -1"> 31 <ng-container i18n *ngIf="userVideoQuota !== -1">
32 this instance provides unlimited space for the videos of its users. 32 this instance provides a baseline quota of {{ userVideoQuota | bytes: 0 }} space for the videos of its users.
33 </ng-container> 33 </ng-container>
34
35 <ng-container i18n *ngIf="userVideoQuota === -1">
36 this instance provides unlimited space for the videos of its users.
37 </ng-container>
38 </div>
39
40 <div i18n *ngIf="isSignupAllowed === false">
41 User registration is currently not allowed.
42 </div>
43 </div>
34 </div> 44 </div>
35 45
36 <div i18n *ngIf="isSignupAllowed === false"> 46 <div class="col-md-12 col-xl-6">
37 User registration is currently not allowed. 47 <label>Features found on this instance</label>
48 <my-instance-features-table></my-instance-features-table>
38 </div> 49 </div>
39</div> \ No newline at end of file 50</div>
51
52<my-contact-admin-modal #contactAdminModal></my-contact-admin-modal>
diff --git a/client/src/app/+about/about-instance/about-instance.component.scss b/client/src/app/+about/about-instance/about-instance.component.scss
index b451e85aa..75cf57322 100644
--- a/client/src/app/+about/about-instance/about-instance.component.scss
+++ b/client/src/app/+about/about-instance/about-instance.component.scss
@@ -2,9 +2,19 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.about-instance-title { 4.about-instance-title {
5 font-size: 20px; 5 display: flex;
6 font-weight: bold; 6 justify-content: space-between;
7 margin-bottom: 15px; 7
8 & > div {
9 font-size: 20px;
10 font-weight: bold;
11 margin-bottom: 15px;
12 }
13
14 & > .contact-admin {
15 @include peertube-button;
16 @include orange-button;
17 }
8} 18}
9 19
10.section-title { 20.section-title {
diff --git a/client/src/app/+about/about-instance/about-instance.component.ts b/client/src/app/+about/about-instance/about-instance.component.ts
index 354f52ce7..a1b30fa8c 100644
--- a/client/src/app/+about/about-instance/about-instance.component.ts
+++ b/client/src/app/+about/about-instance/about-instance.component.ts
@@ -1,23 +1,26 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { ServerService } from '@app/core' 2import { Notifier, ServerService } from '@app/core'
3import { MarkdownService } from '@app/videos/shared'
4import { NotificationsService } from 'angular2-notifications'
5import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
5import { InstanceService } from '@app/shared/instance/instance.service'
6import { MarkdownService } from '@app/shared/renderer'
6 7
7@Component({ 8@Component({
8 selector: 'my-about-instance', 9 selector: 'my-about-instance',
9 templateUrl: './about-instance.component.html', 10 templateUrl: './about-instance.component.html',
10 styleUrls: [ './about-instance.component.scss' ] 11 styleUrls: [ './about-instance.component.scss' ]
11}) 12})
12
13export class AboutInstanceComponent implements OnInit { 13export class AboutInstanceComponent implements OnInit {
14 @ViewChild('contactAdminModal') contactAdminModal: ContactAdminModalComponent
15
14 shortDescription = '' 16 shortDescription = ''
15 descriptionHTML = '' 17 descriptionHTML = ''
16 termsHTML = '' 18 termsHTML = ''
17 19
18 constructor ( 20 constructor (
19 private notificationsService: NotificationsService, 21 private notifier: Notifier,
20 private serverService: ServerService, 22 private serverService: ServerService,
23 private instanceService: InstanceService,
21 private markdownService: MarkdownService, 24 private markdownService: MarkdownService,
22 private i18n: I18n 25 private i18n: I18n
23 ) {} 26 ) {}
@@ -34,8 +37,12 @@ export class AboutInstanceComponent implements OnInit {
34 return this.serverService.getConfig().signup.allowed 37 return this.serverService.getConfig().signup.allowed
35 } 38 }
36 39
40 get isContactFormEnabled () {
41 return this.serverService.getConfig().email.enabled && this.serverService.getConfig().contactForm.enabled
42 }
43
37 ngOnInit () { 44 ngOnInit () {
38 this.serverService.getAbout() 45 this.instanceService.getAbout()
39 .subscribe( 46 .subscribe(
40 res => { 47 res => {
41 this.shortDescription = res.instance.shortDescription 48 this.shortDescription = res.instance.shortDescription
@@ -43,8 +50,12 @@ export class AboutInstanceComponent implements OnInit {
43 this.termsHTML = this.markdownService.textMarkdownToHTML(res.instance.terms) 50 this.termsHTML = this.markdownService.textMarkdownToHTML(res.instance.terms)
44 }, 51 },
45 52
46 err => this.notificationsService.error(this.i18n('Error getting about from server'), err) 53 () => this.notifier.error(this.i18n('Cannot get about information from server'))
47 ) 54 )
48 } 55 }
49 56
57 openContactModal () {
58 return this.contactAdminModal.show()
59 }
60
50} 61}
diff --git a/client/src/app/+about/about-instance/contact-admin-modal.component.html b/client/src/app/+about/about-instance/contact-admin-modal.component.html
new file mode 100644
index 000000000..b2cbd0873
--- /dev/null
+++ b/client/src/app/+about/about-instance/contact-admin-modal.component.html
@@ -0,0 +1,50 @@
1<ng-template #modal>
2 <div class="modal-header">
3 <h4 i18n class="modal-title">Contact {{ instanceName }} administrator</h4>
4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div>
6
7 <div class="modal-body">
8
9 <form novalidate [formGroup]="form" (ngSubmit)="sendForm()">
10 <div class="form-group">
11 <label i18n for="fromName">Your name</label>
12 <input
13 type="text" id="fromName"
14 formControlName="fromName" [ngClass]="{ 'input-error': formErrors.fromName }"
15 >
16 <div *ngIf="formErrors.fromName" class="form-error">{{ formErrors.fromName }}</div>
17 </div>
18
19 <div class="form-group">
20 <label i18n for="fromEmail">Your email</label>
21 <input
22 type="text" id="fromEmail"
23 formControlName="fromEmail" [ngClass]="{ 'input-error': formErrors['fromEmail'] }"
24 >
25 <div *ngIf="formErrors.fromEmail" class="form-error">{{ formErrors.fromEmail }}</div>
26 </div>
27
28 <div class="form-group">
29 <label i18n for="body">Your message</label>
30 <textarea id="body" formControlName="body" [ngClass]="{ 'input-error': formErrors['body'] }">
31 </textarea>
32 <div *ngIf="formErrors.body" class="form-error">{{ formErrors.body }}</div>
33 </div>
34
35 <div *ngIf="error" class="alert alert-danger">{{ error }}</div>
36
37 <div class="form-group inputs">
38 <span i18n class="action-button action-button-cancel" (click)="hide()">
39 Cancel
40 </span>
41
42 <input
43 type="submit" i18n-value value="Submit" class="action-button-submit"
44 [disabled]="!form.valid"
45 >
46 </div>
47 </form>
48
49 </div>
50</ng-template>
diff --git a/client/src/app/+about/about-instance/contact-admin-modal.component.scss b/client/src/app/+about/about-instance/contact-admin-modal.component.scss
new file mode 100644
index 000000000..260d77888
--- /dev/null
+++ b/client/src/app/+about/about-instance/contact-admin-modal.component.scss
@@ -0,0 +1,11 @@
1@import 'variables';
2@import 'mixins';
3
4input[type=text] {
5 @include peertube-input-text(340px);
6 display: block;
7}
8
9textarea {
10 @include peertube-textarea(100%, 200px);
11}
diff --git a/client/src/app/+about/about-instance/contact-admin-modal.component.ts b/client/src/app/+about/about-instance/contact-admin-modal.component.ts
new file mode 100644
index 000000000..7d79c2215
--- /dev/null
+++ b/client/src/app/+about/about-instance/contact-admin-modal.component.ts
@@ -0,0 +1,77 @@
1import { Component, OnInit, ViewChild } from '@angular/core'
2import { Notifier, ServerService } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
5import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
6import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
7import { FormReactive, InstanceValidatorsService } from '@app/shared'
8import { InstanceService } from '@app/shared/instance/instance.service'
9
10@Component({
11 selector: 'my-contact-admin-modal',
12 templateUrl: './contact-admin-modal.component.html',
13 styleUrls: [ './contact-admin-modal.component.scss' ]
14})
15export class ContactAdminModalComponent extends FormReactive implements OnInit {
16 @ViewChild('modal') modal: NgbModal
17
18 error: string
19
20 private openedModal: NgbModalRef
21
22 constructor (
23 protected formValidatorService: FormValidatorService,
24 private modalService: NgbModal,
25 private instanceValidatorsService: InstanceValidatorsService,
26 private instanceService: InstanceService,
27 private serverService: ServerService,
28 private notifier: Notifier,
29 private i18n: I18n
30 ) {
31 super()
32 }
33
34 get instanceName () {
35 return this.serverService.getConfig().instance.name
36 }
37
38 ngOnInit () {
39 this.buildForm({
40 fromName: this.instanceValidatorsService.FROM_NAME,
41 fromEmail: this.instanceValidatorsService.FROM_EMAIL,
42 body: this.instanceValidatorsService.BODY
43 })
44 }
45
46 show () {
47 this.openedModal = this.modalService.open(this.modal, { keyboard: false })
48 }
49
50 hide () {
51 this.form.reset()
52 this.error = undefined
53
54 this.openedModal.close()
55 this.openedModal = null
56 }
57
58 sendForm () {
59 const fromName = this.form.value['fromName']
60 const fromEmail = this.form.value[ 'fromEmail' ]
61 const body = this.form.value[ 'body' ]
62
63 this.instanceService.contactAdministrator(fromEmail, fromName, body)
64 .subscribe(
65 () => {
66 this.notifier.success(this.i18n('Your message has been sent.'))
67 this.hide()
68 },
69
70 err => {
71 this.error = err.status === 403
72 ? this.i18n('You already sent this form recently')
73 : err.message
74 }
75 )
76 }
77}
diff --git a/client/src/app/+about/about-peertube/about-peertube.component.html b/client/src/app/+about/about-peertube/about-peertube.component.html
index 13ce89f75..d3fc9a828 100644
--- a/client/src/app/+about/about-peertube/about-peertube.component.html
+++ b/client/src/app/+about/about-peertube/about-peertube.component.html
@@ -83,7 +83,7 @@
83 <h6 i18n class="p2p-privacy-title">What will be done to mitigate this problem?</h6> 83 <h6 i18n class="p2p-privacy-title">What will be done to mitigate this problem?</h6>
84 84
85 <p i18n> 85 <p i18n>
86 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 86 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
87 In the meantime, we want to test different ideas related to this issue: 87 In the meantime, we want to test different ideas related to this issue:
88 </p> 88 </p>
89 89
@@ -94,4 +94,4 @@
94 <li i18n>Disable P2P from the administration interface</li> 94 <li i18n>Disable P2P from the administration interface</li>
95 <li i18n>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</li> 95 <li i18n>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</li>
96 </ul> 96 </ul>
97</div> \ No newline at end of file 97</div>
diff --git a/client/src/app/+about/about.module.ts b/client/src/app/+about/about.module.ts
index ff6e8ef41..9c6b29740 100644
--- a/client/src/app/+about/about.module.ts
+++ b/client/src/app/+about/about.module.ts
@@ -5,6 +5,7 @@ import { AboutComponent } from './about.component'
5import { SharedModule } from '../shared' 5import { SharedModule } from '../shared'
6import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component' 6import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
7import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component' 7import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
8import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
8 9
9@NgModule({ 10@NgModule({
10 imports: [ 11 imports: [
@@ -15,7 +16,8 @@ import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertub
15 declarations: [ 16 declarations: [
16 AboutComponent, 17 AboutComponent,
17 AboutInstanceComponent, 18 AboutInstanceComponent,
18 AboutPeertubeComponent 19 AboutPeertubeComponent,
20 ContactAdminModalComponent
19 ], 21 ],
20 22
21 exports: [ 23 exports: [
diff --git a/client/src/app/+accounts/account-about/account-about.component.ts b/client/src/app/+accounts/account-about/account-about.component.ts
index 6f3e6caa0..13890a0ee 100644
--- a/client/src/app/+accounts/account-about/account-about.component.ts
+++ b/client/src/app/+accounts/account-about/account-about.component.ts
@@ -1,9 +1,9 @@
1import { Component, OnInit, OnDestroy } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { Account } from '@app/shared/account/account.model' 2import { Account } from '@app/shared/account/account.model'
3import { AccountService } from '@app/shared/account/account.service' 3import { AccountService } from '@app/shared/account/account.service'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { Subscription } from 'rxjs' 5import { Subscription } from 'rxjs'
6import { MarkdownService } from '@app/videos/shared' 6import { MarkdownService } from '@app/shared/renderer'
7 7
8@Component({ 8@Component({
9 selector: 'my-account-about', 9 selector: 'my-account-about',
diff --git a/client/src/app/+accounts/account-videos/account-videos.component.ts b/client/src/app/+accounts/account-videos/account-videos.component.ts
index e5c1f58b0..13b634a01 100644
--- a/client/src/app/+accounts/account-videos/account-videos.component.ts
+++ b/client/src/app/+accounts/account-videos/account-videos.component.ts
@@ -2,7 +2,6 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { Location } from '@angular/common' 3import { Location } from '@angular/common'
4import { immutableAssign } from '@app/shared/misc/utils' 4import { immutableAssign } from '@app/shared/misc/utils'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { ConfirmService } from '../../core/confirm' 6import { ConfirmService } from '../../core/confirm'
8import { AbstractVideoList } from '../../shared/video/abstract-video-list' 7import { AbstractVideoList } from '../../shared/video/abstract-video-list'
@@ -13,6 +12,7 @@ import { tap } from 'rxjs/operators'
13import { I18n } from '@ngx-translate/i18n-polyfill' 12import { I18n } from '@ngx-translate/i18n-polyfill'
14import { Subscription } from 'rxjs' 13import { Subscription } from 'rxjs'
15import { ScreenService } from '@app/shared/misc/screen.service' 14import { ScreenService } from '@app/shared/misc/screen.service'
15import { Notifier } from '@app/core'
16 16
17@Component({ 17@Component({
18 selector: 'my-account-videos', 18 selector: 'my-account-videos',
@@ -35,7 +35,7 @@ export class AccountVideosComponent extends AbstractVideoList implements OnInit,
35 protected router: Router, 35 protected router: Router,
36 protected route: ActivatedRoute, 36 protected route: ActivatedRoute,
37 protected authService: AuthService, 37 protected authService: AuthService,
38 protected notificationsService: NotificationsService, 38 protected notifier: Notifier,
39 protected confirmService: ConfirmService, 39 protected confirmService: ConfirmService,
40 protected location: Location, 40 protected location: Location,
41 protected screenService: ScreenService, 41 protected screenService: ScreenService,
diff --git a/client/src/app/+accounts/accounts.component.html b/client/src/app/+accounts/accounts.component.html
index 036e794d2..c1377c1ea 100644
--- a/client/src/app/+accounts/accounts.component.html
+++ b/client/src/app/+accounts/accounts.component.html
@@ -10,8 +10,15 @@
10 <div class="actor-name">{{ account.nameWithHost }}</div> 10 <div class="actor-name">{{ account.nameWithHost }}</div>
11 11
12 <span *ngIf="user?.blocked" [ngbTooltip]="user.blockedReason" class="badge badge-danger" i18n>Banned</span> 12 <span *ngIf="user?.blocked" [ngbTooltip]="user.blockedReason" class="badge badge-danger" i18n>Banned</span>
13 13 <span *ngIf="account.mutedByUser" class="badge badge-danger" i18n>Muted</span>
14 <my-user-moderation-dropdown buttonSize="small" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()"> 14 <span *ngIf="account.mutedServerByUser" class="badge badge-danger" i18n>Muted by your instance</span>
15 <span *ngIf="account.mutedByInstance" class="badge badge-danger" i18n>Instance muted</span>
16 <span *ngIf="account.mutedServerByInstance" class="badge badge-danger" i18n>Instance muted by your instance</span>
17
18 <my-user-moderation-dropdown
19 buttonSize="small" [account]="account" [user]="user"
20 (userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()"
21 >
15 </my-user-moderation-dropdown> 22 </my-user-moderation-dropdown>
16 </div> 23 </div>
17 <div i18n class="actor-followers">{{ account.followersCount }} subscribers</div> 24 <div i18n class="actor-followers">{{ account.followersCount }} subscribers</div>
diff --git a/client/src/app/+accounts/accounts.component.ts b/client/src/app/+accounts/accounts.component.ts
index e19927d6b..e8339b78b 100644
--- a/client/src/app/+accounts/accounts.component.ts
+++ b/client/src/app/+accounts/accounts.component.ts
@@ -5,10 +5,9 @@ import { Account } from '@app/shared/account/account.model'
5import { RestExtractor, UserService } from '@app/shared' 5import { RestExtractor, UserService } from '@app/shared'
6import { catchError, distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators' 6import { catchError, distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators'
7import { Subscription } from 'rxjs' 7import { Subscription } from 'rxjs'
8import { NotificationsService } from 'angular2-notifications' 8import { AuthService, Notifier, RedirectService } from '@app/core'
9import { User, UserRight } from '../../../../shared' 9import { User, UserRight } from '../../../../shared'
10import { I18n } from '@ngx-translate/i18n-polyfill' 10import { I18n } from '@ngx-translate/i18n-polyfill'
11import { AuthService, RedirectService } from '@app/core'
12 11
13@Component({ 12@Component({
14 templateUrl: './accounts.component.html', 13 templateUrl: './accounts.component.html',
@@ -24,11 +23,10 @@ export class AccountsComponent implements OnInit, OnDestroy {
24 private route: ActivatedRoute, 23 private route: ActivatedRoute,
25 private userService: UserService, 24 private userService: UserService,
26 private accountService: AccountService, 25 private accountService: AccountService,
27 private notificationsService: NotificationsService, 26 private notifier: Notifier,
28 private restExtractor: RestExtractor, 27 private restExtractor: RestExtractor,
29 private redirectService: RedirectService, 28 private redirectService: RedirectService,
30 private authService: AuthService, 29 private authService: AuthService
31 private i18n: I18n
32 ) {} 30 ) {}
33 31
34 ngOnInit () { 32 ngOnInit () {
@@ -43,7 +41,7 @@ export class AccountsComponent implements OnInit, OnDestroy {
43 .subscribe( 41 .subscribe(
44 account => this.account = account, 42 account => this.account = account,
45 43
46 err => this.notificationsService.error(this.i18n('Error'), err.message) 44 err => this.notifier.error(err.message)
47 ) 45 )
48 } 46 }
49 47
@@ -69,7 +67,7 @@ export class AccountsComponent implements OnInit, OnDestroy {
69 .subscribe( 67 .subscribe(
70 user => this.user = user, 68 user => this.user = user,
71 69
72 err => this.notificationsService.error(this.i18n('Error'), err.message) 70 err => this.notifier.error(err.message)
73 ) 71 )
74 } 72 }
75 } 73 }
diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts
index 8c6db98d9..f7f347105 100644
--- a/client/src/app/+admin/admin.module.ts
+++ b/client/src/app/+admin/admin.module.ts
@@ -10,11 +10,12 @@ import { FollowingListComponent } from './follows/following-list/following-list.
10import { JobsComponent } from './jobs/job.component' 10import { JobsComponent } from './jobs/job.component'
11import { JobsListComponent } from './jobs/jobs-list/jobs-list.component' 11import { JobsListComponent } from './jobs/jobs-list/jobs-list.component'
12import { JobService } from './jobs/shared/job.service' 12import { JobService } from './jobs/shared/job.service'
13import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent } from './users' 13import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent, UserPasswordComponent } from './users'
14import { ModerationCommentModalComponent, VideoAbuseListComponent, VideoBlacklistListComponent } from './moderation' 14import { ModerationCommentModalComponent, VideoAbuseListComponent, VideoBlacklistListComponent } from './moderation'
15import { ModerationComponent } from '@app/+admin/moderation/moderation.component' 15import { ModerationComponent } from '@app/+admin/moderation/moderation.component'
16import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component' 16import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component'
17import { RedundancyService } from '@app/+admin/follows/shared/redundancy.service' 17import { RedundancyService } from '@app/+admin/follows/shared/redundancy.service'
18import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } from '@app/+admin/moderation/instance-blocklist'
18 19
19@NgModule({ 20@NgModule({
20 imports: [ 21 imports: [
@@ -35,12 +36,15 @@ import { RedundancyService } from '@app/+admin/follows/shared/redundancy.service
35 UsersComponent, 36 UsersComponent,
36 UserCreateComponent, 37 UserCreateComponent,
37 UserUpdateComponent, 38 UserUpdateComponent,
39 UserPasswordComponent,
38 UserListComponent, 40 UserListComponent,
39 41
40 ModerationComponent, 42 ModerationComponent,
41 VideoBlacklistListComponent, 43 VideoBlacklistListComponent,
42 VideoAbuseListComponent, 44 VideoAbuseListComponent,
43 ModerationCommentModalComponent, 45 ModerationCommentModalComponent,
46 InstanceServerBlocklistComponent,
47 InstanceAccountBlocklistComponent,
44 48
45 JobsComponent, 49 JobsComponent,
46 JobsListComponent, 50 JobsListComponent,
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
index e2cbd35ca..52eb00d93 100644
--- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
+++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
@@ -7,161 +7,169 @@
7 7
8 <div i18n class="inner-form-title">Instance</div> 8 <div i18n class="inner-form-title">Instance</div>
9 9
10 <div class="form-group"> 10 <ng-container formGroupName="instance">
11 <label i18n for="instanceName">Name</label> 11 <div class="form-group">
12 <input 12 <label i18n for="instanceName">Name</label>
13 type="text" id="instanceName" 13 <input
14 formControlName="instanceName" [ngClass]="{ 'input-error': formErrors['instanceName'] }" 14 type="text" id="instanceName"
15 > 15 formControlName="name" [ngClass]="{ 'input-error': formErrors.instance.name }"
16 <div *ngIf="formErrors.instanceName" class="form-error"> 16 >
17 {{ formErrors.instanceName }} 17 <div *ngIf="formErrors.instance.name" class="form-error">{{ formErrors.instance.name }}</div>
18 </div> 18 </div>
19 </div>
20 19
21 <div class="form-group"> 20 <div class="form-group">
22 <label i18n for="instanceShortDescription">Short description</label> 21 <label i18n for="instanceShortDescription">Short description</label>
23 <textarea 22 <textarea
24 id="instanceShortDescription" formControlName="instanceShortDescription" 23 id="instanceShortDescription" formControlName="shortDescription"
25 [ngClass]="{ 'input-error': formErrors['instanceShortDescription'] }" 24 [ngClass]="{ 'input-error': formErrors['instance.shortDescription'] }"
26 ></textarea> 25 ></textarea>
27 <div *ngIf="formErrors.instanceShortDescription" class="form-error"> 26 <div *ngIf="formErrors.instance.shortDescription" class="form-error">{{ formErrors.instance.shortDescription }}</div>
28 {{ formErrors.instanceShortDescription }}
29 </div> 27 </div>
30 </div>
31 28
32 <div class="form-group"> 29 <div class="form-group">
33 <label i18n for="instanceDescription">Description</label><my-help helpType="markdownText"></my-help> 30 <label i18n for="instanceDescription">Description</label><my-help helpType="markdownText"></my-help>
34 <my-markdown-textarea 31 <my-markdown-textarea
35 id="instanceDescription" formControlName="instanceDescription" textareaWidth="500px" [previewColumn]="true" 32 id="instanceDescription" formControlName="description" textareaWidth="500px" [previewColumn]="true"
36 [classes]="{ 'input-error': formErrors['instanceDescription'] }" 33 [classes]="{ 'input-error': formErrors['instance.description'] }"
37 ></my-markdown-textarea> 34 ></my-markdown-textarea>
38 <div *ngIf="formErrors.instanceDescription" class="form-error"> 35 <div *ngIf="formErrors.instance.description" class="form-error">{{ formErrors.instance.description }}</div>
39 {{ formErrors.instanceDescription }}
40 </div> 36 </div>
41 </div>
42 37
43 <div class="form-group"> 38 <div class="form-group">
44 <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help> 39 <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help>
45 <my-markdown-textarea 40 <my-markdown-textarea
46 id="instanceTerms" formControlName="instanceTerms" textareaWidth="500px" [previewColumn]="true" 41 id="instanceTerms" formControlName="terms" textareaWidth="500px" [previewColumn]="true"
47 [ngClass]="{ 'input-error': formErrors['instanceTerms'] }" 42 [ngClass]="{ 'input-error': formErrors['instance.terms'] }"
48 ></my-markdown-textarea> 43 ></my-markdown-textarea>
49 <div *ngIf="formErrors.instanceTerms" class="form-error"> 44 <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
50 {{ formErrors.instanceTerms }}
51 </div> 45 </div>
52 </div>
53 46
54 <div class="form-group"> 47 <div class="form-group">
55 <label i18n for="instanceDefaultClientRoute">Default client route</label> 48 <label i18n for="instanceDefaultClientRoute">Default client route</label>
56 <div class="peertube-select-container"> 49 <div class="peertube-select-container">
57 <select id="instanceDefaultClientRoute" formControlName="instanceDefaultClientRoute"> 50 <select id="instanceDefaultClientRoute" formControlName="defaultClientRoute">
58 <option i18n value="/videos/overview">Videos Overview</option> 51 <option i18n value="/videos/overview">Videos Overview</option>
59 <option i18n value="/videos/trending">Videos Trending</option> 52 <option i18n value="/videos/trending">Videos Trending</option>
60 <option i18n value="/videos/recently-added">Videos Recently Added</option> 53 <option i18n value="/videos/recently-added">Videos Recently Added</option>
61 <option i18n value="/videos/local">Local videos</option> 54 <option i18n value="/videos/local">Local videos</option>
62 </select> 55 </select>
56 </div>
57 <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
63 </div> 58 </div>
64 <div *ngIf="formErrors.instanceDefaultClientRoute" class="form-error"> 59
65 {{ formErrors.instanceDefaultClientRoute }} 60 <div class="form-group">
61 <label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
62 <my-help
63 helpType="custom" i18n-customHtml
64 customHtml="With <strong>Do not list</strong> or <strong>Blur thumbnails</strong>, a confirmation will be requested to watch the video."
65 ></my-help>
66
67 <div class="peertube-select-container">
68 <select id="instanceDefaultNSFWPolicy" formControlName="defaultNSFWPolicy">
69 <option i18n value="do_not_list">Do not list</option>
70 <option i18n value="blur">Blur thumbnails</option>
71 <option i18n value="display">Display</option>
72 </select>
73 </div>
74 <div *ngIf="formErrors.instance.defaultNSFWPolicy" class="form-error">{{ formErrors.instance.defaultNSFWPolicy }}</div>
66 </div> 75 </div>
67 </div> 76 </ng-container>
68 77
69 <div class="form-group"> 78 <div i18n class="inner-form-title">Signup</div>
70 <label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
71 <my-help
72 helpType="custom" i18n-customHtml
73 customHtml="With <strong>Do not list</strong> or <strong>Blur thumbnails</strong>, a confirmation will be requested to watch the video."
74 ></my-help>
75 79
76 <div class="peertube-select-container"> 80 <ng-container formGroupName="signup">
77 <select id="instanceDefaultNSFWPolicy" formControlName="instanceDefaultNSFWPolicy"> 81 <div class="form-group">
78 <option i18n value="do_not_list">Do not list</option> 82 <my-peertube-checkbox
79 <option i18n value="blur">Blur thumbnails</option> 83 inputName="signupEnabled" formControlName="enabled"
80 <option i18n value="display">Display</option> 84 i18n-labelText labelText="Signup enabled"
81 </select> 85 ></my-peertube-checkbox>
82 </div> 86 </div>
83 <div *ngIf="formErrors.instanceDefaultNSFWPolicy" class="form-error"> 87
84 {{ formErrors.instanceDefaultNSFWPolicy }} 88 <div class="form-group">
89 <my-peertube-checkbox *ngIf="isSignupEnabled()"
90 inputName="signupRequiresEmailVerification" formControlName="requiresEmailVerification"
91 i18n-labelText labelText="Signup requires email verification"
92 ></my-peertube-checkbox>
85 </div> 93 </div>
86 </div>
87 94
88 <div i18n class="inner-form-title">Signup</div> 95 <div *ngIf="isSignupEnabled()" class="form-group">
96 <label i18n for="signupLimit">Signup limit</label>
97 <input
98 type="text" id="signupLimit"
99 formControlName="limit" [ngClass]="{ 'input-error': formErrors['signup.limit'] }"
100 >
101 <div *ngIf="formErrors.signup.limit" class="form-error">{{ formErrors.signup.limit }}</div>
102 </div>
103 </ng-container>
89 104
90 <my-peertube-checkbox 105 <div i18n class="inner-form-title">Users</div>
91 inputName="signupEnabled" formControlName="signupEnabled"
92 i18n-labelText labelText="Signup enabled"
93 ></my-peertube-checkbox>
94 106
95 <my-peertube-checkbox *ngIf="isSignupEnabled()" 107 <ng-container formGroupName="user">
96 inputName="signupRequiresEmailVerification" formControlName="signupRequiresEmailVerification" 108 <div class="form-group">
97 i18n-labelText labelText="Signup requires email verification" 109 <label i18n for="userVideoQuota">User default video quota</label>
98 ></my-peertube-checkbox> 110 <div class="peertube-select-container">
111 <select id="userVideoQuota" formControlName="videoQuota">
112 <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value">
113 {{ videoQuotaOption.label }}
114 </option>
115 </select>
116 </div>
117 <div *ngIf="formErrors.user.videoQuota" class="form-error">{{ formErrors.user.videoQuota }}</div>
118 </div>
99 119
100 <div *ngIf="isSignupEnabled()" class="form-group"> 120 <div class="form-group">
101 <label i18n for="signupLimit">Signup limit</label> 121 <label i18n for="userVideoQuotaDaily">User default daily upload limit</label>
102 <input 122 <div class="peertube-select-container">
103 type="text" id="signupLimit" 123 <select id="userVideoQuotaDaily" formControlName="videoQuotaDaily">
104 formControlName="signupLimit" [ngClass]="{ 'input-error': formErrors['signupLimit'] }" 124 <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value">
105 > 125 {{ videoQuotaDailyOption.label }}
106 <div *ngIf="formErrors.signupLimit" class="form-error"> 126 </option>
107 {{ formErrors.signupLimit }} 127 </select>
128 </div>
129 <div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
108 </div> 130 </div>
109 </div> 131 </ng-container>
110 132
111 <div i18n class="inner-form-title">Import</div> 133 <div i18n class="inner-form-title">Import</div>
112 134
113 <my-peertube-checkbox 135 <ng-container formGroupName="import">
114 inputName="importVideosHttpEnabled" formControlName="importVideosHttpEnabled" 136 <ng-container formGroupName="videos">
115 i18n-labelText labelText="Video import with HTTP enabled"
116 ></my-peertube-checkbox>
117 137
118 <my-peertube-checkbox 138 <div class="form-group" formGroupName="http">
119 inputName="importVideosTorrentEnabled" formControlName="importVideosTorrentEnabled" 139 <my-peertube-checkbox
120 i18n-labelText labelText="Video import with a torrent file or a magnet URI enabled" 140 inputName="importVideosHttpEnabled" formControlName="enabled"
121 ></my-peertube-checkbox> 141 i18n-labelText labelText="Video import with HTTP URL (i.e. YouTube) enabled"
142 ></my-peertube-checkbox>
143 </div>
144
145 <div class="form-group" formGroupName="torrent">
146 <my-peertube-checkbox
147 inputName="importVideosTorrentEnabled" formControlName="enabled"
148 i18n-labelText labelText="Video import with a torrent file or a magnet URI enabled"
149 ></my-peertube-checkbox>
150 </div>
151
152 </ng-container>
153 </ng-container>
122 154
123 <div i18n class="inner-form-title">Administrator</div> 155 <div i18n class="inner-form-title">Administrator</div>
124 156
125 <div class="form-group"> 157 <div class="form-group" formGroupName="admin">
126 <label i18n for="adminEmail">Admin email</label> 158 <label i18n for="adminEmail">Admin email</label>
127 <input 159 <input
128 type="text" id="adminEmail" 160 type="text" id="adminEmail"
129 formControlName="adminEmail" [ngClass]="{ 'input-error': formErrors['adminEmail'] }" 161 formControlName="email" [ngClass]="{ 'input-error': formErrors['admin.email'] }"
130 > 162 >
131 <div *ngIf="formErrors.adminEmail" class="form-error"> 163 <div *ngIf="formErrors.admin.email" class="form-error">{{ formErrors.admin.email }}</div>
132 {{ formErrors.adminEmail }}
133 </div>
134 </div> 164 </div>
135 165
136 <div i18n class="inner-form-title">Users</div> 166 <div class="form-group" formGroupName="contactForm">
137 167 <my-peertube-checkbox
138 <div class="form-group"> 168 inputName="enableContactForm" formControlName="enabled"
139 <label i18n for="userVideoQuota">User default video quota</label> 169 i18n-labelText labelText="Enable contact form"
140 <div class="peertube-select-container"> 170 ></my-peertube-checkbox>
141 <select id="userVideoQuota" formControlName="userVideoQuota">
142 <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value">
143 {{ videoQuotaOption.label }}
144 </option>
145 </select>
146 </div>
147 <div *ngIf="formErrors.userVideoQuota" class="form-error">
148 {{ formErrors.userVideoQuota }}
149 </div>
150 </div> 171 </div>
151 172
152 <div class="form-group">
153 <label i18n for="userVideoQuotaDaily">User default daily upload limit</label>
154 <div class="peertube-select-container">
155 <select id="userVideoQuotaDaily" formControlName="userVideoQuotaDaily">
156 <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value">
157 {{ videoQuotaDailyOption.label }}
158 </option>
159 </select>
160 </div>
161 <div *ngIf="formErrors.userVideoQuotaDaily" class="form-error">
162 {{ formErrors.userVideoQuotaDaily }}
163 </div>
164 </div>
165 </ng-template> 173 </ng-template>
166 </ngb-tab> 174 </ngb-tab>
167 175
@@ -169,28 +177,35 @@
169 <ng-template ngbTabContent> 177 <ng-template ngbTabContent>
170 <div i18n class="inner-form-title">Twitter</div> 178 <div i18n class="inner-form-title">Twitter</div>
171 179
172 <div class="form-group"> 180 <ng-container formGroupName="services">
173 <label i18n for="signupLimit">Your Twitter username</label> 181 <ng-container formGroupName="twitter">
174 <my-help 182
175 helpType="custom" i18n-customHtml 183 <div class="form-group">
176 customHtml="Indicates the Twitter account for the website or platform on which the content was published." 184 <label i18n for="signupLimit">Your Twitter username</label>
177 ></my-help> 185 <my-help
178 <input 186 helpType="custom" i18n-customHtml
179 type="text" id="servicesTwitterUsername" 187 customHtml="Indicates the Twitter account for the website or platform on which the content was published."
180 formControlName="servicesTwitterUsername" [ngClass]="{ 'input-error': formErrors['servicesTwitterUsername'] }" 188 ></my-help>
181 > 189 <input
182 <div *ngIf="formErrors.servicesTwitterUsername" class="form-error"> 190 type="text" id="servicesTwitterUsername"
183 {{ formErrors.servicesTwitterUsername }} 191 formControlName="username" [ngClass]="{ 'input-error': formErrors['services.twitter.username'] }"
184 </div> 192 >
185 </div> 193 <div *ngIf="formErrors.services.twitter.username" class="form-error">{{ formErrors.services.twitter.username }}</div>
194 </div>
195
196 <div class="form-group">
197 <my-peertube-checkbox
198 inputName="servicesTwitterWhitelisted" formControlName="whitelisted"
199 i18n-labelText labelText="Instance whitelisted by Twitter"
200 i18n-helpHtml helpHtml="If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
201 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
202 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted."
203 ></my-peertube-checkbox>
204 </div>
205
206 </ng-container>
207 </ng-container>
186 208
187 <my-peertube-checkbox
188 inputName="servicesTwitterWhitelisted" formControlName="servicesTwitterWhitelisted"
189 i18n-labelText labelText="Instance whitelisted by Twitter"
190 i18n-helpHtml helpHtml="If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
191 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
192 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted."
193 ></my-peertube-checkbox>
194 </ng-template> 209 </ng-template>
195 </ngb-tab> 210 </ngb-tab>
196 211
@@ -199,36 +214,48 @@
199 214
200 <div i18n class="inner-form-title">Transcoding</div> 215 <div i18n class="inner-form-title">Transcoding</div>
201 216
202 <my-peertube-checkbox 217 <ng-container formGroupName="transcoding">
203 inputName="transcodingEnabled" formControlName="transcodingEnabled" 218 <div class="form-group">
204 i18n-labelText labelText="Transcoding enabled" 219 <my-peertube-checkbox
205 i18n-helpHtml helpHtml="If you disable transcoding, many videos from your users will not work!" 220 inputName="transcodingEnabled" formControlName="enabled"
206 ></my-peertube-checkbox> 221 i18n-labelText labelText="Transcoding enabled"
222 i18n-helpHtml helpHtml="If you disable transcoding, many videos from your users will not work!"
223 ></my-peertube-checkbox>
224 </div>
207 225
208 <ng-template [ngIf]="isTranscodingEnabled()"> 226 <ng-container *ngIf="isTranscodingEnabled()">
209 227
210 <div class="form-group"> 228 <div class="form-group">
211 <label i18n for="transcodingThreads">Transcoding threads</label> 229 <my-peertube-checkbox
212 <div class="peertube-select-container"> 230 inputName="transcodingAllowAdditionalExtensions" formControlName="allowAdditionalExtensions"
213 <select id="transcodingThreads" formControlName="transcodingThreads"> 231 i18n-labelText labelText="Allow additional extensions"
214 <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value"> 232 i18n-helpHtml helpHtml="Allow your users to upload .mkv, .mov, .avi, .flv videos"
215 {{ transcodingThreadOption.label }} 233 ></my-peertube-checkbox>
216 </option>
217 </select>
218 </div> 234 </div>
219 <div *ngIf="formErrors.transcodingThreads" class="form-error"> 235
220 {{ formErrors.transcodingThreads }} 236 <div class="form-group">
237 <label i18n for="transcodingThreads">Transcoding threads</label>
238 <div class="peertube-select-container">
239 <select id="transcodingThreads" formControlName="threads">
240 <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value">
241 {{ transcodingThreadOption.label }}
242 </option>
243 </select>
244 </div>
245 <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div>
221 </div> 246 </div>
222 </div>
223 247
224 <div class="form-group" *ngFor="let resolution of resolutions"> 248 <ng-container formGroupName="resolutions">
225 <my-peertube-checkbox 249 <div class="form-group" *ngFor="let resolution of resolutions">
226 [inputName]="getResolutionKey(resolution)" [formControlName]="getResolutionKey(resolution)" 250 <my-peertube-checkbox
227 i18n-labelText labelText="Resolution {{resolution}} enabled" 251 [inputName]="getResolutionKey(resolution)" [formControlName]="resolution"
228 ></my-peertube-checkbox> 252 i18n-labelText labelText="Resolution {{resolution}} enabled"
253 ></my-peertube-checkbox>
254 </div>
255 </ng-container>
229 256
230 </div> 257 </ng-container>
231 </ng-template> 258 </ng-container>
232 259
233 <div i18n class="inner-form-title"> 260 <div i18n class="inner-form-title">
234 Cache 261 Cache
@@ -239,74 +266,73 @@
239 ></my-help> 266 ></my-help>
240 </div> 267 </div>
241 268
242 <div class="form-group"> 269 <ng-container formGroupName="cache">
243 <label i18n for="cachePreviewsSize">Previews cache size</label> 270 <div class="form-group" formGroupName="previews">
244 <input 271 <label i18n for="cachePreviewsSize">Previews cache size</label>
245 type="text" id="cachePreviewsSize" 272 <input
246 formControlName="cachePreviewsSize" [ngClass]="{ 'input-error': formErrors['cachePreviewsSize'] }" 273 type="text" id="cachePreviewsSize"
247 > 274 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.previews.size'] }"
248 <div *ngIf="formErrors.cachePreviewsSize" class="form-error"> 275 >
249 {{ formErrors.cachePreviewsSize }} 276 <div *ngIf="formErrors.cache.previews.size" class="form-error">{{ formErrors.cache.previews.size }}</div>
250 </div> 277 </div>
251 </div>
252 278
253 <div class="form-group"> 279 <div class="form-group" formGroupName="captions">
254 <label i18n for="cachePreviewsSize">Video captions cache size</label> 280 <label i18n for="cacheCaptionsSize">Video captions cache size</label>
255 <input 281 <input
256 type="text" id="cacheCaptionsSize" 282 type="text" id="cacheCaptionsSize"
257 formControlName="cacheCaptionsSize" [ngClass]="{ 'input-error': formErrors['cacheCaptionsSize'] }" 283 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.captions.size'] }"
258 > 284 >
259 <div *ngIf="formErrors.cacheCaptionsSize" class="form-error"> 285 <div *ngIf="formErrors.cache.captions.size" class="form-error">{{ formErrors.cache.captions.size }}</div>
260 {{ formErrors.cacheCaptionsSize }}
261 </div> 286 </div>
262 </div> 287 </ng-container>
263 288
264 <div i18n class="inner-form-title">Customizations</div> 289 <div i18n class="inner-form-title">Customizations</div>
265 290
266 <div class="form-group"> 291 <ng-container formGroupName="instance">
267 <label i18n for="customizationJavascript">JavaScript</label> 292 <ng-container formGroupName="customizations">
268 <my-help 293 <div class="form-group">
269 helpType="custom" i18n-customHtml 294 <label i18n for="customizationJavascript">JavaScript</label>
270 customHtml="Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre>" 295 <my-help
271 ></my-help> 296 helpType="custom" i18n-customHtml
272 <textarea 297 customHtml="Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre>"
273 id="customizationJavascript" formControlName="customizationJavascript" 298 ></my-help>
274 [ngClass]="{ 'input-error': formErrors['customizationJavascript'] }" 299 <textarea
275 ></textarea> 300 id="customizationJavascript" formControlName="javascript"
276 <div *ngIf="formErrors.customizationJavascript" class="form-error"> 301 [ngClass]="{ 'input-error': formErrors['instance.customizations.javascript'] }"
277 {{ formErrors.customizationJavascript }} 302 ></textarea>
278 </div> 303 <div *ngIf="formErrors.instance.customizations.javascript" class="form-error">{{ formErrors.instance.customizations.javascript }}</div>
279 </div> 304 </div>
305
306 <div class="form-group">
307 <label for="customizationCSS">CSS</label>
308 <my-help
309 helpType="custom"
310 i18n-customHtml
311 customHtml="
312 Write directly CSS code. Example:<br />
313 <pre>
314 body {{ '{' }}
315 background-color: red;
316 {{ '}' }}
317 </pre>
318
319 Prepend with <em>#custom-css</em> to override styles. Example:
320 <pre>
321 #custom-css .logged-in-email {{ '{' }}
322 color: red;
323 {{ '}' }}
324 </pre>
325 "
326 ></my-help>
327 <textarea
328 id="customizationCSS" formControlName="css"
329 [ngClass]="{ 'input-error': formErrors['instance.customizations.css'] }"
330 ></textarea>
331 <div *ngIf="formErrors.instance.customizations.css" class="form-error">{{ formErrors.instance.customizations.css }}</div>
332 </div>
333 </ng-container>
334 </ng-container>
280 335
281 <div class="form-group">
282 <label for="customizationCSS">CSS</label>
283 <my-help
284 helpType="custom"
285 i18n-customHtml
286 customHtml="
287 Write directly CSS code. Example:<br />
288 <pre>
289 body {{ '{' }}
290 background-color: red;
291 {{ '}' }}
292 </pre>
293
294 Prepend with <em>#custom-css</em> to override styles. Example:
295 <pre>
296 #custom-css .logged-in-email {{ '{' }}
297 color: red;
298 {{ '}' }}
299 </pre>
300 "
301 ></my-help>
302 <textarea
303 id="customizationCSS" formControlName="customizationCSS"
304 [ngClass]="{ 'input-error': formErrors['customizationCSS'] }"
305 ></textarea>
306 <div *ngIf="formErrors.customizationCSS" class="form-error">
307 {{ formErrors.customizationCSS }}
308 </div>
309 </div>
310 </ng-template> 336 </ng-template>
311 </ngb-tab> 337 </ngb-tab>
312 </ngb-tabset> 338 </ngb-tabset>
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
index 4983b0425..654a076b0 100644
--- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
+++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
@@ -1,9 +1,8 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { ConfigService } from '@app/+admin/config/shared/config.service' 2import { ConfigService } from '@app/+admin/config/shared/config.service'
3import { ConfirmService } from '@app/core'
4import { ServerService } from '@app/core/server/server.service' 3import { ServerService } from '@app/core/server/server.service'
5import { CustomConfigValidatorsService, FormReactive, UserValidatorsService } from '@app/shared' 4import { CustomConfigValidatorsService, FormReactive, UserValidatorsService } from '@app/shared'
6import { NotificationsService } from 'angular2-notifications' 5import { Notifier } from '@app/core'
7import { CustomConfig } from '../../../../../../shared/models/server/custom-config.model' 6import { CustomConfig } from '../../../../../../shared/models/server/custom-config.model'
8import { I18n } from '@ngx-translate/i18n-polyfill' 7import { I18n } from '@ngx-translate/i18n-polyfill'
9import { BuildFormDefaultValues, FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 8import { BuildFormDefaultValues, FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
@@ -19,17 +18,13 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
19 resolutions: string[] = [] 18 resolutions: string[] = []
20 transcodingThreadOptions: { label: string, value: number }[] = [] 19 transcodingThreadOptions: { label: string, value: number }[] = []
21 20
22 private oldCustomJavascript: string
23 private oldCustomCSS: string
24
25 constructor ( 21 constructor (
26 protected formValidatorService: FormValidatorService, 22 protected formValidatorService: FormValidatorService,
27 private customConfigValidatorsService: CustomConfigValidatorsService, 23 private customConfigValidatorsService: CustomConfigValidatorsService,
28 private userValidatorsService: UserValidatorsService, 24 private userValidatorsService: UserValidatorsService,
29 private notificationsService: NotificationsService, 25 private notifier: Notifier,
30 private configService: ConfigService, 26 private configService: ConfigService,
31 private serverService: ServerService, 27 private serverService: ServerService,
32 private confirmService: ConfirmService,
33 private i18n: I18n 28 private i18n: I18n
34 ) { 29 ) {
35 super() 30 super()
@@ -60,40 +55,78 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
60 } 55 }
61 56
62 getResolutionKey (resolution: string) { 57 getResolutionKey (resolution: string) {
63 return 'transcodingResolution' + resolution 58 return 'transcoding.resolutions.' + resolution
64 } 59 }
65 60
66 ngOnInit () { 61 ngOnInit () {
67 const formGroupData = { 62 const formGroupData: { [key in keyof CustomConfig ]: any } = {
68 instanceName: this.customConfigValidatorsService.INSTANCE_NAME, 63 instance: {
69 instanceShortDescription: this.customConfigValidatorsService.INSTANCE_SHORT_DESCRIPTION, 64 name: this.customConfigValidatorsService.INSTANCE_NAME,
70 instanceDescription: null, 65 shortDescription: this.customConfigValidatorsService.INSTANCE_SHORT_DESCRIPTION,
71 instanceTerms: null, 66 description: null,
72 instanceDefaultClientRoute: null, 67 terms: null,
73 instanceDefaultNSFWPolicy: null, 68 defaultClientRoute: null,
74 servicesTwitterUsername: this.customConfigValidatorsService.SERVICES_TWITTER_USERNAME, 69 defaultNSFWPolicy: null,
75 servicesTwitterWhitelisted: null, 70 customizations: {
76 cachePreviewsSize: this.customConfigValidatorsService.CACHE_PREVIEWS_SIZE, 71 javascript: null,
77 cacheCaptionsSize: this.customConfigValidatorsService.CACHE_CAPTIONS_SIZE, 72 css: null
78 signupEnabled: null, 73 }
79 signupLimit: this.customConfigValidatorsService.SIGNUP_LIMIT, 74 },
80 signupRequiresEmailVerification: null, 75 services: {
81 importVideosHttpEnabled: null, 76 twitter: {
82 importVideosTorrentEnabled: null, 77 username: this.customConfigValidatorsService.SERVICES_TWITTER_USERNAME,
83 adminEmail: this.customConfigValidatorsService.ADMIN_EMAIL, 78 whitelisted: null
84 userVideoQuota: this.userValidatorsService.USER_VIDEO_QUOTA, 79 }
85 userVideoQuotaDaily: this.userValidatorsService.USER_VIDEO_QUOTA_DAILY, 80 },
86 transcodingThreads: this.customConfigValidatorsService.TRANSCODING_THREADS, 81 cache: {
87 transcodingEnabled: null, 82 previews: {
88 customizationJavascript: null, 83 size: this.customConfigValidatorsService.CACHE_PREVIEWS_SIZE
89 customizationCSS: null 84 },
85 captions: {
86 size: this.customConfigValidatorsService.CACHE_CAPTIONS_SIZE
87 }
88 },
89 signup: {
90 enabled: null,
91 limit: this.customConfigValidatorsService.SIGNUP_LIMIT,
92 requiresEmailVerification: null
93 },
94 import: {
95 videos: {
96 http: {
97 enabled: null
98 },
99 torrent: {
100 enabled: null
101 }
102 }
103 },
104 admin: {
105 email: this.customConfigValidatorsService.ADMIN_EMAIL
106 },
107 contactForm: {
108 enabled: null
109 },
110 user: {
111 videoQuota: this.userValidatorsService.USER_VIDEO_QUOTA,
112 videoQuotaDaily: this.userValidatorsService.USER_VIDEO_QUOTA_DAILY
113 },
114 transcoding: {
115 enabled: null,
116 threads: this.customConfigValidatorsService.TRANSCODING_THREADS,
117 allowAdditionalExtensions: null,
118 resolutions: {}
119 }
90 } 120 }
91 121
92 const defaultValues: BuildFormDefaultValues = {} 122 const defaultValues = {
123 transcoding: {
124 resolutions: {}
125 }
126 }
93 for (const resolution of this.resolutions) { 127 for (const resolution of this.resolutions) {
94 const key = this.getResolutionKey(resolution) 128 defaultValues.transcoding.resolutions[resolution] = 'false'
95 defaultValues[key] = 'false' 129 formGroupData.transcoding.resolutions[resolution] = null
96 formGroupData[key] = null
97 } 130 }
98 131
99 this.buildForm(formGroupData) 132 this.buildForm(formGroupData)
@@ -103,112 +136,25 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
103 res => { 136 res => {
104 this.customConfig = res 137 this.customConfig = res
105 138
106 this.oldCustomCSS = this.customConfig.instance.customizations.css
107 this.oldCustomJavascript = this.customConfig.instance.customizations.javascript
108
109 this.updateForm() 139 this.updateForm()
110 // Force form validation 140 // Force form validation
111 this.forceCheck() 141 this.forceCheck()
112 }, 142 },
113 143
114 err => this.notificationsService.error(this.i18n('Error'), err.message) 144 err => this.notifier.error(err.message)
115 ) 145 )
116 } 146 }
117 147
118 isTranscodingEnabled () { 148 isTranscodingEnabled () {
119 return this.form.value['transcodingEnabled'] === true 149 return this.form.value['transcoding']['enabled'] === true
120 } 150 }
121 151
122 isSignupEnabled () { 152 isSignupEnabled () {
123 return this.form.value['signupEnabled'] === true 153 return this.form.value['signup']['enabled'] === true
124 } 154 }
125 155
126 async formValidated () { 156 async formValidated () {
127 const newCustomizationJavascript = this.form.value['customizationJavascript'] 157 this.configService.updateCustomConfig(this.form.value)
128 const newCustomizationCSS = this.form.value['customizationCSS']
129
130 const customizations = []
131 if (newCustomizationJavascript && newCustomizationJavascript !== this.oldCustomJavascript) customizations.push('JavaScript')
132 if (newCustomizationCSS && newCustomizationCSS !== this.oldCustomCSS) customizations.push('CSS')
133
134 if (customizations.length !== 0) {
135 const customizationsText = customizations.join('/')
136
137 // FIXME: i18n service does not support string concatenation
138 const message = this.i18n('You set custom {{customizationsText}}. ', { customizationsText }) +
139 this.i18n('This could lead to security issues or bugs if you do not understand it. ') +
140 this.i18n('Are you sure you want to update the configuration?')
141
142 const label = this.i18n('Please type') + ` "I understand the ${customizationsText} I set" ` + this.i18n('to confirm.')
143 const expectedInputValue = `I understand the ${customizationsText} I set`
144
145 const confirmRes = await this.confirmService.confirmWithInput(message, label, expectedInputValue)
146 if (confirmRes === false) return
147 }
148
149 const data: CustomConfig = {
150 instance: {
151 name: this.form.value['instanceName'],
152 shortDescription: this.form.value['instanceShortDescription'],
153 description: this.form.value['instanceDescription'],
154 terms: this.form.value['instanceTerms'],
155 defaultClientRoute: this.form.value['instanceDefaultClientRoute'],
156 defaultNSFWPolicy: this.form.value['instanceDefaultNSFWPolicy'],
157 customizations: {
158 javascript: this.form.value['customizationJavascript'],
159 css: this.form.value['customizationCSS']
160 }
161 },
162 services: {
163 twitter: {
164 username: this.form.value['servicesTwitterUsername'],
165 whitelisted: this.form.value['servicesTwitterWhitelisted']
166 }
167 },
168 cache: {
169 previews: {
170 size: this.form.value['cachePreviewsSize']
171 },
172 captions: {
173 size: this.form.value['cacheCaptionsSize']
174 }
175 },
176 signup: {
177 enabled: this.form.value['signupEnabled'],
178 limit: this.form.value['signupLimit'],
179 requiresEmailVerification: this.form.value['signupRequiresEmailVerification']
180 },
181 admin: {
182 email: this.form.value['adminEmail']
183 },
184 user: {
185 videoQuota: this.form.value['userVideoQuota'],
186 videoQuotaDaily: this.form.value['userVideoQuotaDaily']
187 },
188 transcoding: {
189 enabled: this.form.value['transcodingEnabled'],
190 threads: this.form.value['transcodingThreads'],
191 resolutions: {
192 '240p': this.form.value[this.getResolutionKey('240p')],
193 '360p': this.form.value[this.getResolutionKey('360p')],
194 '480p': this.form.value[this.getResolutionKey('480p')],
195 '720p': this.form.value[this.getResolutionKey('720p')],
196 '1080p': this.form.value[this.getResolutionKey('1080p')]
197 }
198 },
199 import: {
200 videos: {
201 http: {
202 enabled: this.form.value['importVideosHttpEnabled']
203 },
204 torrent: {
205 enabled: this.form.value['importVideosTorrentEnabled']
206 }
207 }
208 }
209 }
210
211 this.configService.updateCustomConfig(data)
212 .subscribe( 158 .subscribe(
213 res => { 159 res => {
214 this.customConfig = res 160 this.customConfig = res
@@ -218,45 +164,15 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
218 164
219 this.updateForm() 165 this.updateForm()
220 166
221 this.notificationsService.success(this.i18n('Success'), this.i18n('Configuration updated.')) 167 this.notifier.success(this.i18n('Configuration updated.'))
222 }, 168 },
223 169
224 err => this.notificationsService.error(this.i18n('Error'), err.message) 170 err => this.notifier.error(err.message)
225 ) 171 )
226 } 172 }
227 173
228 private updateForm () { 174 private updateForm () {
229 const data = { 175 this.form.patchValue(this.customConfig)
230 instanceName: this.customConfig.instance.name,
231 instanceShortDescription: this.customConfig.instance.shortDescription,
232 instanceDescription: this.customConfig.instance.description,
233 instanceTerms: this.customConfig.instance.terms,
234 instanceDefaultClientRoute: this.customConfig.instance.defaultClientRoute,
235 instanceDefaultNSFWPolicy: this.customConfig.instance.defaultNSFWPolicy,
236 servicesTwitterUsername: this.customConfig.services.twitter.username,
237 servicesTwitterWhitelisted: this.customConfig.services.twitter.whitelisted,
238 cachePreviewsSize: this.customConfig.cache.previews.size,
239 cacheCaptionsSize: this.customConfig.cache.captions.size,
240 signupEnabled: this.customConfig.signup.enabled,
241 signupLimit: this.customConfig.signup.limit,
242 signupRequiresEmailVerification: this.customConfig.signup.requiresEmailVerification,
243 adminEmail: this.customConfig.admin.email,
244 userVideoQuota: this.customConfig.user.videoQuota,
245 userVideoQuotaDaily: this.customConfig.user.videoQuotaDaily,
246 transcodingThreads: this.customConfig.transcoding.threads,
247 transcodingEnabled: this.customConfig.transcoding.enabled,
248 customizationJavascript: this.customConfig.instance.customizations.javascript,
249 customizationCSS: this.customConfig.instance.customizations.css,
250 importVideosHttpEnabled: this.customConfig.import.videos.http.enabled,
251 importVideosTorrentEnabled: this.customConfig.import.videos.torrent.enabled
252 }
253
254 for (const resolution of this.resolutions) {
255 const key = this.getResolutionKey(resolution)
256 data[key] = this.customConfig.transcoding.resolutions[resolution]
257 }
258
259 this.form.patchValue(data)
260 } 176 }
261 177
262} 178}
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.html b/client/src/app/+admin/follows/followers-list/followers-list.component.html
index 5645a60cc..fc022bdb4 100644
--- a/client/src/app/+admin/follows/followers-list/followers-list.component.html
+++ b/client/src/app/+admin/follows/followers-list/followers-list.component.html
@@ -2,6 +2,15 @@
2 [value]="followers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" 2 [value]="followers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" 3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
4> 4>
5 <ng-template pTemplate="caption">
6 <div class="caption">
7 <input
8 type="text" name="table-filter" id="table-filter" i18n-placeholder placeholder="Filter..."
9 (keyup)="onSearch($event.target.value)"
10 >
11 </div>
12 </ng-template>
13
5 <ng-template pTemplate="header"> 14 <ng-template pTemplate="header">
6 <tr> 15 <tr>
7 <th i18n style="width: 60px">ID</th> 16 <th i18n style="width: 60px">ID</th>
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.scss b/client/src/app/+admin/follows/followers-list/followers-list.component.scss
index e69de29bb..a6f0656b8 100644
--- a/client/src/app/+admin/follows/followers-list/followers-list.component.scss
+++ b/client/src/app/+admin/follows/followers-list/followers-list.component.scss
@@ -0,0 +1,10 @@
1@import '_variables';
2@import '_mixins';
3
4.caption {
5 justify-content: flex-end;
6
7 input {
8 @include peertube-input-text(250px);
9 }
10} \ No newline at end of file
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.ts b/client/src/app/+admin/follows/followers-list/followers-list.component.ts
index ca993dcd3..9a8848bfb 100644
--- a/client/src/app/+admin/follows/followers-list/followers-list.component.ts
+++ b/client/src/app/+admin/follows/followers-list/followers-list.component.ts
@@ -1,6 +1,6 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2 2
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { SortMeta } from 'primeng/primeng' 4import { SortMeta } from 'primeng/primeng'
5import { ActorFollow } from '../../../../../../shared/models/actors/follow.model' 5import { ActorFollow } from '../../../../../../shared/models/actors/follow.model'
6import { RestPagination, RestTable } from '../../../shared' 6import { RestPagination, RestTable } from '../../../shared'
@@ -20,7 +20,7 @@ export class FollowersListComponent extends RestTable implements OnInit {
20 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 20 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
21 21
22 constructor ( 22 constructor (
23 private notificationsService: NotificationsService, 23 private notifier: Notifier,
24 private followService: FollowService, 24 private followService: FollowService,
25 private i18n: I18n 25 private i18n: I18n
26 ) { 26 ) {
@@ -28,18 +28,18 @@ export class FollowersListComponent extends RestTable implements OnInit {
28 } 28 }
29 29
30 ngOnInit () { 30 ngOnInit () {
31 this.loadSort() 31 this.initialize()
32 } 32 }
33 33
34 protected loadData () { 34 protected loadData () {
35 this.followService.getFollowers(this.pagination, this.sort) 35 this.followService.getFollowers(this.pagination, this.sort, this.search)
36 .subscribe( 36 .subscribe(
37 resultList => { 37 resultList => {
38 this.followers = resultList.data 38 this.followers = resultList.data
39 this.totalRecords = resultList.total 39 this.totalRecords = resultList.total
40 }, 40 },
41 41
42 err => this.notificationsService.error(this.i18n('Error'), err.message) 42 err => this.notifier.error(err.message)
43 ) 43 )
44 } 44 }
45} 45}
diff --git a/client/src/app/+admin/follows/following-add/following-add.component.ts b/client/src/app/+admin/follows/following-add/following-add.component.ts
index bd9cc022b..2bb249746 100644
--- a/client/src/app/+admin/follows/following-add/following-add.component.ts
+++ b/client/src/app/+admin/follows/following-add/following-add.component.ts
@@ -1,6 +1,6 @@
1import { Component } from '@angular/core' 1import { Component } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { ConfirmService } from '../../../core' 4import { ConfirmService } from '../../../core'
5import { validateHost } from '../../../shared' 5import { validateHost } from '../../../shared'
6import { FollowService } from '../shared' 6import { FollowService } from '../shared'
@@ -18,7 +18,7 @@ export class FollowingAddComponent {
18 18
19 constructor ( 19 constructor (
20 private router: Router, 20 private router: Router,
21 private notificationsService: NotificationsService, 21 private notifier: Notifier,
22 private confirmService: ConfirmService, 22 private confirmService: ConfirmService,
23 private followService: FollowService, 23 private followService: FollowService,
24 private i18n: I18n 24 private i18n: I18n
@@ -64,12 +64,12 @@ export class FollowingAddComponent {
64 64
65 this.followService.follow(hosts).subscribe( 65 this.followService.follow(hosts).subscribe(
66 () => { 66 () => {
67 this.notificationsService.success(this.i18n('Success'), this.i18n('Follow request(s) sent!')) 67 this.notifier.success(this.i18n('Follow request(s) sent!'))
68 68
69 setTimeout(() => this.router.navigate([ '/admin/follows/following-list' ]), 500) 69 setTimeout(() => this.router.navigate([ '/admin/follows/following-list' ]), 500)
70 }, 70 },
71 71
72 err => this.notificationsService.error(this.i18n('Error'), err.message) 72 err => this.notifier.error(err.message)
73 ) 73 )
74 } 74 }
75 75
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.html b/client/src/app/+admin/follows/following-list/following-list.component.html
index 8af624ac5..5bc8fbc2d 100644
--- a/client/src/app/+admin/follows/following-list/following-list.component.html
+++ b/client/src/app/+admin/follows/following-list/following-list.component.html
@@ -2,6 +2,17 @@
2 [value]="following" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" 2 [value]="following" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" 3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
4> 4>
5 <ng-template pTemplate="caption">
6 <div class="caption">
7 <div>
8 <input
9 type="text" name="table-filter" id="table-filter" i18n-placeholder placeholder="Filter..."
10 (keyup)="onSearch($event.target.value)"
11 >
12 </div>
13 </div>
14 </ng-template>
15
5 <ng-template pTemplate="header"> 16 <ng-template pTemplate="header">
6 <tr> 17 <tr>
7 <th i18n style="width: 60px">ID</th> 18 <th i18n style="width: 60px">ID</th>
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.scss b/client/src/app/+admin/follows/following-list/following-list.component.scss
index bfcdcaa49..a6f0656b8 100644
--- a/client/src/app/+admin/follows/following-list/following-list.component.scss
+++ b/client/src/app/+admin/follows/following-list/following-list.component.scss
@@ -1,13 +1,10 @@
1@import '_variables'; 1@import '_variables';
2@import '_mixins'; 2@import '_mixins';
3 3
4my-redundancy-checkbox /deep/ my-peertube-checkbox { 4.caption {
5 .form-group { 5 justify-content: flex-end;
6 margin-bottom: 0;
7 align-items: center;
8 }
9 6
10 label { 7 input {
11 margin: 0; 8 @include peertube-input-text(250px);
12 } 9 }
13} \ No newline at end of file 10} \ No newline at end of file
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.ts b/client/src/app/+admin/follows/following-list/following-list.component.ts
index dd57884c6..4517a721e 100644
--- a/client/src/app/+admin/follows/following-list/following-list.component.ts
+++ b/client/src/app/+admin/follows/following-list/following-list.component.ts
@@ -1,5 +1,5 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { SortMeta } from 'primeng/primeng' 3import { SortMeta } from 'primeng/primeng'
4import { ActorFollow } from '../../../../../../shared/models/actors/follow.model' 4import { ActorFollow } from '../../../../../../shared/models/actors/follow.model'
5import { ConfirmService } from '../../../core/confirm/confirm.service' 5import { ConfirmService } from '../../../core/confirm/confirm.service'
@@ -20,7 +20,7 @@ export class FollowingListComponent extends RestTable implements OnInit {
20 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 20 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
21 21
22 constructor ( 22 constructor (
23 private notificationsService: NotificationsService, 23 private notifier: Notifier,
24 private confirmService: ConfirmService, 24 private confirmService: ConfirmService,
25 private followService: FollowService, 25 private followService: FollowService,
26 private i18n: I18n 26 private i18n: I18n
@@ -29,7 +29,7 @@ export class FollowingListComponent extends RestTable implements OnInit {
29 } 29 }
30 30
31 ngOnInit () { 31 ngOnInit () {
32 this.loadSort() 32 this.initialize()
33 } 33 }
34 34
35 async removeFollowing (follow: ActorFollow) { 35 async removeFollowing (follow: ActorFollow) {
@@ -41,26 +41,23 @@ export class FollowingListComponent extends RestTable implements OnInit {
41 41
42 this.followService.unfollow(follow).subscribe( 42 this.followService.unfollow(follow).subscribe(
43 () => { 43 () => {
44 this.notificationsService.success( 44 this.notifier.success(this.i18n('You are not following {{host}} anymore.', { host: follow.following.host }))
45 this.i18n('Success'),
46 this.i18n('You are not following {{host}} anymore.', { host: follow.following.host })
47 )
48 this.loadData() 45 this.loadData()
49 }, 46 },
50 47
51 err => this.notificationsService.error(this.i18n('Error'), err.message) 48 err => this.notifier.error(err.message)
52 ) 49 )
53 } 50 }
54 51
55 protected loadData () { 52 protected loadData () {
56 this.followService.getFollowing(this.pagination, this.sort) 53 this.followService.getFollowing(this.pagination, this.sort, this.search)
57 .subscribe( 54 .subscribe(
58 resultList => { 55 resultList => {
59 this.following = resultList.data 56 this.following = resultList.data
60 this.totalRecords = resultList.total 57 this.totalRecords = resultList.total
61 }, 58 },
62 59
63 err => this.notificationsService.error(this.i18n('Error'), err.message) 60 err => this.notifier.error(err.message)
64 ) 61 )
65 } 62 }
66} 63}
diff --git a/client/src/app/+admin/follows/shared/follow.service.ts b/client/src/app/+admin/follows/shared/follow.service.ts
index 27169a9cd..a2904179e 100644
--- a/client/src/app/+admin/follows/shared/follow.service.ts
+++ b/client/src/app/+admin/follows/shared/follow.service.ts
@@ -18,10 +18,12 @@ export class FollowService {
18 ) { 18 ) {
19 } 19 }
20 20
21 getFollowing (pagination: RestPagination, sort: SortMeta): Observable<ResultList<ActorFollow>> { 21 getFollowing (pagination: RestPagination, sort: SortMeta, search?: string): Observable<ResultList<ActorFollow>> {
22 let params = new HttpParams() 22 let params = new HttpParams()
23 params = this.restService.addRestGetParams(params, pagination, sort) 23 params = this.restService.addRestGetParams(params, pagination, sort)
24 24
25 if (search) params = params.append('search', search)
26
25 return this.authHttp.get<ResultList<ActorFollow>>(FollowService.BASE_APPLICATION_URL + '/following', { params }) 27 return this.authHttp.get<ResultList<ActorFollow>>(FollowService.BASE_APPLICATION_URL + '/following', { params })
26 .pipe( 28 .pipe(
27 map(res => this.restExtractor.convertResultListDateToHuman(res)), 29 map(res => this.restExtractor.convertResultListDateToHuman(res)),
@@ -29,10 +31,12 @@ export class FollowService {
29 ) 31 )
30 } 32 }
31 33
32 getFollowers (pagination: RestPagination, sort: SortMeta): Observable<ResultList<ActorFollow>> { 34 getFollowers (pagination: RestPagination, sort: SortMeta, search?: string): Observable<ResultList<ActorFollow>> {
33 let params = new HttpParams() 35 let params = new HttpParams()
34 params = this.restService.addRestGetParams(params, pagination, sort) 36 params = this.restService.addRestGetParams(params, pagination, sort)
35 37
38 if (search) params = params.append('search', search)
39
36 return this.authHttp.get<ResultList<ActorFollow>>(FollowService.BASE_APPLICATION_URL + '/followers', { params }) 40 return this.authHttp.get<ResultList<ActorFollow>>(FollowService.BASE_APPLICATION_URL + '/followers', { params })
37 .pipe( 41 .pipe(
38 map(res => this.restExtractor.convertResultListDateToHuman(res)), 42 map(res => this.restExtractor.convertResultListDateToHuman(res)),
diff --git a/client/src/app/+admin/follows/shared/redundancy-checkbox.component.ts b/client/src/app/+admin/follows/shared/redundancy-checkbox.component.ts
index 6d77a0eb4..fa1da26bf 100644
--- a/client/src/app/+admin/follows/shared/redundancy-checkbox.component.ts
+++ b/client/src/app/+admin/follows/shared/redundancy-checkbox.component.ts
@@ -1,5 +1,5 @@
1import { Component, Input } from '@angular/core' 1import { Component, Input } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RedundancyService } from '@app/+admin/follows/shared/redundancy.service' 4import { RedundancyService } from '@app/+admin/follows/shared/redundancy.service'
5 5
@@ -13,24 +13,21 @@ export class RedundancyCheckboxComponent {
13 @Input() host: string 13 @Input() host: string
14 14
15 constructor ( 15 constructor (
16 private notificationsService: NotificationsService, 16 private notifier: Notifier,
17 private redundancyService: RedundancyService, 17 private redundancyService: RedundancyService,
18 private i18n: I18n 18 private i18n: I18n
19 ) { } 19 ) { }
20 20
21 updateRedundancyState () { 21 updateRedundancyState () {
22 this.redundancyService.updateRedundancy(this.host, this.redundancyAllowed) 22 this.redundancyService.updateRedundancy(this.host, this.redundancyAllowed)
23 .subscribe( 23 .subscribe(
24 () => { 24 () => {
25 const stateLabel = this.redundancyAllowed ? this.i18n('enabled') : this.i18n('disabled') 25 const stateLabel = this.redundancyAllowed ? this.i18n('enabled') : this.i18n('disabled')
26 26
27 this.notificationsService.success( 27 this.notifier.success(this.i18n('Redundancy for {{host}} is {{stateLabel}}', { host: this.host, stateLabel }))
28 this.i18n('Success'), 28 },
29 this.i18n('Redundancy for {{host}} is {{stateLabel}}', { host: this.host, stateLabel })
30 )
31 },
32 29
33 err => this.notificationsService.error(this.i18n('Error'), err.message) 30 err => this.notifier.error(err.message)
34 ) 31 )
35 } 32 }
36} 33}
diff --git a/client/src/app/+admin/jobs/jobs-list/jobs-list.component.ts b/client/src/app/+admin/jobs/jobs-list/jobs-list.component.ts
index 866ba1b23..b265e1dd6 100644
--- a/client/src/app/+admin/jobs/jobs-list/jobs-list.component.ts
+++ b/client/src/app/+admin/jobs/jobs-list/jobs-list.component.ts
@@ -1,6 +1,6 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' 2import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { SortMeta } from 'primeng/primeng' 4import { SortMeta } from 'primeng/primeng'
5import { Job } from '../../../../../../shared/index' 5import { Job } from '../../../../../../shared/index'
6import { JobState } from '../../../../../../shared/models' 6import { JobState } from '../../../../../../shared/models'
@@ -25,7 +25,7 @@ export class JobsListComponent extends RestTable implements OnInit {
25 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 25 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
26 26
27 constructor ( 27 constructor (
28 private notificationsService: NotificationsService, 28 private notifier: Notifier,
29 private jobsService: JobService, 29 private jobsService: JobService,
30 private i18n: I18n 30 private i18n: I18n
31 ) { 31 ) {
@@ -34,7 +34,7 @@ export class JobsListComponent extends RestTable implements OnInit {
34 34
35 ngOnInit () { 35 ngOnInit () {
36 this.loadJobState() 36 this.loadJobState()
37 this.loadSort() 37 this.initialize()
38 } 38 }
39 39
40 onJobStateChanged () { 40 onJobStateChanged () {
@@ -53,7 +53,7 @@ export class JobsListComponent extends RestTable implements OnInit {
53 this.totalRecords = resultList.total 53 this.totalRecords = resultList.total
54 }, 54 },
55 55
56 err => this.notificationsService.error(this.i18n('Error'), err.message) 56 err => this.notifier.error(err.message)
57 ) 57 )
58 } 58 }
59 59
diff --git a/client/src/app/+admin/moderation/instance-blocklist/index.ts b/client/src/app/+admin/moderation/instance-blocklist/index.ts
new file mode 100644
index 000000000..3e7a344bb
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/index.ts
@@ -0,0 +1,2 @@
1export * from './instance-account-blocklist.component'
2export * from './instance-server-blocklist.component'
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html
new file mode 100644
index 000000000..7797bc56e
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html
@@ -0,0 +1,22 @@
1<p-table
2 [value]="blockedAccounts" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
4>
5
6 <ng-template pTemplate="header">
7 <tr>
8 <th i18n>Account</th>
9 <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
10 </tr>
11 </ng-template>
12
13 <ng-template pTemplate="body" let-accountBlock>
14 <tr>
15 <td>{{ accountBlock.blockedAccount.nameWithHost }}</td>
16 <td>{{ accountBlock.createdAt }}</td>
17 <td class="action-cell">
18 <button class="unblock-button" (click)="unblockAccount(accountBlock)" i18n>Unmute</button>
19 </td>
20 </tr>
21 </ng-template>
22</p-table>
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.scss b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.scss
new file mode 100644
index 000000000..6028b75ea
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.scss
@@ -0,0 +1,7 @@
1@import '_variables';
2@import '_mixins';
3
4.unblock-button {
5 @include peertube-button;
6 @include grey-button;
7} \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.ts b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.ts
new file mode 100644
index 000000000..032bf745a
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.ts
@@ -0,0 +1,58 @@
1import { Component, OnInit } from '@angular/core'
2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RestPagination, RestTable } from '@app/shared'
5import { SortMeta } from 'primeng/components/common/sortmeta'
6import { AccountBlock, BlocklistService } from '@app/shared/blocklist'
7
8@Component({
9 selector: 'my-instance-account-blocklist',
10 styleUrls: [ './instance-account-blocklist.component.scss' ],
11 templateUrl: './instance-account-blocklist.component.html'
12})
13export class InstanceAccountBlocklistComponent extends RestTable implements OnInit {
14 blockedAccounts: AccountBlock[] = []
15 totalRecords = 0
16 rowsPerPage = 10
17 sort: SortMeta = { field: 'createdAt', order: -1 }
18 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
19
20 constructor (
21 private notifier: Notifier,
22 private blocklistService: BlocklistService,
23 private i18n: I18n
24 ) {
25 super()
26 }
27
28 ngOnInit () {
29 this.initialize()
30 }
31
32 unblockAccount (accountBlock: AccountBlock) {
33 const blockedAccount = accountBlock.blockedAccount
34
35 this.blocklistService.unblockAccountByInstance(blockedAccount)
36 .subscribe(
37 () => {
38 this.notifier.success(
39 this.i18n('Account {{nameWithHost}} unmuted by your instance.', { nameWithHost: blockedAccount.nameWithHost })
40 )
41
42 this.loadData()
43 }
44 )
45 }
46
47 protected loadData () {
48 return this.blocklistService.getInstanceAccountBlocklist(this.pagination, this.sort)
49 .subscribe(
50 resultList => {
51 this.blockedAccounts = resultList.data
52 this.totalRecords = resultList.total
53 },
54
55 err => this.notifier.error(err.message)
56 )
57 }
58}
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
new file mode 100644
index 000000000..f634ba834
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
@@ -0,0 +1,23 @@
1<p-table
2 [value]="blockedServers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
4>
5
6 <ng-template pTemplate="header">
7 <tr>
8 <th i18n>Instance</th>
9 <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
10 <th></th>
11 </tr>
12 </ng-template>
13
14 <ng-template pTemplate="body" let-serverBlock>
15 <tr>
16 <td>{{ serverBlock.blockedServer.host }}</td>
17 <td>{{ serverBlock.createdAt }}</td>
18 <td class="action-cell">
19 <button class="unblock-button" (click)="unblockServer(serverBlock)" i18n>Unmute</button>
20 </td>
21 </tr>
22 </ng-template>
23</p-table>
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss
new file mode 100644
index 000000000..6028b75ea
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.scss
@@ -0,0 +1,7 @@
1@import '_variables';
2@import '_mixins';
3
4.unblock-button {
5 @include peertube-button;
6 @include grey-button;
7} \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.ts b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.ts
new file mode 100644
index 000000000..db3dfcd1c
--- /dev/null
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.ts
@@ -0,0 +1,57 @@
1import { Component, OnInit } from '@angular/core'
2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RestPagination, RestTable } from '@app/shared'
5import { SortMeta } from 'primeng/components/common/sortmeta'
6import { BlocklistService } from '@app/shared/blocklist'
7import { ServerBlock } from '../../../../../../shared'
8
9@Component({
10 selector: 'my-instance-server-blocklist',
11 styleUrls: [ './instance-server-blocklist.component.scss' ],
12 templateUrl: './instance-server-blocklist.component.html'
13})
14export class InstanceServerBlocklistComponent extends RestTable implements OnInit {
15 blockedServers: ServerBlock[] = []
16 totalRecords = 0
17 rowsPerPage = 10
18 sort: SortMeta = { field: 'createdAt', order: -1 }
19 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
20
21 constructor (
22 private notifier: Notifier,
23 private blocklistService: BlocklistService,
24 private i18n: I18n
25 ) {
26 super()
27 }
28
29 ngOnInit () {
30 this.initialize()
31 }
32
33 unblockServer (serverBlock: ServerBlock) {
34 const host = serverBlock.blockedServer.host
35
36 this.blocklistService.unblockServerByInstance(host)
37 .subscribe(
38 () => {
39 this.notifier.success(this.i18n('Instance {{host}} unmuted by your instance.', { host }))
40
41 this.loadData()
42 }
43 )
44 }
45
46 protected loadData () {
47 return this.blocklistService.getInstanceServerBlocklist(this.pagination, this.sort)
48 .subscribe(
49 resultList => {
50 this.blockedServers = resultList.data
51 this.totalRecords = resultList.total
52 },
53
54 err => this.notifier.error(err.message)
55 )
56 }
57}
diff --git a/client/src/app/+admin/moderation/moderation.component.html b/client/src/app/+admin/moderation/moderation.component.html
index 91e87fcd4..01457936c 100644
--- a/client/src/app/+admin/moderation/moderation.component.html
+++ b/client/src/app/+admin/moderation/moderation.component.html
@@ -5,6 +5,10 @@
5 <a *ngIf="hasVideoAbusesRight()" i18n routerLink="video-abuses/list" routerLinkActive="active">Video abuses</a> 5 <a *ngIf="hasVideoAbusesRight()" i18n routerLink="video-abuses/list" routerLinkActive="active">Video abuses</a>
6 6
7 <a *ngIf="hasVideoBlacklistRight()" i18n routerLink="video-blacklist/list" routerLinkActive="active">Blacklisted videos</a> 7 <a *ngIf="hasVideoBlacklistRight()" i18n routerLink="video-blacklist/list" routerLinkActive="active">Blacklisted videos</a>
8
9 <a *ngIf="hasAccountsBlocklistRight()" i18n routerLink="blocklist/accounts" routerLinkActive="active">Muted accounts</a>
10
11 <a *ngIf="hasServersBlocklistRight()" i18n routerLink="blocklist/servers" routerLinkActive="active">Muted servers</a>
8 </div> 12 </div>
9</div> 13</div>
10 14
diff --git a/client/src/app/+admin/moderation/moderation.component.scss b/client/src/app/+admin/moderation/moderation.component.scss
index 02ccfc8ca..13b019c5b 100644
--- a/client/src/app/+admin/moderation/moderation.component.scss
+++ b/client/src/app/+admin/moderation/moderation.component.scss
@@ -10,6 +10,7 @@
10 font-weight: $font-semibold; 10 font-weight: $font-semibold;
11 min-width: 200px; 11 min-width: 200px;
12 display: inline-block; 12 display: inline-block;
13 vertical-align: top;
13} 14}
14 15
15.moderation-expanded-text { 16.moderation-expanded-text {
diff --git a/client/src/app/+admin/moderation/moderation.component.ts b/client/src/app/+admin/moderation/moderation.component.ts
index 0f4efb970..2b2618933 100644
--- a/client/src/app/+admin/moderation/moderation.component.ts
+++ b/client/src/app/+admin/moderation/moderation.component.ts
@@ -16,4 +16,12 @@ export class ModerationComponent {
16 hasVideoBlacklistRight () { 16 hasVideoBlacklistRight () {
17 return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) 17 return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST)
18 } 18 }
19
20 hasAccountsBlocklistRight () {
21 return this.auth.getUser().hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)
22 }
23
24 hasServersBlocklistRight () {
25 return this.auth.getUser().hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)
26 }
19} 27}
diff --git a/client/src/app/+admin/moderation/moderation.routes.ts b/client/src/app/+admin/moderation/moderation.routes.ts
index 6d81b9b36..bc6dd49d5 100644
--- a/client/src/app/+admin/moderation/moderation.routes.ts
+++ b/client/src/app/+admin/moderation/moderation.routes.ts
@@ -4,6 +4,7 @@ import { UserRightGuard } from '@app/core'
4import { VideoAbuseListComponent } from '@app/+admin/moderation/video-abuse-list' 4import { VideoAbuseListComponent } from '@app/+admin/moderation/video-abuse-list'
5import { VideoBlacklistListComponent } from '@app/+admin/moderation/video-blacklist-list' 5import { VideoBlacklistListComponent } from '@app/+admin/moderation/video-blacklist-list'
6import { ModerationComponent } from '@app/+admin/moderation/moderation.component' 6import { ModerationComponent } from '@app/+admin/moderation/moderation.component'
7import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } from '@app/+admin/moderation/instance-blocklist'
7 8
8export const ModerationRoutes: Routes = [ 9export const ModerationRoutes: Routes = [
9 { 10 {
@@ -46,6 +47,28 @@ export const ModerationRoutes: Routes = [
46 title: 'Blacklisted videos' 47 title: 'Blacklisted videos'
47 } 48 }
48 } 49 }
50 },
51 {
52 path: 'blocklist/accounts',
53 component: InstanceAccountBlocklistComponent,
54 canActivate: [ UserRightGuard ],
55 data: {
56 userRight: UserRight.MANAGE_ACCOUNTS_BLOCKLIST,
57 meta: {
58 title: 'Muted accounts'
59 }
60 }
61 },
62 {
63 path: 'blocklist/servers',
64 component: InstanceServerBlocklistComponent,
65 canActivate: [ UserRightGuard ],
66 data: {
67 userRight: UserRight.MANAGE_SERVER_REDUNDANCY,
68 meta: {
69 title: 'Muted instances'
70 }
71 }
49 } 72 }
50 ] 73 ]
51 } 74 }
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
index 3a8424f68..303a788d2 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Moderation comment</h4> 3 <h4 i18n class="modal-title">Moderation comment</h4>
4 <span class="close" aria-hidden="true" (click)="hideModerationCommentModal()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body"> 8 <div class="modal-body">
@@ -14,12 +15,12 @@
14 </div> 15 </div>
15 </div> 16 </div>
16 17
17 <div i18n> 18 <div class="form-group" i18n>
18 This comment can only be seen by you or the other moderators. 19 This comment can only be seen by you or the other moderators.
19 </div> 20 </div>
20 21
21 <div class="form-group inputs"> 22 <div class="form-group inputs">
22 <span i18n class="action-button action-button-cancel" (click)="hideModerationCommentModal()">Cancel</span> 23 <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
23 24
24 <input 25 <input
25 type="submit" i18n-value value="Update this comment" class="action-button-submit" 26 type="submit" i18n-value value="Update this comment" class="action-button-submit"
@@ -29,4 +30,4 @@
29 </form> 30 </form>
30 </div> 31 </div>
31 32
32</ng-template> \ No newline at end of file 33</ng-template>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
index 34ab384d1..f915978ee 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
@@ -1,5 +1,5 @@
1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { FormReactive, VideoAbuseService, VideoAbuseValidatorsService } from '../../../shared' 3import { FormReactive, VideoAbuseService, VideoAbuseValidatorsService } from '../../../shared'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 5import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
@@ -22,7 +22,7 @@ export class ModerationCommentModalComponent extends FormReactive implements OnI
22 constructor ( 22 constructor (
23 protected formValidatorService: FormValidatorService, 23 protected formValidatorService: FormValidatorService,
24 private modalService: NgbModal, 24 private modalService: NgbModal,
25 private notificationsService: NotificationsService, 25 private notifier: Notifier,
26 private videoAbuseService: VideoAbuseService, 26 private videoAbuseService: VideoAbuseService,
27 private videoAbuseValidatorsService: VideoAbuseValidatorsService, 27 private videoAbuseValidatorsService: VideoAbuseValidatorsService,
28 private i18n: I18n 28 private i18n: I18n
@@ -45,29 +45,26 @@ export class ModerationCommentModalComponent extends FormReactive implements OnI
45 }) 45 })
46 } 46 }
47 47
48 hideModerationCommentModal () { 48 hide () {
49 this.abuseToComment = undefined 49 this.abuseToComment = undefined
50 this.openedModal.close() 50 this.openedModal.close()
51 this.form.reset() 51 this.form.reset()
52 } 52 }
53 53
54 async banUser () { 54 async banUser () {
55 const moderationComment: string = this.form.value['moderationComment'] 55 const moderationComment: string = this.form.value[ 'moderationComment' ]
56 56
57 this.videoAbuseService.updateVideoAbuse(this.abuseToComment, { moderationComment }) 57 this.videoAbuseService.updateVideoAbuse(this.abuseToComment, { moderationComment })
58 .subscribe( 58 .subscribe(
59 () => { 59 () => {
60 this.notificationsService.success( 60 this.notifier.success(this.i18n('Comment updated.'))
61 this.i18n('Success'),
62 this.i18n('Comment updated.')
63 )
64 61
65 this.commentUpdated.emit(moderationComment) 62 this.commentUpdated.emit(moderationComment)
66 this.hideModerationCommentModal() 63 this.hide()
67 }, 64 },
68 65
69 err => this.notificationsService.error(this.i18n('Error'), err.message) 66 err => this.notifier.error(err.message)
70 ) 67 )
71 } 68 }
72 69
73} 70}
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
index 287ab3e46..05b549de6 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
@@ -9,7 +9,7 @@
9 <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> 9 <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
10 <th i18n>Video</th> 10 <th i18n>Video</th>
11 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th> 11 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th>
12 <th style="width: 50px;"></th> 12 <th style="width: 120px;"></th>
13 </tr> 13 </tr>
14 </ng-template> 14 </ng-template>
15 15
@@ -41,7 +41,7 @@
41 </td> 41 </td>
42 42
43 <td class="action-cell"> 43 <td class="action-cell">
44 <my-action-dropdown i18n-label label="Actions" [actions]="videoAbuseActions" [entry]="videoAbuse"></my-action-dropdown> 44 <my-action-dropdown placement="bottom-right" i18n-label label="Actions" [actions]="videoAbuseActions" [entry]="videoAbuse"></my-action-dropdown>
45 </td> 45 </td>
46 </tr> 46 </tr>
47 </ng-template> 47 </ng-template>
@@ -51,15 +51,15 @@
51 <td class="moderation-expanded" colspan="6"> 51 <td class="moderation-expanded" colspan="6">
52 <div> 52 <div>
53 <span i18n class="moderation-expanded-label">Reason:</span> 53 <span i18n class="moderation-expanded-label">Reason:</span>
54 <span class="moderation-expanded-text">{{ videoAbuse.reason }}</span> 54 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.reason)"></span>
55 </div> 55 </div>
56 <div *ngIf="videoAbuse.moderationComment"> 56 <div *ngIf="videoAbuse.moderationComment">
57 <span i18n class="moderation-expanded-label">Moderation comment:</span> 57 <span i18n class="moderation-expanded-label">Moderation comment:</span>
58 <span class="moderation-expanded-text">{{ videoAbuse.moderationComment }}</span> 58 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.moderationComment)"></span>
59 </div> 59 </div>
60 </td> 60 </td>
61 </tr> 61 </tr>
62 </ng-template> 62 </ng-template>
63</p-table> 63</p-table>
64 64
65<my-moderation-comment-modal #moderationCommentModal (commentUpdated)="onModerationCommentUpdated()"></my-moderation-comment-modal> \ No newline at end of file 65<my-moderation-comment-modal #moderationCommentModal (commentUpdated)="onModerationCommentUpdated()"></my-moderation-comment-modal>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
index 681db7434..00c871659 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
@@ -1,6 +1,6 @@
1import { Component, OnInit, ViewChild } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { Account } from '../../../shared/account/account.model' 2import { Account } from '../../../shared/account/account.model'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { SortMeta } from 'primeng/components/common/sortmeta' 4import { SortMeta } from 'primeng/components/common/sortmeta'
5import { VideoAbuse, VideoAbuseState } from '../../../../../../shared' 5import { VideoAbuse, VideoAbuseState } from '../../../../../../shared'
6import { RestPagination, RestTable, VideoAbuseService } from '../../../shared' 6import { RestPagination, RestTable, VideoAbuseService } from '../../../shared'
@@ -9,6 +9,7 @@ import { DropdownAction } from '../../../shared/buttons/action-dropdown.componen
9import { ConfirmService } from '../../../core/index' 9import { ConfirmService } from '../../../core/index'
10import { ModerationCommentModalComponent } from './moderation-comment-modal.component' 10import { ModerationCommentModalComponent } from './moderation-comment-modal.component'
11import { Video } from '../../../shared/video/video.model' 11import { Video } from '../../../shared/video/video.model'
12import { MarkdownService } from '@app/shared/renderer'
12 13
13@Component({ 14@Component({
14 selector: 'my-video-abuse-list', 15 selector: 'my-video-abuse-list',
@@ -27,16 +28,17 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
27 videoAbuseActions: DropdownAction<VideoAbuse>[] = [] 28 videoAbuseActions: DropdownAction<VideoAbuse>[] = []
28 29
29 constructor ( 30 constructor (
30 private notificationsService: NotificationsService, 31 private notifier: Notifier,
31 private videoAbuseService: VideoAbuseService, 32 private videoAbuseService: VideoAbuseService,
32 private confirmService: ConfirmService, 33 private confirmService: ConfirmService,
33 private i18n: I18n 34 private i18n: I18n,
35 private markdownRenderer: MarkdownService
34 ) { 36 ) {
35 super() 37 super()
36 38
37 this.videoAbuseActions = [ 39 this.videoAbuseActions = [
38 { 40 {
39 label: this.i18n('Delete'), 41 label: this.i18n('Delete this report'),
40 handler: videoAbuse => this.removeVideoAbuse(videoAbuse) 42 handler: videoAbuse => this.removeVideoAbuse(videoAbuse)
41 }, 43 },
42 { 44 {
@@ -57,7 +59,7 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
57 } 59 }
58 60
59 ngOnInit () { 61 ngOnInit () {
60 this.loadSort() 62 this.initialize()
61 } 63 }
62 64
63 openModerationCommentModal (videoAbuse: VideoAbuse) { 65 openModerationCommentModal (videoAbuse: VideoAbuse) {
@@ -85,19 +87,16 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
85 } 87 }
86 88
87 async removeVideoAbuse (videoAbuse: VideoAbuse) { 89 async removeVideoAbuse (videoAbuse: VideoAbuse) {
88 const res = await this.confirmService.confirm(this.i18n('Do you really want to delete this abuse?'), this.i18n('Delete')) 90 const res = await this.confirmService.confirm(this.i18n('Do you really want to delete this abuse report?'), this.i18n('Delete'))
89 if (res === false) return 91 if (res === false) return
90 92
91 this.videoAbuseService.removeVideoAbuse(videoAbuse).subscribe( 93 this.videoAbuseService.removeVideoAbuse(videoAbuse).subscribe(
92 () => { 94 () => {
93 this.notificationsService.success( 95 this.notifier.success(this.i18n('Abuse deleted.'))
94 this.i18n('Success'),
95 this.i18n('Abuse deleted.')
96 )
97 this.loadData() 96 this.loadData()
98 }, 97 },
99 98
100 err => this.notificationsService.error(this.i18n('Error'), err.message) 99 err => this.notifier.error(err.message)
101 ) 100 )
102 } 101 }
103 102
@@ -106,11 +105,15 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
106 .subscribe( 105 .subscribe(
107 () => this.loadData(), 106 () => this.loadData(),
108 107
109 err => this.notificationsService.error(this.i18n('Error'), err.message) 108 err => this.notifier.error(err.message)
110 ) 109 )
111 110
112 } 111 }
113 112
113 toHtml (text: string) {
114 return this.markdownRenderer.textMarkdownToHTML(text)
115 }
116
114 protected loadData () { 117 protected loadData () {
115 return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort) 118 return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort)
116 .subscribe( 119 .subscribe(
@@ -119,7 +122,7 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
119 this.totalRecords = resultList.total 122 this.totalRecords = resultList.total
120 }, 123 },
121 124
122 err => this.notificationsService.error(this.i18n('Error'), err.message) 125 err => this.notifier.error(err.message)
123 ) 126 )
124 } 127 }
125} 128}
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
index 0585e0490..247f441c1 100644
--- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
@@ -7,8 +7,9 @@
7 <th style="width: 40px"></th> 7 <th style="width: 40px"></th>
8 <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th> 8 <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th>
9 <th i18n>Sensitive</th> 9 <th i18n>Sensitive</th>
10 <th i18n>Unfederated</th>
10 <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th> 11 <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th>
11 <th style="width: 50px;"></th> 12 <th style="width: 120px;"></th>
12 </tr> 13 </tr>
13 </ng-template> 14 </ng-template>
14 15
@@ -26,20 +27,21 @@
26 </a> 27 </a>
27 </td> 28 </td>
28 29
29 <td>{{ videoBlacklist.video.nsfw }}</td> 30 <td>{{ booleanToText(videoBlacklist.video.nsfw) }}</td>
31 <td>{{ booleanToText(videoBlacklist.unfederated) }}</td>
30 <td>{{ videoBlacklist.createdAt }}</td> 32 <td>{{ videoBlacklist.createdAt }}</td>
31 33
32 <td class="action-cell"> 34 <td class="action-cell">
33 <my-action-dropdown i18n-label label="Actions" [actions]="videoBlacklistActions" [entry]="videoBlacklist"></my-action-dropdown> 35 <my-action-dropdown i18n-label placement="bottom-right" label="Actions" [actions]="videoBlacklistActions" [entry]="videoBlacklist"></my-action-dropdown>
34 </td> 36 </td>
35 </tr> 37 </tr>
36 </ng-template> 38 </ng-template>
37 39
38 <ng-template pTemplate="rowexpansion" let-videoBlacklist> 40 <ng-template pTemplate="rowexpansion" let-videoBlacklist>
39 <tr> 41 <tr>
40 <td class="moderation-expanded" colspan="5"> 42 <td class="moderation-expanded" colspan="6">
41 <span i18n class="moderation-expanded-label">Blacklist reason:</span> 43 <span i18n class="moderation-expanded-label">Blacklist reason:</span>
42 <span class="moderation-expanded-text">{{ videoBlacklist.reason }}</span> 44 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoBlacklist.reason)"></span>
43 </td> 45 </td>
44 </tr> 46 </tr>
45 </ng-template> 47 </ng-template>
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
index bb051d00f..b27bbbfef 100644
--- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
@@ -1,12 +1,13 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { SortMeta } from 'primeng/components/common/sortmeta' 2import { SortMeta } from 'primeng/components/common/sortmeta'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { ConfirmService } from '../../../core' 4import { ConfirmService } from '../../../core'
5import { RestPagination, RestTable, VideoBlacklistService } from '../../../shared' 5import { RestPagination, RestTable, VideoBlacklistService } from '../../../shared'
6import { VideoBlacklist } from '../../../../../../shared' 6import { VideoBlacklist } from '../../../../../../shared'
7import { I18n } from '@ngx-translate/i18n-polyfill' 7import { I18n } from '@ngx-translate/i18n-polyfill'
8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component' 8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component'
9import { Video } from '../../../shared/video/video.model' 9import { Video } from '../../../shared/video/video.model'
10import { MarkdownService } from '@app/shared/renderer'
10 11
11@Component({ 12@Component({
12 selector: 'my-video-blacklist-list', 13 selector: 'my-video-blacklist-list',
@@ -23,9 +24,10 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
23 videoBlacklistActions: DropdownAction<VideoBlacklist>[] = [] 24 videoBlacklistActions: DropdownAction<VideoBlacklist>[] = []
24 25
25 constructor ( 26 constructor (
26 private notificationsService: NotificationsService, 27 private notifier: Notifier,
27 private confirmService: ConfirmService, 28 private confirmService: ConfirmService,
28 private videoBlacklistService: VideoBlacklistService, 29 private videoBlacklistService: VideoBlacklistService,
30 private markdownRenderer: MarkdownService,
29 private i18n: I18n 31 private i18n: I18n
30 ) { 32 ) {
31 super() 33 super()
@@ -39,13 +41,23 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
39 } 41 }
40 42
41 ngOnInit () { 43 ngOnInit () {
42 this.loadSort() 44 this.initialize()
43 } 45 }
44 46
45 getVideoUrl (videoBlacklist: VideoBlacklist) { 47 getVideoUrl (videoBlacklist: VideoBlacklist) {
46 return Video.buildClientUrl(videoBlacklist.video.uuid) 48 return Video.buildClientUrl(videoBlacklist.video.uuid)
47 } 49 }
48 50
51 booleanToText (value: boolean) {
52 if (value === true) return this.i18n('yes')
53
54 return this.i18n('no')
55 }
56
57 toHtml (text: string) {
58 return this.markdownRenderer.textMarkdownToHTML(text)
59 }
60
49 async removeVideoFromBlacklist (entry: VideoBlacklist) { 61 async removeVideoFromBlacklist (entry: VideoBlacklist) {
50 const confirmMessage = this.i18n( 62 const confirmMessage = this.i18n(
51 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.' 63 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.'
@@ -56,14 +68,11 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
56 68
57 this.videoBlacklistService.removeVideoFromBlacklist(entry.video.id).subscribe( 69 this.videoBlacklistService.removeVideoFromBlacklist(entry.video.id).subscribe(
58 () => { 70 () => {
59 this.notificationsService.success( 71 this.notifier.success(this.i18n('Video {{name}} removed from the blacklist.', { name: entry.video.name }))
60 this.i18n('Success'),
61 this.i18n('Video {{name}} removed from the blacklist.', { name: entry.video.name })
62 )
63 this.loadData() 72 this.loadData()
64 }, 73 },
65 74
66 err => this.notificationsService.error(this.i18n('Error'), err.message) 75 err => this.notifier.error(err.message)
67 ) 76 )
68 } 77 }
69 78
@@ -75,7 +84,7 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
75 this.totalRecords = resultList.total 84 this.totalRecords = resultList.total
76 }, 85 },
77 86
78 err => this.notificationsService.error(this.i18n('Error'), err.message) 87 err => this.notifier.error(err.message)
79 ) 88 )
80 } 89 }
81} 90}
diff --git a/client/src/app/+admin/users/user-edit/index.ts b/client/src/app/+admin/users/user-edit/index.ts
index fd80a02e0..ec734ef92 100644
--- a/client/src/app/+admin/users/user-edit/index.ts
+++ b/client/src/app/+admin/users/user-edit/index.ts
@@ -1,2 +1,3 @@
1export * from './user-create.component' 1export * from './user-create.component'
2export * from './user-update.component' 2export * from './user-update.component'
3export * from './user-password.component'
diff --git a/client/src/app/+admin/users/user-edit/user-create.component.ts b/client/src/app/+admin/users/user-edit/user-create.component.ts
index dd8e4efd5..137ecfcbd 100644
--- a/client/src/app/+admin/users/user-edit/user-create.component.ts
+++ b/client/src/app/+admin/users/user-edit/user-create.component.ts
@@ -1,7 +1,6 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier, ServerService } from '@app/core'
4import { ServerService } from '../../../core'
5import { UserCreate, UserRole } from '../../../../../../shared' 4import { UserCreate, UserRole } from '../../../../../../shared'
6import { UserEdit } from './user-edit' 5import { UserEdit } from './user-edit'
7import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -24,7 +23,7 @@ export class UserCreateComponent extends UserEdit implements OnInit {
24 protected configService: ConfigService, 23 protected configService: ConfigService,
25 private userValidatorsService: UserValidatorsService, 24 private userValidatorsService: UserValidatorsService,
26 private router: Router, 25 private router: Router,
27 private notificationsService: NotificationsService, 26 private notifier: Notifier,
28 private userService: UserService, 27 private userService: UserService,
29 private i18n: I18n 28 private i18n: I18n
30 ) { 29 ) {
@@ -60,10 +59,7 @@ export class UserCreateComponent extends UserEdit implements OnInit {
60 59
61 this.userService.addUser(userCreate).subscribe( 60 this.userService.addUser(userCreate).subscribe(
62 () => { 61 () => {
63 this.notificationsService.success( 62 this.notifier.success(this.i18n('User {{username}} created.', { username: userCreate.username }))
64 this.i18n('Success'),
65 this.i18n('User {{username}} created.', { username: userCreate.username })
66 )
67 this.router.navigate([ '/admin/users/list' ]) 63 this.router.navigate([ '/admin/users/list' ])
68 }, 64 },
69 65
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.html b/client/src/app/+admin/users/user-edit/user-edit.component.html
index 56cf7d17d..c6566da24 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.component.html
+++ b/client/src/app/+admin/users/user-edit/user-edit.component.html
@@ -81,3 +81,17 @@
81 81
82 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> 82 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
83</form> 83</form>
84
85<div *ngIf="!isCreation()" class="danger-zone">
86 <div class="account-title" i18n>Danger Zone</div>
87
88 <div class="form-group reset-password-email">
89 <label i18n>Send a link to reset the password by email to the user</label>
90 <button (click)="resetPassword()" i18n>Ask for new password</button>
91 </div>
92
93 <div class="form-group">
94 <label i18n>Manually set the user password</label>
95 <my-user-password [userId]="userId"></my-user-password>
96 </div>
97</div>
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.scss b/client/src/app/+admin/users/user-edit/user-edit.component.scss
index 6675f65cc..c1cc4ca45 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.component.scss
+++ b/client/src/app/+admin/users/user-edit/user-edit.component.scss
@@ -14,7 +14,7 @@ input:not([type=submit]) {
14 @include peertube-select-container(340px); 14 @include peertube-select-container(340px);
15} 15}
16 16
17input[type=submit] { 17input[type=submit], button {
18 @include peertube-button; 18 @include peertube-button;
19 @include orange-button; 19 @include orange-button;
20 20
@@ -25,3 +25,23 @@ input[type=submit] {
25 margin-top: 5px; 25 margin-top: 5px;
26 font-size: 11px; 26 font-size: 11px;
27} 27}
28
29.account-title {
30 @include in-content-small-title;
31
32 margin-top: 55px;
33 margin-bottom: 30px;
34}
35
36.danger-zone {
37 .reset-password-email {
38 margin-bottom: 30px;
39 padding-bottom: 30px;
40 border-bottom: 1px solid rgba(0, 0, 0, 0.1);
41
42 button {
43 display: block;
44 margin-top: 0;
45 }
46 }
47}
diff --git a/client/src/app/+admin/users/user-edit/user-edit.ts b/client/src/app/+admin/users/user-edit/user-edit.ts
index 07b087b5b..649b35b0c 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.ts
+++ b/client/src/app/+admin/users/user-edit/user-edit.ts
@@ -1,14 +1,14 @@
1import { ServerService } from '../../../core' 1import { ServerService } from '../../../core'
2import { FormReactive } from '../../../shared' 2import { FormReactive } from '../../../shared'
3import { USER_ROLE_LABELS, VideoResolution } from '../../../../../../shared' 3import { USER_ROLE_LABELS, VideoResolution } from '../../../../../../shared'
4import { EditCustomConfigComponent } from '../../../+admin/config/edit-custom-config/'
5import { ConfigService } from '@app/+admin/config/shared/config.service' 4import { ConfigService } from '@app/+admin/config/shared/config.service'
6 5
7export abstract class UserEdit extends FormReactive { 6export abstract class UserEdit extends FormReactive {
8
9 videoQuotaOptions: { value: string, label: string }[] = [] 7 videoQuotaOptions: { value: string, label: string }[] = []
10 videoQuotaDailyOptions: { value: string, label: string }[] = [] 8 videoQuotaDailyOptions: { value: string, label: string }[] = []
11 roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] })) 9 roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] }))
10 username: string
11 userId: number
12 12
13 protected abstract serverService: ServerService 13 protected abstract serverService: ServerService
14 protected abstract configService: ConfigService 14 protected abstract configService: ConfigService
@@ -23,7 +23,9 @@ export abstract class UserEdit extends FormReactive {
23 } 23 }
24 24
25 computeQuotaWithTranscoding () { 25 computeQuotaWithTranscoding () {
26 const resolutions = this.serverService.getConfig().transcoding.enabledResolutions 26 const transcodingConfig = this.serverService.getConfig().transcoding
27
28 const resolutions = transcodingConfig.enabledResolutions
27 const higherResolution = VideoResolution.H_1080P 29 const higherResolution = VideoResolution.H_1080P
28 let multiplier = 0 30 let multiplier = 0
29 31
@@ -31,9 +33,15 @@ export abstract class UserEdit extends FormReactive {
31 multiplier += resolution / higherResolution 33 multiplier += resolution / higherResolution
32 } 34 }
33 35
36 if (transcodingConfig.hls.enabled) multiplier *= 2
37
34 return multiplier * parseInt(this.form.value['videoQuota'], 10) 38 return multiplier * parseInt(this.form.value['videoQuota'], 10)
35 } 39 }
36 40
41 resetPassword () {
42 return
43 }
44
37 protected buildQuotaOptions () { 45 protected buildQuotaOptions () {
38 // These are used by a HTML select, so convert key into strings 46 // These are used by a HTML select, so convert key into strings
39 this.videoQuotaOptions = this.configService 47 this.videoQuotaOptions = this.configService
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.html b/client/src/app/+admin/users/user-edit/user-password.component.html
new file mode 100644
index 000000000..a1e1f6216
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.html
@@ -0,0 +1,21 @@
1<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
2 <div class="form-group">
3
4 <div class="input-group">
5 <input id="password" [attr.type]="showPassword ? 'text' : 'password'"
6 formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }"
7 >
8 <div class="input-group-append">
9 <button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button">
10 <ng-container *ngIf="!showPassword" i18n>Show</ng-container>
11 <ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
12 </button>
13 </div>
14 </div>
15 <div *ngIf="formErrors.password" class="form-error">
16 {{ formErrors.password }}
17 </div>
18 </div>
19
20 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
21</form>
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.scss b/client/src/app/+admin/users/user-edit/user-password.component.scss
new file mode 100644
index 000000000..217d585af
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.scss
@@ -0,0 +1,22 @@
1@import '_variables';
2@import '_mixins';
3
4input:not([type=submit]):not([type=checkbox]) {
5 @include peertube-input-text(340px);
6
7 display: block;
8 border-top-right-radius: 0;
9 border-bottom-right-radius: 0;
10 border-right: none;
11}
12
13input[type=submit] {
14 @include peertube-button;
15 @include orange-button;
16
17 margin-top: 10px;
18}
19
20.input-group-append {
21 height: 30px;
22}
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.ts b/client/src/app/+admin/users/user-edit/user-password.component.ts
new file mode 100644
index 000000000..5b3040440
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.ts
@@ -0,0 +1,64 @@
1import { Component, Input, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router'
3import { UserService } from '@app/shared/users/user.service'
4import { Notifier } from '../../../core'
5import { User, UserUpdate } from '../../../../../../shared'
6import { I18n } from '@ngx-translate/i18n-polyfill'
7import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
8import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service'
9import { FormReactive } from '../../../shared'
10
11@Component({
12 selector: 'my-user-password',
13 templateUrl: './user-password.component.html',
14 styleUrls: [ './user-password.component.scss' ]
15})
16export class UserPasswordComponent extends FormReactive implements OnInit {
17 error: string
18 username: string
19 showPassword = false
20
21 @Input() userId: number
22
23 constructor (
24 protected formValidatorService: FormValidatorService,
25 private userValidatorsService: UserValidatorsService,
26 private route: ActivatedRoute,
27 private router: Router,
28 private notifier: Notifier,
29 private userService: UserService,
30 private i18n: I18n
31 ) {
32 super()
33 }
34
35 ngOnInit () {
36 this.buildForm({
37 password: this.userValidatorsService.USER_PASSWORD
38 })
39 }
40
41 formValidated () {
42 this.error = undefined
43
44 const userUpdate: UserUpdate = this.form.value
45
46 this.userService.updateUser(this.userId, userUpdate).subscribe(
47 () => {
48 this.notifier.success(
49 this.i18n('Password changed for user {{username}}.', { username: this.username })
50 )
51 },
52
53 err => this.error = err.message
54 )
55 }
56
57 togglePasswordVisibility () {
58 this.showPassword = !this.showPassword
59 }
60
61 getFormButtonTitle () {
62 return this.i18n('Update user password')
63 }
64}
diff --git a/client/src/app/+admin/users/user-edit/user-update.component.ts b/client/src/app/+admin/users/user-edit/user-update.component.ts
index cd3885a99..94ef87b08 100644
--- a/client/src/app/+admin/users/user-edit/user-update.component.ts
+++ b/client/src/app/+admin/users/user-edit/user-update.component.ts
@@ -1,7 +1,7 @@
1import { Component, OnDestroy, OnInit } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { Subscription } from 'rxjs' 3import { Subscription } from 'rxjs'
4import { NotificationsService } from 'angular2-notifications' 4import { Notifier } from '@app/core'
5import { ServerService } from '../../../core' 5import { ServerService } from '../../../core'
6import { UserEdit } from './user-edit' 6import { UserEdit } from './user-edit'
7import { User, UserUpdate } from '../../../../../../shared' 7import { User, UserUpdate } from '../../../../../../shared'
@@ -19,6 +19,7 @@ import { UserService } from '@app/shared'
19export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy { 19export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
20 error: string 20 error: string
21 userId: number 21 userId: number
22 userEmail: string
22 username: string 23 username: string
23 24
24 private paramsSub: Subscription 25 private paramsSub: Subscription
@@ -30,7 +31,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
30 private userValidatorsService: UserValidatorsService, 31 private userValidatorsService: UserValidatorsService,
31 private route: ActivatedRoute, 32 private route: ActivatedRoute,
32 private router: Router, 33 private router: Router,
33 private notificationsService: NotificationsService, 34 private notifier: Notifier,
34 private userService: UserService, 35 private userService: UserService,
35 private i18n: I18n 36 private i18n: I18n
36 ) { 37 ) {
@@ -73,10 +74,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
73 74
74 this.userService.updateUser(this.userId, userUpdate).subscribe( 75 this.userService.updateUser(this.userId, userUpdate).subscribe(
75 () => { 76 () => {
76 this.notificationsService.success( 77 this.notifier.success(this.i18n('User {{username}} updated.', { username: this.username }))
77 this.i18n('Success'),
78 this.i18n('User {{username}} updated.', { username: this.username })
79 )
80 this.router.navigate([ '/admin/users/list' ]) 78 this.router.navigate([ '/admin/users/list' ])
81 }, 79 },
82 80
@@ -92,9 +90,22 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
92 return this.i18n('Update user') 90 return this.i18n('Update user')
93 } 91 }
94 92
93 resetPassword () {
94 this.userService.askResetPassword(this.userEmail).subscribe(
95 () => {
96 this.notifier.success(
97 this.i18n('An email asking for password reset has been sent to {{username}}.', { username: this.username })
98 )
99 },
100
101 err => this.error = err.message
102 )
103 }
104
95 private onUserFetched (userJson: User) { 105 private onUserFetched (userJson: User) {
96 this.userId = userJson.id 106 this.userId = userJson.id
97 this.username = userJson.username 107 this.username = userJson.username
108 this.userEmail = userJson.email
98 109
99 this.form.patchValue({ 110 this.form.patchValue({
100 email: userJson.email, 111 email: userJson.email,
diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html
index cca057ba1..69a4616a3 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.html
+++ b/client/src/app/+admin/users/user-list/user-list.component.html
@@ -2,7 +2,7 @@
2 <div i18n class="form-sub-title">Users list</div> 2 <div i18n class="form-sub-title">Users list</div>
3 3
4 <a class="add-button" routerLink="/admin/users/create"> 4 <a class="add-button" routerLink="/admin/users/create">
5 <span class="icon icon-add"></span> 5 <my-global-icon iconName="add"></my-global-icon>
6 <ng-container i18n>Create user</ng-container> 6 <ng-container i18n>Create user</ng-container>
7 </a> 7 </a>
8</div> 8</div>
@@ -10,9 +10,32 @@
10<p-table 10<p-table
11 [value]="users" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" 11 [value]="users" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
12 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" 12 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id"
13 [(selection)]="selectedUsers"
13> 14>
15 <ng-template pTemplate="caption">
16 <div class="caption">
17 <div>
18 <my-action-dropdown
19 *ngIf="isInSelectionMode()" i18n-label label="Batch actions" theme="orange"
20 [actions]="bulkUserActions" [entry]="selectedUsers"
21 >
22 </my-action-dropdown>
23 </div>
24
25 <div>
26 <input
27 type="text" name="table-filter" id="table-filter" i18n-placeholder placeholder="Filter..."
28 (keyup)="onSearch($event.target.value)"
29 >
30 </div>
31 </div>
32 </ng-template>
33
14 <ng-template pTemplate="header"> 34 <ng-template pTemplate="header">
15 <tr> 35 <tr>
36 <th style="width: 40px">
37 <p-tableHeaderCheckbox></p-tableHeaderCheckbox>
38 </th>
16 <th style="width: 40px"></th> 39 <th style="width: 40px"></th>
17 <th i18n pSortableColumn="username">Username <p-sortIcon field="username"></p-sortIcon></th> 40 <th i18n pSortableColumn="username">Username <p-sortIcon field="username"></p-sortIcon></th>
18 <th i18n>Email</th> 41 <th i18n>Email</th>
@@ -25,22 +48,42 @@
25 48
26 <ng-template pTemplate="body" let-expanded="expanded" let-user> 49 <ng-template pTemplate="body" let-expanded="expanded" let-user>
27 50
28 <tr [ngClass]="{ banned: user.blocked }"> 51 <tr [pSelectableRow]="user" [ngClass]="{ banned: user.blocked }">
52 <td>
53 <p-tableCheckbox [value]="user"></p-tableCheckbox>
54 </td>
55
29 <td> 56 <td>
30 <span *ngIf="user.blockedReason" class="expander" [pRowToggler]="user"> 57 <span *ngIf="user.blockedReason" class="expander" [pRowToggler]="user">
31 <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> 58 <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i>
32 </span> 59 </span>
33 </td> 60 </td>
61
34 <td> 62 <td>
35 {{ user.username }} 63 <a i18n-title title="Go to the account page" target="_blank" rel="noopener noreferrer" [routerLink]="[ '/accounts/' + user.username ]">
36 <span *ngIf="user.blocked" class="banned-info">(banned)</span> 64 {{ user.username }}
65 <span i18n *ngIf="user.blocked" class="banned-info">(banned)</span>
66 </a>
37 </td> 67 </td>
38 <td>{{ user.email }}</td> 68
69 <td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus">{{ user.email }}</td>
70
71 <ng-template #emailWithVerificationStatus>
72 <td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login">
73 <em>? {{ user.email }}</em>
74 </td>
75 <ng-template #emailVerifiedNotFalse>
76 <td i18n-title title="User's email is verified / User can login without email verification">
77 &#x2713; {{ user.email }}
78 </td>
79 </ng-template>
80 </ng-template>
81
39 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td> 82 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td>
40 <td>{{ user.roleLabel }}</td> 83 <td>{{ user.roleLabel }}</td>
41 <td>{{ user.createdAt }}</td> 84 <td>{{ user.createdAt }}</td>
42 <td class="action-cell"> 85 <td class="action-cell">
43 <my-user-moderation-dropdown [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()"> 86 <my-user-moderation-dropdown *ngIf="!isInSelectionMode()" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()">
44 </my-user-moderation-dropdown> 87 </my-user-moderation-dropdown>
45 </td> 88 </td>
46 </tr> 89 </tr>
@@ -56,3 +99,4 @@
56 </ng-template> 99 </ng-template>
57</p-table> 100</p-table>
58 101
102<my-user-ban-modal #userBanModal (userBanned)="onUserChanged()"></my-user-ban-modal>
diff --git a/client/src/app/+admin/users/user-list/user-list.component.scss b/client/src/app/+admin/users/user-list/user-list.component.scss
index 47291918d..5274be01c 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.scss
+++ b/client/src/app/+admin/users/user-list/user-list.component.scss
@@ -2,7 +2,7 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.add-button { 4.add-button {
5 @include create-button('../../../../assets/images/global/add.svg'); 5 @include create-button;
6} 6}
7 7
8tr.banned { 8tr.banned {
@@ -15,4 +15,12 @@ tr.banned {
15 15
16.ban-reason-label { 16.ban-reason-label {
17 font-weight: $font-semibold; 17 font-weight: $font-semibold;
18} \ No newline at end of file 18}
19
20.caption {
21 justify-content: space-between;
22
23 input {
24 @include peertube-input-text(250px);
25 }
26}
diff --git a/client/src/app/+admin/users/user-list/user-list.component.ts b/client/src/app/+admin/users/user-list/user-list.component.ts
index dee3ed643..66ab796f9 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.ts
+++ b/client/src/app/+admin/users/user-list/user-list.component.ts
@@ -1,10 +1,12 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { SortMeta } from 'primeng/components/common/sortmeta' 3import { SortMeta } from 'primeng/components/common/sortmeta'
4import { ConfirmService } from '../../../core' 4import { ConfirmService, ServerService } from '../../../core'
5import { RestPagination, RestTable, UserService } from '../../../shared' 5import { RestPagination, RestTable, UserService } from '../../../shared'
6import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
7import { User } from '../../../../../../shared' 7import { User } from '../../../../../../shared'
8import { UserBanModalComponent } from '@app/shared/moderation'
9import { DropdownAction } from '@app/shared/buttons/action-dropdown.component'
8 10
9@Component({ 11@Component({
10 selector: 'my-user-list', 12 selector: 'my-user-list',
@@ -12,38 +14,139 @@ import { User } from '../../../../../../shared'
12 styleUrls: [ './user-list.component.scss' ] 14 styleUrls: [ './user-list.component.scss' ]
13}) 15})
14export class UserListComponent extends RestTable implements OnInit { 16export class UserListComponent extends RestTable implements OnInit {
17 @ViewChild('userBanModal') userBanModal: UserBanModalComponent
18
15 users: User[] = [] 19 users: User[] = []
16 totalRecords = 0 20 totalRecords = 0
17 rowsPerPage = 10 21 rowsPerPage = 10
18 sort: SortMeta = { field: 'createdAt', order: 1 } 22 sort: SortMeta = { field: 'createdAt', order: 1 }
19 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 23 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
20 24
25 selectedUsers: User[] = []
26 bulkUserActions: DropdownAction<User[]>[] = []
27
21 constructor ( 28 constructor (
22 private notificationsService: NotificationsService, 29 private notifier: Notifier,
23 private confirmService: ConfirmService, 30 private confirmService: ConfirmService,
31 private serverService: ServerService,
24 private userService: UserService, 32 private userService: UserService,
25 private i18n: I18n 33 private i18n: I18n
26 ) { 34 ) {
27 super() 35 super()
28 } 36 }
29 37
38 get requiresEmailVerification () {
39 return this.serverService.getConfig().signup.requiresEmailVerification
40 }
41
30 ngOnInit () { 42 ngOnInit () {
31 this.loadSort() 43 this.initialize()
44
45 this.bulkUserActions = [
46 {
47 label: this.i18n('Delete'),
48 handler: users => this.removeUsers(users)
49 },
50 {
51 label: this.i18n('Ban'),
52 handler: users => this.openBanUserModal(users),
53 isDisplayed: users => users.every(u => u.blocked === false)
54 },
55 {
56 label: this.i18n('Unban'),
57 handler: users => this.unbanUsers(users),
58 isDisplayed: users => users.every(u => u.blocked === true)
59 },
60 {
61 label: this.i18n('Set Email as Verified'),
62 handler: users => this.setEmailsAsVerified(users),
63 isDisplayed: users => this.requiresEmailVerification && users.every(u => !u.blocked && u.emailVerified === false)
64 }
65 ]
66 }
67
68 openBanUserModal (users: User[]) {
69 for (const user of users) {
70 if (user.username === 'root') {
71 this.notifier.error(this.i18n('You cannot ban root.'))
72 return
73 }
74 }
75
76 this.userBanModal.openModal(users)
32 } 77 }
33 78
34 onUserChanged () { 79 onUserChanged () {
35 this.loadData() 80 this.loadData()
36 } 81 }
37 82
83 async unbanUsers (users: User[]) {
84 const message = this.i18n('Do you really want to unban {{num}} users?', { num: users.length })
85
86 const res = await this.confirmService.confirm(message, this.i18n('Unban'))
87 if (res === false) return
88
89 this.userService.unbanUsers(users)
90 .subscribe(
91 () => {
92 const message = this.i18n('{{num}} users unbanned.', { num: users.length })
93
94 this.notifier.success(message)
95 this.loadData()
96 },
97
98 err => this.notifier.error(err.message)
99 )
100 }
101
102 async removeUsers (users: User[]) {
103 for (const user of users) {
104 if (user.username === 'root') {
105 this.notifier.error(this.i18n('You cannot delete root.'))
106 return
107 }
108 }
109
110 const message = this.i18n('If you remove these users, you will not be able to create others with the same username!')
111 const res = await this.confirmService.confirm(message, this.i18n('Delete'))
112 if (res === false) return
113
114 this.userService.removeUser(users).subscribe(
115 () => {
116 this.notifier.success(this.i18n('{{num}} users deleted.', { num: users.length }))
117 this.loadData()
118 },
119
120 err => this.notifier.error(err.message)
121 )
122 }
123
124 async setEmailsAsVerified (users: User[]) {
125 this.userService.updateUsers(users, { emailVerified: true }).subscribe(
126 () => {
127 this.notifier.success(this.i18n('{{num}} users email set as verified.', { num: users.length }))
128 this.loadData()
129 },
130
131 err => this.notifier.error(err.message)
132 )
133 }
134
135 isInSelectionMode () {
136 return this.selectedUsers.length !== 0
137 }
138
38 protected loadData () { 139 protected loadData () {
39 this.userService.getUsers(this.pagination, this.sort) 140 this.selectedUsers = []
40 .subscribe( 141
41 resultList => { 142 this.userService.getUsers(this.pagination, this.sort, this.search)
42 this.users = resultList.data 143 .subscribe(
43 this.totalRecords = resultList.total 144 resultList => {
44 }, 145 this.users = resultList.data
45 146 this.totalRecords = resultList.total
46 err => this.notificationsService.error(this.i18n('Error'), err.message) 147 },
47 ) 148
149 err => this.notifier.error(err.message)
150 )
48 } 151 }
49} 152}
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html
new file mode 100644
index 000000000..a96a11f5e
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html
@@ -0,0 +1,26 @@
1<div class="admin-sub-header">
2 <div i18n class="form-sub-title">Muted accounts</div>
3</div>
4
5<p-table
6 [value]="blockedAccounts" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
7 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
8>
9
10 <ng-template pTemplate="header">
11 <tr>
12 <th i18n>Account</th>
13 <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
14 </tr>
15 </ng-template>
16
17 <ng-template pTemplate="body" let-accountBlock>
18 <tr>
19 <td>{{ accountBlock.blockedAccount.nameWithHost }}</td>
20 <td>{{ accountBlock.createdAt }}</td>
21 <td class="action-cell">
22 <button class="unblock-button" (click)="unblockAccount(accountBlock)" i18n>Unmute</button>
23 </td>
24 </tr>
25 </ng-template>
26</p-table>
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.scss b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.scss
new file mode 100644
index 000000000..6028b75ea
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.scss
@@ -0,0 +1,7 @@
1@import '_variables';
2@import '_mixins';
3
4.unblock-button {
5 @include peertube-button;
6 @include grey-button;
7} \ No newline at end of file
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.ts b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.ts
new file mode 100644
index 000000000..e3025dec4
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.ts
@@ -0,0 +1,56 @@
1import { Component, OnInit } from '@angular/core'
2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RestPagination, RestTable } from '@app/shared'
5import { SortMeta } from 'primeng/components/common/sortmeta'
6import { AccountBlock, BlocklistService } from '@app/shared/blocklist'
7
8@Component({
9 selector: 'my-account-blocklist',
10 styleUrls: [ './my-account-blocklist.component.scss' ],
11 templateUrl: './my-account-blocklist.component.html'
12})
13export class MyAccountBlocklistComponent extends RestTable implements OnInit {
14 blockedAccounts: AccountBlock[] = []
15 totalRecords = 0
16 rowsPerPage = 10
17 sort: SortMeta = { field: 'createdAt', order: -1 }
18 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
19
20 constructor (
21 private notifier: Notifier,
22 private blocklistService: BlocklistService,
23 private i18n: I18n
24 ) {
25 super()
26 }
27
28 ngOnInit () {
29 this.initialize()
30 }
31
32 unblockAccount (accountBlock: AccountBlock) {
33 const blockedAccount = accountBlock.blockedAccount
34
35 this.blocklistService.unblockAccountByUser(blockedAccount)
36 .subscribe(
37 () => {
38 this.notifier.success(this.i18n('Account {{nameWithHost}} unmuted.', { nameWithHost: blockedAccount.nameWithHost }))
39
40 this.loadData()
41 }
42 )
43 }
44
45 protected loadData () {
46 return this.blocklistService.getUserAccountBlocklist(this.pagination, this.sort)
47 .subscribe(
48 resultList => {
49 this.blockedAccounts = resultList.data
50 this.totalRecords = resultList.total
51 },
52
53 err => this.notifier.error(err.message)
54 )
55 }
56}
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html
new file mode 100644
index 000000000..329cfb08f
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html
@@ -0,0 +1,27 @@
1<div class="admin-sub-header">
2 <div i18n class="form-sub-title">Muted instances</div>
3</div>
4
5<p-table
6 [value]="blockedServers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
7 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)"
8>
9
10 <ng-template pTemplate="header">
11 <tr>
12 <th i18n>Instance</th>
13 <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
14 <th></th>
15 </tr>
16 </ng-template>
17
18 <ng-template pTemplate="body" let-serverBlock>
19 <tr>
20 <td>{{ serverBlock.blockedServer.host }}</td>
21 <td>{{ serverBlock.createdAt }}</td>
22 <td class="action-cell">
23 <button class="unblock-button" (click)="unblockServer(serverBlock)" i18n>Unmute</button>
24 </td>
25 </tr>
26 </ng-template>
27</p-table>
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.scss b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.scss
new file mode 100644
index 000000000..6028b75ea
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.scss
@@ -0,0 +1,7 @@
1@import '_variables';
2@import '_mixins';
3
4.unblock-button {
5 @include peertube-button;
6 @include grey-button;
7} \ No newline at end of file
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.ts b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.ts
new file mode 100644
index 000000000..4c5cc28b8
--- /dev/null
+++ b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.ts
@@ -0,0 +1,57 @@
1import { Component, OnInit } from '@angular/core'
2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RestPagination, RestTable } from '@app/shared'
5import { SortMeta } from 'primeng/components/common/sortmeta'
6import { ServerBlock } from '../../../../../shared'
7import { BlocklistService } from '@app/shared/blocklist'
8
9@Component({
10 selector: 'my-account-server-blocklist',
11 styleUrls: [ './my-account-server-blocklist.component.scss' ],
12 templateUrl: './my-account-server-blocklist.component.html'
13})
14export class MyAccountServerBlocklistComponent extends RestTable implements OnInit {
15 blockedServers: ServerBlock[] = []
16 totalRecords = 0
17 rowsPerPage = 10
18 sort: SortMeta = { field: 'createdAt', order: -1 }
19 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
20
21 constructor (
22 private notifier: Notifier,
23 private blocklistService: BlocklistService,
24 private i18n: I18n
25 ) {
26 super()
27 }
28
29 ngOnInit () {
30 this.initialize()
31 }
32
33 unblockServer (serverBlock: ServerBlock) {
34 const host = serverBlock.blockedServer.host
35
36 this.blocklistService.unblockServerByUser(host)
37 .subscribe(
38 () => {
39 this.notifier.success(this.i18n('Instance {{host}} unmuted.', { host }))
40
41 this.loadData()
42 }
43 )
44 }
45
46 protected loadData () {
47 return this.blocklistService.getUserServerBlocklist(this.pagination, this.sort)
48 .subscribe(
49 resultList => {
50 this.blockedServers = resultList.data
51 this.totalRecords = resultList.total
52 },
53
54 err => this.notifier.error(err.message)
55 )
56 }
57}
diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.html b/client/src/app/+my-account/my-account-history/my-account-history.component.html
new file mode 100644
index 000000000..d42af37d4
--- /dev/null
+++ b/client/src/app/+my-account/my-account-history/my-account-history.component.html
@@ -0,0 +1,27 @@
1<div class="top-buttons">
2 <div class="history-switch">
3 <p-inputSwitch [(ngModel)]="videosHistoryEnabled" (ngModelChange)="onVideosHistoryChange()"></p-inputSwitch>
4 <label i18n>History enabled</label>
5 </div>
6
7 <div class="delete-history">
8 <button (click)="deleteHistory()" i18n>Delete history</button>
9 </div>
10</div>
11
12
13<div class="no-history" i18n *ngIf="pagination.totalItems === 0">You don't have videos history yet.</div>
14
15<div myInfiniteScroller (nearOfBottom)="onNearOfBottom()" class="videos" #videosElement>
16 <div *ngFor="let videos of videoPages;" class="videos-page">
17 <div class="video" *ngFor="let video of videos">
18 <my-video-thumbnail [video]="video"></my-video-thumbnail>
19
20 <div class="video-info">
21 <a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', video.uuid]" [attr.title]="video.name">{{ video.name }}</a>
22 <span i18n class="video-info-date-views">{{ video.views | myNumberFormatter }} views</span>
23 <a tabindex="-1" class="video-info-account" [routerLink]="[ '/accounts', video.byAccount ]">{{ video.byAccount }}</a>
24 </div>
25 </div>
26 </div>
27</div>
diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.scss b/client/src/app/+my-account/my-account-history/my-account-history.component.scss
new file mode 100644
index 000000000..e7c6863f1
--- /dev/null
+++ b/client/src/app/+my-account/my-account-history/my-account-history.component.scss
@@ -0,0 +1,99 @@
1@import '_variables';
2@import '_mixins';
3
4.no-history {
5 display: flex;
6 justify-content: center;
7 margin-top: 50px;
8 font-weight: $font-semibold;
9 font-size: 16px;
10}
11
12.top-buttons {
13 margin-bottom: 20px;
14 display: flex;
15
16 .history-switch {
17 display: flex;
18 flex-grow: 1;
19
20 label {
21 margin: 0 0 0 5px;
22 }
23 }
24
25 .delete-history {
26 font-size: 15px;
27
28 button {
29 @include peertube-button;
30 @include grey-button;
31 }
32 }
33}
34
35.video {
36 @include row-blocks;
37
38 my-video-thumbnail {
39 margin-right: 10px;
40 }
41
42 .video-info {
43 flex-grow: 1;
44
45 .video-info-name {
46 @include disable-default-a-behaviour;
47
48 color: var(--mainForegroundColor);
49 display: block;
50 width: fit-content;
51 font-size: 18px;
52 font-weight: $font-semibold;
53 }
54
55 .video-info-date-views {
56 font-size: 14px;
57 }
58
59 .video-info-account {
60 @include disable-default-a-behaviour;
61
62 display: block;
63 width: fit-content;
64 overflow: hidden;
65 text-overflow: ellipsis;
66 white-space: nowrap;
67 font-size: 14px;
68 color: $grey-foreground-color;
69
70 &:hover {
71 color: $grey-foreground-hover-color;
72 }
73 }
74 }
75}
76
77@media screen and (max-width: $small-view) {
78 .video {
79 flex-direction: column;
80 height: auto;
81 text-align: center;
82
83 .video-info-name {
84 margin: auto;
85 }
86
87 input[type=checkbox] {
88 display: none;
89 }
90
91 my-video-thumbnail {
92 margin-right: 0;
93 }
94
95 .video-buttons {
96 margin-top: 10px;
97 }
98 }
99}
diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.ts b/client/src/app/+my-account/my-account-history/my-account-history.component.ts
new file mode 100644
index 000000000..394091bad
--- /dev/null
+++ b/client/src/app/+my-account/my-account-history/my-account-history.component.ts
@@ -0,0 +1,107 @@
1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router'
3import { Location } from '@angular/common'
4import { immutableAssign } from '@app/shared/misc/utils'
5import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
6import { AuthService } from '../../core/auth'
7import { ConfirmService } from '../../core/confirm'
8import { AbstractVideoList } from '../../shared/video/abstract-video-list'
9import { VideoService } from '../../shared/video/video.service'
10import { I18n } from '@ngx-translate/i18n-polyfill'
11import { ScreenService } from '@app/shared/misc/screen.service'
12import { UserHistoryService } from '@app/shared/users/user-history.service'
13import { UserService } from '@app/shared'
14import { Notifier } from '@app/core'
15
16@Component({
17 selector: 'my-account-history',
18 templateUrl: './my-account-history.component.html',
19 styleUrls: [ './my-account-history.component.scss' ]
20})
21export class MyAccountHistoryComponent extends AbstractVideoList implements OnInit, OnDestroy {
22 titlePage: string
23 currentRoute = '/my-account/history/videos'
24 pagination: ComponentPagination = {
25 currentPage: 1,
26 itemsPerPage: 5,
27 totalItems: null
28 }
29 videosHistoryEnabled: boolean
30
31 protected baseVideoWidth = -1
32 protected baseVideoHeight = 155
33
34 constructor (
35 protected router: Router,
36 protected route: ActivatedRoute,
37 protected authService: AuthService,
38 protected userService: UserService,
39 protected notifier: Notifier,
40 protected location: Location,
41 protected screenService: ScreenService,
42 protected i18n: I18n,
43 private confirmService: ConfirmService,
44 private videoService: VideoService,
45 private userHistoryService: UserHistoryService
46 ) {
47 super()
48
49 this.titlePage = this.i18n('My videos history')
50 }
51
52 ngOnInit () {
53 super.ngOnInit()
54
55 this.videosHistoryEnabled = this.authService.getUser().videosHistoryEnabled
56 }
57
58 ngOnDestroy () {
59 super.ngOnDestroy()
60 }
61
62 getVideosObservable (page: number) {
63 const newPagination = immutableAssign(this.pagination, { currentPage: page })
64
65 return this.userHistoryService.getUserVideosHistory(newPagination)
66 }
67
68 generateSyndicationList () {
69 throw new Error('Method not implemented.')
70 }
71
72 onVideosHistoryChange () {
73 this.userService.updateMyProfile({ videosHistoryEnabled: this.videosHistoryEnabled })
74 .subscribe(
75 () => {
76 const message = this.videosHistoryEnabled === true ?
77 this.i18n('Videos history is enabled') :
78 this.i18n('Videos history is disabled')
79
80 this.notifier.success(message)
81
82 this.authService.refreshUserInformation()
83 },
84
85 err => this.notifier.error(err.message)
86 )
87 }
88
89 async deleteHistory () {
90 const title = this.i18n('Delete videos history')
91 const message = this.i18n('Are you sure you want to delete all your videos history?')
92
93 const res = await this.confirmService.confirm(message, title)
94 if (res !== true) return
95
96 this.userHistoryService.deleteUserVideosHistory()
97 .subscribe(
98 () => {
99 this.notifier.success(this.i18n('Videos history deleted'))
100
101 this.reloadVideos()
102 },
103
104 err => this.notifier.error(err.message)
105 )
106 }
107}
diff --git a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html
new file mode 100644
index 000000000..d518b22ec
--- /dev/null
+++ b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html
@@ -0,0 +1,13 @@
1<div class="header">
2 <a routerLink="/my-account/settings" fragment="notifications" i18n>
3 <my-global-icon iconName="cog"></my-global-icon>
4 Notification preferences
5 </a>
6
7 <button (click)="markAllAsRead()" i18n>
8 <my-global-icon iconName="circle-tick"></my-global-icon>
9 Mark all as read
10 </button>
11</div>
12
13<my-user-notifications #userNotification></my-user-notifications>
diff --git a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss
new file mode 100644
index 000000000..43d1f82ab
--- /dev/null
+++ b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss
@@ -0,0 +1,25 @@
1@import '_variables';
2@import '_mixins';
3
4.header {
5 display: flex;
6 justify-content: space-between;
7 font-size: 15px;
8 margin-bottom: 20px;
9
10 a {
11 @include peertube-button-link;
12 @include grey-button;
13 @include button-with-icon(18px, 3px, -1px);
14 }
15
16 button {
17 @include peertube-button;
18 @include grey-button;
19 @include button-with-icon(20px, 3px, -1px);
20 }
21}
22
23my-user-notifications {
24 font-size: 15px;
25}
diff --git a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.ts b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.ts
new file mode 100644
index 000000000..3e197088d
--- /dev/null
+++ b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.ts
@@ -0,0 +1,14 @@
1import { Component, ViewChild } from '@angular/core'
2import { UserNotificationsComponent } from '@app/shared'
3
4@Component({
5 templateUrl: './my-account-notifications.component.html',
6 styleUrls: [ './my-account-notifications.component.scss' ]
7})
8export class MyAccountNotificationsComponent {
9 @ViewChild('userNotification') userNotification: UserNotificationsComponent
10
11 markAllAsRead () {
12 this.userNotification.markAllAsRead()
13 }
14}
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
index fd7d7d23b..674a4e8a2 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
+++ b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal let-close="close" let-dismiss="dismiss"> 1<ng-template #modal let-close="close" let-dismiss="dismiss">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Accept ownership</h4> 3 <h4 i18n class="modal-title">Accept ownership</h4>
4 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body" [formGroup]="form"> 8 <div class="modal-body" [formGroup]="form">
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts
index a68b452ec..79d29b139 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts
+++ b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts
@@ -1,5 +1,5 @@
1import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { AuthService, Notifier } from '@app/core'
3import { FormReactive } from '@app/shared' 3import { FormReactive } from '@app/shared'
4import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 4import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
5import { VideoOwnershipService } from '@app/shared/video-ownership' 5import { VideoOwnershipService } from '@app/shared/video-ownership'
@@ -8,7 +8,6 @@ import { VideoAcceptOwnershipValidatorsService } from '@app/shared/forms/form-va
8import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 8import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
9import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' 9import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
10import { I18n } from '@ngx-translate/i18n-polyfill' 10import { I18n } from '@ngx-translate/i18n-polyfill'
11import { AuthService } from '@app/core'
12import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 11import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
13 12
14@Component({ 13@Component({
@@ -31,7 +30,7 @@ export class MyAccountAcceptOwnershipComponent extends FormReactive implements O
31 protected formValidatorService: FormValidatorService, 30 protected formValidatorService: FormValidatorService,
32 private videoChangeOwnershipValidatorsService: VideoAcceptOwnershipValidatorsService, 31 private videoChangeOwnershipValidatorsService: VideoAcceptOwnershipValidatorsService,
33 private videoOwnershipService: VideoOwnershipService, 32 private videoOwnershipService: VideoOwnershipService,
34 private notificationsService: NotificationsService, 33 private notifier: Notifier,
35 private authService: AuthService, 34 private authService: AuthService,
36 private videoChannelService: VideoChannelService, 35 private videoChannelService: VideoChannelService,
37 private modalService: NgbModal, 36 private modalService: NgbModal,
@@ -68,12 +67,12 @@ export class MyAccountAcceptOwnershipComponent extends FormReactive implements O
68 .acceptOwnership(videoChangeOwnership.id, { channelId: channel }) 67 .acceptOwnership(videoChangeOwnership.id, { channelId: channel })
69 .subscribe( 68 .subscribe(
70 () => { 69 () => {
71 this.notificationsService.success(this.i18n('Success'), this.i18n('Ownership accepted')) 70 this.notifier.success(this.i18n('Ownership accepted'))
72 if (this.accepted) this.accepted.emit() 71 if (this.accepted) this.accepted.emit()
73 this.videoChangeOwnership = undefined 72 this.videoChangeOwnership = undefined
74 }, 73 },
75 74
76 err => this.notificationsService.error(this.i18n('Error'), err.message) 75 err => this.notifier.error(err.message)
77 ) 76 )
78 } 77 }
79} 78}
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
index 379fd8bb1..5709e9f54 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
+++ b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
@@ -40,10 +40,10 @@
40 <td class="action-cell"> 40 <td class="action-cell">
41 <ng-container *ngIf="videoChangeOwnership.status === 'WAITING'"> 41 <ng-container *ngIf="videoChangeOwnership.status === 'WAITING'">
42 <my-button i18n label="Accept" 42 <my-button i18n label="Accept"
43 icon="icon-tick" 43 icon="tick"
44 (click)="openAcceptModal(videoChangeOwnership)"></my-button> 44 (click)="openAcceptModal(videoChangeOwnership)"></my-button>
45 <my-button i18n label="Refuse" 45 <my-button i18n label="Refuse"
46 icon="icon-cross" 46 icon="cross"
47 (click)="refuse(videoChangeOwnership)">Refuse</my-button> 47 (click)="refuse(videoChangeOwnership)">Refuse</my-button>
48 </ng-container> 48 </ng-container>
49 </td> 49 </td>
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.ts b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.ts
index 13517b9f4..77857c4fd 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.ts
+++ b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.ts
@@ -1,13 +1,11 @@
1import { Component, OnInit, ViewChild } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { RestPagination, RestTable } from '@app/shared' 3import { RestPagination, RestTable } from '@app/shared'
5import { SortMeta } from 'primeng/components/common/sortmeta' 4import { SortMeta } from 'primeng/components/common/sortmeta'
6import { VideoChangeOwnership } from '../../../../../shared' 5import { VideoChangeOwnership } from '../../../../../shared'
7import { VideoOwnershipService } from '@app/shared/video-ownership' 6import { VideoOwnershipService } from '@app/shared/video-ownership'
8import { Account } from '@app/shared/account/account.model' 7import { Account } from '@app/shared/account/account.model'
9import { MyAccountAcceptOwnershipComponent } 8import { MyAccountAcceptOwnershipComponent } from './my-account-accept-ownership/my-account-accept-ownership.component'
10from '@app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component'
11 9
12@Component({ 10@Component({
13 selector: 'my-account-ownership', 11 selector: 'my-account-ownership',
@@ -23,27 +21,14 @@ export class MyAccountOwnershipComponent extends RestTable implements OnInit {
23 @ViewChild('myAccountAcceptOwnershipComponent') myAccountAcceptOwnershipComponent: MyAccountAcceptOwnershipComponent 21 @ViewChild('myAccountAcceptOwnershipComponent') myAccountAcceptOwnershipComponent: MyAccountAcceptOwnershipComponent
24 22
25 constructor ( 23 constructor (
26 private notificationsService: NotificationsService, 24 private notifier: Notifier,
27 private videoOwnershipService: VideoOwnershipService, 25 private videoOwnershipService: VideoOwnershipService
28 private i18n: I18n
29 ) { 26 ) {
30 super() 27 super()
31 } 28 }
32 29
33 ngOnInit () { 30 ngOnInit () {
34 this.loadSort() 31 this.initialize()
35 }
36
37 protected loadData () {
38 return this.videoOwnershipService.getOwnershipChanges(this.pagination, this.sort)
39 .subscribe(
40 resultList => {
41 this.videoChangeOwnerships = resultList.data
42 this.totalRecords = resultList.total
43 },
44
45 err => this.notificationsService.error(this.i18n('Error'), err.message)
46 )
47 } 32 }
48 33
49 createByString (account: Account) { 34 createByString (account: Account) {
@@ -62,7 +47,19 @@ export class MyAccountOwnershipComponent extends RestTable implements OnInit {
62 this.videoOwnershipService.refuseOwnership(videoChangeOwnership.id) 47 this.videoOwnershipService.refuseOwnership(videoChangeOwnership.id)
63 .subscribe( 48 .subscribe(
64 () => this.loadData(), 49 () => this.loadData(),
65 err => this.notificationsService.error(this.i18n('Error'), err.message) 50 err => this.notifier.error(err.message)
51 )
52 }
53
54 protected loadData () {
55 return this.videoOwnershipService.getOwnershipChanges(this.pagination, this.sort)
56 .subscribe(
57 resultList => {
58 this.videoChangeOwnerships = resultList.data
59 this.totalRecords = resultList.total
60 },
61
62 err => this.notifier.error(err.message)
66 ) 63 )
67 } 64 }
68} 65}
diff --git a/client/src/app/+my-account/my-account-routing.module.ts b/client/src/app/+my-account/my-account-routing.module.ts
index 4b2168e35..9996218ca 100644
--- a/client/src/app/+my-account/my-account-routing.module.ts
+++ b/client/src/app/+my-account/my-account-routing.module.ts
@@ -11,6 +11,10 @@ import { MyAccountVideoChannelUpdateComponent } from '@app/+my-account/my-accoun
11import { MyAccountVideoImportsComponent } from '@app/+my-account/my-account-video-imports/my-account-video-imports.component' 11import { MyAccountVideoImportsComponent } from '@app/+my-account/my-account-video-imports/my-account-video-imports.component'
12import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-subscriptions/my-account-subscriptions.component' 12import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-subscriptions/my-account-subscriptions.component'
13import { MyAccountOwnershipComponent } from '@app/+my-account/my-account-ownership/my-account-ownership.component' 13import { MyAccountOwnershipComponent } from '@app/+my-account/my-account-ownership/my-account-ownership.component'
14import { MyAccountBlocklistComponent } from '@app/+my-account/my-account-blocklist/my-account-blocklist.component'
15import { MyAccountServerBlocklistComponent } from '@app/+my-account/my-account-blocklist/my-account-server-blocklist.component'
16import { MyAccountHistoryComponent } from '@app/+my-account/my-account-history/my-account-history.component'
17import { MyAccountNotificationsComponent } from '@app/+my-account/my-account-notifications/my-account-notifications.component'
14 18
15const myAccountRoutes: Routes = [ 19const myAccountRoutes: Routes = [
16 { 20 {
@@ -94,6 +98,42 @@ const myAccountRoutes: Routes = [
94 title: 'Ownership changes' 98 title: 'Ownership changes'
95 } 99 }
96 } 100 }
101 },
102 {
103 path: 'blocklist/accounts',
104 component: MyAccountBlocklistComponent,
105 data: {
106 meta: {
107 title: 'Muted accounts'
108 }
109 }
110 },
111 {
112 path: 'blocklist/servers',
113 component: MyAccountServerBlocklistComponent,
114 data: {
115 meta: {
116 title: 'Muted instances'
117 }
118 }
119 },
120 {
121 path: 'history/videos',
122 component: MyAccountHistoryComponent,
123 data: {
124 meta: {
125 title: 'Videos history'
126 }
127 }
128 },
129 {
130 path: 'notifications',
131 component: MyAccountNotificationsComponent,
132 data: {
133 meta: {
134 title: 'Notifications'
135 }
136 }
97 } 137 }
98 ] 138 ]
99 } 139 }
diff --git a/client/src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts b/client/src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts
index e5343b33d..cbb068c7c 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts
@@ -1,11 +1,10 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { AuthService, Notifier } from '@app/core'
3import { FormReactive, UserService } from '../../../shared' 3import { FormReactive, UserService } from '../../../shared'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 5import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
6import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service' 6import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service'
7import { filter } from 'rxjs/operators' 7import { filter } from 'rxjs/operators'
8import { AuthService } from '@app/core'
9import { User } from '../../../../../../shared' 8import { User } from '../../../../../../shared'
10 9
11@Component({ 10@Component({
@@ -20,7 +19,7 @@ export class MyAccountChangePasswordComponent extends FormReactive implements On
20 constructor ( 19 constructor (
21 protected formValidatorService: FormValidatorService, 20 protected formValidatorService: FormValidatorService,
22 private userValidatorsService: UserValidatorsService, 21 private userValidatorsService: UserValidatorsService,
23 private notificationsService: NotificationsService, 22 private notifier: Notifier,
24 private authService: AuthService, 23 private authService: AuthService,
25 private userService: UserService, 24 private userService: UserService,
26 private i18n: I18n 25 private i18n: I18n
@@ -50,7 +49,7 @@ export class MyAccountChangePasswordComponent extends FormReactive implements On
50 49
51 this.userService.changePassword(currentPassword, newPassword).subscribe( 50 this.userService.changePassword(currentPassword, newPassword).subscribe(
52 () => { 51 () => {
53 this.notificationsService.success(this.i18n('Success'), this.i18n('Password updated.')) 52 this.notifier.success(this.i18n('Password updated.'))
54 53
55 this.form.reset() 54 this.form.reset()
56 this.error = null 55 this.error = null
diff --git a/client/src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts b/client/src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts
index 63a121f64..3f79efe20 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts
@@ -1,5 +1,5 @@
1import { Component, Input } from '@angular/core' 1import { Component, Input } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { AuthService, ConfirmService, RedirectService } from '../../../core' 3import { AuthService, ConfirmService, RedirectService } from '../../../core'
4import { UserService } from '../../../shared' 4import { UserService } from '../../../shared'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -15,7 +15,7 @@ export class MyAccountDangerZoneComponent {
15 15
16 constructor ( 16 constructor (
17 private authService: AuthService, 17 private authService: AuthService,
18 private notificationsService: NotificationsService, 18 private notifier: Notifier,
19 private userService: UserService, 19 private userService: UserService,
20 private confirmService: ConfirmService, 20 private confirmService: ConfirmService,
21 private redirectService: RedirectService, 21 private redirectService: RedirectService,
@@ -34,13 +34,13 @@ export class MyAccountDangerZoneComponent {
34 34
35 this.userService.deleteMe().subscribe( 35 this.userService.deleteMe().subscribe(
36 () => { 36 () => {
37 this.notificationsService.success(this.i18n('Success'), this.i18n('Your account is deleted.')) 37 this.notifier.success(this.i18n('Your account is deleted.'))
38 38
39 this.authService.logout() 39 this.authService.logout()
40 this.redirectService.redirectToHomepage() 40 this.redirectService.redirectToHomepage()
41 }, 41 },
42 42
43 err => this.notificationsService.error(this.i18n('Error'), err.message) 43 err => this.notifier.error(err.message)
44 ) 44 )
45 } 45 }
46} 46}
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/index.ts b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/index.ts
new file mode 100644
index 000000000..5e1d51339
--- /dev/null
+++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/index.ts
@@ -0,0 +1 @@
export * from './my-account-notification-preferences.component'
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html
new file mode 100644
index 000000000..59422d682
--- /dev/null
+++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html
@@ -0,0 +1,19 @@
1<div class="custom-row">
2 <div i18n>Activities</div>
3 <div i18n>Web</div>
4 <div i18n *ngIf="emailEnabled">Email</div>
5</div>
6
7<div class="custom-row" *ngFor="let notificationType of notificationSettingKeys">
8 <ng-container *ngIf="hasUserRight(notificationType)">
9 <div>{{ labelNotifications[notificationType] }}</div>
10
11 <div>
12 <p-inputSwitch [(ngModel)]="webNotifications[notificationType]" (onChange)="updateWebSetting(notificationType, $event.checked)"></p-inputSwitch>
13 </div>
14
15 <div *ngIf="emailEnabled">
16 <p-inputSwitch [(ngModel)]="emailNotifications[notificationType]" (onChange)="updateEmailSetting(notificationType, $event.checked)"></p-inputSwitch>
17 </div>
18 </ng-container>
19</div>
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.scss b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.scss
new file mode 100644
index 000000000..6feb16ab1
--- /dev/null
+++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.scss
@@ -0,0 +1,25 @@
1@import '_variables';
2@import '_mixins';
3
4.custom-row {
5 display: flex;
6 align-items: center;
7 border-bottom: 1px solid rgba(0, 0, 0, 0.10);
8
9 &:first-child {
10 font-size: 16px;
11
12 & > div {
13 font-weight: $font-semibold;
14 }
15 }
16
17 & > div {
18 width: 350px;
19 }
20
21 & > div {
22 padding: 10px
23 }
24}
25
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
new file mode 100644
index 000000000..519bdfab4
--- /dev/null
+++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
@@ -0,0 +1,99 @@
1import { Component, Input, OnInit } from '@angular/core'
2import { User } from '@app/shared'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { Subject } from 'rxjs'
5import { UserNotificationSetting, UserNotificationSettingValue, UserRight } from '../../../../../../shared'
6import { Notifier, ServerService } from '@app/core'
7import { debounce } from 'lodash-es'
8import { UserNotificationService } from '@app/shared/users/user-notification.service'
9
10@Component({
11 selector: 'my-account-notification-preferences',
12 templateUrl: './my-account-notification-preferences.component.html',
13 styleUrls: [ './my-account-notification-preferences.component.scss' ]
14})
15export class MyAccountNotificationPreferencesComponent implements OnInit {
16 @Input() user: User = null
17 @Input() userInformationLoaded: Subject<any>
18
19 notificationSettingKeys: (keyof UserNotificationSetting)[] = []
20 emailNotifications: { [ id in keyof UserNotificationSetting ]: boolean } = {} as any
21 webNotifications: { [ id in keyof UserNotificationSetting ]: boolean } = {} as any
22 labelNotifications: { [ id in keyof UserNotificationSetting ]: string } = {} as any
23 rightNotifications: { [ id in keyof Partial<UserNotificationSetting> ]: UserRight } = {} as any
24 emailEnabled: boolean
25
26 private savePreferences = debounce(this.savePreferencesImpl.bind(this), 500)
27
28 constructor (
29 private i18n: I18n,
30 private userNotificationService: UserNotificationService,
31 private serverService: ServerService,
32 private notifier: Notifier
33 ) {
34 this.labelNotifications = {
35 newVideoFromSubscription: this.i18n('New video from your subscriptions'),
36 newCommentOnMyVideo: this.i18n('New comment on your video'),
37 videoAbuseAsModerator: this.i18n('New video abuse on local video'),
38 blacklistOnMyVideo: this.i18n('One of your video is blacklisted/unblacklisted'),
39 myVideoPublished: this.i18n('Video published (after transcoding/scheduled update)'),
40 myVideoImportFinished: this.i18n('Video import finished'),
41 newUserRegistration: this.i18n('A new user registered on your instance'),
42 newFollow: this.i18n('You or your channel(s) has a new follower'),
43 commentMention: this.i18n('Someone mentioned you in video comments')
44 }
45 this.notificationSettingKeys = Object.keys(this.labelNotifications) as (keyof UserNotificationSetting)[]
46
47 this.rightNotifications = {
48 videoAbuseAsModerator: UserRight.MANAGE_VIDEO_ABUSES,
49 newUserRegistration: UserRight.MANAGE_USERS
50 }
51
52 this.emailEnabled = this.serverService.getConfig().email.enabled
53 }
54
55 ngOnInit () {
56 this.userInformationLoaded.subscribe(() => this.loadNotificationSettings())
57 }
58
59 hasUserRight (field: keyof UserNotificationSetting) {
60 const rightToHave = this.rightNotifications[field]
61 if (!rightToHave) return true // No rights needed
62
63 return this.user.hasRight(rightToHave)
64 }
65
66 updateEmailSetting (field: keyof UserNotificationSetting, value: boolean) {
67 if (value === true) this.user.notificationSettings[field] |= UserNotificationSettingValue.EMAIL
68 else this.user.notificationSettings[field] &= ~UserNotificationSettingValue.EMAIL
69
70 this.savePreferences()
71 }
72
73 updateWebSetting (field: keyof UserNotificationSetting, value: boolean) {
74 if (value === true) this.user.notificationSettings[field] |= UserNotificationSettingValue.WEB
75 else this.user.notificationSettings[field] &= ~UserNotificationSettingValue.WEB
76
77 this.savePreferences()
78 }
79
80 private savePreferencesImpl () {
81 this.userNotificationService.updateNotificationSettings(this.user, this.user.notificationSettings)
82 .subscribe(
83 () => {
84 this.notifier.success(this.i18n('Preferences saved'), undefined, 2000)
85 },
86
87 err => this.notifier.error(err.message)
88 )
89 }
90
91 private loadNotificationSettings () {
92 for (const key of Object.keys(this.user.notificationSettings)) {
93 const value = this.user.notificationSettings[key]
94 this.emailNotifications[key] = value & UserNotificationSettingValue.EMAIL
95
96 this.webNotifications[key] = value & UserNotificationSettingValue.WEB
97 }
98 }
99}
diff --git a/client/src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts b/client/src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts
index 967e21f0b..a9503ed1b 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts
@@ -1,5 +1,5 @@
1import { Component, Input, OnInit } from '@angular/core' 1import { Component, Input, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { FormReactive, UserService } from '../../../shared' 3import { FormReactive, UserService } from '../../../shared'
4import { User } from '@app/shared' 4import { User } from '@app/shared'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -21,7 +21,7 @@ export class MyAccountProfileComponent extends FormReactive implements OnInit {
21 constructor ( 21 constructor (
22 protected formValidatorService: FormValidatorService, 22 protected formValidatorService: FormValidatorService,
23 private userValidatorsService: UserValidatorsService, 23 private userValidatorsService: UserValidatorsService,
24 private notificationsService: NotificationsService, 24 private notifier: Notifier,
25 private userService: UserService, 25 private userService: UserService,
26 private i18n: I18n 26 private i18n: I18n
27 ) { 27 ) {
@@ -53,7 +53,7 @@ export class MyAccountProfileComponent extends FormReactive implements OnInit {
53 this.user.account.displayName = displayName 53 this.user.account.displayName = displayName
54 this.user.account.description = description 54 this.user.account.description = description
55 55
56 this.notificationsService.success(this.i18n('Success'), this.i18n('Profile updated.')) 56 this.notifier.success(this.i18n('Profile updated.'))
57 }, 57 },
58 58
59 err => this.error = err.message 59 err => this.error = err.message
diff --git a/client/src/app/+my-account/my-account-settings/my-account-settings.component.html b/client/src/app/+my-account/my-account-settings/my-account-settings.component.html
index c7e23cd1f..ad64f28fe 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-settings.component.html
+++ b/client/src/app/+my-account/my-account-settings/my-account-settings.component.html
@@ -4,10 +4,11 @@
4 <span i18n class="user-quota-label">Video quota:</span> {{ userVideoQuotaUsed | bytes: 0 }} / {{ userVideoQuota }} 4 <span i18n class="user-quota-label">Video quota:</span> {{ userVideoQuotaUsed | bytes: 0 }} / {{ userVideoQuota }}
5</div> 5</div>
6 6
7<ng-template [ngIf]="user && user.account"> 7<div i18n class="account-title">Profile</div>
8 <div i18n class="account-title">Profile</div> 8<my-account-profile [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-profile>
9 <my-account-profile [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-profile> 9
10</ng-template> 10<div i18n class="account-title" id="notifications">Notifications</div>
11<my-account-notification-preferences [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-notification-preferences>
11 12
12<div i18n class="account-title">Password</div> 13<div i18n class="account-title">Password</div>
13<my-account-change-password></my-account-change-password> 14<my-account-change-password></my-account-change-password>
@@ -16,4 +17,4 @@
16<my-account-video-settings [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-video-settings> 17<my-account-video-settings [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-video-settings>
17 18
18<div i18n class="account-title">Danger zone</div> 19<div i18n class="account-title">Danger zone</div>
19<my-account-danger-zone [user]="user"></my-account-danger-zone> \ No newline at end of file 20<my-account-danger-zone [user]="user"></my-account-danger-zone>
diff --git a/client/src/app/+my-account/my-account-settings/my-account-settings.component.ts b/client/src/app/+my-account/my-account-settings/my-account-settings.component.ts
index 62053d97b..f4b954e54 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-settings.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-settings.component.ts
@@ -1,5 +1,5 @@
1import { Component, OnInit, ViewChild } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { BytesPipe } from 'ngx-pipes' 3import { BytesPipe } from 'ngx-pipes'
4import { AuthService } from '../../core' 4import { AuthService } from '../../core'
5import { User } from '../../shared' 5import { User } from '../../shared'
@@ -19,7 +19,7 @@ export class MyAccountSettingsComponent implements OnInit {
19 constructor ( 19 constructor (
20 private userService: UserService, 20 private userService: UserService,
21 private authService: AuthService, 21 private authService: AuthService,
22 private notificationsService: NotificationsService, 22 private notifier: Notifier,
23 private i18n: I18n 23 private i18n: I18n
24 ) {} 24 ) {}
25 25
@@ -48,12 +48,12 @@ export class MyAccountSettingsComponent implements OnInit {
48 this.userService.changeAvatar(formData) 48 this.userService.changeAvatar(formData)
49 .subscribe( 49 .subscribe(
50 data => { 50 data => {
51 this.notificationsService.success(this.i18n('Success'), this.i18n('Avatar changed.')) 51 this.notifier.success(this.i18n('Avatar changed.'))
52 52
53 this.user.updateAccountAvatar(data.avatar) 53 this.user.updateAccountAvatar(data.avatar)
54 }, 54 },
55 55
56 err => this.notificationsService.error(this.i18n('Error'), err.message) 56 err => this.notifier.error(err.message)
57 ) 57 )
58 } 58 }
59} 59}
diff --git a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
index 96629940f..049119fa8 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
+++ b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
@@ -15,10 +15,19 @@
15 </div> 15 </div>
16 </div> 16 </div>
17 17
18 <my-peertube-checkbox 18 <div class="form-group">
19 inputName="autoPlayVideo" formControlName="autoPlayVideo" 19 <my-peertube-checkbox
20 i18n-labelText labelText="Automatically plays video" 20 inputName="webTorrentEnabled" formControlName="webTorrentEnabled"
21 ></my-peertube-checkbox> 21 i18n-labelText labelText="Use WebTorrent to exchange parts of the video with others"
22 ></my-peertube-checkbox>
23 </div>
24
25 <div class="form-group">
26 <my-peertube-checkbox
27 inputName="autoPlayVideo" formControlName="autoPlayVideo"
28 i18n-labelText labelText="Automatically plays video"
29 ></my-peertube-checkbox>
30 </div>
22 31
23 <input type="submit" i18n-value value="Save" [disabled]="!form.valid"> 32 <input type="submit" i18n-value value="Save" [disabled]="!form.valid">
24</form> 33</form>
diff --git a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts
index 7089b2057..b8f80bc1a 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts
@@ -1,5 +1,5 @@
1import { Component, Input, OnInit } from '@angular/core' 1import { Component, Input, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { UserUpdateMe } from '../../../../../../shared' 3import { UserUpdateMe } from '../../../../../../shared'
4import { AuthService } from '../../../core' 4import { AuthService } from '../../../core'
5import { FormReactive, User, UserService } from '../../../shared' 5import { FormReactive, User, UserService } from '../../../shared'
@@ -19,7 +19,7 @@ export class MyAccountVideoSettingsComponent extends FormReactive implements OnI
19 constructor ( 19 constructor (
20 protected formValidatorService: FormValidatorService, 20 protected formValidatorService: FormValidatorService,
21 private authService: AuthService, 21 private authService: AuthService,
22 private notificationsService: NotificationsService, 22 private notifier: Notifier,
23 private userService: UserService, 23 private userService: UserService,
24 private i18n: I18n 24 private i18n: I18n
25 ) { 25 ) {
@@ -29,12 +29,14 @@ export class MyAccountVideoSettingsComponent extends FormReactive implements OnI
29 ngOnInit () { 29 ngOnInit () {
30 this.buildForm({ 30 this.buildForm({
31 nsfwPolicy: null, 31 nsfwPolicy: null,
32 webTorrentEnabled: null,
32 autoPlayVideo: null 33 autoPlayVideo: null
33 }) 34 })
34 35
35 this.userInformationLoaded.subscribe(() => { 36 this.userInformationLoaded.subscribe(() => {
36 this.form.patchValue({ 37 this.form.patchValue({
37 nsfwPolicy: this.user.nsfwPolicy, 38 nsfwPolicy: this.user.nsfwPolicy,
39 webTorrentEnabled: this.user.webTorrentEnabled,
38 autoPlayVideo: this.user.autoPlayVideo === true 40 autoPlayVideo: this.user.autoPlayVideo === true
39 }) 41 })
40 }) 42 })
@@ -42,20 +44,22 @@ export class MyAccountVideoSettingsComponent extends FormReactive implements OnI
42 44
43 updateDetails () { 45 updateDetails () {
44 const nsfwPolicy = this.form.value['nsfwPolicy'] 46 const nsfwPolicy = this.form.value['nsfwPolicy']
47 const webTorrentEnabled = this.form.value['webTorrentEnabled']
45 const autoPlayVideo = this.form.value['autoPlayVideo'] 48 const autoPlayVideo = this.form.value['autoPlayVideo']
46 const details: UserUpdateMe = { 49 const details: UserUpdateMe = {
47 nsfwPolicy, 50 nsfwPolicy,
51 webTorrentEnabled,
48 autoPlayVideo 52 autoPlayVideo
49 } 53 }
50 54
51 this.userService.updateMyProfile(details).subscribe( 55 this.userService.updateMyProfile(details).subscribe(
52 () => { 56 () => {
53 this.notificationsService.success(this.i18n('Success'), this.i18n('Information updated.')) 57 this.notifier.success(this.i18n('Information updated.'))
54 58
55 this.authService.refreshUserInformation() 59 this.authService.refreshUserInformation()
56 }, 60 },
57 61
58 err => this.notificationsService.error(this.i18n('Error'), err.message) 62 err => this.notifier.error(err.message)
59 ) 63 )
60 } 64 }
61} 65}
diff --git a/client/src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts b/client/src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts
index 9517a3705..9d2dccdf0 100644
--- a/client/src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts
+++ b/client/src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts
@@ -1,5 +1,5 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 3import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { UserSubscriptionService } from '@app/shared/user-subscription' 5import { UserSubscriptionService } from '@app/shared/user-subscription'
@@ -21,7 +21,7 @@ export class MyAccountSubscriptionsComponent implements OnInit {
21 21
22 constructor ( 22 constructor (
23 private userSubscriptionService: UserSubscriptionService, 23 private userSubscriptionService: UserSubscriptionService,
24 private notificationsService: NotificationsService, 24 private notifier: Notifier,
25 private i18n: I18n 25 private i18n: I18n
26 ) {} 26 ) {}
27 27
@@ -37,7 +37,7 @@ export class MyAccountSubscriptionsComponent implements OnInit {
37 this.pagination.totalItems = res.total 37 this.pagination.totalItems = res.total
38 }, 38 },
39 39
40 error => this.notificationsService.error(this.i18n('Error'), error.message) 40 error => this.notifier.error(error.message)
41 ) 41 )
42 } 42 }
43 43
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts
index 81608d837..a68f79b47 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts
@@ -1,10 +1,9 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications' 3import { AuthService, Notifier } from '@app/core'
4import { MyAccountVideoChannelEdit } from './my-account-video-channel-edit' 4import { MyAccountVideoChannelEdit } from './my-account-video-channel-edit'
5import { VideoChannelCreate } from '../../../../../shared/models/videos' 5import { VideoChannelCreate } from '../../../../../shared/models/videos'
6import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' 6import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
7import { AuthService } from '@app/core'
8import { I18n } from '@ngx-translate/i18n-polyfill' 7import { I18n } from '@ngx-translate/i18n-polyfill'
9import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 8import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
10import { VideoChannelValidatorsService } from '@app/shared/forms/form-validators/video-channel-validators.service' 9import { VideoChannelValidatorsService } from '@app/shared/forms/form-validators/video-channel-validators.service'
@@ -21,7 +20,7 @@ export class MyAccountVideoChannelCreateComponent extends MyAccountVideoChannelE
21 protected formValidatorService: FormValidatorService, 20 protected formValidatorService: FormValidatorService,
22 private authService: AuthService, 21 private authService: AuthService,
23 private videoChannelValidatorsService: VideoChannelValidatorsService, 22 private videoChannelValidatorsService: VideoChannelValidatorsService,
24 private notificationsService: NotificationsService, 23 private notifier: Notifier,
25 private router: Router, 24 private router: Router,
26 private videoChannelService: VideoChannelService, 25 private videoChannelService: VideoChannelService,
27 private i18n: I18n 26 private i18n: I18n
@@ -56,8 +55,8 @@ export class MyAccountVideoChannelCreateComponent extends MyAccountVideoChannelE
56 this.videoChannelService.createVideoChannel(videoChannelCreate).subscribe( 55 this.videoChannelService.createVideoChannel(videoChannelCreate).subscribe(
57 () => { 56 () => {
58 this.authService.refreshUserInformation() 57 this.authService.refreshUserInformation()
59 this.notificationsService.success( 58
60 this.i18n('Success'), 59 this.notifier.success(
61 this.i18n('Video channel {{videoChannelName}} created.', { videoChannelName: videoChannelCreate.displayName }) 60 this.i18n('Video channel {{videoChannelName}} created.', { videoChannelName: videoChannelCreate.displayName })
62 ) 61 )
63 this.router.navigate([ '/my-account', 'video-channels' ]) 62 this.router.navigate([ '/my-account', 'video-channels' ])
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-edit.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-edit.ts
index ccdd9a3dc..4dc65dd99 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-edit.ts
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-edit.ts
@@ -4,7 +4,11 @@ import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
4export abstract class MyAccountVideoChannelEdit extends FormReactive { 4export abstract class MyAccountVideoChannelEdit extends FormReactive {
5 // We need it even in the create component because it's used in the edit template 5 // We need it even in the create component because it's used in the edit template
6 videoChannelToUpdate: VideoChannel 6 videoChannelToUpdate: VideoChannel
7 instanceHost: string
7 8
8 abstract isCreation (): boolean 9 abstract isCreation (): boolean
9 abstract getFormButtonTitle (): string 10 abstract getFormButtonTitle (): string
11
12 // FIXME: We need this method so angular does not complain in the child template
13 onAvatarChange (formData: FormData) { /* empty */ }
10} 14}
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts
index 56697030b..da4fb645a 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts
@@ -1,12 +1,11 @@
1import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications' 3import { AuthService, Notifier, ServerService } from '@app/core'
4import { MyAccountVideoChannelEdit } from './my-account-video-channel-edit' 4import { MyAccountVideoChannelEdit } from './my-account-video-channel-edit'
5import { VideoChannelUpdate } from '../../../../../shared/models/videos' 5import { VideoChannelUpdate } from '../../../../../shared/models/videos'
6import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' 6import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
7import { Subscription } from 'rxjs' 7import { Subscription } from 'rxjs'
8import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 8import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
9import { AuthService, ServerService } from '@app/core'
10import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
11import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 10import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
12import { VideoChannelValidatorsService } from '@app/shared/forms/form-validators/video-channel-validators.service' 11import { VideoChannelValidatorsService } from '@app/shared/forms/form-validators/video-channel-validators.service'
@@ -17,18 +16,16 @@ import { VideoChannelValidatorsService } from '@app/shared/forms/form-validators
17 styleUrls: [ './my-account-video-channel-edit.component.scss' ] 16 styleUrls: [ './my-account-video-channel-edit.component.scss' ]
18}) 17})
19export class MyAccountVideoChannelUpdateComponent extends MyAccountVideoChannelEdit implements OnInit, OnDestroy { 18export class MyAccountVideoChannelUpdateComponent extends MyAccountVideoChannelEdit implements OnInit, OnDestroy {
20 @ViewChild('avatarfileInput') avatarfileInput
21
22 error: string 19 error: string
23
24 videoChannelToUpdate: VideoChannel 20 videoChannelToUpdate: VideoChannel
21
25 private paramsSub: Subscription 22 private paramsSub: Subscription
26 23
27 constructor ( 24 constructor (
28 protected formValidatorService: FormValidatorService, 25 protected formValidatorService: FormValidatorService,
29 private authService: AuthService, 26 private authService: AuthService,
30 private videoChannelValidatorsService: VideoChannelValidatorsService, 27 private videoChannelValidatorsService: VideoChannelValidatorsService,
31 private notificationsService: NotificationsService, 28 private notifier: Notifier,
32 private router: Router, 29 private router: Router,
33 private route: ActivatedRoute, 30 private route: ActivatedRoute,
34 private videoChannelService: VideoChannelService, 31 private videoChannelService: VideoChannelService,
@@ -81,10 +78,11 @@ export class MyAccountVideoChannelUpdateComponent extends MyAccountVideoChannelE
81 this.videoChannelService.updateVideoChannel(this.videoChannelToUpdate.name, videoChannelUpdate).subscribe( 78 this.videoChannelService.updateVideoChannel(this.videoChannelToUpdate.name, videoChannelUpdate).subscribe(
82 () => { 79 () => {
83 this.authService.refreshUserInformation() 80 this.authService.refreshUserInformation()
84 this.notificationsService.success( 81
85 this.i18n('Success'), 82 this.notifier.success(
86 this.i18n('Video channel {{videoChannelName}} updated.', { videoChannelName: videoChannelUpdate.displayName }) 83 this.i18n('Video channel {{videoChannelName}} updated.', { videoChannelName: videoChannelUpdate.displayName })
87 ) 84 )
85
88 this.router.navigate([ '/my-account', 'video-channels' ]) 86 this.router.navigate([ '/my-account', 'video-channels' ])
89 }, 87 },
90 88
@@ -96,12 +94,12 @@ export class MyAccountVideoChannelUpdateComponent extends MyAccountVideoChannelE
96 this.videoChannelService.changeVideoChannelAvatar(this.videoChannelToUpdate.name, formData) 94 this.videoChannelService.changeVideoChannelAvatar(this.videoChannelToUpdate.name, formData)
97 .subscribe( 95 .subscribe(
98 data => { 96 data => {
99 this.notificationsService.success(this.i18n('Success'), this.i18n('Avatar changed.')) 97 this.notifier.success(this.i18n('Avatar changed.'))
100 98
101 this.videoChannelToUpdate.updateAvatar(data.avatar) 99 this.videoChannelToUpdate.updateAvatar(data.avatar)
102 }, 100 },
103 101
104 err => this.notificationsService.error(this.i18n('Error'), err.message) 102 err => this.notifier.error(err.message)
105 ) 103 )
106 } 104 }
107 105
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
index df74b19b6..51db2e75d 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
@@ -1,6 +1,6 @@
1<div class="video-channels-header"> 1<div class="video-channels-header">
2 <a class="create-button" routerLink="create"> 2 <a class="create-button" routerLink="create">
3 <span class="icon icon-add"></span> 3 <my-global-icon iconName="add"></my-global-icon>
4 <ng-container i18n>Create another video channel</ng-container> 4 <ng-container i18n>Create another video channel</ng-container>
5 </a> 5 </a>
6</div> 6</div>
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
index 472cbb723..77fce138b 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
@@ -2,7 +2,7 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.create-button { 4.create-button {
5 @include create-button('../../../assets/images/global/add.svg'); 5 @include create-button;
6} 6}
7 7
8/deep/ .action-button { 8/deep/ .action-button {
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
index 6d1098865..da2c5bcd3 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
@@ -1,5 +1,5 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { AuthService } from '../../core/auth' 3import { AuthService } from '../../core/auth'
4import { ConfirmService } from '../../core/confirm' 4import { ConfirmService } from '../../core/confirm'
5import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 5import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
@@ -20,7 +20,7 @@ export class MyAccountVideoChannelsComponent implements OnInit {
20 20
21 constructor ( 21 constructor (
22 private authService: AuthService, 22 private authService: AuthService,
23 private notificationsService: NotificationsService, 23 private notifier: Notifier,
24 private confirmService: ConfirmService, 24 private confirmService: ConfirmService,
25 private videoChannelService: VideoChannelService, 25 private videoChannelService: VideoChannelService,
26 private i18n: I18n 26 private i18n: I18n
@@ -35,10 +35,14 @@ export class MyAccountVideoChannelsComponent implements OnInit {
35 async deleteVideoChannel (videoChannel: VideoChannel) { 35 async deleteVideoChannel (videoChannel: VideoChannel) {
36 const res = await this.confirmService.confirmWithInput( 36 const res = await this.confirmService.confirmWithInput(
37 this.i18n( 37 this.i18n(
38 'Do you really want to delete {{videoChannelName}}? It will delete all videos uploaded in this channel too.', 38 'Do you really want to delete {{channelDisplayName}}? It will delete all videos uploaded in this channel, ' +
39 { videoChannelName: videoChannel.displayName } 39 'and you will not be able to create another channel with the same name ({{channelName}})!',
40 { channelDisplayName: videoChannel.displayName, channelName: videoChannel.name }
41 ),
42 this.i18n(
43 'Please type the display name of the video channel ({{displayName}}) to confirm',
44 { displayName: videoChannel.displayName }
40 ), 45 ),
41 this.i18n('Please type the name of the video channel to confirm'),
42 videoChannel.displayName, 46 videoChannel.displayName,
43 this.i18n('Delete') 47 this.i18n('Delete')
44 ) 48 )
@@ -46,15 +50,14 @@ export class MyAccountVideoChannelsComponent implements OnInit {
46 50
47 this.videoChannelService.removeVideoChannel(videoChannel) 51 this.videoChannelService.removeVideoChannel(videoChannel)
48 .subscribe( 52 .subscribe(
49 status => { 53 () => {
50 this.loadVideoChannels() 54 this.loadVideoChannels()
51 this.notificationsService.success( 55 this.notifier.success(
52 this.i18n('Success'),
53 this.i18n('Video channel {{videoChannelName}} deleted.', { videoChannelName: videoChannel.displayName }) 56 this.i18n('Video channel {{videoChannelName}} deleted.', { videoChannelName: videoChannel.displayName })
54 ) 57 )
55 }, 58 },
56 59
57 error => this.notificationsService.error(this.i18n('Error'), error.message) 60 error => this.notifier.error(error.message)
58 ) 61 )
59 } 62 }
60 63
diff --git a/client/src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts b/client/src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts
index d9fb20446..21a10c8ff 100644
--- a/client/src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts
+++ b/client/src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts
@@ -1,7 +1,7 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { RestPagination, RestTable } from '@app/shared' 2import { RestPagination, RestTable } from '@app/shared'
3import { SortMeta } from 'primeng/components/common/sortmeta' 3import { SortMeta } from 'primeng/components/common/sortmeta'
4import { NotificationsService } from 'angular2-notifications' 4import { Notifier } from '@app/core'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
6import { VideoImport, VideoImportState } from '../../../../../shared/models/videos' 6import { VideoImport, VideoImportState } from '../../../../../shared/models/videos'
7import { VideoImportService } from '@app/shared/video-import' 7import { VideoImportService } from '@app/shared/video-import'
@@ -19,7 +19,7 @@ export class MyAccountVideoImportsComponent extends RestTable implements OnInit
19 pagination: RestPagination = { count: this.rowsPerPage, start: 0 } 19 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
20 20
21 constructor ( 21 constructor (
22 private notificationsService: NotificationsService, 22 private notifier: Notifier,
23 private videoImportService: VideoImportService, 23 private videoImportService: VideoImportService,
24 private i18n: I18n 24 private i18n: I18n
25 ) { 25 ) {
@@ -27,7 +27,7 @@ export class MyAccountVideoImportsComponent extends RestTable implements OnInit
27 } 27 }
28 28
29 ngOnInit () { 29 ngOnInit () {
30 this.loadSort() 30 this.initialize()
31 } 31 }
32 32
33 isVideoImportSuccess (videoImport: VideoImport) { 33 isVideoImportSuccess (videoImport: VideoImport) {
@@ -58,7 +58,7 @@ export class MyAccountVideoImportsComponent extends RestTable implements OnInit
58 this.totalRecords = resultList.total 58 this.totalRecords = resultList.total
59 }, 59 },
60 60
61 err => this.notificationsService.error(this.i18n('Error'), err.message) 61 err => this.notifier.error(err.message)
62 ) 62 )
63 } 63 }
64} 64}
diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.html b/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
index a6911e4bf..69748ef37 100644
--- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
+++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
@@ -32,7 +32,7 @@
32 </span> 32 </span>
33 33
34 <span class="action-button action-button-delete-selection" (click)="deleteSelectedVideos()"> 34 <span class="action-button action-button-delete-selection" (click)="deleteSelectedVideos()">
35 <span class="icon icon-delete-white"></span> 35 <my-global-icon iconName="delete"></my-global-icon>
36 <ng-container i18n>Delete</ng-container> 36 <ng-container i18n>Delete</ng-container>
37 </span> 37 </span>
38 </div> 38 </div>
@@ -45,7 +45,7 @@
45 45
46 <my-button i18n-label label="Change ownership" 46 <my-button i18n-label label="Change ownership"
47 className="action-button-change-ownership" 47 className="action-button-change-ownership"
48 icon="icon-im-with-her" 48 icon="im-with-her"
49 (click)="changeOwnership($event, video)" 49 (click)="changeOwnership($event, video)"
50 ></my-button> 50 ></my-button>
51 </div> 51 </div>
@@ -53,4 +53,4 @@
53 </div> 53 </div>
54</div> 54</div>
55 55
56<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership> \ No newline at end of file 56<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership>
diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss b/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
index 2db81a3fe..39d0cf2f7 100644
--- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
+++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
@@ -23,14 +23,11 @@
23 .action-button-delete-selection { 23 .action-button-delete-selection {
24 @include peertube-button; 24 @include peertube-button;
25 @include orange-button; 25 @include orange-button;
26 } 26 @include button-with-icon(21px);
27
28 .icon.icon-delete-white {
29 @include icon(21px);
30 27
31 position: relative; 28 my-global-icon {
32 top: -2px; 29 @include apply-svg-color(#fff);
33 background-image: url('../../../assets/images/global/delete-white.svg'); 30 }
34 } 31 }
35 } 32 }
36} 33}
@@ -97,7 +94,7 @@
97 } 94 }
98} 95}
99 96
100@media screen and (max-width: 800px) { 97@media screen and (max-width: $small-view) {
101 .video { 98 .video {
102 flex-direction: column; 99 flex-direction: column;
103 height: auto; 100 height: auto;
diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts b/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts
index 7560f0128..41608f796 100644
--- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts
+++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.ts
@@ -5,7 +5,7 @@ import { ActivatedRoute, Router } from '@angular/router'
5import { Location } from '@angular/common' 5import { Location } from '@angular/common'
6import { immutableAssign } from '@app/shared/misc/utils' 6import { immutableAssign } from '@app/shared/misc/utils'
7import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 7import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
8import { NotificationsService } from 'angular2-notifications' 8import { Notifier } from '@app/core'
9import { AuthService } from '../../core/auth' 9import { AuthService } from '../../core/auth'
10import { ConfirmService } from '../../core/confirm' 10import { ConfirmService } from '../../core/confirm'
11import { AbstractVideoList } from '../../shared/video/abstract-video-list' 11import { AbstractVideoList } from '../../shared/video/abstract-video-list'
@@ -40,7 +40,7 @@ export class MyAccountVideosComponent extends AbstractVideoList implements OnIni
40 protected router: Router, 40 protected router: Router,
41 protected route: ActivatedRoute, 41 protected route: ActivatedRoute,
42 protected authService: AuthService, 42 protected authService: AuthService,
43 protected notificationsService: NotificationsService, 43 protected notifier: Notifier,
44 protected location: Location, 44 protected location: Location,
45 protected screenService: ScreenService, 45 protected screenService: ScreenService,
46 protected i18n: I18n, 46 protected i18n: I18n,
@@ -102,16 +102,13 @@ export class MyAccountVideosComponent extends AbstractVideoList implements OnIni
102 .pipe(concatAll()) 102 .pipe(concatAll())
103 .subscribe( 103 .subscribe(
104 res => { 104 res => {
105 this.notificationsService.success( 105 this.notifier.success(this.i18n('{{deleteLength}} videos deleted.', { deleteLength: toDeleteVideosIds.length }))
106 this.i18n('Success'),
107 this.i18n('{{deleteLength}} videos deleted.', { deleteLength: toDeleteVideosIds.length })
108 )
109 106
110 this.abortSelectionMode() 107 this.abortSelectionMode()
111 this.reloadVideos() 108 this.reloadVideos()
112 }, 109 },
113 110
114 err => this.notificationsService.error(this.i18n('Error'), err.message) 111 err => this.notifier.error(err.message)
115 ) 112 )
116 } 113 }
117 114
@@ -124,15 +121,12 @@ export class MyAccountVideosComponent extends AbstractVideoList implements OnIni
124 121
125 this.videoService.removeVideo(video.id) 122 this.videoService.removeVideo(video.id)
126 .subscribe( 123 .subscribe(
127 status => { 124 () => {
128 this.notificationsService.success( 125 this.notifier.success(this.i18n('Video {{videoName}} deleted.', { videoName: video.name }))
129 this.i18n('Success'),
130 this.i18n('Video {{videoName}} deleted.', { videoName: video.name })
131 )
132 this.reloadVideos() 126 this.reloadVideos()
133 }, 127 },
134 128
135 error => this.notificationsService.error(this.i18n('Error'), error.message) 129 error => this.notifier.error(error.message)
136 ) 130 )
137 } 131 }
138 132
@@ -169,7 +163,7 @@ export class MyAccountVideosComponent extends AbstractVideoList implements OnIni
169 163
170 private spliceVideosById (id: number) { 164 private spliceVideosById (id: number) {
171 for (const key of Object.keys(this.loadedPages)) { 165 for (const key of Object.keys(this.loadedPages)) {
172 const videos = this.loadedPages[ key ] 166 const videos: Video[] = this.loadedPages[ key ]
173 const index = videos.findIndex(v => v.id === id) 167 const index = videos.findIndex(v => v.id === id)
174 168
175 if (index !== -1) { 169 if (index !== -1) {
diff --git a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
index 69b198faa..22f127904 100644
--- a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
+++ b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal let-close="close" let-dismiss="dismiss"> 1<ng-template #modal let-close="close" let-dismiss="dismiss">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Change ownership</h4> 3 <h4 i18n class="modal-title">Change ownership</h4>
4 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body" [formGroup]="form"> 8 <div class="modal-body" [formGroup]="form">
@@ -22,9 +23,9 @@
22 </span> 23 </span>
23 24
24 <input 25 <input
25 type="submit" i18n-value value="Submit" class="action-button-submit" 26 type="submit" i18n-value value="Submit" class="action-button-submit"
26 [disabled]="!form.valid" 27 [disabled]="!form.valid"
27 (click)="close()" 28 (click)="close()"
28 /> 29 />
29 </div> 30 </div>
30 </div> 31 </div>
diff --git a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts
index 7437b939a..37d7cf2a4 100644
--- a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts
+++ b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts
@@ -1,5 +1,5 @@
1import { Component, ElementRef, OnInit, ViewChild } from '@angular/core' 1import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 3import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
4import { FormReactive, UserService } from '../../../shared/index' 4import { FormReactive, UserService } from '../../../shared/index'
5import { Video } from '@app/shared/video/video.model' 5import { Video } from '@app/shared/video/video.model'
@@ -25,7 +25,7 @@ export class VideoChangeOwnershipComponent extends FormReactive implements OnIni
25 protected formValidatorService: FormValidatorService, 25 protected formValidatorService: FormValidatorService,
26 private videoChangeOwnershipValidatorsService: VideoChangeOwnershipValidatorsService, 26 private videoChangeOwnershipValidatorsService: VideoChangeOwnershipValidatorsService,
27 private videoOwnershipService: VideoOwnershipService, 27 private videoOwnershipService: VideoOwnershipService,
28 private notificationsService: NotificationsService, 28 private notifier: Notifier,
29 private userService: UserService, 29 private userService: UserService,
30 private modalService: NgbModal, 30 private modalService: NgbModal,
31 private i18n: I18n 31 private i18n: I18n
@@ -49,15 +49,13 @@ export class VideoChangeOwnershipComponent extends FormReactive implements OnIni
49 .catch((_) => _) // Called when closing (cancel) the modal without validating, do nothing 49 .catch((_) => _) // Called when closing (cancel) the modal without validating, do nothing
50 } 50 }
51 51
52 search (event) { 52 search (event: { query: string }) {
53 const query = event.query 53 const query = event.query
54 this.userService.autocomplete(query) 54 this.userService.autocomplete(query)
55 .subscribe( 55 .subscribe(
56 usernames => { 56 usernames => this.usernamePropositions = usernames,
57 this.usernamePropositions = usernames
58 },
59 57
60 err => this.notificationsService.error('Error', err.message) 58 err => this.notifier.error(err.message)
61 ) 59 )
62 } 60 }
63 61
@@ -67,9 +65,9 @@ export class VideoChangeOwnershipComponent extends FormReactive implements OnIni
67 this.videoOwnershipService 65 this.videoOwnershipService
68 .changeOwnership(this.video.id, username) 66 .changeOwnership(this.video.id, username)
69 .subscribe( 67 .subscribe(
70 () => this.notificationsService.success(this.i18n('Success'), this.i18n('Ownership change request sent.')), 68 () => this.notifier.success(this.i18n('Ownership change request sent.')),
71 69
72 err => this.notificationsService.error(this.i18n('Error'), err.message) 70 err => this.notifier.error(err.message)
73 ) 71 )
74 } 72 }
75} 73}
diff --git a/client/src/app/+my-account/my-account.component.html b/client/src/app/+my-account/my-account.component.html
index b602fd69f..3999252be 100644
--- a/client/src/app/+my-account/my-account.component.html
+++ b/client/src/app/+my-account/my-account.component.html
@@ -1,26 +1,5 @@
1<div class="row"> 1<div class="row">
2 <div class="sub-menu"> 2 <my-top-menu-dropdown [menuEntries]="menuEntries"></my-top-menu-dropdown>
3 <a i18n routerLink="/my-account/settings" routerLinkActive="active" class="title-page">My settings</a>
4
5 <div ngbDropdown class="my-library">
6 <span role="button" class="title-page" [ngClass]="{ active: libraryLabel !== '' }" ngbDropdownToggle>
7 <ng-container i18n>My library</ng-container>
8 <ng-container *ngIf="libraryLabel"> - {{ libraryLabel }}</ng-container>
9 </span>
10
11 <div ngbDropdownMenu>
12 <a class="dropdown-item" i18n routerLink="/my-account/video-channels">My channels</a>
13
14 <a class="dropdown-item" i18n routerLink="/my-account/videos">My videos</a>
15
16 <a class="dropdown-item" i18n routerLink="/my-account/subscriptions">My subscriptions</a>
17
18 <a class="dropdown-item" *ngIf="isVideoImportEnabled()" i18n routerLink="/my-account/video-imports">My imports</a>
19 </div>
20 </div>
21
22 <a i18n routerLink="/my-account/ownership" routerLinkActive="active" class="title-page">Ownership changes</a>
23 </div>
24 3
25 <div class="margin-content"> 4 <div class="margin-content">
26 <router-outlet></router-outlet> 5 <router-outlet></router-outlet>
diff --git a/client/src/app/+my-account/my-account.component.scss b/client/src/app/+my-account/my-account.component.scss
index 20b2639b5..4f111efdf 100644
--- a/client/src/app/+my-account/my-account.component.scss
+++ b/client/src/app/+my-account/my-account.component.scss
@@ -1,14 +1,3 @@
1.my-library { 1.row {
2 span[role=button] { 2 flex-direction: column;
3 cursor: pointer;
4 }
5
6 a {
7 display: block;
8 }
9} 3}
10
11/deep/ .dropdown-toggle::after {
12 position: relative;
13 top: 2px;
14} \ No newline at end of file
diff --git a/client/src/app/+my-account/my-account.component.ts b/client/src/app/+my-account/my-account.component.ts
index bad60a8fb..8a4102d80 100644
--- a/client/src/app/+my-account/my-account.component.ts
+++ b/client/src/app/+my-account/my-account.component.ts
@@ -1,37 +1,80 @@
1import { Component, OnDestroy, OnInit } from '@angular/core' 1import { Component } from '@angular/core'
2import { ServerService } from '@app/core' 2import { ServerService } from '@app/core'
3import { NavigationStart, Router } from '@angular/router'
4import { filter } from 'rxjs/operators'
5import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
6import { Subscription } from 'rxjs' 4import { TopMenuDropdownParam } from '@app/shared/menu/top-menu-dropdown.component'
7 5
8@Component({ 6@Component({
9 selector: 'my-my-account', 7 selector: 'my-my-account',
10 templateUrl: './my-account.component.html', 8 templateUrl: './my-account.component.html',
11 styleUrls: [ './my-account.component.scss' ] 9 styleUrls: [ './my-account.component.scss' ]
12}) 10})
13export class MyAccountComponent implements OnInit, OnDestroy { 11export class MyAccountComponent {
14 12 menuEntries: TopMenuDropdownParam[] = []
15 libraryLabel = ''
16
17 private routeSub: Subscription
18 13
19 constructor ( 14 constructor (
20 private serverService: ServerService, 15 private serverService: ServerService,
21 private router: Router,
22 private i18n: I18n 16 private i18n: I18n
23 ) {} 17 ) {
24 18
25 ngOnInit () { 19 const libraryEntries: TopMenuDropdownParam = {
26 this.updateLibraryLabel(this.router.url) 20 label: this.i18n('My library'),
21 children: [
22 {
23 label: this.i18n('My channels'),
24 routerLink: '/my-account/video-channels'
25 },
26 {
27 label: this.i18n('My videos'),
28 routerLink: '/my-account/videos'
29 },
30 {
31 label: this.i18n('My subscriptions'),
32 routerLink: '/my-account/subscriptions'
33 },
34 {
35 label: this.i18n('My history'),
36 routerLink: '/my-account/history/videos'
37 }
38 ]
39 }
27 40
28 this.routeSub = this.router.events 41 if (this.isVideoImportEnabled()) {
29 .pipe(filter(event => event instanceof NavigationStart)) 42 libraryEntries.children.push({
30 .subscribe((event: NavigationStart) => this.updateLibraryLabel(event.url)) 43 label: 'My imports',
31 } 44 routerLink: '/my-account/video-imports'
45 })
46 }
32 47
33 ngOnDestroy () { 48 const miscEntries: TopMenuDropdownParam = {
34 if (this.routeSub) this.routeSub.unsubscribe() 49 label: this.i18n('Misc'),
50 children: [
51 {
52 label: this.i18n('Muted accounts'),
53 routerLink: '/my-account/blocklist/accounts'
54 },
55 {
56 label: this.i18n('Muted instances'),
57 routerLink: '/my-account/blocklist/servers'
58 },
59 {
60 label: this.i18n('Ownership changes'),
61 routerLink: '/my-account/ownership'
62 }
63 ]
64 }
65
66 this.menuEntries = [
67 {
68 label: this.i18n('My settings'),
69 routerLink: '/my-account/settings'
70 },
71 {
72 label: this.i18n('My notifications'),
73 routerLink: '/my-account/notifications'
74 },
75 libraryEntries,
76 miscEntries
77 ]
35 } 78 }
36 79
37 isVideoImportEnabled () { 80 isVideoImportEnabled () {
@@ -40,19 +83,4 @@ export class MyAccountComponent implements OnInit, OnDestroy {
40 return importConfig.http.enabled || importConfig.torrent.enabled 83 return importConfig.http.enabled || importConfig.torrent.enabled
41 } 84 }
42 85
43 private updateLibraryLabel (url: string) {
44 const [ path ] = url.split('?')
45
46 if (path.startsWith('/my-account/video-channels')) {
47 this.libraryLabel = this.i18n('Channels')
48 } else if (path.startsWith('/my-account/videos')) {
49 this.libraryLabel = this.i18n('Videos')
50 } else if (path.startsWith('/my-account/subscriptions')) {
51 this.libraryLabel = this.i18n('Subscriptions')
52 } else if (path.startsWith('/my-account/video-imports')) {
53 this.libraryLabel = this.i18n('Video imports')
54 } else {
55 this.libraryLabel = ''
56 }
57 }
58} 86}
diff --git a/client/src/app/+my-account/my-account.module.ts b/client/src/app/+my-account/my-account.module.ts
index ad21162a8..18f51f171 100644
--- a/client/src/app/+my-account/my-account.module.ts
+++ b/client/src/app/+my-account/my-account.module.ts
@@ -1,6 +1,7 @@
1import { TableModule } from 'primeng/table' 1import { TableModule } from 'primeng/table'
2import { NgModule } from '@angular/core' 2import { NgModule } from '@angular/core'
3import { AutoCompleteModule } from 'primeng/autocomplete' 3import { AutoCompleteModule } from 'primeng/autocomplete'
4import { InputSwitchModule } from 'primeng/inputswitch'
4import { SharedModule } from '../shared' 5import { SharedModule } from '../shared'
5import { MyAccountRoutingModule } from './my-account-routing.module' 6import { MyAccountRoutingModule } from './my-account-routing.module'
6import { MyAccountChangePasswordComponent } from './my-account-settings/my-account-change-password/my-account-change-password.component' 7import { MyAccountChangePasswordComponent } from './my-account-settings/my-account-change-password/my-account-change-password.component'
@@ -19,6 +20,11 @@ import { ActorAvatarInfoComponent } from '@app/+my-account/shared/actor-avatar-i
19import { MyAccountVideoImportsComponent } from '@app/+my-account/my-account-video-imports/my-account-video-imports.component' 20import { MyAccountVideoImportsComponent } from '@app/+my-account/my-account-video-imports/my-account-video-imports.component'
20import { MyAccountDangerZoneComponent } from '@app/+my-account/my-account-settings/my-account-danger-zone' 21import { MyAccountDangerZoneComponent } from '@app/+my-account/my-account-settings/my-account-danger-zone'
21import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-subscriptions/my-account-subscriptions.component' 22import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-subscriptions/my-account-subscriptions.component'
23import { MyAccountBlocklistComponent } from '@app/+my-account/my-account-blocklist/my-account-blocklist.component'
24import { MyAccountServerBlocklistComponent } from '@app/+my-account/my-account-blocklist/my-account-server-blocklist.component'
25import { MyAccountHistoryComponent } from '@app/+my-account/my-account-history/my-account-history.component'
26import { MyAccountNotificationsComponent } from '@app/+my-account/my-account-notifications/my-account-notifications.component'
27import { MyAccountNotificationPreferencesComponent } from '@app/+my-account/my-account-settings/my-account-notification-preferences'
22 28
23@NgModule({ 29@NgModule({
24 imports: [ 30 imports: [
@@ -26,7 +32,8 @@ import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-sub
26 MyAccountRoutingModule, 32 MyAccountRoutingModule,
27 AutoCompleteModule, 33 AutoCompleteModule,
28 SharedModule, 34 SharedModule,
29 TableModule 35 TableModule,
36 InputSwitchModule
30 ], 37 ],
31 38
32 declarations: [ 39 declarations: [
@@ -45,7 +52,12 @@ import { MyAccountSubscriptionsComponent } from '@app/+my-account/my-account-sub
45 ActorAvatarInfoComponent, 52 ActorAvatarInfoComponent,
46 MyAccountVideoImportsComponent, 53 MyAccountVideoImportsComponent,
47 MyAccountDangerZoneComponent, 54 MyAccountDangerZoneComponent,
48 MyAccountSubscriptionsComponent 55 MyAccountSubscriptionsComponent,
56 MyAccountBlocklistComponent,
57 MyAccountServerBlocklistComponent,
58 MyAccountHistoryComponent,
59 MyAccountNotificationsComponent,
60 MyAccountNotificationPreferencesComponent
49 ], 61 ],
50 62
51 exports: [ 63 exports: [
diff --git a/client/src/app/+my-account/shared/actor-avatar-info.component.ts b/client/src/app/+my-account/shared/actor-avatar-info.component.ts
index 7b80b1ed4..72c815a0c 100644
--- a/client/src/app/+my-account/shared/actor-avatar-info.component.ts
+++ b/client/src/app/+my-account/shared/actor-avatar-info.component.ts
@@ -1,8 +1,8 @@
1import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core' 1import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'
2import { ServerService } from '../../core/server' 2import { ServerService } from '../../core/server'
3import { NotificationsService } from 'angular2-notifications'
4import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 3import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
5import { Account } from '@app/shared/account/account.model' 4import { Account } from '@app/shared/account/account.model'
5import { Notifier } from '@app/core'
6 6
7@Component({ 7@Component({
8 selector: 'my-actor-avatar-info', 8 selector: 'my-actor-avatar-info',
@@ -10,7 +10,7 @@ import { Account } from '@app/shared/account/account.model'
10 styleUrls: [ './actor-avatar-info.component.scss' ] 10 styleUrls: [ './actor-avatar-info.component.scss' ]
11}) 11})
12export class ActorAvatarInfoComponent { 12export class ActorAvatarInfoComponent {
13 @ViewChild('avatarfileInput') avatarfileInput 13 @ViewChild('avatarfileInput') avatarfileInput: ElementRef<HTMLInputElement>
14 14
15 @Input() actor: VideoChannel | Account 15 @Input() actor: VideoChannel | Account
16 16
@@ -18,13 +18,13 @@ export class ActorAvatarInfoComponent {
18 18
19 constructor ( 19 constructor (
20 private serverService: ServerService, 20 private serverService: ServerService,
21 private notificationsService: NotificationsService 21 private notifier: Notifier
22 ) {} 22 ) {}
23 23
24 onAvatarChange () { 24 onAvatarChange () {
25 const avatarfile = this.avatarfileInput.nativeElement.files[ 0 ] 25 const avatarfile = this.avatarfileInput.nativeElement.files[ 0 ]
26 if (avatarfile.size > this.maxAvatarSize) { 26 if (avatarfile.size > this.maxAvatarSize) {
27 this.notificationsService.error('Error', 'This image is too large.') 27 this.notifier.error('Error', 'This image is too large.')
28 return 28 return
29 } 29 }
30 30
diff --git a/client/src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts b/client/src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts
index 995f42ffc..cfd471fa4 100644
--- a/client/src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts
+++ b/client/src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts
@@ -1,9 +1,8 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { I18n } from '@ngx-translate/i18n-polyfill' 2import { I18n } from '@ngx-translate/i18n-polyfill'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier, RedirectService } from '@app/core'
4import { ServerService } from '@app/core/server' 4import { ServerService } from '@app/core/server'
5import { RedirectService } from '@app/core' 5import { FormReactive, UserService } from '@app/shared'
6import { UserService, FormReactive } from '@app/shared'
7import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 6import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
8import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service' 7import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service'
9 8
@@ -20,7 +19,7 @@ export class VerifyAccountAskSendEmailComponent extends FormReactive implements
20 private userValidatorsService: UserValidatorsService, 19 private userValidatorsService: UserValidatorsService,
21 private userService: UserService, 20 private userService: UserService,
22 private serverService: ServerService, 21 private serverService: ServerService,
23 private notificationsService: NotificationsService, 22 private notifier: Notifier,
24 private redirectService: RedirectService, 23 private redirectService: RedirectService,
25 private i18n: I18n 24 private i18n: I18n
26 ) { 25 ) {
@@ -46,12 +45,12 @@ export class VerifyAccountAskSendEmailComponent extends FormReactive implements
46 'An email with verification link will be sent to {{email}}.', 45 'An email with verification link will be sent to {{email}}.',
47 { email } 46 { email }
48 ) 47 )
49 this.notificationsService.success(this.i18n('Success'), message) 48 this.notifier.success(message)
50 this.redirectService.redirectToHomepage() 49 this.redirectService.redirectToHomepage()
51 }, 50 },
52 51
53 err => { 52 err => {
54 this.notificationsService.error(this.i18n('Error'), err.message) 53 this.notifier.error(err.message)
55 } 54 }
56 ) 55 )
57 } 56 }
diff --git a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.html b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.html
index 30ace5e10..a83d4a3c2 100644
--- a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.html
+++ b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.html
@@ -9,7 +9,7 @@
9 <ng-template #verificationError> 9 <ng-template #verificationError>
10 <div> 10 <div>
11 <span i18n>An error occurred. </span> 11 <span i18n>An error occurred. </span>
12 <a i18n routerLink="/verify-account/ask-email">Request new verification email.</a> 12 <a i18n routerLink="/verify-account/ask-send-email">Request new verification email.</a>
13 </div> 13 </div>
14 </ng-template> 14 </ng-template>
15</div> 15</div>
diff --git a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts
index 26b3bf4b1..f9ecf664b 100644
--- a/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts
+++ b/client/src/app/+verify-account/verify-account-email/verify-account-email.component.ts
@@ -1,7 +1,7 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { NotificationsService } from 'angular2-notifications' 4import { Notifier } from '@app/core'
5import { UserService } from '@app/shared' 5import { UserService } from '@app/shared'
6 6
7@Component({ 7@Component({
@@ -17,7 +17,7 @@ export class VerifyAccountEmailComponent implements OnInit {
17 17
18 constructor ( 18 constructor (
19 private userService: UserService, 19 private userService: UserService,
20 private notificationsService: NotificationsService, 20 private notifier: Notifier,
21 private router: Router, 21 private router: Router,
22 private route: ActivatedRoute, 22 private route: ActivatedRoute,
23 private i18n: I18n 23 private i18n: I18n
@@ -25,12 +25,11 @@ export class VerifyAccountEmailComponent implements OnInit {
25 } 25 }
26 26
27 ngOnInit () { 27 ngOnInit () {
28
29 this.userId = this.route.snapshot.queryParams['userId'] 28 this.userId = this.route.snapshot.queryParams['userId']
30 this.verificationString = this.route.snapshot.queryParams['verificationString'] 29 this.verificationString = this.route.snapshot.queryParams['verificationString']
31 30
32 if (!this.userId || !this.verificationString) { 31 if (!this.userId || !this.verificationString) {
33 this.notificationsService.error(this.i18n('Error'), this.i18n('Unable to find user id or verification string.')) 32 this.notifier.error(this.i18n('Unable to find user id or verification string.'))
34 } else { 33 } else {
35 this.verifyEmail() 34 this.verifyEmail()
36 } 35 }
@@ -47,7 +46,7 @@ export class VerifyAccountEmailComponent implements OnInit {
47 }, 46 },
48 47
49 err => { 48 err => {
50 this.notificationsService.error(this.i18n('Error'), err.message) 49 this.notifier.error(err.message)
51 } 50 }
52 ) 51 )
53 } 52 }
diff --git a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
index ea7b0e118..895b19064 100644
--- a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
+++ b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
@@ -3,7 +3,7 @@ import { VideoChannelService } from '@app/shared/video-channel/video-channel.ser
3import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 3import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { Subscription } from 'rxjs' 5import { Subscription } from 'rxjs'
6import { MarkdownService } from '@app/videos/shared' 6import { MarkdownService } from '@app/shared/renderer'
7 7
8@Component({ 8@Component({
9 selector: 'my-video-channel-about', 9 selector: 'my-video-channel-about',
diff --git a/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts
index 800d97b7f..dea378a6e 100644
--- a/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts
+++ b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts
@@ -2,7 +2,6 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { Location } from '@angular/common' 3import { Location } from '@angular/common'
4import { immutableAssign } from '@app/shared/misc/utils' 4import { immutableAssign } from '@app/shared/misc/utils'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { ConfirmService } from '../../core/confirm' 6import { ConfirmService } from '../../core/confirm'
8import { AbstractVideoList } from '../../shared/video/abstract-video-list' 7import { AbstractVideoList } from '../../shared/video/abstract-video-list'
@@ -13,6 +12,7 @@ import { tap } from 'rxjs/operators'
13import { I18n } from '@ngx-translate/i18n-polyfill' 12import { I18n } from '@ngx-translate/i18n-polyfill'
14import { Subscription } from 'rxjs' 13import { Subscription } from 'rxjs'
15import { ScreenService } from '@app/shared/misc/screen.service' 14import { ScreenService } from '@app/shared/misc/screen.service'
15import { Notifier } from '@app/core'
16 16
17@Component({ 17@Component({
18 selector: 'my-video-channel-videos', 18 selector: 'my-video-channel-videos',
@@ -25,7 +25,7 @@ import { ScreenService } from '@app/shared/misc/screen.service'
25export class VideoChannelVideosComponent extends AbstractVideoList implements OnInit, OnDestroy { 25export class VideoChannelVideosComponent extends AbstractVideoList implements OnInit, OnDestroy {
26 titlePage: string 26 titlePage: string
27 marginContent = false // Disable margin 27 marginContent = false // Disable margin
28 currentRoute = '/video-channel/videos' 28 currentRoute = '/video-channels/videos'
29 loadOnInit = false 29 loadOnInit = false
30 30
31 private videoChannel: VideoChannel 31 private videoChannel: VideoChannel
@@ -35,7 +35,7 @@ export class VideoChannelVideosComponent extends AbstractVideoList implements On
35 protected router: Router, 35 protected router: Router,
36 protected route: ActivatedRoute, 36 protected route: ActivatedRoute,
37 protected authService: AuthService, 37 protected authService: AuthService,
38 protected notificationsService: NotificationsService, 38 protected notifier: Notifier,
39 protected confirmService: ConfirmService, 39 protected confirmService: ConfirmService,
40 protected location: Location, 40 protected location: Location,
41 protected screenService: ScreenService, 41 protected screenService: ScreenService,
@@ -55,7 +55,7 @@ export class VideoChannelVideosComponent extends AbstractVideoList implements On
55 this.videoChannelSub = this.videoChannelService.videoChannelLoaded 55 this.videoChannelSub = this.videoChannelService.videoChannelLoaded
56 .subscribe(videoChannel => { 56 .subscribe(videoChannel => {
57 this.videoChannel = videoChannel 57 this.videoChannel = videoChannel
58 this.currentRoute = '/video-channel/' + this.videoChannel.uuid + '/videos' 58 this.currentRoute = '/video-channels/' + this.videoChannel.nameWithHost + '/videos'
59 59
60 this.reloadVideos() 60 this.reloadVideos()
61 this.generateSyndicationList() 61 this.generateSyndicationList()
diff --git a/client/src/app/+video-channels/video-channels-routing.module.ts b/client/src/app/+video-channels/video-channels-routing.module.ts
index 935578d2a..3ac3533d9 100644
--- a/client/src/app/+video-channels/video-channels-routing.module.ts
+++ b/client/src/app/+video-channels/video-channels-routing.module.ts
@@ -7,7 +7,7 @@ import { VideoChannelAboutComponent } from './video-channel-about/video-channel-
7 7
8const videoChannelsRoutes: Routes = [ 8const videoChannelsRoutes: Routes = [
9 { 9 {
10 path: ':videoChannelId', 10 path: ':videoChannelName',
11 component: VideoChannelsComponent, 11 component: VideoChannelsComponent,
12 canActivateChild: [ MetaGuard ], 12 canActivateChild: [ MetaGuard ],
13 children: [ 13 children: [
diff --git a/client/src/app/+video-channels/video-channels.component.ts b/client/src/app/+video-channels/video-channels.component.ts
index 0c5c814c7..41ff82e98 100644
--- a/client/src/app/+video-channels/video-channels.component.ts
+++ b/client/src/app/+video-channels/video-channels.component.ts
@@ -34,9 +34,9 @@ export class VideoChannelsComponent implements OnInit, OnDestroy {
34 ngOnInit () { 34 ngOnInit () {
35 this.routeSub = this.route.params 35 this.routeSub = this.route.params
36 .pipe( 36 .pipe(
37 map(params => params[ 'videoChannelId' ]), 37 map(params => params[ 'videoChannelName' ]),
38 distinctUntilChanged(), 38 distinctUntilChanged(),
39 switchMap(videoChannelId => this.videoChannelService.getVideoChannel(videoChannelId)), 39 switchMap(videoChannelName => this.videoChannelService.getVideoChannel(videoChannelName)),
40 catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 404 ])) 40 catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 404 ]))
41 ) 41 )
42 .subscribe(videoChannel => this.videoChannel = videoChannel) 42 .subscribe(videoChannel => this.videoChannel = videoChannel)
diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts
index 545d6aeda..cff37a7d6 100644
--- a/client/src/app/app-routing.module.ts
+++ b/client/src/app/app-routing.module.ts
@@ -43,7 +43,8 @@ const routes: Routes = [
43 imports: [ 43 imports: [
44 RouterModule.forRoot(routes, { 44 RouterModule.forRoot(routes, {
45 useHash: Boolean(history.pushState) === false, 45 useHash: Boolean(history.pushState) === false,
46 preloadingStrategy: PreloadSelectedModulesList 46 preloadingStrategy: PreloadSelectedModulesList,
47 anchorScrolling: 'enabled'
47 }) 48 })
48 ], 49 ],
49 providers: [ 50 providers: [
diff --git a/client/src/app/app.component.html b/client/src/app/app.component.html
index 03f7e88ed..d398d4f35 100644
--- a/client/src/app/app.component.html
+++ b/client/src/app/app.component.html
@@ -30,12 +30,27 @@
30 30
31 <footer class="row"> 31 <footer class="row">
32 <a href="https://joinpeertube.org" title="PeerTube website" target="_blank" rel="noopener noreferrer">PeerTube v{{ serverVersion }}{{ serverCommit }}</a>&nbsp;-&nbsp; 32 <a href="https://joinpeertube.org" title="PeerTube website" target="_blank" rel="noopener noreferrer">PeerTube v{{ serverVersion }}{{ serverCommit }}</a>&nbsp;-&nbsp;
33 <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2018</a> 33 <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2019</a>
34 </footer> 34 </footer>
35 </div> 35 </div>
36 </div> 36 </div>
37</div> 37</div>
38 38
39<ngx-loading-bar [includeSpinner]="false"></ngx-loading-bar> 39<ngx-loading-bar [includeSpinner]="false"></ngx-loading-bar>
40
40<my-confirm></my-confirm> 41<my-confirm></my-confirm>
41<simple-notifications [options]="notificationOptions"></simple-notifications> 42
43<p-toast position="bottom-right">
44 <ng-template let-message pTemplate="message">
45 <div class="notification-block">
46 <div class="message">
47 <h3>{{ message.summary }}</h3>
48 <p>{{ message.detail }}</p>
49 </div>
50
51 <span *ngIf="message.severity === 'success'" class="glyphicon glyphicon-ok"></span>
52 <span *ngIf="message.severity === 'info'" class="glyphicon glyphicon-info-sign"></span>
53 <span *ngIf="message.severity === 'error'" class="glyphicon glyphicon-remove"></span>
54 </div>
55 </ng-template>
56</p-toast>
diff --git a/client/src/app/app.component.scss b/client/src/app/app.component.scss
index b51a81eb1..881f3ff31 100644
--- a/client/src/app/app.component.scss
+++ b/client/src/app/app.component.scss
@@ -91,8 +91,3 @@ footer {
91 height: $footer-height; 91 height: $footer-height;
92 justify-content: center; 92 justify-content: center;
93} 93}
94
95simple-notifications {
96 position: relative;
97 z-index: 1500;
98}
diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts
index dc4d0bf6a..7583fdee8 100644
--- a/client/src/app/app.component.ts
+++ b/client/src/app/app.component.ts
@@ -15,19 +15,6 @@ import { fromEvent } from 'rxjs'
15 styleUrls: [ './app.component.scss' ] 15 styleUrls: [ './app.component.scss' ]
16}) 16})
17export class AppComponent implements OnInit { 17export class AppComponent implements OnInit {
18 notificationOptions = {
19 timeOut: 5000,
20 lastOnBottom: true,
21 clickToClose: true,
22 maxLength: 0,
23 maxStack: 7,
24 showProgressBar: false,
25 pauseOnHover: false,
26 preventDuplicates: false,
27 preventLastDuplicates: 'visible',
28 rtl: false
29 }
30
31 isMenuDisplayed = true 18 isMenuDisplayed = true
32 isMenuChangedByUser = false 19 isMenuChangedByUser = false
33 20
diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts
index 34e890b40..0bbc2e08b 100644
--- a/client/src/app/app.module.ts
+++ b/client/src/app/app.module.ts
@@ -12,13 +12,12 @@ import { AppComponent } from './app.component'
12import { CoreModule } from './core' 12import { CoreModule } from './core'
13import { HeaderComponent } from './header' 13import { HeaderComponent } from './header'
14import { LoginModule } from './login' 14import { LoginModule } from './login'
15import { MenuComponent } from './menu' 15import { AvatarNotificationComponent, LanguageChooserComponent, MenuComponent } from './menu'
16import { SharedModule } from './shared' 16import { SharedModule } from './shared'
17import { SignupModule } from './signup' 17import { SignupModule } from './signup'
18import { VideosModule } from './videos' 18import { VideosModule } from './videos'
19import { buildFileLocale, getCompleteLocale, isDefaultLocale } from '../../../shared/models/i18n' 19import { buildFileLocale, getCompleteLocale, isDefaultLocale } from '../../../shared/models/i18n'
20import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' 20import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
21import { LanguageChooserComponent } from '@app/menu/language-chooser.component'
22import { SearchModule } from '@app/search' 21import { SearchModule } from '@app/search'
23 22
24export function metaFactory (serverService: ServerService): MetaLoader { 23export function metaFactory (serverService: ServerService): MetaLoader {
@@ -40,6 +39,7 @@ export function metaFactory (serverService: ServerService): MetaLoader {
40 39
41 MenuComponent, 40 MenuComponent,
42 LanguageChooserComponent, 41 LanguageChooserComponent,
42 AvatarNotificationComponent,
43 HeaderComponent 43 HeaderComponent
44 ], 44 ],
45 imports: [ 45 imports: [
@@ -69,7 +69,7 @@ export function metaFactory (serverService: ServerService): MetaLoader {
69 providers: [ 69 providers: [
70 { 70 {
71 provide: TRANSLATIONS, 71 provide: TRANSLATIONS,
72 useFactory: (locale) => { 72 useFactory: (locale: string) => {
73 // On dev mode, test localization 73 // On dev mode, test localization
74 if (isOnDevLocale()) { 74 if (isOnDevLocale()) {
75 locale = buildFileLocale(getDevLocale()) 75 locale = buildFileLocale(getDevLocale())
diff --git a/client/src/app/core/auth/auth-user.model.ts b/client/src/app/core/auth/auth-user.model.ts
index 74ed1c580..abb11fdc2 100644
--- a/client/src/app/core/auth/auth-user.model.ts
+++ b/client/src/app/core/auth/auth-user.model.ts
@@ -1,8 +1,9 @@
1import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' 1import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
2import { UserRight } from '../../../../../shared/models/users/user-right.enum' 2import { UserRight } from '../../../../../shared/models/users/user-right.enum'
3import { User as ServerUserModel } from '../../../../../shared/models/users/user.model'
3// Do not use the barrel (dependency loop) 4// Do not use the barrel (dependency loop)
4import { hasUserRight, UserRole } from '../../../../../shared/models/users/user-role' 5import { hasUserRight, UserRole } from '../../../../../shared/models/users/user-role'
5import { User, UserConstructorHash } from '../../shared/users/user.model' 6import { User } from '../../shared/users/user.model'
6import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type' 7import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
7 8
8export type TokenOptions = { 9export type TokenOptions = {
@@ -70,8 +71,10 @@ export class AuthUser extends User {
70 ID: 'id', 71 ID: 'id',
71 ROLE: 'role', 72 ROLE: 'role',
72 EMAIL: 'email', 73 EMAIL: 'email',
74 VIDEOS_HISTORY_ENABLED: 'videos-history-enabled',
73 USERNAME: 'username', 75 USERNAME: 'username',
74 NSFW_POLICY: 'nsfw_policy', 76 NSFW_POLICY: 'nsfw_policy',
77 WEBTORRENT_ENABLED: 'peertube-videojs-' + 'webtorrent_enabled',
75 AUTO_PLAY_VIDEO: 'auto_play_video' 78 AUTO_PLAY_VIDEO: 'auto_play_video'
76 } 79 }
77 80
@@ -87,7 +90,9 @@ export class AuthUser extends User {
87 email: peertubeLocalStorage.getItem(this.KEYS.EMAIL), 90 email: peertubeLocalStorage.getItem(this.KEYS.EMAIL),
88 role: parseInt(peertubeLocalStorage.getItem(this.KEYS.ROLE), 10) as UserRole, 91 role: parseInt(peertubeLocalStorage.getItem(this.KEYS.ROLE), 10) as UserRole,
89 nsfwPolicy: peertubeLocalStorage.getItem(this.KEYS.NSFW_POLICY) as NSFWPolicyType, 92 nsfwPolicy: peertubeLocalStorage.getItem(this.KEYS.NSFW_POLICY) as NSFWPolicyType,
90 autoPlayVideo: peertubeLocalStorage.getItem(this.KEYS.AUTO_PLAY_VIDEO) === 'true' 93 webTorrentEnabled: peertubeLocalStorage.getItem(this.KEYS.WEBTORRENT_ENABLED) === 'true',
94 autoPlayVideo: peertubeLocalStorage.getItem(this.KEYS.AUTO_PLAY_VIDEO) === 'true',
95 videosHistoryEnabled: peertubeLocalStorage.getItem(this.KEYS.VIDEOS_HISTORY_ENABLED) === 'true'
91 }, 96 },
92 Tokens.load() 97 Tokens.load()
93 ) 98 )
@@ -101,12 +106,14 @@ export class AuthUser extends User {
101 peertubeLocalStorage.removeItem(this.KEYS.ID) 106 peertubeLocalStorage.removeItem(this.KEYS.ID)
102 peertubeLocalStorage.removeItem(this.KEYS.ROLE) 107 peertubeLocalStorage.removeItem(this.KEYS.ROLE)
103 peertubeLocalStorage.removeItem(this.KEYS.NSFW_POLICY) 108 peertubeLocalStorage.removeItem(this.KEYS.NSFW_POLICY)
109 peertubeLocalStorage.removeItem(this.KEYS.WEBTORRENT_ENABLED)
110 peertubeLocalStorage.removeItem(this.KEYS.VIDEOS_HISTORY_ENABLED)
104 peertubeLocalStorage.removeItem(this.KEYS.AUTO_PLAY_VIDEO) 111 peertubeLocalStorage.removeItem(this.KEYS.AUTO_PLAY_VIDEO)
105 peertubeLocalStorage.removeItem(this.KEYS.EMAIL) 112 peertubeLocalStorage.removeItem(this.KEYS.EMAIL)
106 Tokens.flush() 113 Tokens.flush()
107 } 114 }
108 115
109 constructor (userHash: UserConstructorHash, hashTokens: TokenOptions) { 116 constructor (userHash: Partial<ServerUserModel>, hashTokens: TokenOptions) {
110 super(userHash) 117 super(userHash)
111 this.tokens = new Tokens(hashTokens) 118 this.tokens = new Tokens(hashTokens)
112 } 119 }
@@ -138,6 +145,7 @@ export class AuthUser extends User {
138 peertubeLocalStorage.setItem(AuthUser.KEYS.EMAIL, this.email) 145 peertubeLocalStorage.setItem(AuthUser.KEYS.EMAIL, this.email)
139 peertubeLocalStorage.setItem(AuthUser.KEYS.ROLE, this.role.toString()) 146 peertubeLocalStorage.setItem(AuthUser.KEYS.ROLE, this.role.toString())
140 peertubeLocalStorage.setItem(AuthUser.KEYS.NSFW_POLICY, this.nsfwPolicy.toString()) 147 peertubeLocalStorage.setItem(AuthUser.KEYS.NSFW_POLICY, this.nsfwPolicy.toString())
148 peertubeLocalStorage.setItem(AuthUser.KEYS.WEBTORRENT_ENABLED, JSON.stringify(this.webTorrentEnabled))
141 peertubeLocalStorage.setItem(AuthUser.KEYS.AUTO_PLAY_VIDEO, JSON.stringify(this.autoPlayVideo)) 149 peertubeLocalStorage.setItem(AuthUser.KEYS.AUTO_PLAY_VIDEO, JSON.stringify(this.autoPlayVideo))
142 this.tokens.save() 150 this.tokens.save()
143 } 151 }
diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts
index 9c36b946e..eaa822e0f 100644
--- a/client/src/app/core/auth/auth.service.ts
+++ b/client/src/app/core/auth/auth.service.ts
@@ -3,18 +3,18 @@ import { catchError, map, mergeMap, share, tap } from 'rxjs/operators'
3import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http' 3import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'
4import { Injectable } from '@angular/core' 4import { Injectable } from '@angular/core'
5import { Router } from '@angular/router' 5import { Router } from '@angular/router'
6import { NotificationsService } from 'angular2-notifications' 6import { Notifier } from '@app/core/notification/notifier.service'
7import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared' 7import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared'
8import { User } from '../../../../../shared/models/users' 8import { User } from '../../../../../shared/models/users'
9import { UserLogin } from '../../../../../shared/models/users/user-login.model' 9import { UserLogin } from '../../../../../shared/models/users/user-login.model'
10import { environment } from '../../../environments/environment' 10import { environment } from '../../../environments/environment'
11import { RestExtractor } from '../../shared/rest' 11import { RestExtractor } from '../../shared/rest/rest-extractor.service'
12import { AuthStatus } from './auth-status.model' 12import { AuthStatus } from './auth-status.model'
13import { AuthUser } from './auth-user.model' 13import { AuthUser } from './auth-user.model'
14import { objectToUrlEncoded } from '@app/shared/misc/utils' 14import { objectToUrlEncoded } from '@app/shared/misc/utils'
15import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' 15import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
16import { I18n } from '@ngx-translate/i18n-polyfill' 16import { I18n } from '@ngx-translate/i18n-polyfill'
17import { HotkeysService, Hotkey } from 'angular2-hotkeys' 17import { Hotkey, HotkeysService } from 'angular2-hotkeys'
18 18
19interface UserLoginWithUsername extends UserLogin { 19interface UserLoginWithUsername extends UserLogin {
20 access_token: string 20 access_token: string
@@ -38,7 +38,6 @@ export class AuthService {
38 loginChangedSource: Observable<AuthStatus> 38 loginChangedSource: Observable<AuthStatus>
39 userInformationLoaded = new ReplaySubject<boolean>(1) 39 userInformationLoaded = new ReplaySubject<boolean>(1)
40 hotkeys: Hotkey[] 40 hotkeys: Hotkey[]
41 redirectUrl: string
42 41
43 private clientId: string = peertubeLocalStorage.getItem(AuthService.LOCAL_STORAGE_OAUTH_CLIENT_KEYS.CLIENT_ID) 42 private clientId: string = peertubeLocalStorage.getItem(AuthService.LOCAL_STORAGE_OAUTH_CLIENT_KEYS.CLIENT_ID)
44 private clientSecret: string = peertubeLocalStorage.getItem(AuthService.LOCAL_STORAGE_OAUTH_CLIENT_KEYS.CLIENT_SECRET) 43 private clientSecret: string = peertubeLocalStorage.getItem(AuthService.LOCAL_STORAGE_OAUTH_CLIENT_KEYS.CLIENT_SECRET)
@@ -48,7 +47,7 @@ export class AuthService {
48 47
49 constructor ( 48 constructor (
50 private http: HttpClient, 49 private http: HttpClient,
51 private notificationsService: NotificationsService, 50 private notifier: Notifier,
52 private hotkeysService: HotkeysService, 51 private hotkeysService: HotkeysService,
53 private restExtractor: RestExtractor, 52 private restExtractor: RestExtractor,
54 private router: Router, 53 private router: Router,
@@ -106,9 +105,8 @@ export class AuthService {
106 ) 105 )
107 } 106 }
108 107
109 // We put a bigger timeout 108 // We put a bigger timeout: this is an important message
110 // This is an important message 109 this.notifier.error(errorMessage, this.i18n('Error'), 7000)
111 this.notificationsService.error(this.i18n('Error'), errorMessage, { timeOut: 7000 })
112 } 110 }
113 ) 111 )
114 } 112 }
@@ -178,8 +176,6 @@ export class AuthService {
178 this.setStatus(AuthStatus.LoggedOut) 176 this.setStatus(AuthStatus.LoggedOut)
179 177
180 this.hotkeysService.remove(this.hotkeys) 178 this.hotkeysService.remove(this.hotkeys)
181
182 this.redirectUrl = null
183 } 179 }
184 180
185 refreshAccessToken () { 181 refreshAccessToken () {
@@ -221,7 +217,7 @@ export class AuthService {
221 } 217 }
222 218
223 refreshUserInformation () { 219 refreshUserInformation () {
224 const obj = { 220 const obj: UserLoginWithUsername = {
225 access_token: this.user.getAccessToken(), 221 access_token: this.user.getAccessToken(),
226 refresh_token: null, 222 refresh_token: null,
227 token_type: this.user.getTokenType(), 223 token_type: this.user.getTokenType(),
diff --git a/client/src/app/core/auth/index.ts b/client/src/app/core/auth/index.ts
index bc7bfec0e..8e5caa7ed 100644
--- a/client/src/app/core/auth/index.ts
+++ b/client/src/app/core/auth/index.ts
@@ -1,4 +1,3 @@
1export * from './auth-status.model' 1export * from './auth-status.model'
2export * from './auth-user.model' 2export * from './auth-user.model'
3export * from './auth.service' 3export * from './auth.service'
4export * from '../routing/login-guard.service'
diff --git a/client/src/app/core/confirm/index.ts b/client/src/app/core/confirm/index.ts
index 44aabfc13..aca591e1a 100644
--- a/client/src/app/core/confirm/index.ts
+++ b/client/src/app/core/confirm/index.ts
@@ -1,2 +1 @@
1export * from './confirm.component'
2export * from './confirm.service' export * from './confirm.service'
diff --git a/client/src/app/core/core.module.ts b/client/src/app/core/core.module.ts
index df2ec696d..4ef3b1e73 100644
--- a/client/src/app/core/core.module.ts
+++ b/client/src/app/core/core.module.ts
@@ -7,16 +7,18 @@ import { LoadingBarModule } from '@ngx-loading-bar/core'
7import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client' 7import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'
8import { LoadingBarRouterModule } from '@ngx-loading-bar/router' 8import { LoadingBarRouterModule } from '@ngx-loading-bar/router'
9 9
10import { SimpleNotificationsModule } from 'angular2-notifications'
11
12import { AuthService } from './auth' 10import { AuthService } from './auth'
13import { ConfirmComponent, ConfirmService } from './confirm' 11import { ConfirmService } from './confirm'
14import { throwIfAlreadyLoaded } from './module-import-guard' 12import { throwIfAlreadyLoaded } from './module-import-guard'
15import { LoginGuard, RedirectService, UserRightGuard } from './routing' 13import { LoginGuard, RedirectService, UserRightGuard } from './routing'
16import { ServerService } from './server' 14import { ServerService } from './server'
17import { ThemeService } from './theme' 15import { ThemeService } from './theme'
18import { HotkeyModule } from 'angular2-hotkeys' 16import { HotkeyModule } from 'angular2-hotkeys'
19import { CheatSheetComponent } from '@app/core/hotkeys' 17import { CheatSheetComponent } from './hotkeys'
18import { ToastModule } from 'primeng/toast'
19import { Notifier } from './notification'
20import { MessageService } from 'primeng/api'
21import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
20 22
21@NgModule({ 23@NgModule({
22 imports: [ 24 imports: [
@@ -25,11 +27,10 @@ import { CheatSheetComponent } from '@app/core/hotkeys'
25 FormsModule, 27 FormsModule,
26 BrowserAnimationsModule, 28 BrowserAnimationsModule,
27 29
28 SimpleNotificationsModule.forRoot(),
29
30 LoadingBarHttpClientModule, 30 LoadingBarHttpClientModule,
31 LoadingBarRouterModule, 31 LoadingBarRouterModule,
32 LoadingBarModule.forRoot(), 32 LoadingBarModule,
33 ToastModule,
33 34
34 HotkeyModule.forRoot({ 35 HotkeyModule.forRoot({
35 cheatSheetCloseEsc: true 36 cheatSheetCloseEsc: true
@@ -37,16 +38,15 @@ import { CheatSheetComponent } from '@app/core/hotkeys'
37 ], 38 ],
38 39
39 declarations: [ 40 declarations: [
40 ConfirmComponent,
41 CheatSheetComponent 41 CheatSheetComponent
42 ], 42 ],
43 43
44 exports: [ 44 exports: [
45 SimpleNotificationsModule,
46 LoadingBarHttpClientModule, 45 LoadingBarHttpClientModule,
47 LoadingBarModule, 46 LoadingBarModule,
48 47
49 ConfirmComponent, 48 ToastModule,
49
50 CheatSheetComponent 50 CheatSheetComponent
51 ], 51 ],
52 52
@@ -57,7 +57,10 @@ import { CheatSheetComponent } from '@app/core/hotkeys'
57 ThemeService, 57 ThemeService,
58 LoginGuard, 58 LoginGuard,
59 UserRightGuard, 59 UserRightGuard,
60 RedirectService 60 RedirectService,
61 Notifier,
62 MessageService,
63 UserNotificationSocket
61 ] 64 ]
62}) 65})
63export class CoreModule { 66export class CoreModule {
diff --git a/client/src/app/core/index.ts b/client/src/app/core/index.ts
index 524589d74..f664aff41 100644
--- a/client/src/app/core/index.ts
+++ b/client/src/app/core/index.ts
@@ -2,6 +2,7 @@ export * from './auth'
2export * from './confirm' 2export * from './confirm'
3export * from './routing' 3export * from './routing'
4export * from './server' 4export * from './server'
5export * from './notification'
5export * from './theme' 6export * from './theme'
6 7
7export * from './core.module' 8export * from './core.module'
diff --git a/client/src/app/core/notification/index.ts b/client/src/app/core/notification/index.ts
new file mode 100644
index 000000000..3e8d9ea65
--- /dev/null
+++ b/client/src/app/core/notification/index.ts
@@ -0,0 +1,2 @@
1export * from './notifier.service'
2export * from './user-notification-socket.service'
diff --git a/client/src/app/core/notification/notifier.service.ts b/client/src/app/core/notification/notifier.service.ts
new file mode 100644
index 000000000..9833c65a0
--- /dev/null
+++ b/client/src/app/core/notification/notifier.service.ts
@@ -0,0 +1,41 @@
1import { Injectable } from '@angular/core'
2import { MessageService } from 'primeng/api'
3import { I18n } from '@ngx-translate/i18n-polyfill'
4
5@Injectable()
6export class Notifier {
7 readonly TIMEOUT = 5000
8
9 constructor (
10 private i18n: I18n,
11 private messageService: MessageService) {
12 }
13
14 info (text: string, title?: string, timeout?: number) {
15 if (!title) title = this.i18n('Info')
16
17 return this.notify('info', text, title, timeout)
18 }
19
20 error (text: string, title?: string, timeout?: number) {
21 if (!title) title = this.i18n('Error')
22
23 return this.notify('error', text, title, timeout)
24 }
25
26 success (text: string, title?: string, timeout?: number) {
27 if (!title) title = this.i18n('Success')
28
29 return this.notify('success', text, title, timeout)
30 }
31
32 private notify (severity: 'success' | 'info' | 'warn' | 'error', text: string, title: string, timeout?: number) {
33 this.messageService.add({
34 severity,
35 summary: title,
36 detail: text,
37 closable: true,
38 life: timeout || this.TIMEOUT
39 })
40 }
41}
diff --git a/client/src/app/core/notification/user-notification-socket.service.ts b/client/src/app/core/notification/user-notification-socket.service.ts
new file mode 100644
index 000000000..f367d9ae4
--- /dev/null
+++ b/client/src/app/core/notification/user-notification-socket.service.ts
@@ -0,0 +1,41 @@
1import { Injectable } from '@angular/core'
2import { environment } from '../../../environments/environment'
3import { UserNotification as UserNotificationServer } from '../../../../../shared'
4import { Subject } from 'rxjs'
5import * as io from 'socket.io-client'
6import { AuthService } from '../auth'
7
8export type NotificationEvent = 'new' | 'read' | 'read-all'
9
10@Injectable()
11export class UserNotificationSocket {
12 private notificationSubject = new Subject<{ type: NotificationEvent, notification?: UserNotificationServer }>()
13
14 private socket: SocketIOClient.Socket
15
16 constructor (
17 private auth: AuthService
18 ) {}
19
20 dispatch (type: NotificationEvent, notification?: UserNotificationServer) {
21 this.notificationSubject.next({ type, notification })
22 }
23
24 getMyNotificationsSocket () {
25 const socket = this.getSocket()
26
27 socket.on('new-notification', (n: UserNotificationServer) => this.dispatch('new', n))
28
29 return this.notificationSubject.asObservable()
30 }
31
32 private getSocket () {
33 if (this.socket) return this.socket
34
35 this.socket = io(environment.apiUrl + '/user-notifications', {
36 query: { accessToken: this.auth.getAccessToken() }
37 })
38
39 return this.socket
40 }
41}
diff --git a/client/src/app/core/routing/login-guard.service.ts b/client/src/app/core/routing/login-guard.service.ts
index 40ff8f505..7b1c37ee8 100644
--- a/client/src/app/core/routing/login-guard.service.ts
+++ b/client/src/app/core/routing/login-guard.service.ts
@@ -1,11 +1,5 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2import { 2import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router, RouterStateSnapshot } from '@angular/router'
3 ActivatedRouteSnapshot,
4 CanActivateChild,
5 RouterStateSnapshot,
6 CanActivate,
7 Router
8} from '@angular/router'
9 3
10import { AuthService } from '../auth/auth.service' 4import { AuthService } from '../auth/auth.service'
11 5
@@ -20,8 +14,6 @@ export class LoginGuard implements CanActivate, CanActivateChild {
20 canActivate (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 14 canActivate (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
21 if (this.auth.isLoggedIn() === true) return true 15 if (this.auth.isLoggedIn() === true) return true
22 16
23 this.auth.redirectUrl = state.url
24
25 this.router.navigate([ '/login' ]) 17 this.router.navigate([ '/login' ])
26 return false 18 return false
27 } 19 }
diff --git a/client/src/app/core/routing/redirect.service.ts b/client/src/app/core/routing/redirect.service.ts
index 1881be117..e1db4097b 100644
--- a/client/src/app/core/routing/redirect.service.ts
+++ b/client/src/app/core/routing/redirect.service.ts
@@ -1,5 +1,5 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2import { Router } from '@angular/router' 2import { NavigationEnd, Router } from '@angular/router'
3import { ServerService } from '../server' 3import { ServerService } from '../server'
4 4
5@Injectable() 5@Injectable()
@@ -8,6 +8,9 @@ export class RedirectService {
8 static INIT_DEFAULT_ROUTE = '/videos/trending' 8 static INIT_DEFAULT_ROUTE = '/videos/trending'
9 static DEFAULT_ROUTE = RedirectService.INIT_DEFAULT_ROUTE 9 static DEFAULT_ROUTE = RedirectService.INIT_DEFAULT_ROUTE
10 10
11 private previousUrl: string
12 private currentUrl: string
13
11 constructor ( 14 constructor (
12 private router: Router, 15 private router: Router,
13 private serverService: ServerService 16 private serverService: ServerService
@@ -18,6 +21,7 @@ export class RedirectService {
18 RedirectService.DEFAULT_ROUTE = config.instance.defaultClientRoute 21 RedirectService.DEFAULT_ROUTE = config.instance.defaultClientRoute
19 } 22 }
20 23
24 // Load default route
21 this.serverService.configLoaded 25 this.serverService.configLoaded
22 .subscribe(() => { 26 .subscribe(() => {
23 const defaultRouteConfig = this.serverService.getConfig().instance.defaultClientRoute 27 const defaultRouteConfig = this.serverService.getConfig().instance.defaultClientRoute
@@ -26,6 +30,21 @@ export class RedirectService {
26 RedirectService.DEFAULT_ROUTE = defaultRouteConfig 30 RedirectService.DEFAULT_ROUTE = defaultRouteConfig
27 } 31 }
28 }) 32 })
33
34 // Track previous url
35 this.currentUrl = this.router.url
36 router.events.subscribe(event => {
37 if (event instanceof NavigationEnd) {
38 this.previousUrl = this.currentUrl
39 this.currentUrl = event.url
40 }
41 })
42 }
43
44 redirectToPreviousRoute () {
45 if (this.previousUrl) return this.router.navigateByUrl(this.previousUrl)
46
47 return this.redirectToHomepage()
29 } 48 }
30 49
31 redirectToHomepage (skipLocationChange = false) { 50 redirectToHomepage (skipLocationChange = false) {
diff --git a/client/src/app/core/routing/user-right-guard.service.ts b/client/src/app/core/routing/user-right-guard.service.ts
index 65d029977..50c3d8c19 100644
--- a/client/src/app/core/routing/user-right-guard.service.ts
+++ b/client/src/app/core/routing/user-right-guard.service.ts
@@ -7,7 +7,7 @@ import {
7 Router 7 Router
8} from '@angular/router' 8} from '@angular/router'
9 9
10import { AuthService } from '../auth' 10import { AuthService } from '../auth/auth.service'
11 11
12@Injectable() 12@Injectable()
13export class UserRightGuard implements CanActivate, CanActivateChild { 13export class UserRightGuard implements CanActivate, CanActivateChild {
diff --git a/client/src/app/core/server/server.service.ts b/client/src/app/core/server/server.service.ts
index 2f1ef1fc2..c868ccdcc 100644
--- a/client/src/app/core/server/server.service.ts
+++ b/client/src/app/core/server/server.service.ts
@@ -13,6 +13,7 @@ import { sortBy } from '@app/shared/misc/utils'
13 13
14@Injectable() 14@Injectable()
15export class ServerService { 15export class ServerService {
16 private static BASE_SERVER_URL = environment.apiUrl + '/api/v1/server/'
16 private static BASE_CONFIG_URL = environment.apiUrl + '/api/v1/config/' 17 private static BASE_CONFIG_URL = environment.apiUrl + '/api/v1/config/'
17 private static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/' 18 private static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/'
18 private static BASE_LOCALE_URL = environment.apiUrl + '/client/locales/' 19 private static BASE_LOCALE_URL = environment.apiUrl + '/client/locales/'
@@ -37,6 +38,12 @@ export class ServerService {
37 css: '' 38 css: ''
38 } 39 }
39 }, 40 },
41 email: {
42 enabled: false
43 },
44 contactForm: {
45 enabled: false
46 },
40 serverVersion: 'Unknown', 47 serverVersion: 'Unknown',
41 signup: { 48 signup: {
42 allowed: false, 49 allowed: false,
@@ -44,7 +51,10 @@ export class ServerService {
44 requiresEmailVerification: false 51 requiresEmailVerification: false
45 }, 52 },
46 transcoding: { 53 transcoding: {
47 enabledResolutions: [] 54 enabledResolutions: [],
55 hls: {
56 enabled: false
57 }
48 }, 58 },
49 avatar: { 59 avatar: {
50 file: { 60 file: {
@@ -80,6 +90,11 @@ export class ServerService {
80 enabled: false 90 enabled: false
81 } 91 }
82 } 92 }
93 },
94 trending: {
95 videos: {
96 intervalDays: 0
97 }
83 } 98 }
84 } 99 }
85 private videoCategories: Array<VideoConstant<number>> = [] 100 private videoCategories: Array<VideoConstant<number>> = []
@@ -141,10 +156,6 @@ export class ServerService {
141 return this.videoPrivacies 156 return this.videoPrivacies
142 } 157 }
143 158
144 getAbout () {
145 return this.http.get<About>(ServerService.BASE_CONFIG_URL + '/about')
146 }
147
148 private loadVideoAttributeEnum ( 159 private loadVideoAttributeEnum (
149 attributeName: 'categories' | 'licences' | 'languages' | 'privacies', 160 attributeName: 'categories' | 'licences' | 'languages' | 'privacies',
150 hashToPopulate: VideoConstant<string | number>[], 161 hashToPopulate: VideoConstant<string | number>[],
@@ -154,7 +165,7 @@ export class ServerService {
154 this.localeObservable 165 this.localeObservable
155 .pipe( 166 .pipe(
156 switchMap(translations => { 167 switchMap(translations => {
157 return this.http.get(ServerService.BASE_VIDEO_URL + attributeName) 168 return this.http.get<{ [id: string]: string }>(ServerService.BASE_VIDEO_URL + attributeName)
158 .pipe(map(data => ({ data, translations }))) 169 .pipe(map(data => ({ data, translations })))
159 }) 170 })
160 ) 171 )
diff --git a/client/src/app/core/theme/theme.service.ts b/client/src/app/core/theme/theme.service.ts
index a6eef0898..50c19ecac 100644
--- a/client/src/app/core/theme/theme.service.ts
+++ b/client/src/app/core/theme/theme.service.ts
@@ -5,7 +5,7 @@ import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
5export class ThemeService { 5export class ThemeService {
6 private theme = document.querySelector('body') 6 private theme = document.querySelector('body')
7 private darkTheme = false 7 private darkTheme = false
8 private previousTheme = {} 8 private previousTheme: { [ id: string ]: string } = {}
9 9
10 constructor () { 10 constructor () {
11 // initialise the alternative theme with dark theme colors 11 // initialise the alternative theme with dark theme colors
@@ -33,7 +33,7 @@ export class ThemeService {
33 } 33 }
34 } 34 }
35 35
36 private switchProperty (property, newValue?) { 36 private switchProperty (property: string, newValue?: string) {
37 const propertyOldvalue = window.getComputedStyle(this.theme).getPropertyValue('--' + property) 37 const propertyOldvalue = window.getComputedStyle(this.theme).getPropertyValue('--' + property)
38 this.theme.style.setProperty('--' + property, (newValue) ? newValue : this.previousTheme[property]) 38 this.theme.style.setProperty('--' + property, (newValue) ? newValue : this.previousTheme[property])
39 this.previousTheme[property] = propertyOldvalue 39 this.previousTheme[property] = propertyOldvalue
diff --git a/client/src/app/header/header.component.html b/client/src/app/header/header.component.html
index a04354db5..46a87c79c 100644
--- a/client/src/app/header/header.component.html
+++ b/client/src/app/header/header.component.html
@@ -1,10 +1,10 @@
1<input 1<input
2 type="text" id="search-video" name="search-video" i18n-placeholder placeholder="Search..." 2 type="text" id="search-video" name="search-video" i18n-placeholder placeholder="Search..."
3 [(ngModel)]="searchValue" (keyup.enter)="doSearch()" 3 [(ngModel)]="searchValue" (keyup.enter)="doSearch()"
4> 4>
5<span (click)="doSearch()" class="icon icon-search"></span> 5<span (click)="doSearch()" class="icon icon-search"></span>
6 6
7<a class="upload-button" routerLink="/videos/upload"> 7<a class="upload-button" routerLink="/videos/upload">
8 <span class="icon icon-upload"></span> 8 <my-global-icon iconName="upload"></my-global-icon>
9 <span i18n class="upload-button-label">Upload</span> 9 <span i18n class="upload-button-label">Upload</span>
10</a> 10</a>
diff --git a/client/src/app/header/header.component.scss b/client/src/app/header/header.component.scss
index bd03c338a..cea415d9b 100644
--- a/client/src/app/header/header.component.scss
+++ b/client/src/app/header/header.component.scss
@@ -6,6 +6,7 @@
6 padding-left: 10px; 6 padding-left: 10px;
7 margin-right: 15px; 7 margin-right: 15px;
8 padding-right: 40px; // For the search icon 8 padding-right: 40px; // For the search icon
9 font-size: 14px;
9 10
10 &::placeholder { 11 &::placeholder {
11 color: var(--inputPlaceholderColor); 12 color: var(--inputPlaceholderColor);
@@ -40,6 +41,7 @@
40.upload-button { 41.upload-button {
41 @include peertube-button-link; 42 @include peertube-button-link;
42 @include orange-button; 43 @include orange-button;
44 @include button-with-icon(22px, 3px, -1px);
43 45
44 margin-right: 25px; 46 margin-right: 25px;
45 47
@@ -47,15 +49,6 @@
47 margin-right: 0; 49 margin-right: 0;
48 } 50 }
49 51
50 .icon.icon-upload {
51 @include icon(22px);
52
53 background-image: url('../../assets/images/header/upload.svg');
54 height: 24px;
55 vertical-align: middle;
56 margin-right: 6px;
57 }
58
59 @media screen and (max-width: 600px) { 52 @media screen and (max-width: 600px) {
60 margin-right: 10px; 53 margin-right: 10px;
61 padding: 0 10px; 54 padding: 0 10px;
diff --git a/client/src/app/login/login.component.html b/client/src/app/login/login.component.html
index 93dbed525..4efe3fb22 100644
--- a/client/src/app/login/login.component.html
+++ b/client/src/app/login/login.component.html
@@ -55,11 +55,17 @@
55<ng-template #forgotPasswordModal> 55<ng-template #forgotPasswordModal>
56 <div class="modal-header"> 56 <div class="modal-header">
57 <h4 i18n class="modal-title">Forgot your password</h4> 57 <h4 i18n class="modal-title">Forgot your password</h4>
58 <span class="close" aria-hidden="true" (click)="hideForgotPasswordModal()"></span> 58
59 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hideForgotPasswordModal()"></my-global-icon>
59 </div> 60 </div>
60 61
61 <div class="modal-body"> 62 <div class="modal-body">
62 <div class="form-group"> 63
64 <div *ngIf="isEmailDisabled()" class="alert alert-danger" i18n>
65 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
66 </div>
67
68 <div class="form-group" [hidden]="isEmailDisabled()">
63 <label i18n for="forgot-password-email">Email</label> 69 <label i18n for="forgot-password-email">Email</label>
64 <input 70 <input
65 type="email" id="forgot-password-email" i18n-placeholder placeholder="Email address" required 71 type="email" id="forgot-password-email" i18n-placeholder placeholder="Email address" required
diff --git a/client/src/app/login/login.component.ts b/client/src/app/login/login.component.ts
index 7553e6456..fc2442c0e 100644
--- a/client/src/app/login/login.component.ts
+++ b/client/src/app/login/login.component.ts
@@ -1,7 +1,6 @@
1import { Component, ElementRef, OnInit, ViewChild } from '@angular/core' 1import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'
2import { RedirectService, ServerService } from '@app/core' 2import { Notifier, RedirectService, ServerService } from '@app/core'
3import { UserService } from '@app/shared' 3import { UserService } from '@app/shared'
4import { NotificationsService } from 'angular2-notifications'
5import { AuthService } from '../core' 4import { AuthService } from '../core'
6import { FormReactive } from '../shared' 5import { FormReactive } from '../shared'
7import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -19,7 +18,6 @@ import { Router } from '@angular/router'
19export class LoginComponent extends FormReactive implements OnInit { 18export class LoginComponent extends FormReactive implements OnInit {
20 @ViewChild('emailInput') input: ElementRef 19 @ViewChild('emailInput') input: ElementRef
21 @ViewChild('forgotPasswordModal') forgotPasswordModal: ElementRef 20 @ViewChild('forgotPasswordModal') forgotPasswordModal: ElementRef
22 @ViewChild('forgotPasswordEmailInput') forgotPasswordEmailInput: ElementRef
23 21
24 error: string = null 22 error: string = null
25 forgotPasswordEmail = '' 23 forgotPasswordEmail = ''
@@ -35,7 +33,7 @@ export class LoginComponent extends FormReactive implements OnInit {
35 private userService: UserService, 33 private userService: UserService,
36 private serverService: ServerService, 34 private serverService: ServerService,
37 private redirectService: RedirectService, 35 private redirectService: RedirectService,
38 private notificationsService: NotificationsService, 36 private notifier: Notifier,
39 private i18n: I18n 37 private i18n: I18n
40 ) { 38 ) {
41 super() 39 super()
@@ -45,6 +43,10 @@ export class LoginComponent extends FormReactive implements OnInit {
45 return this.serverService.getConfig().signup.allowed === true 43 return this.serverService.getConfig().signup.allowed === true
46 } 44 }
47 45
46 isEmailDisabled () {
47 return this.serverService.getConfig().email.enabled === false
48 }
49
48 ngOnInit () { 50 ngOnInit () {
49 this.buildForm({ 51 this.buildForm({
50 username: this.loginValidatorsService.LOGIN_USERNAME, 52 username: this.loginValidatorsService.LOGIN_USERNAME,
@@ -61,7 +63,7 @@ export class LoginComponent extends FormReactive implements OnInit {
61 63
62 this.authService.login(username, password) 64 this.authService.login(username, password)
63 .subscribe( 65 .subscribe(
64 () => this.redirect(), 66 () => this.redirectService.redirectToPreviousRoute(),
65 67
66 err => { 68 err => {
67 if (err.message.indexOf('credentials are invalid') !== -1) this.error = this.i18n('Incorrect username or password.') 69 if (err.message.indexOf('credentials are invalid') !== -1) this.error = this.i18n('Incorrect username or password.')
@@ -71,15 +73,6 @@ export class LoginComponent extends FormReactive implements OnInit {
71 ) 73 )
72 } 74 }
73 75
74 redirect () {
75 const redirect = this.authService.redirectUrl
76 if (redirect) {
77 this.router.navigate([ redirect ])
78 } else {
79 this.redirectService.redirectToHomepage()
80 }
81 }
82
83 askResetPassword () { 76 askResetPassword () {
84 this.userService.askResetPassword(this.forgotPasswordEmail) 77 this.userService.askResetPassword(this.forgotPasswordEmail)
85 .subscribe( 78 .subscribe(
@@ -88,18 +81,14 @@ export class LoginComponent extends FormReactive implements OnInit {
88 'An email with the reset password instructions will be sent to {{email}}.', 81 'An email with the reset password instructions will be sent to {{email}}.',
89 { email: this.forgotPasswordEmail } 82 { email: this.forgotPasswordEmail }
90 ) 83 )
91 this.notificationsService.success(this.i18n('Success'), message) 84 this.notifier.success(message)
92 this.hideForgotPasswordModal() 85 this.hideForgotPasswordModal()
93 }, 86 },
94 87
95 err => this.notificationsService.error(this.i18n('Error'), err.message) 88 err => this.notifier.error(err.message)
96 ) 89 )
97 } 90 }
98 91
99 onForgotPasswordModalShown () {
100 this.forgotPasswordEmailInput.nativeElement.focus()
101 }
102
103 openForgotPasswordModal () { 92 openForgotPasswordModal () {
104 this.openedForgotPasswordModal = this.modalService.open(this.forgotPasswordModal) 93 this.openedForgotPasswordModal = this.modalService.open(this.forgotPasswordModal)
105 } 94 }
diff --git a/client/src/app/menu/avatar-notification.component.html b/client/src/app/menu/avatar-notification.component.html
new file mode 100644
index 000000000..4ef3f0e89
--- /dev/null
+++ b/client/src/app/menu/avatar-notification.component.html
@@ -0,0 +1,23 @@
1<div
2 [ngbPopover]="popContent" autoClose="outside" placement="bottom-left" container="body" popoverClass="popover-notifications"
3 i18n-title title="View your notifications" class="notification-avatar" #popover="ngbPopover"
4>
5 <div *ngIf="unreadNotifications > 0" class="unread-notifications">{{ unreadNotifications }}</div>
6
7 <img [src]="user.accountAvatarUrl" alt="Avatar" />
8</div>
9
10<ng-template #popContent>
11 <div class="notifications-header">
12 <div i18n>Notifications</div>
13
14 <a
15 i18n-title title="Update your notification preferences" class="glyphicon glyphicon-cog"
16 routerLink="/my-account/settings" fragment="notifications"
17 ></a>
18 </div>
19
20 <my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false" itemsPerPage="10"></my-user-notifications>
21
22 <a class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
23</ng-template>
diff --git a/client/src/app/menu/avatar-notification.component.scss b/client/src/app/menu/avatar-notification.component.scss
new file mode 100644
index 000000000..e785db788
--- /dev/null
+++ b/client/src/app/menu/avatar-notification.component.scss
@@ -0,0 +1,91 @@
1@import '_variables';
2@import '_mixins';
3
4/deep/ {
5 .popover-notifications.popover {
6 max-width: none;
7
8 .popover-body {
9 padding: 0;
10 font-size: 14px;
11 font-family: $main-fonts;
12 overflow-y: auto;
13 max-height: 500px;
14 width: 400px;
15 box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30);
16
17 .notifications-header {
18 display: flex;
19 justify-content: space-between;
20
21 background-color: rgba(0, 0, 0, 0.10);
22 align-items: center;
23 padding: 0 10px;
24 font-size: 16px;
25 height: 50px;
26
27 a {
28 @include disable-default-a-behaviour;
29
30 color: rgba(20, 20, 20, 0.5);
31
32 &:hover {
33 color: rgba(20, 20, 20, 0.8);
34 }
35 }
36 }
37
38 .all-notifications {
39 display: flex;
40 align-items: center;
41 justify-content: center;
42 font-weight: $font-semibold;
43 color: var(--mainForegroundColor);
44 padding: 7px 0;
45 }
46 }
47 }
48}
49
50.notification-avatar {
51 cursor: pointer;
52 position: relative;
53
54 img,
55 .unread-notifications {
56 margin-left: 20px;
57 }
58
59 img {
60 @include avatar(34px);
61
62 margin-right: 10px;
63 }
64
65 .unread-notifications {
66 position: absolute;
67 top: -5px;
68 left: -5px;
69
70 display: flex;
71 align-items: center;
72 justify-content: center;
73
74 background-color: var(--mainColor);
75 color: var(#fff);
76 font-size: 10px;
77 font-weight: $font-semibold;
78
79 border-radius: 15px;
80 width: 15px;
81 height: 15px;
82 }
83}
84
85@media screen and (max-width: $mobile-view) {
86 /deep/ {
87 .popover-notifications.popover .popover-body {
88 width: 400px;
89 }
90 }
91}
diff --git a/client/src/app/menu/avatar-notification.component.ts b/client/src/app/menu/avatar-notification.component.ts
new file mode 100644
index 000000000..f1af08096
--- /dev/null
+++ b/client/src/app/menu/avatar-notification.component.ts
@@ -0,0 +1,65 @@
1import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'
2import { User } from '../shared/users/user.model'
3import { UserNotificationService } from '@app/shared/users/user-notification.service'
4import { Subscription } from 'rxjs'
5import { Notifier, UserNotificationSocket } from '@app/core'
6import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
7import { NavigationEnd, Router } from '@angular/router'
8import { filter } from 'rxjs/operators'
9
10@Component({
11 selector: 'my-avatar-notification',
12 templateUrl: './avatar-notification.component.html',
13 styleUrls: [ './avatar-notification.component.scss' ]
14})
15export class AvatarNotificationComponent implements OnInit, OnDestroy {
16 @ViewChild('popover') popover: NgbPopover
17 @Input() user: User
18
19 unreadNotifications = 0
20
21 private notificationSub: Subscription
22 private routeSub: Subscription
23
24 constructor (
25 private userNotificationService: UserNotificationService,
26 private userNotificationSocket: UserNotificationSocket,
27 private notifier: Notifier,
28 private router: Router
29 ) {}
30
31 ngOnInit () {
32 this.userNotificationService.countUnreadNotifications()
33 .subscribe(
34 result => {
35 this.unreadNotifications = Math.min(result, 99) // Limit number to 99
36 this.subscribeToNotifications()
37 },
38
39 err => this.notifier.error(err.message)
40 )
41
42 this.routeSub = this.router.events
43 .pipe(filter(event => event instanceof NavigationEnd))
44 .subscribe(() => this.closePopover())
45 }
46
47 ngOnDestroy () {
48 if (this.notificationSub) this.notificationSub.unsubscribe()
49 if (this.routeSub) this.routeSub.unsubscribe()
50 }
51
52 closePopover () {
53 this.popover.close()
54 }
55
56 private subscribeToNotifications () {
57 this.notificationSub = this.userNotificationSocket.getMyNotificationsSocket()
58 .subscribe(data => {
59 if (data.type === 'new') return this.unreadNotifications++
60 if (data.type === 'read') return this.unreadNotifications--
61 if (data.type === 'read-all') return this.unreadNotifications = 0
62 })
63 }
64
65}
diff --git a/client/src/app/menu/index.ts b/client/src/app/menu/index.ts
index 421271c12..39dbde750 100644
--- a/client/src/app/menu/index.ts
+++ b/client/src/app/menu/index.ts
@@ -1 +1,3 @@
1export * from './language-chooser.component'
2export * from './avatar-notification.component'
1export * from './menu.component' 3export * from './menu.component'
diff --git a/client/src/app/menu/language-chooser.component.html b/client/src/app/menu/language-chooser.component.html
index c37bf2826..a62b33dda 100644
--- a/client/src/app/menu/language-chooser.component.html
+++ b/client/src/app/menu/language-chooser.component.html
@@ -1,9 +1,14 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Change the language</h4> 3 <h4 i18n class="modal-title">Change the language</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7
8 <a i18n class="help-to-translate" target="_blank" rel="noreferrer noopener" href="https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/translation.md">
9 Help to translate PeerTube!
10 </a>
11
7 <div class="modal-body"> 12 <div class="modal-body">
8 <a *ngFor="let lang of languages" [href]="buildLanguageLink(lang)">{{ lang.label }}</a> 13 <a *ngFor="let lang of languages" [href]="buildLanguageLink(lang)">{{ lang.label }}</a>
9 </div> 14 </div>
diff --git a/client/src/app/menu/language-chooser.component.scss b/client/src/app/menu/language-chooser.component.scss
index 944e86f46..72deb3952 100644
--- a/client/src/app/menu/language-chooser.component.scss
+++ b/client/src/app/menu/language-chooser.component.scss
@@ -1,6 +1,11 @@
1@import '_variables'; 1@import '_variables';
2@import '_mixins'; 2@import '_mixins';
3 3
4.help-to-translate {
5 @include peertube-button-link;
6 @include orange-button;
7}
8
4.modal-body { 9.modal-body {
5 text-align: center; 10 text-align: center;
6 11
@@ -9,4 +14,4 @@
9 font-size: 16px; 14 font-size: 16px;
10 margin: 15px; 15 margin: 15px;
11 } 16 }
12} \ No newline at end of file 17}
diff --git a/client/src/app/menu/menu.component.html b/client/src/app/menu/menu.component.html
index e04bdf3d6..aa5bfa9c9 100644
--- a/client/src/app/menu/menu.component.html
+++ b/client/src/app/menu/menu.component.html
@@ -2,9 +2,7 @@
2 <menu> 2 <menu>
3 <div class="top-menu"> 3 <div class="top-menu">
4 <div *ngIf="isLoggedIn" class="logged-in-block"> 4 <div *ngIf="isLoggedIn" class="logged-in-block">
5 <a routerLink="/my-account/settings"> 5 <my-avatar-notification [user]="user"></my-avatar-notification>
6 <img [src]="user.accountAvatarUrl" alt="Avatar" />
7 </a>
8 6
9 <div class="logged-in-info"> 7 <div class="logged-in-info">
10 <a routerLink="/my-account/settings" class="logged-in-username">{{ user.account?.displayName }}</a> 8 <a routerLink="/my-account/settings" class="logged-in-username">{{ user.account?.displayName }}</a>
@@ -97,4 +95,4 @@
97 </menu> 95 </menu>
98</div> 96</div>
99 97
100<my-language-chooser #languageChooserModal></my-language-chooser> \ No newline at end of file 98<my-language-chooser #languageChooserModal></my-language-chooser>
diff --git a/client/src/app/menu/menu.component.scss b/client/src/app/menu/menu.component.scss
index a842765ba..f30b89413 100644
--- a/client/src/app/menu/menu.component.scss
+++ b/client/src/app/menu/menu.component.scss
@@ -16,7 +16,7 @@ menu {
16 height: 100%; 16 height: 100%;
17 white-space: nowrap; 17 white-space: nowrap;
18 text-overflow: ellipsis; 18 text-overflow: ellipsis;
19 overflow: hidden; 19 overflow: auto;
20 color: var(--menuForegroundColor); 20 color: var(--menuForegroundColor);
21 display: flex; 21 display: flex;
22 flex-direction: column; 22 flex-direction: column;
@@ -39,13 +39,6 @@ menu {
39 justify-content: center; 39 justify-content: center;
40 margin-bottom: 35px; 40 margin-bottom: 35px;
41 41
42 img {
43 @include avatar(34px);
44
45 margin-left: 20px;
46 margin-right: 10px;
47 }
48
49 .logged-in-info { 42 .logged-in-info {
50 flex-grow: 1; 43 flex-grow: 1;
51 44
@@ -131,10 +124,14 @@ menu {
131 transition: background-color .1s ease-in-out; 124 transition: background-color .1s ease-in-out;
132 @include disable-default-a-behaviour; 125 @include disable-default-a-behaviour;
133 126
134 &:hover, &.focus-visible { 127 &.active {
135 background-color: rgba(255, 255, 255, 0.15); 128 background-color: rgba(255, 255, 255, 0.15);
136 } 129 }
137 130
131 &:hover, &.focus-visible {
132 background-color: rgba(255, 255, 255, 0.10);
133 }
134
138 .icon { 135 .icon {
139 @include icon(22px); 136 @include icon(22px);
140 137
@@ -246,7 +243,7 @@ menu {
246 } 243 }
247} 244}
248 245
249@media screen and (max-width: 400px) { 246@media screen and (max-width: $mobile-view) {
250 .menu-wrapper { 247 .menu-wrapper {
251 width: 100% !important; 248 width: 100% !important;
252 } 249 }
diff --git a/client/src/app/menu/menu.component.ts b/client/src/app/menu/menu.component.ts
index 95926f5f0..371beb4a5 100644
--- a/client/src/app/menu/menu.component.ts
+++ b/client/src/app/menu/menu.component.ts
@@ -18,7 +18,7 @@ export class MenuComponent implements OnInit {
18 userHasAdminAccess = false 18 userHasAdminAccess = false
19 helpVisible = false 19 helpVisible = false
20 20
21 private routesPerRight = { 21 private routesPerRight: { [ role in UserRight ]?: string } = {
22 [UserRight.MANAGE_USERS]: '/admin/users', 22 [UserRight.MANAGE_USERS]: '/admin/users',
23 [UserRight.MANAGE_SERVER_FOLLOW]: '/admin/friends', 23 [UserRight.MANAGE_SERVER_FOLLOW]: '/admin/friends',
24 [UserRight.MANAGE_VIDEO_ABUSES]: '/admin/moderation/video-abuses', 24 [UserRight.MANAGE_VIDEO_ABUSES]: '/admin/moderation/video-abuses',
diff --git a/client/src/app/reset-password/reset-password.component.ts b/client/src/app/reset-password/reset-password.component.ts
index af1298de6..07b93ee73 100644
--- a/client/src/app/reset-password/reset-password.component.ts
+++ b/client/src/app/reset-password/reset-password.component.ts
@@ -1,8 +1,7 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { UserService, UserValidatorsService } from '@app/shared' 3import { UserService, UserValidatorsService, FormReactive } from '@app/shared'
4import { NotificationsService } from 'angular2-notifications' 4import { Notifier } from '@app/core'
5import { FormReactive } from '../shared'
6import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
7import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 6import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
8import { ResetPasswordValidatorsService } from '@app/shared/forms/form-validators/reset-password-validators.service' 7import { ResetPasswordValidatorsService } from '@app/shared/forms/form-validators/reset-password-validators.service'
@@ -22,7 +21,7 @@ export class ResetPasswordComponent extends FormReactive implements OnInit {
22 private resetPasswordValidatorsService: ResetPasswordValidatorsService, 21 private resetPasswordValidatorsService: ResetPasswordValidatorsService,
23 private userValidatorsService: UserValidatorsService, 22 private userValidatorsService: UserValidatorsService,
24 private userService: UserService, 23 private userService: UserService,
25 private notificationsService: NotificationsService, 24 private notifier: Notifier,
26 private router: Router, 25 private router: Router,
27 private route: ActivatedRoute, 26 private route: ActivatedRoute,
28 private i18n: I18n 27 private i18n: I18n
@@ -40,7 +39,7 @@ export class ResetPasswordComponent extends FormReactive implements OnInit {
40 this.verificationString = this.route.snapshot.queryParams['verificationString'] 39 this.verificationString = this.route.snapshot.queryParams['verificationString']
41 40
42 if (!this.userId || !this.verificationString) { 41 if (!this.userId || !this.verificationString) {
43 this.notificationsService.error(this.i18n('Error'), this.i18n('Unable to find user id or verification string.')) 42 this.notifier.error(this.i18n('Unable to find user id or verification string.'))
44 this.router.navigate([ '/' ]) 43 this.router.navigate([ '/' ])
45 } 44 }
46 } 45 }
@@ -49,11 +48,11 @@ export class ResetPasswordComponent extends FormReactive implements OnInit {
49 this.userService.resetPassword(this.userId, this.verificationString, this.form.value.password) 48 this.userService.resetPassword(this.userId, this.verificationString, this.form.value.password)
50 .subscribe( 49 .subscribe(
51 () => { 50 () => {
52 this.notificationsService.success(this.i18n('Success'), this.i18n('Your password has been successfully reset!')) 51 this.notifier.success(this.i18n('Your password has been successfully reset!'))
53 this.router.navigate([ '/login' ]) 52 this.router.navigate([ '/login' ])
54 }, 53 },
55 54
56 err => this.notificationsService.error('Error', err.message) 55 err => this.notifier.error(err.message)
57 ) 56 )
58 } 57 }
59 58
diff --git a/client/src/app/search/search-filters.component.ts b/client/src/app/search/search-filters.component.ts
index 8d7f84ac1..3fdc6df35 100644
--- a/client/src/app/search/search-filters.component.ts
+++ b/client/src/app/search/search-filters.component.ts
@@ -1,10 +1,6 @@
1import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core' 1import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'
2import { ActivatedRoute } from '@angular/router' 2import { ServerService } from '@app/core'
3import { RedirectService, ServerService } from '@app/core'
4import { NotificationsService } from 'angular2-notifications'
5import { SearchService } from '@app/search/search.service'
6import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
7import { MetaService } from '@ngx-meta/core'
8import { AdvancedSearch } from '@app/search/advanced-search.model' 4import { AdvancedSearch } from '@app/search/advanced-search.model'
9import { VideoConstant } from '../../../../shared' 5import { VideoConstant } from '../../../../shared'
10 6
diff --git a/client/src/app/search/search.component.html b/client/src/app/search/search.component.html
index 3a87ea1de..82a5f0f26 100644
--- a/client/src/app/search/search.component.html
+++ b/client/src/app/search/search.component.html
@@ -48,7 +48,7 @@
48 </div> 48 </div>
49 49
50 <div *ngIf="isVideo(result)" class="entry video"> 50 <div *ngIf="isVideo(result)" class="entry video">
51 <my-video-thumbnail [video]="result"></my-video-thumbnail> 51 <my-video-thumbnail [video]="result" [nsfw]="isVideoBlur(result)"></my-video-thumbnail>
52 52
53 <div class="video-info"> 53 <div class="video-info">
54 <a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', result.uuid]" [attr.title]="result.name">{{ result.name }}</a> 54 <a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', result.uuid]" [attr.title]="result.name">{{ result.name }}</a>
diff --git a/client/src/app/search/search.component.scss b/client/src/app/search/search.component.scss
index 3e074621b..6de13d276 100644
--- a/client/src/app/search/search.component.scss
+++ b/client/src/app/search/search.component.scss
@@ -87,10 +87,10 @@
87 text-overflow: ellipsis; 87 text-overflow: ellipsis;
88 white-space: nowrap; 88 white-space: nowrap;
89 font-size: 14px; 89 font-size: 14px;
90 color: #585858; 90 color: $grey-foreground-color;
91 91
92 &:hover { 92 &:hover {
93 color: #303030; 93 color: $grey-foreground-hover-color;
94 } 94 }
95 } 95 }
96 } 96 }
diff --git a/client/src/app/search/search.component.ts b/client/src/app/search/search.component.ts
index 911d56843..c4a4b1fde 100644
--- a/client/src/app/search/search.component.ts
+++ b/client/src/app/search/search.component.ts
@@ -1,7 +1,6 @@
1import { Component, OnDestroy, OnInit } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { AuthService, RedirectService } from '@app/core' 3import { AuthService, Notifier, ServerService } from '@app/core'
4import { NotificationsService } from 'angular2-notifications'
5import { forkJoin, Subscription } from 'rxjs' 4import { forkJoin, Subscription } from 'rxjs'
6import { SearchService } from '@app/search/search.service' 5import { SearchService } from '@app/search/search.service'
7import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 6import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
@@ -40,10 +39,10 @@ export class SearchComponent implements OnInit, OnDestroy {
40 private route: ActivatedRoute, 39 private route: ActivatedRoute,
41 private router: Router, 40 private router: Router,
42 private metaService: MetaService, 41 private metaService: MetaService,
43 private redirectService: RedirectService, 42 private notifier: Notifier,
44 private notificationsService: NotificationsService,
45 private searchService: SearchService, 43 private searchService: SearchService,
46 private authService: AuthService 44 private authService: AuthService,
45 private serverService: ServerService
47 ) { } 46 ) { }
48 47
49 ngOnInit () { 48 ngOnInit () {
@@ -69,7 +68,7 @@ export class SearchComponent implements OnInit, OnDestroy {
69 this.search() 68 this.search()
70 }, 69 },
71 70
72 err => this.notificationsService.error('Error', err.text) 71 err => this.notifier.error(err.text)
73 ) 72 )
74 } 73 }
75 74
@@ -77,6 +76,10 @@ export class SearchComponent implements OnInit, OnDestroy {
77 if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe() 76 if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe()
78 } 77 }
79 78
79 isVideoBlur (video: Video) {
80 return video.isVideoNSFWForUser(this.authService.getUser(), this.serverService.getConfig())
81 }
82
80 isVideoChannel (d: VideoChannel | Video): d is VideoChannel { 83 isVideoChannel (d: VideoChannel | Video): d is VideoChannel {
81 return d instanceof VideoChannel 84 return d instanceof VideoChannel
82 } 85 }
@@ -113,9 +116,7 @@ export class SearchComponent implements OnInit, OnDestroy {
113 this.firstSearch = false 116 this.firstSearch = false
114 }, 117 },
115 118
116 error => { 119 err => this.notifier.error(err.message)
117 this.notificationsService.error(this.i18n('Error'), error.message)
118 }
119 ) 120 )
120 121
121 } 122 }
@@ -147,7 +148,8 @@ export class SearchComponent implements OnInit, OnDestroy {
147 } 148 }
148 149
149 private updateTitle () { 150 private updateTitle () {
150 this.metaService.setTitle(this.i18n('Search') + ' ' + this.currentSearch) 151 const suffix = this.currentSearch ? ' ' + this.currentSearch : ''
152 this.metaService.setTitle(this.i18n('Search') + suffix)
151 } 153 }
152 154
153 private updateUrlFromAdvancedSearch () { 155 private updateUrlFromAdvancedSearch () {
diff --git a/client/src/app/shared/account/account.model.ts b/client/src/app/shared/account/account.model.ts
index 42f2cfeaf..c5cd2051c 100644
--- a/client/src/app/shared/account/account.model.ts
+++ b/client/src/app/shared/account/account.model.ts
@@ -5,6 +5,10 @@ export class Account extends Actor implements ServerAccount {
5 displayName: string 5 displayName: string
6 description: string 6 description: string
7 nameWithHost: string 7 nameWithHost: string
8 mutedByUser: boolean
9 mutedByInstance: boolean
10 mutedServerByUser: boolean
11 mutedServerByInstance: boolean
8 12
9 userId?: number 13 userId?: number
10 14
@@ -15,5 +19,10 @@ export class Account extends Actor implements ServerAccount {
15 this.description = hash.description 19 this.description = hash.description
16 this.userId = hash.userId 20 this.userId = hash.userId
17 this.nameWithHost = Actor.CREATE_BY_STRING(this.name, this.host) 21 this.nameWithHost = Actor.CREATE_BY_STRING(this.name, this.host)
22
23 this.mutedByUser = false
24 this.mutedByInstance = false
25 this.mutedServerByUser = false
26 this.mutedServerByInstance = false
18 } 27 }
19} 28}
diff --git a/client/src/app/shared/actor/actor.model.ts b/client/src/app/shared/actor/actor.model.ts
index 811afb449..adecec1fc 100644
--- a/client/src/app/shared/actor/actor.model.ts
+++ b/client/src/app/shared/actor/actor.model.ts
@@ -16,7 +16,7 @@ export abstract class Actor implements ActorServer {
16 16
17 avatarUrl: string 17 avatarUrl: string
18 18
19 static GET_ACTOR_AVATAR_URL (actor: { avatar: Avatar }) { 19 static GET_ACTOR_AVATAR_URL (actor: { avatar?: { path: string } }) {
20 const absoluteAPIUrl = getAbsoluteAPIUrl() 20 const absoluteAPIUrl = getAbsoluteAPIUrl()
21 21
22 if (actor && actor.avatar) return absoluteAPIUrl + actor.avatar.path 22 if (actor && actor.avatar) return absoluteAPIUrl + actor.avatar.path
diff --git a/client/src/app/shared/blocklist/account-block.model.ts b/client/src/app/shared/blocklist/account-block.model.ts
new file mode 100644
index 000000000..e7b433d88
--- /dev/null
+++ b/client/src/app/shared/blocklist/account-block.model.ts
@@ -0,0 +1,14 @@
1import { AccountBlock as AccountBlockServer } from '../../../../../shared'
2import { Account } from '../account/account.model'
3
4export class AccountBlock implements AccountBlockServer {
5 byAccount: Account
6 blockedAccount: Account
7 createdAt: Date | string
8
9 constructor (block: AccountBlockServer) {
10 this.byAccount = new Account(block.byAccount)
11 this.blockedAccount = new Account(block.blockedAccount)
12 this.createdAt = block.createdAt
13 }
14}
diff --git a/client/src/app/shared/blocklist/blocklist.service.ts b/client/src/app/shared/blocklist/blocklist.service.ts
new file mode 100644
index 000000000..c1f7312f0
--- /dev/null
+++ b/client/src/app/shared/blocklist/blocklist.service.ts
@@ -0,0 +1,135 @@
1import { Injectable } from '@angular/core'
2import { environment } from '../../../environments/environment'
3import { HttpClient, HttpParams } from '@angular/common/http'
4import { RestExtractor, RestPagination, RestService } from '../rest'
5import { SortMeta } from 'primeng/api'
6import { catchError, map } from 'rxjs/operators'
7import { AccountBlock as AccountBlockServer, ResultList, ServerBlock } from '../../../../../shared'
8import { Account } from '@app/shared/account/account.model'
9import { AccountBlock } from '@app/shared/blocklist/account-block.model'
10
11@Injectable()
12export class BlocklistService {
13 static BASE_USER_BLOCKLIST_URL = environment.apiUrl + '/api/v1/users/me/blocklist'
14 static BASE_SERVER_BLOCKLIST_URL = environment.apiUrl + '/api/v1/server/blocklist'
15
16 constructor (
17 private authHttp: HttpClient,
18 private restExtractor: RestExtractor,
19 private restService: RestService
20 ) { }
21
22 /*********************** User -> Account blocklist ***********************/
23
24 getUserAccountBlocklist (pagination: RestPagination, sort: SortMeta) {
25 let params = new HttpParams()
26 params = this.restService.addRestGetParams(params, pagination, sort)
27
28 return this.authHttp.get<ResultList<AccountBlock>>(BlocklistService.BASE_USER_BLOCKLIST_URL + '/accounts', { params })
29 .pipe(
30 map(res => this.restExtractor.convertResultListDateToHuman(res)),
31 map(res => this.restExtractor.applyToResultListData(res, this.formatAccountBlock.bind(this))),
32 catchError(err => this.restExtractor.handleError(err))
33 )
34 }
35
36 blockAccountByUser (account: Account) {
37 const body = { accountName: account.nameWithHost }
38
39 return this.authHttp.post(BlocklistService.BASE_USER_BLOCKLIST_URL + '/accounts', body)
40 .pipe(catchError(err => this.restExtractor.handleError(err)))
41 }
42
43 unblockAccountByUser (account: Account) {
44 const path = BlocklistService.BASE_USER_BLOCKLIST_URL + '/accounts/' + account.nameWithHost
45
46 return this.authHttp.delete(path)
47 .pipe(catchError(err => this.restExtractor.handleError(err)))
48 }
49
50 /*********************** User -> Server blocklist ***********************/
51
52 getUserServerBlocklist (pagination: RestPagination, sort: SortMeta) {
53 let params = new HttpParams()
54 params = this.restService.addRestGetParams(params, pagination, sort)
55
56 return this.authHttp.get<ResultList<ServerBlock>>(BlocklistService.BASE_USER_BLOCKLIST_URL + '/servers', { params })
57 .pipe(
58 map(res => this.restExtractor.convertResultListDateToHuman(res)),
59 catchError(err => this.restExtractor.handleError(err))
60 )
61 }
62
63 blockServerByUser (host: string) {
64 const body = { host }
65
66 return this.authHttp.post(BlocklistService.BASE_USER_BLOCKLIST_URL + '/servers', body)
67 .pipe(catchError(err => this.restExtractor.handleError(err)))
68 }
69
70 unblockServerByUser (host: string) {
71 const path = BlocklistService.BASE_USER_BLOCKLIST_URL + '/servers/' + host
72
73 return this.authHttp.delete(path)
74 .pipe(catchError(err => this.restExtractor.handleError(err)))
75 }
76
77 /*********************** Instance -> Account blocklist ***********************/
78
79 getInstanceAccountBlocklist (pagination: RestPagination, sort: SortMeta) {
80 let params = new HttpParams()
81 params = this.restService.addRestGetParams(params, pagination, sort)
82
83 return this.authHttp.get<ResultList<AccountBlock>>(BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/accounts', { params })
84 .pipe(
85 map(res => this.restExtractor.convertResultListDateToHuman(res)),
86 map(res => this.restExtractor.applyToResultListData(res, this.formatAccountBlock.bind(this))),
87 catchError(err => this.restExtractor.handleError(err))
88 )
89 }
90
91 blockAccountByInstance (account: Account) {
92 const body = { accountName: account.nameWithHost }
93
94 return this.authHttp.post(BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/accounts', body)
95 .pipe(catchError(err => this.restExtractor.handleError(err)))
96 }
97
98 unblockAccountByInstance (account: Account) {
99 const path = BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/accounts/' + account.nameWithHost
100
101 return this.authHttp.delete(path)
102 .pipe(catchError(err => this.restExtractor.handleError(err)))
103 }
104
105 /*********************** Instance -> Server blocklist ***********************/
106
107 getInstanceServerBlocklist (pagination: RestPagination, sort: SortMeta) {
108 let params = new HttpParams()
109 params = this.restService.addRestGetParams(params, pagination, sort)
110
111 return this.authHttp.get<ResultList<ServerBlock>>(BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/servers', { params })
112 .pipe(
113 map(res => this.restExtractor.convertResultListDateToHuman(res)),
114 catchError(err => this.restExtractor.handleError(err))
115 )
116 }
117
118 blockServerByInstance (host: string) {
119 const body = { host }
120
121 return this.authHttp.post(BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/servers', body)
122 .pipe(catchError(err => this.restExtractor.handleError(err)))
123 }
124
125 unblockServerByInstance (host: string) {
126 const path = BlocklistService.BASE_SERVER_BLOCKLIST_URL + '/servers/' + host
127
128 return this.authHttp.delete(path)
129 .pipe(catchError(err => this.restExtractor.handleError(err)))
130 }
131
132 private formatAccountBlock (accountBlock: AccountBlockServer) {
133 return new AccountBlock(accountBlock)
134 }
135}
diff --git a/client/src/app/shared/blocklist/index.ts b/client/src/app/shared/blocklist/index.ts
new file mode 100644
index 000000000..5886ca07e
--- /dev/null
+++ b/client/src/app/shared/blocklist/index.ts
@@ -0,0 +1,2 @@
1export * from './blocklist.service'
2export * from './account-block.model'
diff --git a/client/src/app/shared/buttons/action-dropdown.component.html b/client/src/app/shared/buttons/action-dropdown.component.html
index 8110e2515..114b1d71f 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.html
+++ b/client/src/app/shared/buttons/action-dropdown.component.html
@@ -1,17 +1,27 @@
1<div class="dropdown-root" ngbDropdown [placement]="placement"> 1<div class="dropdown-root" ngbDropdown [placement]="placement">
2 <div class="action-button" [ngClass]="{ small: buttonSize === 'small' }" ngbDropdownToggle role="button"> 2 <div
3 <span class="icon icon-action"></span> 3 class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange' }"
4 ngbDropdownToggle role="button"
5 >
6 <my-global-icon *ngIf="!label" class="more-icon" iconName="more"></my-global-icon>
7 <span *ngIf="label" class="dropdown-toggle">{{ label }}</span>
4 </div> 8 </div>
5 9
6 <div ngbDropdownMenu class="dropdown-menu"> 10 <div ngbDropdownMenu class="dropdown-menu">
7 <ng-container *ngFor="let action of actions"> 11 <ng-container *ngFor="let actions of getActions()">
8 <div class="dropdown-item" *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true"> 12
9 <a *ngIf="action.linkBuilder" class="dropdown-item" [routerLink]="action.linkBuilder(entry)">{{ action.label }}</a> 13 <ng-container *ngFor="let action of actions">
14 <ng-container *ngIf="action.isDisplayed === undefined || action.isDisplayed(entry) === true">
15 <a *ngIf="action.linkBuilder" class="dropdown-item" [routerLink]="action.linkBuilder(entry)">{{ action.label }}</a>
16
17 <span *ngIf="!action.linkBuilder" class="custom-action dropdown-item" (click)="action.handler(entry)" role="button">
18 {{ action.label }}
19 </span>
20 </ng-container>
21 </ng-container>
22
23 <div class="dropdown-divider"></div>
10 24
11 <span *ngIf="!action.linkBuilder" class="custom-action" class="dropdown-item" (click)="action.handler(entry)" role="button">
12 {{ action.label }}
13 </span>
14 </div>
15 </ng-container> 25 </ng-container>
16 </div> 26 </div>
17</div> \ No newline at end of file 27</div>
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss
index 00f120fb8..985b2ca88 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.scss
+++ b/client/src/app/shared/buttons/action-dropdown.component.scss
@@ -1,9 +1,20 @@
1@import '_variables'; 1@import '_variables';
2@import '_mixins'; 2@import '_mixins';
3 3
4.dropdown-divider:last-child {
5 display: none;
6}
7
4.action-button { 8.action-button {
5 @include peertube-button; 9 @include peertube-button;
6 @include grey-button; 10
11 &.grey {
12 @include grey-button;
13 }
14
15 &.orange {
16 @include orange-button;
17 }
7 18
8 display: inline-block; 19 display: inline-block;
9 padding: 0 10px; 20 padding: 0 10px;
@@ -13,14 +24,11 @@
13 } 24 }
14 25
15 &:hover, &:active, &:focus { 26 &:hover, &:active, &:focus {
16 background-color: $grey-color; 27 background-color: $grey-background-color;
17 } 28 }
18 29
19 .icon-action { 30 .more-icon {
20 @include icon(21px); 31 width: 21px;
21
22 background-image: url('../../../assets/images/video/more.svg');
23 top: -1px;
24 } 32 }
25 33
26 &.small { 34 &.small {
@@ -30,9 +38,19 @@
30 } 38 }
31} 39}
32 40
41.dropdown-toggle::after {
42 position: relative;
43 top: 1px;
44}
45
33.dropdown-menu { 46.dropdown-menu {
34 .dropdown-item { 47 .dropdown-item {
35 cursor: pointer; 48 cursor: pointer;
36 color: #000 !important; 49 color: #000 !important;
50
51 a, span {
52 display: block;
53 width: 100%;
54 }
37 } 55 }
38} \ No newline at end of file 56}
diff --git a/client/src/app/shared/buttons/action-dropdown.component.ts b/client/src/app/shared/buttons/action-dropdown.component.ts
index 1838ff697..275e2b51e 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.ts
+++ b/client/src/app/shared/buttons/action-dropdown.component.ts
@@ -2,9 +2,9 @@ import { Component, Input } from '@angular/core'
2 2
3export type DropdownAction<T> = { 3export type DropdownAction<T> = {
4 label?: string 4 label?: string
5 handler?: (T) => any 5 handler?: (a: T) => any
6 linkBuilder?: (T) => (string | number)[] 6 linkBuilder?: (a: T) => (string | number)[]
7 isDisplayed?: (T) => boolean 7 isDisplayed?: (a: T) => boolean
8} 8}
9 9
10@Component({ 10@Component({
@@ -14,8 +14,16 @@ export type DropdownAction<T> = {
14}) 14})
15 15
16export class ActionDropdownComponent<T> { 16export class ActionDropdownComponent<T> {
17 @Input() actions: DropdownAction<T>[] = [] 17 @Input() actions: DropdownAction<T>[] | DropdownAction<T>[][] = []
18 @Input() entry: T 18 @Input() entry: T
19 @Input() placement = 'left' 19 @Input() placement = 'bottom-left'
20 @Input() buttonSize: 'normal' | 'small' = 'normal' 20 @Input() buttonSize: 'normal' | 'small' = 'normal'
21 @Input() label: string
22 @Input() theme: 'orange' | 'grey' = 'grey'
23
24 getActions () {
25 if (this.actions.length !== 0 && Array.isArray(this.actions[0])) return this.actions
26
27 return [ this.actions ]
28 }
21} 29}
diff --git a/client/src/app/shared/buttons/button.component.html b/client/src/app/shared/buttons/button.component.html
index 87a8daccf..b6df67102 100644
--- a/client/src/app/shared/buttons/button.component.html
+++ b/client/src/app/shared/buttons/button.component.html
@@ -1,4 +1,4 @@
1<span class="action-button" [ngClass]="className" [title]="getTitle()"> 1<span class="action-button" [ngClass]="className" [title]="getTitle()">
2 <span class="icon" [ngClass]="icon"></span> 2 <my-global-icon [iconName]="icon"></my-global-icon>
3 <span class="button-label">{{ label }}</span> 3 <span class="button-label">{{ label }}</span>
4</span> 4</span>
diff --git a/client/src/app/shared/buttons/button.component.scss b/client/src/app/shared/buttons/button.component.scss
index 168102f09..04199a2a9 100644
--- a/client/src/app/shared/buttons/button.component.scss
+++ b/client/src/app/shared/buttons/button.component.scss
@@ -3,41 +3,18 @@
3 3
4.action-button { 4.action-button {
5 @include peertube-button-link; 5 @include peertube-button-link;
6 @include button-with-icon(21px, 0, -2px);
6 7
7 font-size: 15px;
8 font-weight: $font-semibold; 8 font-weight: $font-semibold;
9 color: #585858; 9 color: $grey-foreground-color;
10 background-color: #E5E5E5; 10 background-color: $grey-background-color;
11 11
12 &:hover { 12 &:hover {
13 background-color: #EFEFEF; 13 background-color: $grey-background-hover-color;
14 } 14 }
15 15
16 .icon { 16 my-global-icon {
17 @include icon(21px); 17 @include apply-svg-color($grey-foreground-color);
18
19 position: relative;
20 top: -2px;
21
22 &.icon-edit {
23 background-image: url('../../../assets/images/global/edit-grey.svg');
24 }
25
26 &.icon-delete-grey {
27 background-image: url('../../../assets/images/global/delete-grey.svg');
28 }
29
30 &.icon-im-with-her {
31 background-image: url('../../../assets/images/global/im-with-her.svg');
32 }
33
34 &.icon-tick {
35 background-image: url('../../../assets/images/global/tick.svg');
36 }
37
38 &.icon-cross {
39 background-image: url('../../../assets/images/global/cross.svg');
40 }
41 } 18 }
42} 19}
43 20
diff --git a/client/src/app/shared/buttons/button.component.ts b/client/src/app/shared/buttons/button.component.ts
index 967cb1409..a91e9c7eb 100644
--- a/client/src/app/shared/buttons/button.component.ts
+++ b/client/src/app/shared/buttons/button.component.ts
@@ -1,4 +1,5 @@
1import { Component, Input } from '@angular/core' 1import { Component, Input } from '@angular/core'
2import { GlobalIconName } from '@app/shared/icons/global-icon.component'
2 3
3@Component({ 4@Component({
4 selector: 'my-button', 5 selector: 'my-button',
@@ -8,9 +9,9 @@ import { Component, Input } from '@angular/core'
8 9
9export class ButtonComponent { 10export class ButtonComponent {
10 @Input() label = '' 11 @Input() label = ''
11 @Input() className = undefined 12 @Input() className: string = undefined
12 @Input() icon = undefined 13 @Input() icon: GlobalIconName = undefined
13 @Input() title = undefined 14 @Input() title: string = undefined
14 15
15 getTitle () { 16 getTitle () {
16 return this.title || this.label 17 return this.title || this.label
diff --git a/client/src/app/shared/buttons/delete-button.component.html b/client/src/app/shared/buttons/delete-button.component.html
index 6c55d8104..4d12a84c0 100644
--- a/client/src/app/shared/buttons/delete-button.component.html
+++ b/client/src/app/shared/buttons/delete-button.component.html
@@ -1,5 +1,5 @@
1<span class="action-button action-button-delete" [title]="getTitle()" role="button"> 1<span class="action-button action-button-delete" [title]="getTitle()" role="button">
2 <span class="icon icon-delete-grey"></span> 2 <my-global-icon iconName="delete"></my-global-icon>
3 3
4 <span class="button-label" *ngIf="label">{{ label }}</span> 4 <span class="button-label" *ngIf="label">{{ label }}</span>
5 <span class="button-label" i18n *ngIf="!label">Delete</span> 5 <span class="button-label" i18n *ngIf="!label">Delete</span>
diff --git a/client/src/app/shared/buttons/edit-button.component.html b/client/src/app/shared/buttons/edit-button.component.html
index cecb780f3..da3addbae 100644
--- a/client/src/app/shared/buttons/edit-button.component.html
+++ b/client/src/app/shared/buttons/edit-button.component.html
@@ -1,5 +1,5 @@
1<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit"> 1<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit">
2 <span class="icon icon-edit"></span> 2 <my-global-icon iconName="edit"></my-global-icon>
3 3
4 <span class="button-label" *ngIf="label">{{ label }}</span> 4 <span class="button-label" *ngIf="label">{{ label }}</span>
5 <span i18n class="button-label" *ngIf="!label">Edit</span> 5 <span i18n class="button-label" *ngIf="!label">Edit</span>
diff --git a/client/src/app/shared/buttons/edit-button.component.ts b/client/src/app/shared/buttons/edit-button.component.ts
index 7abaacc26..1fe4f7b30 100644
--- a/client/src/app/shared/buttons/edit-button.component.ts
+++ b/client/src/app/shared/buttons/edit-button.component.ts
@@ -8,5 +8,5 @@ import { Component, Input } from '@angular/core'
8 8
9export class EditButtonComponent { 9export class EditButtonComponent {
10 @Input() label: string 10 @Input() label: string
11 @Input() routerLink = [] 11 @Input() routerLink: string[] = []
12} 12}
diff --git a/client/src/app/core/confirm/confirm.component.html b/client/src/app/shared/confirm/confirm.component.html
index 43f0c6190..65df1cd4d 100644
--- a/client/src/app/core/confirm/confirm.component.html
+++ b/client/src/app/shared/confirm/confirm.component.html
@@ -2,7 +2,8 @@
2 2
3 <div class="modal-header"> 3 <div class="modal-header">
4 <h4 class="modal-title">{{ title }}</h4> 4 <h4 class="modal-title">{{ title }}</h4>
5 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 5
6 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
6 </div> 7 </div>
7 8
8 <div class="modal-body" > 9 <div class="modal-body" >
diff --git a/client/src/app/core/confirm/confirm.component.scss b/client/src/app/shared/confirm/confirm.component.scss
index 93dd7926b..93dd7926b 100644
--- a/client/src/app/core/confirm/confirm.component.scss
+++ b/client/src/app/shared/confirm/confirm.component.scss
diff --git a/client/src/app/core/confirm/confirm.component.ts b/client/src/app/shared/confirm/confirm.component.ts
index 5138b7848..63c163da6 100644
--- a/client/src/app/core/confirm/confirm.component.ts
+++ b/client/src/app/shared/confirm/confirm.component.ts
@@ -1,5 +1,5 @@
1import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core' 1import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core'
2import { ConfirmService } from './confirm.service' 2import { ConfirmService } from '@app/core/confirm/confirm.service'
3import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 4import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref' 5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
diff --git a/client/src/app/shared/forms/form-reactive.ts b/client/src/app/shared/forms/form-reactive.ts
index 0bb7d25e6..b9873af2c 100644
--- a/client/src/app/shared/forms/form-reactive.ts
+++ b/client/src/app/shared/forms/form-reactive.ts
@@ -1,11 +1,9 @@
1import { FormGroup } from '@angular/forms' 1import { FormGroup } from '@angular/forms'
2import { BuildFormArgument, BuildFormDefaultValues, FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 2import { BuildFormArgument, BuildFormDefaultValues, FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
3 3
4export type FormReactiveErrors = { [ id: string ]: string } 4export type FormReactiveErrors = { [ id: string ]: string | FormReactiveErrors }
5export type FormReactiveValidationMessages = { 5export type FormReactiveValidationMessages = {
6 [ id: string ]: { 6 [ id: string ]: { [ name: string ]: string } | FormReactiveValidationMessages
7 [ name: string ]: string
8 }
9} 7}
10 8
11export abstract class FormReactive { 9export abstract class FormReactive {
@@ -13,7 +11,7 @@ export abstract class FormReactive {
13 protected formChanged = false 11 protected formChanged = false
14 12
15 form: FormGroup 13 form: FormGroup
16 formErrors: FormReactiveErrors 14 formErrors: any // To avoid casting in template because of string | FormReactiveErrors
17 validationMessages: FormReactiveValidationMessages 15 validationMessages: FormReactiveValidationMessages
18 16
19 buildForm (obj: BuildFormArgument, defaultValues: BuildFormDefaultValues = {}) { 17 buildForm (obj: BuildFormArgument, defaultValues: BuildFormDefaultValues = {}) {
@@ -23,29 +21,49 @@ export abstract class FormReactive {
23 this.formErrors = formErrors 21 this.formErrors = formErrors
24 this.validationMessages = validationMessages 22 this.validationMessages = validationMessages
25 23
26 this.form.valueChanges.subscribe(() => this.onValueChanged(false)) 24 this.form.valueChanges.subscribe(() => this.onValueChanged(this.form, this.formErrors, this.validationMessages, false))
25 }
26
27 protected forceCheck () {
28 return this.onValueChanged(this.form, this.formErrors, this.validationMessages, true)
29 }
30
31 protected check () {
32 return this.onValueChanged(this.form, this.formErrors, this.validationMessages, false)
27 } 33 }
28 34
29 protected onValueChanged (forceCheck = false) { 35 private onValueChanged (
30 for (const field in this.formErrors) { 36 form: FormGroup,
37 formErrors: FormReactiveErrors,
38 validationMessages: FormReactiveValidationMessages,
39 forceCheck = false
40 ) {
41 for (const field of Object.keys(formErrors)) {
42 if (formErrors[field] && typeof formErrors[field] === 'object') {
43 this.onValueChanged(
44 form.controls[field] as FormGroup,
45 formErrors[field] as FormReactiveErrors,
46 validationMessages[field] as FormReactiveValidationMessages,
47 forceCheck
48 )
49 continue
50 }
51
31 // clear previous error message (if any) 52 // clear previous error message (if any)
32 this.formErrors[ field ] = '' 53 formErrors[ field ] = ''
33 const control = this.form.get(field) 54 const control = form.get(field)
34 55
35 if (control.dirty) this.formChanged = true 56 if (control.dirty) this.formChanged = true
36 57
37 // Don't care if dirty on force check 58 // Don't care if dirty on force check
38 const isDirty = control.dirty || forceCheck === true 59 const isDirty = control.dirty || forceCheck === true
39 if (control && isDirty && !control.valid) { 60 if (control && isDirty && !control.valid) {
40 const messages = this.validationMessages[ field ] 61 const messages = validationMessages[ field ]
41 for (const key in control.errors) { 62 for (const key in control.errors) {
42 this.formErrors[ field ] += messages[ key ] + ' ' 63 formErrors[ field ] += messages[ key ] + ' '
43 } 64 }
44 } 65 }
45 } 66 }
46 } 67 }
47 68
48 protected forceCheck () {
49 return this.onValueChanged(true)
50 }
51} 69}
diff --git a/client/src/app/shared/forms/form-validators/form-validator.service.ts b/client/src/app/shared/forms/form-validators/form-validator.service.ts
index 19a8bef25..249fdf119 100644
--- a/client/src/app/shared/forms/form-validators/form-validator.service.ts
+++ b/client/src/app/shared/forms/form-validators/form-validator.service.ts
@@ -7,10 +7,10 @@ export type BuildFormValidator = {
7 MESSAGES: { [ name: string ]: string } 7 MESSAGES: { [ name: string ]: string }
8} 8}
9export type BuildFormArgument = { 9export type BuildFormArgument = {
10 [ id: string ]: BuildFormValidator 10 [ id: string ]: BuildFormValidator | BuildFormArgument
11} 11}
12export type BuildFormDefaultValues = { 12export type BuildFormDefaultValues = {
13 [ name: string ]: string | string[] 13 [ name: string ]: string | string[] | BuildFormDefaultValues
14} 14}
15 15
16@Injectable() 16@Injectable()
@@ -29,7 +29,16 @@ export class FormValidatorService {
29 formErrors[name] = '' 29 formErrors[name] = ''
30 30
31 const field = obj[name] 31 const field = obj[name]
32 if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES 32 if (this.isRecursiveField(field)) {
33 const result = this.buildForm(field as BuildFormArgument, defaultValues[name] as BuildFormDefaultValues)
34 group[name] = result.form
35 formErrors[name] = result.formErrors
36 validationMessages[name] = result.validationMessages
37
38 continue
39 }
40
41 if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES as { [ name: string ]: string }
33 42
34 const defaultValue = defaultValues[name] || '' 43 const defaultValue = defaultValues[name] || ''
35 44
@@ -52,13 +61,27 @@ export class FormValidatorService {
52 formErrors[name] = '' 61 formErrors[name] = ''
53 62
54 const field = obj[name] 63 const field = obj[name]
55 if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES 64 if (this.isRecursiveField(field)) {
65 this.updateForm(
66 form[name],
67 formErrors[name] as FormReactiveErrors,
68 validationMessages[name] as FormReactiveValidationMessages,
69 obj[name] as BuildFormArgument,
70 defaultValues[name] as BuildFormDefaultValues
71 )
72 continue
73 }
74
75 if (field && field.MESSAGES) validationMessages[name] = field.MESSAGES as { [ name: string ]: string }
56 76
57 const defaultValue = defaultValues[name] || '' 77 const defaultValue = defaultValues[name] || ''
58 78
59 if (field && field.VALIDATORS) form.addControl(name, new FormControl(defaultValue, field.VALIDATORS)) 79 if (field && field.VALIDATORS) form.addControl(name, new FormControl(defaultValue, field.VALIDATORS as ValidatorFn[]))
60 else form.addControl(name, new FormControl(defaultValue)) 80 else form.addControl(name, new FormControl(defaultValue))
61 } 81 }
62 } 82 }
63 83
84 private isRecursiveField (field: any) {
85 return field && typeof field === 'object' && !field.MESSAGES && !field.VALIDATORS
86 }
64} 87}
diff --git a/client/src/app/shared/forms/form-validators/index.ts b/client/src/app/shared/forms/form-validators/index.ts
index 74e385b3d..fdcbedb71 100644
--- a/client/src/app/shared/forms/form-validators/index.ts
+++ b/client/src/app/shared/forms/form-validators/index.ts
@@ -1,6 +1,7 @@
1export * from './custom-config-validators.service' 1export * from './custom-config-validators.service'
2export * from './form-validator.service' 2export * from './form-validator.service'
3export * from './host' 3export * from './host'
4export * from './instance-validators.service'
4export * from './login-validators.service' 5export * from './login-validators.service'
5export * from './reset-password-validators.service' 6export * from './reset-password-validators.service'
6export * from './user-validators.service' 7export * from './user-validators.service'
diff --git a/client/src/app/shared/forms/form-validators/instance-validators.service.ts b/client/src/app/shared/forms/form-validators/instance-validators.service.ts
new file mode 100644
index 000000000..5bb852858
--- /dev/null
+++ b/client/src/app/shared/forms/form-validators/instance-validators.service.ts
@@ -0,0 +1,48 @@
1import { I18n } from '@ngx-translate/i18n-polyfill'
2import { Validators } from '@angular/forms'
3import { BuildFormValidator } from '@app/shared'
4import { Injectable } from '@angular/core'
5
6@Injectable()
7export class InstanceValidatorsService {
8 readonly FROM_EMAIL: BuildFormValidator
9 readonly FROM_NAME: BuildFormValidator
10 readonly BODY: BuildFormValidator
11
12 constructor (private i18n: I18n) {
13
14 this.FROM_EMAIL = {
15 VALIDATORS: [ Validators.required, Validators.email ],
16 MESSAGES: {
17 'required': this.i18n('Email is required.'),
18 'email': this.i18n('Email must be valid.')
19 }
20 }
21
22 this.FROM_NAME = {
23 VALIDATORS: [
24 Validators.required,
25 Validators.minLength(1),
26 Validators.maxLength(120)
27 ],
28 MESSAGES: {
29 'required': this.i18n('Your name is required.'),
30 'minlength': this.i18n('Your name must be at least 1 character long.'),
31 'maxlength': this.i18n('Your name cannot be more than 120 characters long.')
32 }
33 }
34
35 this.BODY = {
36 VALIDATORS: [
37 Validators.required,
38 Validators.minLength(3),
39 Validators.maxLength(5000)
40 ],
41 MESSAGES: {
42 'required': this.i18n('A message is required.'),
43 'minlength': this.i18n('The message must be at least 3 characters long.'),
44 'maxlength': this.i18n('The message cannot be more than 5000 characters long.')
45 }
46 }
47 }
48}
diff --git a/client/src/app/shared/forms/form-validators/user-validators.service.ts b/client/src/app/shared/forms/form-validators/user-validators.service.ts
index 1fd1cdf68..6589b2580 100644
--- a/client/src/app/shared/forms/form-validators/user-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/user-validators.service.ts
@@ -23,15 +23,15 @@ export class UserValidatorsService {
23 this.USER_USERNAME = { 23 this.USER_USERNAME = {
24 VALIDATORS: [ 24 VALIDATORS: [
25 Validators.required, 25 Validators.required,
26 Validators.minLength(3), 26 Validators.minLength(1),
27 Validators.maxLength(20), 27 Validators.maxLength(50),
28 Validators.pattern(/^[a-z0-9._]+$/) 28 Validators.pattern(/^[a-z0-9][a-z0-9._]*$/)
29 ], 29 ],
30 MESSAGES: { 30 MESSAGES: {
31 'required': this.i18n('Username is required.'), 31 'required': this.i18n('Username is required.'),
32 'minlength': this.i18n('Username must be at least 3 characters long.'), 32 'minlength': this.i18n('Username must be at least 1 character long.'),
33 'maxlength': this.i18n('Username cannot be more than 20 characters long.'), 33 'maxlength': this.i18n('Username cannot be more than 50 characters long.'),
34 'pattern': this.i18n('Username should be only lowercase alphanumeric characters.') 34 'pattern': this.i18n('Username should be lowercase alphanumeric; dots and underscores are allowed.')
35 } 35 }
36 } 36 }
37 37
@@ -88,24 +88,24 @@ export class UserValidatorsService {
88 this.USER_DISPLAY_NAME = { 88 this.USER_DISPLAY_NAME = {
89 VALIDATORS: [ 89 VALIDATORS: [
90 Validators.required, 90 Validators.required,
91 Validators.minLength(3), 91 Validators.minLength(1),
92 Validators.maxLength(120) 92 Validators.maxLength(50)
93 ], 93 ],
94 MESSAGES: { 94 MESSAGES: {
95 'required': this.i18n('Display name is required.'), 95 'required': this.i18n('Display name is required.'),
96 'minlength': this.i18n('Display name must be at least 3 characters long.'), 96 'minlength': this.i18n('Display name must be at least 1 character long.'),
97 'maxlength': this.i18n('Display name cannot be more than 120 characters long.') 97 'maxlength': this.i18n('Display name cannot be more than 50 characters long.')
98 } 98 }
99 } 99 }
100 100
101 this.USER_DESCRIPTION = { 101 this.USER_DESCRIPTION = {
102 VALIDATORS: [ 102 VALIDATORS: [
103 Validators.minLength(3), 103 Validators.minLength(3),
104 Validators.maxLength(250) 104 Validators.maxLength(1000)
105 ], 105 ],
106 MESSAGES: { 106 MESSAGES: {
107 'minlength': this.i18n('Description must be at least 3 characters long.'), 107 'minlength': this.i18n('Description must be at least 3 characters long.'),
108 'maxlength': this.i18n('Description cannot be more than 250 characters long.') 108 'maxlength': this.i18n('Description cannot be more than 1000 characters long.')
109 } 109 }
110 } 110 }
111 111
diff --git a/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts b/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
index 6e9806611..fcc966b84 100644
--- a/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
@@ -10,20 +10,20 @@ export class VideoAbuseValidatorsService {
10 10
11 constructor (private i18n: I18n) { 11 constructor (private i18n: I18n) {
12 this.VIDEO_ABUSE_REASON = { 12 this.VIDEO_ABUSE_REASON = {
13 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ], 13 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
14 MESSAGES: { 14 MESSAGES: {
15 'required': this.i18n('Report reason is required.'), 15 'required': this.i18n('Report reason is required.'),
16 'minlength': this.i18n('Report reason must be at least 2 characters long.'), 16 'minlength': this.i18n('Report reason must be at least 2 characters long.'),
17 'maxlength': this.i18n('Report reason cannot be more than 300 characters long.') 17 'maxlength': this.i18n('Report reason cannot be more than 3000 characters long.')
18 } 18 }
19 } 19 }
20 20
21 this.VIDEO_ABUSE_MODERATION_COMMENT = { 21 this.VIDEO_ABUSE_MODERATION_COMMENT = {
22 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ], 22 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
23 MESSAGES: { 23 MESSAGES: {
24 'required': this.i18n('Moderation comment is required.'), 24 'required': this.i18n('Moderation comment is required.'),
25 'minlength': this.i18n('Moderation comment must be at least 2 characters long.'), 25 'minlength': this.i18n('Moderation comment must be at least 2 characters long.'),
26 'maxlength': this.i18n('Moderation comment cannot be more than 300 characters long.') 26 'maxlength': this.i18n('Moderation comment cannot be more than 3000 characters long.')
27 } 27 }
28 } 28 }
29 } 29 }
diff --git a/client/src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts b/client/src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts
index 087b80b44..c6fbb7538 100644
--- a/client/src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts
@@ -1,5 +1,5 @@
1import { I18n } from '@ngx-translate/i18n-polyfill' 1import { I18n } from '@ngx-translate/i18n-polyfill'
2import { Validators } from '@angular/forms' 2import { AbstractControl, ValidationErrors, Validators } from '@angular/forms'
3import { Injectable } from '@angular/core' 3import { Injectable } from '@angular/core'
4import { BuildFormValidator } from '@app/shared' 4import { BuildFormValidator } from '@app/shared'
5 5
@@ -9,10 +9,19 @@ export class VideoChangeOwnershipValidatorsService {
9 9
10 constructor (private i18n: I18n) { 10 constructor (private i18n: I18n) {
11 this.USERNAME = { 11 this.USERNAME = {
12 VALIDATORS: [ Validators.required ], 12 VALIDATORS: [ Validators.required, this.localAccountValidator ],
13 MESSAGES: { 13 MESSAGES: {
14 'required': this.i18n('The username is required.') 14 'required': this.i18n('The username is required.'),
15 'localAccountOnly': this.i18n('You can only transfer ownership to a local account')
15 } 16 }
16 } 17 }
17 } 18 }
19
20 localAccountValidator (control: AbstractControl): ValidationErrors {
21 if (control.value.includes('@')) {
22 return { 'localAccountOnly': true }
23 }
24
25 return null
26 }
18} 27}
diff --git a/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts b/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts
index 1ce3a0dca..1c519c10a 100644
--- a/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts
@@ -14,50 +14,50 @@ export class VideoChannelValidatorsService {
14 this.VIDEO_CHANNEL_NAME = { 14 this.VIDEO_CHANNEL_NAME = {
15 VALIDATORS: [ 15 VALIDATORS: [
16 Validators.required, 16 Validators.required,
17 Validators.minLength(3), 17 Validators.minLength(1),
18 Validators.maxLength(20), 18 Validators.maxLength(50),
19 Validators.pattern(/^[a-z0-9._]+$/) 19 Validators.pattern(/^[a-z0-9][a-z0-9._]*$/)
20 ], 20 ],
21 MESSAGES: { 21 MESSAGES: {
22 'required': this.i18n('Name is required.'), 22 'required': this.i18n('Name is required.'),
23 'minlength': this.i18n('Name must be at least 3 characters long.'), 23 'minlength': this.i18n('Name must be at least 1 character long.'),
24 'maxlength': this.i18n('Name cannot be more than 20 characters long.'), 24 'maxlength': this.i18n('Name cannot be more than 50 characters long.'),
25 'pattern': this.i18n('Name should be only lowercase alphanumeric characters.') 25 'pattern': this.i18n('Name should be lowercase alphanumeric; dots and underscores are allowed.')
26 } 26 }
27 } 27 }
28 28
29 this.VIDEO_CHANNEL_DISPLAY_NAME = { 29 this.VIDEO_CHANNEL_DISPLAY_NAME = {
30 VALIDATORS: [ 30 VALIDATORS: [
31 Validators.required, 31 Validators.required,
32 Validators.minLength(3), 32 Validators.minLength(1),
33 Validators.maxLength(120) 33 Validators.maxLength(50)
34 ], 34 ],
35 MESSAGES: { 35 MESSAGES: {
36 'required': i18n('Display name is required.'), 36 'required': i18n('Display name is required.'),
37 'minlength': i18n('Display name must be at least 3 characters long.'), 37 'minlength': i18n('Display name must be at least 1 character long.'),
38 'maxlength': i18n('Display name cannot be more than 120 characters long.') 38 'maxlength': i18n('Display name cannot be more than 50 characters long.')
39 } 39 }
40 } 40 }
41 41
42 this.VIDEO_CHANNEL_DESCRIPTION = { 42 this.VIDEO_CHANNEL_DESCRIPTION = {
43 VALIDATORS: [ 43 VALIDATORS: [
44 Validators.minLength(3), 44 Validators.minLength(3),
45 Validators.maxLength(500) 45 Validators.maxLength(1000)
46 ], 46 ],
47 MESSAGES: { 47 MESSAGES: {
48 'minlength': i18n('Description must be at least 3 characters long.'), 48 'minlength': i18n('Description must be at least 3 characters long.'),
49 'maxlength': i18n('Description cannot be more than 500 characters long.') 49 'maxlength': i18n('Description cannot be more than 1000 characters long.')
50 } 50 }
51 } 51 }
52 52
53 this.VIDEO_CHANNEL_SUPPORT = { 53 this.VIDEO_CHANNEL_SUPPORT = {
54 VALIDATORS: [ 54 VALIDATORS: [
55 Validators.minLength(3), 55 Validators.minLength(3),
56 Validators.maxLength(500) 56 Validators.maxLength(1000)
57 ], 57 ],
58 MESSAGES: { 58 MESSAGES: {
59 'minlength': i18n('Support text must be at least 3 characters long.'), 59 'minlength': i18n('Support text must be at least 3 characters long.'),
60 'maxlength': i18n('Support text cannot be more than 500 characters long.') 60 'maxlength': i18n('Support text cannot be more than 1000 characters long.')
61 } 61 }
62 } 62 }
63 } 63 }
diff --git a/client/src/app/shared/forms/form-validators/video-validators.service.ts b/client/src/app/shared/forms/form-validators/video-validators.service.ts
index 396be6f3b..81ed0666f 100644
--- a/client/src/app/shared/forms/form-validators/video-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/video-validators.service.ts
@@ -79,10 +79,10 @@ export class VideoValidatorsService {
79 } 79 }
80 80
81 this.VIDEO_SUPPORT = { 81 this.VIDEO_SUPPORT = {
82 VALIDATORS: [ Validators.minLength(3), Validators.maxLength(500) ], 82 VALIDATORS: [ Validators.minLength(3), Validators.maxLength(1000) ],
83 MESSAGES: { 83 MESSAGES: {
84 'minlength': this.i18n('Video support must be at least 3 characters long.'), 84 'minlength': this.i18n('Video support must be at least 3 characters long.'),
85 'maxlength': this.i18n('Video support cannot be more than 500 characters long.') 85 'maxlength': this.i18n('Video support cannot be more than 1000 characters long.')
86 } 86 }
87 } 87 }
88 88
diff --git a/client/src/app/shared/forms/index.ts b/client/src/app/shared/forms/index.ts
index 41c321c4c..8febbfee9 100644
--- a/client/src/app/shared/forms/index.ts
+++ b/client/src/app/shared/forms/index.ts
@@ -1,3 +1,4 @@
1export * from './form-validators' 1export * from './form-validators'
2export * from './form-reactive' 2export * from './form-reactive'
3export * from './reactive-file.component' 3export * from './reactive-file.component'
4export * from './textarea-autoresize.directive'
diff --git a/client/src/app/shared/forms/markdown-textarea.component.ts b/client/src/app/shared/forms/markdown-textarea.component.ts
index b99169ed2..e87aca0d4 100644
--- a/client/src/app/shared/forms/markdown-textarea.component.ts
+++ b/client/src/app/shared/forms/markdown-textarea.component.ts
@@ -1,10 +1,10 @@
1import { debounceTime, distinctUntilChanged } from 'rxjs/operators' 1import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
2import { Component, forwardRef, Input, OnInit } from '@angular/core' 2import { Component, forwardRef, Input, OnInit } from '@angular/core'
3import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' 3import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
4import { MarkdownService } from '@app/videos/shared'
5import { Subject } from 'rxjs' 4import { Subject } from 'rxjs'
6import truncate from 'lodash-es/truncate' 5import truncate from 'lodash-es/truncate'
7import { ScreenService } from '@app/shared/misc/screen.service' 6import { ScreenService } from '@app/shared/misc/screen.service'
7import { MarkdownService } from '@app/shared/renderer'
8 8
9@Component({ 9@Component({
10 selector: 'my-markdown-textarea', 10 selector: 'my-markdown-textarea',
diff --git a/client/src/app/shared/forms/peertube-checkbox.component.html b/client/src/app/shared/forms/peertube-checkbox.component.html
index 38691f050..7b8bcf601 100644
--- a/client/src/app/shared/forms/peertube-checkbox.component.html
+++ b/client/src/app/shared/forms/peertube-checkbox.component.html
@@ -1,10 +1,10 @@
1<div class="form-group"> 1<div class="root">
2 <label class="form-group-checkbox"> 2 <label class="form-group-checkbox">
3 <input type="checkbox" [(ngModel)]="checked" (ngModelChange)="onModelChange()" [id]="inputName" [disabled]="isDisabled" /> 3 <input type="checkbox" [(ngModel)]="checked" (ngModelChange)="onModelChange()" [id]="inputName" [disabled]="disabled" />
4 <span role="checkbox" [attr.aria-checked]="checked"></span> 4 <span role="checkbox" [attr.aria-checked]="checked"></span>
5 <span *ngIf="labelText">{{ labelText }}</span> 5 <span *ngIf="labelText">{{ labelText }}</span>
6 <span *ngIf="labelHtml" [innerHTML]="labelHtml"></span> 6 <span *ngIf="labelHtml" [innerHTML]="labelHtml"></span>
7 </label> 7 </label>
8 8
9 <my-help *ngIf="helpHtml" tooltipPlacement="top" helpType="custom" i18n-customHtml [customHtml]="helpHtml"></my-help> 9 <my-help *ngIf="helpHtml" tooltipPlacement="top" helpType="custom" i18n-customHtml [customHtml]="helpHtml"></my-help>
10</div> \ No newline at end of file 10</div>
diff --git a/client/src/app/shared/forms/peertube-checkbox.component.scss b/client/src/app/shared/forms/peertube-checkbox.component.scss
index ee133f190..6e4e20775 100644
--- a/client/src/app/shared/forms/peertube-checkbox.component.scss
+++ b/client/src/app/shared/forms/peertube-checkbox.component.scss
@@ -1,7 +1,7 @@
1@import '_variables'; 1@import '_variables';
2@import '_mixins'; 2@import '_mixins';
3 3
4.form-group { 4.root {
5 display: flex; 5 display: flex;
6 6
7 .form-group-checkbox { 7 .form-group-checkbox {
@@ -20,6 +20,10 @@
20 } 20 }
21 } 21 }
22 22
23 label {
24 margin-bottom: 0;
25 }
26
23 my-help { 27 my-help {
24 position: relative; 28 position: relative;
25 top: -2px; 29 top: -2px;
diff --git a/client/src/app/shared/forms/peertube-checkbox.component.ts b/client/src/app/shared/forms/peertube-checkbox.component.ts
index bbc9904df..c1a6915e8 100644
--- a/client/src/app/shared/forms/peertube-checkbox.component.ts
+++ b/client/src/app/shared/forms/peertube-checkbox.component.ts
@@ -19,8 +19,7 @@ export class PeertubeCheckboxComponent implements ControlValueAccessor {
19 @Input() labelText: string 19 @Input() labelText: string
20 @Input() labelHtml: string 20 @Input() labelHtml: string
21 @Input() helpHtml: string 21 @Input() helpHtml: string
22 22 @Input() disabled = false
23 isDisabled = false
24 23
25 propagateChange = (_: any) => { /* empty */ } 24 propagateChange = (_: any) => { /* empty */ }
26 25
@@ -41,6 +40,6 @@ export class PeertubeCheckboxComponent implements ControlValueAccessor {
41 } 40 }
42 41
43 setDisabledState (isDisabled: boolean) { 42 setDisabledState (isDisabled: boolean) {
44 this.isDisabled = isDisabled 43 this.disabled = isDisabled
45 } 44 }
46} 45}
diff --git a/client/src/app/shared/forms/reactive-file.component.ts b/client/src/app/shared/forms/reactive-file.component.ts
index 8d22aa56c..f60c38e8d 100644
--- a/client/src/app/shared/forms/reactive-file.component.ts
+++ b/client/src/app/shared/forms/reactive-file.component.ts
@@ -1,6 +1,6 @@
1import { Component, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core' 1import { Component, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core'
2import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' 2import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5 5
6@Component({ 6@Component({
@@ -30,7 +30,7 @@ export class ReactiveFileComponent implements OnInit, ControlValueAccessor {
30 private file: File 30 private file: File
31 31
32 constructor ( 32 constructor (
33 private notificationsService: NotificationsService, 33 private notifier: Notifier,
34 private i18n: I18n 34 private i18n: I18n
35 ) {} 35 ) {}
36 36
@@ -49,7 +49,18 @@ export class ReactiveFileComponent implements OnInit, ControlValueAccessor {
49 const [ file ] = event.target.files 49 const [ file ] = event.target.files
50 50
51 if (file.size > this.maxFileSize) { 51 if (file.size > this.maxFileSize) {
52 this.notificationsService.error(this.i18n('Error'), this.i18n('This file is too large.')) 52 this.notifier.error(this.i18n('This file is too large.'))
53 return
54 }
55
56 const extension = '.' + file.name.split('.').pop()
57 if (this.extensions.includes(extension) === false) {
58 const message = this.i18n(
59 'PeerTube cannot handle this kind of file. Accepted extensions are {{extensions}}.',
60 { extensions: this.allowedExtensionsMessage }
61 )
62 this.notifier.error(message)
63
53 return 64 return
54 } 65 }
55 66
diff --git a/client/src/app/shared/forms/textarea-autoresize.directive.ts b/client/src/app/shared/forms/textarea-autoresize.directive.ts
new file mode 100644
index 000000000..f8c855c16
--- /dev/null
+++ b/client/src/app/shared/forms/textarea-autoresize.directive.ts
@@ -0,0 +1,25 @@
1// Thanks: https://github.com/evseevdev/ngx-textarea-autosize
2import { AfterViewInit, Directive, ElementRef, HostBinding, HostListener } from '@angular/core'
3
4@Directive({
5 selector: 'textarea[myAutoResize]'
6})
7export class TextareaAutoResizeDirective implements AfterViewInit {
8 @HostBinding('attr.rows') rows = '1'
9 @HostBinding('style.overflow') overflow = 'hidden'
10
11 constructor (private elem: ElementRef) { }
12
13 public ngAfterViewInit () {
14 this.resize()
15 }
16
17 @HostListener('input')
18 resize () {
19 const textarea = this.elem.nativeElement as HTMLTextAreaElement
20 // Reset textarea height to auto that correctly calculate the new height
21 textarea.style.height = 'auto'
22 // Set new height
23 textarea.style.height = `${textarea.scrollHeight}px`
24 }
25}
diff --git a/client/src/app/shared/guards/can-deactivate-guard.service.ts b/client/src/app/shared/guards/can-deactivate-guard.service.ts
index e2a79e8c4..3a35fcfb3 100644
--- a/client/src/app/shared/guards/can-deactivate-guard.service.ts
+++ b/client/src/app/shared/guards/can-deactivate-guard.service.ts
@@ -4,8 +4,10 @@ import { Observable } from 'rxjs'
4import { ConfirmService } from '../../core/index' 4import { ConfirmService } from '../../core/index'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
6 6
7export type CanComponentDeactivateResult = { text?: string, canDeactivate: Observable<boolean> | boolean }
8
7export interface CanComponentDeactivate { 9export interface CanComponentDeactivate {
8 canDeactivate: () => { text?: string, canDeactivate: Observable<boolean> | boolean } 10 canDeactivate: () => CanComponentDeactivateResult
9} 11}
10 12
11@Injectable() 13@Injectable()
diff --git a/client/src/app/shared/icons/global-icon.component.html b/client/src/app/shared/icons/global-icon.component.html
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.html
diff --git a/client/src/app/shared/icons/global-icon.component.scss b/client/src/app/shared/icons/global-icon.component.scss
new file mode 100644
index 000000000..6805fb6f7
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.scss
@@ -0,0 +1,4 @@
1/deep/ svg {
2 width: inherit;
3 height: inherit;
4}
diff --git a/client/src/app/shared/icons/global-icon.component.ts b/client/src/app/shared/icons/global-icon.component.ts
new file mode 100644
index 000000000..e8ada0324
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.ts
@@ -0,0 +1,48 @@
1import { Component, ElementRef, Input, OnInit } from '@angular/core'
2
3const icons = {
4 'add': require('../../../assets/images/global/add.html'),
5 'syndication': require('../../../assets/images/global/syndication.html'),
6 'help': require('../../../assets/images/global/help.html'),
7 'sparkle': require('../../../assets/images/global/sparkle.html'),
8 'alert': require('../../../assets/images/global/alert.html'),
9 'cloud-error': require('../../../assets/images/global/cloud-error.html'),
10 'user-add': require('../../../assets/images/global/user-add.html'),
11 'no': require('../../../assets/images/global/no.html'),
12 'cloud-download': require('../../../assets/images/global/cloud-download.html'),
13 'undo': require('../../../assets/images/global/undo.html'),
14 'circle-tick': require('../../../assets/images/global/circle-tick.html'),
15 'cog': require('../../../assets/images/global/cog.html'),
16 'download': require('../../../assets/images/global/download.html'),
17 'edit': require('../../../assets/images/global/edit.html'),
18 'im-with-her': require('../../../assets/images/global/im-with-her.html'),
19 'delete': require('../../../assets/images/global/delete.html'),
20 'cross': require('../../../assets/images/global/cross.html'),
21 'validate': require('../../../assets/images/global/validate.html'),
22 'tick': require('../../../assets/images/global/tick.html'),
23 'dislike': require('../../../assets/images/video/dislike.html'),
24 'heart': require('../../../assets/images/video/heart.html'),
25 'like': require('../../../assets/images/video/like.html'),
26 'more': require('../../../assets/images/video/more.html'),
27 'share': require('../../../assets/images/video/share.html'),
28 'upload': require('../../../assets/images/video/upload.html')
29}
30
31export type GlobalIconName = keyof typeof icons
32
33@Component({
34 selector: 'my-global-icon',
35 template: '',
36 styleUrls: [ './global-icon.component.scss' ]
37})
38export class GlobalIconComponent implements OnInit {
39 @Input() iconName: GlobalIconName
40
41 constructor (private el: ElementRef) {}
42
43 ngOnInit () {
44 const nativeElement = this.el.nativeElement
45
46 nativeElement.innerHTML = icons[this.iconName]
47 }
48}
diff --git a/client/src/app/shared/instance/instance.service.ts b/client/src/app/shared/instance/instance.service.ts
new file mode 100644
index 000000000..61321ecce
--- /dev/null
+++ b/client/src/app/shared/instance/instance.service.ts
@@ -0,0 +1,36 @@
1import { catchError } from 'rxjs/operators'
2import { HttpClient } from '@angular/common/http'
3import { Injectable } from '@angular/core'
4import { environment } from '../../../environments/environment'
5import { RestExtractor, RestService } from '../rest'
6import { About } from '../../../../../shared/models/server'
7
8@Injectable()
9export class InstanceService {
10 private static BASE_CONFIG_URL = environment.apiUrl + '/api/v1/config'
11 private static BASE_SERVER_URL = environment.apiUrl + '/api/v1/server'
12
13 constructor (
14 private authHttp: HttpClient,
15 private restService: RestService,
16 private restExtractor: RestExtractor
17 ) {
18 }
19
20 getAbout () {
21 return this.authHttp.get<About>(InstanceService.BASE_CONFIG_URL + '/about')
22 .pipe(catchError(res => this.restExtractor.handleError(res)))
23 }
24
25 contactAdministrator (fromEmail: string, fromName: string, message: string) {
26 const body = {
27 fromEmail,
28 fromName,
29 body: message
30 }
31
32 return this.authHttp.post(InstanceService.BASE_SERVER_URL + '/contact', body)
33 .pipe(catchError(res => this.restExtractor.handleError(res)))
34
35 }
36}
diff --git a/client/src/app/shared/menu/top-menu-dropdown.component.html b/client/src/app/shared/menu/top-menu-dropdown.component.html
new file mode 100644
index 000000000..d3c896019
--- /dev/null
+++ b/client/src/app/shared/menu/top-menu-dropdown.component.html
@@ -0,0 +1,21 @@
1<div class="sub-menu">
2 <ng-container *ngFor="let menuEntry of menuEntries">
3
4 <a *ngIf="menuEntry.routerLink" [routerLink]="menuEntry.routerLink" routerLinkActive="active" class="title-page">{{ menuEntry.label }}</a>
5
6 <div *ngIf="!menuEntry.routerLink" ngbDropdown class="parent-entry" #dropdown="ngbDropdown" (mouseleave)="closeDropdownIfHovered(dropdown)">
7 <span
8 (mouseenter)="openDropdownOnHover(dropdown)" [ngClass]="{ active: !!suffixLabels[menuEntry.label] }" ngbDropdownAnchor
9 (click)="dropdownAnchorClicked(dropdown)" role="button" class="title-page"
10 >
11 <ng-container i18n>{{ menuEntry.label }}</ng-container>
12 <ng-container *ngIf="!!suffixLabels[menuEntry.label]"> - {{ suffixLabels[menuEntry.label] }}</ng-container>
13 </span>
14
15 <div ngbDropdownMenu>
16 <a *ngFor="let menuChild of menuEntry.children" class="dropdown-item" [routerLink]="menuChild.routerLink">{{ menuChild.label }}</a>
17 </div>
18 </div>
19
20 </ng-container>
21</div>
diff --git a/client/src/app/shared/menu/top-menu-dropdown.component.scss b/client/src/app/shared/menu/top-menu-dropdown.component.scss
new file mode 100644
index 000000000..77159532f
--- /dev/null
+++ b/client/src/app/shared/menu/top-menu-dropdown.component.scss
@@ -0,0 +1,18 @@
1.parent-entry {
2 span[role=button] {
3 cursor: pointer;
4 }
5
6 a {
7 display: block;
8 }
9}
10
11/deep/ .dropdown-toggle::after {
12 position: relative;
13 top: 2px;
14}
15
16/deep/ .dropdown-menu {
17 margin-top: 0 !important;
18}
diff --git a/client/src/app/shared/menu/top-menu-dropdown.component.ts b/client/src/app/shared/menu/top-menu-dropdown.component.ts
new file mode 100644
index 000000000..e859c30dd
--- /dev/null
+++ b/client/src/app/shared/menu/top-menu-dropdown.component.ts
@@ -0,0 +1,83 @@
1import { Component, Input, OnDestroy, OnInit } from '@angular/core'
2import { filter, take } from 'rxjs/operators'
3import { NavigationEnd, Router } from '@angular/router'
4import { Subscription } from 'rxjs'
5import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'
6
7export type TopMenuDropdownParam = {
8 label: string
9 routerLink?: string
10
11 children?: {
12 label: string
13 routerLink: string
14 }[]
15}
16
17@Component({
18 selector: 'my-top-menu-dropdown',
19 templateUrl: './top-menu-dropdown.component.html',
20 styleUrls: [ './top-menu-dropdown.component.scss' ]
21})
22export class TopMenuDropdownComponent implements OnInit, OnDestroy {
23 @Input() menuEntries: TopMenuDropdownParam[] = []
24
25 suffixLabels: { [ parentLabel: string ]: string }
26
27 private openedOnHover = false
28 private routeSub: Subscription
29
30 constructor (private router: Router) {}
31
32 ngOnInit () {
33 this.updateChildLabels(window.location.pathname)
34
35 this.routeSub = this.router.events
36 .pipe(filter(event => event instanceof NavigationEnd))
37 .subscribe(() => this.updateChildLabels(window.location.pathname))
38 }
39
40 ngOnDestroy () {
41 if (this.routeSub) this.routeSub.unsubscribe()
42 }
43
44 openDropdownOnHover (dropdown: NgbDropdown) {
45 this.openedOnHover = true
46 dropdown.open()
47
48 // Menu was closed
49 dropdown.openChange
50 .pipe(take(1))
51 .subscribe(e => this.openedOnHover = false)
52 }
53
54 dropdownAnchorClicked (dropdown: NgbDropdown) {
55 if (this.openedOnHover) {
56 this.openedOnHover = false
57 return
58 }
59
60 return dropdown.toggle()
61 }
62
63 closeDropdownIfHovered (dropdown: NgbDropdown) {
64 if (this.openedOnHover === false) return
65
66 dropdown.close()
67 this.openedOnHover = false
68 }
69
70 private updateChildLabels (path: string) {
71 this.suffixLabels = {}
72
73 for (const entry of this.menuEntries) {
74 if (!entry.children) continue
75
76 for (const child of entry.children) {
77 if (path.startsWith(child.routerLink)) {
78 this.suffixLabels[entry.label] = child.label
79 }
80 }
81 }
82 }
83}
diff --git a/client/src/app/shared/misc/from-now.pipe.ts b/client/src/app/shared/misc/from-now.pipe.ts
index 33e6d25fe..00b5be6c9 100644
--- a/client/src/app/shared/misc/from-now.pipe.ts
+++ b/client/src/app/shared/misc/from-now.pipe.ts
@@ -7,8 +7,9 @@ export class FromNowPipe implements PipeTransform {
7 7
8 constructor (private i18n: I18n) { } 8 constructor (private i18n: I18n) { }
9 9
10 transform (value: number) { 10 transform (arg: number | Date | string) {
11 const seconds = Math.floor((Date.now() - value) / 1000) 11 const argDate = new Date(arg)
12 const seconds = Math.floor((Date.now() - argDate.getTime()) / 1000)
12 13
13 let interval = Math.floor(seconds / 31536000) 14 let interval = Math.floor(seconds / 31536000)
14 if (interval > 1) { 15 if (interval > 1) {
diff --git a/client/src/app/shared/misc/help.component.html b/client/src/app/shared/misc/help.component.html
index 28ccb1e26..444425c9f 100644
--- a/client/src/app/shared/misc/help.component.html
+++ b/client/src/app/shared/misc/help.component.html
@@ -18,10 +18,13 @@
18 container="body" 18 container="body"
19 title="Get help" 19 title="Get help"
20 i18n-title 20 i18n-title
21 popoverClass="help-popover"
21 [attr.aria-pressed]="isPopoverOpened" 22 [attr.aria-pressed]="isPopoverOpened"
22 [ngbPopover]="tooltipTemplate" 23 [ngbPopover]="tooltipTemplate"
23 [placement]="tooltipPlacement" 24 [placement]="tooltipPlacement"
24 [autoClose]="true" 25 [autoClose]="true"
25 (onHidden)="onPopoverHidden()" 26 (onHidden)="onPopoverHidden()"
26 (onShown)="onPopoverShown()" 27 (onShown)="onPopoverShown()"
27></span> 28>
29 <my-global-icon iconName="help"></my-global-icon>
30</span>
diff --git a/client/src/app/shared/misc/help.component.scss b/client/src/app/shared/misc/help.component.scss
index 5c73a8031..3898f3cda 100644
--- a/client/src/app/shared/misc/help.component.scss
+++ b/client/src/app/shared/misc/help.component.scss
@@ -2,29 +2,40 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.help-tooltip-button { 4.help-tooltip-button {
5 @include icon(17px); 5 cursor: pointer;
6
7 position: relative;
8 top: -2px;
9 background-image: url('../../../assets/images/global/help.svg');
10 border: none; 6 border: none;
11 margin: 5px; 7
8 my-global-icon {
9 width: 17px;
10 position: relative;
11 top: -2px;
12 margin: 5px;
13
14 @include apply-svg-color(var(--mainForegroundColor))
15 }
12} 16}
13 17
14/deep/ { 18/deep/ {
15 .popover-body { 19 .help-popover {
16 text-align: left;
17 padding: 10px;
18 max-width: 300px; 20 max-width: 300px;
19 21
20 font-size: 13px; 22 .popover-body {
21 font-family: $main-fonts; 23 font-family: $main-fonts;
22 background-color: #fff; 24 text-align: left;
23 color: #000; 25 padding: 10px;
24 box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); 26 font-size: 13px;
27 background-color: var(--mainBackgroundColor);
28 color: var(--mainForegroundColor);
29 box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
30
31 p {
32 margin-bottom: 0;
33 }
25 34
26 ul { 35 ul {
27 padding-left: 20px; 36 padding-left: 20px;
37 margin-bottom: 0;
38 }
28 } 39 }
29 } 40 }
30} 41}
diff --git a/client/src/app/shared/misc/help.component.ts b/client/src/app/shared/misc/help.component.ts
index ba0452e77..f3426f70f 100644
--- a/client/src/app/shared/misc/help.component.ts
+++ b/client/src/app/shared/misc/help.component.ts
@@ -1,6 +1,6 @@
1import { Component, Input, OnChanges, OnInit } from '@angular/core' 1import { Component, Input, OnChanges, OnInit } from '@angular/core'
2import { MarkdownService } from '@app/videos/shared'
3import { I18n } from '@ngx-translate/i18n-polyfill' 2import { I18n } from '@ngx-translate/i18n-polyfill'
3import { MarkdownService } from '@app/shared/renderer'
4 4
5@Component({ 5@Component({
6 selector: 'my-help', 6 selector: 'my-help',
diff --git a/client/src/app/shared/misc/peertube-local-storage.ts b/client/src/app/shared/misc/peertube-local-storage.ts
index 260f994b6..fb5c45acf 100644
--- a/client/src/app/shared/misc/peertube-local-storage.ts
+++ b/client/src/app/shared/misc/peertube-local-storage.ts
@@ -6,7 +6,7 @@ class MemoryStorage {
6 [key: string]: any 6 [key: string]: any
7 [index: number]: string 7 [index: number]: string
8 8
9 getItem (key) { 9 getItem (key: any) {
10 const stringKey = String(key) 10 const stringKey = String(key)
11 if (valuesMap.has(key)) { 11 if (valuesMap.has(key)) {
12 return String(valuesMap.get(stringKey)) 12 return String(valuesMap.get(stringKey))
@@ -15,11 +15,11 @@ class MemoryStorage {
15 return null 15 return null
16 } 16 }
17 17
18 setItem (key, val) { 18 setItem (key: any, val: any) {
19 valuesMap.set(String(key), String(val)) 19 valuesMap.set(String(key), String(val))
20 } 20 }
21 21
22 removeItem (key) { 22 removeItem (key: any) {
23 valuesMap.delete(key) 23 valuesMap.delete(key)
24 } 24 }
25 25
diff --git a/client/src/app/shared/misc/utils.ts b/client/src/app/shared/misc/utils.ts
index c8b7ebc67..7cc6055c2 100644
--- a/client/src/app/shared/misc/utils.ts
+++ b/client/src/app/shared/misc/utils.ts
@@ -102,12 +102,18 @@ function objectToFormData (obj: any, form?: FormData, namespace?: string) {
102 return fd 102 return fd
103} 103}
104 104
105function lineFeedToHtml (obj: object, keyToNormalize: string) { 105function objectLineFeedToHtml (obj: any, keyToNormalize: string) {
106 return immutableAssign(obj, { 106 return immutableAssign(obj, {
107 [keyToNormalize]: obj[keyToNormalize].replace(/\r?\n|\r/g, '<br />') 107 [keyToNormalize]: lineFeedToHtml(obj[keyToNormalize])
108 }) 108 })
109} 109}
110 110
111function lineFeedToHtml (text: string) {
112 if (!text) return text
113
114 return text.replace(/\r?\n|\r/g, '<br />')
115}
116
111function removeElementFromArray <T> (arr: T[], elem: T) { 117function removeElementFromArray <T> (arr: T[], elem: T) {
112 const index = arr.indexOf(elem) 118 const index = arr.indexOf(elem)
113 if (index !== -1) arr.splice(index, 1) 119 if (index !== -1) arr.splice(index, 1)
@@ -124,9 +130,14 @@ function sortBy (obj: any[], key1: string, key2?: string) {
124 }) 130 })
125} 131}
126 132
133function scrollToTop () {
134 window.scroll(0, 0)
135}
136
127export { 137export {
128 sortBy, 138 sortBy,
129 durationToString, 139 durationToString,
140 lineFeedToHtml,
130 objectToUrlEncoded, 141 objectToUrlEncoded,
131 getParameterByName, 142 getParameterByName,
132 populateAsyncUserVideoChannels, 143 populateAsyncUserVideoChannels,
@@ -134,6 +145,7 @@ export {
134 dateToHuman, 145 dateToHuman,
135 immutableAssign, 146 immutableAssign,
136 objectToFormData, 147 objectToFormData,
137 lineFeedToHtml, 148 objectLineFeedToHtml,
138 removeElementFromArray 149 removeElementFromArray,
150 scrollToTop
139} 151}
diff --git a/client/src/app/shared/moderation/user-ban-modal.component.html b/client/src/app/shared/moderation/user-ban-modal.component.html
index b2958caa4..f38ea543d 100644
--- a/client/src/app/shared/moderation/user-ban-modal.component.html
+++ b/client/src/app/shared/moderation/user-ban-modal.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Ban {{ userToBan.username }}</h4> 3 <h4 i18n class="modal-title">Ban</h4>
4 <span class="close" aria-hidden="true" (click)="hideBanUserModal()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body"> 8 <div class="modal-body">
@@ -19,7 +20,7 @@
19 </div> 20 </div>
20 21
21 <div class="form-group inputs"> 22 <div class="form-group inputs">
22 <span i18n class="action-button action-button-cancel" (click)="hideBanUserModal()">Cancel</span> 23 <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
23 24
24 <input 25 <input
25 type="submit" i18n-value value="Ban this user" class="action-button-submit" 26 type="submit" i18n-value value="Ban this user" class="action-button-submit"
@@ -29,4 +30,4 @@
29 </form> 30 </form>
30 </div> 31 </div>
31 32
32</ng-template> \ No newline at end of file 33</ng-template>
diff --git a/client/src/app/shared/moderation/user-ban-modal.component.ts b/client/src/app/shared/moderation/user-ban-modal.component.ts
index 67ae38e48..942765301 100644
--- a/client/src/app/shared/moderation/user-ban-modal.component.ts
+++ b/client/src/app/shared/moderation/user-ban-modal.component.ts
@@ -1,5 +1,5 @@
1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 4import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref' 5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
@@ -15,15 +15,15 @@ import { User } from '../../../../../shared'
15}) 15})
16export class UserBanModalComponent extends FormReactive implements OnInit { 16export class UserBanModalComponent extends FormReactive implements OnInit {
17 @ViewChild('modal') modal: NgbModal 17 @ViewChild('modal') modal: NgbModal
18 @Output() userBanned = new EventEmitter<User>() 18 @Output() userBanned = new EventEmitter<User | User[]>()
19 19
20 private userToBan: User 20 private usersToBan: User | User[]
21 private openedModal: NgbModalRef 21 private openedModal: NgbModalRef
22 22
23 constructor ( 23 constructor (
24 protected formValidatorService: FormValidatorService, 24 protected formValidatorService: FormValidatorService,
25 private modalService: NgbModal, 25 private modalService: NgbModal,
26 private notificationsService: NotificationsService, 26 private notifier: Notifier,
27 private userService: UserService, 27 private userService: UserService,
28 private userValidatorsService: UserValidatorsService, 28 private userValidatorsService: UserValidatorsService,
29 private i18n: I18n 29 private i18n: I18n
@@ -37,32 +37,33 @@ export class UserBanModalComponent extends FormReactive implements OnInit {
37 }) 37 })
38 } 38 }
39 39
40 openModal (user: User) { 40 openModal (user: User | User[]) {
41 this.userToBan = user 41 this.usersToBan = user
42 this.openedModal = this.modalService.open(this.modal) 42 this.openedModal = this.modalService.open(this.modal)
43 } 43 }
44 44
45 hideBanUserModal () { 45 hide () {
46 this.userToBan = undefined 46 this.usersToBan = undefined
47 this.openedModal.close() 47 this.openedModal.close()
48 } 48 }
49 49
50 async banUser () { 50 async banUser () {
51 const reason = this.form.value['reason'] || undefined 51 const reason = this.form.value['reason'] || undefined
52 52
53 this.userService.banUser(this.userToBan, reason) 53 this.userService.banUsers(this.usersToBan, reason)
54 .subscribe( 54 .subscribe(
55 () => { 55 () => {
56 this.notificationsService.success( 56 const message = Array.isArray(this.usersToBan)
57 this.i18n('Success'), 57 ? this.i18n('{{num}} users banned.', { num: this.usersToBan.length })
58 this.i18n('User {{username}} banned.', { username: this.userToBan.username }) 58 : this.i18n('User {{username}} banned.', { username: this.usersToBan.username })
59 )
60 59
61 this.userBanned.emit(this.userToBan) 60 this.notifier.success(message)
62 this.hideBanUserModal() 61
62 this.userBanned.emit(this.usersToBan)
63 this.hide()
63 }, 64 },
64 65
65 err => this.notificationsService.error(this.i18n('Error'), err.message) 66 err => this.notifier.error(err.message)
66 ) 67 )
67 } 68 }
68 69
diff --git a/client/src/app/shared/moderation/user-moderation-dropdown.component.html b/client/src/app/shared/moderation/user-moderation-dropdown.component.html
index ed1a4c863..7367a7e59 100644
--- a/client/src/app/shared/moderation/user-moderation-dropdown.component.html
+++ b/client/src/app/shared/moderation/user-moderation-dropdown.component.html
@@ -1,5 +1,8 @@
1<ng-container *ngIf="user && userActions.length !== 0"> 1<ng-container *ngIf="userActions.length !== 0">
2 <my-user-ban-modal #userBanModal (userBanned)="onUserBanned()"></my-user-ban-modal> 2 <my-user-ban-modal #userBanModal (userBanned)="onUserBanned()"></my-user-ban-modal>
3 3
4 <my-action-dropdown i18n-label label="Actions" [actions]="userActions" [entry]="user" [buttonSize]="buttonSize"></my-action-dropdown> 4 <my-action-dropdown
5 [actions]="userActions" [entry]="{ user: user, account: account }"
6 [buttonSize]="buttonSize" [placement]="placement"
7 ></my-action-dropdown>
5</ng-container> \ No newline at end of file 8</ng-container> \ No newline at end of file
diff --git a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts
index 4f88456de..9a2461ebf 100644
--- a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts
+++ b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts
@@ -1,50 +1,53 @@
1import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications'
3import { I18n } from '@ngx-translate/i18n-polyfill' 2import { I18n } from '@ngx-translate/i18n-polyfill'
4import { DropdownAction } from '@app/shared/buttons/action-dropdown.component' 3import { DropdownAction } from '@app/shared/buttons/action-dropdown.component'
5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
6import { UserBanModalComponent } from '@app/shared/moderation/user-ban-modal.component' 4import { UserBanModalComponent } from '@app/shared/moderation/user-ban-modal.component'
7import { UserService } from '@app/shared/users' 5import { UserService } from '@app/shared/users'
8import { AuthService, ConfirmService } from '@app/core' 6import { AuthService, ConfirmService, Notifier, ServerService } from '@app/core'
9import { User, UserRight } from '../../../../../shared/models/users' 7import { User, UserRight } from '../../../../../shared/models/users'
8import { Account } from '@app/shared/account/account.model'
9import { BlocklistService } from '@app/shared/blocklist'
10 10
11@Component({ 11@Component({
12 selector: 'my-user-moderation-dropdown', 12 selector: 'my-user-moderation-dropdown',
13 templateUrl: './user-moderation-dropdown.component.html', 13 templateUrl: './user-moderation-dropdown.component.html',
14 styleUrls: [ './user-moderation-dropdown.component.scss' ] 14 styleUrls: [ './user-moderation-dropdown.component.scss' ]
15}) 15})
16export class UserModerationDropdownComponent implements OnInit { 16export class UserModerationDropdownComponent implements OnChanges {
17 @ViewChild('userBanModal') userBanModal: UserBanModalComponent 17 @ViewChild('userBanModal') userBanModal: UserBanModalComponent
18 18
19 @Input() user: User 19 @Input() user: User
20 @Input() account: Account
21
20 @Input() buttonSize: 'normal' | 'small' = 'normal' 22 @Input() buttonSize: 'normal' | 'small' = 'normal'
23 @Input() placement = 'left'
21 24
22 @Output() userChanged = new EventEmitter() 25 @Output() userChanged = new EventEmitter()
23 @Output() userDeleted = new EventEmitter() 26 @Output() userDeleted = new EventEmitter()
24 27
25 userActions: DropdownAction<User>[] = [] 28 userActions: DropdownAction<{ user: User, account: Account }>[][] = []
26
27 private openedModal: NgbModalRef
28 29
29 constructor ( 30 constructor (
30 private authService: AuthService, 31 private authService: AuthService,
31 private notificationsService: NotificationsService, 32 private notifier: Notifier,
32 private confirmService: ConfirmService, 33 private confirmService: ConfirmService,
34 private serverService: ServerService,
33 private userService: UserService, 35 private userService: UserService,
36 private blocklistService: BlocklistService,
34 private i18n: I18n 37 private i18n: I18n
35 ) { } 38 ) { }
36 39
37 ngOnInit () { 40 get requiresEmailVerification () {
38 this.buildActions() 41 return this.serverService.getConfig().signup.requiresEmailVerification
39 } 42 }
40 43
41 hideBanUserModal () { 44 ngOnChanges () {
42 this.openedModal.close() 45 this.buildActions()
43 } 46 }
44 47
45 openBanUserModal (user: User) { 48 openBanUserModal (user: User) {
46 if (user.username === 'root') { 49 if (user.username === 'root') {
47 this.notificationsService.error(this.i18n('Error'), this.i18n('You cannot ban root.')) 50 this.notifier.error(this.i18n('You cannot ban root.'))
48 return 51 return
49 } 52 }
50 53
@@ -60,24 +63,21 @@ export class UserModerationDropdownComponent implements OnInit {
60 const res = await this.confirmService.confirm(message, this.i18n('Unban')) 63 const res = await this.confirmService.confirm(message, this.i18n('Unban'))
61 if (res === false) return 64 if (res === false) return
62 65
63 this.userService.unbanUser(user) 66 this.userService.unbanUsers(user)
64 .subscribe( 67 .subscribe(
65 () => { 68 () => {
66 this.notificationsService.success( 69 this.notifier.success(this.i18n('User {{username}} unbanned.', { username: user.username }))
67 this.i18n('Success'),
68 this.i18n('User {{username}} unbanned.', { username: user.username })
69 )
70 70
71 this.userChanged.emit() 71 this.userChanged.emit()
72 }, 72 },
73 73
74 err => this.notificationsService.error(this.i18n('Error'), err.message) 74 err => this.notifier.error(err.message)
75 ) 75 )
76 } 76 }
77 77
78 async removeUser (user: User) { 78 async removeUser (user: User) {
79 if (user.username === 'root') { 79 if (user.username === 'root') {
80 this.notificationsService.error(this.i18n('Error'), this.i18n('You cannot delete root.')) 80 this.notifier.error(this.i18n('You cannot delete root.'))
81 return 81 return
82 } 82 }
83 83
@@ -87,17 +87,138 @@ export class UserModerationDropdownComponent implements OnInit {
87 87
88 this.userService.removeUser(user).subscribe( 88 this.userService.removeUser(user).subscribe(
89 () => { 89 () => {
90 this.notificationsService.success( 90 this.notifier.success(this.i18n('User {{username}} deleted.', { username: user.username }))
91 this.i18n('Success'),
92 this.i18n('User {{username}} deleted.', { username: user.username })
93 )
94 this.userDeleted.emit() 91 this.userDeleted.emit()
95 }, 92 },
96 93
97 err => this.notificationsService.error(this.i18n('Error'), err.message) 94 err => this.notifier.error(err.message)
98 ) 95 )
99 } 96 }
100 97
98 setEmailAsVerified (user: User) {
99 this.userService.updateUser(user.id, { emailVerified: true }).subscribe(
100 () => {
101 this.notifier.success(this.i18n('User {{username}} email set as verified', { username: user.username }))
102
103 this.userChanged.emit()
104 },
105
106 err => this.notifier.error(err.message)
107 )
108 }
109
110 blockAccountByUser (account: Account) {
111 this.blocklistService.blockAccountByUser(account)
112 .subscribe(
113 () => {
114 this.notifier.success(this.i18n('Account {{nameWithHost}} muted.', { nameWithHost: account.nameWithHost }))
115
116 this.account.mutedByUser = true
117 this.userChanged.emit()
118 },
119
120 err => this.notifier.error(err.message)
121 )
122 }
123
124 unblockAccountByUser (account: Account) {
125 this.blocklistService.unblockAccountByUser(account)
126 .subscribe(
127 () => {
128 this.notifier.success(this.i18n('Account {{nameWithHost}} unmuted.', { nameWithHost: account.nameWithHost }))
129
130 this.account.mutedByUser = false
131 this.userChanged.emit()
132 },
133
134 err => this.notifier.error(err.message)
135 )
136 }
137
138 blockServerByUser (host: string) {
139 this.blocklistService.blockServerByUser(host)
140 .subscribe(
141 () => {
142 this.notifier.success(this.i18n('Instance {{host}} muted.', { host }))
143
144 this.account.mutedServerByUser = true
145 this.userChanged.emit()
146 },
147
148 err => this.notifier.error(err.message)
149 )
150 }
151
152 unblockServerByUser (host: string) {
153 this.blocklistService.unblockServerByUser(host)
154 .subscribe(
155 () => {
156 this.notifier.success(this.i18n('Instance {{host}} unmuted.', { host }))
157
158 this.account.mutedServerByUser = false
159 this.userChanged.emit()
160 },
161
162 err => this.notifier.error(err.message)
163 )
164 }
165
166 blockAccountByInstance (account: Account) {
167 this.blocklistService.blockAccountByInstance(account)
168 .subscribe(
169 () => {
170 this.notifier.success(this.i18n('Account {{nameWithHost}} muted by the instance.', { nameWithHost: account.nameWithHost }))
171
172 this.account.mutedByInstance = true
173 this.userChanged.emit()
174 },
175
176 err => this.notifier.error(err.message)
177 )
178 }
179
180 unblockAccountByInstance (account: Account) {
181 this.blocklistService.unblockAccountByInstance(account)
182 .subscribe(
183 () => {
184 this.notifier.success(this.i18n('Account {{nameWithHost}} unmuted by the instance.', { nameWithHost: account.nameWithHost }))
185
186 this.account.mutedByInstance = false
187 this.userChanged.emit()
188 },
189
190 err => this.notifier.error(err.message)
191 )
192 }
193
194 blockServerByInstance (host: string) {
195 this.blocklistService.blockServerByInstance(host)
196 .subscribe(
197 () => {
198 this.notifier.success(this.i18n('Instance {{host}} muted by the instance.', { host }))
199
200 this.account.mutedServerByInstance = true
201 this.userChanged.emit()
202 },
203
204 err => this.notifier.error(err.message)
205 )
206 }
207
208 unblockServerByInstance (host: string) {
209 this.blocklistService.unblockServerByInstance(host)
210 .subscribe(
211 () => {
212 this.notifier.success(this.i18n('Instance {{host}} unmuted by the instance.', { host }))
213
214 this.account.mutedServerByInstance = false
215 this.userChanged.emit()
216 },
217
218 err => this.notifier.error(err.message)
219 )
220 }
221
101 getRouterUserEditLink (user: User) { 222 getRouterUserEditLink (user: User) {
102 return [ '/admin', 'users', 'update', user.id ] 223 return [ '/admin', 'users', 'update', user.id ]
103 } 224 }
@@ -108,28 +229,100 @@ export class UserModerationDropdownComponent implements OnInit {
108 if (this.authService.isLoggedIn()) { 229 if (this.authService.isLoggedIn()) {
109 const authUser = this.authService.getUser() 230 const authUser = this.authService.getUser()
110 231
111 if (authUser.hasRight(UserRight.MANAGE_USERS)) { 232 if (this.user && authUser.id === this.user.id) return
112 this.userActions = this.userActions.concat([ 233
234 if (this.user && authUser.hasRight(UserRight.MANAGE_USERS)) {
235 this.userActions.push([
113 { 236 {
114 label: this.i18n('Edit'), 237 label: this.i18n('Edit'),
115 linkBuilder: this.getRouterUserEditLink 238 linkBuilder: ({ user }) => this.getRouterUserEditLink(user)
116 }, 239 },
117 { 240 {
118 label: this.i18n('Delete'), 241 label: this.i18n('Delete'),
119 handler: user => this.removeUser(user) 242 handler: ({ user }) => this.removeUser(user)
120 }, 243 },
121 { 244 {
122 label: this.i18n('Ban'), 245 label: this.i18n('Ban'),
123 handler: user => this.openBanUserModal(user), 246 handler: ({ user }) => this.openBanUserModal(user),
124 isDisplayed: user => !user.blocked 247 isDisplayed: ({ user }) => !user.blocked
125 }, 248 },
126 { 249 {
127 label: this.i18n('Unban'), 250 label: this.i18n('Unban'),
128 handler: user => this.unbanUser(user), 251 handler: ({ user }) => this.unbanUser(user),
129 isDisplayed: user => user.blocked 252 isDisplayed: ({ user }) => user.blocked
253 },
254 {
255 label: this.i18n('Set Email as Verified'),
256 handler: ({ user }) => this.setEmailAsVerified(user),
257 isDisplayed: ({ user }) => this.requiresEmailVerification && !user.blocked && user.emailVerified === false
130 } 258 }
131 ]) 259 ])
132 } 260 }
261
262 // Actions on accounts/servers
263 if (this.account) {
264 // User actions
265 this.userActions.push([
266 {
267 label: this.i18n('Mute this account'),
268 isDisplayed: ({ account }) => account.mutedByUser === false,
269 handler: ({ account }) => this.blockAccountByUser(account)
270 },
271 {
272 label: this.i18n('Unmute this account'),
273 isDisplayed: ({ account }) => account.mutedByUser === true,
274 handler: ({ account }) => this.unblockAccountByUser(account)
275 },
276 {
277 label: this.i18n('Mute the instance'),
278 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false,
279 handler: ({ account }) => this.blockServerByUser(account.host)
280 },
281 {
282 label: this.i18n('Unmute the instance'),
283 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true,
284 handler: ({ account }) => this.unblockServerByUser(account.host)
285 }
286 ])
287
288 let instanceActions: DropdownAction<{ user: User, account: Account }>[] = []
289
290 // Instance actions
291 if (authUser.hasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST)) {
292 instanceActions = instanceActions.concat([
293 {
294 label: this.i18n('Mute this account by your instance'),
295 isDisplayed: ({ account }) => account.mutedByInstance === false,
296 handler: ({ account }) => this.blockAccountByInstance(account)
297 },
298 {
299 label: this.i18n('Unmute this account by your instance'),
300 isDisplayed: ({ account }) => account.mutedByInstance === true,
301 handler: ({ account }) => this.unblockAccountByInstance(account)
302 }
303 ])
304 }
305
306 // Instance actions
307 if (authUser.hasRight(UserRight.MANAGE_SERVERS_BLOCKLIST)) {
308 instanceActions = instanceActions.concat([
309 {
310 label: this.i18n('Mute the instance by your instance'),
311 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === false,
312 handler: ({ account }) => this.blockServerByInstance(account.host)
313 },
314 {
315 label: this.i18n('Unmute the instance by your instance'),
316 isDisplayed: ({ account }) => !account.userId && account.mutedServerByInstance === true,
317 handler: ({ account }) => this.unblockServerByInstance(account.host)
318 }
319 ])
320 }
321
322 if (instanceActions.length !== 0) {
323 this.userActions.push(instanceActions)
324 }
325 }
133 } 326 }
134 } 327 }
135} 328}
diff --git a/client/src/app/shared/overview/videos-overview.model.ts b/client/src/app/shared/overview/videos-overview.model.ts
index cf02bdb3d..c8eafc8e8 100644
--- a/client/src/app/shared/overview/videos-overview.model.ts
+++ b/client/src/app/shared/overview/videos-overview.model.ts
@@ -16,4 +16,5 @@ export class VideosOverview implements VideosOverviewServer {
16 tag: string 16 tag: string
17 videos: Video[] 17 videos: Video[]
18 }[] 18 }[]
19 [key: string]: any
19} 20}
diff --git a/client/src/app/shared/renderer/html-renderer.service.ts b/client/src/app/shared/renderer/html-renderer.service.ts
new file mode 100644
index 000000000..d49df9b6d
--- /dev/null
+++ b/client/src/app/shared/renderer/html-renderer.service.ts
@@ -0,0 +1,35 @@
1import { Injectable } from '@angular/core'
2import { LinkifierService } from '@app/shared/renderer/linkifier.service'
3import * as sanitizeHtml from 'sanitize-html'
4
5@Injectable()
6export class HtmlRendererService {
7
8 constructor (private linkifier: LinkifierService) {
9
10 }
11
12 toSafeHtml (text: string) {
13 // Convert possible markdown to html
14 const html = this.linkifier.linkify(text)
15
16 return sanitizeHtml(html, {
17 allowedTags: [ 'a', 'p', 'span', 'br' ],
18 allowedSchemes: [ 'http', 'https' ],
19 allowedAttributes: {
20 'a': [ 'href', 'class', 'target' ]
21 },
22 transformTags: {
23 a: (tagName, attribs) => {
24 return {
25 tagName,
26 attribs: Object.assign(attribs, {
27 target: '_blank',
28 rel: 'noopener noreferrer'
29 })
30 }
31 }
32 }
33 })
34 }
35}
diff --git a/client/src/app/shared/renderer/index.ts b/client/src/app/shared/renderer/index.ts
new file mode 100644
index 000000000..39202b385
--- /dev/null
+++ b/client/src/app/shared/renderer/index.ts
@@ -0,0 +1,3 @@
1export * from './html-renderer.service'
2export * from './linkifier.service'
3export * from './markdown.service'
diff --git a/client/src/app/videos/+video-watch/comment/linkifier.service.ts b/client/src/app/shared/renderer/linkifier.service.ts
index 3f4072efd..2529c9eaf 100644
--- a/client/src/app/videos/+video-watch/comment/linkifier.service.ts
+++ b/client/src/app/shared/renderer/linkifier.service.ts
@@ -1,7 +1,8 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2import { getAbsoluteAPIUrl } from '@app/shared/misc/utils' 2import { getAbsoluteAPIUrl } from '@app/shared/misc/utils'
3import * as linkify from 'linkifyjs' 3// FIXME: use @types/linkify when https://github.com/DefinitelyTyped/DefinitelyTyped/pull/29682/files is merged?
4import * as linkifyHtml from 'linkifyjs/html' 4const linkify = require('linkifyjs')
5const linkifyHtml = require('linkifyjs/html')
5 6
6@Injectable() 7@Injectable()
7export class LinkifierService { 8export class LinkifierService {
@@ -40,7 +41,7 @@ export class LinkifierService {
40 const TT_UNDERSCORE = TT.UNDERSCORE 41 const TT_UNDERSCORE = TT.UNDERSCORE
41 const TT_DOT = TT.DOT 42 const TT_DOT = TT.DOT
42 43
43 function MENTION (value) { 44 function MENTION (this: any, value: any) {
44 this.v = value 45 this.v = value
45 } 46 }
46 47
diff --git a/client/src/app/videos/shared/markdown.service.ts b/client/src/app/shared/renderer/markdown.service.ts
index 07017eca5..07017eca5 100644
--- a/client/src/app/videos/shared/markdown.service.ts
+++ b/client/src/app/shared/renderer/markdown.service.ts
diff --git a/client/src/app/shared/rest/component-pagination.model.ts b/client/src/app/shared/rest/component-pagination.model.ts
index 0b8ecc318..85160d445 100644
--- a/client/src/app/shared/rest/component-pagination.model.ts
+++ b/client/src/app/shared/rest/component-pagination.model.ts
@@ -3,3 +3,14 @@ export interface ComponentPagination {
3 itemsPerPage: number 3 itemsPerPage: number
4 totalItems?: number 4 totalItems?: number
5} 5}
6
7export function hasMoreItems (componentPagination: ComponentPagination) {
8 // No results
9 if (componentPagination.totalItems === 0) return false
10
11 // Not loaded yet
12 if (!componentPagination.totalItems) return true
13
14 const maxPage = componentPagination.totalItems / componentPagination.itemsPerPage
15 return maxPage > componentPagination.currentPage
16}
diff --git a/client/src/app/shared/rest/rest-extractor.service.ts b/client/src/app/shared/rest/rest-extractor.service.ts
index 6492aa66d..e6518dd1d 100644
--- a/client/src/app/shared/rest/rest-extractor.service.ts
+++ b/client/src/app/shared/rest/rest-extractor.service.ts
@@ -33,7 +33,7 @@ export class RestExtractor {
33 return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ]) 33 return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ])
34 } 34 }
35 35
36 convertDateToHuman (target: object, fieldsToConvert: string[]) { 36 convertDateToHuman (target: { [ id: string ]: string }, fieldsToConvert: string[]) {
37 fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field])) 37 fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field]))
38 38
39 return target 39 return target
@@ -80,10 +80,11 @@ export class RestExtractor {
80 errorMessage = errorMessage ? errorMessage : 'Unknown error.' 80 errorMessage = errorMessage ? errorMessage : 'Unknown error.'
81 console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`) 81 console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`)
82 } else { 82 } else {
83 console.error(err)
83 errorMessage = err 84 errorMessage = err
84 } 85 }
85 86
86 const errorObj = { 87 const errorObj: { message: string, status: string, body: string } = {
87 message: errorMessage, 88 message: errorMessage,
88 status: undefined, 89 status: undefined,
89 body: undefined 90 body: undefined
diff --git a/client/src/app/shared/rest/rest-table.ts b/client/src/app/shared/rest/rest-table.ts
index fe1a91d2d..884588207 100644
--- a/client/src/app/shared/rest/rest-table.ts
+++ b/client/src/app/shared/rest/rest-table.ts
@@ -1,8 +1,9 @@
1import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' 1import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
2import { LazyLoadEvent } from 'primeng/components/common/lazyloadevent' 2import { LazyLoadEvent } from 'primeng/components/common/lazyloadevent'
3import { SortMeta } from 'primeng/components/common/sortmeta' 3import { SortMeta } from 'primeng/components/common/sortmeta'
4
5import { RestPagination } from './rest-pagination' 4import { RestPagination } from './rest-pagination'
5import { Subject } from 'rxjs'
6import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
6 7
7export abstract class RestTable { 8export abstract class RestTable {
8 9
@@ -11,9 +12,14 @@ export abstract class RestTable {
11 abstract sort: SortMeta 12 abstract sort: SortMeta
12 abstract pagination: RestPagination 13 abstract pagination: RestPagination
13 14
15 protected search: string
16 private searchStream: Subject<string>
14 private sortLocalStorageKey = 'rest-table-sort-' + this.constructor.name 17 private sortLocalStorageKey = 'rest-table-sort-' + this.constructor.name
15 18
16 protected abstract loadData (): void 19 initialize () {
20 this.loadSort()
21 this.initSearch()
22 }
17 23
18 loadSort () { 24 loadSort () {
19 const result = peertubeLocalStorage.getItem(this.sortLocalStorageKey) 25 const result = peertubeLocalStorage.getItem(this.sortLocalStorageKey)
@@ -46,4 +52,23 @@ export abstract class RestTable {
46 peertubeLocalStorage.setItem(this.sortLocalStorageKey, JSON.stringify(this.sort)) 52 peertubeLocalStorage.setItem(this.sortLocalStorageKey, JSON.stringify(this.sort))
47 } 53 }
48 54
55 initSearch () {
56 this.searchStream = new Subject()
57
58 this.searchStream
59 .pipe(
60 debounceTime(400),
61 distinctUntilChanged()
62 )
63 .subscribe(search => {
64 this.search = search
65 this.loadData()
66 })
67 }
68
69 onSearch (search: string) {
70 this.searchStream.next(search)
71 }
72
73 protected abstract loadData (): void
49} 74}
diff --git a/client/src/app/shared/rest/rest.service.ts b/client/src/app/shared/rest/rest.service.ts
index 4560c2024..e6d4e6e5e 100644
--- a/client/src/app/shared/rest/rest.service.ts
+++ b/client/src/app/shared/rest/rest.service.ts
@@ -32,7 +32,7 @@ export class RestService {
32 return newParams 32 return newParams
33 } 33 }
34 34
35 addObjectParams (params: HttpParams, object: object) { 35 addObjectParams (params: HttpParams, object: { [ name: string ]: any }) {
36 for (const name of Object.keys(object)) { 36 for (const name of Object.keys(object)) {
37 const value = object[name] 37 const value = object[name]
38 if (!value) continue 38 if (!value) continue
diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts
index 9647a7966..6f8625c7e 100644
--- a/client/src/app/shared/shared.module.ts
+++ b/client/src/app/shared/shared.module.ts
@@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router'
6import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component' 6import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component'
7import { HelpComponent } from '@app/shared/misc/help.component' 7import { HelpComponent } from '@app/shared/misc/help.component'
8import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive' 8import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive'
9import { MarkdownService } from '@app/videos/shared'
10 9
11import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes' 10import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes'
12import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared' 11import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared'
@@ -25,7 +24,7 @@ import { VideoAbuseService } from './video-abuse'
25import { VideoBlacklistService } from './video-blacklist' 24import { VideoBlacklistService } from './video-blacklist'
26import { VideoOwnershipService } from './video-ownership' 25import { VideoOwnershipService } from './video-ownership'
27import { VideoMiniatureComponent } from './video/video-miniature.component' 26import { VideoMiniatureComponent } from './video/video-miniature.component'
28import { VideoFeedComponent } from './video/video-feed.component' 27import { FeedComponent } from './video/feed.component'
29import { VideoThumbnailComponent } from './video/video-thumbnail.component' 28import { VideoThumbnailComponent } from './video/video-thumbnail.component'
30import { VideoService } from './video/video.service' 29import { VideoService } from './video/video.service'
31import { AccountService } from '@app/shared/account/account.service' 30import { AccountService } from '@app/shared/account/account.service'
@@ -34,16 +33,19 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
34import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 33import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
35import { 34import {
36 CustomConfigValidatorsService, 35 CustomConfigValidatorsService,
36 InstanceValidatorsService,
37 LoginValidatorsService, 37 LoginValidatorsService,
38 ReactiveFileComponent, 38 ReactiveFileComponent,
39 ResetPasswordValidatorsService, 39 ResetPasswordValidatorsService,
40 TextareaAutoResizeDirective,
40 UserValidatorsService, 41 UserValidatorsService,
41 VideoAbuseValidatorsService, 42 VideoAbuseValidatorsService,
43 VideoAcceptOwnershipValidatorsService,
42 VideoBlacklistValidatorsService, 44 VideoBlacklistValidatorsService,
45 VideoChangeOwnershipValidatorsService,
43 VideoChannelValidatorsService, 46 VideoChannelValidatorsService,
44 VideoCommentValidatorsService, 47 VideoCommentValidatorsService,
45 VideoValidatorsService, 48 VideoValidatorsService
46 VideoChangeOwnershipValidatorsService, VideoAcceptOwnershipValidatorsService
47} from '@app/shared/forms' 49} from '@app/shared/forms'
48import { I18nPrimengCalendarService } from '@app/shared/i18n/i18n-primeng-calendar' 50import { I18nPrimengCalendarService } from '@app/shared/i18n/i18n-primeng-calendar'
49import { ScreenService } from '@app/shared/misc/screen.service' 51import { ScreenService } from '@app/shared/misc/screen.service'
@@ -53,11 +55,20 @@ import { PeertubeCheckboxComponent } from '@app/shared/forms/peertube-checkbox.c
53import { VideoImportService } from '@app/shared/video-import/video-import.service' 55import { VideoImportService } from '@app/shared/video-import/video-import.service'
54import { ActionDropdownComponent } from '@app/shared/buttons/action-dropdown.component' 56import { ActionDropdownComponent } from '@app/shared/buttons/action-dropdown.component'
55import { NgbDropdownModule, NgbModalModule, NgbPopoverModule, NgbTabsetModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap' 57import { NgbDropdownModule, NgbModalModule, NgbPopoverModule, NgbTabsetModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'
56import { SubscribeButtonComponent, RemoteSubscribeComponent, UserSubscriptionService } from '@app/shared/user-subscription' 58import { RemoteSubscribeComponent, SubscribeButtonComponent, UserSubscriptionService } from '@app/shared/user-subscription'
57import { InstanceFeaturesTableComponent } from '@app/shared/instance/instance-features-table.component' 59import { InstanceFeaturesTableComponent } from '@app/shared/instance/instance-features-table.component'
58import { OverviewService } from '@app/shared/overview' 60import { OverviewService } from '@app/shared/overview'
59import { UserBanModalComponent } from '@app/shared/moderation' 61import { UserBanModalComponent } from '@app/shared/moderation'
60import { UserModerationDropdownComponent } from '@app/shared/moderation/user-moderation-dropdown.component' 62import { UserModerationDropdownComponent } from '@app/shared/moderation/user-moderation-dropdown.component'
63import { BlocklistService } from '@app/shared/blocklist'
64import { TopMenuDropdownComponent } from '@app/shared/menu/top-menu-dropdown.component'
65import { UserHistoryService } from '@app/shared/users/user-history.service'
66import { UserNotificationService } from '@app/shared/users/user-notification.service'
67import { UserNotificationsComponent } from '@app/shared/users/user-notifications.component'
68import { InstanceService } from '@app/shared/instance/instance.service'
69import { HtmlRendererService, LinkifierService, MarkdownService } from '@app/shared/renderer'
70import { ConfirmComponent } from '@app/shared/confirm/confirm.component'
71import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
61 72
62@NgModule({ 73@NgModule({
63 imports: [ 74 imports: [
@@ -81,7 +92,7 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
81 LoaderComponent, 92 LoaderComponent,
82 VideoThumbnailComponent, 93 VideoThumbnailComponent,
83 VideoMiniatureComponent, 94 VideoMiniatureComponent,
84 VideoFeedComponent, 95 FeedComponent,
85 ButtonComponent, 96 ButtonComponent,
86 DeleteButtonComponent, 97 DeleteButtonComponent,
87 EditButtonComponent, 98 EditButtonComponent,
@@ -91,6 +102,7 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
91 FromNowPipe, 102 FromNowPipe,
92 MarkdownTextareaComponent, 103 MarkdownTextareaComponent,
93 InfiniteScrollerDirective, 104 InfiniteScrollerDirective,
105 TextareaAutoResizeDirective,
94 HelpComponent, 106 HelpComponent,
95 ReactiveFileComponent, 107 ReactiveFileComponent,
96 PeertubeCheckboxComponent, 108 PeertubeCheckboxComponent,
@@ -98,7 +110,11 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
98 RemoteSubscribeComponent, 110 RemoteSubscribeComponent,
99 InstanceFeaturesTableComponent, 111 InstanceFeaturesTableComponent,
100 UserBanModalComponent, 112 UserBanModalComponent,
101 UserModerationDropdownComponent 113 UserModerationDropdownComponent,
114 TopMenuDropdownComponent,
115 UserNotificationsComponent,
116 ConfirmComponent,
117 GlobalIconComponent
102 ], 118 ],
103 119
104 exports: [ 120 exports: [
@@ -121,13 +137,14 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
121 LoaderComponent, 137 LoaderComponent,
122 VideoThumbnailComponent, 138 VideoThumbnailComponent,
123 VideoMiniatureComponent, 139 VideoMiniatureComponent,
124 VideoFeedComponent, 140 FeedComponent,
125 ButtonComponent, 141 ButtonComponent,
126 DeleteButtonComponent, 142 DeleteButtonComponent,
127 EditButtonComponent, 143 EditButtonComponent,
128 ActionDropdownComponent, 144 ActionDropdownComponent,
129 MarkdownTextareaComponent, 145 MarkdownTextareaComponent,
130 InfiniteScrollerDirective, 146 InfiniteScrollerDirective,
147 TextareaAutoResizeDirective,
131 HelpComponent, 148 HelpComponent,
132 ReactiveFileComponent, 149 ReactiveFileComponent,
133 PeertubeCheckboxComponent, 150 PeertubeCheckboxComponent,
@@ -136,6 +153,10 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
136 InstanceFeaturesTableComponent, 153 InstanceFeaturesTableComponent,
137 UserBanModalComponent, 154 UserBanModalComponent,
138 UserModerationDropdownComponent, 155 UserModerationDropdownComponent,
156 TopMenuDropdownComponent,
157 UserNotificationsComponent,
158 ConfirmComponent,
159 GlobalIconComponent,
139 160
140 NumberFormatterPipe, 161 NumberFormatterPipe,
141 ObjectLengthPipe, 162 ObjectLengthPipe,
@@ -152,7 +173,6 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
152 UserService, 173 UserService,
153 VideoService, 174 VideoService,
154 AccountService, 175 AccountService,
155 MarkdownService,
156 VideoChannelService, 176 VideoChannelService,
157 VideoCaptionService, 177 VideoCaptionService,
158 VideoImportService, 178 VideoImportService,
@@ -172,10 +192,20 @@ import { UserModerationDropdownComponent } from '@app/shared/moderation/user-mod
172 OverviewService, 192 OverviewService,
173 VideoChangeOwnershipValidatorsService, 193 VideoChangeOwnershipValidatorsService,
174 VideoAcceptOwnershipValidatorsService, 194 VideoAcceptOwnershipValidatorsService,
195 InstanceValidatorsService,
196 BlocklistService,
197 UserHistoryService,
198 InstanceService,
199
200 MarkdownService,
201 LinkifierService,
202 HtmlRendererService,
175 203
176 I18nPrimengCalendarService, 204 I18nPrimengCalendarService,
177 ScreenService, 205 ScreenService,
178 206
207 UserNotificationService,
208
179 I18n 209 I18n
180 ] 210 ]
181}) 211})
diff --git a/client/src/app/shared/user-subscription/remote-subscribe.component.ts b/client/src/app/shared/user-subscription/remote-subscribe.component.ts
index 7a81108cd..ba2a45df1 100644
--- a/client/src/app/shared/user-subscription/remote-subscribe.component.ts
+++ b/client/src/app/shared/user-subscription/remote-subscribe.component.ts
@@ -29,7 +29,7 @@ export class RemoteSubscribeComponent extends FormReactive implements OnInit {
29 } 29 }
30 30
31 onValidKey () { 31 onValidKey () {
32 this.onValueChanged() 32 this.check()
33 if (!this.form.valid) return 33 if (!this.form.valid) return
34 34
35 this.formValidated() 35 this.formValidated()
@@ -37,7 +37,24 @@ export class RemoteSubscribeComponent extends FormReactive implements OnInit {
37 37
38 formValidated () { 38 formValidated () {
39 const address = this.form.value['text'] 39 const address = this.form.value['text']
40 const [ , hostname ] = address.split('@') 40 const [ username, hostname ] = address.split('@')
41 window.open(`https://${hostname}/authorize_interaction?acct=${this.account}`) 41
42 fetch(`https://${hostname}/.well-known/webfinger?resource=acct:${username}@${hostname}`)
43 .then(response => response.json())
44 .then(data => new Promise((resolve, reject) => {
45 if (data && Array.isArray(data.links)) {
46 const link: {
47 template: string
48 } = data.links.find((link: any) =>
49 link && typeof link.template === 'string' && link.rel === 'http://ostatus.org/schema/1.0/subscribe')
50
51 if (link && link.template.includes('{uri}')) {
52 resolve(link.template.replace('{uri}', `acct:${this.account}`))
53 }
54 }
55 reject()
56 }))
57 .then(window.open)
58 .catch(() => window.open(`https://${hostname}/authorize_interaction?acct=${this.account}`))
42 } 59 }
43} 60}
diff --git a/client/src/app/shared/user-subscription/subscribe-button.component.ts b/client/src/app/shared/user-subscription/subscribe-button.component.ts
index 315ea5037..8f1754c7f 100644
--- a/client/src/app/shared/user-subscription/subscribe-button.component.ts
+++ b/client/src/app/shared/user-subscription/subscribe-button.component.ts
@@ -1,9 +1,8 @@
1import { Component, Input, OnInit } from '@angular/core' 1import { Component, Input, OnInit } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { AuthService } from '@app/core' 3import { AuthService, Notifier } from '@app/core'
4import { UserSubscriptionService } from '@app/shared/user-subscription/user-subscription.service' 4import { UserSubscriptionService } from '@app/shared/user-subscription/user-subscription.service'
5import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 5import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
6import { NotificationsService } from 'angular2-notifications'
7import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
8import { VideoService } from '@app/shared/video/video.service' 7import { VideoService } from '@app/shared/video/video.service'
9import { FeedFormat } from '../../../../../shared/models/feeds' 8import { FeedFormat } from '../../../../../shared/models/feeds'
@@ -23,7 +22,7 @@ export class SubscribeButtonComponent implements OnInit {
23 constructor ( 22 constructor (
24 private authService: AuthService, 23 private authService: AuthService,
25 private router: Router, 24 private router: Router,
26 private notificationsService: NotificationsService, 25 private notifier: Notifier,
27 private userSubscriptionService: UserSubscriptionService, 26 private userSubscriptionService: UserSubscriptionService,
28 private i18n: I18n, 27 private i18n: I18n,
29 private videoService: VideoService 28 private videoService: VideoService
@@ -43,18 +42,17 @@ export class SubscribeButtonComponent implements OnInit {
43 .subscribe( 42 .subscribe(
44 res => this.subscribed = res[this.uri], 43 res => this.subscribed = res[this.uri],
45 44
46 err => this.notificationsService.error(this.i18n('Error'), err.message) 45 err => this.notifier.error(err.message)
47 ) 46 )
48 } 47 }
49 } 48 }
50 49
51 subscribe () { 50 subscribe () {
52 if (this.isUserLoggedIn()) { 51 if (this.isUserLoggedIn()) {
53 this.localSubscribe() 52 return this.localSubscribe()
54 } else {
55 this.authService.redirectUrl = this.router.url
56 this.gotoLogin()
57 } 53 }
54
55 return this.gotoLogin()
58 } 56 }
59 57
60 localSubscribe () { 58 localSubscribe () {
@@ -63,13 +61,13 @@ export class SubscribeButtonComponent implements OnInit {
63 () => { 61 () => {
64 this.subscribed = true 62 this.subscribed = true
65 63
66 this.notificationsService.success( 64 this.notifier.success(
67 this.i18n('Subscribed'), 65 this.i18n('Subscribed to {{nameWithHost}}', { nameWithHost: this.videoChannel.displayName }),
68 this.i18n('Subscribed to {{nameWithHost}}', { nameWithHost: this.videoChannel.displayName }) 66 this.i18n('Subscribed')
69 ) 67 )
70 }, 68 },
71 69
72 err => this.notificationsService.error(this.i18n('Error'), err.message) 70 err => this.notifier.error(err.message)
73 ) 71 )
74 } 72 }
75 73
@@ -85,13 +83,13 @@ export class SubscribeButtonComponent implements OnInit {
85 () => { 83 () => {
86 this.subscribed = false 84 this.subscribed = false
87 85
88 this.notificationsService.success( 86 this.notifier.success(
89 this.i18n('Unsubscribed'), 87 this.i18n('Unsubscribed from {{nameWithHost}}', { nameWithHost: this.videoChannel.displayName }),
90 this.i18n('Unsubscribed from {{nameWithHost}}', { nameWithHost: this.videoChannel.displayName }) 88 this.i18n('Unsubscribed')
91 ) 89 )
92 }, 90 },
93 91
94 err => this.notificationsService.error(this.i18n('Error'), err.message) 92 err => this.notifier.error(err.message)
95 ) 93 )
96 } 94 }
97 95
diff --git a/client/src/app/shared/users/index.ts b/client/src/app/shared/users/index.ts
index 7b5a67bc7..ebd715fb1 100644
--- a/client/src/app/shared/users/index.ts
+++ b/client/src/app/shared/users/index.ts
@@ -1,2 +1,3 @@
1export * from './user.model' 1export * from './user.model'
2export * from './user.service' 2export * from './user.service'
3export * from './user-notifications.component'
diff --git a/client/src/app/shared/users/user-history.service.ts b/client/src/app/shared/users/user-history.service.ts
new file mode 100644
index 000000000..9ed25bfc7
--- /dev/null
+++ b/client/src/app/shared/users/user-history.service.ts
@@ -0,0 +1,45 @@
1import { HttpClient, HttpParams } from '@angular/common/http'
2import { Injectable } from '@angular/core'
3import { environment } from '../../../environments/environment'
4import { RestExtractor } from '../rest/rest-extractor.service'
5import { RestService } from '../rest/rest.service'
6import { Video } from '../video/video.model'
7import { catchError, map, switchMap } from 'rxjs/operators'
8import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
9import { VideoService } from '@app/shared/video/video.service'
10import { ResultList } from '../../../../../shared'
11
12@Injectable()
13export class UserHistoryService {
14 static BASE_USER_VIDEOS_HISTORY_URL = environment.apiUrl + '/api/v1/users/me/history/videos'
15
16 constructor (
17 private authHttp: HttpClient,
18 private restExtractor: RestExtractor,
19 private restService: RestService,
20 private videoService: VideoService
21 ) {}
22
23 getUserVideosHistory (historyPagination: ComponentPagination) {
24 const pagination = this.restService.componentPaginationToRestPagination(historyPagination)
25
26 let params = new HttpParams()
27 params = this.restService.addRestGetParams(params, pagination)
28
29 return this.authHttp
30 .get<ResultList<Video>>(UserHistoryService.BASE_USER_VIDEOS_HISTORY_URL, { params })
31 .pipe(
32 switchMap(res => this.videoService.extractVideos(res)),
33 catchError(err => this.restExtractor.handleError(err))
34 )
35 }
36
37 deleteUserVideosHistory () {
38 return this.authHttp
39 .post(UserHistoryService.BASE_USER_VIDEOS_HISTORY_URL + '/remove', {})
40 .pipe(
41 map(() => this.restExtractor.extractDataBool()),
42 catchError(err => this.restExtractor.handleError(err))
43 )
44 }
45}
diff --git a/client/src/app/shared/users/user-notification.model.ts b/client/src/app/shared/users/user-notification.model.ts
new file mode 100644
index 000000000..125d2120c
--- /dev/null
+++ b/client/src/app/shared/users/user-notification.model.ts
@@ -0,0 +1,155 @@
1import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo, ActorInfo } from '../../../../../shared'
2import { Actor } from '@app/shared/actor/actor.model'
3
4export class UserNotification implements UserNotificationServer {
5 id: number
6 type: UserNotificationType
7 read: boolean
8
9 video?: VideoInfo & {
10 channel: ActorInfo & { avatarUrl?: string }
11 }
12
13 videoImport?: {
14 id: number
15 video?: VideoInfo
16 torrentName?: string
17 magnetUri?: string
18 targetUrl?: string
19 }
20
21 comment?: {
22 id: number
23 threadId: number
24 account: ActorInfo & { avatarUrl?: string }
25 video: VideoInfo
26 }
27
28 videoAbuse?: {
29 id: number
30 video: VideoInfo
31 }
32
33 videoBlacklist?: {
34 id: number
35 video: VideoInfo
36 }
37
38 account?: ActorInfo & { avatarUrl?: string }
39
40 actorFollow?: {
41 id: number
42 follower: ActorInfo & { avatarUrl?: string }
43 following: {
44 type: 'account' | 'channel'
45 name: string
46 displayName: string
47 }
48 }
49
50 createdAt: string
51 updatedAt: string
52
53 // Additional fields
54 videoUrl?: string
55 commentUrl?: any[]
56 videoAbuseUrl?: string
57 accountUrl?: string
58 videoImportIdentifier?: string
59 videoImportUrl?: string
60
61 constructor (hash: UserNotificationServer) {
62 this.id = hash.id
63 this.type = hash.type
64 this.read = hash.read
65
66 this.video = hash.video
67 if (this.video) this.setAvatarUrl(this.video.channel)
68
69 this.videoImport = hash.videoImport
70
71 this.comment = hash.comment
72 if (this.comment) this.setAvatarUrl(this.comment.account)
73
74 this.videoAbuse = hash.videoAbuse
75
76 this.videoBlacklist = hash.videoBlacklist
77
78 this.account = hash.account
79 if (this.account) this.setAvatarUrl(this.account)
80
81 this.actorFollow = hash.actorFollow
82 if (this.actorFollow) this.setAvatarUrl(this.actorFollow.follower)
83
84 this.createdAt = hash.createdAt
85 this.updatedAt = hash.updatedAt
86
87 switch (this.type) {
88 case UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION:
89 this.videoUrl = this.buildVideoUrl(this.video)
90 break
91
92 case UserNotificationType.UNBLACKLIST_ON_MY_VIDEO:
93 this.videoUrl = this.buildVideoUrl(this.video)
94 break
95
96 case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO:
97 case UserNotificationType.COMMENT_MENTION:
98 this.accountUrl = this.buildAccountUrl(this.comment.account)
99 this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ]
100 break
101
102 case UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS:
103 this.videoAbuseUrl = '/admin/moderation/video-abuses/list'
104 this.videoUrl = this.buildVideoUrl(this.videoAbuse.video)
105 break
106
107 case UserNotificationType.BLACKLIST_ON_MY_VIDEO:
108 this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video)
109 break
110
111 case UserNotificationType.MY_VIDEO_PUBLISHED:
112 this.videoUrl = this.buildVideoUrl(this.video)
113 break
114
115 case UserNotificationType.MY_VIDEO_IMPORT_SUCCESS:
116 this.videoImportUrl = this.buildVideoImportUrl()
117 this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
118 this.videoUrl = this.buildVideoUrl(this.videoImport.video)
119 break
120
121 case UserNotificationType.MY_VIDEO_IMPORT_ERROR:
122 this.videoImportUrl = this.buildVideoImportUrl()
123 this.videoImportIdentifier = this.buildVideoImportIdentifier(this.videoImport)
124 break
125
126 case UserNotificationType.NEW_USER_REGISTRATION:
127 this.accountUrl = this.buildAccountUrl(this.account)
128 break
129
130 case UserNotificationType.NEW_FOLLOW:
131 this.accountUrl = this.buildAccountUrl(this.actorFollow.follower)
132 break
133 }
134 }
135
136 private buildVideoUrl (video: { uuid: string }) {
137 return '/videos/watch/' + video.uuid
138 }
139
140 private buildAccountUrl (account: { name: string, host: string }) {
141 return '/accounts/' + Actor.CREATE_BY_STRING(account.name, account.host)
142 }
143
144 private buildVideoImportUrl () {
145 return '/my-account/video-imports'
146 }
147
148 private buildVideoImportIdentifier (videoImport: { targetUrl?: string, magnetUri?: string, torrentName?: string }) {
149 return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName
150 }
151
152 private setAvatarUrl (actor: { avatarUrl?: string, avatar?: { path: string } }) {
153 actor.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(actor)
154 }
155}
diff --git a/client/src/app/shared/users/user-notification.service.ts b/client/src/app/shared/users/user-notification.service.ts
new file mode 100644
index 000000000..f8a30955d
--- /dev/null
+++ b/client/src/app/shared/users/user-notification.service.ts
@@ -0,0 +1,86 @@
1import { Injectable } from '@angular/core'
2import { HttpClient, HttpParams } from '@angular/common/http'
3import { RestExtractor, RestService } from '../rest'
4import { catchError, map, tap } from 'rxjs/operators'
5import { environment } from '../../../environments/environment'
6import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared'
7import { UserNotification } from './user-notification.model'
8import { AuthService } from '../../core'
9import { ComponentPagination } from '../rest/component-pagination.model'
10import { User } from '..'
11import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
12
13@Injectable()
14export class UserNotificationService {
15 static BASE_NOTIFICATIONS_URL = environment.apiUrl + '/api/v1/users/me/notifications'
16 static BASE_NOTIFICATION_SETTINGS = environment.apiUrl + '/api/v1/users/me/notification-settings'
17
18 constructor (
19 private auth: AuthService,
20 private authHttp: HttpClient,
21 private restExtractor: RestExtractor,
22 private restService: RestService,
23 private userNotificationSocket: UserNotificationSocket
24 ) {}
25
26 listMyNotifications (pagination: ComponentPagination, unread?: boolean, ignoreLoadingBar = false) {
27 let params = new HttpParams()
28 params = this.restService.addRestGetParams(params, this.restService.componentPaginationToRestPagination(pagination))
29
30 if (unread) params = params.append('unread', `${unread}`)
31
32 const headers = ignoreLoadingBar ? { ignoreLoadingBar: '' } : undefined
33
34 return this.authHttp.get<ResultList<UserNotification>>(UserNotificationService.BASE_NOTIFICATIONS_URL, { params, headers })
35 .pipe(
36 map(res => this.restExtractor.convertResultListDateToHuman(res)),
37 map(res => this.restExtractor.applyToResultListData(res, this.formatNotification.bind(this))),
38 catchError(err => this.restExtractor.handleError(err))
39 )
40 }
41
42 countUnreadNotifications () {
43 return this.listMyNotifications({ currentPage: 1, itemsPerPage: 0 }, true)
44 .pipe(map(n => n.total))
45 }
46
47 markAsRead (notification: UserNotification) {
48 const url = UserNotificationService.BASE_NOTIFICATIONS_URL + '/read'
49
50 const body = { ids: [ notification.id ] }
51 const headers = { ignoreLoadingBar: '' }
52
53 return this.authHttp.post(url, body, { headers })
54 .pipe(
55 map(this.restExtractor.extractDataBool),
56 tap(() => this.userNotificationSocket.dispatch('read')),
57 catchError(res => this.restExtractor.handleError(res))
58 )
59 }
60
61 markAllAsRead () {
62 const url = UserNotificationService.BASE_NOTIFICATIONS_URL + '/read-all'
63 const headers = { ignoreLoadingBar: '' }
64
65 return this.authHttp.post(url, {}, { headers })
66 .pipe(
67 map(this.restExtractor.extractDataBool),
68 tap(() => this.userNotificationSocket.dispatch('read-all')),
69 catchError(res => this.restExtractor.handleError(res))
70 )
71 }
72
73 updateNotificationSettings (user: User, settings: UserNotificationSetting) {
74 const url = UserNotificationService.BASE_NOTIFICATION_SETTINGS
75
76 return this.authHttp.put(url, settings)
77 .pipe(
78 map(this.restExtractor.extractDataBool),
79 catchError(res => this.restExtractor.handleError(res))
80 )
81 }
82
83 private formatNotification (notification: UserNotificationServer) {
84 return new UserNotification(notification)
85 }
86}
diff --git a/client/src/app/shared/users/user-notifications.component.html b/client/src/app/shared/users/user-notifications.component.html
new file mode 100644
index 000000000..0d69e0feb
--- /dev/null
+++ b/client/src/app/shared/users/user-notifications.component.html
@@ -0,0 +1,101 @@
1<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div>
2
3<div class="notifications" myInfiniteScroller [autoInit]="true" (nearOfBottom)="onNearOfBottom()">
4 <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }" (click)="markAsRead(notification)">
5
6 <ng-container [ngSwitch]="notification.type">
7 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION">
8 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.video.channel.avatarUrl" />
9
10 <div class="message">
11 {{ notification.video.channel.displayName }} published a <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">new video</a>
12 </div>
13 </ng-container>
14
15 <ng-container i18n *ngSwitchCase="UserNotificationType.UNBLACKLIST_ON_MY_VIDEO">
16 <my-global-icon iconName="undo"></my-global-icon>
17
18 <div class="message">
19 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been unblacklisted
20 </div>
21 </ng-container>
22
23 <ng-container i18n *ngSwitchCase="UserNotificationType.BLACKLIST_ON_MY_VIDEO">
24 <my-global-icon iconName="no"></my-global-icon>
25
26 <div class="message">
27 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been blacklisted
28 </div>
29 </ng-container>
30
31 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS">
32 <my-global-icon iconName="alert"></my-global-icon>
33
34 <div class="message">
35 <a (click)="markAsRead(notification)" [routerLink]="notification.videoAbuseUrl">A new video abuse</a> has been created on video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoAbuse.video.name }}</a>
36 </div>
37 </ng-container>
38
39 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_COMMENT_ON_MY_VIDEO">
40 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
41
42 <div class="message">
43 <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.comment.account.displayName }}</a> commented your video <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">{{ notification.comment.video.name }}</a>
44 </div>
45 </ng-container>
46
47 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_PUBLISHED">
48 <my-global-icon iconName="sparkle"></my-global-icon>
49
50 <div class="message">
51 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been published
52 </div>
53 </ng-container>
54
55 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_SUCCESS">
56 <my-global-icon iconName="cloud-download"></my-global-icon>
57
58 <div class="message">
59 <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">Your video import</a> {{ notification.videoImportIdentifier }} succeeded
60 </div>
61 </ng-container>
62
63 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_ERROR">
64 <my-global-icon iconName="cloud-error"></my-global-icon>
65
66 <div class="message">
67 <a (click)="markAsRead(notification)" [routerLink]="notification.videoImportUrl">Your video import</a> {{ notification.videoImportIdentifier }} failed
68 </div>
69 </ng-container>
70
71 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_USER_REGISTRATION">
72 <my-global-icon iconName="user-add"></my-global-icon>
73
74 <div class="message">
75 User <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.account.name }} registered</a> on your instance
76 </div>
77 </ng-container>
78
79 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_FOLLOW">
80 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.actorFollow.follower.avatarUrl" />
81
82 <div class="message">
83 <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.actorFollow.follower.displayName }}</a> is following
84
85 <ng-container *ngIf="notification.actorFollow.following.type === 'channel'">your channel {{ notification.actorFollow.following.displayName }}</ng-container>
86 <ng-container *ngIf="notification.actorFollow.following.type === 'account'">your account</ng-container>
87 </div>
88 </ng-container>
89
90 <ng-container i18n *ngSwitchCase="UserNotificationType.COMMENT_MENTION">
91 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
92
93 <div class="message">
94 <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.comment.account.displayName }}</a> mentioned you on <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">video {{ notification.comment.video.name }}</a>
95 </div>
96 </ng-container>
97 </ng-container>
98
99 <div class="from-date">{{ notification.createdAt | myFromNow }}</div>
100 </div>
101</div>
diff --git a/client/src/app/shared/users/user-notifications.component.scss b/client/src/app/shared/users/user-notifications.component.scss
new file mode 100644
index 000000000..315d504c9
--- /dev/null
+++ b/client/src/app/shared/users/user-notifications.component.scss
@@ -0,0 +1,51 @@
1@import '_variables';
2@import '_mixins';
3
4.no-notification {
5 display: flex;
6 justify-content: center;
7 align-items: center;
8 padding: 20px 0;
9}
10
11.notification {
12 display: flex;
13 align-items: center;
14 font-size: inherit;
15 padding: 15px 5px 15px 10px;
16 border-bottom: 1px solid rgba(0, 0, 0, 0.10);
17
18 &.unread {
19 background-color: rgba(0, 0, 0, 0.05);
20 }
21
22 my-global-icon {
23 width: 24px;
24 margin-right: 11px;
25 margin-left: 3px;
26
27 @include apply-svg-color(#333);
28 }
29
30 .avatar {
31 @include avatar(30px);
32
33 margin-right: 10px;
34 }
35
36 .message {
37 flex-grow: 1;
38
39 a {
40 font-weight: $font-semibold;
41 }
42 }
43
44 .from-date {
45 font-size: 0.85em;
46 color: $grey-foreground-color;
47 padding-left: 5px;
48 min-width: 70px;
49 text-align: right;
50 }
51}
diff --git a/client/src/app/shared/users/user-notifications.component.ts b/client/src/app/shared/users/user-notifications.component.ts
new file mode 100644
index 000000000..b5f9fd399
--- /dev/null
+++ b/client/src/app/shared/users/user-notifications.component.ts
@@ -0,0 +1,87 @@
1import { Component, Input, OnInit } from '@angular/core'
2import { UserNotificationService } from '@app/shared/users/user-notification.service'
3import { UserNotificationType } from '../../../../../shared'
4import { ComponentPagination, hasMoreItems } from '@app/shared/rest/component-pagination.model'
5import { Notifier } from '@app/core'
6import { UserNotification } from '@app/shared/users/user-notification.model'
7
8@Component({
9 selector: 'my-user-notifications',
10 templateUrl: 'user-notifications.component.html',
11 styleUrls: [ 'user-notifications.component.scss' ]
12})
13export class UserNotificationsComponent implements OnInit {
14 @Input() ignoreLoadingBar = false
15 @Input() infiniteScroll = true
16 @Input() itemsPerPage = 20
17
18 notifications: UserNotification[] = []
19
20 // So we can access it in the template
21 UserNotificationType = UserNotificationType
22
23 componentPagination: ComponentPagination
24
25 constructor (
26 private userNotificationService: UserNotificationService,
27 private notifier: Notifier
28 ) { }
29
30 ngOnInit () {
31 this.componentPagination = {
32 currentPage: 1,
33 itemsPerPage: this.itemsPerPage, // Reset items per page, because of the @Input() variable
34 totalItems: null
35 }
36
37 this.loadMoreNotifications()
38 }
39
40 loadMoreNotifications () {
41 this.userNotificationService.listMyNotifications(this.componentPagination, undefined, this.ignoreLoadingBar)
42 .subscribe(
43 result => {
44 this.notifications = this.notifications.concat(result.data)
45 this.componentPagination.totalItems = result.total
46 },
47
48 err => this.notifier.error(err.message)
49 )
50 }
51
52 onNearOfBottom () {
53 if (this.infiniteScroll === false) return
54
55 this.componentPagination.currentPage++
56
57 if (hasMoreItems(this.componentPagination)) {
58 this.loadMoreNotifications()
59 }
60 }
61
62 markAsRead (notification: UserNotification) {
63 if (notification.read) return
64
65 this.userNotificationService.markAsRead(notification)
66 .subscribe(
67 () => {
68 notification.read = true
69 },
70
71 err => this.notifier.error(err.message)
72 )
73 }
74
75 markAllAsRead () {
76 this.userNotificationService.markAllAsRead()
77 .subscribe(
78 () => {
79 for (const notification of this.notifications) {
80 notification.read = true
81 }
82 },
83
84 err => this.notifier.error(err.message)
85 )
86 }
87}
diff --git a/client/src/app/shared/users/user.model.ts b/client/src/app/shared/users/user.model.ts
index 877f1bf3a..c15f1de8c 100644
--- a/client/src/app/shared/users/user.model.ts
+++ b/client/src/app/shared/users/user.model.ts
@@ -1,38 +1,20 @@
1import { 1import { hasUserRight, User as UserServerModel, UserNotificationSetting, UserRight, UserRole, VideoChannel } from '../../../../../shared'
2 Account as AccountServerModel,
3 hasUserRight,
4 User as UserServerModel,
5 UserRight,
6 UserRole,
7 VideoChannel
8} from '../../../../../shared'
9import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type' 2import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
10import { Account } from '@app/shared/account/account.model' 3import { Account } from '@app/shared/account/account.model'
11import { Avatar } from '../../../../../shared/models/avatars/avatar.model' 4import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
12 5
13export type UserConstructorHash = {
14 id: number,
15 username: string,
16 email: string,
17 role: UserRole,
18 videoQuota?: number,
19 videoQuotaDaily?: number,
20 nsfwPolicy?: NSFWPolicyType,
21 autoPlayVideo?: boolean,
22 createdAt?: Date,
23 account?: AccountServerModel,
24 videoChannels?: VideoChannel[]
25
26 blocked?: boolean
27 blockedReason?: string
28}
29export class User implements UserServerModel { 6export class User implements UserServerModel {
30 id: number 7 id: number
31 username: string 8 username: string
32 email: string 9 email: string
10 emailVerified: boolean
33 role: UserRole 11 role: UserRole
34 nsfwPolicy: NSFWPolicyType 12 nsfwPolicy: NSFWPolicyType
13
14 webTorrentEnabled: boolean
35 autoPlayVideo: boolean 15 autoPlayVideo: boolean
16 videosHistoryEnabled: boolean
17
36 videoQuota: number 18 videoQuota: number
37 videoQuotaDaily: number 19 videoQuotaDaily: number
38 account: Account 20 account: Account
@@ -42,7 +24,9 @@ export class User implements UserServerModel {
42 blocked: boolean 24 blocked: boolean
43 blockedReason?: string 25 blockedReason?: string
44 26
45 constructor (hash: UserConstructorHash) { 27 notificationSettings?: UserNotificationSetting
28
29 constructor (hash: Partial<UserServerModel>) {
46 this.id = hash.id 30 this.id = hash.id
47 this.username = hash.username 31 this.username = hash.username
48 this.email = hash.email 32 this.email = hash.email
@@ -52,11 +36,15 @@ export class User implements UserServerModel {
52 this.videoQuota = hash.videoQuota 36 this.videoQuota = hash.videoQuota
53 this.videoQuotaDaily = hash.videoQuotaDaily 37 this.videoQuotaDaily = hash.videoQuotaDaily
54 this.nsfwPolicy = hash.nsfwPolicy 38 this.nsfwPolicy = hash.nsfwPolicy
39 this.webTorrentEnabled = hash.webTorrentEnabled
40 this.videosHistoryEnabled = hash.videosHistoryEnabled
55 this.autoPlayVideo = hash.autoPlayVideo 41 this.autoPlayVideo = hash.autoPlayVideo
56 this.createdAt = hash.createdAt 42 this.createdAt = hash.createdAt
57 this.blocked = hash.blocked 43 this.blocked = hash.blocked
58 this.blockedReason = hash.blockedReason 44 this.blockedReason = hash.blockedReason
59 45
46 this.notificationSettings = hash.notificationSettings
47
60 if (hash.account !== undefined) { 48 if (hash.account !== undefined) {
61 this.account = new Account(hash.account) 49 this.account = new Account(hash.account)
62 } 50 }
diff --git a/client/src/app/shared/users/user.service.ts b/client/src/app/shared/users/user.service.ts
index d9b81c181..cc5c051f1 100644
--- a/client/src/app/shared/users/user.service.ts
+++ b/client/src/app/shared/users/user.service.ts
@@ -1,5 +1,5 @@
1import { Observable } from 'rxjs' 1import { from, Observable } from 'rxjs'
2import { catchError, map } from 'rxjs/operators' 2import { catchError, concatMap, map, toArray } from 'rxjs/operators'
3import { HttpClient, HttpParams } from '@angular/common/http' 3import { HttpClient, HttpParams } from '@angular/common/http'
4import { Injectable } from '@angular/core' 4import { Injectable } from '@angular/core'
5import { ResultList, User, UserCreate, UserRole, UserUpdate, UserUpdateMe, UserVideoQuota } from '../../../../../shared' 5import { ResultList, User, UserCreate, UserRole, UserUpdate, UserUpdateMe, UserVideoQuota } from '../../../../../shared'
@@ -153,15 +153,26 @@ export class UserService {
153 ) 153 )
154 } 154 }
155 155
156 updateUsers (users: User[], userUpdate: UserUpdate) {
157 return from(users)
158 .pipe(
159 concatMap(u => this.authHttp.put(UserService.BASE_USERS_URL + u.id, userUpdate)),
160 toArray(),
161 catchError(err => this.restExtractor.handleError(err))
162 )
163 }
164
156 getUser (userId: number) { 165 getUser (userId: number) {
157 return this.authHttp.get<User>(UserService.BASE_USERS_URL + userId) 166 return this.authHttp.get<User>(UserService.BASE_USERS_URL + userId)
158 .pipe(catchError(err => this.restExtractor.handleError(err))) 167 .pipe(catchError(err => this.restExtractor.handleError(err)))
159 } 168 }
160 169
161 getUsers (pagination: RestPagination, sort: SortMeta): Observable<ResultList<User>> { 170 getUsers (pagination: RestPagination, sort: SortMeta, search?: string): Observable<ResultList<User>> {
162 let params = new HttpParams() 171 let params = new HttpParams()
163 params = this.restService.addRestGetParams(params, pagination, sort) 172 params = this.restService.addRestGetParams(params, pagination, sort)
164 173
174 if (search) params = params.append('search', search)
175
165 return this.authHttp.get<ResultList<User>>(UserService.BASE_USERS_URL, { params }) 176 return this.authHttp.get<ResultList<User>>(UserService.BASE_USERS_URL, { params })
166 .pipe( 177 .pipe(
167 map(res => this.restExtractor.convertResultListDateToHuman(res)), 178 map(res => this.restExtractor.convertResultListDateToHuman(res)),
@@ -170,21 +181,38 @@ export class UserService {
170 ) 181 )
171 } 182 }
172 183
173 removeUser (user: { id: number }) { 184 removeUser (usersArg: User | User[]) {
174 return this.authHttp.delete(UserService.BASE_USERS_URL + user.id) 185 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
175 .pipe(catchError(err => this.restExtractor.handleError(err))) 186
187 return from(users)
188 .pipe(
189 concatMap(u => this.authHttp.delete(UserService.BASE_USERS_URL + u.id)),
190 toArray(),
191 catchError(err => this.restExtractor.handleError(err))
192 )
176 } 193 }
177 194
178 banUser (user: { id: number }, reason?: string) { 195 banUsers (usersArg: User | User[], reason?: string) {
179 const body = reason ? { reason } : {} 196 const body = reason ? { reason } : {}
197 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
180 198
181 return this.authHttp.post(UserService.BASE_USERS_URL + user.id + '/block', body) 199 return from(users)
182 .pipe(catchError(err => this.restExtractor.handleError(err))) 200 .pipe(
201 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/block', body)),
202 toArray(),
203 catchError(err => this.restExtractor.handleError(err))
204 )
183 } 205 }
184 206
185 unbanUser (user: { id: number }) { 207 unbanUsers (usersArg: User | User[]) {
186 return this.authHttp.post(UserService.BASE_USERS_URL + user.id + '/unblock', {}) 208 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
187 .pipe(catchError(err => this.restExtractor.handleError(err))) 209
210 return from(users)
211 .pipe(
212 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/unblock', {})),
213 toArray(),
214 catchError(err => this.restExtractor.handleError(err))
215 )
188 } 216 }
189 217
190 private formatUser (user: User) { 218 private formatUser (user: User) {
diff --git a/client/src/app/shared/video-abuse/video-abuse.service.ts b/client/src/app/shared/video-abuse/video-abuse.service.ts
index 61b7e1b98..b0b59ea0c 100644
--- a/client/src/app/shared/video-abuse/video-abuse.service.ts
+++ b/client/src/app/shared/video-abuse/video-abuse.service.ts
@@ -32,9 +32,7 @@ export class VideoAbuseService {
32 32
33 reportVideo (id: number, reason: string) { 33 reportVideo (id: number, reason: string) {
34 const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse' 34 const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse'
35 const body = { 35 const body = { reason }
36 reason
37 }
38 36
39 return this.authHttp.post(url, body) 37 return this.authHttp.post(url, body)
40 .pipe( 38 .pipe(
diff --git a/client/src/app/shared/video-blacklist/video-blacklist.service.ts b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
index 7d39fd4f2..94e46d7c2 100644
--- a/client/src/app/shared/video-blacklist/video-blacklist.service.ts
+++ b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
@@ -36,8 +36,11 @@ export class VideoBlacklistService {
36 ) 36 )
37 } 37 }
38 38
39 blacklistVideo (videoId: number, reason?: string) { 39 blacklistVideo (videoId: number, reason: string, unfederate: boolean) {
40 const body = reason ? { reason } : {} 40 const body = {
41 unfederate,
42 reason
43 }
41 44
42 return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body) 45 return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body)
43 .pipe( 46 .pipe(
diff --git a/client/src/app/shared/video/abstract-video-list.html b/client/src/app/shared/video/abstract-video-list.html
index d543ab7c1..1f97bc389 100644
--- a/client/src/app/shared/video/abstract-video-list.html
+++ b/client/src/app/shared/video/abstract-video-list.html
@@ -1,8 +1,21 @@
1<div [ngClass]="{ 'margin-content': marginContent }"> 1<div [ngClass]="{ 'margin-content': marginContent }">
2 <div *ngIf="titlePage" class="title-page title-page-single"> 2 <div class="videos-header">
3 {{ titlePage }} 3 <div *ngIf="titlePage" class="title-page title-page-single">
4 <div placement="bottom" [ngbTooltip]="titleTooltip" container="body">
5 {{ titlePage }}
6 </div>
7 </div>
8
9 <my-feed [syndicationItems]="syndicationItems"></my-feed>
10
11 <div class="moderation-block" *ngIf="displayModerationBlock">
12 <my-peertube-checkbox
13 (change)="toggleModerationDisplay()"
14 inputName="display-unlisted-private" i18n-labelText labelText="Display unlisted and private videos"
15 >
16 </my-peertube-checkbox>
17 </div>
4 </div> 18 </div>
5 <my-video-feed [syndicationItems]="syndicationItems"></my-video-feed>
6 19
7 <div class="no-results" i18n *ngIf="pagination.totalItems === 0">No results.</div> 20 <div class="no-results" i18n *ngIf="pagination.totalItems === 0">No results.</div>
8 <div 21 <div
diff --git a/client/src/app/shared/video/abstract-video-list.scss b/client/src/app/shared/video/abstract-video-list.scss
index 3f9c73a29..292ede698 100644
--- a/client/src/app/shared/video/abstract-video-list.scss
+++ b/client/src/app/shared/video/abstract-video-list.scss
@@ -8,12 +8,27 @@
8 } 8 }
9} 9}
10 10
11.title-page.title-page-single { 11.videos-header {
12 margin-right: 5px; 12 display: flex;
13} 13 height: 80px;
14 align-items: center;
15
16 .title-page.title-page-single {
17 margin: 0 5px 0 0;
18 }
14 19
15my-video-feed { 20 my-feed {
16 display: inline-block; 21 display: inline-block;
22 top: 1px;
23 min-width: 60px;
24 }
25
26 .moderation-block {
27 display: flex;
28 flex-grow: 1;
29 justify-content: flex-end;
30 align-items: center;
31 }
17} 32}
18 33
19@media screen and (max-width: 500px) { 34@media screen and (max-width: 500px) {
diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts
index 763791165..b0633be4a 100644
--- a/client/src/app/shared/video/abstract-video-list.ts
+++ b/client/src/app/shared/video/abstract-video-list.ts
@@ -3,7 +3,6 @@ import { ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'
3import { ActivatedRoute, Router } from '@angular/router' 3import { ActivatedRoute, Router } from '@angular/router'
4import { Location } from '@angular/common' 4import { Location } from '@angular/common'
5import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive' 5import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive'
6import { NotificationsService } from 'angular2-notifications'
7import { fromEvent, Observable, Subscription } from 'rxjs' 6import { fromEvent, Observable, Subscription } from 'rxjs'
8import { AuthService } from '../../core/auth' 7import { AuthService } from '../../core/auth'
9import { ComponentPagination } from '../rest/component-pagination.model' 8import { ComponentPagination } from '../rest/component-pagination.model'
@@ -12,6 +11,8 @@ import { Video } from './video.model'
12import { I18n } from '@ngx-translate/i18n-polyfill' 11import { I18n } from '@ngx-translate/i18n-polyfill'
13import { ScreenService } from '@app/shared/misc/screen.service' 12import { ScreenService } from '@app/shared/misc/screen.service'
14import { OwnerDisplayType } from '@app/shared/video/video-miniature.component' 13import { OwnerDisplayType } from '@app/shared/video/video-miniature.component'
14import { Syndication } from '@app/shared/video/syndication.model'
15import { Notifier } from '@app/core'
15 16
16export abstract class AbstractVideoList implements OnInit, OnDestroy { 17export abstract class AbstractVideoList implements OnInit, OnDestroy {
17 private static LINES_PER_PAGE = 4 18 private static LINES_PER_PAGE = 4
@@ -27,7 +28,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
27 sort: VideoSortField = '-publishedAt' 28 sort: VideoSortField = '-publishedAt'
28 categoryOneOf?: number 29 categoryOneOf?: number
29 defaultSort: VideoSortField = '-publishedAt' 30 defaultSort: VideoSortField = '-publishedAt'
30 syndicationItems = [] 31 syndicationItems: Syndication[] = []
31 32
32 loadOnInit = true 33 loadOnInit = true
33 marginContent = true 34 marginContent = true
@@ -37,11 +38,13 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
37 videoPages: Video[][] = [] 38 videoPages: Video[][] = []
38 ownerDisplayType: OwnerDisplayType = 'account' 39 ownerDisplayType: OwnerDisplayType = 'account'
39 firstLoadedPage: number 40 firstLoadedPage: number
41 displayModerationBlock = false
42 titleTooltip: string
40 43
41 protected baseVideoWidth = 215 44 protected baseVideoWidth = 215
42 protected baseVideoHeight = 205 45 protected baseVideoHeight = 205
43 46
44 protected abstract notificationsService: NotificationsService 47 protected abstract notifier: Notifier
45 protected abstract authService: AuthService 48 protected abstract authService: AuthService
46 protected abstract router: Router 49 protected abstract router: Router
47 protected abstract route: ActivatedRoute 50 protected abstract route: ActivatedRoute
@@ -58,7 +61,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
58 private resizeSubscription: Subscription 61 private resizeSubscription: Subscription
59 62
60 abstract getVideosObservable (page: number): Observable<{ videos: Video[], totalVideos: number}> 63 abstract getVideosObservable (page: number): Observable<{ videos: Video[], totalVideos: number}>
61 abstract generateSyndicationList () 64 abstract generateSyndicationList (): void
62 65
63 get user () { 66 get user () {
64 return this.authService.getUser() 67 return this.authService.getUser()
@@ -155,11 +158,15 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
155 }, 158 },
156 error => { 159 error => {
157 this.loadingPage[page] = false 160 this.loadingPage[page] = false
158 this.notificationsService.error(this.i18n('Error'), error.message) 161 this.notifier.error(error.message)
159 } 162 }
160 ) 163 )
161 } 164 }
162 165
166 toggleModerationDisplay () {
167 throw new Error('toggleModerationDisplay is not implemented')
168 }
169
163 protected hasMoreVideos () { 170 protected hasMoreVideos () {
164 // No results 171 // No results
165 if (this.pagination.totalItems === 0) return false 172 if (this.pagination.totalItems === 0) return false
@@ -206,7 +213,9 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
206 protected setNewRouteParams () { 213 protected setNewRouteParams () {
207 const paramsObject = this.buildRouteParams() 214 const paramsObject = this.buildRouteParams()
208 215
209 const queryParams = Object.keys(paramsObject).map(p => p + '=' + paramsObject[p]).join('&') 216 const queryParams = Object.keys(paramsObject)
217 .map(p => p + '=' + paramsObject[p])
218 .join('&')
210 this.location.replaceState(this.currentRoute, queryParams) 219 this.location.replaceState(this.currentRoute, queryParams)
211 } 220 }
212 221
diff --git a/client/src/app/shared/video/video-feed.component.html b/client/src/app/shared/video/feed.component.html
index 16116ba88..f7624ec01 100644
--- a/client/src/app/shared/video/video-feed.component.html
+++ b/client/src/app/shared/video/feed.component.html
@@ -1,10 +1,11 @@
1<div class="video-feed"> 1<div class="video-feed">
2 <span 2 <my-global-icon
3 *ngIf="syndicationItems.length !== 0" [ngbPopover]="feedsList" [autoClose]="true" placement="bottom" 3 *ngIf="syndicationItems.length !== 0" [ngbPopover]="feedsList" [autoClose]="true" placement="bottom"
4 class="icon icon-syndication" role="button" 4 class="icon-syndication" role="button" iconName="syndication"
5 ></span> 5 >
6 </my-global-icon>
6 7
7 <ng-template #feedsList> 8 <ng-template #feedsList>
8 <a *ngFor="let item of syndicationItems" [href]="item.url" target="_blank" rel="noopener noreferrer">{{ item.label }}</a> 9 <a *ngFor="let item of syndicationItems" [href]="item.url" target="_blank" rel="noopener noreferrer">{{ item.label }}</a>
9 </ng-template> 10 </ng-template>
10</div> \ No newline at end of file 11</div>
diff --git a/client/src/app/shared/video/feed.component.scss b/client/src/app/shared/video/feed.component.scss
new file mode 100644
index 000000000..ed1dc17d3
--- /dev/null
+++ b/client/src/app/shared/video/feed.component.scss
@@ -0,0 +1,18 @@
1@import '_variables';
2@import '_mixins';
3
4.video-feed {
5 a {
6 color: black;
7 display: block;
8 }
9
10 my-global-icon {
11 cursor: pointer;
12 width: 12px;
13 position: relative;
14 top: -2px;
15
16 @include apply-svg-color(var(--mainForegroundColor))
17 }
18}
diff --git a/client/src/app/shared/video/feed.component.ts b/client/src/app/shared/video/feed.component.ts
new file mode 100644
index 000000000..12507458f
--- /dev/null
+++ b/client/src/app/shared/video/feed.component.ts
@@ -0,0 +1,11 @@
1import { Component, Input } from '@angular/core'
2import { Syndication } from '@app/shared/video/syndication.model'
3
4@Component({
5 selector: 'my-feed',
6 styleUrls: [ './feed.component.scss' ],
7 templateUrl: './feed.component.html'
8})
9export class FeedComponent {
10 @Input() syndicationItems: Syndication[]
11}
diff --git a/client/src/app/shared/video/syndication.model.ts b/client/src/app/shared/video/syndication.model.ts
new file mode 100644
index 000000000..c59ab01e8
--- /dev/null
+++ b/client/src/app/shared/video/syndication.model.ts
@@ -0,0 +1,7 @@
1import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum'
2
3export interface Syndication {
4 format: FeedFormat,
5 label: string,
6 url: string
7}
diff --git a/client/src/app/shared/video/video-details.model.ts b/client/src/app/shared/video/video-details.model.ts
index 5ff3926c4..388357343 100644
--- a/client/src/app/shared/video/video-details.model.ts
+++ b/client/src/app/shared/video/video-details.model.ts
@@ -3,6 +3,8 @@ import { AuthUser } from '../../core'
3import { Video } from '../../shared/video/video.model' 3import { Video } from '../../shared/video/video.model'
4import { Account } from '@app/shared/account/account.model' 4import { Account } from '@app/shared/account/account.model'
5import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 5import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
6import { VideoStreamingPlaylist } from '../../../../../shared/models/videos/video-streaming-playlist.model'
7import { VideoStreamingPlaylistType } from '../../../../../shared/models/videos/video-streaming-playlist.type'
6 8
7export class VideoDetails extends Video implements VideoDetailsServerModel { 9export class VideoDetails extends Video implements VideoDetailsServerModel {
8 descriptionPath: string 10 descriptionPath: string
@@ -20,6 +22,10 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
20 likesPercent: number 22 likesPercent: number
21 dislikesPercent: number 23 dislikesPercent: number
22 24
25 trackerUrls: string[]
26
27 streamingPlaylists: VideoStreamingPlaylist[]
28
23 constructor (hash: VideoDetailsServerModel, translations = {}) { 29 constructor (hash: VideoDetailsServerModel, translations = {}) {
24 super(hash, translations) 30 super(hash, translations)
25 31
@@ -32,6 +38,9 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
32 this.commentsEnabled = hash.commentsEnabled 38 this.commentsEnabled = hash.commentsEnabled
33 this.downloadEnabled = hash.downloadEnabled 39 this.downloadEnabled = hash.downloadEnabled
34 40
41 this.trackerUrls = hash.trackerUrls
42 this.streamingPlaylists = hash.streamingPlaylists
43
35 this.buildLikeAndDislikePercents() 44 this.buildLikeAndDislikePercents()
36 } 45 }
37 46
@@ -55,4 +64,8 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
55 this.likesPercent = (this.likes / (this.likes + this.dislikes)) * 100 64 this.likesPercent = (this.likes / (this.likes + this.dislikes)) * 100
56 this.dislikesPercent = (this.dislikes / (this.likes + this.dislikes)) * 100 65 this.dislikesPercent = (this.dislikes / (this.likes + this.dislikes)) * 100
57 } 66 }
67
68 getHlsPlaylist () {
69 return this.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
70 }
58} 71}
diff --git a/client/src/app/shared/video/video-edit.model.ts b/client/src/app/shared/video/video-edit.model.ts
index 5bb0510f9..18c62a1f9 100644
--- a/client/src/app/shared/video/video-edit.model.ts
+++ b/client/src/app/shared/video/video-edit.model.ts
@@ -59,14 +59,14 @@ export class VideoEdit implements VideoUpdate {
59 } 59 }
60 } 60 }
61 61
62 patch (values: Object) { 62 patch (values: { [ id: string ]: string }) {
63 Object.keys(values).forEach((key) => { 63 Object.keys(values).forEach((key) => {
64 this[ key ] = values[ key ] 64 this[ key ] = values[ key ]
65 }) 65 })
66 66
67 // If schedule publication, the video is private and will be changed to public privacy 67 // If schedule publication, the video is private and will be changed to public privacy
68 if (parseInt(values['privacy'], 10) === VideoEdit.SPECIAL_SCHEDULED_PRIVACY) { 68 if (parseInt(values['privacy'], 10) === VideoEdit.SPECIAL_SCHEDULED_PRIVACY) {
69 const updateAt = (values['schedulePublicationAt'] as Date) 69 const updateAt = new Date(values['schedulePublicationAt'])
70 updateAt.setSeconds(0) 70 updateAt.setSeconds(0)
71 71
72 this.privacy = VideoPrivacy.PRIVATE 72 this.privacy = VideoPrivacy.PRIVATE
diff --git a/client/src/app/shared/video/video-feed.component.scss b/client/src/app/shared/video/video-feed.component.scss
deleted file mode 100644
index 385764be0..000000000
--- a/client/src/app/shared/video/video-feed.component.scss
+++ /dev/null
@@ -1,19 +0,0 @@
1@import '_mixins';
2
3.video-feed {
4 a {
5 color: black;
6 display: block;
7 }
8
9 .icon {
10 @include icon(12px);
11
12 &.icon-syndication {
13 position: relative;
14 top: -2px;
15 background-color: var(--mainForegroundColor);
16 mask-image: url('../../../assets/images/global/syndication.svg');
17 }
18 }
19} \ No newline at end of file
diff --git a/client/src/app/shared/video/video-feed.component.ts b/client/src/app/shared/video/video-feed.component.ts
deleted file mode 100644
index 6922153c0..000000000
--- a/client/src/app/shared/video/video-feed.component.ts
+++ /dev/null
@@ -1,10 +0,0 @@
1import { Component, Input } from '@angular/core'
2
3@Component({
4 selector: 'my-video-feed',
5 styleUrls: [ './video-feed.component.scss' ],
6 templateUrl: './video-feed.component.html'
7})
8export class VideoFeedComponent {
9 @Input() syndicationItems
10}
diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html
index cfc483018..2c635fa2f 100644
--- a/client/src/app/shared/video/video-miniature.component.html
+++ b/client/src/app/shared/video/video-miniature.component.html
@@ -7,6 +7,9 @@
7 class="video-miniature-name" 7 class="video-miniature-name"
8 [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }" 8 [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }"
9 > 9 >
10 <span *ngIf="isUnlistedVideo()" class="badge badge-warning" i18n>Unlisted</span>
11 <span *ngIf="isPrivateVideo()" class="badge badge-danger" i18n>Private</span>
12
10 {{ video.name }} 13 {{ video.name }}
11 </a> 14 </a>
12 15
diff --git a/client/src/app/shared/video/video-miniature.component.scss b/client/src/app/shared/video/video-miniature.component.scss
index 895879adc..f44bdf9a9 100644
--- a/client/src/app/shared/video/video-miniature.component.scss
+++ b/client/src/app/shared/video/video-miniature.component.scss
@@ -50,10 +50,10 @@
50 text-overflow: ellipsis; 50 text-overflow: ellipsis;
51 white-space: nowrap; 51 white-space: nowrap;
52 font-size: 13px; 52 font-size: 13px;
53 color: #585858; 53 color: $grey-foreground-color;
54 54
55 &:hover { 55 &:hover {
56 color: #303030; 56 color: $grey-foreground-hover-color;
57 } 57 }
58 } 58 }
59 } 59 }
diff --git a/client/src/app/shared/video/video-miniature.component.ts b/client/src/app/shared/video/video-miniature.component.ts
index 7e8692b0b..2f951a1f1 100644
--- a/client/src/app/shared/video/video-miniature.component.ts
+++ b/client/src/app/shared/video/video-miniature.component.ts
@@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core
2import { User } from '../users' 2import { User } from '../users'
3import { Video } from './video.model' 3import { Video } from './video.model'
4import { ServerService } from '@app/core' 4import { ServerService } from '@app/core'
5import { VideoPrivacy } from '../../../../../shared'
5 6
6export type OwnerDisplayType = 'account' | 'videoChannel' | 'auto' 7export type OwnerDisplayType = 'account' | 'videoChannel' | 'auto'
7 8
@@ -49,4 +50,12 @@ export class VideoMiniatureComponent implements OnInit {
49 displayOwnerVideoChannel () { 50 displayOwnerVideoChannel () {
50 return this.ownerDisplayTypeChosen === 'videoChannel' 51 return this.ownerDisplayTypeChosen === 'videoChannel'
51 } 52 }
53
54 isUnlistedVideo () {
55 return this.video.privacy.id === VideoPrivacy.UNLISTED
56 }
57
58 isPrivateVideo () {
59 return this.video.privacy.id === VideoPrivacy.PRIVATE
60 }
52} 61}
diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts
index b92c96450..6ea83d13b 100644
--- a/client/src/app/shared/video/video.model.ts
+++ b/client/src/app/shared/video/video.model.ts
@@ -53,7 +53,7 @@ export class Video implements VideoServerModel {
53 displayName: string 53 displayName: string
54 url: string 54 url: string
55 host: string 55 host: string
56 avatar: Avatar 56 avatar?: Avatar
57 } 57 }
58 58
59 channel: { 59 channel: {
@@ -63,7 +63,7 @@ export class Video implements VideoServerModel {
63 displayName: string 63 displayName: string
64 url: string 64 url: string
65 host: string 65 host: string
66 avatar: Avatar 66 avatar?: Avatar
67 } 67 }
68 68
69 userHistory?: { 69 userHistory?: {
diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts
index c9d6da7a4..565aad93b 100644
--- a/client/src/app/shared/video/video.service.ts
+++ b/client/src/app/shared/video/video.service.ts
@@ -6,11 +6,11 @@ import { Video as VideoServerModel, VideoDetails as VideoDetailsServerModel } fr
6import { ResultList } from '../../../../../shared/models/result-list.model' 6import { ResultList } from '../../../../../shared/models/result-list.model'
7import { 7import {
8 UserVideoRate, 8 UserVideoRate,
9 UserVideoRateType,
9 UserVideoRateUpdate, 10 UserVideoRateUpdate,
10 VideoConstant, 11 VideoConstant,
11 VideoFilter, 12 VideoFilter,
12 VideoPrivacy, 13 VideoPrivacy,
13 VideoRateType,
14 VideoUpdate 14 VideoUpdate
15} from '../../../../../shared/models/videos' 15} from '../../../../../shared/models/videos'
16import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum' 16import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum'
@@ -275,9 +275,9 @@ export class VideoService implements VideosProvider {
275 275
276 loadCompleteDescription (descriptionPath: string) { 276 loadCompleteDescription (descriptionPath: string) {
277 return this.authHttp 277 return this.authHttp
278 .get(environment.apiUrl + descriptionPath) 278 .get<{ description: string }>(environment.apiUrl + descriptionPath)
279 .pipe( 279 .pipe(
280 map(res => res[ 'description' ]), 280 map(res => res.description),
281 catchError(err => this.restExtractor.handleError(err)) 281 catchError(err => this.restExtractor.handleError(err))
282 ) 282 )
283 } 283 }
@@ -333,7 +333,7 @@ export class VideoService implements VideosProvider {
333 return privacies 333 return privacies
334 } 334 }
335 335
336 private setVideoRate (id: number, rateType: VideoRateType) { 336 private setVideoRate (id: number, rateType: UserVideoRateType) {
337 const url = VideoService.BASE_VIDEO_URL + id + '/rate' 337 const url = VideoService.BASE_VIDEO_URL + id + '/rate'
338 const body: UserVideoRateUpdate = { 338 const body: UserVideoRateUpdate = {
339 rating: rateType 339 rating: rateType
diff --git a/client/src/app/signup/signup.component.html b/client/src/app/signup/signup.component.html
index aad4b5be3..07d24b381 100644
--- a/client/src/app/signup/signup.component.html
+++ b/client/src/app/signup/signup.component.html
@@ -4,6 +4,7 @@
4 Create an account 4 Create an account
5 </div> 5 </div>
6 6
7 <div *ngIf="info" class="alert alert-info">{{ info }}</div>
7 <div *ngIf="error" class="alert alert-danger">{{ error }}</div> 8 <div *ngIf="error" class="alert alert-danger">{{ error }}</div>
8 9
9 <div class="d-flex justify-content-left flex-wrap"> 10 <div class="d-flex justify-content-left flex-wrap">
@@ -51,7 +52,7 @@
51 <div class="form-group form-group-terms"> 52 <div class="form-group form-group-terms">
52 <my-peertube-checkbox 53 <my-peertube-checkbox
53 inputName="terms" formControlName="terms" 54 inputName="terms" formControlName="terms"
54 i18n-labelHtml labelHtml="I have read and agree to the <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Terms</a> of this instance" 55 i18n-labelHtml labelHtml="I am at least 16 years old and agree to the <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Terms</a> of this instance"
55 ></my-peertube-checkbox> 56 ></my-peertube-checkbox>
56 57
57 <div *ngIf="formErrors.terms" class="form-error"> 58 <div *ngIf="formErrors.terms" class="form-error">
@@ -59,11 +60,11 @@
59 </div> 60 </div>
60 </div> 61 </div>
61 62
62 <input type="submit" i18n-value value="Signup" [disabled]="!form.valid"> 63 <input type="submit" i18n-value value="Signup" [disabled]="!form.valid || signupDone">
63 </form> 64 </form>
64 65
65 <div> 66 <div>
66 <label for="email" i18n>Features found on this instance</label> 67 <label i18n>Features found on this instance</label>
67 <my-instance-features-table></my-instance-features-table> 68 <my-instance-features-table></my-instance-features-table>
68 </div> 69 </div>
69 </div> 70 </div>
diff --git a/client/src/app/signup/signup.component.ts b/client/src/app/signup/signup.component.ts
index cf2657b85..13941ec79 100644
--- a/client/src/app/signup/signup.component.ts
+++ b/client/src/app/signup/signup.component.ts
@@ -1,8 +1,7 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { AuthService, Notifier, RedirectService, ServerService } from '@app/core'
3import { UserCreate } from '../../../../shared' 3import { UserCreate } from '../../../../shared'
4import { FormReactive, UserService, UserValidatorsService } from '../shared' 4import { FormReactive, UserService, UserValidatorsService } from '../shared'
5import { RedirectService, ServerService } from '@app/core'
6import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
7import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 6import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
8 7
@@ -12,12 +11,15 @@ import { FormValidatorService } from '@app/shared/forms/form-validators/form-val
12 styleUrls: [ './signup.component.scss' ] 11 styleUrls: [ './signup.component.scss' ]
13}) 12})
14export class SignupComponent extends FormReactive implements OnInit { 13export class SignupComponent extends FormReactive implements OnInit {
14 info: string = null
15 error: string = null 15 error: string = null
16 signupDone = false
16 17
17 constructor ( 18 constructor (
18 protected formValidatorService: FormValidatorService, 19 protected formValidatorService: FormValidatorService,
20 private authService: AuthService,
19 private userValidatorsService: UserValidatorsService, 21 private userValidatorsService: UserValidatorsService,
20 private notificationsService: NotificationsService, 22 private notifier: Notifier,
21 private userService: UserService, 23 private userService: UserService,
22 private serverService: ServerService, 24 private serverService: ServerService,
23 private redirectService: RedirectService, 25 private redirectService: RedirectService,
@@ -50,18 +52,24 @@ export class SignupComponent extends FormReactive implements OnInit {
50 52
51 this.userService.signup(userCreate).subscribe( 53 this.userService.signup(userCreate).subscribe(
52 () => { 54 () => {
55 this.signupDone = true
56
53 if (this.requiresEmailVerification) { 57 if (this.requiresEmailVerification) {
54 this.notificationsService.alert( 58 this.info = this.i18n('Welcome! Now please check your emails to verify your account and complete signup.')
55 this.i18n('Welcome'), 59 return
56 this.i18n('Please check your email to verify your account and complete signup.')
57 )
58 } else {
59 this.notificationsService.success(
60 this.i18n('Success'),
61 this.i18n('Registration for {{username}} complete.', { username: userCreate.username })
62 )
63 } 60 }
64 this.redirectService.redirectToHomepage() 61
62 // Auto login
63 this.authService.login(userCreate.username, userCreate.password)
64 .subscribe(
65 () => {
66 this.notifier.success(this.i18n('You are now logged in as {{username}}!', { username: userCreate.username }))
67
68 this.redirectService.redirectToHomepage()
69 },
70
71 err => this.error = err.message
72 )
65 }, 73 },
66 74
67 err => this.error = err.message 75 err => this.error = err.message
diff --git a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
index 30aefdbfc..19043eee6 100644
--- a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
+++ b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
@@ -3,7 +3,7 @@
3 3
4 <div class="modal-header"> 4 <div class="modal-header">
5 <h4 i18n class="modal-title">Add caption</h4> 5 <h4 i18n class="modal-title">Add caption</h4>
6 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 6 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
7 </div> 7 </div>
8 8
9 <div class="modal-body"> 9 <div class="modal-body">
diff --git a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.ts b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.ts
index 07c33030a..1413e7262 100644
--- a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.ts
+++ b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.ts
@@ -5,6 +5,7 @@ import { VideoCaptionsValidatorsService } from '@app/shared/forms/form-validator
5import { ServerService } from '@app/core' 5import { ServerService } from '@app/core'
6import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model' 6import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model'
7import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' 7import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'
8import { VideoConstant } from '../../../../../../shared'
8 9
9@Component({ 10@Component({
10 selector: 'my-video-caption-add-modal', 11 selector: 'my-video-caption-add-modal',
@@ -19,7 +20,7 @@ export class VideoCaptionAddModalComponent extends FormReactive implements OnIni
19 20
20 @ViewChild('modal') modal: ElementRef 21 @ViewChild('modal') modal: ElementRef
21 22
22 videoCaptionLanguages = [] 23 videoCaptionLanguages: VideoConstant<string>[] = []
23 24
24 private openedModal: NgbModalRef 25 private openedModal: NgbModalRef
25 private closingModal = false 26 private closingModal = false
@@ -59,6 +60,7 @@ export class VideoCaptionAddModalComponent extends FormReactive implements OnIni
59 hide () { 60 hide () {
60 this.closingModal = true 61 this.closingModal = true
61 this.openedModal.close() 62 this.openedModal.close()
63 this.form.reset()
62 } 64 }
63 65
64 isReplacingExistingCaption () { 66 isReplacingExistingCaption () {
@@ -70,8 +72,6 @@ export class VideoCaptionAddModalComponent extends FormReactive implements OnIni
70 } 72 }
71 73
72 async addCaption () { 74 async addCaption () {
73 this.hide()
74
75 const languageId = this.form.value[ 'language' ] 75 const languageId = this.form.value[ 'language' ]
76 const languageObject = this.videoCaptionLanguages.find(l => l.id === languageId) 76 const languageObject = this.videoCaptionLanguages.find(l => l.id === languageId)
77 77
@@ -80,6 +80,6 @@ export class VideoCaptionAddModalComponent extends FormReactive implements OnIni
80 captionfile: this.form.value[ 'captionfile' ] 80 captionfile: this.form.value[ 'captionfile' ]
81 }) 81 })
82 82
83 this.form.reset() 83 this.hide()
84 } 84 }
85} 85}
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.html b/client/src/app/videos/+video-edit/shared/video-edit.component.html
index 8c74a1ca6..7fd9af208 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.html
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.html
@@ -127,10 +127,11 @@
127 127
128 <my-peertube-checkbox 128 <my-peertube-checkbox
129 inputName="downloadEnabled" formControlName="downloadEnabled" 129 inputName="downloadEnabled" formControlName="downloadEnabled"
130 i18n-labelText labelText="Disable downloading" 130 i18n-labelText labelText="Download enabled"
131 ></my-peertube-checkbox> 131 ></my-peertube-checkbox>
132 132
133 <my-peertube-checkbox 133 <my-peertube-checkbox
134 *ngIf="waitTranscodingEnabled"
134 inputName="waitTranscoding" formControlName="waitTranscoding" 135 inputName="waitTranscoding" formControlName="waitTranscoding"
135 i18n-labelText labelText="Wait transcoding before publishing the video" 136 i18n-labelText labelText="Wait transcoding before publishing the video"
136 i18n-helpHtml helpHtml="If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends." 137 i18n-helpHtml helpHtml="If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends."
@@ -147,7 +148,7 @@
147 148
148 <div class="captions-header"> 149 <div class="captions-header">
149 <a (click)="openAddCaptionModal()" class="create-caption"> 150 <a (click)="openAddCaptionModal()" class="create-caption">
150 <span class="icon icon-add"></span> 151 <my-global-icon iconName="add"></my-global-icon>
151 <ng-container i18n>Add another caption</ng-container> 152 <ng-container i18n>Add another caption</ng-container>
152 </a> 153 </a>
153 </div> 154 </div>
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.scss b/client/src/app/videos/+video-edit/shared/video-edit.component.scss
index b039d7ad4..bb775cb0a 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.scss
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.scss
@@ -5,6 +5,11 @@
5 @include peertube-select-container(auto); 5 @include peertube-select-container(auto);
6} 6}
7 7
8my-peertube-checkbox {
9 display: block;
10 margin-bottom: 1rem;
11}
12
8.video-edit { 13.video-edit {
9 height: 100%; 14 height: 100%;
10 min-height: 300px; 15 min-height: 300px;
@@ -18,10 +23,6 @@
18 display: block; 23 display: block;
19 } 24 }
20 25
21 input, select {
22 font-size: 15px
23 }
24
25 .label-tags + span { 26 .label-tags + span {
26 font-size: 15px; 27 font-size: 15px;
27 } 28 }
@@ -37,7 +38,7 @@
37 text-align: right; 38 text-align: right;
38 39
39 .create-caption { 40 .create-caption {
40 @include create-button('../../../../assets/images/global/add.svg'); 41 @include create-button;
41 } 42 }
42 } 43 }
43 44
@@ -95,13 +96,14 @@
95 display: inline-block; 96 display: inline-block;
96 margin-right: 25px; 97 margin-right: 25px;
97 98
98 color: #585858; 99 color: $grey-foreground-color;
99 font-size: 15px; 100 font-size: 15px;
100 } 101 }
101 102
102 .submit-button { 103 .submit-button {
103 @include peertube-button; 104 @include peertube-button;
104 @include orange-button; 105 @include orange-button;
106 @include button-with-icon(20px, 1px);
105 107
106 display: inline-block; 108 display: inline-block;
107 109
@@ -114,16 +116,6 @@
114 color: inherit; 116 color: inherit;
115 font-weight: $font-semibold; 117 font-weight: $font-semibold;
116 } 118 }
117
118 .icon.icon-validate {
119 @include icon(20px);
120
121 cursor: inherit;
122 position: relative;
123 top: -1px;
124 margin-right: 4px;
125 background-image: url('../../../../assets/images/global/validate.svg');
126 }
127 } 119 }
128} 120}
129 121
@@ -171,10 +163,10 @@ p-calendar {
171 } 163 }
172 164
173 tag { 165 tag {
174 background-color: var(--inputColor) !important; 166 background-color: $grey-background-color !important;
167 color: #000 !important;
175 border-radius: 3px !important; 168 border-radius: 3px !important;
176 font-size: 15px !important; 169 font-size: 15px !important;
177 color: var(--mainForegroundColor) !important;
178 height: 30px !important; 170 height: 30px !important;
179 line-height: 30px !important; 171 line-height: 30px !important;
180 margin: 0 5px 0 0 !important; 172 margin: 0 5px 0 0 !important;
@@ -197,7 +189,10 @@ p-calendar {
197 top: -1px; 189 top: -1px;
198 height: auto !important; 190 height: auto !important;
199 vertical-align: middle !important; 191 vertical-align: middle !important;
200 fill: #585858 !important; 192
193 path {
194 fill: $grey-foreground-color !important;
195 }
201 } 196 }
202 197
203 &:hover { 198 &:hover {
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.ts b/client/src/app/videos/+video-edit/shared/video-edit.component.ts
index 1dae931e2..3ed7a4a10 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.ts
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.ts
@@ -2,7 +2,7 @@ import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'
2import { FormArray, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms' 2import { FormArray, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'
3import { ActivatedRoute, Router } from '@angular/router' 3import { ActivatedRoute, Router } from '@angular/router'
4import { FormReactiveValidationMessages, VideoValidatorsService } from '@app/shared' 4import { FormReactiveValidationMessages, VideoValidatorsService } from '@app/shared'
5import { NotificationsService } from 'angular2-notifications' 5import { Notifier } from '@app/core'
6import { ServerService } from '../../../core/server' 6import { ServerService } from '../../../core/server'
7import { VideoEdit } from '../../../shared/video/video-edit.model' 7import { VideoEdit } from '../../../shared/video/video-edit.model'
8import { map } from 'rxjs/operators' 8import { map } from 'rxjs/operators'
@@ -27,6 +27,7 @@ export class VideoEditComponent implements OnInit, OnDestroy {
27 @Input() userVideoChannels: { id: number, label: string, support: string }[] = [] 27 @Input() userVideoChannels: { id: number, label: string, support: string }[] = []
28 @Input() schedulePublicationPossible = true 28 @Input() schedulePublicationPossible = true
29 @Input() videoCaptions: VideoCaptionEdit[] = [] 29 @Input() videoCaptions: VideoCaptionEdit[] = []
30 @Input() waitTranscodingEnabled = true
30 31
31 @ViewChild('videoCaptionAddModal') videoCaptionAddModal: VideoCaptionAddModalComponent 32 @ViewChild('videoCaptionAddModal') videoCaptionAddModal: VideoCaptionAddModalComponent
32 33
@@ -48,7 +49,7 @@ export class VideoEditComponent implements OnInit, OnDestroy {
48 calendarTimezone: string 49 calendarTimezone: string
49 calendarDateFormat: string 50 calendarDateFormat: string
50 51
51 private schedulerInterval 52 private schedulerInterval: any
52 private firstPatchDone = false 53 private firstPatchDone = false
53 private initialVideoCaptions: string[] = [] 54 private initialVideoCaptions: string[] = []
54 55
@@ -58,7 +59,7 @@ export class VideoEditComponent implements OnInit, OnDestroy {
58 private videoCaptionService: VideoCaptionService, 59 private videoCaptionService: VideoCaptionService,
59 private route: ActivatedRoute, 60 private route: ActivatedRoute,
60 private router: Router, 61 private router: Router,
61 private notificationsService: NotificationsService, 62 private notifier: Notifier,
62 private serverService: ServerService, 63 private serverService: ServerService,
63 private i18nPrimengCalendarService: I18nPrimengCalendarService 64 private i18nPrimengCalendarService: I18nPrimengCalendarService
64 ) { 65 ) {
@@ -77,14 +78,14 @@ export class VideoEditComponent implements OnInit, OnDestroy {
77 } 78 }
78 79
79 updateForm () { 80 updateForm () {
80 const defaultValues = { 81 const defaultValues: any = {
81 nsfw: 'false', 82 nsfw: 'false',
82 commentsEnabled: 'true', 83 commentsEnabled: 'true',
83 downloadEnabled: 'true', 84 downloadEnabled: 'true',
84 waitTranscoding: 'true', 85 waitTranscoding: 'true',
85 tags: [] 86 tags: []
86 } 87 }
87 const obj = { 88 const obj: any = {
88 name: this.videoValidatorsService.VIDEO_NAME, 89 name: this.videoValidatorsService.VIDEO_NAME,
89 privacy: this.videoValidatorsService.VIDEO_PRIVACY, 90 privacy: this.videoValidatorsService.VIDEO_PRIVACY,
90 channelId: this.videoValidatorsService.VIDEO_CHANNEL, 91 channelId: this.videoValidatorsService.VIDEO_CHANNEL,
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
index a933a64f0..28eb143c9 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
@@ -1,6 +1,6 @@
1<div *ngIf="!hasImportedVideo" class="upload-video-container"> 1<div *ngIf="!hasImportedVideo" class="upload-video-container">
2 <div class="import-video-torrent"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="button-file"> 5 <div class="button-file">
6 <span i18n>Select the torrent to import</span> 6 <span i18n>Select the torrent to import</span>
@@ -45,7 +45,12 @@
45 </div> 45 </div>
46</div> 46</div>
47 47
48<div *ngIf="hasImportedVideo" class="alert alert-info" i18n> 48<div *ngIf="error" class="alert alert-danger">
49 <div i18n>Sorry, but something went wrong</div>
50 {{ error }}
51</div>
52
53<div *ngIf="hasImportedVideo && !error" class="alert alert-info" i18n>
49 Congratulations, the video will be imported with BitTorrent! You can already add information about this video. 54 Congratulations, the video will be imported with BitTorrent! You can already add information about this video.
50</div> 55</div>
51 56
@@ -61,7 +66,7 @@
61 (click)="updateSecondStep()" 66 (click)="updateSecondStep()"
62 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }" 67 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
63 > 68 >
64 <span class="icon icon-validate"></span> 69 <my-global-icon iconName="validate"></my-global-icon>
65 <input type="button" i18n-value value="Update" /> 70 <input type="button" i18n-value value="Update" />
66 </div> 71 </div>
67 </div> 72 </div>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
index 262b0b68e..6d59ed834 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
@@ -1,37 +1,7 @@
1@import 'variables'; 1@import 'variables';
2@import 'mixins'; 2@import 'mixins';
3 3
4$width-size: 190px; 4.first-step-block {
5
6.peertube-select-container {
7 @include peertube-select-container($width-size);
8}
9
10.import-video-torrent {
11 display: flex;
12 flex-direction: column;
13 align-items: center;
14
15 .icon.icon-upload {
16 @include icon(90px);
17 margin-bottom: 25px;
18 cursor: default;
19
20 background-image: url('../../../../assets/images/video/upload.svg');
21 }
22
23 .button-file {
24 @include peertube-button-file(auto);
25
26 min-width: 190px;
27 }
28
29 .button-file-extension {
30 display: block;
31 font-size: 12px;
32 margin-top: 5px;
33 }
34
35 .torrent-or-magnet { 5 .torrent-or-magnet {
36 margin: 10px 0; 6 margin: 10px 0;
37 } 7 }
@@ -39,19 +9,6 @@ $width-size: 190px;
39 .form-group-magnet-uri { 9 .form-group-magnet-uri {
40 margin-bottom: 40px; 10 margin-bottom: 40px;
41 } 11 }
42
43 input[type=text] {
44 @include peertube-input-text($width-size);
45 display: block;
46 }
47
48 input[type=button] {
49 @include peertube-button;
50 @include orange-button;
51
52 width: $width-size;
53 margin-top: 30px;
54 }
55} 12}
56 13
57 14
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
index 0f6fd17a9..c12a1d653 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
@@ -1,8 +1,7 @@
1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications'
4import { VideoPrivacy, VideoUpdate } from '../../../../../../shared/models/videos' 3import { VideoPrivacy, VideoUpdate } from '../../../../../../shared/models/videos'
5import { AuthService, ServerService } from '../../../core' 4import { AuthService, Notifier, ServerService } from '../../../core'
6import { VideoService } from '../../../shared/video/video.service' 5import { VideoService } from '../../../shared/video/video.service'
7import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
8import { LoadingBarService } from '@ngx-loading-bar/core' 7import { LoadingBarService } from '@ngx-loading-bar/core'
@@ -12,20 +11,22 @@ import { VideoEdit } from '@app/shared/video/video-edit.model'
12import { FormValidatorService } from '@app/shared' 11import { FormValidatorService } from '@app/shared'
13import { VideoCaptionService } from '@app/shared/video-caption' 12import { VideoCaptionService } from '@app/shared/video-caption'
14import { VideoImportService } from '@app/shared/video-import' 13import { VideoImportService } from '@app/shared/video-import'
14import { scrollToTop } from '@app/shared/misc/utils'
15 15
16@Component({ 16@Component({
17 selector: 'my-video-import-torrent', 17 selector: 'my-video-import-torrent',
18 templateUrl: './video-import-torrent.component.html', 18 templateUrl: './video-import-torrent.component.html',
19 styleUrls: [ 19 styleUrls: [
20 '../shared/video-edit.component.scss', 20 '../shared/video-edit.component.scss',
21 './video-import-torrent.component.scss' 21 './video-import-torrent.component.scss',
22 './video-send.scss'
22 ] 23 ]
23}) 24})
24export class VideoImportTorrentComponent extends VideoSend implements OnInit, CanComponentDeactivate { 25export class VideoImportTorrentComponent extends VideoSend implements OnInit, CanComponentDeactivate {
25 @Output() firstStepDone = new EventEmitter<string>() 26 @Output() firstStepDone = new EventEmitter<string>()
26 @ViewChild('torrentfileInput') torrentfileInput 27 @Output() firstStepError = new EventEmitter<void>()
28 @ViewChild('torrentfileInput') torrentfileInput: ElementRef<HTMLInputElement>
27 29
28 videoFileName: string
29 magnetUri = '' 30 magnetUri = ''
30 31
31 isImportingVideo = false 32 isImportingVideo = false
@@ -33,13 +34,14 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
33 isUpdatingVideo = false 34 isUpdatingVideo = false
34 35
35 video: VideoEdit 36 video: VideoEdit
37 error: string
36 38
37 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC 39 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC
38 40
39 constructor ( 41 constructor (
40 protected formValidatorService: FormValidatorService, 42 protected formValidatorService: FormValidatorService,
41 protected loadingBar: LoadingBarService, 43 protected loadingBar: LoadingBarService,
42 protected notificationsService: NotificationsService, 44 protected notifier: Notifier,
43 protected authService: AuthService, 45 protected authService: AuthService,
44 protected serverService: ServerService, 46 protected serverService: ServerService,
45 protected videoService: VideoService, 47 protected videoService: VideoService,
@@ -64,7 +66,7 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
64 } 66 }
65 67
66 fileChange () { 68 fileChange () {
67 const torrentfile = this.torrentfileInput.nativeElement.files[0] as File 69 const torrentfile = this.torrentfileInput.nativeElement.files[0]
68 if (!torrentfile) return 70 if (!torrentfile) return
69 71
70 this.importVideo(torrentfile) 72 this.importVideo(torrentfile)
@@ -106,7 +108,8 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
106 err => { 108 err => {
107 this.loadingBar.complete() 109 this.loadingBar.complete()
108 this.isImportingVideo = false 110 this.isImportingVideo = false
109 this.notificationsService.error(this.i18n('Error'), err.message) 111 this.firstStepError.emit()
112 this.notifier.error(err.message)
110 } 113 }
111 ) 114 )
112 } 115 }
@@ -125,14 +128,14 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
125 .subscribe( 128 .subscribe(
126 () => { 129 () => {
127 this.isUpdatingVideo = false 130 this.isUpdatingVideo = false
128 this.notificationsService.success(this.i18n('Success'), this.i18n('Video to import updated.')) 131 this.notifier.success(this.i18n('Video to import updated.'))
129 132
130 this.router.navigate([ '/my-account', 'video-imports' ]) 133 this.router.navigate([ '/my-account', 'video-imports' ])
131 }, 134 },
132 135
133 err => { 136 err => {
134 this.isUpdatingVideo = false 137 this.error = err.message
135 this.notificationsService.error(this.i18n('Error'), err.message) 138 scrollToTop()
136 console.error(err) 139 console.error(err)
137 } 140 }
138 ) 141 )
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
index 9f5fc6d22..3550c3585 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
@@ -1,6 +1,6 @@
1<div *ngIf="!hasImportedVideo" class="upload-video-container"> 1<div *ngIf="!hasImportedVideo" class="upload-video-container">
2 <div class="import-video-url"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="form-group"> 5 <div class="form-group">
6 <label i18n for="targetUrl">URL</label> 6 <label i18n for="targetUrl">URL</label>
@@ -37,7 +37,13 @@
37 </div> 37 </div>
38</div> 38</div>
39 39
40<div *ngIf="hasImportedVideo" class="alert alert-info" i18n> 40
41<div *ngIf="error" class="alert alert-danger">
42 <div i18n>Sorry, but something went wrong</div>
43 {{ error }}
44</div>
45
46<div *ngIf="!error && hasImportedVideo" class="alert alert-info" i18n>
41 Congratulations, the video behind {{ targetUrl }} will be imported! You can already add information about this video. 47 Congratulations, the video behind {{ targetUrl }} will be imported! You can already add information about this video.
42</div> 48</div>
43 49
@@ -53,7 +59,7 @@
53 (click)="updateSecondStep()" 59 (click)="updateSecondStep()"
54 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }" 60 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
55 > 61 >
56 <span class="icon icon-validate"></span> 62 <my-global-icon iconName="validate"></my-global-icon>
57 <input type="button" i18n-value value="Update" /> 63 <input type="button" i18n-value value="Update" />
58 </div> 64 </div>
59 </div> 65 </div>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss
deleted file mode 100644
index 7c6deda1d..000000000
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss
+++ /dev/null
@@ -1,37 +0,0 @@
1@import 'variables';
2@import 'mixins';
3
4$width-size: 190px;
5
6.peertube-select-container {
7 @include peertube-select-container($width-size);
8}
9
10.import-video-url {
11 display: flex;
12 flex-direction: column;
13 align-items: center;
14
15 .icon.icon-upload {
16 @include icon(90px);
17 margin-bottom: 25px;
18 cursor: default;
19
20 background-image: url('../../../../assets/images/video/upload.svg');
21 }
22
23 input[type=text] {
24 @include peertube-input-text($width-size);
25 display: block;
26 }
27
28 input[type=button] {
29 @include peertube-button;
30 @include orange-button;
31
32 width: $width-size;
33 margin-top: 30px;
34 }
35}
36
37
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
index fbc85c74f..d11685916 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
@@ -1,8 +1,7 @@
1import { Component, EventEmitter, OnInit, Output } from '@angular/core' 1import { Component, EventEmitter, OnInit, Output } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications'
4import { VideoPrivacy, VideoUpdate } from '../../../../../../shared/models/videos' 3import { VideoPrivacy, VideoUpdate } from '../../../../../../shared/models/videos'
5import { AuthService, ServerService } from '../../../core' 4import { AuthService, Notifier, ServerService } from '../../../core'
6import { VideoService } from '../../../shared/video/video.service' 5import { VideoService } from '../../../shared/video/video.service'
7import { I18n } from '@ngx-translate/i18n-polyfill' 6import { I18n } from '@ngx-translate/i18n-polyfill'
8import { LoadingBarService } from '@ngx-loading-bar/core' 7import { LoadingBarService } from '@ngx-loading-bar/core'
@@ -12,33 +11,35 @@ import { VideoEdit } from '@app/shared/video/video-edit.model'
12import { FormValidatorService } from '@app/shared' 11import { FormValidatorService } from '@app/shared'
13import { VideoCaptionService } from '@app/shared/video-caption' 12import { VideoCaptionService } from '@app/shared/video-caption'
14import { VideoImportService } from '@app/shared/video-import' 13import { VideoImportService } from '@app/shared/video-import'
14import { scrollToTop } from '@app/shared/misc/utils'
15 15
16@Component({ 16@Component({
17 selector: 'my-video-import-url', 17 selector: 'my-video-import-url',
18 templateUrl: './video-import-url.component.html', 18 templateUrl: './video-import-url.component.html',
19 styleUrls: [ 19 styleUrls: [
20 '../shared/video-edit.component.scss', 20 '../shared/video-edit.component.scss',
21 './video-import-url.component.scss' 21 './video-send.scss'
22 ] 22 ]
23}) 23})
24export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate { 24export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate {
25 @Output() firstStepDone = new EventEmitter<string>() 25 @Output() firstStepDone = new EventEmitter<string>()
26 @Output() firstStepError = new EventEmitter<void>()
26 27
27 targetUrl = '' 28 targetUrl = ''
28 videoFileName: string
29 29
30 isImportingVideo = false 30 isImportingVideo = false
31 hasImportedVideo = false 31 hasImportedVideo = false
32 isUpdatingVideo = false 32 isUpdatingVideo = false
33 33
34 video: VideoEdit 34 video: VideoEdit
35 error: string
35 36
36 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC 37 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC
37 38
38 constructor ( 39 constructor (
39 protected formValidatorService: FormValidatorService, 40 protected formValidatorService: FormValidatorService,
40 protected loadingBar: LoadingBarService, 41 protected loadingBar: LoadingBarService,
41 protected notificationsService: NotificationsService, 42 protected notifier: Notifier,
42 protected authService: AuthService, 43 protected authService: AuthService,
43 protected serverService: ServerService, 44 protected serverService: ServerService,
44 protected videoService: VideoService, 45 protected videoService: VideoService,
@@ -98,7 +99,8 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
98 err => { 99 err => {
99 this.loadingBar.complete() 100 this.loadingBar.complete()
100 this.isImportingVideo = false 101 this.isImportingVideo = false
101 this.notificationsService.error(this.i18n('Error'), err.message) 102 this.firstStepError.emit()
103 this.notifier.error(err.message)
102 } 104 }
103 ) 105 )
104 } 106 }
@@ -117,14 +119,14 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
117 .subscribe( 119 .subscribe(
118 () => { 120 () => {
119 this.isUpdatingVideo = false 121 this.isUpdatingVideo = false
120 this.notificationsService.success(this.i18n('Success'), this.i18n('Video to import updated.')) 122 this.notifier.success(this.i18n('Video to import updated.'))
121 123
122 this.router.navigate([ '/my-account', 'video-imports' ]) 124 this.router.navigate([ '/my-account', 'video-imports' ])
123 }, 125 },
124 126
125 err => { 127 err => {
126 this.isUpdatingVideo = false 128 this.error = err.message
127 this.notificationsService.error(this.i18n('Error'), err.message) 129 scrollToTop()
128 console.error(err) 130 console.error(err)
129 } 131 }
130 ) 132 )
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-send.scss b/client/src/app/videos/+video-edit/video-add-components/video-send.scss
new file mode 100644
index 000000000..8769dd302
--- /dev/null
+++ b/client/src/app/videos/+video-edit/video-add-components/video-send.scss
@@ -0,0 +1,54 @@
1@import 'variables';
2@import 'mixins';
3
4$width-size: 190px;
5
6.alert.alert-danger {
7 text-align: center;
8
9 & > div {
10 font-weight: $font-semibold;
11 }
12}
13
14.first-step-block {
15 display: flex;
16 flex-direction: column;
17 align-items: center;
18
19 .upload-icon {
20 width: 90px;
21 margin-bottom: 25px;
22
23 @include apply-svg-color(#C6C6C6);
24 }
25
26 .peertube-select-container {
27 @include peertube-select-container($width-size);
28 }
29
30 input[type=text] {
31 @include peertube-input-text($width-size);
32 display: block;
33 }
34
35 input[type=button] {
36 @include peertube-button;
37 @include orange-button;
38
39 width: $width-size;
40 margin-top: 30px;
41 }
42
43 .button-file {
44 @include peertube-button-file(auto);
45
46 min-width: 190px;
47 }
48
49 .button-file-extension {
50 display: block;
51 font-size: 12px;
52 margin-top: 5px;
53 }
54}
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-send.ts b/client/src/app/videos/+video-edit/video-add-components/video-send.ts
index 6d1bac3f2..580c123a0 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-send.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-send.ts
@@ -1,18 +1,17 @@
1import { EventEmitter, OnInit } from '@angular/core' 1import { EventEmitter, OnInit } from '@angular/core'
2import { LoadingBarService } from '@ngx-loading-bar/core' 2import { LoadingBarService } from '@ngx-loading-bar/core'
3import { NotificationsService } from 'angular2-notifications' 3import { AuthService, Notifier, ServerService } from '@app/core'
4import { catchError, switchMap, tap } from 'rxjs/operators' 4import { catchError, switchMap, tap } from 'rxjs/operators'
5import { FormReactive } from '@app/shared' 5import { FormReactive } from '@app/shared'
6import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service'
7import { VideoConstant, VideoPrivacy } from '../../../../../../shared' 6import { VideoConstant, VideoPrivacy } from '../../../../../../shared'
8import { AuthService, ServerService } from '@app/core'
9import { VideoService } from '@app/shared/video/video.service' 7import { VideoService } from '@app/shared/video/video.service'
10import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model' 8import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model'
11import { VideoCaptionService } from '@app/shared/video-caption' 9import { VideoCaptionService } from '@app/shared/video-caption'
12import { VideoEdit } from '@app/shared/video/video-edit.model' 10import { VideoEdit } from '@app/shared/video/video-edit.model'
13import { populateAsyncUserVideoChannels } from '@app/shared/misc/utils' 11import { populateAsyncUserVideoChannels } from '@app/shared/misc/utils'
12import { CanComponentDeactivateResult } from '@app/shared/guards/can-deactivate-guard.service'
14 13
15export abstract class VideoSend extends FormReactive implements OnInit, CanComponentDeactivate { 14export abstract class VideoSend extends FormReactive implements OnInit {
16 userVideoChannels: { id: number, label: string, support: string }[] = [] 15 userVideoChannels: { id: number, label: string, support: string }[] = []
17 videoPrivacies: VideoConstant<VideoPrivacy>[] = [] 16 videoPrivacies: VideoConstant<VideoPrivacy>[] = []
18 videoCaptions: VideoCaptionEdit[] = [] 17 videoCaptions: VideoCaptionEdit[] = []
@@ -21,16 +20,17 @@ export abstract class VideoSend extends FormReactive implements OnInit, CanCompo
21 firstStepChannelId = 0 20 firstStepChannelId = 0
22 21
23 abstract firstStepDone: EventEmitter<string> 22 abstract firstStepDone: EventEmitter<string>
23 abstract firstStepError: EventEmitter<void>
24 protected abstract readonly DEFAULT_VIDEO_PRIVACY: VideoPrivacy 24 protected abstract readonly DEFAULT_VIDEO_PRIVACY: VideoPrivacy
25 25
26 protected loadingBar: LoadingBarService 26 protected loadingBar: LoadingBarService
27 protected notificationsService: NotificationsService 27 protected notifier: Notifier
28 protected authService: AuthService 28 protected authService: AuthService
29 protected serverService: ServerService 29 protected serverService: ServerService
30 protected videoService: VideoService 30 protected videoService: VideoService
31 protected videoCaptionService: VideoCaptionService 31 protected videoCaptionService: VideoCaptionService
32 32
33 abstract canDeactivate () 33 abstract canDeactivate (): CanComponentDeactivateResult
34 34
35 ngOnInit () { 35 ngOnInit () {
36 this.buildForm({}) 36 this.buildForm({})
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
index fa57c8cb5..b252cd60a 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
@@ -1,12 +1,12 @@
1<div *ngIf="!isUploadingVideo" class="upload-video-container"> 1<div *ngIf="!isUploadingVideo" class="upload-video-container">
2 <div class="upload-video"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="button-file"> 5 <div class="button-file">
6 <span i18n>Select the file to upload</span> 6 <span i18n>Select the file to upload</span>
7 <input #videofileInput type="file" name="videofile" id="videofile" [accept]="videoExtensions" (change)="fileChange()" /> 7 <input #videofileInput type="file" name="videofile" id="videofile" [accept]="videoExtensions" (change)="fileChange()" />
8 </div> 8 </div>
9 <span class="button-file-extension">(.mp4, .webm, .ogv)</span> 9 <span class="button-file-extension">({{ videoExtensions }})</span>
10 10
11 <div class="form-group form-group-channel"> 11 <div class="form-group form-group-channel">
12 <label i18n for="first-step-channel">Channel</label> 12 <label i18n for="first-step-channel">Channel</label>
@@ -29,7 +29,7 @@
29 </div> 29 </div>
30</div> 30</div>
31 31
32<div *ngIf="isUploadingVideo" class="upload-progress-cancel"> 32<div *ngIf="isUploadingVideo && !error" class="upload-progress-cancel">
33 <p-progressBar 33 <p-progressBar
34 [value]="videoUploadPercents" 34 [value]="videoUploadPercents"
35 [ngClass]="{ processing: videoUploadPercents === 100 && videoUploaded === false }" 35 [ngClass]="{ processing: videoUploadPercents === 100 && videoUploaded === false }"
@@ -37,11 +37,21 @@
37 <input *ngIf="videoUploaded === false" type="button" value="Cancel" (click)="cancelUpload()" /> 37 <input *ngIf="videoUploaded === false" type="button" value="Cancel" (click)="cancelUpload()" />
38</div> 38</div>
39 39
40<div *ngIf="error" class="alert alert-danger">
41 <div i18n>Sorry, but something went wrong</div>
42 {{ error }}
43</div>
44
45<div *ngIf="videoUploaded && !error" class="alert alert-info" i18n>
46 Congratulations! Your video is now available in your private library.
47</div>
48
40<!-- Hidden because we want to load the component --> 49<!-- Hidden because we want to load the component -->
41<form [hidden]="!isUploadingVideo" novalidate [formGroup]="form"> 50<form [hidden]="!isUploadingVideo" novalidate [formGroup]="form">
42 <my-video-edit 51 <my-video-edit
43 [form]="form" [formErrors]="formErrors" [videoCaptions]="videoCaptions" 52 [form]="form" [formErrors]="formErrors" [videoCaptions]="videoCaptions"
44 [validationMessages]="validationMessages" [videoPrivacies]="videoPrivacies" [userVideoChannels]="userVideoChannels" 53 [validationMessages]="validationMessages" [videoPrivacies]="videoPrivacies" [userVideoChannels]="userVideoChannels"
54 [waitTranscodingEnabled]="waitTranscodingEnabled"
45 ></my-video-edit> 55 ></my-video-edit>
46 56
47 <div class="submit-container"> 57 <div class="submit-container">
@@ -51,8 +61,8 @@
51 (click)="updateSecondStep()" 61 (click)="updateSecondStep()"
52 [ngClass]="{ disabled: isPublishingButtonDisabled() }" 62 [ngClass]="{ disabled: isPublishingButtonDisabled() }"
53 > 63 >
54 <span class="icon icon-validate"></span> 64 <my-global-icon iconName="validate"></my-global-icon>
55 <input [disabled]="isPublishingButtonDisabled()" type="button" i18n-value value="Publish" /> 65 <input [disabled]="isPublishingButtonDisabled()" type="button" i18n-value value="Publish" />
56 </div> 66 </div>
57 </div> 67 </div>
58</form> \ No newline at end of file 68</form>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
index dbae5230d..8adf8f169 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
@@ -1,39 +1,9 @@
1@import 'variables'; 1@import 'variables';
2@import 'mixins'; 2@import 'mixins';
3 3
4.peertube-select-container { 4.first-step-block .form-group-channel {
5 @include peertube-select-container(190px); 5 margin-bottom: 20px;
6} 6 margin-top: 35px;
7
8.upload-video {
9 display: flex;
10 flex-direction: column;
11 align-items: center;
12
13 .form-group-channel {
14 margin-bottom: 20px;
15 margin-top: 35px;
16 }
17
18 .icon.icon-upload {
19 @include icon(90px);
20 margin-bottom: 25px;
21 cursor: default;
22
23 background-image: url('../../../../assets/images/video/upload.svg');
24 }
25
26 .button-file {
27 @include peertube-button-file(auto);
28
29 min-width: 190px;
30 }
31
32 .button-file-extension {
33 display: block;
34 font-size: 12px;
35 margin-top: 5px;
36 }
37} 7}
38 8
39.upload-progress-cancel { 9.upload-progress-cancel {
@@ -46,9 +16,7 @@
46 16
47 /deep/ .ui-progressbar { 17 /deep/ .ui-progressbar {
48 font-size: 15px !important; 18 font-size: 15px !important;
49 color: #fff !important;
50 height: 30px !important; 19 height: 30px !important;
51 line-height: 30px !important;
52 border-radius: 3px !important; 20 border-radius: 3px !important;
53 background-color: rgba(11, 204, 41, 0.16) !important; 21 background-color: rgba(11, 204, 41, 0.16) !important;
54 22
@@ -60,6 +28,8 @@
60 text-align: left; 28 text-align: left;
61 padding-left: 18px; 29 padding-left: 18px;
62 margin-top: 0 !important; 30 margin-top: 0 !important;
31 color: #fff !important;
32 line-height: 30px !important;
63 } 33 }
64 } 34 }
65 35
@@ -82,4 +52,4 @@
82 52
83 margin-left: 10px; 53 margin-left: 10px;
84 } 54 }
85} \ No newline at end of file 55}
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
index ac6c1786f..9cadf52cb 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
@@ -1,12 +1,11 @@
1import { HttpEventType, HttpResponse } from '@angular/common/http' 1import { HttpEventType, HttpResponse } from '@angular/common/http'
2import { Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core' 2import { Component, ElementRef, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'
3import { Router } from '@angular/router' 3import { Router } from '@angular/router'
4import { LoadingBarService } from '@ngx-loading-bar/core' 4import { LoadingBarService } from '@ngx-loading-bar/core'
5import { NotificationsService } from 'angular2-notifications'
6import { BytesPipe } from 'ngx-pipes' 5import { BytesPipe } from 'ngx-pipes'
7import { Subscription } from 'rxjs' 6import { Subscription } from 'rxjs'
8import { VideoPrivacy } from '../../../../../../shared/models/videos' 7import { VideoPrivacy } from '../../../../../../shared/models/videos'
9import { AuthService, ServerService } from '../../../core' 8import { AuthService, Notifier, ServerService } from '../../../core'
10import { VideoEdit } from '../../../shared/video/video-edit.model' 9import { VideoEdit } from '../../../shared/video/video-edit.model'
11import { VideoService } from '../../../shared/video/video.service' 10import { VideoService } from '../../../shared/video/video.service'
12import { I18n } from '@ngx-translate/i18n-polyfill' 11import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -14,18 +13,21 @@ import { VideoSend } from '@app/videos/+video-edit/video-add-components/video-se
14import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service' 13import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service'
15import { FormValidatorService, UserService } from '@app/shared' 14import { FormValidatorService, UserService } from '@app/shared'
16import { VideoCaptionService } from '@app/shared/video-caption' 15import { VideoCaptionService } from '@app/shared/video-caption'
16import { scrollToTop } from '@app/shared/misc/utils'
17 17
18@Component({ 18@Component({
19 selector: 'my-video-upload', 19 selector: 'my-video-upload',
20 templateUrl: './video-upload.component.html', 20 templateUrl: './video-upload.component.html',
21 styleUrls: [ 21 styleUrls: [
22 '../shared/video-edit.component.scss', 22 '../shared/video-edit.component.scss',
23 './video-upload.component.scss' 23 './video-upload.component.scss',
24 './video-send.scss'
24 ] 25 ]
25}) 26})
26export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy, CanComponentDeactivate { 27export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy, CanComponentDeactivate {
27 @Output() firstStepDone = new EventEmitter<string>() 28 @Output() firstStepDone = new EventEmitter<string>()
28 @ViewChild('videofileInput') videofileInput 29 @Output() firstStepError = new EventEmitter<void>()
30 @ViewChild('videofileInput') videofileInput: ElementRef<HTMLInputElement>
29 31
30 // So that it can be accessed in the template 32 // So that it can be accessed in the template
31 readonly SPECIAL_SCHEDULED_PRIVACY = VideoEdit.SPECIAL_SCHEDULED_PRIVACY 33 readonly SPECIAL_SCHEDULED_PRIVACY = VideoEdit.SPECIAL_SCHEDULED_PRIVACY
@@ -42,13 +44,16 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
42 id: 0, 44 id: 0,
43 uuid: '' 45 uuid: ''
44 } 46 }
47 waitTranscodingEnabled = true
48
49 error: string
45 50
46 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC 51 protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC
47 52
48 constructor ( 53 constructor (
49 protected formValidatorService: FormValidatorService, 54 protected formValidatorService: FormValidatorService,
50 protected loadingBar: LoadingBarService, 55 protected loadingBar: LoadingBarService,
51 protected notificationsService: NotificationsService, 56 protected notifier: Notifier,
52 protected authService: AuthService, 57 protected authService: AuthService,
53 protected serverService: ServerService, 58 protected serverService: ServerService,
54 protected videoService: VideoService, 59 protected videoService: VideoService,
@@ -105,20 +110,15 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
105 this.isUploadingVideo = false 110 this.isUploadingVideo = false
106 this.videoUploadPercents = 0 111 this.videoUploadPercents = 0
107 this.videoUploadObservable = null 112 this.videoUploadObservable = null
108 this.notificationsService.info(this.i18n('Info'), this.i18n('Upload cancelled')) 113 this.notifier.info(this.i18n('Upload cancelled'))
109 } 114 }
110 } 115 }
111 116
112 uploadFirstStep () { 117 uploadFirstStep () {
113 const videofile = this.videofileInput.nativeElement.files[0] as File 118 const videofile = this.videofileInput.nativeElement.files[0]
114 if (!videofile) return 119 if (!videofile) return
115 120
116 // Cannot upload videos > 8GB for now 121 // Check global user quota
117 if (videofile.size > 8 * 1024 * 1024 * 1024) {
118 this.notificationsService.error(this.i18n('Error'), this.i18n('We are sorry but PeerTube cannot handle videos > 8GB'))
119 return
120 }
121
122 const bytePipes = new BytesPipe() 122 const bytePipes = new BytesPipe()
123 const videoQuota = this.authService.getUser().videoQuota 123 const videoQuota = this.authService.getUser().videoQuota
124 if (videoQuota !== -1 && (this.userVideoQuotaUsed + videofile.size) > videoQuota) { 124 if (videoQuota !== -1 && (this.userVideoQuotaUsed + videofile.size) > videoQuota) {
@@ -130,10 +130,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
130 videoQuota: bytePipes.transform(videoQuota, 0) 130 videoQuota: bytePipes.transform(videoQuota, 0)
131 } 131 }
132 ) 132 )
133 this.notificationsService.error(this.i18n('Error'), msg) 133 this.notifier.error(msg)
134 return 134 return
135 } 135 }
136 136
137 // Check daily user quota
137 const videoQuotaDaily = this.authService.getUser().videoQuotaDaily 138 const videoQuotaDaily = this.authService.getUser().videoQuotaDaily
138 if (videoQuotaDaily !== -1 && (this.userVideoQuotaUsedDaily + videofile.size) > videoQuotaDaily) { 139 if (videoQuotaDaily !== -1 && (this.userVideoQuotaUsedDaily + videofile.size) > videoQuotaDaily) {
139 const msg = this.i18n( 140 const msg = this.i18n(
@@ -144,10 +145,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
144 quotaDaily: bytePipes.transform(videoQuotaDaily, 0) 145 quotaDaily: bytePipes.transform(videoQuotaDaily, 0)
145 } 146 }
146 ) 147 )
147 this.notificationsService.error(this.i18n('Error'), msg) 148 this.notifier.error(msg)
148 return 149 return
149 } 150 }
150 151
152 // Build name field
151 const nameWithoutExtension = videofile.name.replace(/\.[^/.]+$/, '') 153 const nameWithoutExtension = videofile.name.replace(/\.[^/.]+$/, '')
152 let name: string 154 let name: string
153 155
@@ -155,6 +157,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
155 if (nameWithoutExtension.length < 3) name = videofile.name 157 if (nameWithoutExtension.length < 3) name = videofile.name
156 else name = nameWithoutExtension 158 else name = nameWithoutExtension
157 159
160 // Force user to wait transcoding for unsupported video types in web browsers
161 if (!videofile.name.endsWith('.mp4') && !videofile.name.endsWith('.webm') && !videofile.name.endsWith('.ogv')) {
162 this.waitTranscodingEnabled = false
163 }
164
158 const privacy = this.firstStepPrivacyId.toString() 165 const privacy = this.firstStepPrivacyId.toString()
159 const nsfw = false 166 const nsfw = false
160 const waitTranscoding = true 167 const waitTranscoding = true
@@ -203,7 +210,8 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
203 this.isUploadingVideo = false 210 this.isUploadingVideo = false
204 this.videoUploadPercents = 0 211 this.videoUploadPercents = 0
205 this.videoUploadObservable = null 212 this.videoUploadObservable = null
206 this.notificationsService.error(this.i18n('Error'), err.message) 213 this.firstStepError.emit()
214 this.notifier.error(err.message)
207 } 215 }
208 ) 216 )
209 } 217 }
@@ -232,13 +240,13 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
232 this.isUpdatingVideo = false 240 this.isUpdatingVideo = false
233 this.isUploadingVideo = false 241 this.isUploadingVideo = false
234 242
235 this.notificationsService.success(this.i18n('Success'), this.i18n('Video published.')) 243 this.notifier.success(this.i18n('Video published.'))
236 this.router.navigate([ '/videos/watch', video.uuid ]) 244 this.router.navigate([ '/videos/watch', video.uuid ])
237 }, 245 },
238 246
239 err => { 247 err => {
240 this.isUpdatingVideo = false 248 this.error = err.message
241 this.notificationsService.error(this.i18n('Error'), err.message) 249 scrollToTop()
242 console.error(err) 250 console.error(err)
243 } 251 }
244 ) 252 )
diff --git a/client/src/app/videos/+video-edit/video-add.component.html b/client/src/app/videos/+video-edit/video-add.component.html
index e14e23aed..72a233b72 100644
--- a/client/src/app/videos/+video-edit/video-add.component.html
+++ b/client/src/app/videos/+video-edit/video-add.component.html
@@ -6,24 +6,24 @@
6 6
7 <ngb-tabset class="video-add-tabset root-tabset bootstrap" [ngClass]="{ 'hide-nav': secondStepType !== undefined }"> 7 <ngb-tabset class="video-add-tabset root-tabset bootstrap" [ngClass]="{ 'hide-nav': secondStepType !== undefined }">
8 8
9 <ngb-tab i18n-title title=""> 9 <ngb-tab>
10 <ng-template ngbTabTitle><span i18n>Upload a file</span></ng-template> 10 <ng-template ngbTabTitle><span i18n>Upload a file</span></ng-template>
11 <ng-template ngbTabContent> 11 <ng-template ngbTabContent>
12 <my-video-upload #videoUpload (firstStepDone)="onFirstStepDone('upload', $event)"></my-video-upload> 12 <my-video-upload #videoUpload (firstStepDone)="onFirstStepDone('upload', $event)" (firstStepError)="onError()"></my-video-upload>
13 </ng-template> 13 </ng-template>
14 </ngb-tab> 14 </ngb-tab>
15 15
16 <ngb-tab *ngIf="isVideoImportHttpEnabled()"> 16 <ngb-tab *ngIf="isVideoImportHttpEnabled()">
17 <ng-template ngbTabTitle><span i18n>Import with URL</span></ng-template> 17 <ng-template ngbTabTitle><span i18n>Import with URL</span></ng-template>
18 <ng-template ngbTabContent> 18 <ng-template ngbTabContent>
19 <my-video-import-url #videoImportUrl (firstStepDone)="onFirstStepDone('import-url', $event)"></my-video-import-url> 19 <my-video-import-url #videoImportUrl (firstStepDone)="onFirstStepDone('import-url', $event)" (firstStepError)="onError()"></my-video-import-url>
20 </ng-template> 20 </ng-template>
21 </ngb-tab> 21 </ngb-tab>
22 22
23 <ngb-tab *ngIf="isVideoImportTorrentEnabled()"> 23 <ngb-tab *ngIf="isVideoImportTorrentEnabled()">
24 <ng-template ngbTabTitle><span i18n>Import with torrent</span></ng-template> 24 <ng-template ngbTabTitle><span i18n>Import with torrent</span></ng-template>
25 <ng-template ngbTabContent> 25 <ng-template ngbTabContent>
26 <my-video-import-torrent #videoImportTorrent (firstStepDone)="onFirstStepDone('import-torrent', $event)"></my-video-import-torrent> 26 <my-video-import-torrent #videoImportTorrent (firstStepDone)="onFirstStepDone('import-torrent', $event)" (firstStepError)="onError()"></my-video-import-torrent>
27 </ng-template> 27 </ng-template>
28 </ngb-tab> 28 </ngb-tab>
29 </ngb-tabset> 29 </ngb-tabset>
diff --git a/client/src/app/videos/+video-edit/video-add.component.ts b/client/src/app/videos/+video-edit/video-add.component.ts
index 1a9247dbe..01fdfcb66 100644
--- a/client/src/app/videos/+video-edit/video-add.component.ts
+++ b/client/src/app/videos/+video-edit/video-add.component.ts
@@ -1,4 +1,4 @@
1import { Component, ViewChild } from '@angular/core' 1import { Component, HostListener, ViewChild } from '@angular/core'
2import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service' 2import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service'
3import { VideoImportUrlComponent } from '@app/videos/+video-edit/video-add-components/video-import-url.component' 3import { VideoImportUrlComponent } from '@app/videos/+video-edit/video-add-components/video-import-url.component'
4import { VideoUploadComponent } from '@app/videos/+video-edit/video-add-components/video-upload.component' 4import { VideoUploadComponent } from '@app/videos/+video-edit/video-add-components/video-upload.component'
@@ -27,7 +27,22 @@ export class VideoAddComponent implements CanComponentDeactivate {
27 this.videoName = videoName 27 this.videoName = videoName
28 } 28 }
29 29
30 canDeactivate () { 30 onError () {
31 this.videoName = undefined
32 this.secondStepType = undefined
33 }
34
35 @HostListener('window:beforeunload', [ '$event' ])
36 onUnload (event: any) {
37 const { text, canDeactivate } = this.canDeactivate()
38
39 if (canDeactivate) return
40
41 event.returnValue = text
42 return text
43 }
44
45 canDeactivate (): { canDeactivate: boolean, text?: string} {
31 if (this.secondStepType === 'upload') return this.videoUpload.canDeactivate() 46 if (this.secondStepType === 'upload') return this.videoUpload.canDeactivate()
32 if (this.secondStepType === 'import-url') return this.videoImportUrl.canDeactivate() 47 if (this.secondStepType === 'import-url') return this.videoImportUrl.canDeactivate()
33 if (this.secondStepType === 'import-torrent') return this.videoImportTorrent.canDeactivate() 48 if (this.secondStepType === 'import-torrent') return this.videoImportTorrent.canDeactivate()
diff --git a/client/src/app/videos/+video-edit/video-update.component.html b/client/src/app/videos/+video-edit/video-update.component.html
index 9242c30a0..4992bb369 100644
--- a/client/src/app/videos/+video-edit/video-update.component.html
+++ b/client/src/app/videos/+video-edit/video-update.component.html
@@ -8,12 +8,12 @@
8 <my-video-edit 8 <my-video-edit
9 [form]="form" [formErrors]="formErrors" [schedulePublicationPossible]="schedulePublicationPossible" 9 [form]="form" [formErrors]="formErrors" [schedulePublicationPossible]="schedulePublicationPossible"
10 [validationMessages]="validationMessages" [videoPrivacies]="videoPrivacies" [userVideoChannels]="userVideoChannels" 10 [validationMessages]="validationMessages" [videoPrivacies]="videoPrivacies" [userVideoChannels]="userVideoChannels"
11 [videoCaptions]="videoCaptions" 11 [videoCaptions]="videoCaptions" [waitTranscodingEnabled]="waitTranscodingEnabled"
12 ></my-video-edit> 12 ></my-video-edit>
13 13
14 <div class="submit-container"> 14 <div class="submit-container">
15 <div class="submit-button" (click)="update()" [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"> 15 <div class="submit-button" (click)="update()" [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }">
16 <span class="icon icon-validate"></span> 16 <my-global-icon iconName="validate"></my-global-icon>
17 <input type="button" i18n-value value="Update" /> 17 <input type="button" i18n-value value="Update" />
18 </div> 18 </div>
19 </div> 19 </div>
diff --git a/client/src/app/videos/+video-edit/video-update.component.ts b/client/src/app/videos/+video-edit/video-update.component.ts
index 3a0f3a39a..9e849014e 100644
--- a/client/src/app/videos/+video-edit/video-update.component.ts
+++ b/client/src/app/videos/+video-edit/video-update.component.ts
@@ -1,8 +1,8 @@
1import { map, switchMap } from 'rxjs/operators' 1import { map, switchMap } from 'rxjs/operators'
2import { Component, OnInit } from '@angular/core' 2import { Component, HostListener, OnInit } from '@angular/core'
3import { ActivatedRoute, Router } from '@angular/router' 3import { ActivatedRoute, Router } from '@angular/router'
4import { LoadingBarService } from '@ngx-loading-bar/core' 4import { LoadingBarService } from '@ngx-loading-bar/core'
5import { NotificationsService } from 'angular2-notifications' 5import { Notifier } from '@app/core'
6import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos' 6import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos'
7import { ServerService } from '../../core' 7import { ServerService } from '../../core'
8import { FormReactive } from '../../shared' 8import { FormReactive } from '../../shared'
@@ -12,6 +12,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
12import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 12import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
13import { VideoCaptionService } from '@app/shared/video-caption' 13import { VideoCaptionService } from '@app/shared/video-caption'
14import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model' 14import { VideoCaptionEdit } from '@app/shared/video-caption/video-caption-edit.model'
15import { VideoDetails } from '@app/shared/video/video-details.model'
15 16
16@Component({ 17@Component({
17 selector: 'my-videos-update', 18 selector: 'my-videos-update',
@@ -26,6 +27,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
26 userVideoChannels: { id: number, label: string, support: string }[] = [] 27 userVideoChannels: { id: number, label: string, support: string }[] = []
27 schedulePublicationPossible = false 28 schedulePublicationPossible = false
28 videoCaptions: VideoCaptionEdit[] = [] 29 videoCaptions: VideoCaptionEdit[] = []
30 waitTranscodingEnabled = true
29 31
30 private updateDone = false 32 private updateDone = false
31 33
@@ -33,7 +35,7 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
33 protected formValidatorService: FormValidatorService, 35 protected formValidatorService: FormValidatorService,
34 private route: ActivatedRoute, 36 private route: ActivatedRoute,
35 private router: Router, 37 private router: Router,
36 private notificationsService: NotificationsService, 38 private notifier: Notifier,
37 private serverService: ServerService, 39 private serverService: ServerService,
38 private videoService: VideoService, 40 private videoService: VideoService,
39 private loadingBar: LoadingBarService, 41 private loadingBar: LoadingBarService,
@@ -65,25 +67,42 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
65 67
66 this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) 68 this.videoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies)
67 69
70 const videoFiles = (video as VideoDetails).files
71 if (videoFiles.length > 1) { // Already transcoded
72 this.waitTranscodingEnabled = false
73 }
74
68 // FIXME: Angular does not detect the change inside this subscription, so use the patched setTimeout 75 // FIXME: Angular does not detect the change inside this subscription, so use the patched setTimeout
69 setTimeout(() => this.hydrateFormFromVideo()) 76 setTimeout(() => this.hydrateFormFromVideo())
70 }, 77 },
71 78
72 err => { 79 err => {
73 console.error(err) 80 console.error(err)
74 this.notificationsService.error(this.i18n('Error'), err.message) 81 this.notifier.error(err.message)
75 } 82 }
76 ) 83 )
77 } 84 }
78 85
79 canDeactivate () { 86 @HostListener('window:beforeunload', [ '$event' ])
87 onUnload (event: any) {
88 const { text, canDeactivate } = this.canDeactivate()
89
90 if (canDeactivate) return
91
92 event.returnValue = text
93 return text
94 }
95
96 canDeactivate (): { canDeactivate: boolean, text?: string } {
80 if (this.updateDone === true) return { canDeactivate: true } 97 if (this.updateDone === true) return { canDeactivate: true }
81 98
99 const text = this.i18n('You have unsaved changes! If you leave, your changes will be lost.')
100
82 for (const caption of this.videoCaptions) { 101 for (const caption of this.videoCaptions) {
83 if (caption.action) return { canDeactivate: false } 102 if (caption.action) return { canDeactivate: false, text }
84 } 103 }
85 104
86 return { canDeactivate: this.formChanged === false } 105 return { canDeactivate: this.formChanged === false, text }
87 } 106 }
88 107
89 checkForm () { 108 checkForm () {
@@ -114,14 +133,14 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
114 this.updateDone = true 133 this.updateDone = true
115 this.isUpdatingVideo = false 134 this.isUpdatingVideo = false
116 this.loadingBar.complete() 135 this.loadingBar.complete()
117 this.notificationsService.success(this.i18n('Success'), this.i18n('Video updated.')) 136 this.notifier.success(this.i18n('Video updated.'))
118 this.router.navigate([ '/videos/watch', this.video.uuid ]) 137 this.router.navigate([ '/videos/watch', this.video.uuid ])
119 }, 138 },
120 139
121 err => { 140 err => {
122 this.loadingBar.complete() 141 this.loadingBar.complete()
123 this.isUpdatingVideo = false 142 this.isUpdatingVideo = false
124 this.notificationsService.error(this.i18n('Error'), err.message) 143 this.notifier.error(err.message)
125 console.error(err) 144 console.error(err)
126 } 145 }
127 ) 146 )
diff --git a/client/src/app/videos/+video-watch/comment/video-comment-add.component.html b/client/src/app/videos/+video-watch/comment/video-comment-add.component.html
index b58a56596..d8a7a78c4 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment-add.component.html
+++ b/client/src/app/videos/+video-watch/comment/video-comment-add.component.html
@@ -3,7 +3,7 @@
3 <img [src]="getAvatarUrl()" alt="Avatar" /> 3 <img [src]="getAvatarUrl()" alt="Avatar" />
4 4
5 <div class="form-group"> 5 <div class="form-group">
6 <textarea i18n-placeholder placeholder="Add comment..." autosize 6 <textarea i18n-placeholder placeholder="Add comment..." myAutoResize
7 [readonly]="(user === null) ? true : false" 7 [readonly]="(user === null) ? true : false"
8 (click)="openVisitorModal($event)" 8 (click)="openVisitorModal($event)"
9 formControlName="text" [ngClass]="{ 'input-error': formErrors['text'] }" 9 formControlName="text" [ngClass]="{ 'input-error': formErrors['text'] }"
diff --git a/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts b/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts
index fb7de0e04..fd85c28f2 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment-add.component.ts
@@ -1,6 +1,6 @@
1import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core' 1import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'
2import { Router } from '@angular/router' 2import { Router } from '@angular/router'
3import { NotificationsService } from 'angular2-notifications' 3import { Notifier } from '@app/core'
4import { Observable } from 'rxjs' 4import { Observable } from 'rxjs'
5import { VideoCommentCreate } from '../../../../../../shared/models/videos/video-comment.model' 5import { VideoCommentCreate } from '../../../../../../shared/models/videos/video-comment.model'
6import { FormReactive } from '../../../shared' 6import { FormReactive } from '../../../shared'
@@ -29,14 +29,14 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit {
29 @Output() commentCreated = new EventEmitter<VideoCommentCreate>() 29 @Output() commentCreated = new EventEmitter<VideoCommentCreate>()
30 30
31 @ViewChild('visitorModal') visitorModal: NgbModal 31 @ViewChild('visitorModal') visitorModal: NgbModal
32 @ViewChild('textarea') private textareaElement: ElementRef 32 @ViewChild('textarea') textareaElement: ElementRef
33 33
34 private addingComment = false 34 addingComment = false
35 35
36 constructor ( 36 constructor (
37 protected formValidatorService: FormValidatorService, 37 protected formValidatorService: FormValidatorService,
38 private videoCommentValidatorsService: VideoCommentValidatorsService, 38 private videoCommentValidatorsService: VideoCommentValidatorsService,
39 private notificationsService: NotificationsService, 39 private notifier: Notifier,
40 private videoCommentService: VideoCommentService, 40 private videoCommentService: VideoCommentService,
41 private authService: AuthService, 41 private authService: AuthService,
42 private modalService: NgbModal, 42 private modalService: NgbModal,
@@ -70,13 +70,13 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit {
70 } 70 }
71 71
72 onValidKey () { 72 onValidKey () {
73 this.onValueChanged() 73 this.check()
74 if (!this.form.valid) return 74 if (!this.form.valid) return
75 75
76 this.formValidated() 76 this.formValidated()
77 } 77 }
78 78
79 openVisitorModal (event) { 79 openVisitorModal (event: any) {
80 if (this.user === null) { // we only open it for visitors 80 if (this.user === null) { // we only open it for visitors
81 // fixing ng-bootstrap ModalService and the "Expression Changed After It Has Been Checked" Error 81 // fixing ng-bootstrap ModalService and the "Expression Changed After It Has Been Checked" Error
82 event.srcElement.blur() 82 event.srcElement.blur()
@@ -115,7 +115,7 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit {
115 err => { 115 err => {
116 this.addingComment = false 116 this.addingComment = false
117 117
118 this.notificationsService.error(this.i18n('Error'), err.text) 118 this.notifier.error(err.text)
119 } 119 }
120 ) 120 )
121 } 121 }
@@ -135,7 +135,6 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit {
135 135
136 gotoLogin () { 136 gotoLogin () {
137 this.hideVisitorModal() 137 this.hideVisitorModal()
138 this.authService.redirectUrl = this.router.url
139 this.router.navigate([ '/login' ]) 138 this.router.navigate([ '/login' ])
140 } 139 }
141 140
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.component.scss b/client/src/app/videos/+video-watch/comment/video-comment.component.scss
index 84da5727e..731ecbf8f 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.component.scss
+++ b/client/src/app/videos/+video-watch/comment/video-comment.component.scss
@@ -41,7 +41,7 @@
41 } 41 }
42 42
43 .comment-date { 43 .comment-date {
44 color: #585858; 44 color: $grey-foreground-color;
45 margin-left: 10px; 45 margin-left: 10px;
46 } 46 }
47 } 47 }
@@ -69,7 +69,7 @@
69 69
70 .comment-action-reply, 70 .comment-action-reply,
71 .comment-action-delete { 71 .comment-action-delete {
72 color: #585858; 72 color: $grey-foreground-color;
73 cursor: pointer; 73 cursor: pointer;
74 margin-right: 10px; 74 margin-right: 10px;
75 75
@@ -108,4 +108,4 @@
108 .root-comment { 108 .root-comment {
109 font-size: 14px; 109 font-size: 14px;
110 } 110 }
111} \ No newline at end of file 111}
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.component.ts b/client/src/app/videos/+video-watch/comment/video-comment.component.ts
index e90008de9..aba7f9d1c 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.component.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.component.ts
@@ -1,11 +1,10 @@
1import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core' 1import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'
2import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
3import * as sanitizeHtml from 'sanitize-html'
4import { UserRight } from '../../../../../../shared/models/users' 2import { UserRight } from '../../../../../../shared/models/users'
5import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model' 3import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
6import { AuthService } from '../../../core/auth' 4import { AuthService } from '../../../core/auth'
7import { Video } from '../../../shared/video/video.model' 5import { Video } from '../../../shared/video/video.model'
8import { VideoComment } from './video-comment.model' 6import { VideoComment } from './video-comment.model'
7import { HtmlRendererService } from '@app/shared/renderer'
9 8
10@Component({ 9@Component({
11 selector: 'my-video-comment', 10 selector: 'my-video-comment',
@@ -26,10 +25,10 @@ export class VideoCommentComponent implements OnInit, OnChanges {
26 @Output() resetReply = new EventEmitter() 25 @Output() resetReply = new EventEmitter()
27 26
28 sanitizedCommentHTML = '' 27 sanitizedCommentHTML = ''
29 newParentComments = [] 28 newParentComments: VideoComment[] = []
30 29
31 constructor ( 30 constructor (
32 private linkifierService: LinkifierService, 31 private htmlRenderer: HtmlRendererService,
33 private authService: AuthService 32 private authService: AuthService
34 ) {} 33 ) {}
35 34
@@ -87,27 +86,7 @@ export class VideoCommentComponent implements OnInit, OnChanges {
87 } 86 }
88 87
89 private init () { 88 private init () {
90 // Convert possible markdown to html 89 this.sanitizedCommentHTML = this.htmlRenderer.toSafeHtml(this.comment.text)
91 const html = this.linkifierService.linkify(this.comment.text)
92
93 this.sanitizedCommentHTML = sanitizeHtml(html, {
94 allowedTags: [ 'a', 'p', 'span', 'br' ],
95 allowedSchemes: [ 'http', 'https' ],
96 allowedAttributes: {
97 'a': [ 'href', 'class', 'target' ]
98 },
99 transformTags: {
100 a: (tagName, attribs) => {
101 return {
102 tagName,
103 attribs: Object.assign(attribs, {
104 target: '_blank',
105 rel: 'noopener noreferrer'
106 })
107 }
108 }
109 }
110 })
111 90
112 this.newParentComments = this.parentComments.concat([ this.comment ]) 91 this.newParentComments = this.parentComments.concat([ this.comment ])
113 } 92 }
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.model.ts b/client/src/app/videos/+video-watch/comment/video-comment.model.ts
index fe591811e..824fb24c3 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.model.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.model.ts
@@ -14,7 +14,7 @@ export class VideoComment implements VideoCommentServerModel {
14 account: AccountInterface 14 account: AccountInterface
15 totalReplies: number 15 totalReplies: number
16 by: string 16 by: string
17 accountAvatarUrl 17 accountAvatarUrl: string
18 18
19 constructor (hash: VideoCommentServerModel) { 19 constructor (hash: VideoCommentServerModel) {
20 this.id = hash.id 20 this.id = hash.id
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.service.ts b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
index 9bcb4b7de..b8e5878c5 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.service.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
@@ -1,7 +1,7 @@
1import { catchError, map } from 'rxjs/operators' 1import { catchError, map } from 'rxjs/operators'
2import { HttpClient, HttpParams } from '@angular/common/http' 2import { HttpClient, HttpParams } from '@angular/common/http'
3import { Injectable } from '@angular/core' 3import { Injectable } from '@angular/core'
4import { lineFeedToHtml } from '@app/shared/misc/utils' 4import { objectLineFeedToHtml } from '@app/shared/misc/utils'
5import { Observable } from 'rxjs' 5import { Observable } from 'rxjs'
6import { ResultList, FeedFormat } from '../../../../../../shared/models' 6import { ResultList, FeedFormat } from '../../../../../../shared/models'
7import { 7import {
@@ -28,22 +28,22 @@ export class VideoCommentService {
28 28
29 addCommentThread (videoId: number | string, comment: VideoCommentCreate) { 29 addCommentThread (videoId: number | string, comment: VideoCommentCreate) {
30 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads' 30 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
31 const normalizedComment = lineFeedToHtml(comment, 'text') 31 const normalizedComment = objectLineFeedToHtml(comment, 'text')
32 32
33 return this.authHttp.post(url, normalizedComment) 33 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
34 .pipe( 34 .pipe(
35 map(data => this.extractVideoComment(data['comment'])), 35 map(data => this.extractVideoComment(data.comment)),
36 catchError(err => this.restExtractor.handleError(err)) 36 catchError(err => this.restExtractor.handleError(err))
37 ) 37 )
38 } 38 }
39 39
40 addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) { 40 addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) {
41 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId 41 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId
42 const normalizedComment = lineFeedToHtml(comment, 'text') 42 const normalizedComment = objectLineFeedToHtml(comment, 'text')
43 43
44 return this.authHttp.post(url, normalizedComment) 44 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
45 .pipe( 45 .pipe(
46 map(data => this.extractVideoComment(data[ 'comment' ])), 46 map(data => this.extractVideoComment(data.comment)),
47 catchError(err => this.restExtractor.handleError(err)) 47 catchError(err => this.restExtractor.handleError(err))
48 ) 48 )
49 } 49 }
diff --git a/client/src/app/videos/+video-watch/comment/video-comments.component.html b/client/src/app/videos/+video-watch/comment/video-comments.component.html
index 42e129d65..44016d8ad 100644
--- a/client/src/app/videos/+video-watch/comment/video-comments.component.html
+++ b/client/src/app/videos/+video-watch/comment/video-comments.component.html
@@ -4,7 +4,7 @@
4 Comments 4 Comments
5 </div> 5 </div>
6 6
7 <my-video-feed [syndicationItems]="syndicationItems"></my-video-feed> 7 <my-feed [syndicationItems]="syndicationItems"></my-feed>
8 </div> 8 </div>
9 9
10 <ng-template [ngIf]="video.commentsEnabled === true"> 10 <ng-template [ngIf]="video.commentsEnabled === true">
diff --git a/client/src/app/videos/+video-watch/comment/video-comments.component.scss b/client/src/app/videos/+video-watch/comment/video-comments.component.scss
index dbb44c66c..575e331e4 100644
--- a/client/src/app/videos/+video-watch/comment/video-comments.component.scss
+++ b/client/src/app/videos/+video-watch/comment/video-comments.component.scss
@@ -23,7 +23,7 @@
23 margin-right: 0; 23 margin-right: 0;
24} 24}
25 25
26my-video-feed { 26my-feed {
27 display: inline-block; 27 display: inline-block;
28 margin-left: 5px; 28 margin-left: 5px;
29} 29}
diff --git a/client/src/app/videos/+video-watch/comment/video-comments.component.ts b/client/src/app/videos/+video-watch/comment/video-comments.component.ts
index c864d82b7..2616820d2 100644
--- a/client/src/app/videos/+video-watch/comment/video-comments.component.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comments.component.ts
@@ -1,17 +1,17 @@
1import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild, ElementRef } from '@angular/core' 1import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core'
2import { ActivatedRoute } from '@angular/router' 2import { ActivatedRoute } from '@angular/router'
3import { ConfirmService } from '@app/core' 3import { ConfirmService, Notifier } from '@app/core'
4import { NotificationsService } from 'angular2-notifications'
5import { Subscription } from 'rxjs' 4import { Subscription } from 'rxjs'
6import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model' 5import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
7import { AuthService } from '../../../core/auth' 6import { AuthService } from '../../../core/auth'
8import { ComponentPagination } from '../../../shared/rest/component-pagination.model' 7import { ComponentPagination, hasMoreItems } from '../../../shared/rest/component-pagination.model'
9import { User } from '../../../shared/users' 8import { User } from '../../../shared/users'
10import { VideoSortField } from '../../../shared/video/sort-field.type' 9import { VideoSortField } from '../../../shared/video/sort-field.type'
11import { VideoDetails } from '../../../shared/video/video-details.model' 10import { VideoDetails } from '../../../shared/video/video-details.model'
12import { VideoComment } from './video-comment.model' 11import { VideoComment } from './video-comment.model'
13import { VideoCommentService } from './video-comment.service' 12import { VideoCommentService } from './video-comment.service'
14import { I18n } from '@ngx-translate/i18n-polyfill' 13import { I18n } from '@ngx-translate/i18n-polyfill'
14import { Syndication } from '@app/shared/video/syndication.model'
15 15
16@Component({ 16@Component({
17 selector: 'my-video-comments', 17 selector: 'my-video-comments',
@@ -35,13 +35,13 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy {
35 threadComments: { [ id: number ]: VideoCommentThreadTree } = {} 35 threadComments: { [ id: number ]: VideoCommentThreadTree } = {}
36 threadLoading: { [ id: number ]: boolean } = {} 36 threadLoading: { [ id: number ]: boolean } = {}
37 37
38 syndicationItems = [] 38 syndicationItems: Syndication[] = []
39 39
40 private sub: Subscription 40 private sub: Subscription
41 41
42 constructor ( 42 constructor (
43 private authService: AuthService, 43 private authService: AuthService,
44 private notificationsService: NotificationsService, 44 private notifier: Notifier,
45 private confirmService: ConfirmService, 45 private confirmService: ConfirmService,
46 private videoCommentService: VideoCommentService, 46 private videoCommentService: VideoCommentService,
47 private activatedRoute: ActivatedRoute, 47 private activatedRoute: ActivatedRoute,
@@ -83,15 +83,11 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy {
83 this.highlightedThread = new VideoComment(res.comment) 83 this.highlightedThread = new VideoComment(res.comment)
84 84
85 // Scroll to the highlighted thread 85 // Scroll to the highlighted thread
86 setTimeout(() => { 86 setTimeout(() => this.commentHighlightBlock.nativeElement.scrollIntoView(), 0)
87 // -60 because of the fixed header
88 const scrollY = this.commentHighlightBlock.nativeElement.offsetTop - 60
89 window.scroll(0, scrollY)
90 }, 500)
91 } 87 }
92 }, 88 },
93 89
94 err => this.notificationsService.error(this.i18n('Error'), err.message) 90 err => this.notifier.error(err.message)
95 ) 91 )
96 } 92 }
97 93
@@ -103,7 +99,7 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy {
103 this.componentPagination.totalItems = res.totalComments 99 this.componentPagination.totalItems = res.totalComments
104 }, 100 },
105 101
106 err => this.notificationsService.error(this.i18n('Error'), err.message) 102 err => this.notifier.error(err.message)
107 ) 103 )
108 } 104 }
109 105
@@ -154,7 +150,7 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy {
154 if (this.highlightedThread.id === commentToDelete.id) this.highlightedThread = undefined 150 if (this.highlightedThread.id === commentToDelete.id) this.highlightedThread = undefined
155 }, 151 },
156 152
157 err => this.notificationsService.error(this.i18n('Error'), err.message) 153 err => this.notifier.error(err.message)
158 ) 154 )
159 } 155 }
160 156
@@ -165,22 +161,11 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy {
165 onNearOfBottom () { 161 onNearOfBottom () {
166 this.componentPagination.currentPage++ 162 this.componentPagination.currentPage++
167 163
168 if (this.hasMoreComments()) { 164 if (hasMoreItems(this.componentPagination)) {
169 this.loadMoreComments() 165 this.loadMoreComments()
170 } 166 }
171 } 167 }
172 168
173 private hasMoreComments () {
174 // No results
175 if (this.componentPagination.totalItems === 0) return false
176
177 // Not loaded yet
178 if (!this.componentPagination.totalItems) return true
179
180 const maxPage = this.componentPagination.totalItems / this.componentPagination.itemsPerPage
181 return maxPage > this.componentPagination.currentPage
182 }
183
184 private deleteLocalCommentThread (parentComment: VideoCommentThreadTree, commentToDelete: VideoComment) { 169 private deleteLocalCommentThread (parentComment: VideoCommentThreadTree, commentToDelete: VideoComment) {
185 for (const commentChild of parentComment.children) { 170 for (const commentChild of parentComment.children) {
186 if (commentChild.comment.id === commentToDelete.id) { 171 if (commentChild.comment.id === commentToDelete.id) {
diff --git a/client/src/app/videos/+video-watch/modal/video-blacklist.component.html b/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
index c436501b4..1a87bdcd4 100644
--- a/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Blacklist video</h4> 3 <h4 i18n class="modal-title">Blacklist video</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
@@ -15,6 +15,13 @@
15 </div> 15 </div>
16 </div> 16 </div>
17 17
18 <div class="form-group" *ngIf="video.isLocal">
19 <my-peertube-checkbox
20 inputName="unfederate" formControlName="unfederate"
21 i18n-labelText labelText="Unfederate the video (ask for its deletion from the remote instances)"
22 ></my-peertube-checkbox>
23 </div>
24
18 <div class="form-group inputs"> 25 <div class="form-group inputs">
19 <span i18n class="action-button action-button-cancel" (click)="hide()"> 26 <span i18n class="action-button action-button-cancel" (click)="hide()">
20 Cancel 27 Cancel
diff --git a/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts b/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
index 2c123ebed..50a7cadd1 100644
--- a/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
@@ -1,12 +1,11 @@
1import { Component, Input, OnInit, ViewChild } from '@angular/core' 1import { Component, Input, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier, RedirectService } from '@app/core'
3import { FormReactive, VideoBlacklistService, VideoBlacklistValidatorsService } from '../../../shared/index' 3import { FormReactive, VideoBlacklistService, VideoBlacklistValidatorsService } from '../../../shared/index'
4import { VideoDetails } from '../../../shared/video/video-details.model' 4import { VideoDetails } from '../../../shared/video/video-details.model'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
6import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 6import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
7import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 7import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
8import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref' 8import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
9import { RedirectService } from '@app/core'
10 9
11@Component({ 10@Component({
12 selector: 'my-video-blacklist', 11 selector: 'my-video-blacklist',
@@ -27,7 +26,7 @@ export class VideoBlacklistComponent extends FormReactive implements OnInit {
27 private modalService: NgbModal, 26 private modalService: NgbModal,
28 private videoBlacklistValidatorsService: VideoBlacklistValidatorsService, 27 private videoBlacklistValidatorsService: VideoBlacklistValidatorsService,
29 private videoBlacklistService: VideoBlacklistService, 28 private videoBlacklistService: VideoBlacklistService,
30 private notificationsService: NotificationsService, 29 private notifier: Notifier,
31 private redirectService: RedirectService, 30 private redirectService: RedirectService,
32 private i18n: I18n 31 private i18n: I18n
33 ) { 32 ) {
@@ -35,9 +34,12 @@ export class VideoBlacklistComponent extends FormReactive implements OnInit {
35 } 34 }
36 35
37 ngOnInit () { 36 ngOnInit () {
37 const defaultValues = { unfederate: 'true' }
38
38 this.buildForm({ 39 this.buildForm({
39 reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON 40 reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON,
40 }) 41 unfederate: null
42 }, defaultValues)
41 } 43 }
42 44
43 show () { 45 show () {
@@ -51,16 +53,17 @@ export class VideoBlacklistComponent extends FormReactive implements OnInit {
51 53
52 blacklist () { 54 blacklist () {
53 const reason = this.form.value[ 'reason' ] || undefined 55 const reason = this.form.value[ 'reason' ] || undefined
56 const unfederate = this.video.isLocal ? this.form.value[ 'unfederate' ] : undefined
54 57
55 this.videoBlacklistService.blacklistVideo(this.video.id, reason) 58 this.videoBlacklistService.blacklistVideo(this.video.id, reason, unfederate)
56 .subscribe( 59 .subscribe(
57 () => { 60 () => {
58 this.notificationsService.success(this.i18n('Success'), this.i18n('Video blacklisted.')) 61 this.notifier.success(this.i18n('Video blacklisted.'))
59 this.hide() 62 this.hide()
60 this.redirectService.redirectToHomepage() 63 this.redirectService.redirectToHomepage()
61 }, 64 },
62 65
63 err => this.notificationsService.error(this.i18n('Error'), err.message) 66 err => this.notifier.error(err.message)
64 ) 67 )
65 } 68 }
66} 69}
diff --git a/client/src/app/videos/+video-watch/modal/video-download.component.html b/client/src/app/videos/+video-watch/modal/video-download.component.html
index f46f92a17..2bb5d6d37 100644
--- a/client/src/app/videos/+video-watch/modal/video-download.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-download.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Download video</h4> 3 <h4 i18n class="modal-title">Download video</h4>
4 <span class="close" aria-hidden="true" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/videos/+video-watch/modal/video-download.component.ts b/client/src/app/videos/+video-watch/modal/video-download.component.ts
index b1b2c0623..834385771 100644
--- a/client/src/app/videos/+video-watch/modal/video-download.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-download.component.ts
@@ -2,7 +2,7 @@ import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'
2import { VideoDetails } from '../../../shared/video/video-details.model' 2import { VideoDetails } from '../../../shared/video/video-details.model'
3import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 3import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { NotificationsService } from 'angular2-notifications' 5import { Notifier } from '@app/core'
6 6
7@Component({ 7@Component({
8 selector: 'my-video-download', 8 selector: 'my-video-download',
@@ -18,7 +18,7 @@ export class VideoDownloadComponent implements OnInit {
18 resolutionId: number | string = -1 18 resolutionId: number | string = -1
19 19
20 constructor ( 20 constructor (
21 private notificationsService: NotificationsService, 21 private notifier: Notifier,
22 private modalService: NgbModal, 22 private modalService: NgbModal,
23 private i18n: I18n 23 private i18n: I18n
24 ) { } 24 ) { }
@@ -63,6 +63,6 @@ export class VideoDownloadComponent implements OnInit {
63 } 63 }
64 64
65 activateCopiedMessage () { 65 activateCopiedMessage () {
66 this.notificationsService.success(this.i18n('Success'), this.i18n('Copied')) 66 this.notifier.success(this.i18n('Copied'))
67 } 67 }
68} 68}
diff --git a/client/src/app/videos/+video-watch/modal/video-report.component.html b/client/src/app/videos/+video-watch/modal/video-report.component.html
index 8d9a49276..b9434da26 100644
--- a/client/src/app/videos/+video-watch/modal/video-report.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-report.component.html
@@ -1,11 +1,16 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Report video</h4> 3 <h4 i18n class="modal-title">Report video</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
8 8
9 <div i18n class="information">
10 Your report will be sent to moderators of {{ currentHost }}.
11 <ng-container *ngIf="isRemoteVideo()"> It will be forwarded to origin instance {{ originHost }} too.</ng-container>
12 </div>
13
9 <form novalidate [formGroup]="form" (ngSubmit)="report()"> 14 <form novalidate [formGroup]="form" (ngSubmit)="report()">
10 <div class="form-group"> 15 <div class="form-group">
11 <textarea i18n-placeholder placeholder="Reason..." formControlName="reason" [ngClass]="{ 'input-error': formErrors['reason'] }"> 16 <textarea i18n-placeholder placeholder="Reason..." formControlName="reason" [ngClass]="{ 'input-error': formErrors['reason'] }">
diff --git a/client/src/app/videos/+video-watch/modal/video-report.component.scss b/client/src/app/videos/+video-watch/modal/video-report.component.scss
index afcdb9a16..4713660a2 100644
--- a/client/src/app/videos/+video-watch/modal/video-report.component.scss
+++ b/client/src/app/videos/+video-watch/modal/video-report.component.scss
@@ -1,6 +1,10 @@
1@import 'variables'; 1@import 'variables';
2@import 'mixins'; 2@import 'mixins';
3 3
4.information {
5 margin-bottom: 20px;
6}
7
4textarea { 8textarea {
5 @include peertube-textarea(100%, 100px); 9 @include peertube-textarea(100%, 100px);
6} 10}
diff --git a/client/src/app/videos/+video-watch/modal/video-report.component.ts b/client/src/app/videos/+video-watch/modal/video-report.component.ts
index 297afb19f..911f3b447 100644
--- a/client/src/app/videos/+video-watch/modal/video-report.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-report.component.ts
@@ -1,5 +1,5 @@
1import { Component, Input, OnInit, ViewChild } from '@angular/core' 1import { Component, Input, OnInit, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { FormReactive, VideoAbuseService } from '../../../shared/index' 3import { FormReactive, VideoAbuseService } from '../../../shared/index'
4import { VideoDetails } from '../../../shared/video/video-details.model' 4import { VideoDetails } from '../../../shared/video/video-details.model'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -27,12 +27,24 @@ export class VideoReportComponent extends FormReactive implements OnInit {
27 private modalService: NgbModal, 27 private modalService: NgbModal,
28 private videoAbuseValidatorsService: VideoAbuseValidatorsService, 28 private videoAbuseValidatorsService: VideoAbuseValidatorsService,
29 private videoAbuseService: VideoAbuseService, 29 private videoAbuseService: VideoAbuseService,
30 private notificationsService: NotificationsService, 30 private notifier: Notifier,
31 private i18n: I18n 31 private i18n: I18n
32 ) { 32 ) {
33 super() 33 super()
34 } 34 }
35 35
36 get currentHost () {
37 return window.location.host
38 }
39
40 get originHost () {
41 if (this.isRemoteVideo()) {
42 return this.video.account.host
43 }
44
45 return ''
46 }
47
36 ngOnInit () { 48 ngOnInit () {
37 this.buildForm({ 49 this.buildForm({
38 reason: this.videoAbuseValidatorsService.VIDEO_ABUSE_REASON 50 reason: this.videoAbuseValidatorsService.VIDEO_ABUSE_REASON
@@ -54,11 +66,15 @@ export class VideoReportComponent extends FormReactive implements OnInit {
54 this.videoAbuseService.reportVideo(this.video.id, reason) 66 this.videoAbuseService.reportVideo(this.video.id, reason)
55 .subscribe( 67 .subscribe(
56 () => { 68 () => {
57 this.notificationsService.success(this.i18n('Success'), this.i18n('Video reported.')) 69 this.notifier.success(this.i18n('Video reported.'))
58 this.hide() 70 this.hide()
59 }, 71 },
60 72
61 err => this.notificationsService.error(this.i18n('Error'), err.message) 73 err => this.notifier.error(err.message)
62 ) 74 )
63 } 75 }
76
77 isRemoteVideo () {
78 return !this.video.isLocal
79 }
64} 80}
diff --git a/client/src/app/videos/+video-watch/modal/video-share.component.html b/client/src/app/videos/+video-watch/modal/video-share.component.html
index 301f67f2d..9f3c37fe8 100644
--- a/client/src/app/videos/+video-watch/modal/video-share.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-share.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Share</h4> 3 <h4 i18n class="modal-title">Share</h4>
4 <span class="close" aria-hidden="true" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/videos/+video-watch/modal/video-share.component.ts b/client/src/app/videos/+video-watch/modal/video-share.component.ts
index 17e2b31e1..c6205e355 100644
--- a/client/src/app/videos/+video-watch/modal/video-share.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-share.component.ts
@@ -1,5 +1,5 @@
1import { Component, ElementRef, Input, ViewChild } from '@angular/core' 1import { Component, ElementRef, Input, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications' 2import { Notifier } from '@app/core'
3import { VideoDetails } from '../../../shared/video/video-details.model' 3import { VideoDetails } from '../../../shared/video/video-details.model'
4import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils' 4import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils'
5import { I18n } from '@ngx-translate/i18n-polyfill' 5import { I18n } from '@ngx-translate/i18n-polyfill'
@@ -23,7 +23,7 @@ export class VideoShareComponent {
23 23
24 constructor ( 24 constructor (
25 private modalService: NgbModal, 25 private modalService: NgbModal,
26 private notificationsService: NotificationsService, 26 private notifier: Notifier,
27 private i18n: I18n 27 private i18n: I18n
28 ) { } 28 ) { }
29 29
@@ -49,7 +49,7 @@ export class VideoShareComponent {
49 } 49 }
50 50
51 activateCopiedMessage () { 51 activateCopiedMessage () {
52 this.notificationsService.success(this.i18n('Success'), this.i18n('Copied')) 52 this.notifier.success(this.i18n('Copied'))
53 } 53 }
54 54
55 getStartCheckboxLabel () { 55 getStartCheckboxLabel () {
diff --git a/client/src/app/videos/+video-watch/modal/video-support.component.html b/client/src/app/videos/+video-watch/modal/video-support.component.html
index 00c304709..2a05224a8 100644
--- a/client/src/app/videos/+video-watch/modal/video-support.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-support.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Support</h4> 3 <h4 i18n class="modal-title">Support</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body" [innerHTML]="videoHTMLSupport"></div> 7 <div class="modal-body" [innerHTML]="videoHTMLSupport"></div>
diff --git a/client/src/app/videos/+video-watch/modal/video-support.component.ts b/client/src/app/videos/+video-watch/modal/video-support.component.ts
index 154002120..deb8fbc67 100644
--- a/client/src/app/videos/+video-watch/modal/video-support.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-support.component.ts
@@ -1,8 +1,7 @@
1import { Component, Input, ViewChild } from '@angular/core' 1import { Component, Input, ViewChild } from '@angular/core'
2import { MarkdownService } from '@app/videos/shared'
3
4import { VideoDetails } from '../../../shared/video/video-details.model' 2import { VideoDetails } from '../../../shared/video/video-details.model'
5import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 3import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
4import { MarkdownService } from '@app/shared/renderer'
6 5
7@Component({ 6@Component({
8 selector: 'my-video-support', 7 selector: 'my-video-support',
diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html
index ba04d638f..1875230d8 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.html
+++ b/client/src/app/videos/+video-watch/video-watch.component.html
@@ -53,55 +53,57 @@
53 <div 53 <div
54 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()" 54 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()"
55 class="action-button action-button-like" role="button" [attr.aria-pressed]="userRating === 'like'" 55 class="action-button action-button-like" role="button" [attr.aria-pressed]="userRating === 'like'"
56 i18n-title title="Like this video"
56 > 57 >
57 <span class="icon icon-like" i18n-title title="Like this video" ></span> 58 <my-global-icon iconName="like"></my-global-icon>
58 </div> 59 </div>
59 60
60 <div 61 <div
61 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()" 62 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()"
62 class="action-button action-button-dislike" role="button" [attr.aria-pressed]="userRating === 'dislike'" 63 class="action-button action-button-dislike" role="button" [attr.aria-pressed]="userRating === 'dislike'"
64 i18n-title title="Dislike this video"
63 > 65 >
64 <span class="icon icon-dislike" i18n-title title="Dislike this video"></span> 66 <my-global-icon iconName="dislike"></my-global-icon>
65 </div> 67 </div>
66 68
67 <div *ngIf="video.support" (click)="showSupportModal()" class="action-button action-button-support"> 69 <div *ngIf="video.support" (click)="showSupportModal()" class="action-button action-button-support">
68 <span class="icon icon-support"></span> 70 <my-global-icon iconName="heart"></my-global-icon>
69 <span class="icon-text" i18n>Support</span> 71 <span class="icon-text" i18n>Support</span>
70 </div> 72 </div>
71 73
72 <div (click)="showShareModal()" class="action-button action-button-share" role="button"> 74 <div (click)="showShareModal()" class="action-button action-button-share" role="button">
73 <span class="icon icon-share"></span> 75 <my-global-icon iconName="share"></my-global-icon>
74 <span class="icon-text" i18n>Share</span> 76 <span class="icon-text" i18n>Share</span>
75 </div> 77 </div>
76 78
77 <div class="action-more" ngbDropdown placement="top" role="button"> 79 <div class="action-more" ngbDropdown placement="top" role="button">
78 <div class="action-button" ngbDropdownToggle role="button"> 80 <div class="action-button" ngbDropdownToggle role="button">
79 <span class="icon icon-more"></span> 81 <my-global-icon class="more-icon" iconName="more"></my-global-icon>
80 </div> 82 </div>
81 83
82 <div ngbDropdownMenu> 84 <div ngbDropdownMenu>
83 <a *ngIf="isVideoDownloadable()" class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)"> 85 <a *ngIf="isVideoDownloadable()" class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
84 <span class="icon icon-download"></span> <ng-container i18n>Download</ng-container> 86 <my-global-icon iconName="download"></my-global-icon> <ng-container i18n>Download</ng-container>
85 </a> 87 </a>
86 88
87 <a *ngIf="isUserLoggedIn()" class="dropdown-item" i18n-title title="Report this video" href="#" (click)="showReportModal($event)"> 89 <a *ngIf="isUserLoggedIn()" class="dropdown-item" i18n-title title="Report this video" href="#" (click)="showReportModal($event)">
88 <span class="icon icon-alert"></span> <ng-container i18n>Report</ng-container> 90 <my-global-icon iconName="alert"></my-global-icon> <ng-container i18n>Report</ng-container>
89 </a> 91 </a>
90 92
91 <a *ngIf="isVideoUpdatable()" class="dropdown-item" i18n-title title="Update this video" href="#" [routerLink]="[ '/videos/update', video.uuid ]"> 93 <a *ngIf="isVideoUpdatable()" class="dropdown-item" i18n-title title="Update this video" href="#" [routerLink]="[ '/videos/update', video.uuid ]">
92 <span class="icon icon-edit"></span> <ng-container i18n>Update</ng-container> 94 <my-global-icon iconName="edit"></my-global-icon> <ng-container i18n>Update</ng-container>
93 </a> 95 </a>
94 96
95 <a *ngIf="isVideoBlacklistable()" class="dropdown-item" i18n-title title="Blacklist this video" href="#" (click)="showBlacklistModal($event)"> 97 <a *ngIf="isVideoBlacklistable()" class="dropdown-item" i18n-title title="Blacklist this video" href="#" (click)="showBlacklistModal($event)">
96 <span class="icon icon-blacklist"></span> <ng-container i18n>Blacklist</ng-container> 98 <my-global-icon iconName="no"></my-global-icon> <ng-container i18n>Blacklist</ng-container>
97 </a> 99 </a>
98 100
99 <a *ngIf="isVideoUnblacklistable()" class="dropdown-item" i18n-title title="Unblacklist this video" href="#" (click)="unblacklistVideo($event)"> 101 <a *ngIf="isVideoUnblacklistable()" class="dropdown-item" i18n-title title="Unblacklist this video" href="#" (click)="unblacklistVideo($event)">
100 <span class="icon icon-unblacklist"></span> <ng-container i18n>Unblacklist</ng-container> 102 <my-global-icon iconName="undo"></my-global-icon> <ng-container i18n>Unblacklist</ng-container>
101 </a> 103 </a>
102 104
103 <a *ngIf="isVideoRemovable()" class="dropdown-item" i18n-title title="Delete this video" href="#" (click)="removeVideo($event)"> 105 <a *ngIf="isVideoRemovable()" class="dropdown-item" i18n-title title="Delete this video" href="#" (click)="removeVideo($event)">
104 <span class="icon icon-delete"></span> <ng-container i18n>Delete</ng-container> 106 <my-global-icon iconName="delete"></my-global-icon> <ng-container i18n>Delete</ng-container>
105 </a> 107 </a>
106 </div> 108 </div>
107 </div> 109 </div>
diff --git a/client/src/app/videos/+video-watch/video-watch.component.scss b/client/src/app/videos/+video-watch/video-watch.component.scss
index f31e4694a..b03ed197d 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.scss
+++ b/client/src/app/videos/+video-watch/video-watch.component.scss
@@ -162,7 +162,7 @@ $other-videos-width: 260px;
162 } 162 }
163 } 163 }
164 164
165 my-video-feed { 165 my-feed {
166 margin-left: 5px; 166 margin-left: 5px;
167 margin-top: 1px; 167 margin-top: 1px;
168 } 168 }
@@ -183,6 +183,8 @@ $other-videos-width: 260px;
183 .action-button { 183 .action-button {
184 @include peertube-button; 184 @include peertube-button;
185 @include grey-button; 185 @include grey-button;
186 @include button-with-icon(21px, 0, -1px);
187 @include apply-svg-color($grey-foreground-color);
186 188
187 font-size: 15px; 189 font-size: 15px;
188 font-weight: $font-semibold; 190 font-weight: $font-semibold;
@@ -194,53 +196,25 @@ $other-videos-width: 260px;
194 display: none; 196 display: none;
195 } 197 }
196 198
197 .icon {
198 @include icon(21px);
199
200 position: relative;
201 top: -2px;
202
203 &.icon-like {
204 background-image: url('../../../assets/images/video/like-grey.svg');
205 }
206
207 &.icon-dislike {
208 background-image: url('../../../assets/images/video/dislike-grey.svg');
209 }
210
211 &.icon-support {
212 background-image: url('../../../assets/images/video/heart.svg');
213 }
214
215 &.icon-share {
216 background-image: url('../../../assets/images/video/share.svg');
217 }
218
219 &.icon-more {
220 background-image: url('../../../assets/images/video/more.svg');
221 top: -1px;
222 }
223 }
224
225 .icon-text {
226 margin-left: 3px;
227 }
228
229 &.action-button-like.activated { 199 &.action-button-like.activated {
230 background-color: $green; 200 background-color: $green;
231 201
232 .icon-like { 202 my-global-icon {
233 background-image: url('../../../assets/images/video/like-white.svg'); 203 @include apply-svg-color(#fff);
234 } 204 }
235 } 205 }
236 206
237 &.action-button-dislike.activated { 207 &.action-button-dislike.activated {
238 background-color: $red; 208 background-color: $red;
239 209
240 .icon-dislike { 210 my-global-icon {
241 background-image: url('../../../assets/images/video/dislike-white.svg'); 211 @include apply-svg-color(#fff);
242 } 212 }
243 } 213 }
214
215 .icon-text {
216 margin-left: 3px;
217 }
244 } 218 }
245 219
246 .action-more { 220 .action-more {
@@ -249,36 +223,12 @@ $other-videos-width: 260px;
249 .dropdown-menu .dropdown-item { 223 .dropdown-menu .dropdown-item {
250 padding: 6px 24px; 224 padding: 6px 24px;
251 225
252 .icon { 226 my-global-icon {
253 @include icon(24px); 227 width: 24px;
254 228
255 margin-right: 10px; 229 margin-right: 10px;
256 position: relative; 230 position: relative;
257 top: -1px; 231 top: -2px;
258
259 &.icon-download {
260 background-image: url('../../../assets/images/video/download-black.svg');
261 }
262
263 &.icon-edit {
264 background-image: url('../../../assets/images/global/edit-black.svg');
265 }
266
267 &.icon-alert {
268 background-image: url('../../../assets/images/video/alert.svg');
269 }
270
271 &.icon-blacklist {
272 background-image: url('../../../assets/images/video/blacklist.svg');
273 }
274
275 &.icon-unblacklist {
276 background-image: url('../../../assets/images/global/undo.svg');
277 }
278
279 &.icon-delete {
280 background-image: url('../../../assets/images/global/delete-black.svg');
281 }
282 } 232 }
283 } 233 }
284 } 234 }
@@ -320,7 +270,7 @@ $other-videos-width: 260px;
320 .video-info-description-more { 270 .video-info-description-more {
321 cursor: pointer; 271 cursor: pointer;
322 font-weight: $font-semibold; 272 font-weight: $font-semibold;
323 color: #585858; 273 color: $grey-foreground-color;
324 font-size: 14px; 274 font-size: 14px;
325 275
326 .glyphicon { 276 .glyphicon {
@@ -339,7 +289,7 @@ $other-videos-width: 260px;
339 min-width: 91px; 289 min-width: 91px;
340 padding-right: 5px; 290 padding-right: 5px;
341 display: inline-block; 291 display: inline-block;
342 color: #585858; 292 color: $grey-foreground-color;
343 font-weight: $font-bold; 293 font-weight: $font-bold;
344 } 294 }
345 295
diff --git a/client/src/app/videos/+video-watch/video-watch.component.ts b/client/src/app/videos/+video-watch/video-watch.component.ts
index a7fd45695..4dbfa41e5 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.ts
+++ b/client/src/app/videos/+video-watch/video-watch.component.ts
@@ -5,30 +5,29 @@ import { RedirectService } from '@app/core/routing/redirect.service'
5import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage' 5import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
6import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component' 6import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component'
7import { MetaService } from '@ngx-meta/core' 7import { MetaService } from '@ngx-meta/core'
8import { NotificationsService } from 'angular2-notifications' 8import { Notifier, ServerService } from '@app/core'
9import { forkJoin, Subscription } from 'rxjs' 9import { forkJoin, Subscription } from 'rxjs'
10import * as videojs from 'video.js'
11import 'videojs-hotkeys'
12import { Hotkey, HotkeysService } from 'angular2-hotkeys' 10import { Hotkey, HotkeysService } from 'angular2-hotkeys'
13import * as WebTorrent from 'webtorrent' 11import { UserVideoRateType, VideoCaption, VideoPrivacy, VideoState } from '../../../../../shared'
14import { UserVideoRateType, VideoCaption, VideoPrivacy, VideoRateType, VideoState } from '../../../../../shared'
15import '../../../assets/player/peertube-videojs-plugin'
16import { AuthService, ConfirmService } from '../../core' 12import { AuthService, ConfirmService } from '../../core'
17import { RestExtractor, VideoBlacklistService } from '../../shared' 13import { RestExtractor, VideoBlacklistService } from '../../shared'
18import { VideoDetails } from '../../shared/video/video-details.model' 14import { VideoDetails } from '../../shared/video/video-details.model'
19import { VideoService } from '../../shared/video/video.service' 15import { VideoService } from '../../shared/video/video.service'
20import { MarkdownService } from '../shared'
21import { VideoDownloadComponent } from './modal/video-download.component' 16import { VideoDownloadComponent } from './modal/video-download.component'
22import { VideoReportComponent } from './modal/video-report.component' 17import { VideoReportComponent } from './modal/video-report.component'
23import { VideoShareComponent } from './modal/video-share.component' 18import { VideoShareComponent } from './modal/video-share.component'
24import { VideoBlacklistComponent } from './modal/video-blacklist.component' 19import { VideoBlacklistComponent } from './modal/video-blacklist.component'
25import { SubscribeButtonComponent } from '@app/shared/user-subscription/subscribe-button.component' 20import { SubscribeButtonComponent } from '@app/shared/user-subscription/subscribe-button.component'
26import { addContextMenu, getVideojsOptions, loadLocaleInVideoJS } from '../../../assets/player/peertube-player'
27import { ServerService } from '@app/core'
28import { I18n } from '@ngx-translate/i18n-polyfill' 21import { I18n } from '@ngx-translate/i18n-polyfill'
29import { environment } from '../../../environments/environment' 22import { environment } from '../../../environments/environment'
30import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
31import { VideoCaptionService } from '@app/shared/video-caption' 23import { VideoCaptionService } from '@app/shared/video-caption'
24import { MarkdownService } from '@app/shared/renderer'
25import {
26 P2PMediaLoaderOptions,
27 PeertubePlayerManager,
28 PeertubePlayerManagerOptions,
29 PlayerMode
30} from '../../../assets/player/peertube-player-manager'
32 31
33@Component({ 32@Component({
34 selector: 'my-video-watch', 33 selector: 'my-video-watch',
@@ -45,7 +44,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
45 @ViewChild('videoBlacklistModal') videoBlacklistModal: VideoBlacklistComponent 44 @ViewChild('videoBlacklistModal') videoBlacklistModal: VideoBlacklistComponent
46 @ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent 45 @ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
47 46
48 player: videojs.Player 47 player: any
49 playerElement: HTMLVideoElement 48 playerElement: HTMLVideoElement
50 userRating: UserVideoRateType = null 49 userRating: UserVideoRateType = null
51 video: VideoDetails = null 50 video: VideoDetails = null
@@ -60,7 +59,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
60 remoteServerDown = false 59 remoteServerDown = false
61 hotkeys: Hotkey[] 60 hotkeys: Hotkey[]
62 61
63 private videojsLocaleLoaded = false
64 private paramsSub: Subscription 62 private paramsSub: Subscription
65 63
66 constructor ( 64 constructor (
@@ -75,7 +73,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
75 private authService: AuthService, 73 private authService: AuthService,
76 private serverService: ServerService, 74 private serverService: ServerService,
77 private restExtractor: RestExtractor, 75 private restExtractor: RestExtractor,
78 private notificationsService: NotificationsService, 76 private notifier: Notifier,
79 private markdownService: MarkdownService, 77 private markdownService: MarkdownService,
80 private zone: NgZone, 78 private zone: NgZone,
81 private redirectService: RedirectService, 79 private redirectService: RedirectService,
@@ -91,7 +89,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
91 89
92 ngOnInit () { 90 ngOnInit () {
93 if ( 91 if (
94 WebTorrent.WEBRTC_SUPPORT === false || 92 !!((window as any).RTCPeerConnection || (window as any).mozRTCPeerConnection || (window as any).webkitRTCPeerConnection) === false ||
95 peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true' 93 peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
96 ) { 94 ) {
97 this.hasAlreadyAcceptedPrivacyConcern = true 95 this.hasAlreadyAcceptedPrivacyConcern = true
@@ -112,11 +110,14 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
112 ) 110 )
113 .pipe( 111 .pipe(
114 // If 401, the video is private or blacklisted so redirect to 404 112 // If 401, the video is private or blacklisted so redirect to 404
115 catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 401, 404 ])) 113 catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 401, 403, 404 ]))
116 ) 114 )
117 .subscribe(([ video, captionsResult ]) => { 115 .subscribe(([ video, captionsResult ]) => {
118 const startTime = this.route.snapshot.queryParams.start 116 const startTime = this.route.snapshot.queryParams.start
119 this.onVideoFetched(video, captionsResult.data, startTime) 117 const subtitle = this.route.snapshot.queryParams.subtitle
118 const playerMode = this.route.snapshot.queryParams.mode
119
120 this.onVideoFetched(video, captionsResult.data, { startTime, subtitle, playerMode })
120 .catch(err => this.handleError(err)) 121 .catch(err => this.handleError(err))
121 }) 122 })
122 }) 123 })
@@ -201,7 +202,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
201 202
202 error => { 203 error => {
203 this.descriptionLoading = false 204 this.descriptionLoading = false
204 this.notificationsService.error(this.i18n('Error'), error.message) 205 this.notifier.error(error.message)
205 } 206 }
206 ) 207 )
207 } 208 }
@@ -243,16 +244,13 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
243 244
244 this.videoBlacklistService.removeVideoFromBlacklist(this.video.id).subscribe( 245 this.videoBlacklistService.removeVideoFromBlacklist(this.video.id).subscribe(
245 () => { 246 () => {
246 this.notificationsService.success( 247 this.notifier.success(this.i18n('Video {{name}} removed from the blacklist.', { name: this.video.name }))
247 this.i18n('Success'),
248 this.i18n('Video {{name}} removed from the blacklist.', { name: this.video.name })
249 )
250 248
251 this.video.blacklisted = false 249 this.video.blacklisted = false
252 this.video.blacklistedReason = null 250 this.video.blacklistedReason = null
253 }, 251 },
254 252
255 err => this.notificationsService.error(this.i18n('Error'), err.message) 253 err => this.notifier.error(err.message)
256 ) 254 )
257 } 255 }
258 256
@@ -290,17 +288,14 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
290 288
291 this.videoService.removeVideo(this.video.id) 289 this.videoService.removeVideo(this.video.id)
292 .subscribe( 290 .subscribe(
293 status => { 291 () => {
294 this.notificationsService.success( 292 this.notifier.success(this.i18n('Video {{videoName}} deleted.', { videoName: this.video.name }))
295 this.i18n('Success'),
296 this.i18n('Video {{videoName}} deleted.', { videoName: this.video.name })
297 )
298 293
299 // Go back to the video-list. 294 // Go back to the video-list.
300 this.redirectService.redirectToHomepage() 295 this.redirectService.redirectToHomepage()
301 }, 296 },
302 297
303 error => this.notificationsService.error(this.i18n('Error'), error.message) 298 error => this.notifier.error(error.message)
304 ) 299 )
305 } 300 }
306 301
@@ -354,7 +349,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
354 return 349 return
355 } 350 }
356 351
357 this.notificationsService.error(this.i18n('Error'), errorMessage) 352 this.notifier.error(errorMessage)
358 } 353 }
359 354
360 private checkUserRating () { 355 private checkUserRating () {
@@ -369,11 +364,15 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
369 } 364 }
370 }, 365 },
371 366
372 err => this.notificationsService.error(this.i18n('Error'), err.message) 367 err => this.notifier.error(err.message)
373 ) 368 )
374 } 369 }
375 370
376 private async onVideoFetched (video: VideoDetails, videoCaptions: VideoCaption[], startTimeFromUrl: number) { 371 private async onVideoFetched (
372 video: VideoDetails,
373 videoCaptions: VideoCaption[],
374 urlOptions: { startTime?: number, subtitle?: string, playerMode?: string }
375 ) {
377 this.video = video 376 this.video = video
378 377
379 // Re init attributes 378 // Re init attributes
@@ -381,8 +380,8 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
381 this.completeDescriptionShown = false 380 this.completeDescriptionShown = false
382 this.remoteServerDown = false 381 this.remoteServerDown = false
383 382
384 let startTime = startTimeFromUrl || (this.video.userHistory ? this.video.userHistory.currentTime : 0) 383 let startTime = urlOptions.startTime || (this.video.userHistory ? this.video.userHistory.currentTime : 0)
385 // Don't start the video if we are at the end 384 // If we are at the end of the video, reset the timer
386 if (this.video.duration - startTime <= 1) startTime = 0 385 if (this.video.duration - startTime <= 1) startTime = 0
387 386
388 if (this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig())) { 387 if (this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig())) {
@@ -409,40 +408,64 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
409 src: environment.apiUrl + c.captionPath 408 src: environment.apiUrl + c.captionPath
410 })) 409 }))
411 410
412 const videojsOptions = getVideojsOptions({ 411 const options: PeertubePlayerManagerOptions = {
413 autoplay: this.isAutoplay(), 412 common: {
414 inactivityTimeout: 2500, 413 autoplay: this.isAutoplay(),
415 videoFiles: this.video.files, 414
416 videoCaptions: playerCaptions, 415 playerElement: this.playerElement,
417 playerElement: this.playerElement, 416 onPlayerElementChange: (element: HTMLVideoElement) => this.playerElement = element,
418 videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null, 417
419 videoDuration: this.video.duration, 418 videoDuration: this.video.duration,
420 enableHotkeys: true, 419 enableHotkeys: true,
421 peertubeLink: false, 420 inactivityTimeout: 2500,
422 poster: this.video.previewUrl, 421 poster: this.video.previewUrl,
423 startTime, 422 startTime,
424 theaterMode: true, 423
425 language: this.localeId, 424 theaterMode: true,
426 425 captions: videoCaptions.length !== 0,
427 userWatching: this.user ? { 426 peertubeLink: false,
428 url: this.videoService.getUserWatchingVideoUrl(this.video.uuid), 427
429 authorizationHeader: this.authService.getRequestHeaderValue() 428 videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null,
430 } : undefined 429 embedUrl: this.video.embedUrl,
431 }) 430
431 language: this.localeId,
432
433 subtitle: urlOptions.subtitle,
434
435 userWatching: this.user && this.user.videosHistoryEnabled === true ? {
436 url: this.videoService.getUserWatchingVideoUrl(this.video.uuid),
437 authorizationHeader: this.authService.getRequestHeaderValue()
438 } : undefined,
432 439
433 if (this.videojsLocaleLoaded === false) { 440 serverUrl: environment.apiUrl,
434 await loadLocaleInVideoJS(environment.apiUrl, videojs, isOnDevLocale() ? getDevLocale() : this.localeId) 441
435 this.videojsLocaleLoaded = true 442 videoCaptions: playerCaptions
443 },
444
445 webtorrent: {
446 videoFiles: this.video.files
447 }
436 } 448 }
437 449
438 const self = this 450 const mode: PlayerMode = urlOptions.playerMode === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
439 this.zone.runOutsideAngular(async () => { 451
440 videojs(this.playerElement, videojsOptions, function () { 452 if (mode === 'p2p-media-loader') {
441 self.player = this 453 const hlsPlaylist = this.video.getHlsPlaylist()
442 this.on('customError', (event, data) => self.handleError(data.err))
443 454
444 addContextMenu(self.player, self.video.embedUrl) 455 const p2pMediaLoader = {
445 }) 456 playlistUrl: hlsPlaylist.playlistUrl,
457 segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
458 redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
459 trackerAnnounce: this.video.trackerUrls,
460 videoFiles: this.video.files
461 } as P2PMediaLoaderOptions
462
463 Object.assign(options, { p2pMediaLoader })
464 }
465
466 this.zone.runOutsideAngular(async () => {
467 this.player = await PeertubePlayerManager.initialize(mode, options)
468 this.player.on('customError', ({ err }: { err: any }) => this.handleError(err))
446 }) 469 })
447 470
448 this.setVideoDescriptionHTML() 471 this.setVideoDescriptionHTML()
@@ -452,7 +475,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
452 this.checkUserRating() 475 this.checkUserRating()
453 } 476 }
454 477
455 private setRating (nextRating) { 478 private setRating (nextRating: UserVideoRateType) {
456 let method 479 let method
457 switch (nextRating) { 480 switch (nextRating) {
458 case 'like': 481 case 'like':
@@ -474,11 +497,11 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
474 this.userRating = nextRating 497 this.userRating = nextRating
475 }, 498 },
476 499
477 err => this.notificationsService.error(this.i18n('Error'), err.message) 500 (err: { message: string }) => this.notifier.error(err.message)
478 ) 501 )
479 } 502 }
480 503
481 private updateVideoRating (oldRating: UserVideoRateType, newRating: VideoRateType) { 504 private updateVideoRating (oldRating: UserVideoRateType, newRating: UserVideoRateType) {
482 let likesToIncrement = 0 505 let likesToIncrement = 0
483 let dislikesToIncrement = 0 506 let dislikesToIncrement = 0
484 507
diff --git a/client/src/app/videos/+video-watch/video-watch.module.ts b/client/src/app/videos/+video-watch/video-watch.module.ts
index 5582ab40f..2f448db78 100644
--- a/client/src/app/videos/+video-watch/video-watch.module.ts
+++ b/client/src/app/videos/+video-watch/video-watch.module.ts
@@ -1,9 +1,7 @@
1import { NgModule } from '@angular/core' 1import { NgModule } from '@angular/core'
2import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
3import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component' 2import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component'
4import { ClipboardModule } from 'ngx-clipboard' 3import { ClipboardModule } from 'ngx-clipboard'
5import { SharedModule } from '../../shared' 4import { SharedModule } from '../../shared'
6import { MarkdownService } from '../shared'
7import { VideoCommentAddComponent } from './comment/video-comment-add.component' 5import { VideoCommentAddComponent } from './comment/video-comment-add.component'
8import { VideoCommentComponent } from './comment/video-comment.component' 6import { VideoCommentComponent } from './comment/video-comment.component'
9import { VideoCommentService } from './comment/video-comment.service' 7import { VideoCommentService } from './comment/video-comment.service'
@@ -17,7 +15,6 @@ import { NgxQRCodeModule } from 'ngx-qrcode2'
17import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap' 15import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'
18import { VideoBlacklistComponent } from '@app/videos/+video-watch/modal/video-blacklist.component' 16import { VideoBlacklistComponent } from '@app/videos/+video-watch/modal/video-blacklist.component'
19import { RecommendationsModule } from '@app/videos/recommendations/recommendations.module' 17import { RecommendationsModule } from '@app/videos/recommendations/recommendations.module'
20import { TextareaAutosizeModule } from 'ngx-textarea-autosize'
21 18
22@NgModule({ 19@NgModule({
23 imports: [ 20 imports: [
@@ -26,7 +23,6 @@ import { TextareaAutosizeModule } from 'ngx-textarea-autosize'
26 ClipboardModule, 23 ClipboardModule,
27 NgbTooltipModule, 24 NgbTooltipModule,
28 NgxQRCodeModule, 25 NgxQRCodeModule,
29 TextareaAutosizeModule,
30 RecommendationsModule 26 RecommendationsModule
31 ], 27 ],
32 28
@@ -48,8 +44,6 @@ import { TextareaAutosizeModule } from 'ngx-textarea-autosize'
48 ], 44 ],
49 45
50 providers: [ 46 providers: [
51 MarkdownService,
52 LinkifierService,
53 VideoCommentService 47 VideoCommentService
54 ] 48 ]
55}) 49})
diff --git a/client/src/app/videos/shared/index.ts b/client/src/app/videos/shared/index.ts
deleted file mode 100644
index 7a66944b9..000000000
--- a/client/src/app/videos/shared/index.ts
+++ /dev/null
@@ -1 +0,0 @@
1export * from './markdown.service'
diff --git a/client/src/app/videos/video-list/video-local.component.ts b/client/src/app/videos/video-list/video-local.component.ts
index c91c639ca..c0be4b885 100644
--- a/client/src/app/videos/video-list/video-local.component.ts
+++ b/client/src/app/videos/video-list/video-local.component.ts
@@ -2,7 +2,6 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { immutableAssign } from '@app/shared/misc/utils' 3import { immutableAssign } from '@app/shared/misc/utils'
4import { Location } from '@angular/common' 4import { Location } from '@angular/common'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { AbstractVideoList } from '../../shared/video/abstract-video-list' 6import { AbstractVideoList } from '../../shared/video/abstract-video-list'
8import { VideoSortField } from '../../shared/video/sort-field.type' 7import { VideoSortField } from '../../shared/video/sort-field.type'
@@ -10,6 +9,8 @@ import { VideoService } from '../../shared/video/video.service'
10import { VideoFilter } from '../../../../../shared/models/videos/video-query.type' 9import { VideoFilter } from '../../../../../shared/models/videos/video-query.type'
11import { I18n } from '@ngx-translate/i18n-polyfill' 10import { I18n } from '@ngx-translate/i18n-polyfill'
12import { ScreenService } from '@app/shared/misc/screen.service' 11import { ScreenService } from '@app/shared/misc/screen.service'
12import { UserRight } from '../../../../../shared/models/users'
13import { Notifier } from '@app/core'
13 14
14@Component({ 15@Component({
15 selector: 'my-videos-local', 16 selector: 'my-videos-local',
@@ -25,7 +26,7 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On
25 constructor ( 26 constructor (
26 protected router: Router, 27 protected router: Router,
27 protected route: ActivatedRoute, 28 protected route: ActivatedRoute,
28 protected notificationsService: NotificationsService, 29 protected notifier: Notifier,
29 protected authService: AuthService, 30 protected authService: AuthService,
30 protected location: Location, 31 protected location: Location,
31 protected i18n: I18n, 32 protected i18n: I18n,
@@ -40,6 +41,11 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On
40 ngOnInit () { 41 ngOnInit () {
41 super.ngOnInit() 42 super.ngOnInit()
42 43
44 if (this.authService.isLoggedIn()) {
45 const user = this.authService.getUser()
46 this.displayModerationBlock = user.hasRight(UserRight.SEE_ALL_VIDEOS)
47 }
48
43 this.generateSyndicationList() 49 this.generateSyndicationList()
44 } 50 }
45 51
@@ -56,4 +62,10 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On
56 generateSyndicationList () { 62 generateSyndicationList () {
57 this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, this.filter, this.categoryOneOf) 63 this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, this.filter, this.categoryOneOf)
58 } 64 }
65
66 toggleModerationDisplay () {
67 this.filter = this.filter === 'local' ? 'all-local' as 'all-local' : 'local' as 'local'
68
69 this.reloadVideos()
70 }
59} 71}
diff --git a/client/src/app/videos/video-list/video-overview.component.ts b/client/src/app/videos/video-list/video-overview.component.ts
index 2c6054721..7ff52b259 100644
--- a/client/src/app/videos/video-list/video-overview.component.ts
+++ b/client/src/app/videos/video-list/video-overview.component.ts
@@ -1,6 +1,5 @@
1import { Component, OnInit } from '@angular/core' 1import { Component, OnInit } from '@angular/core'
2import { AuthService } from '@app/core' 2import { AuthService, Notifier } from '@app/core'
3import { NotificationsService } from 'angular2-notifications'
4import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
5import { VideosOverview } from '@app/shared/overview/videos-overview.model' 4import { VideosOverview } from '@app/shared/overview/videos-overview.model'
6import { OverviewService } from '@app/shared/overview' 5import { OverviewService } from '@app/shared/overview'
@@ -21,7 +20,7 @@ export class VideoOverviewComponent implements OnInit {
21 20
22 constructor ( 21 constructor (
23 private i18n: I18n, 22 private i18n: I18n,
24 private notificationsService: NotificationsService, 23 private notifier: Notifier,
25 private authService: AuthService, 24 private authService: AuthService,
26 private overviewService: OverviewService 25 private overviewService: OverviewService
27 ) { } 26 ) { }
@@ -43,10 +42,7 @@ export class VideoOverviewComponent implements OnInit {
43 ) this.notResults = true 42 ) this.notResults = true
44 }, 43 },
45 44
46 err => { 45 err => this.notifier.error(err.message)
47 console.log(err)
48 this.notificationsService.error('Error', err.text)
49 }
50 ) 46 )
51 } 47 }
52 48
diff --git a/client/src/app/videos/video-list/video-recently-added.component.ts b/client/src/app/videos/video-list/video-recently-added.component.ts
index ac1fcfff3..f99c8abb6 100644
--- a/client/src/app/videos/video-list/video-recently-added.component.ts
+++ b/client/src/app/videos/video-list/video-recently-added.component.ts
@@ -2,13 +2,13 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { Location } from '@angular/common' 3import { Location } from '@angular/common'
4import { immutableAssign } from '@app/shared/misc/utils' 4import { immutableAssign } from '@app/shared/misc/utils'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { AbstractVideoList } from '../../shared/video/abstract-video-list' 6import { AbstractVideoList } from '../../shared/video/abstract-video-list'
8import { VideoSortField } from '../../shared/video/sort-field.type' 7import { VideoSortField } from '../../shared/video/sort-field.type'
9import { VideoService } from '../../shared/video/video.service' 8import { VideoService } from '../../shared/video/video.service'
10import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
11import { ScreenService } from '@app/shared/misc/screen.service' 10import { ScreenService } from '@app/shared/misc/screen.service'
11import { Notifier } from '@app/core'
12 12
13@Component({ 13@Component({
14 selector: 'my-videos-recently-added', 14 selector: 'my-videos-recently-added',
@@ -24,7 +24,7 @@ export class VideoRecentlyAddedComponent extends AbstractVideoList implements On
24 protected router: Router, 24 protected router: Router,
25 protected route: ActivatedRoute, 25 protected route: ActivatedRoute,
26 protected location: Location, 26 protected location: Location,
27 protected notificationsService: NotificationsService, 27 protected notifier: Notifier,
28 protected authService: AuthService, 28 protected authService: AuthService,
29 protected i18n: I18n, 29 protected i18n: I18n,
30 protected screenService: ScreenService, 30 protected screenService: ScreenService,
diff --git a/client/src/app/videos/video-list/video-trending.component.ts b/client/src/app/videos/video-list/video-trending.component.ts
index 8f3d3842b..6fd74e67a 100644
--- a/client/src/app/videos/video-list/video-trending.component.ts
+++ b/client/src/app/videos/video-list/video-trending.component.ts
@@ -2,13 +2,13 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { Location } from '@angular/common' 3import { Location } from '@angular/common'
4import { immutableAssign } from '@app/shared/misc/utils' 4import { immutableAssign } from '@app/shared/misc/utils'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { AbstractVideoList } from '../../shared/video/abstract-video-list' 6import { AbstractVideoList } from '../../shared/video/abstract-video-list'
8import { VideoSortField } from '../../shared/video/sort-field.type' 7import { VideoSortField } from '../../shared/video/sort-field.type'
9import { VideoService } from '../../shared/video/video.service' 8import { VideoService } from '../../shared/video/video.service'
10import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
11import { ScreenService } from '@app/shared/misc/screen.service' 10import { ScreenService } from '@app/shared/misc/screen.service'
11import { Notifier, ServerService } from '@app/core'
12 12
13@Component({ 13@Component({
14 selector: 'my-videos-trending', 14 selector: 'my-videos-trending',
@@ -23,22 +23,37 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
23 constructor ( 23 constructor (
24 protected router: Router, 24 protected router: Router,
25 protected route: ActivatedRoute, 25 protected route: ActivatedRoute,
26 protected notificationsService: NotificationsService, 26 protected notifier: Notifier,
27 protected authService: AuthService, 27 protected authService: AuthService,
28 protected location: Location, 28 protected location: Location,
29 protected screenService: ScreenService, 29 protected screenService: ScreenService,
30 private serverService: ServerService,
30 protected i18n: I18n, 31 protected i18n: I18n,
31 private videoService: VideoService 32 private videoService: VideoService
32 ) { 33 ) {
33 super() 34 super()
34
35 this.titlePage = i18n('Trending')
36 } 35 }
37 36
38 ngOnInit () { 37 ngOnInit () {
39 super.ngOnInit() 38 super.ngOnInit()
40 39
41 this.generateSyndicationList() 40 this.generateSyndicationList()
41
42 this.serverService.configLoaded.subscribe(
43 () => {
44 const trendingDays = this.serverService.getConfig().trending.videos.intervalDays
45
46 if (trendingDays === 1) {
47 this.titlePage = this.i18n('Trending for the last 24 hours')
48 this.titleTooltip = this.i18n('Trending videos are those totalizing the greatest number of views during the last 24 hours.')
49 } else {
50 this.titlePage = this.i18n('Trending for the last {{days}} days', { days: trendingDays })
51 this.titleTooltip = this.i18n(
52 'Trending videos are those totalizing the greatest number of views during the last {{days}} days.',
53 { days: trendingDays }
54 )
55 }
56 })
42 } 57 }
43 58
44 ngOnDestroy () { 59 ngOnDestroy () {
diff --git a/client/src/app/videos/video-list/video-user-subscriptions.component.ts b/client/src/app/videos/video-list/video-user-subscriptions.component.ts
index 6e8959c54..bee828e12 100644
--- a/client/src/app/videos/video-list/video-user-subscriptions.component.ts
+++ b/client/src/app/videos/video-list/video-user-subscriptions.component.ts
@@ -2,7 +2,6 @@ import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { immutableAssign } from '@app/shared/misc/utils' 3import { immutableAssign } from '@app/shared/misc/utils'
4import { Location } from '@angular/common' 4import { Location } from '@angular/common'
5import { NotificationsService } from 'angular2-notifications'
6import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
7import { AbstractVideoList } from '../../shared/video/abstract-video-list' 6import { AbstractVideoList } from '../../shared/video/abstract-video-list'
8import { VideoSortField } from '../../shared/video/sort-field.type' 7import { VideoSortField } from '../../shared/video/sort-field.type'
@@ -10,6 +9,7 @@ import { VideoService } from '../../shared/video/video.service'
10import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
11import { ScreenService } from '@app/shared/misc/screen.service' 10import { ScreenService } from '@app/shared/misc/screen.service'
12import { OwnerDisplayType } from '@app/shared/video/video-miniature.component' 11import { OwnerDisplayType } from '@app/shared/video/video-miniature.component'
12import { Notifier } from '@app/core'
13 13
14@Component({ 14@Component({
15 selector: 'my-videos-user-subscriptions', 15 selector: 'my-videos-user-subscriptions',
@@ -25,7 +25,7 @@ export class VideoUserSubscriptionsComponent extends AbstractVideoList implement
25 constructor ( 25 constructor (
26 protected router: Router, 26 protected router: Router,
27 protected route: ActivatedRoute, 27 protected route: ActivatedRoute,
28 protected notificationsService: NotificationsService, 28 protected notifier: Notifier,
29 protected authService: AuthService, 29 protected authService: AuthService,
30 protected location: Location, 30 protected location: Location,
31 protected i18n: I18n, 31 protected i18n: I18n,
diff --git a/client/src/assets/images/global/add.svg b/client/src/assets/images/global/add.html
index 42b269c43..bfb0a52bc 100644
--- a/client/src/assets/images/global/add.svg
+++ b/client/src/assets/images/global/add.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-92.000000, -115.000000)">
5 <g id="Artboard-4" transform="translate(-92.000000, -115.000000)">
6 <g id="2" transform="translate(92.000000, 115.000000)"> 4 <g id="2" transform="translate(92.000000, 115.000000)">
7 <circle id="Oval-1" stroke="#ffffff" stroke-width="2" cx="12" cy="12" r="10"></circle> 5 <circle id="Oval-1" stroke="#ffffff" stroke-width="2" cx="12" cy="12" r="10"></circle>
8 <rect id="Rectangle-1" fill="#ffffff" x="11" y="7" width="2" height="10" rx="1"></rect> 6 <rect id="Rectangle-1" fill="#ffffff" x="11" y="7" width="2" height="10" rx="1"></rect>
diff --git a/client/src/assets/images/video/alert.svg b/client/src/assets/images/global/alert.html
index 5b43534ad..7c8c02074 100644
--- a/client/src/assets/images/video/alert.svg
+++ b/client/src/assets/images/global/alert.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>alert</title> 3 <g transform="translate(-48.000000, -467.000000)">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -467.000000)">
9 <g id="161" transform="translate(48.000000, 467.000000)"> 4 <g id="161" transform="translate(48.000000, 467.000000)">
10 <path d="M12.8715755,3.50973876 L12,1.96027114 L11.1284245,3.50973876 L2.12842446,19.5097388 L1.29015252,21 L3,21 L21,21 L22.7098475,21 L21.8715755,19.5097388 L12.8715755,3.50973876 Z" id="Triangle-2" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path> 5 <path d="M12.8715755,3.50973876 L12,1.96027114 L11.1284245,3.50973876 L2.12842446,19.5097388 L1.29015252,21 L3,21 L21,21 L22.7098475,21 L21.8715755,19.5097388 L12.8715755,3.50973876 Z" id="Triangle-2" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
11 <path d="M12,17.75 C12.6903559,17.75 13.25,17.1903559 13.25,16.5 C13.25,15.8096441 12.6903559,15.25 12,15.25 C11.3096441,15.25 10.75,15.8096441 10.75,16.5 C10.75,17.1903559 11.3096441,17.75 12,17.75 Z" id="Oval-8" fill="#000000"></path> 6 <path d="M12,17.75 C12.6903559,17.75 13.25,17.1903559 13.25,16.5 C13.25,15.8096441 12.6903559,15.25 12,15.25 C11.3096441,15.25 10.75,15.8096441 10.75,16.5 C10.75,17.1903559 11.3096441,17.75 12,17.75 Z" id="Oval-8" fill="#000000"></path>
diff --git a/client/src/assets/images/global/circle-tick.html b/client/src/assets/images/global/circle-tick.html
new file mode 100644
index 000000000..2327de6be
--- /dev/null
+++ b/client/src/assets/images/global/circle-tick.html
@@ -0,0 +1,12 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
5 <g id="yes" transform="translate(352.000000, 88.000000)">
6 <circle id="Oval-1" cx="12" cy="12" r="10"/>
7 <polyline id="Path-288" stroke-linecap="round" stroke-linejoin="round" points="8.5 12.5 10.5 14.5 15.5 9.5"/>
8 </g>
9 </g>
10 </g>
11 </g>
12</svg>
diff --git a/client/src/assets/images/global/cloud-download.html b/client/src/assets/images/global/cloud-download.html
new file mode 100644
index 000000000..b2634fd1f
--- /dev/null
+++ b/client/src/assets/images/global/cloud-download.html
@@ -0,0 +1,11 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
3 <g transform="translate(-356.000000, -775.000000)" stroke="#000000" stroke-width="2">
4 <g id="308" transform="translate(356.000000, 775.000000)">
5 <path d="M8,17 L5,17 L5,17 C2.790861,17 1,15.209139 1,13 C1,10.790861 2.790861,9 5,9 C5.35840468,9 5.70579988,9.04713713 6.03632437,9.13555013 C6.01233106,8.92702603 6,8.71495305 6,8.5 C6,5.46243388 8.46243388,3 11.5,3 C14.0673313,3 16.2238156,4.7590449 16.8299648,7.1376465 C17.2052921,7.04765874 17.5970804,7 18,7 C20.7614237,7 23,9.23857625 23,12 C23,14.7614237 20.7614237,17 18,17 L16,17" id="Combined-Shape" stroke-linejoin="round"></path>
6 <path d="M12,13 L12,21" id="Path-58"></path>
7 <polyline id="Path-59" stroke-linejoin="round" points="15 20 12 23 9 20"></polyline>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/cloud-error.html b/client/src/assets/images/global/cloud-error.html
new file mode 100644
index 000000000..1a3483805
--- /dev/null
+++ b/client/src/assets/images/global/cloud-error.html
@@ -0,0 +1,11 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
3 <g transform="translate(-400.000000, -775.000000)" stroke="#000000" stroke-width="2">
4 <g id="309" transform="translate(400.000000, 775.000000)">
5 <path d="M7,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L17,18" id="Combined-Shape"></path>
6 <path d="M9,21 L15,15" id="Path-238"></path>
7 <path d="M9,21 L15,15" id="Path-238" transform="translate(12.000000, 18.000000) scale(-1, 1) translate(-12.000000, -18.000000) "></path>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/cog.html b/client/src/assets/images/global/cog.html
new file mode 100644
index 000000000..b74a180e7
--- /dev/null
+++ b/client/src/assets/images/global/cog.html
@@ -0,0 +1,9 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
3 <g transform="translate(-796.000000, -159.000000)" stroke="#000000" stroke-width="2">
4 <g id="38" transform="translate(796.000000, 159.000000)">
5 <path d="M7.20852293,4.3800958 C8.05442158,3.84706631 8.99528987,3.45099725 10,3.22301642 L10,1.99980749 C10,1.44762906 10.4433532,1 11.0093689,1 L12.9906311,1 C13.5480902,1 14,1.44371665 14,1.99980749 L14,3.22301642 C15.0047101,3.45099725 15.9455784,3.84706631 16.7914771,4.3800958 L17.6569904,3.5145825 C18.0474395,3.12413339 18.6774591,3.12110988 19.0776926,3.52134344 L20.4786566,4.92230738 C20.8728396,5.31649045 20.8786331,5.94979402 20.4854175,6.34300963 L19.6199042,7.20852293 C20.1529337,8.05442158 20.5490027,8.99528987 20.7769836,10 L22.0001925,10 C22.5523709,10 23,10.4433532 23,11.0093689 L23,12.9906311 C23,13.5480902 22.5562834,14 22.0001925,14 L20.7769836,14 C20.5490027,15.0047101 20.1529337,15.9455784 19.6199042,16.7914771 L20.4854175,17.6569904 C20.8758666,18.0474395 20.8788901,18.6774591 20.4786566,19.0776926 L19.0776926,20.4786566 C18.6835095,20.8728396 18.050206,20.8786331 17.6569904,20.4854175 L16.7914771,19.6199042 C15.9455784,20.1529337 15.0047101,20.5490027 14,20.7769836 L14,22.0001925 C14,22.5523709 13.5566468,23 12.9906311,23 L11.0093689,23 C10.4519098,23 10,22.5562834 10,22.0001925 L10,20.7769836 C8.99528987,20.5490027 8.05442158,20.1529337 7.20852293,19.6199042 L6.34300963,20.4854175 C5.95256051,20.8758666 5.32254093,20.8788901 4.92230738,20.4786566 L3.52134344,19.0776926 C3.12716036,18.6835095 3.12136689,18.050206 3.5145825,17.6569904 L4.3800958,16.7914771 C3.84706631,15.9455784 3.45099725,15.0047101 3.22301642,14 L1.99980749,14 C1.44762906,14 1,13.5566468 1,12.9906311 L1,11.0093689 C1,10.4519098 1.44371665,10 1.99980749,10 L3.22301642,10 C3.45099725,8.99528987 3.84706631,8.05442158 4.3800958,7.20852293 L3.5145825,6.34300963 C3.12413339,5.95256051 3.12110988,5.32254093 3.52134344,4.92230738 L4.92230738,3.52134344 C5.31649045,3.12716036 5.94979402,3.12136689 6.34300963,3.5145825 L7.20852293,4.3800958 Z M12,16 C14.209139,16 16,14.209139 16,12 C16,9.790861 14.209139,8 12,8 C9.790861,8 8,9.790861 8,12 C8,14.209139 9.790861,16 12,16 Z" id="Combined-Shape"/>
6 </g>
7 </g>
8 </g>
9</svg>
diff --git a/client/src/assets/images/global/cross.svg b/client/src/assets/images/global/cross.html
index d47a75996..962578487 100644
--- a/client/src/assets/images/global/cross.svg
+++ b/client/src/assets/images/global/cross.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-312.000000, -115.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-312.000000, -115.000000)" stroke="#585858" stroke-width="2">
6 <g id="7" transform="translate(312.000000, 115.000000)"> 4 <g id="7" transform="translate(312.000000, 115.000000)">
7 <path d="M19,5 L5,19" id="Path-14"></path> 5 <path d="M19,5 L5,19" id="Path-14"></path>
8 <path d="M19,5 L5,19" id="Path-14" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path> 6 <path d="M19,5 L5,19" id="Path-14" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path>
diff --git a/client/src/assets/images/global/delete-black.svg b/client/src/assets/images/global/delete-black.svg
deleted file mode 100644
index 04ddc23aa..000000000
--- a/client/src/assets/images/global/delete-black.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)">
7 <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#000" stroke-width="2"></path>
8 <rect id="Rectangle-424" fill="#000" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#000"></path>
10 <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#000" stroke-width="2" stroke-linejoin="round"></path>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/global/delete-grey.svg b/client/src/assets/images/global/delete-grey.svg
deleted file mode 100644
index 67e9e2ce7..000000000
--- a/client/src/assets/images/global/delete-grey.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)">
7 <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#585858" stroke-width="2"></path>
8 <rect id="Rectangle-424" fill="#585858" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#585858"></path>
10 <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#585858" stroke-width="2" stroke-linejoin="round"></path>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/global/delete-white.svg b/client/src/assets/images/global/delete.html
index 9c52de557..a0d9a0cac 100644
--- a/client/src/assets/images/global/delete-white.svg
+++ b/client/src/assets/images/global/delete.html
@@ -1,13 +1,11 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-224.000000, -159.000000)">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)"> 4 <g id="25" transform="translate(224.000000, 159.000000)">
7 <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#ffffff" stroke-width="2"></path> 5 <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#000000" stroke-width="2"></path>
8 <rect id="Rectangle-424" fill="#ffffff" x="2" y="4" width="20" height="2" rx="1"></rect> 6 <rect id="Rectangle-424" fill="#000000" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#ffffff"></path> 7 <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#000000"></path>
10 <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#ffffff" stroke-width="2" stroke-linejoin="round"></path> 8 <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
11 </g> 9 </g>
12 </g> 10 </g>
13 </g> 11 </g>
diff --git a/client/src/assets/images/video/download-black.svg b/client/src/assets/images/global/download.html
index 501836746..259506f31 100644
--- a/client/src/assets/images/video/download-black.svg
+++ b/client/src/assets/images/global/download.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>download</title> 3 <g transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)"> 4 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path> 5 <path d="M12,3 L12,15" id="Path-58"></path>
11 <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline> 6 <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
diff --git a/client/src/assets/images/global/edit-black.svg b/client/src/assets/images/global/edit-black.svg
deleted file mode 100644
index 0176b0f37..000000000
--- a/client/src/assets/images/global/edit-black.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>edit</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
9 <g id="41" transform="translate(48.000000, 203.000000)">
10 <path d="M3,21.0000003 L3,17 L15.8898356,4.11016442 C17.0598483,2.9401517 18.9638992,2.94723715 20.1306896,4.11402752 L19.9181432,3.90148112 C21.0902894,5.07362738 21.0882407,6.97202708 19.9174652,8.1377941 L7,21.0000003 L3,21.0000003 Z" id="Path-74" stroke-linecap="round" stroke-linejoin="round"></path>
11 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/global/edit-grey.svg b/client/src/assets/images/global/edit.html
index 23ece68f1..f04183c2d 100644
--- a/client/src/assets/images/global/edit-grey.svg
+++ b/client/src/assets/images/global/edit.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>edit</title> 3 <g transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#585858" stroke-width="2">
9 <g id="41" transform="translate(48.000000, 203.000000)"> 4 <g id="41" transform="translate(48.000000, 203.000000)">
10 <path d="M3,21.0000003 L3,17 L15.8898356,4.11016442 C17.0598483,2.9401517 18.9638992,2.94723715 20.1306896,4.11402752 L19.9181432,3.90148112 C21.0902894,5.07362738 21.0882407,6.97202708 19.9174652,8.1377941 L7,21.0000003 L3,21.0000003 Z" id="Path-74" stroke-linecap="round" stroke-linejoin="round"></path> 5 <path d="M3,21.0000003 L3,17 L15.8898356,4.11016442 C17.0598483,2.9401517 18.9638992,2.94723715 20.1306896,4.11402752 L19.9181432,3.90148112 C21.0902894,5.07362738 21.0882407,6.97202708 19.9174652,8.1377941 L7,21.0000003 L3,21.0000003 Z" id="Path-74" stroke-linecap="round" stroke-linejoin="round"></path>
11 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path> 6 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
diff --git a/client/src/assets/images/global/help.svg b/client/src/assets/images/global/help.html
index 48252febe..80cd40321 100644
--- a/client/src/assets/images/global/help.svg
+++ b/client/src/assets/images/global/help.html
@@ -1,12 +1,10 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-400.000000, -247.000000)">
5 <g id="Artboard-4" transform="translate(-400.000000, -247.000000)">
6 <g id="69" transform="translate(400.000000, 247.000000)"> 4 <g id="69" transform="translate(400.000000, 247.000000)">
7 <circle id="Oval-7" stroke="#333333" stroke-width="2" cx="12" cy="12" r="10"></circle> 5 <circle id="Oval-7" stroke="#000000" stroke-width="2" cx="12" cy="12" r="10"></circle>
8 <path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="#333333"></path> 6 <path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="#000000"></path>
9 </g> 7 </g>
10 </g> 8 </g>
11 </g> 9 </g>
12</svg> \ No newline at end of file 10</svg>
diff --git a/client/src/assets/images/global/im-with-her.svg b/client/src/assets/images/global/im-with-her.html
index 31d4754fd..de2c62e96 100644
--- a/client/src/assets/images/global/im-with-her.svg
+++ b/client/src/assets/images/global/im-with-her.html
@@ -1,15 +1,10 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>im-with-her</title> 3 <g transform="translate(-708.000000, -467.000000)">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-708.000000, -467.000000)">
9 <g id="176" transform="translate(708.000000, 467.000000)"> 4 <g id="176" transform="translate(708.000000, 467.000000)">
10 <path d="M8,9 L8,3.99339768 C8,3.44494629 7.55641359,3 7.00922203,3 L2.99077797,3 C2.45097518,3 2,3.44475929 2,3.99339768 L2,20.0066023 C2,20.5550537 2.44358641,21 2.99077797,21 L7.00922203,21 C7.54902482,21 8,20.5552407 8,20.0066023 L8,15 L14,15 L14,20.0066023 C14,20.5550537 14.4435864,21 14.990778,21 L19.009222,21 C19.5490248,21 20,20.5564587 20,20.0093228 L20,15.0006104 L23,12 L20,8.99267578 L20,4.00303919 C20,3.45042467 19.5564136,3 19.009222,3 L14.990778,3 C14.4509752,3 14,3.44475929 14,3.99339768 L14,9 L8,9 Z" id="Combined-Shape" fill="#333333" opacity="0.5"></path> 5 <path d="M8,9 L8,3.99339768 C8,3.44494629 7.55641359,3 7.00922203,3 L2.99077797,3 C2.45097518,3 2,3.44475929 2,3.99339768 L2,20.0066023 C2,20.5550537 2.44358641,21 2.99077797,21 L7.00922203,21 C7.54902482,21 8,20.5552407 8,20.0066023 L8,15 L14,15 L14,20.0066023 C14,20.5550537 14.4435864,21 14.990778,21 L19.009222,21 C19.5490248,21 20,20.5564587 20,20.0093228 L20,15.0006104 L23,12 L20,8.99267578 L20,4.00303919 C20,3.45042467 19.5564136,3 19.009222,3 L14.990778,3 C14.4509752,3 14,3.44475929 14,3.99339768 L14,9 L8,9 Z" id="Combined-Shape" fill="#000000" opacity="0.5"></path>
11 <path d="M2,9 L14,9 L14,3.99077797 C14,3.44358641 14.3203148,3.32031476 14.7062149,3.7062149 L23,12 L14.7062149,20.2937851 C14.3161832,20.6838168 14,20.5490248 14,20.009222 L14,15 L2,15 L2,9 Z" id="Rectangle-121" fill-opacity="0.5" fill="#000000"></path> 6 <path d="M2,9 L14,9 L14,3.99077797 C14,3.44358641 14.3203148,3.32031476 14.7062149,3.7062149 L23,12 L14.7062149,20.2937851 C14.3161832,20.6838168 14,20.5490248 14,20.009222 L14,15 L2,15 L2,9 Z" id="Rectangle-121" fill-opacity="0.5" fill="#000000"></path>
12 </g> 7 </g>
13 </g> 8 </g>
14 </g> 9 </g>
15</svg> \ No newline at end of file 10</svg>
diff --git a/client/src/assets/images/global/no.html b/client/src/assets/images/global/no.html
new file mode 100644
index 000000000..bb7b28514
--- /dev/null
+++ b/client/src/assets/images/global/no.html
@@ -0,0 +1,10 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
4 <g id="347" transform="translate(312.000000, 863.000000)">
5 <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
6 <path d="M18,18 L6,6" id="Path-275"></path>
7 </g>
8 </g>
9 </g>
10</svg>
diff --git a/client/src/assets/images/global/sparkle.html b/client/src/assets/images/global/sparkle.html
new file mode 100644
index 000000000..3b29fefb9
--- /dev/null
+++ b/client/src/assets/images/global/sparkle.html
@@ -0,0 +1,11 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
3 <g transform="translate(-488.000000, -731.000000)" stroke="#000000" stroke-width="2">
4 <g id="291" transform="translate(488.000000, 731.000000)">
5 <path d="M10,9 C8.5,7.5 8,3 8,3 C8,3 7.5,7.5 6,9 C4.5,10.5 2,11 2,11 C2,11 4.5,11.5 6,13 C7.5,14.5 8,19 8,19 C8,19 8.5,14.5 10,13 C11.5,11.5 14,11 14,11 C14,11 11.5,10.5 10,9 Z" id="Combined-Shape"></path>
6 <path d="M19.6666667,4.75 C18.7916667,3.8125 18.5,1 18.5,1 C18.5,1 18.2083333,3.8125 17.3333333,4.75 C16.4583333,5.6875 15,6 15,6 C15,6 16.4583333,6.3125 17.3333333,7.25 C18.2083333,8.1875 18.5,11 18.5,11 C18.5,11 18.7916667,8.1875 19.6666667,7.25 C20.5416667,6.3125 22,6 22,6 C22,6 20.5416667,5.6875 19.6666667,4.75 Z" id="Combined-Shape"></path>
7 <path d="M17,17 C16.25,16.25 16,14 16,14 C16,14 15.75,16.25 15,17 C14.25,17.75 13,18 13,18 C13,18 14.25,18.25 15,19 C15.75,19.75 16,22 16,22 C16,22 16.25,19.75 17,19 C17.75,18.25 19,18 19,18 C19,18 17.75,17.75 17,17 Z" id="Combined-Shape"></path>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/syndication.svg b/client/src/assets/images/global/syndication.html
index cb74cf81b..e6c88a4db 100644
--- a/client/src/assets/images/global/syndication.svg
+++ b/client/src/assets/images/global/syndication.html
@@ -1,10 +1,8 @@
1<?xml version="1.0" encoding="iso-8859-1"?>
2<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 1<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4 viewBox="0 0 559.372 559.372" style="enable-background:new 0 0 559.372 559.372;" xml:space="preserve"> 2 viewBox="0 0 559.372 559.372" style="enable-background:new 0 0 559.372 559.372;" xml:space="preserve">
5<g> 3<g>
6 <g> 4 <g>
7 <path style="fill:#010002;" d="M53.244,0.002c46.512,0,91.29,6.018,134.334,18.054s83.334,29.07,120.869,51.102 5 <path fill="#000000" d="M53.244,0.002c46.512,0,91.29,6.018,134.334,18.054s83.334,29.07,120.869,51.102
8 c37.537,22.032,71.707,48.45,102.514,79.254c30.803,30.804,57.221,64.974,79.254,102.51 6 c37.537,22.032,71.707,48.45,102.514,79.254c30.803,30.804,57.221,64.974,79.254,102.51
9 c22.029,37.539,39.063,77.828,51.102,120.873c12.037,43.043,18.055,87.818,18.055,134.334c0,14.688-5.201,27.23-15.605,37.637 7 c22.029,37.539,39.063,77.828,51.102,120.873c12.037,43.043,18.055,87.818,18.055,134.334c0,14.688-5.201,27.23-15.605,37.637
10 c-10.404,10.407-22.949,15.604-37.637,15.604c-14.689,0-27.234-5.199-37.641-15.604c-10.402-10.404-15.604-22.949-15.604-37.637 8 c-10.404,10.407-22.949,15.604-37.637,15.604c-14.689,0-27.234-5.199-37.641-15.604c-10.402-10.404-15.604-22.949-15.604-37.637
diff --git a/client/src/assets/images/global/tick.svg b/client/src/assets/images/global/tick.html
index 230caa111..4784b4807 100644
--- a/client/src/assets/images/global/tick.svg
+++ b/client/src/assets/images/global/tick.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-356.000000, -115.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-356.000000, -115.000000)" stroke="#585858" stroke-width="2">
6 <g id="8" transform="translate(356.000000, 115.000000)"> 4 <g id="8" transform="translate(356.000000, 115.000000)">
7 <path d="M21,6 L9,18" id="Path-14"></path> 5 <path d="M21,6 L9,18" id="Path-14"></path>
8 <path d="M9,13 L4,18" id="Path-14" transform="translate(6.500000, 15.500000) scale(-1, 1) translate(-6.500000, -15.500000) "></path> 6 <path d="M9,13 L4,18" id="Path-14" transform="translate(6.500000, 15.500000) scale(-1, 1) translate(-6.500000, -15.500000) "></path>
diff --git a/client/src/assets/images/global/undo.html b/client/src/assets/images/global/undo.html
new file mode 100644
index 000000000..228245c86
--- /dev/null
+++ b/client/src/assets/images/global/undo.html
@@ -0,0 +1,9 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-180.000000, -115.000000)" fill="#000000">
4 <g id="4" transform="translate(180.000000, 115.000000)">
5 <path d="M10,19 C10.5522847,19 11,19.4477153 11,20 C11,20.5522847 10.5522847,21 10,21 C9.99404288,21 9.98809793,20.9999479 9.98216558,20.9998442 C5.01980239,20.990358 1,16.9646166 1,12 C1,7.02943725 5.02943725,3 10,3 C14.9705627,3 19,7.02943725 19,12 L17,12 C17,8.13400675 13.8659932,5 10,5 C6.13400675,5 3,8.13400675 3,12 C3,15.8659932 6.13400675,19 10,19 Z M14,12 L22,12 L18,16 L14,12 Z" id="Combined-Shape" transform="translate(11.500000, 12.000000) scale(-1, 1) translate(-11.500000, -12.000000) "/>
6 </g>
7 </g>
8 </g>
9</svg>
diff --git a/client/src/assets/images/global/undo.svg b/client/src/assets/images/global/undo.svg
deleted file mode 100644
index f1cca03f7..000000000
--- a/client/src/assets/images/global/undo.svg
+++ /dev/null
@@ -1,11 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-180.000000, -115.000000)" fill="#000">
6 <g id="4" transform="translate(180.000000, 115.000000)">
7 <path d="M10,19 C10.5522847,19 11,19.4477153 11,20 C11,20.5522847 10.5522847,21 10,21 C9.99404288,21 9.98809793,20.9999479 9.98216558,20.9998442 C5.01980239,20.990358 1,16.9646166 1,12 C1,7.02943725 5.02943725,3 10,3 C14.9705627,3 19,7.02943725 19,12 L17,12 C17,8.13400675 13.8659932,5 10,5 C6.13400675,5 3,8.13400675 3,12 C3,15.8659932 6.13400675,19 10,19 Z M14,12 L22,12 L18,16 L14,12 Z" id="Combined-Shape" transform="translate(11.500000, 12.000000) scale(-1, 1) translate(-11.500000, -12.000000) "></path>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/user-add.html b/client/src/assets/images/global/user-add.html
new file mode 100644
index 000000000..57df23c74
--- /dev/null
+++ b/client/src/assets/images/global/user-add.html
@@ -0,0 +1,11 @@
1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-136.000000, -863.000000)">
4 <g id="343" transform="translate(136.000000, 863.000000)">
5 <path d="M14.2571621,15 L7,15 C4.20063223,15 2.390348,16.1679253 1.5255785,18.0896353 C1.07423388,19.0926234 0.949016905,20.1108713 0.995546634,20.9698816 C0.998604759,21.0263393 1.0014872,21.0632937 1.00496281,21.0995037 C1.0599172,21.6490476 1.54995985,22.0499916 2.09950372,21.9950372 C2.64904758,21.9400828 3.04999158,21.4500401 2.99503719,20.9004963 C2.99555422,20.9071205 2.99399879,20.8871791 2.99261905,20.8617069 C2.96185588,20.2937714 3.05021139,19.575276 3.34942151,18.9103647 C3.890902,17.7070747 4.98686778,17 7,17 L12.0070975,17 L13.2070325,17 C13.4170071,16.2576107 13.7789623,15.5790321 14.2571621,15 Z" id="Path-41" fill="#000000" fill-rule="nonzero"></path>
6 <path d="M19,18 L19,16.4976988 C19,16.2228273 18.7680664,16 18.5,16 C18.2238576,16 18,16.2148438 18,16.4976988 L18,18 L16.4976988,18 C16.2148438,18 16,18.2238576 16,18.5 C16,18.7680664 16.2228273,19 16.4976988,19 L18,19 L18,20.5023012 C18,20.7771727 18.2319336,21 18.5,21 C18.7761424,21 19,20.7851562 19,20.5023012 L19,19 L20.5023012,19 C20.7851562,19 21,18.7761424 21,18.5 C21,18.2319336 20.7771727,18 20.5023012,18 L19,18 Z M18.5,23 C16.0147186,23 14,20.9852814 14,18.5 C14,16.0147186 16.0147186,14 18.5,14 C20.9852814,14 23,16.0147186 23,18.5 C23,20.9852814 20.9852814,23 18.5,23 Z" id="Combined-Shape" fill="#000000"></path>
7 <circle id="Oval-40" stroke="#000000" stroke-width="2" cx="12" cy="8" r="5"></circle>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/validate.svg b/client/src/assets/images/global/validate.html
index 5c7ee9d14..520624ff6 100644
--- a/client/src/assets/images/global/validate.svg
+++ b/client/src/assets/images/global/validate.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-400.000000, -1134.000000)" stroke="#ffffff" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)"> 4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="yes" transform="translate(352.000000, 88.000000)"> 5 <g id="yes" transform="translate(352.000000, 88.000000)">
8 <circle id="Oval-1" cx="12" cy="12" r="10"></circle> 6 <circle id="Oval-1" cx="12" cy="12" r="10"></circle>
diff --git a/client/src/assets/images/video/blacklist.svg b/client/src/assets/images/video/blacklist.svg
deleted file mode 100644
index 431c73816..000000000
--- a/client/src/assets/images/video/blacklist.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>no</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
9 <g id="347" transform="translate(312.000000, 863.000000)">
10 <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
11 <path d="M18,18 L6,6" id="Path-275"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/video/dislike-white.svg b/client/src/assets/images/video/dislike-white.svg
deleted file mode 100644
index cfc6eaa1f..000000000
--- a/client/src/assets/images/video/dislike-white.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
5 <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#ffffff" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="thumbs-down" transform="translate(704.000000, 44.000000)">
8 <path d="M6,16 C6,18.5 6.5,21 8,21 L16.9938335,21 C17.5495239,21 18.1819788,20.5956028 18.4072817,20.0949295 L20.8562951,14.6526776 C21.7640882,12.6353595 20.7154925,11 18.5092545,11 L15.5,11 C15.5,11 18.5,5 15,5 C12.5,5 11.5,11 8,11 C6.5,11 6,13.5 6,16 Z" id="Path-188" stroke-linejoin="round" transform="translate(13.591488, 13.000000) scale(1, -1) translate(-13.591488, -13.000000) "></path>
9 <path d="M4,4.5 C4,4.5 3,7 3,10 C3,13 4,15.5 4,15.5" id="Path-189" transform="translate(3.500000, 10.000000) scale(1, -1) translate(-3.500000, -10.000000) "></path>
10 </g>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/video/dislike-grey.svg b/client/src/assets/images/video/dislike.html
index 56a7908fb..acde951e2 100644
--- a/client/src/assets/images/video/dislike-grey.svg
+++ b/client/src/assets/images/video/dislike.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-752.000000, -1090.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#585858" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)"> 4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="thumbs-down" transform="translate(704.000000, 44.000000)"> 5 <g id="thumbs-down" transform="translate(704.000000, 44.000000)">
8 <path d="M6,16 C6,18.5 6.5,21 8,21 L16.9938335,21 C17.5495239,21 18.1819788,20.5956028 18.4072817,20.0949295 L20.8562951,14.6526776 C21.7640882,12.6353595 20.7154925,11 18.5092545,11 L15.5,11 C15.5,11 18.5,5 15,5 C12.5,5 11.5,11 8,11 C6.5,11 6,13.5 6,16 Z" id="Path-188" stroke-linejoin="round" transform="translate(13.591488, 13.000000) scale(1, -1) translate(-13.591488, -13.000000) "></path> 6 <path d="M6,16 C6,18.5 6.5,21 8,21 L16.9938335,21 C17.5495239,21 18.1819788,20.5956028 18.4072817,20.0949295 L20.8562951,14.6526776 C21.7640882,12.6353595 20.7154925,11 18.5092545,11 L15.5,11 C15.5,11 18.5,5 15,5 C12.5,5 11.5,11 8,11 C6.5,11 6,13.5 6,16 Z" id="Path-188" stroke-linejoin="round" transform="translate(13.591488, 13.000000) scale(1, -1) translate(-13.591488, -13.000000) "></path>
diff --git a/client/src/assets/images/video/download-grey.svg b/client/src/assets/images/video/download-grey.svg
deleted file mode 100644
index 5b0cca5ef..000000000
--- a/client/src/assets/images/video/download-grey.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>download</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#585858" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path>
11 <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
12 <path d="M3,18 L3,20.0590859 C3,20.6127331 3.44494889,21.0615528 3.99340349,21.0615528 L20.0067018,21.0615528 C20.5553434,21.0615528 21.0001052,20.6098102 21.0001051,20.0590859 L21.0001049,18" id="Path-12" stroke-linejoin="round"></path>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/images/video/download-white.svg b/client/src/assets/images/video/download-white.svg
deleted file mode 100644
index 0e66e06e8..000000000
--- a/client/src/assets/images/video/download-white.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>download</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#ffffff" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path>
11 <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
12 <path d="M3,18 L3,20.0590859 C3,20.6127331 3.44494889,21.0615528 3.99340349,21.0615528 L20.0067018,21.0615528 C20.5553434,21.0615528 21.0001052,20.6098102 21.0001051,20.0590859 L21.0001049,18" id="Path-12" stroke-linejoin="round"></path>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/images/video/heart.svg b/client/src/assets/images/video/heart.html
index 5d64aee0f..618f64f10 100644
--- a/client/src/assets/images/video/heart.svg
+++ b/client/src/assets/images/video/heart.html
@@ -1,9 +1,7 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#000000">
5 <g id="Artboard-4" transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#585858"> 4 <g transform="translate(48.000000, 1046.000000)">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="heart"> 5 <g id="heart">
8 <path d="M12.0174466,21 L20.9041801,11.3556763 C22.6291961,9.13778099 22.2795957,5.90145416 20.1233257,4.12713796 C17.9670557,2.35282175 14.8206518,2.71241362 13.0956358,4.93030888 L12.0174465,6.5 L10.9043642,4.93030888 C9.17934824,2.71241362 6.0329443,2.35282175 3.87667432,4.12713796 C1.72040435,5.90145416 1.37080391,9.13778099 3.09581989,11.3556763 L12.0174466,21 Z"></path> 6 <path d="M12.0174466,21 L20.9041801,11.3556763 C22.6291961,9.13778099 22.2795957,5.90145416 20.1233257,4.12713796 C17.9670557,2.35282175 14.8206518,2.71241362 13.0956358,4.93030888 L12.0174465,6.5 L10.9043642,4.93030888 C9.17934824,2.71241362 6.0329443,2.35282175 3.87667432,4.12713796 C1.72040435,5.90145416 1.37080391,9.13778099 3.09581989,11.3556763 L12.0174466,21 Z"></path>
9 </g> 7 </g>
diff --git a/client/src/assets/images/video/like-white.svg b/client/src/assets/images/video/like-white.svg
deleted file mode 100644
index 88e5f6a9a..000000000
--- a/client/src/assets/images/video/like-white.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>thumbs-up</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#ffffff" stroke-width="2">
9 <g id="256" transform="translate(708.000000, 643.000000)">
10 <path d="M6,14 C6,16.5 6.5,19 8,19 L16.9938335,19 C17.5495239,19 18.1819788,18.5956028 18.4072817,18.0949295 L20.8562951,12.6526776 C21.7640882,10.6353595 20.7154925,9 18.5092545,9 L15.5,9 C15.5,9 18.5,3 15,3 C12.5,3 11.5,9 8,9 C6.5,9 6,11.5 6,14 Z" id="Path-188" stroke-linejoin="round"></path>
11 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/video/like-grey.svg b/client/src/assets/images/video/like.html
index 5ef6c7b31..d0e71763b 100644
--- a/client/src/assets/images/video/like-grey.svg
+++ b/client/src/assets/images/video/like.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>thumbs-up</title> 3 <g transform="translate(-708.000000, -643.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#585858" stroke-width="2">
9 <g id="256" transform="translate(708.000000, 643.000000)"> 4 <g id="256" transform="translate(708.000000, 643.000000)">
10 <path d="M6,14 C6,16.5 6.5,19 8,19 L16.9938335,19 C17.5495239,19 18.1819788,18.5956028 18.4072817,18.0949295 L20.8562951,12.6526776 C21.7640882,10.6353595 20.7154925,9 18.5092545,9 L15.5,9 C15.5,9 18.5,3 15,3 C12.5,3 11.5,9 8,9 C6.5,9 6,11.5 6,14 Z" id="Path-188" stroke-linejoin="round"></path> 5 <path d="M6,14 C6,16.5 6.5,19 8,19 L16.9938335,19 C17.5495239,19 18.1819788,18.5956028 18.4072817,18.0949295 L20.8562951,12.6526776 C21.7640882,10.6353595 20.7154925,9 18.5092545,9 L15.5,9 C15.5,9 18.5,3 15,3 C12.5,3 11.5,9 8,9 C6.5,9 6,11.5 6,14 Z" id="Path-188" stroke-linejoin="round"></path>
11 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path> 6 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
diff --git a/client/src/assets/images/video/more.svg b/client/src/assets/images/video/more.html
index dea392136..39dcad10e 100644
--- a/client/src/assets/images/video/more.svg
+++ b/client/src/assets/images/video/more.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-444.000000, -115.000000)" fill="#000000">
5 <g id="Artboard-4" transform="translate(-444.000000, -115.000000)" fill="#585858">
6 <g id="10" transform="translate(444.000000, 115.000000)"> 4 <g id="10" transform="translate(444.000000, 115.000000)">
7 <path d="M10,12 C10,10.8954305 10.8877296,10 12,10 C13.1045695,10 14,10.8877296 14,12 C14,13.1045695 13.1122704,14 12,14 C10.8954305,14 10,13.1122704 10,12 Z M17,12 C17,10.8954305 17.8877296,10 19,10 C20.1045695,10 21,10.8877296 21,12 C21,13.1045695 20.1122704,14 19,14 C17.8954305,14 17,13.1122704 17,12 Z M3,12 C3,10.8954305 3.88772964,10 5,10 C6.1045695,10 7,10.8877296 7,12 C7,13.1045695 6.11227036,14 5,14 C3.8954305,14 3,13.1122704 3,12 Z" id="Combined-Shape"></path> 5 <path d="M10,12 C10,10.8954305 10.8877296,10 12,10 C13.1045695,10 14,10.8877296 14,12 C14,13.1045695 13.1122704,14 12,14 C10.8954305,14 10,13.1122704 10,12 Z M17,12 C17,10.8954305 17.8877296,10 19,10 C20.1045695,10 21,10.8877296 21,12 C21,13.1045695 20.1122704,14 19,14 C17.8954305,14 17,13.1122704 17,12 Z M3,12 C3,10.8954305 3.88772964,10 5,10 C6.1045695,10 7,10.8877296 7,12 C7,13.1045695 6.11227036,14 5,14 C3.8954305,14 3,13.1122704 3,12 Z" id="Combined-Shape"></path>
8 </g> 6 </g>
diff --git a/client/src/assets/images/video/share.svg b/client/src/assets/images/video/share.html
index da0f43e81..7759b37af 100644
--- a/client/src/assets/images/video/share.svg
+++ b/client/src/assets/images/video/share.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>share</title> 3 <g transform="translate(-312.000000, -203.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -203.000000)" stroke="#585858" stroke-width="2">
9 <g id="47" transform="translate(312.000000, 203.000000)"> 4 <g id="47" transform="translate(312.000000, 203.000000)">
10 <path d="M20,15 L20,18.0026083 C20,19.1057373 19.1073772,20 18.0049107,20 L5.99508929,20 C4.8932319,20 4,19.1073772 4,18.0049107 L4,5.99508929 C4,4.8932319 4.89585781,4 5.9973917,4 L9,4" id="Rectangle-460"></path> 5 <path d="M20,15 L20,18.0026083 C20,19.1057373 19.1073772,20 18.0049107,20 L5.99508929,20 C4.8932319,20 4,19.1073772 4,18.0049107 L4,5.99508929 C4,4.8932319 4.89585781,4 5.9973917,4 L9,4" id="Rectangle-460"></path>
11 <polyline id="Path-93" stroke-linejoin="round" points="13 4 20.0207973 4 20.0207973 11.0191059"></polyline> 6 <polyline id="Path-93" stroke-linejoin="round" points="13 4 20.0207973 4 20.0207973 11.0191059"></polyline>
diff --git a/client/src/assets/images/header/upload.svg b/client/src/assets/images/video/upload.html
index 2b07caf76..3bc0d3a8a 100644
--- a/client/src/assets/images/header/upload.svg
+++ b/client/src/assets/images/video/upload.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 1<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>cloud-upload</title> 3 <g transform="translate(-312.000000, -775.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#fff" stroke-width="2">
9 <g id="307" transform="translate(312.000000, 775.000000)"> 4 <g id="307" transform="translate(312.000000, 775.000000)">
10 <path d="M8,18 L5,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L16,18" id="Combined-Shape" stroke-linejoin="round"></path> 5 <path d="M8,18 L5,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L16,18" id="Combined-Shape" stroke-linejoin="round"></path>
11 <path d="M12,13 L12,21" id="Path-58"></path> 6 <path d="M12,13 L12,21" id="Path-58"></path>
diff --git a/client/src/assets/images/video/upload.svg b/client/src/assets/images/video/upload.svg
deleted file mode 100644
index c5b7cb443..000000000
--- a/client/src/assets/images/video/upload.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>cloud-upload</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#C6C6C6" stroke-width="2">
9 <g id="307" transform="translate(312.000000, 775.000000)">
10 <path d="M8,18 L5,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L16,18" id="Combined-Shape" stroke-linejoin="round"></path>
11 <path d="M12,13 L12,21" id="Path-58"></path>
12 <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 12.500000) scale(1, -1) translate(-12.000000, -12.500000) " points="15 11 12 14 9 11"></polyline>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/player/images/tick.svg b/client/src/assets/player/images/tick-white.svg
index d329e6bfb..d329e6bfb 100644
--- a/client/src/assets/player/images/tick.svg
+++ b/client/src/assets/player/images/tick-white.svg
diff --git a/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts b/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts
new file mode 100644
index 000000000..022a9c16f
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts
@@ -0,0 +1,143 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import * as videojs from 'video.js'
4import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo, VideoJSComponentInterface } from '../peertube-videojs-typings'
5import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from 'p2p-media-loader-hlsjs'
6import { Events } from 'p2p-media-loader-core'
7
8// videojs-hlsjs-plugin needs videojs in window
9window['videojs'] = videojs
10require('@streamroot/videojs-hlsjs-plugin')
11
12const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
13class P2pMediaLoaderPlugin extends Plugin {
14
15 private readonly CONSTANTS = {
16 INFO_SCHEDULER: 1000 // Don't change this
17 }
18 private readonly options: P2PMediaLoaderPluginOptions
19
20 private hlsjs: any // Don't type hlsjs to not bundle the module
21 private p2pEngine: Engine
22 private statsP2PBytes = {
23 pendingDownload: [] as number[],
24 pendingUpload: [] as number[],
25 numPeers: 0,
26 totalDownload: 0,
27 totalUpload: 0
28 }
29 private statsHTTPBytes = {
30 pendingDownload: [] as number[],
31 pendingUpload: [] as number[],
32 totalDownload: 0,
33 totalUpload: 0
34 }
35
36 private networkInfoInterval: any
37
38 constructor (player: videojs.Player, options: P2PMediaLoaderPluginOptions) {
39 super(player, options)
40
41 this.options = options
42
43 videojs.Html5Hlsjs.addHook('beforeinitialize', (videojsPlayer: any, hlsjs: any) => {
44 this.hlsjs = hlsjs
45 })
46
47 initVideoJsContribHlsJsPlayer(player)
48
49 player.src({
50 type: options.type,
51 src: options.src
52 })
53
54 player.on('play', () => {
55 player.addClass('vjs-has-big-play-button-clicked')
56 })
57
58 player.ready(() => this.initialize())
59 }
60
61 dispose () {
62 if (this.hlsjs) this.hlsjs.destroy()
63 if (this.p2pEngine) this.p2pEngine.destroy()
64
65 clearInterval(this.networkInfoInterval)
66 }
67
68 private initialize () {
69 initHlsJsPlayer(this.hlsjs)
70
71 const tech = this.player.tech_
72 this.p2pEngine = tech.options_.hlsjsConfig.loader.getEngine()
73
74 // Avoid using constants to not import hls.hs
75 // https://github.com/video-dev/hls.js/blob/master/src/events.js#L37
76 this.hlsjs.on('hlsLevelSwitching', (_: any, data: any) => {
77 this.trigger('resolutionChange', { auto: this.hlsjs.autoLevelEnabled, resolutionId: data.height })
78 })
79
80 this.p2pEngine.on(Events.SegmentError, (segment, err) => {
81 console.error('Segment error.', segment, err)
82 })
83
84 this.statsP2PBytes.numPeers = 1 + this.options.redundancyBaseUrls.length
85
86 this.runStats()
87 }
88
89 private runStats () {
90 this.p2pEngine.on(Events.PieceBytesDownloaded, (method: string, size: number) => {
91 const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
92
93 elem.pendingDownload.push(size)
94 elem.totalDownload += size
95 })
96
97 this.p2pEngine.on(Events.PieceBytesUploaded, (method: string, size: number) => {
98 const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
99
100 elem.pendingUpload.push(size)
101 elem.totalUpload += size
102 })
103
104 this.p2pEngine.on(Events.PeerConnect, () => this.statsP2PBytes.numPeers++)
105 this.p2pEngine.on(Events.PeerClose, () => this.statsP2PBytes.numPeers--)
106
107 this.networkInfoInterval = setInterval(() => {
108 const p2pDownloadSpeed = this.arraySum(this.statsP2PBytes.pendingDownload)
109 const p2pUploadSpeed = this.arraySum(this.statsP2PBytes.pendingUpload)
110
111 const httpDownloadSpeed = this.arraySum(this.statsHTTPBytes.pendingDownload)
112 const httpUploadSpeed = this.arraySum(this.statsHTTPBytes.pendingUpload)
113
114 this.statsP2PBytes.pendingDownload = []
115 this.statsP2PBytes.pendingUpload = []
116 this.statsHTTPBytes.pendingDownload = []
117 this.statsHTTPBytes.pendingUpload = []
118
119 return this.player.trigger('p2pInfo', {
120 http: {
121 downloadSpeed: httpDownloadSpeed,
122 uploadSpeed: httpUploadSpeed,
123 downloaded: this.statsHTTPBytes.totalDownload,
124 uploaded: this.statsHTTPBytes.totalUpload
125 },
126 p2p: {
127 downloadSpeed: p2pDownloadSpeed,
128 uploadSpeed: p2pUploadSpeed,
129 numPeers: this.statsP2PBytes.numPeers,
130 downloaded: this.statsP2PBytes.totalDownload,
131 uploaded: this.statsP2PBytes.totalUpload
132 }
133 } as PlayerNetworkInfo)
134 }, this.CONSTANTS.INFO_SCHEDULER)
135 }
136
137 private arraySum (data: number[]) {
138 return data.reduce((a: number, b: number) => a + b, 0)
139 }
140}
141
142videojs.registerPlugin('p2pMediaLoader', P2pMediaLoaderPlugin)
143export { P2pMediaLoaderPlugin }
diff --git a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
new file mode 100644
index 000000000..32e7ce4f2
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
@@ -0,0 +1,28 @@
1import { basename } from 'path'
2import { Segment } from 'p2p-media-loader-core'
3
4function segmentUrlBuilderFactory (baseUrls: string[]) {
5 return function segmentBuilder (segment: Segment) {
6 const max = baseUrls.length + 1
7 const i = getRandomInt(max)
8
9 if (i === max - 1) return segment.url
10
11 let newBaseUrl = baseUrls[i]
12 let middlePart = newBaseUrl.endsWith('/') ? '' : '/'
13
14 return newBaseUrl + middlePart + basename(segment.url)
15 }
16}
17
18// ---------------------------------------------------------------------------
19
20export {
21 segmentUrlBuilderFactory
22}
23
24// ---------------------------------------------------------------------------
25
26function getRandomInt (max: number) {
27 return Math.floor(Math.random() * Math.floor(max))
28}
diff --git a/client/src/assets/player/p2p-media-loader/segment-validator.ts b/client/src/assets/player/p2p-media-loader/segment-validator.ts
new file mode 100644
index 000000000..72c32f9e0
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/segment-validator.ts
@@ -0,0 +1,63 @@
1import { Segment } from 'p2p-media-loader-core'
2import { basename } from 'path'
3
4function segmentValidatorFactory (segmentsSha256Url: string) {
5 const segmentsJSON = fetchSha256Segments(segmentsSha256Url)
6 const regex = /bytes=(\d+)-(\d+)/
7
8 return async function segmentValidator (segment: Segment) {
9 const filename = basename(segment.url)
10 const captured = regex.exec(segment.range)
11
12 const range = captured[1] + '-' + captured[2]
13
14 const hashShouldBe = (await segmentsJSON)[filename][range]
15 if (hashShouldBe === undefined) {
16 throw new Error(`Unknown segment name ${filename}/${range} in segment validator`)
17 }
18
19 const calculatedSha = bufferToEx(await sha256(segment.data))
20 if (calculatedSha !== hashShouldBe) {
21 throw new Error(
22 `Hashes does not correspond for segment ${filename}/${range}` +
23 `(expected: ${hashShouldBe} instead of ${calculatedSha})`
24 )
25 }
26 }
27}
28
29// ---------------------------------------------------------------------------
30
31export {
32 segmentValidatorFactory
33}
34
35// ---------------------------------------------------------------------------
36
37function fetchSha256Segments (url: string) {
38 return fetch(url)
39 .then(res => res.json())
40 .catch(err => {
41 console.error('Cannot get sha256 segments', err)
42 return {}
43 })
44}
45
46function sha256 (data?: ArrayBuffer) {
47 if (!data) return undefined
48
49 return window.crypto.subtle.digest('SHA-256', data)
50}
51
52// Thanks: https://stackoverflow.com/a/53307879
53function bufferToEx (buffer?: ArrayBuffer) {
54 if (!buffer) return ''
55
56 let s = ''
57 const h = '0123456789abcdef'
58 const o = new Uint8Array(buffer)
59
60 o.forEach((v: any) => s += h[ v >> 4 ] + h[ v & 15 ])
61
62 return s
63}
diff --git a/client/src/assets/player/peertube-player-local-storage.ts b/client/src/assets/player/peertube-player-local-storage.ts
index dac54c5a4..059fca308 100644
--- a/client/src/assets/player/peertube-player-local-storage.ts
+++ b/client/src/assets/player/peertube-player-local-storage.ts
@@ -10,6 +10,14 @@ function getStoredVolume () {
10 return undefined 10 return undefined
11} 11}
12 12
13function getStoredWebTorrentEnabled (): boolean {
14 const value = getLocalStorage('webtorrent_enabled')
15 if (value !== null && value !== undefined) return value === 'true'
16
17 // By default webtorrent is enabled
18 return true
19}
20
13function getStoredMute () { 21function getStoredMute () {
14 const value = getLocalStorage('mute') 22 const value = getLocalStorage('mute')
15 if (value !== null && value !== undefined) return value === 'true' 23 if (value !== null && value !== undefined) return value === 'true'
@@ -52,17 +60,28 @@ function getAverageBandwidthInStore () {
52 return undefined 60 return undefined
53} 61}
54 62
63function saveLastSubtitle (language: string) {
64 return setLocalStorage('last-subtitle', language)
65}
66
67function getStoredLastSubtitle () {
68 return getLocalStorage('last-subtitle')
69}
70
55// --------------------------------------------------------------------------- 71// ---------------------------------------------------------------------------
56 72
57export { 73export {
58 getStoredVolume, 74 getStoredVolume,
75 getStoredWebTorrentEnabled,
59 getStoredMute, 76 getStoredMute,
60 getStoredTheater, 77 getStoredTheater,
61 saveVolumeInStore, 78 saveVolumeInStore,
62 saveMuteInStore, 79 saveMuteInStore,
63 saveTheaterInStore, 80 saveTheaterInStore,
64 saveAverageBandwidth, 81 saveAverageBandwidth,
65 getAverageBandwidthInStore 82 getAverageBandwidthInStore,
83 saveLastSubtitle,
84 getStoredLastSubtitle
66} 85}
67 86
68// --------------------------------------------------------------------------- 87// ---------------------------------------------------------------------------
diff --git a/client/src/assets/player/peertube-player-manager.ts b/client/src/assets/player/peertube-player-manager.ts
new file mode 100644
index 000000000..0ba9bcb11
--- /dev/null
+++ b/client/src/assets/player/peertube-player-manager.ts
@@ -0,0 +1,466 @@
1import { VideoFile } from '../../../../shared/models/videos'
2// @ts-ignore
3import * as videojs from 'video.js'
4import 'videojs-hotkeys'
5import 'videojs-dock'
6import 'videojs-contextmenu-ui'
7import 'videojs-contrib-quality-levels'
8import './peertube-plugin'
9import './videojs-components/peertube-link-button'
10import './videojs-components/resolution-menu-button'
11import './videojs-components/settings-menu-button'
12import './videojs-components/p2p-info-button'
13import './videojs-components/peertube-load-progress-bar'
14import './videojs-components/theater-button'
15import { P2PMediaLoaderPluginOptions, UserWatching, VideoJSCaption, VideoJSPluginOptions, videojsUntyped } from './peertube-videojs-typings'
16import { buildVideoEmbed, buildVideoLink, copyToClipboard, getRtcConfig } from './utils'
17import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
18import { segmentValidatorFactory } from './p2p-media-loader/segment-validator'
19import { segmentUrlBuilderFactory } from './p2p-media-loader/segment-url-builder'
20
21// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
22videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
23// Change Captions to Subtitles/CC
24videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
25// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
26videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
27
28export type PlayerMode = 'webtorrent' | 'p2p-media-loader'
29
30export type WebtorrentOptions = {
31 videoFiles: VideoFile[]
32}
33
34export type P2PMediaLoaderOptions = {
35 playlistUrl: string
36 segmentsSha256Url: string
37 trackerAnnounce: string[]
38 redundancyBaseUrls: string[]
39 videoFiles: VideoFile[]
40}
41
42export type CommonOptions = {
43 playerElement: HTMLVideoElement
44 onPlayerElementChange: (element: HTMLVideoElement) => void
45
46 autoplay: boolean
47 videoDuration: number
48 enableHotkeys: boolean
49 inactivityTimeout: number
50 poster: string
51 startTime: number | string
52
53 theaterMode: boolean
54 captions: boolean
55 peertubeLink: boolean
56
57 videoViewUrl: string
58 embedUrl: string
59
60 language?: string
61 controls?: boolean
62 muted?: boolean
63 loop?: boolean
64 subtitle?: string
65
66 videoCaptions: VideoJSCaption[]
67
68 userWatching?: UserWatching
69
70 serverUrl: string
71}
72
73export type PeertubePlayerManagerOptions = {
74 common: CommonOptions,
75 webtorrent: WebtorrentOptions,
76 p2pMediaLoader?: P2PMediaLoaderOptions
77}
78
79export class PeertubePlayerManager {
80
81 private static videojsLocaleCache: { [ path: string ]: any } = {}
82 private static playerElementClassName: string
83
84 static getServerTranslations (serverUrl: string, locale: string) {
85 const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
86 // It is the default locale, nothing to translate
87 if (!path) return Promise.resolve(undefined)
88
89 return fetch(path + '/server.json')
90 .then(res => res.json())
91 .catch(err => {
92 console.error('Cannot get server translations', err)
93 return undefined
94 })
95 }
96
97 static async initialize (mode: PlayerMode, options: PeertubePlayerManagerOptions) {
98 let p2pMediaLoader: any
99
100 this.playerElementClassName = options.common.playerElement.className
101
102 if (mode === 'webtorrent') await import('./webtorrent/webtorrent-plugin')
103 if (mode === 'p2p-media-loader') {
104 [ p2pMediaLoader ] = await Promise.all([
105 import('p2p-media-loader-hlsjs'),
106 import('./p2p-media-loader/p2p-media-loader-plugin')
107 ])
108 }
109
110 const videojsOptions = this.getVideojsOptions(mode, options, p2pMediaLoader)
111
112 await this.loadLocaleInVideoJS(options.common.serverUrl, options.common.language)
113
114 const self = this
115 return new Promise(res => {
116 videojs(options.common.playerElement, videojsOptions, function (this: any) {
117 const player = this
118
119 player.tech_.on('error', () => {
120 // Fallback to webtorrent?
121 if (mode === 'p2p-media-loader') {
122 self.fallbackToWebTorrent(player, options)
123 }
124 })
125
126 self.addContextMenu(mode, player, options.common.embedUrl)
127
128 return res(player)
129 })
130 })
131 }
132
133 private static async fallbackToWebTorrent (player: any, options: PeertubePlayerManagerOptions) {
134 const newVideoElement = document.createElement('video')
135 newVideoElement.className = this.playerElementClassName
136
137 // VideoJS wraps our video element inside a div
138 const currentParentPlayerElement = options.common.playerElement.parentNode
139 currentParentPlayerElement.parentNode.insertBefore(newVideoElement, currentParentPlayerElement)
140
141 options.common.playerElement = newVideoElement
142 options.common.onPlayerElementChange(newVideoElement)
143
144 player.dispose()
145
146 await import('./webtorrent/webtorrent-plugin')
147
148 const mode = 'webtorrent'
149 const videojsOptions = this.getVideojsOptions(mode, options)
150
151 const self = this
152 videojs(newVideoElement, videojsOptions, function (this: any) {
153 const player = this
154
155 self.addContextMenu(mode, player, options.common.embedUrl)
156 })
157 }
158
159 private static loadLocaleInVideoJS (serverUrl: string, locale: string) {
160 const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
161 // It is the default locale, nothing to translate
162 if (!path) return Promise.resolve(undefined)
163
164 let p: Promise<any>
165
166 if (PeertubePlayerManager.videojsLocaleCache[path]) {
167 p = Promise.resolve(PeertubePlayerManager.videojsLocaleCache[path])
168 } else {
169 p = fetch(path + '/player.json')
170 .then(res => res.json())
171 .then(json => {
172 PeertubePlayerManager.videojsLocaleCache[path] = json
173 return json
174 })
175 .catch(err => {
176 console.error('Cannot get player translations', err)
177 return undefined
178 })
179 }
180
181 const completeLocale = getCompleteLocale(locale)
182 return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
183 }
184
185 private static getVideojsOptions (mode: PlayerMode, options: PeertubePlayerManagerOptions, p2pMediaLoaderModule?: any) {
186 const commonOptions = options.common
187 const webtorrentOptions = options.webtorrent
188 const p2pMediaLoaderOptions = options.p2pMediaLoader
189
190 let autoplay = options.common.autoplay
191 let html5 = {}
192
193 const plugins: VideoJSPluginOptions = {
194 peertube: {
195 mode,
196 autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
197 videoViewUrl: commonOptions.videoViewUrl,
198 videoDuration: commonOptions.videoDuration,
199 startTime: commonOptions.startTime,
200 userWatching: commonOptions.userWatching,
201 subtitle: commonOptions.subtitle,
202 videoCaptions: commonOptions.videoCaptions
203 }
204 }
205
206 if (mode === 'p2p-media-loader') {
207 const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
208 redundancyBaseUrls: options.p2pMediaLoader.redundancyBaseUrls,
209 type: 'application/x-mpegURL',
210 src: p2pMediaLoaderOptions.playlistUrl
211 }
212
213 const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
214 .filter(t => t.startsWith('ws'))
215
216 const p2pMediaLoaderConfig = {
217 loader: {
218 trackerAnnounce,
219 segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url),
220 rtcConfig: getRtcConfig(),
221 requiredSegmentsPriority: 5,
222 segmentUrlBuilder: segmentUrlBuilderFactory(options.p2pMediaLoader.redundancyBaseUrls)
223 },
224 segments: {
225 swarmId: p2pMediaLoaderOptions.playlistUrl
226 }
227 }
228 const streamrootHls = {
229 levelLabelHandler: (level: { height: number, width: number }) => {
230 const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height)
231
232 let label = file.resolution.label
233 if (file.fps >= 50) label += file.fps
234
235 return label
236 },
237 html5: {
238 hlsjsConfig: {
239 liveSyncDurationCount: 7,
240 loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass()
241 }
242 }
243 }
244
245 Object.assign(plugins, { p2pMediaLoader, streamrootHls })
246 html5 = streamrootHls.html5
247 }
248
249 if (mode === 'webtorrent') {
250 const webtorrent = {
251 autoplay,
252 videoDuration: commonOptions.videoDuration,
253 playerElement: commonOptions.playerElement,
254 videoFiles: webtorrentOptions.videoFiles
255 }
256 Object.assign(plugins, { webtorrent })
257
258 // WebTorrent plugin handles autoplay, because we do some hackish stuff in there
259 autoplay = false
260 }
261
262 const videojsOptions = {
263 html5,
264
265 // We don't use text track settings for now
266 textTrackSettings: false,
267 controls: commonOptions.controls !== undefined ? commonOptions.controls : true,
268 loop: commonOptions.loop !== undefined ? commonOptions.loop : false,
269
270 muted: commonOptions.muted !== undefined
271 ? commonOptions.muted
272 : undefined, // Undefined so the player knows it has to check the local storage
273
274 poster: commonOptions.poster,
275 autoplay: autoplay === true ? 'any' : autoplay, // Use 'any' instead of true to get notifier by videojs if autoplay fails
276 inactivityTimeout: commonOptions.inactivityTimeout,
277 playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
278 plugins,
279 controlBar: {
280 children: this.getControlBarChildren(mode, {
281 captions: commonOptions.captions,
282 peertubeLink: commonOptions.peertubeLink,
283 theaterMode: commonOptions.theaterMode
284 })
285 }
286 }
287
288 if (commonOptions.enableHotkeys === true) {
289 Object.assign(videojsOptions.plugins, {
290 hotkeys: {
291 enableVolumeScroll: false,
292 enableModifiersForNumbers: false,
293
294 fullscreenKey: function (event: KeyboardEvent) {
295 // fullscreen with the f key or Ctrl+Enter
296 return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
297 },
298
299 seekStep: function (event: KeyboardEvent) {
300 // mimic VLC seek behavior, and default to 5 (original value is 5).
301 if (event.ctrlKey && event.altKey) {
302 return 5 * 60
303 } else if (event.ctrlKey) {
304 return 60
305 } else if (event.altKey) {
306 return 10
307 } else {
308 return 5
309 }
310 },
311
312 customKeys: {
313 increasePlaybackRateKey: {
314 key: function (event: KeyboardEvent) {
315 return event.key === '>'
316 },
317 handler: function (player: videojs.Player) {
318 player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
319 }
320 },
321 decreasePlaybackRateKey: {
322 key: function (event: KeyboardEvent) {
323 return event.key === '<'
324 },
325 handler: function (player: videojs.Player) {
326 player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
327 }
328 },
329 frameByFrame: {
330 key: function (event: KeyboardEvent) {
331 return event.key === '.'
332 },
333 handler: function (player: videojs.Player) {
334 player.pause()
335 // Calculate movement distance (assuming 30 fps)
336 const dist = 1 / 30
337 player.currentTime(player.currentTime() + dist)
338 }
339 }
340 }
341 }
342 })
343 }
344
345 if (commonOptions.language && !isDefaultLocale(commonOptions.language)) {
346 Object.assign(videojsOptions, { language: commonOptions.language })
347 }
348
349 return videojsOptions
350 }
351
352 private static getControlBarChildren (mode: PlayerMode, options: {
353 peertubeLink: boolean
354 theaterMode: boolean,
355 captions: boolean
356 }) {
357 const settingEntries = []
358 const loadProgressBar = mode === 'webtorrent' ? 'peerTubeLoadProgressBar' : 'loadProgressBar'
359
360 // Keep an order
361 settingEntries.push('playbackRateMenuButton')
362 if (options.captions === true) settingEntries.push('captionsButton')
363 settingEntries.push('resolutionMenuButton')
364
365 const children = {
366 'playToggle': {},
367 'currentTimeDisplay': {},
368 'timeDivider': {},
369 'durationDisplay': {},
370 'liveDisplay': {},
371
372 'flexibleWidthSpacer': {},
373 'progressControl': {
374 children: {
375 'seekBar': {
376 children: {
377 [loadProgressBar]: {},
378 'mouseTimeDisplay': {},
379 'playProgressBar': {}
380 }
381 }
382 }
383 },
384
385 'p2PInfoButton': {},
386
387 'muteToggle': {},
388 'volumeControl': {},
389
390 'settingsButton': {
391 setup: {
392 maxHeightOffset: 40
393 },
394 entries: settingEntries
395 }
396 }
397
398 if (options.peertubeLink === true) {
399 Object.assign(children, {
400 'peerTubeLinkButton': {}
401 })
402 }
403
404 if (options.theaterMode === true) {
405 Object.assign(children, {
406 'theaterButton': {}
407 })
408 }
409
410 Object.assign(children, {
411 'fullscreenToggle': {}
412 })
413
414 return children
415 }
416
417 private static addContextMenu (mode: PlayerMode, player: any, videoEmbedUrl: string) {
418 const content = [
419 {
420 label: player.localize('Copy the video URL'),
421 listener: function () {
422 copyToClipboard(buildVideoLink())
423 }
424 },
425 {
426 label: player.localize('Copy the video URL at the current time'),
427 listener: function () {
428 const player = this as videojs.Player
429 copyToClipboard(buildVideoLink(player.currentTime()))
430 }
431 },
432 {
433 label: player.localize('Copy embed code'),
434 listener: () => {
435 copyToClipboard(buildVideoEmbed(videoEmbedUrl))
436 }
437 }
438 ]
439
440 if (mode === 'webtorrent') {
441 content.push({
442 label: player.localize('Copy magnet URI'),
443 listener: function () {
444 const player = this as videojs.Player
445 copyToClipboard(player.webtorrent().getCurrentVideoFile().magnetUri)
446 }
447 })
448 }
449
450 player.contextmenuUI({ content })
451 }
452
453 private static getLocalePath (serverUrl: string, locale: string) {
454 const completeLocale = getCompleteLocale(locale)
455
456 if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
457
458 return serverUrl + '/client/locales/' + completeLocale
459 }
460}
461
462// ############################################################################
463
464export {
465 videojs
466}
diff --git a/client/src/assets/player/peertube-player.ts b/client/src/assets/player/peertube-player.ts
deleted file mode 100644
index 792662b6c..000000000
--- a/client/src/assets/player/peertube-player.ts
+++ /dev/null
@@ -1,284 +0,0 @@
1import { VideoFile } from '../../../../shared/models/videos'
2
3import 'videojs-hotkeys'
4import 'videojs-dock'
5import 'videojs-contextmenu-ui'
6import './peertube-link-button'
7import './resolution-menu-button'
8import './settings-menu-button'
9import './webtorrent-info-button'
10import './peertube-videojs-plugin'
11import './peertube-load-progress-bar'
12import './theater-button'
13import { UserWatching, VideoJSCaption, videojsUntyped } from './peertube-videojs-typings'
14import { buildVideoEmbed, buildVideoLink, copyToClipboard } from './utils'
15import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
16
17// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
18videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
19// Change Captions to Subtitles/CC
20videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
21// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
22videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
23
24function getVideojsOptions (options: {
25 autoplay: boolean,
26 playerElement: HTMLVideoElement,
27 videoViewUrl: string,
28 videoDuration: number,
29 videoFiles: VideoFile[],
30 enableHotkeys: boolean,
31 inactivityTimeout: number,
32 peertubeLink: boolean,
33 poster: string,
34 startTime: number | string
35 theaterMode: boolean,
36 videoCaptions: VideoJSCaption[],
37
38 language?: string,
39 controls?: boolean,
40 muted?: boolean,
41 loop?: boolean
42
43 userWatching?: UserWatching
44}) {
45 const videojsOptions = {
46 // We don't use text track settings for now
47 textTrackSettings: false,
48 controls: options.controls !== undefined ? options.controls : true,
49 muted: options.controls !== undefined ? options.muted : false,
50 loop: options.loop !== undefined ? options.loop : false,
51 poster: options.poster,
52 autoplay: false,
53 inactivityTimeout: options.inactivityTimeout,
54 playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
55 plugins: {
56 peertube: {
57 autoplay: options.autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
58 videoCaptions: options.videoCaptions,
59 videoFiles: options.videoFiles,
60 playerElement: options.playerElement,
61 videoViewUrl: options.videoViewUrl,
62 videoDuration: options.videoDuration,
63 startTime: options.startTime,
64 userWatching: options.userWatching
65 }
66 },
67 controlBar: {
68 children: getControlBarChildren(options)
69 }
70 }
71
72 if (options.enableHotkeys === true) {
73 Object.assign(videojsOptions.plugins, {
74 hotkeys: {
75 enableVolumeScroll: false,
76 enableModifiersForNumbers: false,
77
78 fullscreenKey: function (event) {
79 // fullscreen with the f key or Ctrl+Enter
80 return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
81 },
82
83 seekStep: function (event) {
84 // mimic VLC seek behavior, and default to 5 (original value is 5).
85 if (event.ctrlKey && event.altKey) {
86 return 5 * 60
87 } else if (event.ctrlKey) {
88 return 60
89 } else if (event.altKey) {
90 return 10
91 } else {
92 return 5
93 }
94 },
95
96 customKeys: {
97 increasePlaybackRateKey: {
98 key: function (event) {
99 return event.key === '>'
100 },
101 handler: function (player) {
102 player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
103 }
104 },
105 decreasePlaybackRateKey: {
106 key: function (event) {
107 return event.key === '<'
108 },
109 handler: function (player) {
110 player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
111 }
112 },
113 frameByFrame: {
114 key: function (event) {
115 return event.key === '.'
116 },
117 handler: function (player, options, event) {
118 player.pause()
119 // Calculate movement distance (assuming 30 fps)
120 const dist = 1 / 30
121 player.currentTime(player.currentTime() + dist)
122 }
123 }
124 }
125 }
126 })
127 }
128
129 if (options.language && !isDefaultLocale(options.language)) {
130 Object.assign(videojsOptions, { language: options.language })
131 }
132
133 return videojsOptions
134}
135
136function getControlBarChildren (options: {
137 peertubeLink: boolean
138 theaterMode: boolean,
139 videoCaptions: VideoJSCaption[]
140}) {
141 const settingEntries = []
142
143 // Keep an order
144 settingEntries.push('playbackRateMenuButton')
145 if (options.videoCaptions.length !== 0) settingEntries.push('captionsButton')
146 settingEntries.push('resolutionMenuButton')
147
148 const children = {
149 'playToggle': {},
150 'currentTimeDisplay': {},
151 'timeDivider': {},
152 'durationDisplay': {},
153 'liveDisplay': {},
154
155 'flexibleWidthSpacer': {},
156 'progressControl': {
157 children: {
158 'seekBar': {
159 children: {
160 'peerTubeLoadProgressBar': {},
161 'mouseTimeDisplay': {},
162 'playProgressBar': {}
163 }
164 }
165 }
166 },
167
168 'webTorrentButton': {},
169
170 'muteToggle': {},
171 'volumeControl': {},
172
173 'settingsButton': {
174 setup: {
175 maxHeightOffset: 40
176 },
177 entries: settingEntries
178 }
179 }
180
181 if (options.peertubeLink === true) {
182 Object.assign(children, {
183 'peerTubeLinkButton': {}
184 })
185 }
186
187 if (options.theaterMode === true) {
188 Object.assign(children, {
189 'theaterButton': {}
190 })
191 }
192
193 Object.assign(children, {
194 'fullscreenToggle': {}
195 })
196
197 return children
198}
199
200function addContextMenu (player: any, videoEmbedUrl: string) {
201 player.contextmenuUI({
202 content: [
203 {
204 label: player.localize('Copy the video URL'),
205 listener: function () {
206 copyToClipboard(buildVideoLink())
207 }
208 },
209 {
210 label: player.localize('Copy the video URL at the current time'),
211 listener: function () {
212 const player = this
213 copyToClipboard(buildVideoLink(player.currentTime()))
214 }
215 },
216 {
217 label: player.localize('Copy embed code'),
218 listener: () => {
219 copyToClipboard(buildVideoEmbed(videoEmbedUrl))
220 }
221 },
222 {
223 label: player.localize('Copy magnet URI'),
224 listener: function () {
225 const player = this
226 copyToClipboard(player.peertube().getCurrentVideoFile().magnetUri)
227 }
228 }
229 ]
230 })
231}
232
233function loadLocaleInVideoJS (serverUrl: string, videojs: any, locale: string) {
234 const path = getLocalePath(serverUrl, locale)
235 // It is the default locale, nothing to translate
236 if (!path) return Promise.resolve(undefined)
237
238 let p: Promise<any>
239
240 if (loadLocaleInVideoJS.cache[path]) {
241 p = Promise.resolve(loadLocaleInVideoJS.cache[path])
242 } else {
243 p = fetch(path + '/player.json')
244 .then(res => res.json())
245 .then(json => {
246 loadLocaleInVideoJS.cache[path] = json
247 return json
248 })
249 }
250
251 const completeLocale = getCompleteLocale(locale)
252 return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
253}
254namespace loadLocaleInVideoJS {
255 export const cache: { [ path: string ]: any } = {}
256}
257
258function getServerTranslations (serverUrl: string, locale: string) {
259 const path = getLocalePath(serverUrl, locale)
260 // It is the default locale, nothing to translate
261 if (!path) return Promise.resolve(undefined)
262
263 return fetch(path + '/server.json')
264 .then(res => res.json())
265}
266
267// ############################################################################
268
269export {
270 getServerTranslations,
271 loadLocaleInVideoJS,
272 getVideojsOptions,
273 addContextMenu
274}
275
276// ############################################################################
277
278function getLocalePath (serverUrl: string, locale: string) {
279 const completeLocale = getCompleteLocale(locale)
280
281 if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
282
283 return serverUrl + '/client/locales/' + completeLocale
284}
diff --git a/client/src/assets/player/peertube-plugin.ts b/client/src/assets/player/peertube-plugin.ts
new file mode 100644
index 000000000..7ea4a06d4
--- /dev/null
+++ b/client/src/assets/player/peertube-plugin.ts
@@ -0,0 +1,262 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import * as videojs from 'video.js'
4import './videojs-components/settings-menu-button'
5import {
6 PeerTubePluginOptions,
7 ResolutionUpdateData,
8 UserWatching,
9 VideoJSCaption,
10 VideoJSComponentInterface,
11 videojsUntyped
12} from './peertube-videojs-typings'
13import { isMobile, timeToInt } from './utils'
14import {
15 getStoredLastSubtitle,
16 getStoredMute,
17 getStoredVolume,
18 saveLastSubtitle,
19 saveMuteInStore,
20 saveVolumeInStore
21} from './peertube-player-local-storage'
22
23const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
24class PeerTubePlugin extends Plugin {
25 private readonly autoplay: boolean = false
26 private readonly startTime: number = 0
27 private readonly videoViewUrl: string
28 private readonly videoDuration: number
29 private readonly CONSTANTS = {
30 USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
31 }
32
33 private player: any
34 private videoCaptions: VideoJSCaption[]
35 private defaultSubtitle: string
36
37 private videoViewInterval: any
38 private userWatchingVideoInterval: any
39 private qualityObservationTimer: any
40 private lastResolutionChange: ResolutionUpdateData
41
42 constructor (player: videojs.Player, options: PeerTubePluginOptions) {
43 super(player, options)
44
45 this.startTime = timeToInt(options.startTime)
46 this.videoViewUrl = options.videoViewUrl
47 this.videoDuration = options.videoDuration
48 this.videoCaptions = options.videoCaptions
49
50 if (options.autoplay === true) this.player.addClass('vjs-has-autoplay')
51
52 this.player.on('autoplay-failure', () => {
53 this.player.removeClass('vjs-has-autoplay')
54 })
55
56 this.player.ready(() => {
57 const playerOptions = this.player.options_
58
59 if (options.mode === 'webtorrent') {
60 this.player.webtorrent().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
61 this.player.webtorrent().on('autoResolutionChange', (_: any, d: any) => this.trigger('autoResolutionChange', d))
62 }
63
64 if (options.mode === 'p2p-media-loader') {
65 this.player.p2pMediaLoader().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
66 }
67
68 this.player.tech_.on('loadedqualitydata', () => {
69 setTimeout(() => {
70 // Replay a resolution change, now we loaded all quality data
71 if (this.lastResolutionChange) this.handleResolutionChange(this.lastResolutionChange)
72 }, 0)
73 })
74
75 const volume = getStoredVolume()
76 if (volume !== undefined) this.player.volume(volume)
77
78 const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
79 if (muted !== undefined) this.player.muted(muted)
80
81 this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
82
83 this.player.on('volumechange', () => {
84 saveVolumeInStore(this.player.volume())
85 saveMuteInStore(this.player.muted())
86 })
87
88 this.player.textTracks().on('change', () => {
89 const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
90 return t.kind === 'captions' && t.mode === 'showing'
91 })
92
93 if (!showing) {
94 saveLastSubtitle('off')
95 return
96 }
97
98 saveLastSubtitle(showing.language)
99 })
100
101 this.player.on('sourcechange', () => this.initCaptions())
102
103 this.player.duration(options.videoDuration)
104
105 this.initializePlayer()
106 this.runViewAdd()
107
108 if (options.userWatching) this.runUserWatchVideo(options.userWatching)
109 })
110 }
111
112 dispose () {
113 clearTimeout(this.qualityObservationTimer)
114
115 clearInterval(this.videoViewInterval)
116
117 if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
118 }
119
120 private initializePlayer () {
121 if (isMobile()) this.player.addClass('vjs-is-mobile')
122
123 this.initSmoothProgressBar()
124
125 this.initCaptions()
126
127 this.alterInactivity()
128 }
129
130 private runViewAdd () {
131 this.clearVideoViewInterval()
132
133 // After 30 seconds (or 3/4 of the video), add a view to the video
134 let minSecondsToView = 30
135
136 if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
137
138 let secondsViewed = 0
139 this.videoViewInterval = setInterval(() => {
140 if (this.player && !this.player.paused()) {
141 secondsViewed += 1
142
143 if (secondsViewed > minSecondsToView) {
144 this.clearVideoViewInterval()
145
146 this.addViewToVideo().catch(err => console.error(err))
147 }
148 }
149 }, 1000)
150 }
151
152 private runUserWatchVideo (options: UserWatching) {
153 let lastCurrentTime = 0
154
155 this.userWatchingVideoInterval = setInterval(() => {
156 const currentTime = Math.floor(this.player.currentTime())
157
158 if (currentTime - lastCurrentTime >= 1) {
159 lastCurrentTime = currentTime
160
161 this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
162 .catch(err => console.error('Cannot notify user is watching.', err))
163 }
164 }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
165 }
166
167 private clearVideoViewInterval () {
168 if (this.videoViewInterval !== undefined) {
169 clearInterval(this.videoViewInterval)
170 this.videoViewInterval = undefined
171 }
172 }
173
174 private addViewToVideo () {
175 if (!this.videoViewUrl) return Promise.resolve(undefined)
176
177 return fetch(this.videoViewUrl, { method: 'POST' })
178 }
179
180 private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) {
181 const body = new URLSearchParams()
182 body.append('currentTime', currentTime.toString())
183
184 const headers = new Headers({ 'Authorization': authorizationHeader })
185
186 return fetch(url, { method: 'PUT', body, headers })
187 }
188
189 private handleResolutionChange (data: ResolutionUpdateData) {
190 this.lastResolutionChange = data
191
192 const qualityLevels = this.player.qualityLevels()
193
194 for (let i = 0; i < qualityLevels.length; i++) {
195 if (qualityLevels[i].height === data.resolutionId) {
196 data.id = qualityLevels[i].id
197 break
198 }
199 }
200
201 this.trigger('resolutionChange', data)
202 }
203
204 private alterInactivity () {
205 let saveInactivityTimeout: number
206
207 const disableInactivity = () => {
208 saveInactivityTimeout = this.player.options_.inactivityTimeout
209 this.player.options_.inactivityTimeout = 0
210 }
211 const enableInactivity = () => {
212 this.player.options_.inactivityTimeout = saveInactivityTimeout
213 }
214
215 const settingsDialog = this.player.children_.find((c: any) => c.name_ === 'SettingsDialog')
216
217 this.player.controlBar.on('mouseenter', () => disableInactivity())
218 settingsDialog.on('mouseenter', () => disableInactivity())
219 this.player.controlBar.on('mouseleave', () => enableInactivity())
220 settingsDialog.on('mouseleave', () => enableInactivity())
221 }
222
223 private initCaptions () {
224 for (const caption of this.videoCaptions) {
225 this.player.addRemoteTextTrack({
226 kind: 'captions',
227 label: caption.label,
228 language: caption.language,
229 id: caption.language,
230 src: caption.src,
231 default: this.defaultSubtitle === caption.language
232 }, false)
233 }
234
235 this.player.trigger('captionsChanged')
236 }
237
238 // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657
239 private initSmoothProgressBar () {
240 const SeekBar = videojsUntyped.getComponent('SeekBar')
241 SeekBar.prototype.getPercent = function getPercent () {
242 // Allows for smooth scrubbing, when player can't keep up.
243 // const time = (this.player_.scrubbing()) ?
244 // this.player_.getCache().currentTime :
245 // this.player_.currentTime()
246 const time = this.player_.currentTime()
247 const percent = time / this.player_.duration()
248 return percent >= 1 ? 1 : percent
249 }
250 SeekBar.prototype.handleMouseMove = function handleMouseMove (event: any) {
251 let newTime = this.calculateDistance(event) * this.player_.duration()
252 if (newTime === this.player_.duration()) {
253 newTime = newTime - 0.1
254 }
255 this.player_.currentTime(newTime)
256 this.update()
257 }
258 }
259}
260
261videojs.registerPlugin('peertube', PeerTubePlugin)
262export { PeerTubePlugin }
diff --git a/client/src/assets/player/peertube-videojs-typings.ts b/client/src/assets/player/peertube-videojs-typings.ts
index b117007af..79a5a6c4d 100644
--- a/client/src/assets/player/peertube-videojs-typings.ts
+++ b/client/src/assets/player/peertube-videojs-typings.ts
@@ -1,19 +1,27 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
1import * as videojs from 'video.js' 3import * as videojs from 'video.js'
4
2import { VideoFile } from '../../../../shared/models/videos/video.model' 5import { VideoFile } from '../../../../shared/models/videos/video.model'
3import { PeerTubePlugin } from './peertube-videojs-plugin' 6import { PeerTubePlugin } from './peertube-plugin'
7import { WebTorrentPlugin } from './webtorrent/webtorrent-plugin'
8import { P2pMediaLoaderPlugin } from './p2p-media-loader/p2p-media-loader-plugin'
9import { PlayerMode } from './peertube-player-manager'
4 10
5declare namespace videojs { 11declare namespace videojs {
6 interface Player { 12 interface Player {
7 peertube (): PeerTubePlugin 13 peertube (): PeerTubePlugin
14 webtorrent (): WebTorrentPlugin
15 p2pMediaLoader (): P2pMediaLoaderPlugin
8 } 16 }
9} 17}
10 18
11interface VideoJSComponentInterface { 19interface VideoJSComponentInterface {
12 _player: videojs.Player 20 _player: videojs.Player
13 21
14 new (player: videojs.Player, options?: any) 22 new (player: videojs.Player, options?: any): any
15 23
16 registerComponent (name: string, obj: any) 24 registerComponent (name: string, obj: any): any
17} 25}
18 26
19type VideoJSCaption = { 27type VideoJSCaption = {
@@ -27,25 +35,95 @@ type UserWatching = {
27 authorizationHeader: string 35 authorizationHeader: string
28} 36}
29 37
30type PeertubePluginOptions = { 38type PeerTubePluginOptions = {
31 videoFiles: VideoFile[] 39 mode: PlayerMode
32 playerElement: HTMLVideoElement 40
41 autoplay: boolean
33 videoViewUrl: string 42 videoViewUrl: string
34 videoDuration: number 43 videoDuration: number
35 startTime: number | string 44 startTime: number | string
36 autoplay: boolean,
37 videoCaptions: VideoJSCaption[]
38 45
39 userWatching?: UserWatching 46 userWatching?: UserWatching
47 subtitle?: string
48
49 videoCaptions: VideoJSCaption[]
50}
51
52type WebtorrentPluginOptions = {
53 playerElement: HTMLVideoElement
54
55 autoplay: boolean
56 videoDuration: number
57
58 videoFiles: VideoFile[]
59}
60
61type P2PMediaLoaderPluginOptions = {
62 redundancyBaseUrls: string[]
63 type: string
64 src: string
65}
66
67type VideoJSPluginOptions = {
68 peertube: PeerTubePluginOptions
69
70 webtorrent?: WebtorrentPluginOptions
71
72 p2pMediaLoader?: P2PMediaLoaderPluginOptions
40} 73}
41 74
42// videojs typings don't have some method we need 75// videojs typings don't have some method we need
43const videojsUntyped = videojs as any 76const videojsUntyped = videojs as any
44 77
78type LoadedQualityData = {
79 qualitySwitchCallback: Function,
80 qualityData: {
81 video: {
82 id: number
83 label: string
84 selected: boolean
85 }[]
86 }
87}
88
89type ResolutionUpdateData = {
90 auto: boolean,
91 resolutionId: number
92 id?: number
93}
94
95type AutoResolutionUpdateData = {
96 possible: boolean
97}
98
99type PlayerNetworkInfo = {
100 http: {
101 downloadSpeed: number
102 uploadSpeed: number
103 downloaded: number
104 uploaded: number
105 }
106
107 p2p: {
108 downloadSpeed: number
109 uploadSpeed: number
110 downloaded: number
111 uploaded: number
112 numPeers: number
113 }
114}
115
45export { 116export {
117 PlayerNetworkInfo,
118 ResolutionUpdateData,
119 AutoResolutionUpdateData,
46 VideoJSComponentInterface, 120 VideoJSComponentInterface,
47 PeertubePluginOptions,
48 videojsUntyped, 121 videojsUntyped,
49 VideoJSCaption, 122 VideoJSCaption,
50 UserWatching 123 UserWatching,
124 PeerTubePluginOptions,
125 WebtorrentPluginOptions,
126 P2PMediaLoaderPluginOptions,
127 VideoJSPluginOptions,
128 LoadedQualityData
51} 129}
diff --git a/client/src/assets/player/resolution-menu-button.ts b/client/src/assets/player/resolution-menu-button.ts
deleted file mode 100644
index d53a24151..000000000
--- a/client/src/assets/player/resolution-menu-button.ts
+++ /dev/null
@@ -1,85 +0,0 @@
1import * as videojs from 'video.js'
2import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
3import { ResolutionMenuItem } from './resolution-menu-item'
4
5const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
6const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
7class ResolutionMenuButton extends MenuButton {
8 label: HTMLElement
9
10 constructor (player: videojs.Player, options) {
11 super(player, options)
12 this.player = player
13
14 player.peertube().on('videoFileUpdate', () => this.updateLabel())
15 player.peertube().on('autoResolutionUpdate', () => this.updateLabel())
16 }
17
18 createEl () {
19 const el = super.createEl()
20
21 this.labelEl_ = videojsUntyped.dom.createEl('div', {
22 className: 'vjs-resolution-value',
23 innerHTML: this.buildLabelHTML()
24 })
25
26 el.appendChild(this.labelEl_)
27
28 return el
29 }
30
31 updateARIAAttributes () {
32 this.el().setAttribute('aria-label', 'Quality')
33 }
34
35 createMenu () {
36 const menu = new Menu(this.player_)
37 for (const videoFile of this.player_.peertube().videoFiles) {
38 let label = videoFile.resolution.label
39 if (videoFile.fps && videoFile.fps >= 50) {
40 label += videoFile.fps
41 }
42
43 menu.addChild(new ResolutionMenuItem(
44 this.player_,
45 {
46 id: videoFile.resolution.id,
47 label,
48 src: videoFile.magnetUri
49 })
50 )
51 }
52
53 menu.addChild(new ResolutionMenuItem(
54 this.player_,
55 {
56 id: -1,
57 label: this.player_.localize('Auto'),
58 src: null
59 }
60 ))
61
62 return menu
63 }
64
65 updateLabel () {
66 if (!this.labelEl_) return
67
68 this.labelEl_.innerHTML = this.buildLabelHTML()
69 }
70
71 buildCSSClass () {
72 return super.buildCSSClass() + ' vjs-resolution-button'
73 }
74
75 buildWrapperCSSClass () {
76 return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
77 }
78
79 private buildLabelHTML () {
80 return this.player_.peertube().getCurrentResolutionLabel()
81 }
82}
83ResolutionMenuButton.prototype.controlText_ = 'Quality'
84
85MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
diff --git a/client/src/assets/player/resolution-menu-item.ts b/client/src/assets/player/resolution-menu-item.ts
deleted file mode 100644
index 0ab0f53b5..000000000
--- a/client/src/assets/player/resolution-menu-item.ts
+++ /dev/null
@@ -1,64 +0,0 @@
1import * as videojs from 'video.js'
2import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
3
4const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
5class ResolutionMenuItem extends MenuItem {
6
7 constructor (player: videojs.Player, options) {
8 const currentResolutionId = player.peertube().getCurrentResolutionId()
9 options.selectable = true
10 options.selected = options.id === currentResolutionId
11
12 super(player, options)
13
14 this.label = options.label
15 this.id = options.id
16
17 player.peertube().on('videoFileUpdate', () => this.updateSelection())
18 player.peertube().on('autoResolutionUpdate', () => this.updateSelection())
19 }
20
21 handleClick (event) {
22 if (this.id === -1 && this.player_.peertube().isAutoResolutionForbidden()) return
23
24 super.handleClick(event)
25
26 // Auto resolution
27 if (this.id === -1) {
28 this.player_.peertube().enableAutoResolution()
29 return
30 }
31
32 this.player_.peertube().disableAutoResolution()
33 this.player_.peertube().updateResolution(this.id)
34 }
35
36 updateSelection () {
37 // Check if auto resolution is forbidden or not
38 if (this.id === -1) {
39 if (this.player_.peertube().isAutoResolutionForbidden()) {
40 this.addClass('disabled')
41 } else {
42 this.removeClass('disabled')
43 }
44 }
45
46 if (this.player_.peertube().isAutoResolutionOn()) {
47 this.selected(this.id === -1)
48 return
49 }
50
51 this.selected(this.player_.peertube().getCurrentResolutionId() === this.id)
52 }
53
54 getLabel () {
55 if (this.id === -1) {
56 return this.label + ' <small>' + this.player_.peertube().getCurrentResolutionLabel() + '</small>'
57 }
58
59 return this.label
60 }
61}
62MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
63
64export { ResolutionMenuItem }
diff --git a/client/src/assets/player/utils.ts b/client/src/assets/player/utils.ts
index cf4f60f55..8d87567c2 100644
--- a/client/src/assets/player/utils.ts
+++ b/client/src/assets/player/utils.ts
@@ -12,7 +12,7 @@ const dictionaryBytes: Array<{max: number, type: string}> = [
12 { max: 1073741824, type: 'MB' }, 12 { max: 1073741824, type: 'MB' },
13 { max: 1.0995116e12, type: 'GB' } 13 { max: 1.0995116e12, type: 'GB' }
14] 14]
15function bytes (value) { 15function bytes (value: number) {
16 const format = dictionaryBytes.find(d => value < d.max) || dictionaryBytes[dictionaryBytes.length - 1] 16 const format = dictionaryBytes.find(d => value < d.max) || dictionaryBytes[dictionaryBytes.length - 1]
17 const calc = Math.floor(value / (format.max / 1024)).toString() 17 const calc = Math.floor(value / (format.max / 1024)).toString()
18 18
@@ -39,6 +39,7 @@ function buildVideoLink (time?: number, url?: string) {
39} 39}
40 40
41function timeToInt (time: number | string) { 41function timeToInt (time: number | string) {
42 if (!time) return 0
42 if (typeof time === 'number') return time 43 if (typeof time === 'number') return time
43 44
44 const reg = /^((\d+)h)?((\d+)m)?((\d+)s?)?$/ 45 const reg = /^((\d+)h)?((\d+)m)?((\d+)s?)?$/
@@ -111,9 +112,23 @@ function videoFileMinByResolution (files: VideoFile[]) {
111 return min 112 return min
112} 113}
113 114
115function getRtcConfig () {
116 return {
117 iceServers: [
118 {
119 urls: 'stun:stun.stunprotocol.org'
120 },
121 {
122 urls: 'stun:stun.framasoft.org'
123 }
124 ]
125 }
126}
127
114// --------------------------------------------------------------------------- 128// ---------------------------------------------------------------------------
115 129
116export { 130export {
131 getRtcConfig,
117 toTitleCase, 132 toTitleCase,
118 timeToInt, 133 timeToInt,
119 buildVideoLink, 134 buildVideoLink,
diff --git a/client/src/assets/player/webtorrent-info-button.ts b/client/src/assets/player/videojs-components/p2p-info-button.ts
index deef253ce..6424787b2 100644
--- a/client/src/assets/player/webtorrent-info-button.ts
+++ b/client/src/assets/player/videojs-components/p2p-info-button.ts
@@ -1,8 +1,8 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1import { PlayerNetworkInfo, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2import { bytes } from './utils' 2import { bytes } from '../utils'
3 3
4const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 4const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
5class WebtorrentInfoButton extends Button { 5class P2pInfoButton extends Button {
6 6
7 createEl () { 7 createEl () {
8 const div = videojsUntyped.dom.createEl('div', { 8 const div = videojsUntyped.dom.createEl('div', {
@@ -65,7 +65,7 @@ class WebtorrentInfoButton extends Button {
65 subDivHttp.appendChild(subDivHttpText) 65 subDivHttp.appendChild(subDivHttpText)
66 div.appendChild(subDivHttp) 66 div.appendChild(subDivHttp)
67 67
68 this.player_.peertube().on('torrentInfo', (event, data) => { 68 this.player_.on('p2pInfo', (event: any, data: PlayerNetworkInfo) => {
69 // We are in HTTP fallback 69 // We are in HTTP fallback
70 if (!data) { 70 if (!data) {
71 subDivHttp.className = 'vjs-peertube-displayed' 71 subDivHttp.className = 'vjs-peertube-displayed'
@@ -74,11 +74,14 @@ class WebtorrentInfoButton extends Button {
74 return 74 return
75 } 75 }
76 76
77 const downloadSpeed = bytes(data.downloadSpeed) 77 const p2pStats = data.p2p
78 const uploadSpeed = bytes(data.uploadSpeed) 78 const httpStats = data.http
79 const totalDownloaded = bytes(data.downloaded) 79
80 const totalUploaded = bytes(data.uploaded) 80 const downloadSpeed = bytes(p2pStats.downloadSpeed + httpStats.downloadSpeed)
81 const numPeers = data.numPeers 81 const uploadSpeed = bytes(p2pStats.uploadSpeed + httpStats.uploadSpeed)
82 const totalDownloaded = bytes(p2pStats.downloaded + httpStats.downloaded)
83 const totalUploaded = bytes(p2pStats.uploaded + httpStats.uploaded)
84 const numPeers = p2pStats.numPeers
82 85
83 subDivWebtorrent.title = this.player_.localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' + 86 subDivWebtorrent.title = this.player_.localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' +
84 this.player_.localize('Total uploaded: ' + totalUploaded.join(' ')) 87 this.player_.localize('Total uploaded: ' + totalUploaded.join(' '))
@@ -90,7 +93,7 @@ class WebtorrentInfoButton extends Button {
90 uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ] 93 uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ]
91 94
92 peersNumber.textContent = numPeers 95 peersNumber.textContent = numPeers
93 peersText.textContent = ' ' + this.player_.localize('peers') 96 peersText.textContent = ' ' + (numPeers > 1 ? this.player_.localize('peers') : this.player_.localize('peer'))
94 97
95 subDivHttp.className = 'vjs-peertube-hidden' 98 subDivHttp.className = 'vjs-peertube-hidden'
96 subDivWebtorrent.className = 'vjs-peertube-displayed' 99 subDivWebtorrent.className = 'vjs-peertube-displayed'
@@ -99,4 +102,4 @@ class WebtorrentInfoButton extends Button {
99 return div 102 return div
100 } 103 }
101} 104}
102Button.registerComponent('WebTorrentButton', WebtorrentInfoButton) 105Button.registerComponent('P2PInfoButton', P2pInfoButton)
diff --git a/client/src/assets/player/peertube-link-button.ts b/client/src/assets/player/videojs-components/peertube-link-button.ts
index 715207bc0..fed8ea33e 100644
--- a/client/src/assets/player/peertube-link-button.ts
+++ b/client/src/assets/player/videojs-components/peertube-link-button.ts
@@ -1,11 +1,13 @@
1import * as videojs from 'video.js' 1import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 2import { buildVideoLink } from '../utils'
3import { buildVideoLink } from './utils' 3// FIXME: something weird with our path definition in tsconfig and typings
4// @ts-ignore
5import { Player } from 'video.js'
4 6
5const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 7const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
6class PeerTubeLinkButton extends Button { 8class PeerTubeLinkButton extends Button {
7 9
8 constructor (player: videojs.Player, options) { 10 constructor (player: Player, options: any) {
9 super(player, options) 11 super(player, options)
10 } 12 }
11 13
diff --git a/client/src/assets/player/peertube-load-progress-bar.ts b/client/src/assets/player/videojs-components/peertube-load-progress-bar.ts
index aedc641e4..9a0e3b550 100644
--- a/client/src/assets/player/peertube-load-progress-bar.ts
+++ b/client/src/assets/player/videojs-components/peertube-load-progress-bar.ts
@@ -1,10 +1,13 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2// FIXME: something weird with our path definition in tsconfig and typings
3// @ts-ignore
4import { Player } from 'video.js'
2 5
3const Component: VideoJSComponentInterface = videojsUntyped.getComponent('Component') 6const Component: VideoJSComponentInterface = videojsUntyped.getComponent('Component')
4 7
5class PeerTubeLoadProgressBar extends Component { 8class PeerTubeLoadProgressBar extends Component {
6 9
7 constructor (player, options) { 10 constructor (player: Player, options: any) {
8 super(player, options) 11 super(player, options)
9 this.partEls_ = [] 12 this.partEls_ = []
10 this.on(player, 'progress', this.update) 13 this.on(player, 'progress', this.update)
@@ -24,7 +27,7 @@ class PeerTubeLoadProgressBar extends Component {
24 } 27 }
25 28
26 update () { 29 update () {
27 const torrent = this.player().peertube().getTorrent() 30 const torrent = this.player().webtorrent().getTorrent()
28 if (!torrent) return 31 if (!torrent) return
29 32
30 this.el_.style.width = (torrent.progress * 100) + '%' 33 this.el_.style.width = (torrent.progress * 100) + '%'
diff --git a/client/src/assets/player/videojs-components/resolution-menu-button.ts b/client/src/assets/player/videojs-components/resolution-menu-button.ts
new file mode 100644
index 000000000..abcc16411
--- /dev/null
+++ b/client/src/assets/player/videojs-components/resolution-menu-button.ts
@@ -0,0 +1,109 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { LoadedQualityData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6import { ResolutionMenuItem } from './resolution-menu-item'
7
8const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
9const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
10class ResolutionMenuButton extends MenuButton {
11 label: HTMLElement
12
13 constructor (player: Player, options: any) {
14 super(player, options)
15 this.player = player
16
17 player.tech_.on('loadedqualitydata', (e: any, data: any) => this.buildQualities(data))
18
19 player.peertube().on('resolutionChange', () => setTimeout(() => this.trigger('updateLabel'), 0))
20 }
21
22 createEl () {
23 const el = super.createEl()
24
25 this.labelEl_ = videojsUntyped.dom.createEl('div', {
26 className: 'vjs-resolution-value'
27 })
28
29 el.appendChild(this.labelEl_)
30
31 return el
32 }
33
34 updateARIAAttributes () {
35 this.el().setAttribute('aria-label', 'Quality')
36 }
37
38 createMenu () {
39 return new Menu(this.player_)
40 }
41
42 buildCSSClass () {
43 return super.buildCSSClass() + ' vjs-resolution-button'
44 }
45
46 buildWrapperCSSClass () {
47 return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
48 }
49
50 private addClickListener (component: any) {
51 component.on('click', () => {
52 let children = this.menu.children()
53
54 for (const child of children) {
55 if (component !== child) {
56 child.selected(false)
57 }
58 }
59 })
60 }
61
62 private buildQualities (data: LoadedQualityData) {
63 // The automatic resolution item will need other labels
64 const labels: { [ id: number ]: string } = {}
65
66 data.qualityData.video.sort((a, b) => {
67 if (a.id > b.id) return -1
68 if (a.id === b.id) return 0
69 return 1
70 })
71
72 for (const d of data.qualityData.video) {
73 // Skip auto resolution, we'll add it ourselves
74 if (d.id === -1) continue
75
76 this.menu.addChild(new ResolutionMenuItem(
77 this.player_,
78 {
79 id: d.id,
80 label: d.label,
81 selected: d.selected,
82 callback: data.qualitySwitchCallback
83 })
84 )
85
86 labels[d.id] = d.label
87 }
88
89 this.menu.addChild(new ResolutionMenuItem(
90 this.player_,
91 {
92 id: -1,
93 label: this.player_.localize('Auto'),
94 labels,
95 callback: data.qualitySwitchCallback,
96 selected: true // By default, in auto mode
97 }
98 ))
99
100 for (const m of this.menu.children()) {
101 this.addClickListener(m)
102 }
103
104 this.trigger('menuChanged')
105 }
106}
107ResolutionMenuButton.prototype.controlText_ = 'Quality'
108
109MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
diff --git a/client/src/assets/player/videojs-components/resolution-menu-item.ts b/client/src/assets/player/videojs-components/resolution-menu-item.ts
new file mode 100644
index 000000000..6c42fefd2
--- /dev/null
+++ b/client/src/assets/player/videojs-components/resolution-menu-item.ts
@@ -0,0 +1,83 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { AutoResolutionUpdateData, ResolutionUpdateData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6
7const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
8class ResolutionMenuItem extends MenuItem {
9 private readonly id: number
10 private readonly label: string
11 // Only used for the automatic item
12 private readonly labels: { [id: number]: string }
13 private readonly callback: Function
14
15 private autoResolutionPossible: boolean
16 private currentResolutionLabel: string
17
18 constructor (player: Player, options: any) {
19 options.selectable = true
20
21 super(player, options)
22
23 this.autoResolutionPossible = true
24 this.currentResolutionLabel = ''
25
26 this.label = options.label
27 this.labels = options.labels
28 this.id = options.id
29 this.callback = options.callback
30
31 player.peertube().on('resolutionChange', (_: any, data: ResolutionUpdateData) => this.updateSelection(data))
32
33 // We only want to disable the "Auto" item
34 if (this.id === -1) {
35 player.peertube().on('autoResolutionChange', (_: any, data: AutoResolutionUpdateData) => this.updateAutoResolution(data))
36 }
37 }
38
39 handleClick (event: any) {
40 // Auto button disabled?
41 if (this.autoResolutionPossible === false && this.id === -1) return
42
43 super.handleClick(event)
44
45 this.callback(this.id, 'video')
46 }
47
48 updateSelection (data: ResolutionUpdateData) {
49 if (this.id === -1) {
50 this.currentResolutionLabel = this.labels[data.id]
51 }
52
53 // Automatic resolution only
54 if (data.auto === true) {
55 this.selected(this.id === -1)
56 return
57 }
58
59 this.selected(this.id === data.id)
60 }
61
62 updateAutoResolution (data: AutoResolutionUpdateData) {
63 // Check if the auto resolution is enabled or not
64 if (data.possible === false) {
65 this.addClass('disabled')
66 } else {
67 this.removeClass('disabled')
68 }
69
70 this.autoResolutionPossible = data.possible
71 }
72
73 getLabel () {
74 if (this.id === -1) {
75 return this.label + ' <small>' + this.currentResolutionLabel + '</small>'
76 }
77
78 return this.label
79 }
80}
81MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
82
83export { ResolutionMenuItem }
diff --git a/client/src/assets/player/settings-menu-button.ts b/client/src/assets/player/videojs-components/settings-menu-button.ts
index b51c52506..14cb8ba43 100644
--- a/client/src/assets/player/settings-menu-button.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-button.ts
@@ -1,17 +1,20 @@
1// Author: Yanko Shterev 1// Author: Yanko Shterev
2// Thanks https://github.com/yshterev/videojs-settings-menu 2// Thanks https://github.com/yshterev/videojs-settings-menu
3 3
4// FIXME: something weird with our path definition in tsconfig and typings
5// @ts-ignore
4import * as videojs from 'video.js' 6import * as videojs from 'video.js'
7
5import { SettingsMenuItem } from './settings-menu-item' 8import { SettingsMenuItem } from './settings-menu-item'
6import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 9import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
7import { toTitleCase } from './utils' 10import { toTitleCase } from '../utils'
8 11
9const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 12const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
10const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu') 13const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
11const Component: VideoJSComponentInterface = videojsUntyped.getComponent('Component') 14const Component: VideoJSComponentInterface = videojsUntyped.getComponent('Component')
12 15
13class SettingsButton extends Button { 16class SettingsButton extends Button {
14 constructor (player: videojs.Player, options) { 17 constructor (player: videojs.Player, options: any) {
15 super(player, options) 18 super(player, options)
16 19
17 this.playerComponent = player 20 this.playerComponent = player
@@ -48,7 +51,7 @@ class SettingsButton extends Button {
48 } 51 }
49 } 52 }
50 53
51 onDisposeSettingsItem (event, name: string) { 54 onDisposeSettingsItem (event: any, name: string) {
52 if (name === undefined) { 55 if (name === undefined) {
53 let children = this.menu.children() 56 let children = this.menu.children()
54 57
@@ -74,7 +77,7 @@ class SettingsButton extends Button {
74 } 77 }
75 } 78 }
76 79
77 onAddSettingsItem (event, data) { 80 onAddSettingsItem (event: any, data: any) {
78 const [ entry, options ] = data 81 const [ entry, options ] = data
79 82
80 this.addMenuItem(entry, options) 83 this.addMenuItem(entry, options)
@@ -120,7 +123,7 @@ class SettingsButton extends Button {
120 this.resetChildren() 123 this.resetChildren()
121 } 124 }
122 125
123 getComponentSize (element) { 126 getComponentSize (element: any) {
124 let width: number = null 127 let width: number = null
125 let height: number = null 128 let height: number = null
126 129
@@ -178,8 +181,8 @@ class SettingsButton extends Button {
178 this.panelChild.addChild(this.menu) 181 this.panelChild.addChild(this.menu)
179 } 182 }
180 183
181 addMenuItem (entry, options) { 184 addMenuItem (entry: any, options: any) {
182 const openSubMenu = function () { 185 const openSubMenu = function (this: any) {
183 if (videojsUntyped.dom.hasClass(this.el_, 'open')) { 186 if (videojsUntyped.dom.hasClass(this.el_, 'open')) {
184 videojsUntyped.dom.removeClass(this.el_, 'open') 187 videojsUntyped.dom.removeClass(this.el_, 'open')
185 } else { 188 } else {
@@ -218,7 +221,7 @@ class SettingsButton extends Button {
218} 221}
219 222
220class SettingsPanel extends Component { 223class SettingsPanel extends Component {
221 constructor (player: videojs.Player, options) { 224 constructor (player: videojs.Player, options: any) {
222 super(player, options) 225 super(player, options)
223 } 226 }
224 227
@@ -232,7 +235,7 @@ class SettingsPanel extends Component {
232} 235}
233 236
234class SettingsPanelChild extends Component { 237class SettingsPanelChild extends Component {
235 constructor (player: videojs.Player, options) { 238 constructor (player: videojs.Player, options: any) {
236 super(player, options) 239 super(player, options)
237 } 240 }
238 241
@@ -246,7 +249,7 @@ class SettingsPanelChild extends Component {
246} 249}
247 250
248class SettingsDialog extends Component { 251class SettingsDialog extends Component {
249 constructor (player: videojs.Player, options) { 252 constructor (player: videojs.Player, options: any) {
250 super(player, options) 253 super(player, options)
251 this.hide() 254 this.hide()
252 } 255 }
diff --git a/client/src/assets/player/settings-menu-item.ts b/client/src/assets/player/videojs-components/settings-menu-item.ts
index 665ce6fc2..f14959f9c 100644
--- a/client/src/assets/player/settings-menu-item.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-item.ts
@@ -1,16 +1,19 @@
1// Author: Yanko Shterev 1// Author: Yanko Shterev
2// Thanks https://github.com/yshterev/videojs-settings-menu 2// Thanks https://github.com/yshterev/videojs-settings-menu
3 3
4// FIXME: something weird with our path definition in tsconfig and typings
5// @ts-ignore
4import * as videojs from 'video.js' 6import * as videojs from 'video.js'
5import { toTitleCase } from './utils' 7
6import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 8import { toTitleCase } from '../utils'
9import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
7 10
8const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem') 11const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
9const component: VideoJSComponentInterface = videojsUntyped.getComponent('Component') 12const component: VideoJSComponentInterface = videojsUntyped.getComponent('Component')
10 13
11class SettingsMenuItem extends MenuItem { 14class SettingsMenuItem extends MenuItem {
12 15
13 constructor (player: videojs.Player, options, entry: string, menuButton: VideoJSComponentInterface) { 16 constructor (player: videojs.Player, options: any, entry: string, menuButton: VideoJSComponentInterface) {
14 super(player, options) 17 super(player, options)
15 18
16 this.settingsButton = menuButton 19 this.settingsButton = menuButton
@@ -45,6 +48,19 @@ class SettingsMenuItem extends MenuItem {
45 // Update on rate change 48 // Update on rate change
46 player.on('ratechange', this.submenuClickHandler) 49 player.on('ratechange', this.submenuClickHandler)
47 50
51 if (subMenuName === 'CaptionsButton') {
52 // Hack to regenerate captions on HTTP fallback
53 player.on('captionsChanged', () => {
54 setTimeout(() => {
55 this.settingsSubMenuEl_.innerHTML = ''
56 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
57 this.update()
58 this.bindClickEvents()
59
60 }, 0)
61 })
62 }
63
48 this.reset() 64 this.reset()
49 }, 0) 65 }, 0)
50 }) 66 })
@@ -55,7 +71,7 @@ class SettingsMenuItem extends MenuItem {
55 this.transitionEndHandler = this.onTransitionEnd.bind(this) 71 this.transitionEndHandler = this.onTransitionEnd.bind(this)
56 } 72 }
57 73
58 onSubmenuClick (event) { 74 onSubmenuClick (event: any) {
59 let target = null 75 let target = null
60 76
61 if (event.type === 'tap') { 77 if (event.type === 'tap') {
@@ -150,7 +166,7 @@ class SettingsMenuItem extends MenuItem {
150 * 166 *
151 * @method PrefixedEvent 167 * @method PrefixedEvent
152 */ 168 */
153 PrefixedEvent (element, type, callback, action = 'addEvent') { 169 PrefixedEvent (element: any, type: any, callback: any, action = 'addEvent') {
154 let prefix = ['webkit', 'moz', 'MS', 'o', ''] 170 let prefix = ['webkit', 'moz', 'MS', 'o', '']
155 171
156 for (let p = 0; p < prefix.length; p++) { 172 for (let p = 0; p < prefix.length; p++) {
@@ -166,7 +182,7 @@ class SettingsMenuItem extends MenuItem {
166 } 182 }
167 } 183 }
168 184
169 onTransitionEnd (event) { 185 onTransitionEnd (event: any) {
170 if (event.propertyName !== 'margin-right') { 186 if (event.propertyName !== 'margin-right') {
171 return 187 return
172 } 188 }
@@ -204,12 +220,14 @@ class SettingsMenuItem extends MenuItem {
204 } 220 }
205 221
206 build () { 222 build () {
207 const saveUpdateLabel = this.subMenu.updateLabel 223 this.subMenu.on('updateLabel', () => {
208 this.subMenu.updateLabel = () => {
209 this.update() 224 this.update()
210 225 })
211 saveUpdateLabel.call(this.subMenu) 226 this.subMenu.on('menuChanged', () => {
212 } 227 this.bindClickEvents()
228 this.setSize()
229 this.update()
230 })
213 231
214 this.settingsSubMenuTitleEl_.innerHTML = this.player_.localize(this.subMenu.controlText_) 232 this.settingsSubMenuTitleEl_.innerHTML = this.player_.localize(this.subMenu.controlText_)
215 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_) 233 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
@@ -217,7 +235,7 @@ class SettingsMenuItem extends MenuItem {
217 this.update() 235 this.update()
218 236
219 this.createBackButton() 237 this.createBackButton()
220 this.getSize() 238 this.setSize()
221 this.bindClickEvents() 239 this.bindClickEvents()
222 240
223 // prefixed event listeners for CSS TransitionEnd 241 // prefixed event listeners for CSS TransitionEnd
@@ -229,8 +247,8 @@ class SettingsMenuItem extends MenuItem {
229 ) 247 )
230 } 248 }
231 249
232 update (event?: Event) { 250 update (event?: any) {
233 let target = null 251 let target: HTMLElement = null
234 let subMenu = this.subMenu.name() 252 let subMenu = this.subMenu.name()
235 253
236 if (event && event.type === 'tap') { 254 if (event && event.type === 'tap') {
@@ -279,8 +297,9 @@ class SettingsMenuItem extends MenuItem {
279 297
280 // save size of submenus on first init 298 // save size of submenus on first init
281 // if number of submenu items change dynamically more logic will be needed 299 // if number of submenu items change dynamically more logic will be needed
282 getSize () { 300 setSize () {
283 this.dialog.removeClass('vjs-hidden') 301 this.dialog.removeClass('vjs-hidden')
302 videojsUntyped.dom.removeClass(this.settingsSubMenuEl_, 'vjs-hidden')
284 this.size = this.settingsButton.getComponentSize(this.settingsSubMenuEl_) 303 this.size = this.settingsButton.getComponentSize(this.settingsSubMenuEl_)
285 this.setMargin() 304 this.setMargin()
286 this.dialog.addClass('vjs-hidden') 305 this.dialog.addClass('vjs-hidden')
diff --git a/client/src/assets/player/theater-button.ts b/client/src/assets/player/videojs-components/theater-button.ts
index 5cf0b6425..1e11a9546 100644
--- a/client/src/assets/player/theater-button.ts
+++ b/client/src/assets/player/videojs-components/theater-button.ts
@@ -1,12 +1,16 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1// FIXME: something weird with our path definition in tsconfig and typings
2import { saveTheaterInStore, getStoredTheater } from './peertube-player-local-storage' 2// @ts-ignore
3import * as videojs from 'video.js'
4
5import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6import { saveTheaterInStore, getStoredTheater } from '../peertube-player-local-storage'
3 7
4const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 8const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
5class TheaterButton extends Button { 9class TheaterButton extends Button {
6 10
7 private static readonly THEATER_MODE_CLASS = 'vjs-theater-enabled' 11 private static readonly THEATER_MODE_CLASS = 'vjs-theater-enabled'
8 12
9 constructor (player, options) { 13 constructor (player: videojs.Player, options: any) {
10 super(player, options) 14 super(player, options)
11 15
12 const enabled = getStoredTheater() 16 const enabled = getStoredTheater()
diff --git a/client/src/assets/player/peertube-chunk-store.ts b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
index 767e46821..54cc0ea64 100644
--- a/client/src/assets/player/peertube-chunk-store.ts
+++ b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
@@ -40,15 +40,15 @@ export class PeertubeChunkStore extends EventEmitter {
40 // If the store is full 40 // If the store is full
41 private memoryChunks: { [ id: number ]: Buffer | true } = {} 41 private memoryChunks: { [ id: number ]: Buffer | true } = {}
42 private databaseName: string 42 private databaseName: string
43 private putBulkTimeout 43 private putBulkTimeout: any
44 private cleanerInterval 44 private cleanerInterval: any
45 private db: ChunkDatabase 45 private db: ChunkDatabase
46 private expirationDB: ExpirationDatabase 46 private expirationDB: ExpirationDatabase
47 private readonly length: number 47 private readonly length: number
48 private readonly lastChunkLength: number 48 private readonly lastChunkLength: number
49 private readonly lastChunkIndex: number 49 private readonly lastChunkIndex: number
50 50
51 constructor (chunkLength: number, opts) { 51 constructor (chunkLength: number, opts: any) {
52 super() 52 super()
53 53
54 this.databaseName = 'webtorrent-chunks-' 54 this.databaseName = 'webtorrent-chunks-'
@@ -76,7 +76,7 @@ export class PeertubeChunkStore extends EventEmitter {
76 this.runCleaner() 76 this.runCleaner()
77 } 77 }
78 78
79 put (index: number, buf: Buffer, cb: Function) { 79 put (index: number, buf: Buffer, cb: (err?: Error) => void) {
80 const isLastChunk = (index === this.lastChunkIndex) 80 const isLastChunk = (index === this.lastChunkIndex)
81 if (isLastChunk && buf.length !== this.lastChunkLength) { 81 if (isLastChunk && buf.length !== this.lastChunkLength) {
82 return this.nextTick(cb, new Error('Last chunk length must be ' + this.lastChunkLength)) 82 return this.nextTick(cb, new Error('Last chunk length must be ' + this.lastChunkLength))
@@ -113,13 +113,13 @@ export class PeertubeChunkStore extends EventEmitter {
113 }, PeertubeChunkStore.BUFFERING_PUT_MS) 113 }, PeertubeChunkStore.BUFFERING_PUT_MS)
114 } 114 }
115 115
116 get (index: number, opts, cb) { 116 get (index: number, opts: any, cb: (err?: Error, buf?: Buffer) => void): void {
117 if (typeof opts === 'function') return this.get(index, null, opts) 117 if (typeof opts === 'function') return this.get(index, null, opts)
118 118
119 // IndexDB could be slow, use our memory index first 119 // IndexDB could be slow, use our memory index first
120 const memoryChunk = this.memoryChunks[index] 120 const memoryChunk = this.memoryChunks[index]
121 if (memoryChunk === undefined) { 121 if (memoryChunk === undefined) {
122 const err = new Error('Chunk not found') 122 const err = new Error('Chunk not found') as any
123 err['notFound'] = true 123 err['notFound'] = true
124 124
125 return process.nextTick(() => cb(err)) 125 return process.nextTick(() => cb(err))
@@ -146,11 +146,11 @@ export class PeertubeChunkStore extends EventEmitter {
146 }) 146 })
147 } 147 }
148 148
149 close (db) { 149 close (cb: (err?: Error) => void) {
150 return this.destroy(db) 150 return this.destroy(cb)
151 } 151 }
152 152
153 async destroy (cb) { 153 async destroy (cb: (err?: Error) => void) {
154 try { 154 try {
155 if (this.pendingPut) { 155 if (this.pendingPut) {
156 clearTimeout(this.putBulkTimeout) 156 clearTimeout(this.putBulkTimeout)
@@ -225,7 +225,7 @@ export class PeertubeChunkStore extends EventEmitter {
225 } 225 }
226 } 226 }
227 227
228 private nextTick (cb, err, val?) { 228 private nextTick <T> (cb: (err?: Error, val?: T) => void, err: Error, val?: T) {
229 process.nextTick(() => cb(err, val), undefined) 229 process.nextTick(() => cb(err, val), undefined)
230 } 230 }
231} 231}
diff --git a/client/src/assets/player/video-renderer.ts b/client/src/assets/player/webtorrent/video-renderer.ts
index 2cb05a448..a3415937b 100644
--- a/client/src/assets/player/video-renderer.ts
+++ b/client/src/assets/player/webtorrent/video-renderer.ts
@@ -1,9 +1,9 @@
1// Thanks: https://github.com/feross/render-media 1// Thanks: https://github.com/feross/render-media
2// TODO: use render-media once https://github.com/feross/render-media/issues/32 is fixed 2// TODO: use render-media once https://github.com/feross/render-media/issues/32 is fixed
3 3
4import * as MediaElementWrapper from 'mediasource' 4const MediaElementWrapper = require('mediasource')
5import { extname } from 'path' 5import { extname } from 'path'
6import * as videostream from 'videostream' 6const videostream = require('videostream')
7 7
8const VIDEOSTREAM_EXTS = [ 8const VIDEOSTREAM_EXTS = [
9 '.m4a', 9 '.m4a',
@@ -17,7 +17,7 @@ type RenderMediaOptions = {
17} 17}
18 18
19function renderVideo ( 19function renderVideo (
20 file, 20 file: any,
21 elem: HTMLVideoElement, 21 elem: HTMLVideoElement,
22 opts: RenderMediaOptions, 22 opts: RenderMediaOptions,
23 callback: (err: Error, renderer: any) => void 23 callback: (err: Error, renderer: any) => void
@@ -27,11 +27,11 @@ function renderVideo (
27 return renderMedia(file, elem, opts, callback) 27 return renderMedia(file, elem, opts, callback)
28} 28}
29 29
30function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, callback: (err: Error, renderer?: any) => void) { 30function renderMedia (file: any, elem: HTMLVideoElement, opts: RenderMediaOptions, callback: (err: Error, renderer?: any) => void) {
31 const extension = extname(file.name).toLowerCase() 31 const extension = extname(file.name).toLowerCase()
32 let preparedElem = undefined 32 let preparedElem: any = undefined
33 let currentTime = 0 33 let currentTime = 0
34 let renderer 34 let renderer: any
35 35
36 try { 36 try {
37 if (VIDEOSTREAM_EXTS.indexOf(extension) >= 0) { 37 if (VIDEOSTREAM_EXTS.indexOf(extension) >= 0) {
@@ -45,7 +45,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca
45 45
46 function useVideostream () { 46 function useVideostream () {
47 prepareElem() 47 prepareElem()
48 preparedElem.addEventListener('error', function onError (err) { 48 preparedElem.addEventListener('error', function onError (err: Error) {
49 preparedElem.removeEventListener('error', onError) 49 preparedElem.removeEventListener('error', onError)
50 50
51 return callback(err) 51 return callback(err)
@@ -58,7 +58,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca
58 const codecs = getCodec(file.name, useVP9) 58 const codecs = getCodec(file.name, useVP9)
59 59
60 prepareElem() 60 prepareElem()
61 preparedElem.addEventListener('error', function onError (err) { 61 preparedElem.addEventListener('error', function onError (err: Error) {
62 preparedElem.removeEventListener('error', onError) 62 preparedElem.removeEventListener('error', onError)
63 63
64 // Try with vp9 before returning an error 64 // Try with vp9 before returning an error
@@ -102,7 +102,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca
102 } 102 }
103} 103}
104 104
105function validateFile (file) { 105function validateFile (file: any) {
106 if (file == null) { 106 if (file == null) {
107 throw new Error('file cannot be null or undefined') 107 throw new Error('file cannot be null or undefined')
108 } 108 }
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
index 2330f476f..c69bf31fa 100644
--- a/client/src/assets/player/peertube-videojs-plugin.ts
+++ b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
@@ -1,30 +1,37 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
1import * as videojs from 'video.js' 3import * as videojs from 'video.js'
4
2import * as WebTorrent from 'webtorrent' 5import * as WebTorrent from 'webtorrent'
3import { VideoFile } from '../../../../shared/models/videos/video.model' 6import { VideoFile } from '../../../../../shared/models/videos/video.model'
4import { renderVideo } from './video-renderer' 7import { renderVideo } from './video-renderer'
5import './settings-menu-button' 8import { LoadedQualityData, PlayerNetworkInfo, VideoJSComponentInterface, WebtorrentPluginOptions } from '../peertube-videojs-typings'
6import { PeertubePluginOptions, UserWatching, VideoJSCaption, VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 9import { getRtcConfig, videoFileMaxByResolution, videoFileMinByResolution } from '../utils'
7import { isMobile, timeToInt, videoFileMaxByResolution, videoFileMinByResolution } from './utils'
8import * as CacheChunkStore from 'cache-chunk-store'
9import { PeertubeChunkStore } from './peertube-chunk-store' 10import { PeertubeChunkStore } from './peertube-chunk-store'
10import { 11import {
11 getAverageBandwidthInStore, 12 getAverageBandwidthInStore,
12 getStoredMute, 13 getStoredMute,
13 getStoredVolume, 14 getStoredVolume,
14 saveAverageBandwidth, 15 getStoredWebTorrentEnabled,
15 saveMuteInStore, 16 saveAverageBandwidth
16 saveVolumeInStore 17} from '../peertube-player-local-storage'
17} from './peertube-player-local-storage' 18
19const CacheChunkStore = require('cache-chunk-store')
20
21type PlayOptions = {
22 forcePlay?: boolean,
23 seek?: number,
24 delay?: number
25}
18 26
19const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin') 27const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
20class PeerTubePlugin extends Plugin { 28class WebTorrentPlugin extends Plugin {
21 private readonly playerElement: HTMLVideoElement 29 private readonly playerElement: HTMLVideoElement
22 30
23 private readonly autoplay: boolean = false 31 private readonly autoplay: boolean = false
24 private readonly startTime: number = 0 32 private readonly startTime: number = 0
25 private readonly savePlayerSrcFunction: Function 33 private readonly savePlayerSrcFunction: Function
26 private readonly videoFiles: VideoFile[] 34 private readonly videoFiles: VideoFile[]
27 private readonly videoViewUrl: string
28 private readonly videoDuration: number 35 private readonly videoDuration: number
29 private readonly CONSTANTS = { 36 private readonly CONSTANTS = {
30 INFO_SCHEDULER: 1000, // Don't change this 37 INFO_SCHEDULER: 1000, // Don't change this
@@ -32,22 +39,12 @@ class PeerTubePlugin extends Plugin {
32 AUTO_QUALITY_THRESHOLD_PERCENT: 30, // Bandwidth should be 30% more important than a resolution bitrate to change to it 39 AUTO_QUALITY_THRESHOLD_PERCENT: 30, // Bandwidth should be 30% more important than a resolution bitrate to change to it
33 AUTO_QUALITY_OBSERVATION_TIME: 10000, // Wait 10 seconds after having change the resolution before another check 40 AUTO_QUALITY_OBSERVATION_TIME: 10000, // Wait 10 seconds after having change the resolution before another check
34 AUTO_QUALITY_HIGHER_RESOLUTION_DELAY: 5000, // Buffering higher resolution during 5 seconds 41 AUTO_QUALITY_HIGHER_RESOLUTION_DELAY: 5000, // Buffering higher resolution during 5 seconds
35 BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5, // Last 5 seconds to build average bandwidth 42 BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5 // Last 5 seconds to build average bandwidth
36 USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
37 } 43 }
38 44
39 private readonly webtorrent = new WebTorrent({ 45 private readonly webtorrent = new WebTorrent({
40 tracker: { 46 tracker: {
41 rtcConfig: { 47 rtcConfig: getRtcConfig()
42 iceServers: [
43 {
44 urls: 'stun:stun.stunprotocol.org'
45 },
46 {
47 urls: 'stun:stun.framasoft.org'
48 }
49 ]
50 }
51 }, 48 },
52 dht: false 49 dht: false
53 }) 50 })
@@ -55,65 +52,56 @@ class PeerTubePlugin extends Plugin {
55 private player: any 52 private player: any
56 private currentVideoFile: VideoFile 53 private currentVideoFile: VideoFile
57 private torrent: WebTorrent.Torrent 54 private torrent: WebTorrent.Torrent
58 private videoCaptions: VideoJSCaption[]
59 55
60 private renderer 56 private renderer: any
61 private fakeRenderer 57 private fakeRenderer: any
62 private destoyingFakeRenderer = false 58 private destroyingFakeRenderer = false
63 59
64 private autoResolution = true 60 private autoResolution = true
65 private forbidAutoResolution = false 61 private autoResolutionPossible = true
66 private isAutoResolutionObservation = false 62 private isAutoResolutionObservation = false
63 private playerRefusedP2P = false
67 64
68 private videoViewInterval 65 private torrentInfoInterval: any
69 private torrentInfoInterval 66 private autoQualityInterval: any
70 private autoQualityInterval 67 private addTorrentDelay: any
71 private userWatchingVideoInterval 68 private qualityObservationTimer: any
72 private addTorrentDelay 69 private runAutoQualitySchedulerTimer: any
73 private qualityObservationTimer
74 private runAutoQualitySchedulerTimer
75 70
76 private downloadSpeeds: number[] = [] 71 private downloadSpeeds: number[] = []
77 72
78 constructor (player: videojs.Player, options: PeertubePluginOptions) { 73 constructor (player: videojs.Player, options: WebtorrentPluginOptions) {
79 super(player, options) 74 super(player, options)
80 75
81 // Disable auto play on iOS 76 // Disable auto play on iOS
82 this.autoplay = options.autoplay && this.isIOS() === false 77 this.autoplay = options.autoplay && this.isIOS() === false
78 this.playerRefusedP2P = !getStoredWebTorrentEnabled()
83 79
84 this.startTime = timeToInt(options.startTime)
85 this.videoFiles = options.videoFiles 80 this.videoFiles = options.videoFiles
86 this.videoViewUrl = options.videoViewUrl
87 this.videoDuration = options.videoDuration 81 this.videoDuration = options.videoDuration
88 this.videoCaptions = options.videoCaptions
89 82
90 this.savePlayerSrcFunction = this.player.src 83 this.savePlayerSrcFunction = this.player.src
91 this.playerElement = options.playerElement 84 this.playerElement = options.playerElement
92 85
93 if (this.autoplay === true) this.player.addClass('vjs-has-autoplay')
94
95 this.player.ready(() => { 86 this.player.ready(() => {
87 const playerOptions = this.player.options_
88
96 const volume = getStoredVolume() 89 const volume = getStoredVolume()
97 if (volume !== undefined) this.player.volume(volume) 90 if (volume !== undefined) this.player.volume(volume)
98 const muted = getStoredMute() 91
92 const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
99 if (muted !== undefined) this.player.muted(muted) 93 if (muted !== undefined) this.player.muted(muted)
100 94
95 this.player.duration(options.videoDuration)
96
101 this.initializePlayer() 97 this.initializePlayer()
102 this.runTorrentInfoScheduler() 98 this.runTorrentInfoScheduler()
103 this.runViewAdd()
104
105 if (options.userWatching) this.runUserWatchVideo(options.userWatching)
106 99
107 this.player.one('play', () => { 100 this.player.one('play', () => {
108 // Don't run immediately scheduler, wait some seconds the TCP connections are made 101 // Don't run immediately scheduler, wait some seconds the TCP connections are made
109 this.runAutoQualitySchedulerTimer = setTimeout(() => this.runAutoQualityScheduler(), this.CONSTANTS.AUTO_QUALITY_SCHEDULER) 102 this.runAutoQualitySchedulerTimer = setTimeout(() => this.runAutoQualityScheduler(), this.CONSTANTS.AUTO_QUALITY_SCHEDULER)
110 }) 103 })
111 }) 104 })
112
113 this.player.on('volumechange', () => {
114 saveVolumeInStore(this.player.volume())
115 saveMuteInStore(this.player.muted())
116 })
117 } 105 }
118 106
119 dispose () { 107 dispose () {
@@ -121,12 +109,9 @@ class PeerTubePlugin extends Plugin {
121 clearTimeout(this.qualityObservationTimer) 109 clearTimeout(this.qualityObservationTimer)
122 clearTimeout(this.runAutoQualitySchedulerTimer) 110 clearTimeout(this.runAutoQualitySchedulerTimer)
123 111
124 clearInterval(this.videoViewInterval)
125 clearInterval(this.torrentInfoInterval) 112 clearInterval(this.torrentInfoInterval)
126 clearInterval(this.autoQualityInterval) 113 clearInterval(this.autoQualityInterval)
127 114
128 if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
129
130 // Don't need to destroy renderer, video player will be destroyed 115 // Don't need to destroy renderer, video player will be destroyed
131 this.flushVideoFile(this.currentVideoFile, false) 116 this.flushVideoFile(this.currentVideoFile, false)
132 117
@@ -137,13 +122,6 @@ class PeerTubePlugin extends Plugin {
137 return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1 122 return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1
138 } 123 }
139 124
140 getCurrentResolutionLabel () {
141 if (!this.currentVideoFile) return ''
142
143 const fps = this.currentVideoFile.fps >= 50 ? this.currentVideoFile.fps : ''
144 return this.currentVideoFile.resolution.label + fps
145 }
146
147 updateVideoFile ( 125 updateVideoFile (
148 videoFile?: VideoFile, 126 videoFile?: VideoFile,
149 options: { 127 options: {
@@ -178,12 +156,22 @@ class PeerTubePlugin extends Plugin {
178 const previousVideoFile = this.currentVideoFile 156 const previousVideoFile = this.currentVideoFile
179 this.currentVideoFile = videoFile 157 this.currentVideoFile = videoFile
180 158
159 // Don't try on iOS that does not support MediaSource
160 // Or don't use P2P if webtorrent is disabled
161 if (this.isIOS() || this.playerRefusedP2P) {
162 return this.fallbackToHttp(options, () => {
163 this.player.playbackRate(oldPlaybackRate)
164 return done()
165 })
166 }
167
181 this.addTorrent(this.currentVideoFile.magnetUri, previousVideoFile, options, () => { 168 this.addTorrent(this.currentVideoFile.magnetUri, previousVideoFile, options, () => {
182 this.player.playbackRate(oldPlaybackRate) 169 this.player.playbackRate(oldPlaybackRate)
183 return done() 170 return done()
184 }) 171 })
185 172
186 this.trigger('videoFileUpdate') 173 this.changeQuality()
174 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.currentVideoFile.resolution.id })
187 } 175 }
188 176
189 updateResolution (resolutionId: number, delay = 0) { 177 updateResolution (resolutionId: number, delay = 0) {
@@ -217,28 +205,17 @@ class PeerTubePlugin extends Plugin {
217 } 205 }
218 } 206 }
219 207
220 isAutoResolutionOn () {
221 return this.autoResolution
222 }
223
224 enableAutoResolution () { 208 enableAutoResolution () {
225 this.autoResolution = true 209 this.autoResolution = true
226 this.trigger('autoResolutionUpdate') 210 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
227 } 211 }
228 212
229 disableAutoResolution (forbid = false) { 213 disableAutoResolution (forbid = false) {
230 if (forbid === true) this.forbidAutoResolution = true 214 if (forbid === true) this.autoResolutionPossible = false
231 215
232 this.autoResolution = false 216 this.autoResolution = false
233 this.trigger('autoResolutionUpdate') 217 this.trigger('autoResolutionChange', { possible: this.autoResolutionPossible })
234 } 218 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
235
236 isAutoResolutionForbidden () {
237 return this.forbidAutoResolution === true
238 }
239
240 getCurrentVideoFile () {
241 return this.currentVideoFile
242 } 219 }
243 220
244 getTorrent () { 221 getTorrent () {
@@ -248,18 +225,14 @@ class PeerTubePlugin extends Plugin {
248 private addTorrent ( 225 private addTorrent (
249 magnetOrTorrentUrl: string, 226 magnetOrTorrentUrl: string,
250 previousVideoFile: VideoFile, 227 previousVideoFile: VideoFile,
251 options: { 228 options: PlayOptions,
252 forcePlay?: boolean,
253 seek?: number,
254 delay?: number
255 },
256 done: Function 229 done: Function
257 ) { 230 ) {
258 console.log('Adding ' + magnetOrTorrentUrl + '.') 231 console.log('Adding ' + magnetOrTorrentUrl + '.')
259 232
260 const oldTorrent = this.torrent 233 const oldTorrent = this.torrent
261 const torrentOptions = { 234 const torrentOptions = {
262 store: (chunkLength, storeOpts) => new CacheChunkStore(new PeertubeChunkStore(chunkLength, storeOpts), { 235 store: (chunkLength: number, storeOpts: any) => new CacheChunkStore(new PeertubeChunkStore(chunkLength, storeOpts), {
263 max: 100 236 max: 100
264 }) 237 })
265 } 238 }
@@ -284,11 +257,14 @@ class PeerTubePlugin extends Plugin {
284 257
285 this.flushVideoFile(previousVideoFile) 258 this.flushVideoFile(previousVideoFile)
286 259
260 // Update progress bar (just for the UI), do not wait rendering
261 if (options.seek) this.player.currentTime(options.seek)
262
287 const renderVideoOptions = { autoplay: false, controls: true } 263 const renderVideoOptions = { autoplay: false, controls: true }
288 renderVideo(torrent.files[ 0 ], this.playerElement, renderVideoOptions, (err, renderer) => { 264 renderVideo(torrent.files[ 0 ], this.playerElement, renderVideoOptions, (err, renderer) => {
289 this.renderer = renderer 265 this.renderer = renderer
290 266
291 if (err) return this.fallbackToHttp(done) 267 if (err) return this.fallbackToHttp(options, done)
292 268
293 return this.tryToPlay(err => { 269 return this.tryToPlay(err => {
294 if (err) return done(err) 270 if (err) return done(err)
@@ -296,13 +272,13 @@ class PeerTubePlugin extends Plugin {
296 if (options.seek) this.seek(options.seek) 272 if (options.seek) this.seek(options.seek)
297 if (options.forcePlay === false && paused === true) this.player.pause() 273 if (options.forcePlay === false && paused === true) this.player.pause()
298 274
299 return done(err) 275 return done()
300 }) 276 })
301 }) 277 })
302 }, options.delay || 0) 278 }, options.delay || 0)
303 }) 279 })
304 280
305 this.torrent.on('error', err => console.error(err)) 281 this.torrent.on('error', (err: any) => console.error(err))
306 282
307 this.torrent.on('warning', (err: any) => { 283 this.torrent.on('warning', (err: any) => {
308 // We don't support HTTP tracker but we don't care -> we use the web socket tracker 284 // We don't support HTTP tracker but we don't care -> we use the web socket tracker
@@ -330,13 +306,13 @@ class PeerTubePlugin extends Plugin {
330 }) 306 })
331 } 307 }
332 308
333 private tryToPlay (done?: Function) { 309 private tryToPlay (done?: (err?: Error) => void) {
334 if (!done) done = function () { /* empty */ } 310 if (!done) done = function () { /* empty */ }
335 311
336 const playPromise = this.player.play() 312 const playPromise = this.player.play()
337 if (playPromise !== undefined) { 313 if (playPromise !== undefined) {
338 return playPromise.then(done) 314 return playPromise.then(done)
339 .catch(err => { 315 .catch((err: Error) => {
340 if (err.message.indexOf('The play() request was interrupted by a call to pause()') !== -1) { 316 if (err.message.indexOf('The play() request was interrupted by a call to pause()') !== -1) {
341 return 317 return
342 } 318 }
@@ -418,13 +394,7 @@ class PeerTubePlugin extends Plugin {
418 } 394 }
419 395
420 private initializePlayer () { 396 private initializePlayer () {
421 if (isMobile()) this.player.addClass('vjs-is-mobile') 397 this.buildQualities()
422
423 this.initSmoothProgressBar()
424
425 this.initCaptions()
426
427 this.alterInactivity()
428 398
429 if (this.autoplay === true) { 399 if (this.autoplay === true) {
430 this.player.posterImage.hide() 400 this.player.posterImage.hide()
@@ -432,12 +402,6 @@ class PeerTubePlugin extends Plugin {
432 return this.updateVideoFile(undefined, { forcePlay: true, seek: this.startTime }) 402 return this.updateVideoFile(undefined, { forcePlay: true, seek: this.startTime })
433 } 403 }
434 404
435 // Don't try on iOS that does not support MediaSource
436 if (this.isIOS()) {
437 this.currentVideoFile = this.pickAverageVideoFile()
438 return this.fallbackToHttp(undefined, false)
439 }
440
441 // Proxy first play 405 // Proxy first play
442 const oldPlay = this.player.play.bind(this.player) 406 const oldPlay = this.player.play.bind(this.player)
443 this.player.play = () => { 407 this.player.play = () => {
@@ -453,7 +417,7 @@ class PeerTubePlugin extends Plugin {
453 417
454 // Not initialized or in HTTP fallback 418 // Not initialized or in HTTP fallback
455 if (this.torrent === undefined || this.torrent === null) return 419 if (this.torrent === undefined || this.torrent === null) return
456 if (this.isAutoResolutionOn() === false) return 420 if (this.autoResolution === false) return
457 if (this.isAutoResolutionObservation === true) return 421 if (this.isAutoResolutionObservation === true) return
458 422
459 const file = this.getAppropriateFile() 423 const file = this.getAppropriateFile()
@@ -493,81 +457,32 @@ class PeerTubePlugin extends Plugin {
493 if (this.torrent === undefined) return 457 if (this.torrent === undefined) return
494 458
495 // Http fallback 459 // Http fallback
496 if (this.torrent === null) return this.trigger('torrentInfo', false) 460 if (this.torrent === null) return this.player.trigger('p2pInfo', false)
497 461
498 // this.webtorrent.downloadSpeed because we need to take into account the potential old torrent too 462 // this.webtorrent.downloadSpeed because we need to take into account the potential old torrent too
499 if (this.webtorrent.downloadSpeed !== 0) this.downloadSpeeds.push(this.webtorrent.downloadSpeed) 463 if (this.webtorrent.downloadSpeed !== 0) this.downloadSpeeds.push(this.webtorrent.downloadSpeed)
500 464
501 return this.trigger('torrentInfo', { 465 return this.player.trigger('p2pInfo', {
502 downloadSpeed: this.torrent.downloadSpeed, 466 http: {
503 numPeers: this.torrent.numPeers, 467 downloadSpeed: 0,
504 uploadSpeed: this.torrent.uploadSpeed, 468 uploadSpeed: 0,
505 downloaded: this.torrent.downloaded, 469 downloaded: 0,
506 uploaded: this.torrent.uploaded 470 uploaded: 0
507 }) 471 },
508 }, this.CONSTANTS.INFO_SCHEDULER) 472 p2p: {
509 } 473 downloadSpeed: this.torrent.downloadSpeed,
510 474 numPeers: this.torrent.numPeers,
511 private runViewAdd () { 475 uploadSpeed: this.torrent.uploadSpeed,
512 this.clearVideoViewInterval() 476 downloaded: this.torrent.downloaded,
513 477 uploaded: this.torrent.uploaded
514 // After 30 seconds (or 3/4 of the video), add a view to the video
515 let minSecondsToView = 30
516
517 if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
518
519 let secondsViewed = 0
520 this.videoViewInterval = setInterval(() => {
521 if (this.player && !this.player.paused()) {
522 secondsViewed += 1
523
524 if (secondsViewed > minSecondsToView) {
525 this.clearVideoViewInterval()
526
527 this.addViewToVideo().catch(err => console.error(err))
528 } 478 }
529 } 479 } as PlayerNetworkInfo)
530 }, 1000) 480 }, this.CONSTANTS.INFO_SCHEDULER)
531 }
532
533 private runUserWatchVideo (options: UserWatching) {
534 let lastCurrentTime = 0
535
536 this.userWatchingVideoInterval = setInterval(() => {
537 const currentTime = Math.floor(this.player.currentTime())
538
539 if (currentTime - lastCurrentTime >= 1) {
540 lastCurrentTime = currentTime
541
542 this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
543 .catch(err => console.error('Cannot notify user is watching.', err))
544 }
545 }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
546 }
547
548 private clearVideoViewInterval () {
549 if (this.videoViewInterval !== undefined) {
550 clearInterval(this.videoViewInterval)
551 this.videoViewInterval = undefined
552 }
553 }
554
555 private addViewToVideo () {
556 if (!this.videoViewUrl) return Promise.resolve(undefined)
557
558 return fetch(this.videoViewUrl, { method: 'POST' })
559 } 481 }
560 482
561 private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) { 483 private fallbackToHttp (options: PlayOptions, done?: Function) {
562 const body = new URLSearchParams() 484 const paused = this.player.paused()
563 body.append('currentTime', currentTime.toString())
564
565 const headers = new Headers({ 'Authorization': authorizationHeader })
566 485
567 return fetch(url, { method: 'PUT', body, headers })
568 }
569
570 private fallbackToHttp (done?: Function, play = true) {
571 this.disableAutoResolution(true) 486 this.disableAutoResolution(true)
572 487
573 this.flushVideoFile(this.currentVideoFile, true) 488 this.flushVideoFile(this.currentVideoFile, true)
@@ -579,9 +494,20 @@ class PeerTubePlugin extends Plugin {
579 const httpUrl = this.currentVideoFile.fileUrl 494 const httpUrl = this.currentVideoFile.fileUrl
580 this.player.src = this.savePlayerSrcFunction 495 this.player.src = this.savePlayerSrcFunction
581 this.player.src(httpUrl) 496 this.player.src(httpUrl)
582 if (play) this.tryToPlay()
583 497
584 if (done) return done() 498 this.changeQuality()
499
500 // We changed the source, so reinit captions
501 this.player.trigger('sourcechange')
502
503 return this.tryToPlay(err => {
504 if (err && done) return done(err)
505
506 if (options.seek) this.seek(options.seek)
507 if (options.forcePlay === false && paused === true) this.player.pause()
508
509 if (done) return done()
510 })
585 } 511 }
586 512
587 private handleError (err: Error | string) { 513 private handleError (err: Error | string) {
@@ -600,25 +526,6 @@ class PeerTubePlugin extends Plugin {
600 return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform) 526 return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
601 } 527 }
602 528
603 private alterInactivity () {
604 let saveInactivityTimeout: number
605
606 const disableInactivity = () => {
607 saveInactivityTimeout = this.player.options_.inactivityTimeout
608 this.player.options_.inactivityTimeout = 0
609 }
610 const enableInactivity = () => {
611 this.player.options_.inactivityTimeout = saveInactivityTimeout
612 }
613
614 const settingsDialog = this.player.children_.find(c => c.name_ === 'SettingsDialog')
615
616 this.player.controlBar.on('mouseenter', () => disableInactivity())
617 settingsDialog.on('mouseenter', () => disableInactivity())
618 this.player.controlBar.on('mouseleave', () => enableInactivity())
619 settingsDialog.on('mouseleave', () => enableInactivity())
620 }
621
622 private pickAverageVideoFile () { 529 private pickAverageVideoFile () {
623 if (this.videoFiles.length === 1) return this.videoFiles[0] 530 if (this.videoFiles.length === 1) return this.videoFiles[0]
624 531
@@ -632,14 +539,14 @@ class PeerTubePlugin extends Plugin {
632 } 539 }
633 540
634 private renderFileInFakeElement (file: WebTorrent.TorrentFile, delay: number) { 541 private renderFileInFakeElement (file: WebTorrent.TorrentFile, delay: number) {
635 this.destoyingFakeRenderer = false 542 this.destroyingFakeRenderer = false
636 543
637 const fakeVideoElem = document.createElement('video') 544 const fakeVideoElem = document.createElement('video')
638 renderVideo(file, fakeVideoElem, { autoplay: false, controls: false }, (err, renderer) => { 545 renderVideo(file, fakeVideoElem, { autoplay: false, controls: false }, (err, renderer) => {
639 this.fakeRenderer = renderer 546 this.fakeRenderer = renderer
640 547
641 // The renderer returns an error when we destroy it, so skip them 548 // The renderer returns an error when we destroy it, so skip them
642 if (this.destoyingFakeRenderer === false && err) { 549 if (this.destroyingFakeRenderer === false && err) {
643 console.error('Cannot render new torrent in fake video element.', err) 550 console.error('Cannot render new torrent in fake video element.', err)
644 } 551 }
645 552
@@ -650,7 +557,7 @@ class PeerTubePlugin extends Plugin {
650 557
651 private destroyFakeRenderer () { 558 private destroyFakeRenderer () {
652 if (this.fakeRenderer) { 559 if (this.fakeRenderer) {
653 this.destoyingFakeRenderer = true 560 this.destroyingFakeRenderer = true
654 561
655 if (this.fakeRenderer.destroy) { 562 if (this.fakeRenderer.destroy) {
656 try { 563 try {
@@ -663,40 +570,70 @@ class PeerTubePlugin extends Plugin {
663 } 570 }
664 } 571 }
665 572
666 private initCaptions () { 573 private buildQualities () {
667 for (const caption of this.videoCaptions) { 574 const qualityLevelsPayload = []
668 this.player.addRemoteTextTrack({ 575
669 kind: 'captions', 576 for (const file of this.videoFiles) {
670 label: caption.label, 577 const representation = {
671 language: caption.language, 578 id: file.resolution.id,
672 id: caption.language, 579 label: this.buildQualityLabel(file),
673 src: caption.src 580 height: file.resolution.id,
674 }, false) 581 _enabled: true
582 }
583
584 this.player.qualityLevels().addQualityLevel(representation)
585
586 qualityLevelsPayload.push({
587 id: representation.id,
588 label: representation.label,
589 selected: false
590 })
591 }
592
593 const payload: LoadedQualityData = {
594 qualitySwitchCallback: (d: any) => this.qualitySwitchCallback(d),
595 qualityData: {
596 video: qualityLevelsPayload
597 }
675 } 598 }
599 this.player.tech_.trigger('loadedqualitydata', payload)
676 } 600 }
677 601
678 // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657 602 private buildQualityLabel (file: VideoFile) {
679 private initSmoothProgressBar () { 603 let label = file.resolution.label
680 const SeekBar = videojsUntyped.getComponent('SeekBar') 604
681 SeekBar.prototype.getPercent = function getPercent () { 605 if (file.fps && file.fps >= 50) {
682 // Allows for smooth scrubbing, when player can't keep up. 606 label += file.fps
683 // const time = (this.player_.scrubbing()) ?
684 // this.player_.getCache().currentTime :
685 // this.player_.currentTime()
686 const time = this.player_.currentTime()
687 const percent = time / this.player_.duration()
688 return percent >= 1 ? 1 : percent
689 } 607 }
690 SeekBar.prototype.handleMouseMove = function handleMouseMove (event) { 608
691 let newTime = this.calculateDistance(event) * this.player_.duration() 609 return label
692 if (newTime === this.player_.duration()) { 610 }
693 newTime = newTime - 0.1 611
694 } 612 private qualitySwitchCallback (id: number) {
695 this.player_.currentTime(newTime) 613 if (id === -1) {
696 this.update() 614 if (this.autoResolutionPossible === true) this.enableAutoResolution()
615 return
616 }
617
618 this.disableAutoResolution()
619 this.updateResolution(id)
620 }
621
622 private changeQuality () {
623 const resolutionId = this.currentVideoFile.resolution.id
624 const qualityLevels = this.player.qualityLevels()
625
626 if (resolutionId === -1) {
627 qualityLevels.selectedIndex = -1
628 return
629 }
630
631 for (let i = 0; i < qualityLevels; i++) {
632 const q = this.player.qualityLevels[i]
633 if (q.height === resolutionId) qualityLevels.selectedIndex = i
697 } 634 }
698 } 635 }
699} 636}
700 637
701videojs.registerPlugin('peertube', PeerTubePlugin) 638videojs.registerPlugin('webtorrent', WebTorrentPlugin)
702export { PeerTubePlugin } 639export { WebTorrentPlugin }
diff --git a/client/src/environments/environment.ts b/client/src/environments/environment.ts
index 5bb6f4b34..1ea483554 100644
--- a/client/src/environments/environment.ts
+++ b/client/src/environments/environment.ts
@@ -2,6 +2,13 @@
2// `ng build --env=prod` then `environment.prod.ts` will be used instead. 2// `ng build --env=prod` then `environment.prod.ts` will be used instead.
3// The list of which env maps to which file can be found in `.angular-cli.json`. 3// The list of which env maps to which file can be found in `.angular-cli.json`.
4 4
5// Reflect.metadata polyfill is only needed in the JIT/dev mode.
6//
7// In order to load these polyfills early enough (before app code), polyfill.ts imports this file to
8// to change the order in the final bundle.
9import 'core-js/es6/reflect'
10import 'core-js/es7/reflect'
11
5export const environment = { 12export const environment = {
6 production: false, 13 production: false,
7 hmr: false, 14 hmr: false,
diff --git a/client/src/index.html b/client/src/index.html
index 593de4ac6..8c257824e 100644
--- a/client/src/index.html
+++ b/client/src/index.html
@@ -5,7 +5,7 @@
5 <meta name="viewport" content="width=device-width, initial-scale=1"> 5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 6
7 <meta name="theme-color" content="#fff" /> 7 <meta name="theme-color" content="#fff" />
8 8 <meta property="og:platform" content="PeerTube" />
9 <!-- Web Manifest file --> 9 <!-- Web Manifest file -->
10 <link rel="manifest" href="/manifest.webmanifest"> 10 <link rel="manifest" href="/manifest.webmanifest">
11 11
@@ -30,7 +30,7 @@
30 <noscript> 30 <noscript>
31 <p>You are blocking Javascript, and we totally get that. However this endpoint uses Angular, so the front end is in full JavaScript and won't work without it. 31 <p>You are blocking Javascript, and we totally get that. However this endpoint uses Angular, so the front end is in full JavaScript and won't work without it.
32 </br></br> 32 </br></br>
33 There will be other non JS-based clients to access PeerTube, but for now none is available as this is still alpha software. Be sure we will update this page with a list once alternative clients are developed. You can certainly develop you own in the meantime as our code is open source and libre software under GNU AGPLv3.0. 33 There will be other non JS-based clients to access PeerTube, but for now none is available. Be sure we will update this page with a list once alternative clients are developed. You can certainly develop you own in the meantime as our code is open source and libre software under GNU AGPLv3.0.
34 </br></br> 34 </br></br>
35 There might be numerous reasons you refuse to use JavaScript. If it has just to do with security (or lack thereof) of JavaScript-based webapps, then depending on your threat menace you might want to go through the code running on the node you are trying to access, and look for security audits. 35 There might be numerous reasons you refuse to use JavaScript. If it has just to do with security (or lack thereof) of JavaScript-based webapps, then depending on your threat menace you might want to go through the code running on the node you are trying to access, and look for security audits.
36 </p> 36 </p>
diff --git a/client/src/locale/source/angular_en_US.xml b/client/src/locale/source/angular_en_US.xml
index 7f91bd550..3aa178825 100644
--- a/client/src/locale/source/angular_en_US.xml
+++ b/client/src/locale/source/angular_en_US.xml
@@ -205,12 +205,12 @@
205 <context context-type="linenumber">18</context> 205 <context context-type="linenumber">18</context>
206 </context-group> 206 </context-group>
207 <context-group purpose="location"> 207 <context-group purpose="location">
208 <context context-type="sourcefile">app/login/login.component.html</context> 208 <context context-type="sourcefile">app/shared/moderation/user-ban-modal.component.html</context>
209 <context context-type="linenumber">72</context> 209 <context context-type="linenumber">22</context>
210 </context-group> 210 </context-group>
211 <context-group purpose="location"> 211 <context-group purpose="location">
212 <context context-type="sourcefile">app/+admin/users/user-list/user-ban-modal.component.html</context> 212 <context context-type="sourcefile">app/login/login.component.html</context>
213 <context context-type="linenumber">22</context> 213 <context context-type="linenumber">77</context>
214 </context-group> 214 </context-group>
215 <context-group purpose="location"> 215 <context-group purpose="location">
216 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html</context> 216 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html</context>
@@ -226,11 +226,130 @@
226 <context context-type="sourcefile">app/shared/forms/reactive-file.component.html</context> 226 <context context-type="sourcefile">app/shared/forms/reactive-file.component.html</context>
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit><trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c" datatype="html">
230 <source>You don&apos;t have notifications.</source>
231 <context-group purpose="location">
232 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
233 <context context-type="linenumber">1</context>
234 </context-group>
235 </trans-unit><trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3" datatype="html">
236 <source>
237 &lt;x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/&gt; published a &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;new video&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt;
238 </source>
239 <context-group purpose="location">
240 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
241 <context context-type="linenumber">7</context>
242 </context-group>
243 </trans-unit><trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb" datatype="html">
244 <source>
245 Your video &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; has been unblacklisted
246 </source>
247 <context-group purpose="location">
248 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
249 <context context-type="linenumber">11</context>
250 </context-group>
251 </trans-unit><trans-unit id="65514a0efdae3b173130166416700ddeb369f37f" datatype="html">
252 <source>
253 Your video &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; has been blacklisted
254 </source>
255 <context-group purpose="location">
256 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
257 <context context-type="linenumber">15</context>
258 </context-group>
259 </trans-unit><trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431" datatype="html">
260 <source>
261 &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;A new video abuse&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; has been created on video &lt;x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt;
262 </source>
263 <context-group purpose="location">
264 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
265 <context context-type="linenumber">19</context>
266 </context-group>
267 </trans-unit><trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156" datatype="html">
268 <source>
269 &lt;x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/&gt; commented your video &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt;
270 </source>
271 <context-group purpose="location">
272 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
273 <context context-type="linenumber">23</context>
274 </context-group>
275 </trans-unit><trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b" datatype="html">
276 <source>
277 Your video &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; has been published
278 </source>
279 <context-group purpose="location">
280 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
281 <context context-type="linenumber">27</context>
282 </context-group>
283 </trans-unit><trans-unit id="371391b88724e5ee455582f07eb97728e371f24a" datatype="html">
284 <source>
285 &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;Your video import&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; &lt;x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/&gt; succeeded
286 </source>
287 <context-group purpose="location">
288 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
289 <context context-type="linenumber">31</context>
290 </context-group>
291 </trans-unit><trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a" datatype="html">
292 <source>
293 &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;Your video import&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; &lt;x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/&gt; failed
294 </source>
295 <context-group purpose="location">
296 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
297 <context context-type="linenumber">35</context>
298 </context-group>
299 </trans-unit><trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78" datatype="html">
300 <source>
301 User &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/&gt; registered&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; on your instance
302 </source>
303 <context-group purpose="location">
304 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
305 <context context-type="linenumber">39</context>
306 </context-group>
307 </trans-unit><trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef" datatype="html">
308 <source>
309 &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt; is following
310
311 &lt;x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/&gt;
312 your channel &lt;x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/&gt;
313 &lt;x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/&gt;
314 &lt;x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/&gt;your account&lt;x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/&gt;
315 </source>
316 <context-group purpose="location">
317 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
318 <context context-type="linenumber">43</context>
319 </context-group>
320 </trans-unit><trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f" datatype="html">
321 <source>
322 &lt;x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/&gt; mentioned you on &lt;x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/&gt;video &lt;x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/&gt;&lt;x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/&gt;
323 </source>
324 <context-group purpose="location">
325 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
326 <context context-type="linenumber">52</context>
327 </context-group>
328 </trans-unit><trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc" datatype="html">
329 <source>
330 &lt;x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/&gt;&lt;x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/&gt;
331 </source>
332 <context-group purpose="location">
333 <context context-type="sourcefile">app/shared/users/user-notifications.component.html</context>
334 <context context-type="linenumber">57</context>
335 </context-group>
336 </trans-unit><trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081" datatype="html">
337 <source>Unlisted</source>
338 <context-group purpose="location">
339 <context context-type="sourcefile">app/shared/video/video-miniature.component.html</context>
340 <context context-type="linenumber">10</context>
341 </context-group>
342 </trans-unit><trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69" datatype="html">
343 <source>Private</source>
344 <context-group purpose="location">
345 <context context-type="sourcefile">app/shared/video/video-miniature.component.html</context>
346 <context context-type="linenumber">11</context>
347 </context-group>
229 </trans-unit><trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8" datatype="html"> 348 </trans-unit><trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8" datatype="html">
230 <source>&lt;x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/&gt; views</source> 349 <source>&lt;x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/&gt; views</source>
231 <context-group purpose="location"> 350 <context-group purpose="location">
232 <context context-type="sourcefile">app/shared/video/video-miniature.component.html</context> 351 <context context-type="sourcefile">app/shared/video/video-miniature.component.html</context>
233 <context context-type="linenumber">13</context> 352 <context context-type="linenumber">16</context>
234 </context-group> 353 </context-group>
235 </trans-unit><trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7" datatype="html"> 354 </trans-unit><trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7" datatype="html">
236 <source>Delete</source> 355 <source>Delete</source>
@@ -244,7 +363,7 @@
244 </context-group> 363 </context-group>
245 <context-group purpose="location"> 364 <context-group purpose="location">
246 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 365 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
247 <context context-type="linenumber">161</context> 366 <context context-type="linenumber">162</context>
248 </context-group> 367 </context-group>
249 <context-group purpose="location"> 368 <context-group purpose="location">
250 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context> 369 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context>
@@ -260,6 +379,10 @@
260 <context context-type="sourcefile">app/shared/buttons/edit-button.component.html</context> 379 <context context-type="sourcefile">app/shared/buttons/edit-button.component.html</context>
261 <context context-type="linenumber">5</context> 380 <context context-type="linenumber">5</context>
262 </context-group> 381 </context-group>
382 <context-group purpose="location">
383 <context context-type="sourcefile">app/shared/buttons/edit-button.component.html</context>
384 <context context-type="linenumber">1</context>
385 </context-group>
263 </trans-unit><trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d" datatype="html"> 386 </trans-unit><trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d" datatype="html">
264 <source>Truncated preview</source> 387 <source>Truncated preview</source>
265 <context-group purpose="location"> 388 <context-group purpose="location">
@@ -372,7 +495,7 @@
372 </context-group> 495 </context-group>
373 <context-group purpose="location"> 496 <context-group purpose="location">
374 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 497 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
375 <context context-type="linenumber">19</context> 498 <context context-type="linenumber">42</context>
376 </context-group> 499 </context-group>
377 </trans-unit><trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85" datatype="html"> 500 </trans-unit><trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85" datatype="html">
378 <source> 501 <source>
@@ -382,6 +505,46 @@
382 <context context-type="sourcefile">app/shared/instance/instance-features-table.component.html</context> 505 <context context-type="sourcefile">app/shared/instance/instance-features-table.component.html</context>
383 <context context-type="linenumber">14</context> 506 <context context-type="linenumber">14</context>
384 </context-group> 507 </context-group>
508 </trans-unit><trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0" datatype="html">
509 <source>Ban</source>
510 <context-group purpose="location">
511 <context context-type="sourcefile">app/shared/moderation/user-ban-modal.component.html</context>
512 <context context-type="linenumber">3</context>
513 </context-group>
514 </trans-unit><trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125" datatype="html">
515 <source>Reason...</source>
516 <context-group purpose="location">
517 <context context-type="sourcefile">app/shared/moderation/user-ban-modal.component.html</context>
518 <context context-type="linenumber">10</context>
519 </context-group>
520 <context-group purpose="location">
521 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
522 <context context-type="linenumber">16</context>
523 </context-group>
524 <context-group purpose="location">
525 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
526 <context context-type="linenumber">11</context>
527 </context-group>
528 </trans-unit><trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251" datatype="html">
529 <source>
530 A banned user will no longer be able to login.
531 </source>
532 <context-group purpose="location">
533 <context context-type="sourcefile">app/shared/moderation/user-ban-modal.component.html</context>
534 <context context-type="linenumber">17</context>
535 </context-group>
536 </trans-unit><trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020" datatype="html">
537 <source>Ban this user</source>
538 <context-group purpose="location">
539 <context context-type="sourcefile">app/shared/moderation/user-ban-modal.component.html</context>
540 <context context-type="linenumber">25</context>
541 </context-group>
542 </trans-unit><trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7" datatype="html">
543 <source>&lt;x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/&gt;</source>
544 <context-group purpose="location">
545 <context context-type="sourcefile">app/shared/menu/top-menu-dropdown.component.html</context>
546 <context context-type="linenumber">11</context>
547 </context-group>
385 </trans-unit><trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea" datatype="html"> 548 </trans-unit><trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea" datatype="html">
386 <source> 549 <source>
387 Login 550 Login
@@ -454,11 +617,11 @@
454 </context-group> 617 </context-group>
455 <context-group purpose="location"> 618 <context-group purpose="location">
456 <context context-type="sourcefile">app/signup/signup.component.html</context> 619 <context context-type="sourcefile">app/signup/signup.component.html</context>
457 <context context-type="linenumber">41</context> 620 <context context-type="linenumber">42</context>
458 </context-group> 621 </context-group>
459 <context-group purpose="location"> 622 <context-group purpose="location">
460 <context context-type="sourcefile">app/signup/signup.component.html</context> 623 <context context-type="sourcefile">app/signup/signup.component.html</context>
461 <context context-type="linenumber">43</context> 624 <context context-type="linenumber">44</context>
462 </context-group> 625 </context-group>
463 <context-group purpose="location"> 626 <context-group purpose="location">
464 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context> 627 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context>
@@ -470,7 +633,7 @@
470 </context-group> 633 </context-group>
471 <context-group purpose="location"> 634 <context-group purpose="location">
472 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context> 635 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context>
473 <context context-type="linenumber">12</context> 636 <context context-type="linenumber">13</context>
474 </context-group> 637 </context-group>
475 </trans-unit><trans-unit id="b87e81682959464211443afc3e23c506865d2eda" datatype="html"> 638 </trans-unit><trans-unit id="b87e81682959464211443afc3e23c506865d2eda" datatype="html">
476 <source>I forgot my password</source> 639 <source>I forgot my password</source>
@@ -486,7 +649,7 @@
486 </context-group> 649 </context-group>
487 <context-group purpose="location"> 650 <context-group purpose="location">
488 <context context-type="sourcefile">app/menu/menu.component.html</context> 651 <context context-type="sourcefile">app/menu/menu.component.html</context>
489 <context context-type="linenumber">38</context> 652 <context context-type="linenumber">36</context>
490 </context-group> 653 </context-group>
491 </trans-unit><trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681" datatype="html"> 654 </trans-unit><trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681" datatype="html">
492 <source>Forgot your password</source> 655 <source>Forgot your password</source>
@@ -494,19 +657,27 @@
494 <context context-type="sourcefile">app/login/login.component.html</context> 657 <context context-type="sourcefile">app/login/login.component.html</context>
495 <context context-type="linenumber">57</context> 658 <context context-type="linenumber">57</context>
496 </context-group> 659 </context-group>
660 </trans-unit><trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2" datatype="html">
661 <source>
662 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
663 </source>
664 <context-group purpose="location">
665 <context context-type="sourcefile">app/login/login.component.html</context>
666 <context context-type="linenumber">63</context>
667 </context-group>
497 </trans-unit><trans-unit id="244aae9346da82b0922506c2d2581373a15641cc" datatype="html"> 668 </trans-unit><trans-unit id="244aae9346da82b0922506c2d2581373a15641cc" datatype="html">
498 <source>Email</source> 669 <source>Email</source>
499 <context-group purpose="location"> 670 <context-group purpose="location">
500 <context context-type="sourcefile">app/login/login.component.html</context> 671 <context context-type="sourcefile">app/login/login.component.html</context>
501 <context context-type="linenumber">63</context> 672 <context context-type="linenumber">68</context>
502 </context-group> 673 </context-group>
503 <context-group purpose="location"> 674 <context-group purpose="location">
504 <context context-type="sourcefile">app/signup/signup.component.html</context> 675 <context context-type="sourcefile">app/signup/signup.component.html</context>
505 <context context-type="linenumber">30</context> 676 <context context-type="linenumber">31</context>
506 </context-group> 677 </context-group>
507 <context-group purpose="location"> 678 <context-group purpose="location">
508 <context context-type="sourcefile">app/signup/signup.component.html</context> 679 <context context-type="sourcefile">app/signup/signup.component.html</context>
509 <context context-type="linenumber">32</context> 680 <context context-type="linenumber">33</context>
510 </context-group> 681 </context-group>
511 <context-group purpose="location"> 682 <context-group purpose="location">
512 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context> 683 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context>
@@ -518,7 +689,11 @@
518 </context-group> 689 </context-group>
519 <context-group purpose="location"> 690 <context-group purpose="location">
520 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 691 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
521 <context context-type="linenumber">18</context> 692 <context context-type="linenumber">41</context>
693 </context-group>
694 <context-group purpose="location">
695 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html</context>
696 <context context-type="linenumber">4</context>
522 </context-group> 697 </context-group>
523 <context-group purpose="location"> 698 <context-group purpose="location">
524 <context context-type="sourcefile">app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.html</context> 699 <context context-type="sourcefile">app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.html</context>
@@ -528,7 +703,7 @@
528 <source>Email address</source> 703 <source>Email address</source>
529 <context-group purpose="location"> 704 <context-group purpose="location">
530 <context context-type="sourcefile">app/login/login.component.html</context> 705 <context context-type="sourcefile">app/login/login.component.html</context>
531 <context context-type="linenumber">65</context> 706 <context context-type="linenumber">70</context>
532 </context-group> 707 </context-group>
533 <context-group purpose="location"> 708 <context-group purpose="location">
534 <context context-type="sourcefile">app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.html</context> 709 <context context-type="sourcefile">app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.html</context>
@@ -538,7 +713,7 @@
538 <source>Send me an email to reset my password</source> 713 <source>Send me an email to reset my password</source>
539 <context-group purpose="location"> 714 <context-group purpose="location">
540 <context context-type="sourcefile">app/login/login.component.html</context> 715 <context context-type="sourcefile">app/login/login.component.html</context>
541 <context context-type="linenumber">75</context> 716 <context context-type="linenumber">80</context>
542 </context-group> 717 </context-group>
543 </trans-unit><trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa" datatype="html"> 718 </trans-unit><trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa" datatype="html">
544 <source> 719 <source>
@@ -578,7 +753,7 @@
578 <source>Username</source> 753 <source>Username</source>
579 <context-group purpose="location"> 754 <context-group purpose="location">
580 <context context-type="sourcefile">app/signup/signup.component.html</context> 755 <context context-type="sourcefile">app/signup/signup.component.html</context>
581 <context context-type="linenumber">12</context> 756 <context context-type="linenumber">13</context>
582 </context-group> 757 </context-group>
583 <context-group purpose="location"> 758 <context-group purpose="location">
584 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context> 759 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context>
@@ -592,33 +767,33 @@
592 <source>Example: jane_doe</source> 767 <source>Example: jane_doe</source>
593 <context-group purpose="location"> 768 <context-group purpose="location">
594 <context context-type="sourcefile">app/signup/signup.component.html</context> 769 <context context-type="sourcefile">app/signup/signup.component.html</context>
595 <context context-type="linenumber">16</context> 770 <context context-type="linenumber">17</context>
596 </context-group> 771 </context-group>
597 </trans-unit><trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b" datatype="html"> 772 </trans-unit><trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92" datatype="html">
598 <source>I have read and agree to the &lt;a href=&apos;/about/instance#terms-section&apos; target=&apos;_blank&apos;rel=&apos;noopener noreferrer&apos;&gt;Terms&lt;/a&gt; of this instance</source> 773 <source>I am at least 16 years old and agree to the &lt;a href=&apos;/about/instance#terms-section&apos; target=&apos;_blank&apos;rel=&apos;noopener noreferrer&apos;&gt;Terms&lt;/a&gt; of this instance</source>
599 <context-group purpose="location"> 774 <context-group purpose="location">
600 <context context-type="sourcefile">app/signup/signup.component.html</context> 775 <context context-type="sourcefile">app/signup/signup.component.html</context>
601 <context context-type="linenumber">54</context> 776 <context context-type="linenumber">55</context>
602 </context-group> 777 </context-group>
603 </trans-unit><trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4" datatype="html"> 778 </trans-unit><trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4" datatype="html">
604 <source>Signup</source> 779 <source>Signup</source>
605 <context-group purpose="location"> 780 <context-group purpose="location">
606 <context context-type="sourcefile">app/signup/signup.component.html</context> 781 <context context-type="sourcefile">app/signup/signup.component.html</context>
607 <context context-type="linenumber">62</context> 782 <context context-type="linenumber">63</context>
608 </context-group> 783 </context-group>
609 <context-group purpose="location"> 784 <context-group purpose="location">
610 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 785 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
611 <context context-type="linenumber">22</context> 786 <context context-type="linenumber">26</context>
612 </context-group> 787 </context-group>
613 <context-group purpose="location"> 788 <context-group purpose="location">
614 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 789 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
615 <context context-type="linenumber">88</context> 790 <context context-type="linenumber">78</context>
616 </context-group> 791 </context-group>
617 </trans-unit><trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1" datatype="html"> 792 </trans-unit><trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1" datatype="html">
618 <source>Features found on this instance</source> 793 <source>Features found on this instance</source>
619 <context-group purpose="location"> 794 <context-group purpose="location">
620 <context context-type="sourcefile">app/signup/signup.component.html</context> 795 <context context-type="sourcefile">app/signup/signup.component.html</context>
621 <context context-type="linenumber">66</context> 796 <context context-type="linenumber">67</context>
622 </context-group> 797 </context-group>
623 </trans-unit><trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a" datatype="html"> 798 </trans-unit><trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a" datatype="html">
624 <source>&lt;x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/&gt; results</source> 799 <source>&lt;x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/&gt; results</source>
@@ -634,8 +809,11 @@
634 <context context-type="sourcefile">app/search/search.component.html</context> 809 <context context-type="sourcefile">app/search/search.component.html</context>
635 <context context-type="linenumber">6</context> 810 <context context-type="linenumber">6</context>
636 </context-group> 811 </context-group>
637 </trans-unit><trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6" datatype="html"> 812 </trans-unit><trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061" datatype="html">
638 <source>Filters</source> 813 <source>
814 Filters
815 &lt;x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/&gt;&lt;x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/&gt;&lt;x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/&gt;
816 </source>
639 <context-group purpose="location"> 817 <context-group purpose="location">
640 <context context-type="sourcefile">app/search/search.component.html</context> 818 <context context-type="sourcefile">app/search/search.component.html</context>
641 <context context-type="linenumber">16</context> 819 <context context-type="linenumber">16</context>
@@ -646,19 +824,19 @@
646 </source> 824 </source>
647 <context-group purpose="location"> 825 <context-group purpose="location">
648 <context context-type="sourcefile">app/search/search.component.html</context> 826 <context context-type="sourcefile">app/search/search.component.html</context>
649 <context context-type="linenumber">25</context> 827 <context context-type="linenumber">28</context>
650 </context-group> 828 </context-group>
651 </trans-unit><trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a" datatype="html"> 829 </trans-unit><trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a" datatype="html">
652 <source>&lt;x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/&gt; subscribers</source> 830 <source>&lt;x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/&gt; subscribers</source>
653 <context-group purpose="location"> 831 <context-group purpose="location">
654 <context context-type="sourcefile">app/search/search.component.html</context> 832 <context context-type="sourcefile">app/search/search.component.html</context>
655 <context context-type="linenumber">41</context> 833 <context context-type="linenumber">44</context>
656 </context-group> 834 </context-group>
657 </trans-unit><trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883" datatype="html"> 835 </trans-unit><trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883" datatype="html">
658 <source>&lt;x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/&gt; views</source> 836 <source>&lt;x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/&gt; views</source>
659 <context-group purpose="location"> 837 <context-group purpose="location">
660 <context context-type="sourcefile">app/search/search.component.html</context> 838 <context context-type="sourcefile">app/search/search.component.html</context>
661 <context context-type="linenumber">52</context> 839 <context context-type="linenumber">55</context>
662 </context-group> 840 </context-group>
663 </trans-unit><trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96" datatype="html"> 841 </trans-unit><trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96" datatype="html">
664 <source>Change the language</source> 842 <source>Change the language</source>
@@ -668,7 +846,15 @@
668 </context-group> 846 </context-group>
669 <context-group purpose="location"> 847 <context-group purpose="location">
670 <context context-type="sourcefile">app/menu/menu.component.html</context> 848 <context context-type="sourcefile">app/menu/menu.component.html</context>
671 <context context-type="linenumber">88</context> 849 <context context-type="linenumber">86</context>
850 </context-group>
851 </trans-unit><trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28" datatype="html">
852 <source>
853 Help to translate PeerTube!
854 </source>
855 <context-group purpose="location">
856 <context context-type="sourcefile">app/menu/language-chooser.component.html</context>
857 <context context-type="linenumber">8</context>
672 </context-group> 858 </context-group>
673 </trans-unit><trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6" datatype="html"> 859 </trans-unit><trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6" datatype="html">
674 <source> 860 <source>
@@ -676,7 +862,7 @@
676 </source> 862 </source>
677 <context-group purpose="location"> 863 <context-group purpose="location">
678 <context context-type="sourcefile">app/menu/menu.component.html</context> 864 <context context-type="sourcefile">app/menu/menu.component.html</context>
679 <context context-type="linenumber">18</context> 865 <context context-type="linenumber">16</context>
680 </context-group> 866 </context-group>
681 </trans-unit><trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb" datatype="html"> 867 </trans-unit><trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb" datatype="html">
682 <source> 868 <source>
@@ -684,7 +870,7 @@
684 </source> 870 </source>
685 <context-group purpose="location"> 871 <context-group purpose="location">
686 <context context-type="sourcefile">app/menu/menu.component.html</context> 872 <context context-type="sourcefile">app/menu/menu.component.html</context>
687 <context context-type="linenumber">22</context> 873 <context context-type="linenumber">20</context>
688 </context-group> 874 </context-group>
689 </trans-unit><trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10" datatype="html"> 875 </trans-unit><trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10" datatype="html">
690 <source> 876 <source>
@@ -692,7 +878,7 @@
692 </source> 878 </source>
693 <context-group purpose="location"> 879 <context-group purpose="location">
694 <context context-type="sourcefile">app/menu/menu.component.html</context> 880 <context context-type="sourcefile">app/menu/menu.component.html</context>
695 <context context-type="linenumber">26</context> 881 <context context-type="linenumber">24</context>
696 </context-group> 882 </context-group>
697 </trans-unit><trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1" datatype="html"> 883 </trans-unit><trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1" datatype="html">
698 <source> 884 <source>
@@ -700,23 +886,23 @@
700 </source> 886 </source>
701 <context-group purpose="location"> 887 <context-group purpose="location">
702 <context context-type="sourcefile">app/menu/menu.component.html</context> 888 <context context-type="sourcefile">app/menu/menu.component.html</context>
703 <context context-type="linenumber">30</context> 889 <context context-type="linenumber">28</context>
704 </context-group> 890 </context-group>
705 </trans-unit><trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87" datatype="html"> 891 </trans-unit><trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87" datatype="html">
706 <source>Create an account</source> 892 <source>Create an account</source>
707 <context-group purpose="location"> 893 <context-group purpose="location">
708 <context context-type="sourcefile">app/menu/menu.component.html</context> 894 <context context-type="sourcefile">app/menu/menu.component.html</context>
709 <context context-type="linenumber">39</context> 895 <context context-type="linenumber">37</context>
710 </context-group> 896 </context-group>
711 </trans-unit><trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238" datatype="html"> 897 </trans-unit><trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238" datatype="html">
712 <source>Videos</source> 898 <source>Videos</source>
713 <context-group purpose="location"> 899 <context-group purpose="location">
714 <context context-type="sourcefile">app/menu/menu.component.html</context> 900 <context context-type="sourcefile">app/menu/menu.component.html</context>
715 <context context-type="linenumber">43</context> 901 <context context-type="linenumber">41</context>
716 </context-group> 902 </context-group>
717 <context-group purpose="location"> 903 <context-group purpose="location">
718 <context context-type="sourcefile">app/+accounts/accounts.component.html</context> 904 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
719 <context context-type="linenumber">17</context> 905 <context context-type="linenumber">29</context>
720 </context-group> 906 </context-group>
721 <context-group purpose="location"> 907 <context-group purpose="location">
722 <context context-type="sourcefile">app/+video-channels/video-channels.component.html</context> 908 <context context-type="sourcefile">app/+video-channels/video-channels.component.html</context>
@@ -726,53 +912,53 @@
726 <source>Subscriptions</source> 912 <source>Subscriptions</source>
727 <context-group purpose="location"> 913 <context-group purpose="location">
728 <context context-type="sourcefile">app/menu/menu.component.html</context> 914 <context context-type="sourcefile">app/menu/menu.component.html</context>
729 <context context-type="linenumber">47</context> 915 <context context-type="linenumber">45</context>
730 </context-group> 916 </context-group>
731 </trans-unit><trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5" datatype="html"> 917 </trans-unit><trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5" datatype="html">
732 <source>Overview</source> 918 <source>Overview</source>
733 <context-group purpose="location"> 919 <context-group purpose="location">
734 <context context-type="sourcefile">app/menu/menu.component.html</context> 920 <context context-type="sourcefile">app/menu/menu.component.html</context>
735 <context context-type="linenumber">52</context> 921 <context context-type="linenumber">50</context>
736 </context-group> 922 </context-group>
737 </trans-unit><trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807" datatype="html"> 923 </trans-unit><trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807" datatype="html">
738 <source>Trending</source> 924 <source>Trending</source>
739 <context-group purpose="location"> 925 <context-group purpose="location">
740 <context context-type="sourcefile">app/menu/menu.component.html</context> 926 <context context-type="sourcefile">app/menu/menu.component.html</context>
741 <context context-type="linenumber">57</context> 927 <context context-type="linenumber">55</context>
742 </context-group> 928 </context-group>
743 </trans-unit><trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1" datatype="html"> 929 </trans-unit><trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1" datatype="html">
744 <source>Recently added</source> 930 <source>Recently added</source>
745 <context-group purpose="location"> 931 <context-group purpose="location">
746 <context context-type="sourcefile">app/menu/menu.component.html</context> 932 <context context-type="sourcefile">app/menu/menu.component.html</context>
747 <context context-type="linenumber">62</context> 933 <context context-type="linenumber">60</context>
748 </context-group> 934 </context-group>
749 </trans-unit><trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d" datatype="html"> 935 </trans-unit><trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d" datatype="html">
750 <source>Local</source> 936 <source>Local</source>
751 <context-group purpose="location"> 937 <context-group purpose="location">
752 <context context-type="sourcefile">app/menu/menu.component.html</context> 938 <context context-type="sourcefile">app/menu/menu.component.html</context>
753 <context context-type="linenumber">67</context> 939 <context context-type="linenumber">65</context>
754 </context-group> 940 </context-group>
755 </trans-unit><trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f" datatype="html"> 941 </trans-unit><trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f" datatype="html">
756 <source>More</source> 942 <source>More</source>
757 <context-group purpose="location"> 943 <context-group purpose="location">
758 <context context-type="sourcefile">app/menu/menu.component.html</context> 944 <context context-type="sourcefile">app/menu/menu.component.html</context>
759 <context context-type="linenumber">72</context> 945 <context context-type="linenumber">70</context>
760 </context-group> 946 </context-group>
761 </trans-unit><trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919" datatype="html"> 947 </trans-unit><trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919" datatype="html">
762 <source>Administration</source> 948 <source>Administration</source>
763 <context-group purpose="location"> 949 <context-group purpose="location">
764 <context context-type="sourcefile">app/menu/menu.component.html</context> 950 <context context-type="sourcefile">app/menu/menu.component.html</context>
765 <context context-type="linenumber">76</context> 951 <context context-type="linenumber">74</context>
766 </context-group> 952 </context-group>
767 </trans-unit><trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html"> 953 </trans-unit><trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a" datatype="html">
768 <source>About</source> 954 <source>About</source>
769 <context-group purpose="location"> 955 <context-group purpose="location">
770 <context context-type="sourcefile">app/menu/menu.component.html</context> 956 <context context-type="sourcefile">app/menu/menu.component.html</context>
771 <context context-type="linenumber">81</context> 957 <context context-type="linenumber">79</context>
772 </context-group> 958 </context-group>
773 <context-group purpose="location"> 959 <context-group purpose="location">
774 <context context-type="sourcefile">app/+accounts/accounts.component.html</context> 960 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
775 <context context-type="linenumber">21</context> 961 <context context-type="linenumber">33</context>
776 </context-group> 962 </context-group>
777 <context-group purpose="location"> 963 <context-group purpose="location">
778 <context context-type="sourcefile">app/+video-channels/video-channels.component.html</context> 964 <context context-type="sourcefile">app/+video-channels/video-channels.component.html</context>
@@ -782,13 +968,41 @@
782 <source>Show keyboard shortcuts</source> 968 <source>Show keyboard shortcuts</source>
783 <context-group purpose="location"> 969 <context-group purpose="location">
784 <context context-type="sourcefile">app/menu/menu.component.html</context> 970 <context context-type="sourcefile">app/menu/menu.component.html</context>
785 <context context-type="linenumber">91</context> 971 <context context-type="linenumber">89</context>
786 </context-group> 972 </context-group>
787 </trans-unit><trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768" datatype="html"> 973 </trans-unit><trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768" datatype="html">
788 <source>Toggle dark interface</source> 974 <source>Toggle dark interface</source>
789 <context-group purpose="location"> 975 <context-group purpose="location">
790 <context context-type="sourcefile">app/menu/menu.component.html</context> 976 <context context-type="sourcefile">app/menu/menu.component.html</context>
791 <context context-type="linenumber">94</context> 977 <context context-type="linenumber">92</context>
978 </context-group>
979 </trans-unit><trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771" datatype="html">
980 <source>View your notifications</source>
981 <context-group purpose="location">
982 <context context-type="sourcefile">app/menu/avatar-notification.component.html</context>
983 <context context-type="linenumber">3</context>
984 </context-group>
985 </trans-unit><trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab" datatype="html">
986 <source>Notifications</source>
987 <context-group purpose="location">
988 <context context-type="sourcefile">app/menu/avatar-notification.component.html</context>
989 <context context-type="linenumber">12</context>
990 </context-group>
991 <context-group purpose="location">
992 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context>
993 <context context-type="linenumber">10</context>
994 </context-group>
995 </trans-unit><trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81" datatype="html">
996 <source>Update your notification preferences</source>
997 <context-group purpose="location">
998 <context context-type="sourcefile">app/menu/avatar-notification.component.html</context>
999 <context context-type="linenumber">15</context>
1000 </context-group>
1001 </trans-unit><trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5" datatype="html">
1002 <source>See all your notifications</source>
1003 <context-group purpose="location">
1004 <context context-type="sourcefile">app/menu/avatar-notification.component.html</context>
1005 <context context-type="linenumber">22</context>
792 </context-group> 1006 </context-group>
793 </trans-unit><trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599" datatype="html"> 1007 </trans-unit><trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599" datatype="html">
794 <source>Search...</source> 1008 <source>Search...</source>
@@ -902,23 +1116,49 @@
902 <context context-type="sourcefile">app/search/search-filters.component.html</context> 1116 <context context-type="sourcefile">app/search/search-filters.component.html</context>
903 <context context-type="linenumber">94</context> 1117 <context context-type="linenumber">94</context>
904 </context-group> 1118 </context-group>
1119 </trans-unit><trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6" datatype="html">
1120 <source>Display unlisted and private videos</source>
1121 <context-group purpose="location">
1122 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1123 <context context-type="linenumber">14</context>
1124 </context-group>
1125 <context-group purpose="location">
1126 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1127 <context context-type="linenumber">14</context>
1128 </context-group>
1129 <context-group purpose="location">
1130 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1131 <context context-type="linenumber">14</context>
1132 </context-group>
1133 <context-group purpose="location">
1134 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1135 <context context-type="linenumber">14</context>
1136 </context-group>
1137 <context-group purpose="location">
1138 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1139 <context context-type="linenumber">14</context>
1140 </context-group>
1141 <context-group purpose="location">
1142 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1143 <context context-type="linenumber">14</context>
1144 </context-group>
905 </trans-unit><trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e" datatype="html"> 1145 </trans-unit><trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e" datatype="html">
906 <source>No results.</source> 1146 <source>No results.</source>
907 <context-group purpose="location"> 1147 <context-group purpose="location">
908 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1148 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
909 <context context-type="linenumber">7</context> 1149 <context context-type="linenumber">20</context>
910 </context-group> 1150 </context-group>
911 <context-group purpose="location"> 1151 <context-group purpose="location">
912 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1152 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
913 <context context-type="linenumber">7</context> 1153 <context context-type="linenumber">20</context>
914 </context-group> 1154 </context-group>
915 <context-group purpose="location"> 1155 <context-group purpose="location">
916 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1156 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
917 <context context-type="linenumber">7</context> 1157 <context context-type="linenumber">20</context>
918 </context-group> 1158 </context-group>
919 <context-group purpose="location"> 1159 <context-group purpose="location">
920 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1160 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
921 <context context-type="linenumber">7</context> 1161 <context context-type="linenumber">20</context>
922 </context-group> 1162 </context-group>
923 <context-group purpose="location"> 1163 <context-group purpose="location">
924 <context context-type="sourcefile">app/videos/video-list/video-overview.component.html</context> 1164 <context context-type="sourcefile">app/videos/video-list/video-overview.component.html</context>
@@ -926,7 +1166,7 @@
926 </context-group> 1166 </context-group>
927 <context-group purpose="location"> 1167 <context-group purpose="location">
928 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1168 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
929 <context context-type="linenumber">7</context> 1169 <context context-type="linenumber">20</context>
930 </context-group> 1170 </context-group>
931 <context-group purpose="location"> 1171 <context-group purpose="location">
932 <context context-type="sourcefile">app/+my-account/my-account-videos/my-account-videos.component.html</context> 1172 <context context-type="sourcefile">app/+my-account/my-account-videos/my-account-videos.component.html</context>
@@ -934,7 +1174,7 @@
934 </context-group> 1174 </context-group>
935 <context-group purpose="location"> 1175 <context-group purpose="location">
936 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1176 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
937 <context context-type="linenumber">7</context> 1177 <context context-type="linenumber">20</context>
938 </context-group> 1178 </context-group>
939 </trans-unit><trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6" datatype="html"> 1179 </trans-unit><trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6" datatype="html">
940 <source> 1180 <source>
@@ -974,25 +1214,99 @@
974 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1214 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
975 <context context-type="linenumber">8</context> 1215 <context context-type="linenumber">8</context>
976 </context-group> 1216 </context-group>
1217 <context-group purpose="location">
1218 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html</context>
1219 <context context-type="linenumber">8</context>
1220 </context-group>
1221 <context-group purpose="location">
1222 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html</context>
1223 <context context-type="linenumber">12</context>
1224 </context-group>
977 </trans-unit><trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390" datatype="html"> 1225 </trans-unit><trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390" datatype="html">
978 <source>PeerTube</source> 1226 <source>PeerTube</source>
979 <context-group purpose="location"> 1227 <context-group purpose="location">
980 <context context-type="sourcefile">app/+about/about.component.html</context> 1228 <context context-type="sourcefile">app/+about/about.component.html</context>
981 <context context-type="linenumber">7</context> 1229 <context context-type="linenumber">7</context>
982 </context-group> 1230 </context-group>
983 </trans-unit><trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2" datatype="html"> 1231 </trans-unit><trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473" datatype="html">
1232 <source>Contact &lt;x id="INTERPOLATION" equiv-text="{{ instanceName }}"/&gt; administrator</source>
1233 <context-group purpose="location">
1234 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1235 <context context-type="linenumber">3</context>
1236 </context-group>
1237 </trans-unit><trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0" datatype="html">
1238 <source>Your name</source>
1239 <context-group purpose="location">
1240 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1241 <context context-type="linenumber">11</context>
1242 </context-group>
1243 </trans-unit><trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d" datatype="html">
1244 <source>Your email</source>
1245 <context-group purpose="location">
1246 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1247 <context context-type="linenumber">20</context>
1248 </context-group>
1249 </trans-unit><trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df" datatype="html">
1250 <source>Your message</source>
1251 <context-group purpose="location">
1252 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1253 <context context-type="linenumber">29</context>
1254 </context-group>
1255 </trans-unit><trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb" datatype="html">
984 <source> 1256 <source>
985 About &lt;x id="INTERPOLATION" equiv-text="{{ instanceName }}"/&gt; instance 1257 Cancel
986</source> 1258 </source>
1259 <context-group purpose="location">
1260 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1261 <context context-type="linenumber">38</context>
1262 </context-group>
1263 <context-group purpose="location">
1264 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
1265 <context context-type="linenumber">24</context>
1266 </context-group>
1267 <context-group purpose="location">
1268 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
1269 <context context-type="linenumber">26</context>
1270 </context-group>
1271 </trans-unit><trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd" datatype="html">
1272 <source>Submit</source>
1273 <context-group purpose="location">
1274 <context context-type="sourcefile">app/+about/about-instance/contact-admin-modal.component.html</context>
1275 <context context-type="linenumber">43</context>
1276 </context-group>
1277 <context-group purpose="location">
1278 <context context-type="sourcefile">app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html</context>
1279 <context context-type="linenumber">25</context>
1280 </context-group>
1281 <context-group purpose="location">
1282 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html</context>
1283 <context context-type="linenumber">28</context>
1284 </context-group>
1285 <context-group purpose="location">
1286 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
1287 <context context-type="linenumber">29</context>
1288 </context-group>
1289 <context-group purpose="location">
1290 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
1291 <context context-type="linenumber">31</context>
1292 </context-group>
1293 </trans-unit><trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07" datatype="html">
1294 <source>About &lt;x id="INTERPOLATION" equiv-text="{{ instanceName }}"/&gt; instance</source>
987 <context-group purpose="location"> 1295 <context-group purpose="location">
988 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1296 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
989 <context context-type="linenumber">1</context> 1297 <context context-type="linenumber">4</context>
1298 </context-group>
1299 </trans-unit><trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c" datatype="html">
1300 <source>Contact administrator</source>
1301 <context-group purpose="location">
1302 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1303 <context context-type="linenumber">6</context>
990 </context-group> 1304 </context-group>
991 </trans-unit><trans-unit id="eec715de352a6b114713b30b640d319fa78207a0" datatype="html"> 1305 </trans-unit><trans-unit id="eec715de352a6b114713b30b640d319fa78207a0" datatype="html">
992 <source>Description</source> 1306 <source>Description</source>
993 <context-group purpose="location"> 1307 <context-group purpose="location">
994 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1308 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
995 <context context-type="linenumber">10</context> 1309 <context context-type="linenumber">14</context>
996 </context-group> 1310 </context-group>
997 <context-group purpose="location"> 1311 <context-group purpose="location">
998 <context context-type="sourcefile">app/+accounts/account-about/account-about.component.html</context> 1312 <context context-type="sourcefile">app/+accounts/account-about/account-about.component.html</context>
@@ -1000,7 +1314,7 @@
1000 </context-group> 1314 </context-group>
1001 <context-group purpose="location"> 1315 <context-group purpose="location">
1002 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1316 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1003 <context context-type="linenumber">33</context> 1317 <context context-type="linenumber">30</context>
1004 </context-group> 1318 </context-group>
1005 <context-group purpose="location"> 1319 <context-group purpose="location">
1006 <context context-type="sourcefile">app/+my-account/my-account-video-channels/my-account-video-channel-edit.component.html</context> 1320 <context context-type="sourcefile">app/+my-account/my-account-video-channels/my-account-video-channel-edit.component.html</context>
@@ -1026,41 +1340,41 @@
1026 <source>Terms</source> 1340 <source>Terms</source>
1027 <context-group purpose="location"> 1341 <context-group purpose="location">
1028 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1342 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1029 <context context-type="linenumber">16</context> 1343 <context context-type="linenumber">20</context>
1030 </context-group> 1344 </context-group>
1031 <context-group purpose="location"> 1345 <context-group purpose="location">
1032 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1346 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1033 <context context-type="linenumber">44</context> 1347 <context context-type="linenumber">39</context>
1034 </context-group> 1348 </context-group>
1035 </trans-unit><trans-unit id="9c6e6db693ab265457c6578df179c65694141d27" datatype="html"> 1349 </trans-unit><trans-unit id="9c6e6db693ab265457c6578df179c65694141d27" datatype="html">
1036 <source>User registration is allowed and</source> 1350 <source>User registration is allowed and</source>
1037 <context-group purpose="location"> 1351 <context-group purpose="location">
1038 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1352 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1039 <context context-type="linenumber">25</context> 1353 <context context-type="linenumber">29</context>
1040 </context-group> 1354 </context-group>
1041 </trans-unit><trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e" datatype="html"> 1355 </trans-unit><trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff" datatype="html">
1042 <source> 1356 <source>
1043 this instance provides a baseline quota of &lt;x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/&gt; space for the videos of its users. 1357 this instance provides a baseline quota of &lt;x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/&gt; space for the videos of its users.
1044 </source> 1358 </source>
1045 <context-group purpose="location"> 1359 <context-group purpose="location">
1046 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1360 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1047 <context context-type="linenumber">27</context> 1361 <context context-type="linenumber">31</context>
1048 </context-group> 1362 </context-group>
1049 </trans-unit><trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae" datatype="html"> 1363 </trans-unit><trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b" datatype="html">
1050 <source> 1364 <source>
1051 this instance provides unlimited space for the videos of its users. 1365 this instance provides unlimited space for the videos of its users.
1052 </source> 1366 </source>
1053 <context-group purpose="location"> 1367 <context-group purpose="location">
1054 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1368 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1055 <context context-type="linenumber">31</context> 1369 <context context-type="linenumber">35</context>
1056 </context-group> 1370 </context-group>
1057 </trans-unit><trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1" datatype="html"> 1371 </trans-unit><trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574" datatype="html">
1058 <source> 1372 <source>
1059 User registration is currently not allowed. 1373 User registration is currently not allowed.
1060 </source> 1374 </source>
1061 <context-group purpose="location"> 1375 <context-group purpose="location">
1062 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context> 1376 <context context-type="sourcefile">app/+about/about-instance/about-instance.component.html</context>
1063 <context context-type="linenumber">36</context> 1377 <context context-type="linenumber">40</context>
1064 </context-group> 1378 </context-group>
1065 </trans-unit><trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc" datatype="html"> 1379 </trans-unit><trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc" datatype="html">
1066 <source> 1380 <source>
@@ -1221,9 +1535,9 @@
1221 <context context-type="sourcefile">app/+about/about-peertube/about-peertube.component.html</context> 1535 <context context-type="sourcefile">app/+about/about-peertube/about-peertube.component.html</context>
1222 <context context-type="linenumber">83</context> 1536 <context context-type="linenumber">83</context>
1223 </context-group> 1537 </context-group>
1224 </trans-unit><trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8" datatype="html"> 1538 </trans-unit><trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4" datatype="html">
1225 <source> 1539 <source>
1226 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1540 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1227 In the meantime, we want to test different ideas related to this issue: 1541 In the meantime, we want to test different ideas related to this issue:
1228 </source> 1542 </source>
1229 <context-group purpose="location"> 1543 <context-group purpose="location">
@@ -1260,17 +1574,47 @@
1260 <context context-type="sourcefile">app/+about/about-peertube/about-peertube.component.html</context> 1574 <context context-type="sourcefile">app/+about/about-peertube/about-peertube.component.html</context>
1261 <context context-type="linenumber">95</context> 1575 <context context-type="linenumber">95</context>
1262 </context-group> 1576 </context-group>
1577 </trans-unit><trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605" datatype="html">
1578 <source>Banned</source>
1579 <context-group purpose="location">
1580 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1581 <context context-type="linenumber">12</context>
1582 </context-group>
1583 </trans-unit><trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809" datatype="html">
1584 <source>Muted</source>
1585 <context-group purpose="location">
1586 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1587 <context context-type="linenumber">13</context>
1588 </context-group>
1589 </trans-unit><trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89" datatype="html">
1590 <source>Muted by your instance</source>
1591 <context-group purpose="location">
1592 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1593 <context context-type="linenumber">14</context>
1594 </context-group>
1595 </trans-unit><trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a" datatype="html">
1596 <source>Instance muted</source>
1597 <context-group purpose="location">
1598 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1599 <context context-type="linenumber">15</context>
1600 </context-group>
1601 </trans-unit><trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1" datatype="html">
1602 <source>Instance muted by your instance</source>
1603 <context-group purpose="location">
1604 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1605 <context context-type="linenumber">16</context>
1606 </context-group>
1263 </trans-unit><trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578" datatype="html"> 1607 </trans-unit><trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578" datatype="html">
1264 <source>&lt;x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/&gt; subscribers</source> 1608 <source>&lt;x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/&gt; subscribers</source>
1265 <context-group purpose="location"> 1609 <context-group purpose="location">
1266 <context context-type="sourcefile">app/+accounts/accounts.component.html</context> 1610 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1267 <context context-type="linenumber">12</context> 1611 <context context-type="linenumber">24</context>
1268 </context-group> 1612 </context-group>
1269 </trans-unit><trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8" datatype="html"> 1613 </trans-unit><trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8" datatype="html">
1270 <source>Video channels</source> 1614 <source>Video channels</source>
1271 <context-group purpose="location"> 1615 <context-group purpose="location">
1272 <context context-type="sourcefile">app/+accounts/accounts.component.html</context> 1616 <context context-type="sourcefile">app/+accounts/accounts.component.html</context>
1273 <context context-type="linenumber">19</context> 1617 <context context-type="linenumber">31</context>
1274 </context-group> 1618 </context-group>
1275 </trans-unit><trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a" datatype="html"> 1619 </trans-unit><trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a" datatype="html">
1276 <source>Stats</source> 1620 <source>Stats</source>
@@ -1316,11 +1660,11 @@
1316 <source>Name</source> 1660 <source>Name</source>
1317 <context-group purpose="location"> 1661 <context-group purpose="location">
1318 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1662 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1319 <context context-type="linenumber">11</context> 1663 <context context-type="linenumber">12</context>
1320 </context-group> 1664 </context-group>
1321 <context-group purpose="location"> 1665 <context-group purpose="location">
1322 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 1666 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1323 <context context-type="linenumber">9</context> 1667 <context context-type="linenumber">18</context>
1324 </context-group> 1668 </context-group>
1325 <context-group purpose="location"> 1669 <context-group purpose="location">
1326 <context context-type="sourcefile">app/+my-account/my-account-video-channels/my-account-video-channel-edit.component.html</context> 1670 <context context-type="sourcefile">app/+my-account/my-account-video-channels/my-account-video-channel-edit.component.html</context>
@@ -1334,49 +1678,49 @@
1334 <source>Short description</source> 1678 <source>Short description</source>
1335 <context-group purpose="location"> 1679 <context-group purpose="location">
1336 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1680 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1337 <context context-type="linenumber">22</context> 1681 <context context-type="linenumber">21</context>
1338 </context-group> 1682 </context-group>
1339 </trans-unit><trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003" datatype="html"> 1683 </trans-unit><trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003" datatype="html">
1340 <source>Default client route</source> 1684 <source>Default client route</source>
1341 <context-group purpose="location"> 1685 <context-group purpose="location">
1342 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1686 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1343 <context context-type="linenumber">55</context> 1687 <context context-type="linenumber">48</context>
1344 </context-group> 1688 </context-group>
1345 </trans-unit><trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d" datatype="html"> 1689 </trans-unit><trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d" datatype="html">
1346 <source>Videos Overview</source> 1690 <source>Videos Overview</source>
1347 <context-group purpose="location"> 1691 <context-group purpose="location">
1348 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1692 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1349 <context context-type="linenumber">58</context> 1693 <context context-type="linenumber">51</context>
1350 </context-group> 1694 </context-group>
1351 </trans-unit><trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948" datatype="html"> 1695 </trans-unit><trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948" datatype="html">
1352 <source>Videos Trending</source> 1696 <source>Videos Trending</source>
1353 <context-group purpose="location"> 1697 <context-group purpose="location">
1354 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1698 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1355 <context context-type="linenumber">59</context> 1699 <context context-type="linenumber">52</context>
1356 </context-group> 1700 </context-group>
1357 </trans-unit><trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883" datatype="html"> 1701 </trans-unit><trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883" datatype="html">
1358 <source>Videos Recently Added</source> 1702 <source>Videos Recently Added</source>
1359 <context-group purpose="location"> 1703 <context-group purpose="location">
1360 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1704 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1361 <context context-type="linenumber">60</context> 1705 <context context-type="linenumber">53</context>
1362 </context-group> 1706 </context-group>
1363 </trans-unit><trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f" datatype="html"> 1707 </trans-unit><trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f" datatype="html">
1364 <source>Local videos</source> 1708 <source>Local videos</source>
1365 <context-group purpose="location"> 1709 <context-group purpose="location">
1366 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1710 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1367 <context context-type="linenumber">61</context> 1711 <context context-type="linenumber">54</context>
1368 </context-group> 1712 </context-group>
1369 </trans-unit><trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9" datatype="html"> 1713 </trans-unit><trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9" datatype="html">
1370 <source>Policy on videos containing sensitive content</source> 1714 <source>Policy on videos containing sensitive content</source>
1371 <context-group purpose="location"> 1715 <context-group purpose="location">
1372 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1716 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1373 <context context-type="linenumber">70</context> 1717 <context context-type="linenumber">61</context>
1374 </context-group> 1718 </context-group>
1375 </trans-unit><trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df" datatype="html"> 1719 </trans-unit><trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df" datatype="html">
1376 <source>With &lt;strong&gt;Do not list&lt;/strong&gt; or &lt;strong&gt;Blur thumbnails&lt;/strong&gt;, a confirmation will be requested to watch the video.</source> 1720 <source>With &lt;strong&gt;Do not list&lt;/strong&gt; or &lt;strong&gt;Blur thumbnails&lt;/strong&gt;, a confirmation will be requested to watch the video.</source>
1377 <context-group purpose="location"> 1721 <context-group purpose="location">
1378 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1722 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1379 <context context-type="linenumber">73</context> 1723 <context context-type="linenumber">64</context>
1380 </context-group> 1724 </context-group>
1381 <context-group purpose="location"> 1725 <context-group purpose="location">
1382 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 1726 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
@@ -1386,7 +1730,7 @@
1386 <source>Do not list</source> 1730 <source>Do not list</source>
1387 <context-group purpose="location"> 1731 <context-group purpose="location">
1388 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1732 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1389 <context context-type="linenumber">78</context> 1733 <context context-type="linenumber">69</context>
1390 </context-group> 1734 </context-group>
1391 <context-group purpose="location"> 1735 <context-group purpose="location">
1392 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 1736 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
@@ -1396,7 +1740,7 @@
1396 <source>Blur thumbnails</source> 1740 <source>Blur thumbnails</source>
1397 <context-group purpose="location"> 1741 <context-group purpose="location">
1398 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1742 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1399 <context context-type="linenumber">79</context> 1743 <context context-type="linenumber">70</context>
1400 </context-group> 1744 </context-group>
1401 <context-group purpose="location"> 1745 <context-group purpose="location">
1402 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 1746 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
@@ -1406,7 +1750,7 @@
1406 <source>Display</source> 1750 <source>Display</source>
1407 <context-group purpose="location"> 1751 <context-group purpose="location">
1408 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1752 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1409 <context context-type="linenumber">80</context> 1753 <context context-type="linenumber">71</context>
1410 </context-group> 1754 </context-group>
1411 <context-group purpose="location"> 1755 <context-group purpose="location">
1412 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 1756 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
@@ -1416,25 +1760,43 @@
1416 <source>Signup enabled</source> 1760 <source>Signup enabled</source>
1417 <context-group purpose="location"> 1761 <context-group purpose="location">
1418 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1762 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1419 <context context-type="linenumber">92</context> 1763 <context context-type="linenumber">84</context>
1420 </context-group> 1764 </context-group>
1421 </trans-unit><trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7" datatype="html"> 1765 </trans-unit><trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7" datatype="html">
1422 <source>Signup requires email verification</source> 1766 <source>Signup requires email verification</source>
1423 <context-group purpose="location"> 1767 <context-group purpose="location">
1424 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1768 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1425 <context context-type="linenumber">97</context> 1769 <context context-type="linenumber">91</context>
1426 </context-group> 1770 </context-group>
1427 </trans-unit><trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402" datatype="html"> 1771 </trans-unit><trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402" datatype="html">
1428 <source>Signup limit</source> 1772 <source>Signup limit</source>
1429 <context-group purpose="location"> 1773 <context-group purpose="location">
1430 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1774 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1431 <context context-type="linenumber">101</context> 1775 <context context-type="linenumber">96</context>
1776 </context-group>
1777 </trans-unit><trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be" datatype="html">
1778 <source>Users</source>
1779 <context-group purpose="location">
1780 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1781 <context context-type="linenumber">105</context>
1782 </context-group>
1783 </trans-unit><trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09" datatype="html">
1784 <source>User default video quota</source>
1785 <context-group purpose="location">
1786 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1787 <context context-type="linenumber">109</context>
1788 </context-group>
1789 </trans-unit><trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe" datatype="html">
1790 <source>User default daily upload limit</source>
1791 <context-group purpose="location">
1792 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1793 <context context-type="linenumber">121</context>
1432 </context-group> 1794 </context-group>
1433 </trans-unit><trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html"> 1795 </trans-unit><trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36" datatype="html">
1434 <source>Import</source> 1796 <source>Import</source>
1435 <context-group purpose="location"> 1797 <context-group purpose="location">
1436 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1798 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1437 <context context-type="linenumber">111</context> 1799 <context context-type="linenumber">133</context>
1438 </context-group> 1800 </context-group>
1439 <context-group purpose="location"> 1801 <context-group purpose="location">
1440 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context> 1802 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context>
@@ -1444,47 +1806,35 @@
1444 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context> 1806 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context>
1445 <context context-type="linenumber">42</context> 1807 <context context-type="linenumber">42</context>
1446 </context-group> 1808 </context-group>
1447 </trans-unit><trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce" datatype="html"> 1809 </trans-unit><trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e" datatype="html">
1448 <source>Video import with HTTP enabled</source> 1810 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1449 <context-group purpose="location"> 1811 <context-group purpose="location">
1450 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1812 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1451 <context context-type="linenumber">115</context> 1813 <context context-type="linenumber">141</context>
1452 </context-group> 1814 </context-group>
1453 </trans-unit><trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e" datatype="html"> 1815 </trans-unit><trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e" datatype="html">
1454 <source>Video import with a torrent file or a magnet URI enabled</source> 1816 <source>Video import with a torrent file or a magnet URI enabled</source>
1455 <context-group purpose="location"> 1817 <context-group purpose="location">
1456 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1818 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1457 <context context-type="linenumber">120</context> 1819 <context context-type="linenumber">148</context>
1458 </context-group> 1820 </context-group>
1459 </trans-unit><trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011" datatype="html"> 1821 </trans-unit><trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011" datatype="html">
1460 <source>Administrator</source> 1822 <source>Administrator</source>
1461 <context-group purpose="location"> 1823 <context-group purpose="location">
1462 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1824 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1463 <context context-type="linenumber">123</context> 1825 <context context-type="linenumber">155</context>
1464 </context-group> 1826 </context-group>
1465 </trans-unit><trans-unit id="55a0f51e38679d3141841e8333da5779d349c587" datatype="html"> 1827 </trans-unit><trans-unit id="55a0f51e38679d3141841e8333da5779d349c587" datatype="html">
1466 <source>Admin email</source> 1828 <source>Admin email</source>
1467 <context-group purpose="location"> 1829 <context-group purpose="location">
1468 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1830 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1469 <context context-type="linenumber">126</context> 1831 <context context-type="linenumber">158</context>
1470 </context-group>
1471 </trans-unit><trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be" datatype="html">
1472 <source>Users</source>
1473 <context-group purpose="location">
1474 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1475 <context context-type="linenumber">136</context>
1476 </context-group>
1477 </trans-unit><trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09" datatype="html">
1478 <source>User default video quota</source>
1479 <context-group purpose="location">
1480 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1481 <context context-type="linenumber">139</context>
1482 </context-group> 1832 </context-group>
1483 </trans-unit><trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe" datatype="html"> 1833 </trans-unit><trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a" datatype="html">
1484 <source>User default daily upload limit</source> 1834 <source>Enable contact form</source>
1485 <context-group purpose="location"> 1835 <context-group purpose="location">
1486 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1836 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1487 <context context-type="linenumber">153</context> 1837 <context context-type="linenumber">169</context>
1488 </context-group> 1838 </context-group>
1489 </trans-unit><trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5" datatype="html"> 1839 </trans-unit><trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5" datatype="html">
1490 <source>Basic configuration</source> 1840 <source>Basic configuration</source>
@@ -1496,69 +1846,81 @@
1496 <source>Twitter</source> 1846 <source>Twitter</source>
1497 <context-group purpose="location"> 1847 <context-group purpose="location">
1498 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1848 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1499 <context context-type="linenumber">170</context> 1849 <context context-type="linenumber">178</context>
1500 </context-group> 1850 </context-group>
1501 </trans-unit><trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524" datatype="html"> 1851 </trans-unit><trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524" datatype="html">
1502 <source>Your Twitter username</source> 1852 <source>Your Twitter username</source>
1503 <context-group purpose="location"> 1853 <context-group purpose="location">
1504 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1854 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1505 <context context-type="linenumber">173</context> 1855 <context context-type="linenumber">184</context>
1506 </context-group> 1856 </context-group>
1507 </trans-unit><trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c" datatype="html"> 1857 </trans-unit><trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c" datatype="html">
1508 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1858 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1509 <context-group purpose="location"> 1859 <context-group purpose="location">
1510 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1860 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1511 <context context-type="linenumber">176</context> 1861 <context context-type="linenumber">187</context>
1512 </context-group> 1862 </context-group>
1513 </trans-unit><trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605" datatype="html"> 1863 </trans-unit><trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605" datatype="html">
1514 <source>Instance whitelisted by Twitter</source> 1864 <source>Instance whitelisted by Twitter</source>
1515 <context-group purpose="location"> 1865 <context-group purpose="location">
1516 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1866 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1517 <context context-type="linenumber">189</context> 1867 <context context-type="linenumber">199</context>
1518 </context-group> 1868 </context-group>
1519 </trans-unit><trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a" datatype="html"> 1869 </trans-unit><trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b" datatype="html">
1520 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt; 1870 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1521 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt; 1871 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1522 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target=&apos;_blank&apos; rel=&apos;noopener noreferrer&apos; href=&apos;https://cards-dev.twitter.com/validator&apos;&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source> 1872 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target=&apos;_blank&apos; rel=&apos;noopener noreferrer&apos; href=&apos;https://cards-dev.twitter.com/validator&apos;&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1523 <context-group purpose="location"> 1873 <context-group purpose="location">
1524 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1874 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1525 <context context-type="linenumber">190</context> 1875 <context context-type="linenumber">200</context>
1526 </context-group> 1876 </context-group>
1527 </trans-unit><trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5" datatype="html"> 1877 </trans-unit><trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5" datatype="html">
1528 <source>Services</source> 1878 <source>Services</source>
1529 <context-group purpose="location"> 1879 <context-group purpose="location">
1530 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1880 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1531 <context context-type="linenumber">168</context> 1881 <context context-type="linenumber">176</context>
1532 </context-group> 1882 </context-group>
1533 </trans-unit><trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490" datatype="html"> 1883 </trans-unit><trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490" datatype="html">
1534 <source>Transcoding</source> 1884 <source>Transcoding</source>
1535 <context-group purpose="location"> 1885 <context-group purpose="location">
1536 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1886 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1537 <context context-type="linenumber">200</context> 1887 <context context-type="linenumber">215</context>
1538 </context-group> 1888 </context-group>
1539 </trans-unit><trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9" datatype="html"> 1889 </trans-unit><trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9" datatype="html">
1540 <source>Transcoding enabled</source> 1890 <source>Transcoding enabled</source>
1541 <context-group purpose="location"> 1891 <context-group purpose="location">
1542 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1892 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1543 <context context-type="linenumber">204</context> 1893 <context context-type="linenumber">221</context>
1544 </context-group> 1894 </context-group>
1545 </trans-unit><trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f" datatype="html"> 1895 </trans-unit><trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f" datatype="html">
1546 <source>If you disable transcoding, many videos from your users will not work!</source> 1896 <source>If you disable transcoding, many videos from your users will not work!</source>
1547 <context-group purpose="location"> 1897 <context-group purpose="location">
1548 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1898 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1549 <context context-type="linenumber">205</context> 1899 <context context-type="linenumber">222</context>
1900 </context-group>
1901 </trans-unit><trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f" datatype="html">
1902 <source>Allow additional extensions</source>
1903 <context-group purpose="location">
1904 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1905 <context context-type="linenumber">231</context>
1906 </context-group>
1907 </trans-unit><trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33" datatype="html">
1908 <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
1909 <context-group purpose="location">
1910 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1911 <context context-type="linenumber">232</context>
1550 </context-group> 1912 </context-group>
1551 </trans-unit><trans-unit id="a33feadefbb776217c2db96100736314f8b765c2" datatype="html"> 1913 </trans-unit><trans-unit id="a33feadefbb776217c2db96100736314f8b765c2" datatype="html">
1552 <source>Transcoding threads</source> 1914 <source>Transcoding threads</source>
1553 <context-group purpose="location"> 1915 <context-group purpose="location">
1554 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1916 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1555 <context context-type="linenumber">211</context> 1917 <context context-type="linenumber">237</context>
1556 </context-group> 1918 </context-group>
1557 </trans-unit><trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500" datatype="html"> 1919 </trans-unit><trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500" datatype="html">
1558 <source>Resolution &lt;x id="INTERPOLATION" equiv-text="{{resolution}}"/&gt; enabled</source> 1920 <source>Resolution &lt;x id="INTERPOLATION" equiv-text="{{resolution}}"/&gt; enabled</source>
1559 <context-group purpose="location"> 1921 <context-group purpose="location">
1560 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1922 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1561 <context context-type="linenumber">227</context> 1923 <context context-type="linenumber">252</context>
1562 </context-group> 1924 </context-group>
1563 </trans-unit><trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5" datatype="html"> 1925 </trans-unit><trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5" datatype="html">
1564 <source> 1926 <source>
@@ -1568,81 +1930,81 @@
1568 </source> 1930 </source>
1569 <context-group purpose="location"> 1931 <context-group purpose="location">
1570 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1932 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1571 <context context-type="linenumber">233</context> 1933 <context context-type="linenumber">260</context>
1572 </context-group> 1934 </context-group>
1573 </trans-unit><trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0" datatype="html"> 1935 </trans-unit><trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0" datatype="html">
1574 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1936 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1575 <context-group purpose="location"> 1937 <context-group purpose="location">
1576 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1938 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1577 <context context-type="linenumber">238</context> 1939 <context context-type="linenumber">265</context>
1578 </context-group> 1940 </context-group>
1579 </trans-unit><trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7" datatype="html"> 1941 </trans-unit><trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7" datatype="html">
1580 <source>Previews cache size</source> 1942 <source>Previews cache size</source>
1581 <context-group purpose="location"> 1943 <context-group purpose="location">
1582 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1944 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1583 <context context-type="linenumber">243</context> 1945 <context context-type="linenumber">271</context>
1584 </context-group> 1946 </context-group>
1585 </trans-unit><trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607" datatype="html"> 1947 </trans-unit><trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607" datatype="html">
1586 <source>Video captions cache size</source> 1948 <source>Video captions cache size</source>
1587 <context-group purpose="location"> 1949 <context-group purpose="location">
1588 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1950 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1589 <context context-type="linenumber">254</context> 1951 <context context-type="linenumber">280</context>
1590 </context-group> 1952 </context-group>
1591 </trans-unit><trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c" datatype="html"> 1953 </trans-unit><trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c" datatype="html">
1592 <source>Customizations</source> 1954 <source>Customizations</source>
1593 <context-group purpose="location"> 1955 <context-group purpose="location">
1594 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1956 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1595 <context context-type="linenumber">264</context> 1957 <context context-type="linenumber">289</context>
1596 </context-group> 1958 </context-group>
1597 </trans-unit><trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c" datatype="html"> 1959 </trans-unit><trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c" datatype="html">
1598 <source>JavaScript</source> 1960 <source>JavaScript</source>
1599 <context-group purpose="location"> 1961 <context-group purpose="location">
1600 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1962 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1601 <context context-type="linenumber">267</context> 1963 <context context-type="linenumber">294</context>
1602 </context-group> 1964 </context-group>
1603 </trans-unit><trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c" datatype="html"> 1965 </trans-unit><trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c" datatype="html">
1604 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log(&apos;my instance is amazing&apos;);&lt;/pre&gt;</source> 1966 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log(&apos;my instance is amazing&apos;);&lt;/pre&gt;</source>
1605 <context-group purpose="location"> 1967 <context-group purpose="location">
1606 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1968 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1607 <context context-type="linenumber">270</context> 1969 <context context-type="linenumber">297</context>
1608 </context-group> 1970 </context-group>
1609 </trans-unit><trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5" datatype="html"> 1971 </trans-unit><trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde" datatype="html">
1610 <source> 1972 <source>
1611 Write directly CSS code. Example:&lt;br /&gt; 1973 Write directly CSS code. Example:&lt;br /&gt;
1612 &lt;pre&gt; 1974 &lt;pre&gt;
1613 body &lt;x id="INTERPOLATION" equiv-text="{{ &apos;{&apos; }}"/&gt; 1975 body &lt;x id="INTERPOLATION" equiv-text="{{ &apos;{&apos; }}"/&gt;
1614 background-color: red; 1976 background-color: red;
1615 &lt;x id="INTERPOLATION_1" equiv-text="{{ &apos;}&apos; }}"/&gt; 1977 &lt;x id="INTERPOLATION_1" equiv-text="{{ &apos;}&apos; }}"/&gt;
1616 &lt;/pre&gt; 1978 &lt;/pre&gt;
1617 1979
1618 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example: 1980 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1619 &lt;pre&gt; 1981 &lt;pre&gt;
1620 #custom-css .logged-in-email &lt;x id="INTERPOLATION" equiv-text="{{ &apos;{&apos; }}"/&gt; 1982 #custom-css .logged-in-email &lt;x id="INTERPOLATION" equiv-text="{{ &apos;{&apos; }}"/&gt;
1621 color: red; 1983 color: red;
1622 &lt;x id="INTERPOLATION_1" equiv-text="{{ &apos;}&apos; }}"/&gt; 1984 &lt;x id="INTERPOLATION_1" equiv-text="{{ &apos;}&apos; }}"/&gt;
1623 &lt;/pre&gt; 1985 &lt;/pre&gt;
1624 </source> 1986 </source>
1625 <context-group purpose="location"> 1987 <context-group purpose="location">
1626 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1988 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1627 <context context-type="linenumber">286</context> 1989 <context context-type="linenumber">311</context>
1628 </context-group> 1990 </context-group>
1629 </trans-unit><trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab" datatype="html"> 1991 </trans-unit><trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab" datatype="html">
1630 <source>Advanced configuration</source> 1992 <source>Advanced configuration</source>
1631 <context-group purpose="location"> 1993 <context-group purpose="location">
1632 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 1994 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1633 <context context-type="linenumber">197</context> 1995 <context context-type="linenumber">212</context>
1634 </context-group> 1996 </context-group>
1635 </trans-unit><trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8" datatype="html"> 1997 </trans-unit><trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8" datatype="html">
1636 <source>Update configuration</source> 1998 <source>Update configuration</source>
1637 <context-group purpose="location"> 1999 <context-group purpose="location">
1638 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 2000 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1639 <context context-type="linenumber">314</context> 2001 <context context-type="linenumber">340</context>
1640 </context-group> 2002 </context-group>
1641 </trans-unit><trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca" datatype="html"> 2003 </trans-unit><trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca" datatype="html">
1642 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 2004 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1643 <context-group purpose="location"> 2005 <context-group purpose="location">
1644 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context> 2006 <context context-type="sourcefile">app/+admin/config/edit-custom-config/edit-custom-config.component.html</context>
1645 <context context-type="linenumber">315</context> 2007 <context context-type="linenumber">341</context>
1646 </context-group> 2008 </context-group>
1647 </trans-unit><trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c" datatype="html"> 2009 </trans-unit><trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c" datatype="html">
1648 <source> 2010 <source>
@@ -1704,15 +2066,29 @@
1704 <context context-type="sourcefile">app/+admin/follows/following-add/following-add.component.html</context> 2066 <context context-type="sourcefile">app/+admin/follows/following-add/following-add.component.html</context>
1705 <context context-type="linenumber">21</context> 2067 <context context-type="linenumber">21</context>
1706 </context-group> 2068 </context-group>
2069 </trans-unit><trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954" datatype="html">
2070 <source>Filter...</source>
2071 <context-group purpose="location">
2072 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
2073 <context context-type="linenumber">8</context>
2074 </context-group>
2075 <context-group purpose="location">
2076 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
2077 <context context-type="linenumber">9</context>
2078 </context-group>
2079 <context-group purpose="location">
2080 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2081 <context context-type="linenumber">27</context>
2082 </context-group>
1707 </trans-unit><trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c" datatype="html"> 2083 </trans-unit><trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c" datatype="html">
1708 <source>ID</source> 2084 <source>ID</source>
1709 <context-group purpose="location"> 2085 <context-group purpose="location">
1710 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2086 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1711 <context context-type="linenumber">7</context> 2087 <context context-type="linenumber">16</context>
1712 </context-group> 2088 </context-group>
1713 <context-group purpose="location"> 2089 <context-group purpose="location">
1714 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2090 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1715 <context context-type="linenumber">7</context> 2091 <context context-type="linenumber">18</context>
1716 </context-group> 2092 </context-group>
1717 <context-group purpose="location"> 2093 <context-group purpose="location">
1718 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context> 2094 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context>
@@ -1722,27 +2098,27 @@
1722 <source>Score</source> 2098 <source>Score</source>
1723 <context-group purpose="location"> 2099 <context-group purpose="location">
1724 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2100 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1725 <context context-type="linenumber">8</context> 2101 <context context-type="linenumber">17</context>
1726 </context-group> 2102 </context-group>
1727 </trans-unit><trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767" datatype="html"> 2103 </trans-unit><trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767" datatype="html">
1728 <source>Host</source> 2104 <source>Host</source>
1729 <context-group purpose="location"> 2105 <context-group purpose="location">
1730 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2106 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1731 <context context-type="linenumber">10</context> 2107 <context context-type="linenumber">19</context>
1732 </context-group> 2108 </context-group>
1733 <context-group purpose="location"> 2109 <context-group purpose="location">
1734 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2110 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1735 <context context-type="linenumber">8</context> 2111 <context context-type="linenumber">19</context>
1736 </context-group> 2112 </context-group>
1737 </trans-unit><trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b" datatype="html"> 2113 </trans-unit><trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b" datatype="html">
1738 <source>State</source> 2114 <source>State</source>
1739 <context-group purpose="location"> 2115 <context-group purpose="location">
1740 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2116 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1741 <context context-type="linenumber">11</context> 2117 <context context-type="linenumber">20</context>
1742 </context-group> 2118 </context-group>
1743 <context-group purpose="location"> 2119 <context-group purpose="location">
1744 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2120 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1745 <context context-type="linenumber">9</context> 2121 <context context-type="linenumber">20</context>
1746 </context-group> 2122 </context-group>
1747 <context-group purpose="location"> 2123 <context-group purpose="location">
1748 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context> 2124 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context>
@@ -1756,11 +2132,11 @@
1756 <source>Created &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source> 2132 <source>Created &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source>
1757 <context-group purpose="location"> 2133 <context-group purpose="location">
1758 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2134 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1759 <context context-type="linenumber">12</context> 2135 <context context-type="linenumber">21</context>
1760 </context-group> 2136 </context-group>
1761 <context-group purpose="location"> 2137 <context-group purpose="location">
1762 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2138 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1763 <context context-type="linenumber">10</context> 2139 <context context-type="linenumber">21</context>
1764 </context-group> 2140 </context-group>
1765 <context-group purpose="location"> 2141 <context-group purpose="location">
1766 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context> 2142 <context context-type="sourcefile">app/+admin/jobs/jobs-list/jobs-list.component.html</context>
@@ -1768,7 +2144,7 @@
1768 </context-group> 2144 </context-group>
1769 <context-group purpose="location"> 2145 <context-group purpose="location">
1770 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2146 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1771 <context context-type="linenumber">21</context> 2147 <context context-type="linenumber">44</context>
1772 </context-group> 2148 </context-group>
1773 <context-group purpose="location"> 2149 <context-group purpose="location">
1774 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/video-abuse-list.component.html</context> 2150 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/video-abuse-list.component.html</context>
@@ -1782,27 +2158,27 @@
1782 <source>Accepted</source> 2158 <source>Accepted</source>
1783 <context-group purpose="location"> 2159 <context-group purpose="location">
1784 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2160 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1785 <context context-type="linenumber">23</context> 2161 <context context-type="linenumber">32</context>
1786 </context-group> 2162 </context-group>
1787 <context-group purpose="location"> 2163 <context-group purpose="location">
1788 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2164 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1789 <context context-type="linenumber">21</context> 2165 <context context-type="linenumber">32</context>
1790 </context-group> 2166 </context-group>
1791 </trans-unit><trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506" datatype="html"> 2167 </trans-unit><trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506" datatype="html">
1792 <source>Pending</source> 2168 <source>Pending</source>
1793 <context-group purpose="location"> 2169 <context-group purpose="location">
1794 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context> 2170 <context context-type="sourcefile">app/+admin/follows/followers-list/followers-list.component.html</context>
1795 <context context-type="linenumber">24</context> 2171 <context context-type="linenumber">33</context>
1796 </context-group> 2172 </context-group>
1797 <context-group purpose="location"> 2173 <context-group purpose="location">
1798 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2174 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1799 <context context-type="linenumber">22</context> 2175 <context context-type="linenumber">33</context>
1800 </context-group> 2176 </context-group>
1801 </trans-unit><trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8" datatype="html"> 2177 </trans-unit><trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8" datatype="html">
1802 <source>Redundancy allowed</source> 2178 <source>Redundancy allowed</source>
1803 <context-group purpose="location"> 2179 <context-group purpose="location">
1804 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context> 2180 <context context-type="sourcefile">app/+admin/follows/following-list/following-list.component.html</context>
1805 <context context-type="linenumber">11</context> 2181 <context context-type="linenumber">22</context>
1806 </context-group> 2182 </context-group>
1807 </trans-unit><trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479" datatype="html"> 2183 </trans-unit><trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479" datatype="html">
1808 <source>Manage follows</source> 2184 <source>Manage follows</source>
@@ -1908,7 +2284,7 @@
1908 </context-group> 2284 </context-group>
1909 <context-group purpose="location"> 2285 <context-group purpose="location">
1910 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2286 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1911 <context context-type="linenumber">20</context> 2287 <context context-type="linenumber">43</context>
1912 </context-group> 2288 </context-group>
1913 </trans-unit><trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345" datatype="html"> 2289 </trans-unit><trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345" datatype="html">
1914 <source> 2290 <source>
@@ -1933,71 +2309,57 @@
1933 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context> 2309 <context context-type="sourcefile">app/+admin/users/user-edit/user-edit.component.html</context>
1934 <context context-type="linenumber">72</context> 2310 <context context-type="linenumber">72</context>
1935 </context-group> 2311 </context-group>
1936 </trans-unit><trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33" datatype="html">
1937 <source>Ban &lt;x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/&gt;</source>
1938 <context-group purpose="location">
1939 <context context-type="sourcefile">app/+admin/users/user-list/user-ban-modal.component.html</context>
1940 <context context-type="linenumber">3</context>
1941 </context-group>
1942 </trans-unit><trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125" datatype="html">
1943 <source>Reason...</source>
1944 <context-group purpose="location">
1945 <context context-type="sourcefile">app/+admin/users/user-list/user-ban-modal.component.html</context>
1946 <context context-type="linenumber">10</context>
1947 </context-group>
1948 <context-group purpose="location">
1949 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
1950 <context context-type="linenumber">11</context>
1951 </context-group>
1952 <context-group purpose="location">
1953 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
1954 <context context-type="linenumber">11</context>
1955 </context-group>
1956 </trans-unit><trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251" datatype="html">
1957 <source>
1958 A banned user will no longer be able to login.
1959 </source>
1960 <context-group purpose="location">
1961 <context context-type="sourcefile">app/+admin/users/user-list/user-ban-modal.component.html</context>
1962 <context context-type="linenumber">17</context>
1963 </context-group>
1964 </trans-unit><trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020" datatype="html">
1965 <source>Ban this user</source>
1966 <context-group purpose="location">
1967 <context context-type="sourcefile">app/+admin/users/user-list/user-ban-modal.component.html</context>
1968 <context context-type="linenumber">25</context>
1969 </context-group>
1970 </trans-unit><trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f" datatype="html"> 2312 </trans-unit><trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f" datatype="html">
1971 <source>Users list</source> 2313 <source>Users list</source>
1972 <context-group purpose="location"> 2314 <context-group purpose="location">
1973 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2315 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1974 <context context-type="linenumber">2</context> 2316 <context context-type="linenumber">2</context>
1975 </context-group> 2317 </context-group>
2318 </trans-unit><trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4" datatype="html">
2319 <source>Batch actions</source>
2320 <context-group purpose="location">
2321 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2322 <context context-type="linenumber">19</context>
2323 </context-group>
1976 </trans-unit><trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5" datatype="html"> 2324 </trans-unit><trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5" datatype="html">
1977 <source>Username &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source> 2325 <source>Username &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source>
1978 <context-group purpose="location"> 2326 <context-group purpose="location">
1979 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2327 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1980 <context context-type="linenumber">17</context> 2328 <context context-type="linenumber">40</context>
1981 </context-group> 2329 </context-group>
1982 </trans-unit><trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c" datatype="html"> 2330 </trans-unit><trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b" datatype="html">
1983 <source>Actions</source> 2331 <source>(banned)</source>
1984 <context-group purpose="location"> 2332 <context-group purpose="location">
1985 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2333 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1986 <context context-type="linenumber">43</context> 2334 <context context-type="linenumber">65</context>
1987 </context-group> 2335 </context-group>
2336 </trans-unit><trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c" datatype="html">
2337 <source>Go to the account page</source>
1988 <context-group purpose="location"> 2338 <context-group purpose="location">
1989 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/video-abuse-list.component.html</context> 2339 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
1990 <context context-type="linenumber">44</context> 2340 <context context-type="linenumber">63</context>
1991 </context-group> 2341 </context-group>
1992 <context-group purpose="location"> 2342 <context-group purpose="location">
1993 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2343 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context>
1994 <context context-type="linenumber">33</context> 2344 <context context-type="linenumber">133</context>
2345 </context-group>
2346 </trans-unit><trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5" datatype="html">
2347 <source>User&apos;s email must be verified to login</source>
2348 <context-group purpose="location">
2349 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2350 <context context-type="linenumber">72</context>
2351 </context-group>
2352 </trans-unit><trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b" datatype="html">
2353 <source>User&apos;s email is verified / User can login without email verification</source>
2354 <context-group purpose="location">
2355 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2356 <context context-type="linenumber">76</context>
1995 </context-group> 2357 </context-group>
1996 </trans-unit><trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee" datatype="html"> 2358 </trans-unit><trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee" datatype="html">
1997 <source>Ban reason:</source> 2359 <source>Ban reason:</source>
1998 <context-group purpose="location"> 2360 <context-group purpose="location">
1999 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2361 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2000 <context context-type="linenumber">51</context> 2362 <context context-type="linenumber">95</context>
2001 </context-group> 2363 </context-group>
2002 </trans-unit><trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f" datatype="html"> 2364 </trans-unit><trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f" datatype="html">
2003 <source>Moderation comment</source> 2365 <source>Moderation comment</source>
@@ -2063,12 +2425,22 @@
2063 </context-group> 2425 </context-group>
2064 <context-group purpose="location"> 2426 <context-group purpose="location">
2065 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2427 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2066 <context context-type="linenumber">24</context> 2428 <context context-type="linenumber">25</context>
2067 </context-group> 2429 </context-group>
2068 <context-group purpose="location"> 2430 <context-group purpose="location">
2069 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context> 2431 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context>
2070 <context context-type="linenumber">33</context> 2432 <context context-type="linenumber">33</context>
2071 </context-group> 2433 </context-group>
2434 </trans-unit><trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c" datatype="html">
2435 <source>Actions</source>
2436 <context-group purpose="location">
2437 <context context-type="sourcefile">app/+admin/moderation/video-abuse-list/video-abuse-list.component.html</context>
2438 <context context-type="linenumber">44</context>
2439 </context-group>
2440 <context-group purpose="location">
2441 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2442 <context context-type="linenumber">35</context>
2443 </context-group>
2072 </trans-unit><trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2" datatype="html"> 2444 </trans-unit><trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2" datatype="html">
2073 <source>Reason:</source> 2445 <source>Reason:</source>
2074 <context-group purpose="location"> 2446 <context-group purpose="location">
@@ -2093,17 +2465,23 @@
2093 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2465 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2094 <context context-type="linenumber">9</context> 2466 <context context-type="linenumber">9</context>
2095 </context-group> 2467 </context-group>
2468 </trans-unit><trans-unit id="b748c96a1ee98d2fa9a645fb71838f5d4938855b" datatype="html">
2469 <source>Unfederated</source>
2470 <context-group purpose="location">
2471 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2472 <context context-type="linenumber">10</context>
2473 </context-group>
2096 </trans-unit><trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99" datatype="html"> 2474 </trans-unit><trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99" datatype="html">
2097 <source>Date &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source> 2475 <source>Date &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source>
2098 <context-group purpose="location"> 2476 <context-group purpose="location">
2099 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2477 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2100 <context context-type="linenumber">10</context> 2478 <context context-type="linenumber">11</context>
2101 </context-group> 2479 </context-group>
2102 </trans-unit><trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f" datatype="html"> 2480 </trans-unit><trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f" datatype="html">
2103 <source>Blacklist reason:</source> 2481 <source>Blacklist reason:</source>
2104 <context-group purpose="location"> 2482 <context-group purpose="location">
2105 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2483 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2106 <context context-type="linenumber">41</context> 2484 <context context-type="linenumber">43</context>
2107 </context-group> 2485 </context-group>
2108 </trans-unit><trans-unit id="90868353e7e6f5994109ee1011131cefa992116c" datatype="html"> 2486 </trans-unit><trans-unit id="90868353e7e6f5994109ee1011131cefa992116c" datatype="html">
2109 <source>Moderation</source> 2487 <source>Moderation</source>
@@ -2123,48 +2501,68 @@
2123 <context context-type="sourcefile">app/+admin/moderation/moderation.component.html</context> 2501 <context context-type="sourcefile">app/+admin/moderation/moderation.component.html</context>
2124 <context context-type="linenumber">7</context> 2502 <context context-type="linenumber">7</context>
2125 </context-group> 2503 </context-group>
2126 </trans-unit><trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6" datatype="html"> 2504 </trans-unit><trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c" datatype="html">
2127 <source>My settings</source> 2505 <source>Muted accounts</source>
2128 <context-group purpose="location"> 2506 <context-group purpose="location">
2129 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2507 <context context-type="sourcefile">app/+admin/moderation/moderation.component.html</context>
2130 <context context-type="linenumber">3</context> 2508 <context context-type="linenumber">9</context>
2131 </context-group> 2509 </context-group>
2132 </trans-unit><trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432" datatype="html">
2133 <source>My library</source>
2134 <context-group purpose="location"> 2510 <context-group purpose="location">
2135 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2511 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-blocklist.component.html</context>
2136 <context context-type="linenumber">7</context> 2512 <context context-type="linenumber">2</context>
2137 </context-group> 2513 </context-group>
2138 </trans-unit><trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f" datatype="html"> 2514 </trans-unit><trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2" datatype="html">
2139 <source>My channels</source> 2515 <source>Muted servers</source>
2140 <context-group purpose="location"> 2516 <context-group purpose="location">
2141 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2517 <context context-type="sourcefile">app/+admin/moderation/moderation.component.html</context>
2518 <context context-type="linenumber">11</context>
2519 </context-group>
2520 </trans-unit><trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
2521 <source>Account</source>
2522 <context-group purpose="location">
2523 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html</context>
2524 <context context-type="linenumber">8</context>
2525 </context-group>
2526 <context-group purpose="location">
2527 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-blocklist.component.html</context>
2142 <context context-type="linenumber">12</context> 2528 <context context-type="linenumber">12</context>
2143 </context-group> 2529 </context-group>
2144 </trans-unit><trans-unit id="d02888c485d3aeab6de628508f4a00312a722894" datatype="html"> 2530 </trans-unit><trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4" datatype="html">
2145 <source>My videos</source> 2531 <source>Muted at &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source>
2146 <context-group purpose="location"> 2532 <context-group purpose="location">
2147 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2533 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html</context>
2148 <context context-type="linenumber">14</context> 2534 <context context-type="linenumber">9</context>
2149 </context-group> 2535 </context-group>
2150 </trans-unit><trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9" datatype="html">
2151 <source>My subscriptions</source>
2152 <context-group purpose="location"> 2536 <context-group purpose="location">
2153 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2537 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html</context>
2154 <context context-type="linenumber">16</context> 2538 <context context-type="linenumber">9</context>
2539 </context-group>
2540 <context-group purpose="location">
2541 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-blocklist.component.html</context>
2542 <context context-type="linenumber">13</context>
2155 </context-group> 2543 </context-group>
2156 </trans-unit><trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed" datatype="html">
2157 <source>My imports</source>
2158 <context-group purpose="location"> 2544 <context-group purpose="location">
2159 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2545 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html</context>
2546 <context context-type="linenumber">13</context>
2547 </context-group>
2548 </trans-unit><trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8" datatype="html">
2549 <source>Unmute</source>
2550 <context-group purpose="location">
2551 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html</context>
2160 <context context-type="linenumber">18</context> 2552 <context context-type="linenumber">18</context>
2161 </context-group> 2553 </context-group>
2162 </trans-unit><trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7" datatype="html">
2163 <source>Ownership changes</source>
2164 <context-group purpose="location"> 2554 <context-group purpose="location">
2165 <context context-type="sourcefile">app/+my-account/my-account.component.html</context> 2555 <context context-type="sourcefile">app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html</context>
2556 <context context-type="linenumber">19</context>
2557 </context-group>
2558 <context-group purpose="location">
2559 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-blocklist.component.html</context>
2166 <context context-type="linenumber">22</context> 2560 <context context-type="linenumber">22</context>
2167 </context-group> 2561 </context-group>
2562 <context-group purpose="location">
2563 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html</context>
2564 <context context-type="linenumber">23</context>
2565 </context-group>
2168 </trans-unit><trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48" datatype="html"> 2566 </trans-unit><trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48" datatype="html">
2169 <source>Video quota:</source> 2567 <source>Video quota:</source>
2170 <context-group purpose="location"> 2568 <context-group purpose="location">
@@ -2175,19 +2573,19 @@
2175 <source>Profile</source> 2573 <source>Profile</source>
2176 <context-group purpose="location"> 2574 <context-group purpose="location">
2177 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context> 2575 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context>
2178 <context context-type="linenumber">8</context> 2576 <context context-type="linenumber">7</context>
2179 </context-group> 2577 </context-group>
2180 </trans-unit><trans-unit id="b5398623f87ee72ed23f5023918db1707771e925" datatype="html"> 2578 </trans-unit><trans-unit id="b5398623f87ee72ed23f5023918db1707771e925" datatype="html">
2181 <source>Video settings</source> 2579 <source>Video settings</source>
2182 <context-group purpose="location"> 2580 <context-group purpose="location">
2183 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context> 2581 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context>
2184 <context context-type="linenumber">15</context> 2582 <context context-type="linenumber">16</context>
2185 </context-group> 2583 </context-group>
2186 </trans-unit><trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735" datatype="html"> 2584 </trans-unit><trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735" datatype="html">
2187 <source>Danger zone</source> 2585 <source>Danger zone</source>
2188 <context-group purpose="location"> 2586 <context-group purpose="location">
2189 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context> 2587 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-settings.component.html</context>
2190 <context context-type="linenumber">18</context> 2588 <context context-type="linenumber">19</context>
2191 </context-group> 2589 </context-group>
2192 </trans-unit><trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf" datatype="html"> 2590 </trans-unit><trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf" datatype="html">
2193 <source>Change ownership</source> 2591 <source>Change ownership</source>
@@ -2221,24 +2619,6 @@
2221 <context context-type="sourcefile">app/videos/+video-edit/shared/video-caption-add-modal.component.html</context> 2619 <context context-type="sourcefile">app/videos/+video-edit/shared/video-caption-add-modal.component.html</context>
2222 <context context-type="linenumber">35</context> 2620 <context context-type="linenumber">35</context>
2223 </context-group> 2621 </context-group>
2224 </trans-unit><trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd" datatype="html">
2225 <source>Submit</source>
2226 <context-group purpose="location">
2227 <context context-type="sourcefile">app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html</context>
2228 <context context-type="linenumber">25</context>
2229 </context-group>
2230 <context-group purpose="location">
2231 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html</context>
2232 <context context-type="linenumber">28</context>
2233 </context-group>
2234 <context-group purpose="location">
2235 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
2236 <context context-type="linenumber">24</context>
2237 </context-group>
2238 <context-group purpose="location">
2239 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
2240 <context context-type="linenumber">24</context>
2241 </context-group>
2242 </trans-unit><trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79" datatype="html"> 2622 </trans-unit><trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79" datatype="html">
2243 <source>&lt;x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/&gt; views</source> 2623 <source>&lt;x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/&gt; - &lt;x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/&gt; views</source>
2244 <context-group purpose="location"> 2624 <context-group purpose="location">
@@ -2403,6 +2783,48 @@ When you will upload a video in this channel, the video support field will be au
2403 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context> 2783 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context>
2404 <context context-type="linenumber">47</context> 2784 <context context-type="linenumber">47</context>
2405 </context-group> 2785 </context-group>
2786 </trans-unit><trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e" datatype="html">
2787 <source>Muted instances</source>
2788 <context-group purpose="location">
2789 <context context-type="sourcefile">app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html</context>
2790 <context context-type="linenumber">2</context>
2791 </context-group>
2792 </trans-unit><trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530" datatype="html">
2793 <source>History enabled</source>
2794 <context-group purpose="location">
2795 <context context-type="sourcefile">app/+my-account/my-account-history/my-account-history.component.html</context>
2796 <context context-type="linenumber">4</context>
2797 </context-group>
2798 </trans-unit><trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123" datatype="html">
2799 <source>Delete history</source>
2800 <context-group purpose="location">
2801 <context context-type="sourcefile">app/+my-account/my-account-history/my-account-history.component.html</context>
2802 <context context-type="linenumber">8</context>
2803 </context-group>
2804 </trans-unit><trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af" datatype="html">
2805 <source>You don&apos;t have videos history yet.</source>
2806 <context-group purpose="location">
2807 <context context-type="sourcefile">app/+my-account/my-account-history/my-account-history.component.html</context>
2808 <context context-type="linenumber">13</context>
2809 </context-group>
2810 </trans-unit><trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628" datatype="html">
2811 <source>&lt;x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/&gt; views</source>
2812 <context-group purpose="location">
2813 <context context-type="sourcefile">app/+my-account/my-account-history/my-account-history.component.html</context>
2814 <context context-type="linenumber">22</context>
2815 </context-group>
2816 </trans-unit><trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105" datatype="html">
2817 <source>Notification preferences</source>
2818 <context-group purpose="location">
2819 <context context-type="sourcefile">app/+my-account/my-account-notifications/my-account-notifications.component.html</context>
2820 <context context-type="linenumber">2</context>
2821 </context-group>
2822 </trans-unit><trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829" datatype="html">
2823 <source>Mark all as read</source>
2824 <context-group purpose="location">
2825 <context context-type="sourcefile">app/+my-account/my-account-notifications/my-account-notifications.component.html</context>
2826 <context context-type="linenumber">4</context>
2827 </context-group>
2406 </trans-unit><trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9" datatype="html"> 2828 </trans-unit><trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9" datatype="html">
2407 <source>Change password</source> 2829 <source>Change password</source>
2408 <context-group purpose="location"> 2830 <context-group purpose="location">
@@ -2437,17 +2859,23 @@ When you will upload a video in this channel, the video support field will be au
2437 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 2859 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
2438 <context context-type="linenumber">3</context> 2860 <context context-type="linenumber">3</context>
2439 </context-group> 2861 </context-group>
2862 </trans-unit><trans-unit id="d044c51156e295824813a866dba9545bdb59466b" datatype="html">
2863 <source>Use WebTorrent to exchange parts of the video with others</source>
2864 <context-group purpose="location">
2865 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
2866 <context context-type="linenumber">21</context>
2867 </context-group>
2440 </trans-unit><trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2" datatype="html"> 2868 </trans-unit><trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2" datatype="html">
2441 <source>Automatically plays video</source> 2869 <source>Automatically plays video</source>
2442 <context-group purpose="location"> 2870 <context-group purpose="location">
2443 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 2871 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
2444 <context context-type="linenumber">20</context> 2872 <context context-type="linenumber">28</context>
2445 </context-group> 2873 </context-group>
2446 </trans-unit><trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe" datatype="html"> 2874 </trans-unit><trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe" datatype="html">
2447 <source>Save</source> 2875 <source>Save</source>
2448 <context-group purpose="location"> 2876 <context-group purpose="location">
2449 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context> 2877 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html</context>
2450 <context context-type="linenumber">23</context> 2878 <context context-type="linenumber">32</context>
2451 </context-group> 2879 </context-group>
2452 </trans-unit><trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba" datatype="html"> 2880 </trans-unit><trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba" datatype="html">
2453 <source>Update my profile</source> 2881 <source>Update my profile</source>
@@ -2485,6 +2913,18 @@ When you will upload a video in this channel, the video support field will be au
2485 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.html</context> 2913 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.html</context>
2486 <context context-type="linenumber">4</context> 2914 <context context-type="linenumber">4</context>
2487 </context-group> 2915 </context-group>
2916 </trans-unit><trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136" datatype="html">
2917 <source>Activities</source>
2918 <context-group purpose="location">
2919 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html</context>
2920 <context context-type="linenumber">2</context>
2921 </context-group>
2922 </trans-unit><trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355" datatype="html">
2923 <source>Web</source>
2924 <context-group purpose="location">
2925 <context context-type="sourcefile">app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.html</context>
2926 <context context-type="linenumber">3</context>
2927 </context-group>
2488 </trans-unit><trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd" datatype="html"> 2928 </trans-unit><trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd" datatype="html">
2489 <source> 2929 <source>
2490 Sorry, but we couldn&apos;t find the page you were looking for. 2930 Sorry, but we couldn&apos;t find the page you were looking for.
@@ -2603,23 +3043,37 @@ When you will upload a video in this channel, the video support field will be au
2603 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context> 3043 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context>
2604 <context context-type="linenumber">159</context> 3044 <context context-type="linenumber">159</context>
2605 </context-group> 3045 </context-group>
3046 </trans-unit><trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7" datatype="html">
3047 <source>Sorry, but something went wrong</source>
3048 <context-group purpose="location">
3049 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context>
3050 <context context-type="linenumber">42</context>
3051 </context-group>
3052 <context-group purpose="location">
3053 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3054 <context context-type="linenumber">41</context>
3055 </context-group>
3056 <context-group purpose="location">
3057 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context>
3058 <context context-type="linenumber">49</context>
3059 </context-group>
2606 </trans-unit><trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2" datatype="html"> 3060 </trans-unit><trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2" datatype="html">
2607 <source> 3061 <source>
2608 Congratulations, the video behind &lt;x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/&gt; will be imported! You can already add information about this video. 3062 Congratulations, the video behind &lt;x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/&gt; will be imported! You can already add information about this video.
2609</source> 3063</source>
2610 <context-group purpose="location"> 3064 <context-group purpose="location">
2611 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context> 3065 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context>
2612 <context context-type="linenumber">40</context> 3066 <context context-type="linenumber">46</context>
2613 </context-group> 3067 </context-group>
2614 </trans-unit><trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html"> 3068 </trans-unit><trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb" datatype="html">
2615 <source>Update</source> 3069 <source>Update</source>
2616 <context-group purpose="location"> 3070 <context-group purpose="location">
2617 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context> 3071 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-url.component.html</context>
2618 <context context-type="linenumber">57</context> 3072 <context context-type="linenumber">63</context>
2619 </context-group> 3073 </context-group>
2620 <context-group purpose="location"> 3074 <context-group purpose="location">
2621 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context> 3075 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context>
2622 <context context-type="linenumber">65</context> 3076 <context context-type="linenumber">70</context>
2623 </context-group> 3077 </context-group>
2624 <context-group purpose="location"> 3078 <context-group purpose="location">
2625 <context context-type="sourcefile">app/videos/+video-edit/video-update.component.html</context> 3079 <context context-type="sourcefile">app/videos/+video-edit/video-update.component.html</context>
@@ -2641,17 +3095,25 @@ When you will upload a video in this channel, the video support field will be au
2641 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3095 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
2642 <context context-type="linenumber">25</context> 3096 <context context-type="linenumber">25</context>
2643 </context-group> 3097 </context-group>
3098 </trans-unit><trans-unit id="6357683911e256c566259880de43ea9403de00d3" datatype="html">
3099 <source>
3100 Congratulations! Your video is now available in your private library.
3101</source>
3102 <context-group purpose="location">
3103 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3104 <context context-type="linenumber">45</context>
3105 </context-group>
2644 </trans-unit><trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215" datatype="html"> 3106 </trans-unit><trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215" datatype="html">
2645 <source>Publish will be available when upload is finished</source> 3107 <source>Publish will be available when upload is finished</source>
2646 <context-group purpose="location"> 3108 <context-group purpose="location">
2647 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3109 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
2648 <context context-type="linenumber">48</context> 3110 <context context-type="linenumber">58</context>
2649 </context-group> 3111 </context-group>
2650 </trans-unit><trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3" datatype="html"> 3112 </trans-unit><trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3" datatype="html">
2651 <source>Publish</source> 3113 <source>Publish</source>
2652 <context-group purpose="location"> 3114 <context-group purpose="location">
2653 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3115 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
2654 <context context-type="linenumber">55</context> 3116 <context context-type="linenumber">65</context>
2655 </context-group> 3117 </context-group>
2656 </trans-unit><trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b" datatype="html"> 3118 </trans-unit><trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b" datatype="html">
2657 <source>Select the torrent to import</source> 3119 <source>Select the torrent to import</source>
@@ -2683,7 +3145,7 @@ When you will upload a video in this channel, the video support field will be au
2683</source> 3145</source>
2684 <context-group purpose="location"> 3146 <context-group purpose="location">
2685 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context> 3147 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-import-torrent.component.html</context>
2686 <context context-type="linenumber">48</context> 3148 <context context-type="linenumber">53</context>
2687 </context-group> 3149 </context-group>
2688 </trans-unit><trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860" datatype="html"> 3150 </trans-unit><trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860" datatype="html">
2689 <source>Import &lt;x id="INTERPOLATION" equiv-text="{{ videoName }}"/&gt;</source> 3151 <source>Import &lt;x id="INTERPOLATION" equiv-text="{{ videoName }}"/&gt;</source>
@@ -2809,13 +3271,13 @@ When you will upload a video in this channel, the video support field will be au
2809 <source>Wait transcoding before publishing the video</source> 3271 <source>Wait transcoding before publishing the video</source>
2810 <context-group purpose="location"> 3272 <context-group purpose="location">
2811 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3273 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2812 <context context-type="linenumber">130</context> 3274 <context context-type="linenumber">131</context>
2813 </context-group> 3275 </context-group>
2814 </trans-unit><trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63" datatype="html"> 3276 </trans-unit><trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63" datatype="html">
2815 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 3277 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2816 <context-group purpose="location"> 3278 <context-group purpose="location">
2817 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3279 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2818 <context context-type="linenumber">131</context> 3280 <context context-type="linenumber">132</context>
2819 </context-group> 3281 </context-group>
2820 </trans-unit><trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7" datatype="html"> 3282 </trans-unit><trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7" datatype="html">
2821 <source>Basic info</source> 3283 <source>Basic info</source>
@@ -2827,43 +3289,43 @@ When you will upload a video in this channel, the video support field will be au
2827 <source>Add another caption</source> 3289 <source>Add another caption</source>
2828 <context-group purpose="location"> 3290 <context-group purpose="location">
2829 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3291 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2830 <context context-type="linenumber">146</context> 3292 <context context-type="linenumber">147</context>
2831 </context-group> 3293 </context-group>
2832 </trans-unit><trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed" datatype="html"> 3294 </trans-unit><trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed" datatype="html">
2833 <source>See the subtitle file</source> 3295 <source>See the subtitle file</source>
2834 <context-group purpose="location"> 3296 <context-group purpose="location">
2835 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3297 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2836 <context context-type="linenumber">155</context> 3298 <context context-type="linenumber">156</context>
2837 </context-group> 3299 </context-group>
2838 </trans-unit><trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee" datatype="html"> 3300 </trans-unit><trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee" datatype="html">
2839 <source>Already uploaded ✔</source> 3301 <source>Already uploaded ✔</source>
2840 <context-group purpose="location"> 3302 <context-group purpose="location">
2841 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3303 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2842 <context context-type="linenumber">159</context> 3304 <context context-type="linenumber">160</context>
2843 </context-group> 3305 </context-group>
2844 </trans-unit><trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad" datatype="html"> 3306 </trans-unit><trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad" datatype="html">
2845 <source>Will be created on update</source> 3307 <source>Will be created on update</source>
2846 <context-group purpose="location"> 3308 <context-group purpose="location">
2847 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3309 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2848 <context context-type="linenumber">167</context> 3310 <context context-type="linenumber">168</context>
2849 </context-group> 3311 </context-group>
2850 </trans-unit><trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9" datatype="html"> 3312 </trans-unit><trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9" datatype="html">
2851 <source>Cancel create</source> 3313 <source>Cancel create</source>
2852 <context-group purpose="location"> 3314 <context-group purpose="location">
2853 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3315 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2854 <context context-type="linenumber">169</context> 3316 <context context-type="linenumber">170</context>
2855 </context-group> 3317 </context-group>
2856 </trans-unit><trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393" datatype="html"> 3318 </trans-unit><trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393" datatype="html">
2857 <source>Will be deleted on update</source> 3319 <source>Will be deleted on update</source>
2858 <context-group purpose="location"> 3320 <context-group purpose="location">
2859 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3321 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2860 <context context-type="linenumber">175</context> 3322 <context context-type="linenumber">176</context>
2861 </context-group> 3323 </context-group>
2862 </trans-unit><trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c" datatype="html"> 3324 </trans-unit><trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c" datatype="html">
2863 <source>Cancel deletion</source> 3325 <source>Cancel deletion</source>
2864 <context-group purpose="location"> 3326 <context-group purpose="location">
2865 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3327 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2866 <context context-type="linenumber">177</context> 3328 <context context-type="linenumber">178</context>
2867 </context-group> 3329 </context-group>
2868 </trans-unit><trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0" datatype="html"> 3330 </trans-unit><trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0" datatype="html">
2869 <source> 3331 <source>
@@ -2871,31 +3333,31 @@ When you will upload a video in this channel, the video support field will be au
2871 </source> 3333 </source>
2872 <context-group purpose="location"> 3334 <context-group purpose="location">
2873 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3335 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2874 <context context-type="linenumber">182</context> 3336 <context context-type="linenumber">183</context>
2875 </context-group> 3337 </context-group>
2876 </trans-unit><trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93" datatype="html"> 3338 </trans-unit><trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93" datatype="html">
2877 <source>Captions</source> 3339 <source>Captions</source>
2878 <context-group purpose="location"> 3340 <context-group purpose="location">
2879 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3341 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2880 <context context-type="linenumber">139</context> 3342 <context context-type="linenumber">140</context>
2881 </context-group> 3343 </context-group>
2882 </trans-unit><trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513" datatype="html"> 3344 </trans-unit><trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513" datatype="html">
2883 <source>Upload thumbnail</source> 3345 <source>Upload thumbnail</source>
2884 <context-group purpose="location"> 3346 <context-group purpose="location">
2885 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3347 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2886 <context context-type="linenumber">195</context> 3348 <context context-type="linenumber">196</context>
2887 </context-group> 3349 </context-group>
2888 </trans-unit><trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639" datatype="html"> 3350 </trans-unit><trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639" datatype="html">
2889 <source>Upload preview</source> 3351 <source>Upload preview</source>
2890 <context-group purpose="location"> 3352 <context-group purpose="location">
2891 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3353 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2892 <context context-type="linenumber">202</context> 3354 <context context-type="linenumber">203</context>
2893 </context-group> 3355 </context-group>
2894 </trans-unit><trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604" datatype="html"> 3356 </trans-unit><trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604" datatype="html">
2895 <source>Support</source> 3357 <source>Support</source>
2896 <context-group purpose="location"> 3358 <context-group purpose="location">
2897 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3359 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2898 <context context-type="linenumber">208</context> 3360 <context context-type="linenumber">209</context>
2899 </context-group> 3361 </context-group>
2900 <context-group purpose="location"> 3362 <context-group purpose="location">
2901 <context context-type="sourcefile">app/videos/+video-watch/modal/video-support.component.html</context> 3363 <context context-type="sourcefile">app/videos/+video-watch/modal/video-support.component.html</context>
@@ -2909,13 +3371,13 @@ When you will upload a video in this channel, the video support field will be au
2909 <source>Short text to tell people how they can support you (membership platform...).</source> 3371 <source>Short text to tell people how they can support you (membership platform...).</source>
2910 <context-group purpose="location"> 3372 <context-group purpose="location">
2911 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3373 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2912 <context context-type="linenumber">209</context> 3374 <context context-type="linenumber">210</context>
2913 </context-group> 3375 </context-group>
2914 </trans-unit><trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1" datatype="html"> 3376 </trans-unit><trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1" datatype="html">
2915 <source>Advanced settings</source> 3377 <source>Advanced settings</source>
2916 <context-group purpose="location"> 3378 <context-group purpose="location">
2917 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context> 3379 <context context-type="sourcefile">app/videos/+video-edit/shared/video-edit.component.html</context>
2918 <context context-type="linenumber">190</context> 3380 <context context-type="linenumber">191</context>
2919 </context-group> 3381 </context-group>
2920 </trans-unit><trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0" datatype="html"> 3382 </trans-unit><trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0" datatype="html">
2921 <source> 3383 <source>
@@ -2977,17 +3439,14 @@ When you will upload a video in this channel, the video support field will be au
2977 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context> 3439 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
2978 <context context-type="linenumber">3</context> 3440 <context context-type="linenumber">3</context>
2979 </context-group> 3441 </context-group>
2980 </trans-unit><trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb" datatype="html"> 3442 </trans-unit><trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908" datatype="html">
2981 <source> 3443 <source>
2982 Cancel 3444 Your report will be sent to moderators of &lt;x id="INTERPOLATION" equiv-text="{{ currentHost }}"/&gt;.
2983 </source> 3445 &lt;x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/&gt; It will be forwarded to origin instance &lt;x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/&gt; too.&lt;x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/&gt;
3446 </source>
2984 <context-group purpose="location"> 3447 <context-group purpose="location">
2985 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context> 3448 <context context-type="sourcefile">app/videos/+video-watch/modal/video-report.component.html</context>
2986 <context context-type="linenumber">19</context> 3449 <context context-type="linenumber">9</context>
2987 </context-group>
2988 <context-group purpose="location">
2989 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
2990 <context context-type="linenumber">19</context>
2991 </context-group> 3450 </context-group>
2992 </trans-unit><trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9" datatype="html"> 3451 </trans-unit><trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9" datatype="html">
2993 <source>Share</source> 3452 <source>Share</source>
@@ -3031,6 +3490,12 @@ When you will upload a video in this channel, the video support field will be au
3031 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context> 3490 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
3032 <context context-type="linenumber">3</context> 3491 <context context-type="linenumber">3</context>
3033 </context-group> 3492 </context-group>
3493 </trans-unit><trans-unit id="9849bf6a9e45a9a91d13a419afbb5176f9b2367d" datatype="html">
3494 <source>Unfederate the video (ask for its deletion from the remote instances)</source>
3495 <context-group purpose="location">
3496 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
3497 <context context-type="linenumber">21</context>
3498 </context-group>
3034 </trans-unit><trans-unit id="7584313e33a66811eb10646627914a01fff0347d" datatype="html"> 3499 </trans-unit><trans-unit id="7584313e33a66811eb10646627914a01fff0347d" datatype="html">
3035 <source> 3500 <source>
3036 The video is being imported, it will be available when the import is finished. 3501 The video is being imported, it will be available when the import is finished.
@@ -3155,12 +3620,6 @@ When you will upload a video in this channel, the video support field will be au
3155 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context> 3620 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context>
3156 <context context-type="linenumber">134</context> 3621 <context context-type="linenumber">134</context>
3157 </context-group> 3622 </context-group>
3158 </trans-unit><trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c" datatype="html">
3159 <source>Go to the account page</source>
3160 <context-group purpose="location">
3161 <context context-type="sourcefile">app/videos/+video-watch/video-watch.component.html</context>
3162 <context context-type="linenumber">133</context>
3163 </context-group>
3164 </trans-unit><trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html"> 3623 </trans-unit><trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
3165 <source>Show more</source> 3624 <source>Show more</source>
3166 <context-group purpose="location"> 3625 <context-group purpose="location">
@@ -3223,23 +3682,17 @@ When you will upload a video in this channel, the video support field will be au
3223 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context> 3682 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context>
3224 <context context-type="linenumber">3</context> 3683 <context context-type="linenumber">3</context>
3225 </context-group> 3684 </context-group>
3226 </trans-unit><trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5" datatype="html">
3227 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@&lt;x id="INTERPOLATION" equiv-text="{{video.account.name}}"/&gt;@&lt;x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/&gt;&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href=&apos;https://github.com/Chocobozzz/PeerTube/issues/224&apos;&gt;#224&lt;/a&gt;.</source>
3228 <context-group purpose="location">
3229 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context>
3230 <context context-type="linenumber">8</context>
3231 </context-group>
3232 </trans-unit><trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4" datatype="html"> 3685 </trans-unit><trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4" datatype="html">
3233 <source>No comments.</source> 3686 <source>No comments.</source>
3234 <context-group purpose="location"> 3687 <context-group purpose="location">
3235 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context> 3688 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context>
3236 <context context-type="linenumber">18</context> 3689 <context context-type="linenumber">17</context>
3237 </context-group> 3690 </context-group>
3238 </trans-unit><trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e" datatype="html"> 3691 </trans-unit><trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e" datatype="html">
3239 <source>View all &lt;x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/&gt; replies</source> 3692 <source>View all &lt;x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/&gt; replies</source>
3240 <context-group purpose="location"> 3693 <context-group purpose="location">
3241 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context> 3694 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context>
3242 <context context-type="linenumber">55</context> 3695 <context context-type="linenumber">54</context>
3243 </context-group> 3696 </context-group>
3244 </trans-unit><trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828" datatype="html"> 3697 </trans-unit><trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828" datatype="html">
3245 <source> 3698 <source>
@@ -3247,7 +3700,7 @@ When you will upload a video in this channel, the video support field will be au
3247 </source> 3700 </source>
3248 <context-group purpose="location"> 3701 <context-group purpose="location">
3249 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context> 3702 <context context-type="sourcefile">app/videos/+video-watch/comment/video-comments.component.html</context>
3250 <context context-type="linenumber">64</context> 3703 <context context-type="linenumber">63</context>
3251 </context-group> 3704 </context-group>
3252 </trans-unit><trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e" datatype="html"> 3705 </trans-unit><trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e" datatype="html">
3253 <source>Add comment...</source> 3706 <source>Add comment...</source>
@@ -3314,13 +3767,27 @@ When you will upload a video in this channel, the video support field will be au
3314 <context context-type="linenumber">14</context> 3767 <context context-type="linenumber">14</context>
3315 </context-group> 3768 </context-group>
3316 </trans-unit> 3769 </trans-unit>
3317 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08" datatype="html"> 3770 <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331" datatype="html">
3318 <source>Error getting about from server</source> 3771 <source>Cannot get about information from server</source>
3319 <context-group purpose="location"> 3772 <context-group purpose="location">
3320 <context context-type="sourcefile">src/app/+about/about-instance/about-instance.component.ts</context> 3773 <context context-type="sourcefile">src/app/+about/about-instance/about-instance.component.ts</context>
3321 <context context-type="linenumber">1</context> 3774 <context context-type="linenumber">1</context>
3322 </context-group> 3775 </context-group>
3323 </trans-unit> 3776 </trans-unit>
3777 <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10" datatype="html">
3778 <source>Your message has been sent.</source>
3779 <context-group purpose="location">
3780 <context context-type="sourcefile">src/app/+about/about-instance/contact-admin-modal.component.ts</context>
3781 <context context-type="linenumber">1</context>
3782 </context-group>
3783 </trans-unit>
3784 <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c" datatype="html">
3785 <source>You already sent this form recently</source>
3786 <context-group purpose="location">
3787 <context context-type="sourcefile">src/app/+about/about-instance/contact-admin-modal.component.ts</context>
3788 <context context-type="linenumber">1</context>
3789 </context-group>
3790 </trans-unit>
3324 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968" datatype="html"> 3791 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968" datatype="html">
3325 <source>No description</source> 3792 <source>No description</source>
3326 <context-group purpose="location"> 3793 <context-group purpose="location">
@@ -3396,471 +3863,6 @@ When you will upload a video in this channel, the video support field will be au
3396 <context context-type="linenumber">1</context> 3863 <context context-type="linenumber">1</context>
3397 </context-group> 3864 </context-group>
3398 </trans-unit> 3865 </trans-unit>
3399 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d" datatype="html">
3400 <source>Error</source>
3401 <context-group purpose="location">
3402 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3403 <context context-type="linenumber">1</context>
3404 </context-group>
3405 <context-group purpose="location">
3406 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3407 <context context-type="linenumber">1</context>
3408 </context-group>
3409 <context-group purpose="location">
3410 <context context-type="sourcefile">src/app/+admin/follows/followers-list/followers-list.component.ts</context>
3411 <context context-type="linenumber">1</context>
3412 </context-group>
3413 <context-group purpose="location">
3414 <context context-type="sourcefile">src/app/+admin/follows/following-add/following-add.component.ts</context>
3415 <context context-type="linenumber">1</context>
3416 </context-group>
3417 <context-group purpose="location">
3418 <context context-type="sourcefile">src/app/+admin/follows/following-list/following-list.component.ts</context>
3419 <context context-type="linenumber">1</context>
3420 </context-group>
3421 <context-group purpose="location">
3422 <context context-type="sourcefile">src/app/+admin/follows/following-list/following-list.component.ts</context>
3423 <context context-type="linenumber">1</context>
3424 </context-group>
3425 <context-group purpose="location">
3426 <context context-type="sourcefile">src/app/+admin/follows/shared/redundancy-checkbox.component.ts</context>
3427 <context context-type="linenumber">1</context>
3428 </context-group>
3429 <context-group purpose="location">
3430 <context context-type="sourcefile">src/app/+admin/jobs/jobs-list/jobs-list.component.ts</context>
3431 <context context-type="linenumber">1</context>
3432 </context-group>
3433 <context-group purpose="location">
3434 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts</context>
3435 <context context-type="linenumber">1</context>
3436 </context-group>
3437 <context-group purpose="location">
3438 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
3439 <context context-type="linenumber">1</context>
3440 </context-group>
3441 <context-group purpose="location">
3442 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
3443 <context context-type="linenumber">1</context>
3444 </context-group>
3445 <context-group purpose="location">
3446 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
3447 <context context-type="linenumber">1</context>
3448 </context-group>
3449 <context-group purpose="location">
3450 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
3451 <context context-type="linenumber">1</context>
3452 </context-group>
3453 <context-group purpose="location">
3454 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
3455 <context context-type="linenumber">1</context>
3456 </context-group>
3457 <context-group purpose="location">
3458 <context context-type="sourcefile">src/app/+admin/users/user-list/user-ban-modal.component.ts</context>
3459 <context context-type="linenumber">1</context>
3460 </context-group>
3461 <context-group purpose="location">
3462 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3463 <context context-type="linenumber">1</context>
3464 </context-group>
3465 <context-group purpose="location">
3466 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3467 <context context-type="linenumber">1</context>
3468 </context-group>
3469 <context-group purpose="location">
3470 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3471 <context context-type="linenumber">1</context>
3472 </context-group>
3473 <context-group purpose="location">
3474 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3475 <context context-type="linenumber">1</context>
3476 </context-group>
3477 <context-group purpose="location">
3478 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3479 <context context-type="linenumber">1</context>
3480 </context-group>
3481 <context-group purpose="location">
3482 <context context-type="sourcefile">src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts</context>
3483 <context context-type="linenumber">1</context>
3484 </context-group>
3485 <context-group purpose="location">
3486 <context context-type="sourcefile">src/app/+my-account/my-account-ownership/my-account-ownership.component.ts</context>
3487 <context context-type="linenumber">1</context>
3488 </context-group>
3489 <context-group purpose="location">
3490 <context context-type="sourcefile">src/app/+my-account/my-account-ownership/my-account-ownership.component.ts</context>
3491 <context context-type="linenumber">1</context>
3492 </context-group>
3493 <context-group purpose="location">
3494 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts</context>
3495 <context context-type="linenumber">1</context>
3496 </context-group>
3497 <context-group purpose="location">
3498 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-settings.component.ts</context>
3499 <context context-type="linenumber">1</context>
3500 </context-group>
3501 <context-group purpose="location">
3502 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts</context>
3503 <context context-type="linenumber">1</context>
3504 </context-group>
3505 <context-group purpose="location">
3506 <context context-type="sourcefile">src/app/+my-account/my-account-subscriptions/my-account-subscriptions.component.ts</context>
3507 <context context-type="linenumber">1</context>
3508 </context-group>
3509 <context-group purpose="location">
3510 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts</context>
3511 <context context-type="linenumber">1</context>
3512 </context-group>
3513 <context-group purpose="location">
3514 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
3515 <context context-type="linenumber">1</context>
3516 </context-group>
3517 <context-group purpose="location">
3518 <context context-type="sourcefile">src/app/+my-account/my-account-video-imports/my-account-video-imports.component.ts</context>
3519 <context context-type="linenumber">1</context>
3520 </context-group>
3521 <context-group purpose="location">
3522 <context context-type="sourcefile">src/app/+my-account/my-account-videos/my-account-videos.component.ts</context>
3523 <context context-type="linenumber">1</context>
3524 </context-group>
3525 <context-group purpose="location">
3526 <context context-type="sourcefile">src/app/+my-account/my-account-videos/my-account-videos.component.ts</context>
3527 <context context-type="linenumber">1</context>
3528 </context-group>
3529 <context-group purpose="location">
3530 <context context-type="sourcefile">src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts</context>
3531 <context context-type="linenumber">1</context>
3532 </context-group>
3533 <context-group purpose="location">
3534 <context context-type="sourcefile">src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts</context>
3535 <context context-type="linenumber">1</context>
3536 </context-group>
3537 <context-group purpose="location">
3538 <context context-type="sourcefile">src/app/+verify-account/verify-account-email/verify-account-email.component.ts</context>
3539 <context context-type="linenumber">1</context>
3540 </context-group>
3541 <context-group purpose="location">
3542 <context context-type="sourcefile">src/app/+verify-account/verify-account-email/verify-account-email.component.ts</context>
3543 <context context-type="linenumber">1</context>
3544 </context-group>
3545 <context-group purpose="location">
3546 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
3547 <context context-type="linenumber">1</context>
3548 </context-group>
3549 <context-group purpose="location">
3550 <context context-type="sourcefile">src/app/login/login.component.ts</context>
3551 <context context-type="linenumber">1</context>
3552 </context-group>
3553 <context-group purpose="location">
3554 <context context-type="sourcefile">src/app/reset-password/reset-password.component.ts</context>
3555 <context context-type="linenumber">1</context>
3556 </context-group>
3557 <context-group purpose="location">
3558 <context context-type="sourcefile">src/app/search/search.component.ts</context>
3559 <context context-type="linenumber">1</context>
3560 </context-group>
3561 <context-group purpose="location">
3562 <context context-type="sourcefile">src/app/shared/forms/reactive-file.component.ts</context>
3563 <context context-type="linenumber">1</context>
3564 </context-group>
3565 <context-group purpose="location">
3566 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context>
3567 <context context-type="linenumber">1</context>
3568 </context-group>
3569 <context-group purpose="location">
3570 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context>
3571 <context context-type="linenumber">1</context>
3572 </context-group>
3573 <context-group purpose="location">
3574 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context>
3575 <context context-type="linenumber">1</context>
3576 </context-group>
3577 <context-group purpose="location">
3578 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts</context>
3579 <context context-type="linenumber">1</context>
3580 </context-group>
3581 <context-group purpose="location">
3582 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts</context>
3583 <context context-type="linenumber">1</context>
3584 </context-group>
3585 <context-group purpose="location">
3586 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-url.component.ts</context>
3587 <context context-type="linenumber">1</context>
3588 </context-group>
3589 <context-group purpose="location">
3590 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-url.component.ts</context>
3591 <context context-type="linenumber">1</context>
3592 </context-group>
3593 <context-group purpose="location">
3594 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3595 <context context-type="linenumber">1</context>
3596 </context-group>
3597 <context-group purpose="location">
3598 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3599 <context context-type="linenumber">1</context>
3600 </context-group>
3601 <context-group purpose="location">
3602 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3603 <context context-type="linenumber">1</context>
3604 </context-group>
3605 <context-group purpose="location">
3606 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3607 <context context-type="linenumber">1</context>
3608 </context-group>
3609 <context-group purpose="location">
3610 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3611 <context context-type="linenumber">1</context>
3612 </context-group>
3613 <context-group purpose="location">
3614 <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
3615 <context context-type="linenumber">1</context>
3616 </context-group>
3617 <context-group purpose="location">
3618 <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
3619 <context context-type="linenumber">1</context>
3620 </context-group>
3621 <context-group purpose="location">
3622 <context context-type="sourcefile">src/app/videos/+video-watch/comment/video-comment-add.component.ts</context>
3623 <context context-type="linenumber">1</context>
3624 </context-group>
3625 <context-group purpose="location">
3626 <context context-type="sourcefile">src/app/videos/+video-watch/comment/video-comments.component.ts</context>
3627 <context context-type="linenumber">1</context>
3628 </context-group>
3629 <context-group purpose="location">
3630 <context context-type="sourcefile">src/app/videos/+video-watch/comment/video-comments.component.ts</context>
3631 <context context-type="linenumber">1</context>
3632 </context-group>
3633 <context-group purpose="location">
3634 <context context-type="sourcefile">src/app/videos/+video-watch/comment/video-comments.component.ts</context>
3635 <context context-type="linenumber">1</context>
3636 </context-group>
3637 <context-group purpose="location">
3638 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-blacklist.component.ts</context>
3639 <context context-type="linenumber">1</context>
3640 </context-group>
3641 <context-group purpose="location">
3642 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-report.component.ts</context>
3643 <context context-type="linenumber">1</context>
3644 </context-group>
3645 <context-group purpose="location">
3646 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3647 <context context-type="linenumber">1</context>
3648 </context-group>
3649 <context-group purpose="location">
3650 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3651 <context context-type="linenumber">1</context>
3652 </context-group>
3653 <context-group purpose="location">
3654 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3655 <context context-type="linenumber">1</context>
3656 </context-group>
3657 <context-group purpose="location">
3658 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3659 <context context-type="linenumber">1</context>
3660 </context-group>
3661 <context-group purpose="location">
3662 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3663 <context context-type="linenumber">1</context>
3664 </context-group>
3665 <context-group purpose="location">
3666 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3667 <context context-type="linenumber">1</context>
3668 </context-group>
3669 </trans-unit>
3670 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed" datatype="html">
3671 <source>You set custom &lt;x id="INTERPOLATION" equiv-text="{{customizationsText}}"/&gt;. </source>
3672 <context-group purpose="location">
3673 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3674 <context context-type="linenumber">1</context>
3675 </context-group>
3676 </trans-unit>
3677 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e" datatype="html">
3678 <source>This could lead to security issues or bugs if you do not understand it. </source>
3679 <context-group purpose="location">
3680 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3681 <context context-type="linenumber">1</context>
3682 </context-group>
3683 </trans-unit>
3684 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0" datatype="html">
3685 <source>Are you sure you want to update the configuration?</source>
3686 <context-group purpose="location">
3687 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3688 <context context-type="linenumber">1</context>
3689 </context-group>
3690 </trans-unit>
3691 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119" datatype="html">
3692 <source>Please type</source>
3693 <context-group purpose="location">
3694 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3695 <context context-type="linenumber">1</context>
3696 </context-group>
3697 </trans-unit>
3698 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d" datatype="html">
3699 <source>to confirm.</source>
3700 <context-group purpose="location">
3701 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3702 <context context-type="linenumber">1</context>
3703 </context-group>
3704 </trans-unit>
3705 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba" datatype="html">
3706 <source>Success</source>
3707 <context-group purpose="location">
3708 <context context-type="sourcefile">src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts</context>
3709 <context context-type="linenumber">1</context>
3710 </context-group>
3711 <context-group purpose="location">
3712 <context context-type="sourcefile">src/app/+admin/follows/following-add/following-add.component.ts</context>
3713 <context context-type="linenumber">1</context>
3714 </context-group>
3715 <context-group purpose="location">
3716 <context context-type="sourcefile">src/app/+admin/follows/following-list/following-list.component.ts</context>
3717 <context context-type="linenumber">1</context>
3718 </context-group>
3719 <context-group purpose="location">
3720 <context context-type="sourcefile">src/app/+admin/follows/shared/redundancy-checkbox.component.ts</context>
3721 <context context-type="linenumber">1</context>
3722 </context-group>
3723 <context-group purpose="location">
3724 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts</context>
3725 <context context-type="linenumber">1</context>
3726 </context-group>
3727 <context-group purpose="location">
3728 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
3729 <context context-type="linenumber">1</context>
3730 </context-group>
3731 <context-group purpose="location">
3732 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
3733 <context context-type="linenumber">1</context>
3734 </context-group>
3735 <context-group purpose="location">
3736 <context context-type="sourcefile">src/app/+admin/users/user-edit/user-create.component.ts</context>
3737 <context context-type="linenumber">1</context>
3738 </context-group>
3739 <context-group purpose="location">
3740 <context context-type="sourcefile">src/app/+admin/users/user-edit/user-update.component.ts</context>
3741 <context context-type="linenumber">1</context>
3742 </context-group>
3743 <context-group purpose="location">
3744 <context context-type="sourcefile">src/app/+admin/users/user-list/user-ban-modal.component.ts</context>
3745 <context context-type="linenumber">1</context>
3746 </context-group>
3747 <context-group purpose="location">
3748 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3749 <context context-type="linenumber">1</context>
3750 </context-group>
3751 <context-group purpose="location">
3752 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
3753 <context context-type="linenumber">1</context>
3754 </context-group>
3755 <context-group purpose="location">
3756 <context context-type="sourcefile">src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.ts</context>
3757 <context context-type="linenumber">1</context>
3758 </context-group>
3759 <context-group purpose="location">
3760 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-change-password/my-account-change-password.component.ts</context>
3761 <context context-type="linenumber">1</context>
3762 </context-group>
3763 <context-group purpose="location">
3764 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-danger-zone/my-account-danger-zone.component.ts</context>
3765 <context context-type="linenumber">1</context>
3766 </context-group>
3767 <context-group purpose="location">
3768 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-profile/my-account-profile.component.ts</context>
3769 <context context-type="linenumber">1</context>
3770 </context-group>
3771 <context-group purpose="location">
3772 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-settings.component.ts</context>
3773 <context context-type="linenumber">1</context>
3774 </context-group>
3775 <context-group purpose="location">
3776 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.ts</context>
3777 <context context-type="linenumber">1</context>
3778 </context-group>
3779 <context-group purpose="location">
3780 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts</context>
3781 <context context-type="linenumber">1</context>
3782 </context-group>
3783 <context-group purpose="location">
3784 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts</context>
3785 <context context-type="linenumber">1</context>
3786 </context-group>
3787 <context-group purpose="location">
3788 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channel-update.component.ts</context>
3789 <context context-type="linenumber">1</context>
3790 </context-group>
3791 <context-group purpose="location">
3792 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
3793 <context context-type="linenumber">1</context>
3794 </context-group>
3795 <context-group purpose="location">
3796 <context context-type="sourcefile">src/app/+my-account/my-account-videos/my-account-videos.component.ts</context>
3797 <context context-type="linenumber">1</context>
3798 </context-group>
3799 <context-group purpose="location">
3800 <context context-type="sourcefile">src/app/+my-account/my-account-videos/my-account-videos.component.ts</context>
3801 <context context-type="linenumber">1</context>
3802 </context-group>
3803 <context-group purpose="location">
3804 <context context-type="sourcefile">src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.ts</context>
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 <context-group purpose="location">
3808 <context context-type="sourcefile">src/app/+verify-account/verify-account-ask-send-email/verify-account-ask-send-email.component.ts</context>
3809 <context context-type="linenumber">1</context>
3810 </context-group>
3811 <context-group purpose="location">
3812 <context context-type="sourcefile">src/app/login/login.component.ts</context>
3813 <context context-type="linenumber">1</context>
3814 </context-group>
3815 <context-group purpose="location">
3816 <context context-type="sourcefile">src/app/reset-password/reset-password.component.ts</context>
3817 <context context-type="linenumber">1</context>
3818 </context-group>
3819 <context-group purpose="location">
3820 <context context-type="sourcefile">src/app/signup/signup.component.ts</context>
3821 <context context-type="linenumber">1</context>
3822 </context-group>
3823 <context-group purpose="location">
3824 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts</context>
3825 <context context-type="linenumber">1</context>
3826 </context-group>
3827 <context-group purpose="location">
3828 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-import-url.component.ts</context>
3829 <context context-type="linenumber">1</context>
3830 </context-group>
3831 <context-group purpose="location">
3832 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
3833 <context context-type="linenumber">1</context>
3834 </context-group>
3835 <context-group purpose="location">
3836 <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
3837 <context context-type="linenumber">1</context>
3838 </context-group>
3839 <context-group purpose="location">
3840 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-blacklist.component.ts</context>
3841 <context context-type="linenumber">1</context>
3842 </context-group>
3843 <context-group purpose="location">
3844 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-download.component.ts</context>
3845 <context context-type="linenumber">1</context>
3846 </context-group>
3847 <context-group purpose="location">
3848 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-report.component.ts</context>
3849 <context context-type="linenumber">1</context>
3850 </context-group>
3851 <context-group purpose="location">
3852 <context context-type="sourcefile">src/app/videos/+video-watch/modal/video-share.component.ts</context>
3853 <context context-type="linenumber">1</context>
3854 </context-group>
3855 <context-group purpose="location">
3856 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3857 <context context-type="linenumber">1</context>
3858 </context-group>
3859 <context-group purpose="location">
3860 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
3861 <context context-type="linenumber">1</context>
3862 </context-group>
3863 </trans-unit>
3864 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048" datatype="html"> 3866 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048" datatype="html">
3865 <source>Configuration updated.</source> 3867 <source>Configuration updated.</source>
3866 <context-group purpose="location"> 3868 <context-group purpose="location">
@@ -3879,11 +3881,11 @@ When you will upload a video in this channel, the video support field will be au
3879 <context context-type="linenumber">1</context> 3881 <context context-type="linenumber">1</context>
3880 </context-group> 3882 </context-group>
3881 <context-group purpose="location"> 3883 <context-group purpose="location">
3882 <context context-type="sourcefile">src/app/+admin/users/shared/user.service.ts</context> 3884 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-settings.component.ts</context>
3883 <context context-type="linenumber">1</context> 3885 <context context-type="linenumber">1</context>
3884 </context-group> 3886 </context-group>
3885 <context-group purpose="location"> 3887 <context-group purpose="location">
3886 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-settings.component.ts</context> 3888 <context context-type="sourcefile">src/app/shared/users/user.service.ts</context>
3887 <context context-type="linenumber">1</context> 3889 <context context-type="linenumber">1</context>
3888 </context-group> 3890 </context-group>
3889 </trans-unit> 3891 </trans-unit>
@@ -4046,6 +4048,20 @@ When you will upload a video in this channel, the video support field will be au
4046 <context context-type="linenumber">1</context> 4048 <context context-type="linenumber">1</context>
4047 </context-group> 4049 </context-group>
4048 </trans-unit> 4050 </trans-unit>
4051 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da" datatype="html">
4052 <source>Account &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt; unmuted by your instance.</source>
4053 <context-group purpose="location">
4054 <context context-type="sourcefile">src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.ts</context>
4055 <context context-type="linenumber">1</context>
4056 </context-group>
4057 </trans-unit>
4058 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330" datatype="html">
4059 <source>Instance &lt;x id="INTERPOLATION" equiv-text="{{host}}"/&gt; unmuted by your instance.</source>
4060 <context-group purpose="location">
4061 <context context-type="sourcefile">src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.ts</context>
4062 <context context-type="linenumber">1</context>
4063 </context-group>
4064 </trans-unit>
4049 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6" datatype="html"> 4065 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6" datatype="html">
4050 <source>Comment updated.</source> 4066 <source>Comment updated.</source>
4051 <context-group purpose="location"> 4067 <context-group purpose="location">
@@ -4053,6 +4069,13 @@ When you will upload a video in this channel, the video support field will be au
4053 <context context-type="linenumber">1</context> 4069 <context context-type="linenumber">1</context>
4054 </context-group> 4070 </context-group>
4055 </trans-unit> 4071 </trans-unit>
4072 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978" datatype="html">
4073 <source>Delete this report</source>
4074 <context-group purpose="location">
4075 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
4076 <context context-type="linenumber">1</context>
4077 </context-group>
4078 </trans-unit>
4056 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321" datatype="html"> 4079 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321" datatype="html">
4057 <source>Update moderation comment</source> 4080 <source>Update moderation comment</source>
4058 <context-group purpose="location"> 4081 <context-group purpose="location">
@@ -4074,8 +4097,8 @@ When you will upload a video in this channel, the video support field will be au
4074 <context context-type="linenumber">1</context> 4097 <context context-type="linenumber">1</context>
4075 </context-group> 4098 </context-group>
4076 </trans-unit> 4099 </trans-unit>
4077 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03" datatype="html"> 4100 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599" datatype="html">
4078 <source>Do you really want to delete this abuse?</source> 4101 <source>Do you really want to delete this abuse report?</source>
4079 <context-group purpose="location"> 4102 <context-group purpose="location">
4080 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context> 4103 <context context-type="sourcefile">src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts</context>
4081 <context context-type="linenumber">1</context> 4104 <context context-type="linenumber">1</context>
@@ -4088,6 +4111,20 @@ When you will upload a video in this channel, the video support field will be au
4088 <context context-type="linenumber">1</context> 4111 <context context-type="linenumber">1</context>
4089 </context-group> 4112 </context-group>
4090 </trans-unit> 4113 </trans-unit>
4114 <trans-unit id="0594812d4c50c2adbd1a892a3497c4e5c19e4b32" datatype="html">
4115 <source>yes</source>
4116 <context-group purpose="location">
4117 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
4118 <context context-type="linenumber">1</context>
4119 </context-group>
4120 </trans-unit>
4121 <trans-unit id="6320692861e01fa9c9d4e692d0d27b6c12b21c3b" datatype="html">
4122 <source>no</source>
4123 <context-group purpose="location">
4124 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
4125 <context context-type="linenumber">1</context>
4126 </context-group>
4127 </trans-unit>
4091 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223" datatype="html"> 4128 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223" datatype="html">
4092 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source> 4129 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
4093 <context-group purpose="location"> 4130 <context-group purpose="location">
@@ -4110,13 +4147,6 @@ When you will upload a video in this channel, the video support field will be au
4110 <context context-type="linenumber">1</context> 4147 <context context-type="linenumber">1</context>
4111 </context-group> 4148 </context-group>
4112 </trans-unit> 4149 </trans-unit>
4113 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf" datatype="html">
4114 <source>Moderator</source>
4115 <context-group purpose="location">
4116 <context context-type="sourcefile">src/app/+admin/users/shared/user.service.ts</context>
4117 <context context-type="linenumber">1</context>
4118 </context-group>
4119 </trans-unit>
4120 <trans-unit id="364463fab6c5714118d6449561a0f8de1cc10bfa" datatype="html"> 4150 <trans-unit id="364463fab6c5714118d6449561a0f8de1cc10bfa" datatype="html">
4121 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; created.</source> 4151 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; created.</source>
4122 <context-group purpose="location"> 4152 <context-group purpose="location">
@@ -4138,28 +4168,33 @@ When you will upload a video in this channel, the video support field will be au
4138 <context context-type="linenumber">1</context> 4168 <context context-type="linenumber">1</context>
4139 </context-group> 4169 </context-group>
4140 </trans-unit> 4170 </trans-unit>
4141 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd" datatype="html"> 4171 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8" datatype="html">
4142 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; banned.</source> 4172 <source>Unban</source>
4143 <context-group purpose="location"> 4173 <context-group purpose="location">
4144 <context context-type="sourcefile">src/app/+admin/users/user-list/user-ban-modal.component.ts</context> 4174 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4145 <context context-type="linenumber">1</context> 4175 <context context-type="linenumber">1</context>
4146 </context-group> 4176 </context-group>
4147 </trans-unit>
4148 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0" datatype="html">
4149 <source>Ban</source>
4150 <context-group purpose="location"> 4177 <context-group purpose="location">
4151 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4178 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4152 <context context-type="linenumber">1</context> 4179 <context context-type="linenumber">1</context>
4153 </context-group> 4180 </context-group>
4181 <context-group purpose="location">
4182 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4183 <context context-type="linenumber">1</context>
4184 </context-group>
4185 <context-group purpose="location">
4186 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4187 <context context-type="linenumber">1</context>
4188 </context-group>
4154 </trans-unit> 4189 </trans-unit>
4155 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8" datatype="html"> 4190 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f" datatype="html">
4156 <source>Unban</source> 4191 <source>Set Email as Verified</source>
4157 <context-group purpose="location"> 4192 <context-group purpose="location">
4158 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4193 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4159 <context context-type="linenumber">1</context> 4194 <context context-type="linenumber">1</context>
4160 </context-group> 4195 </context-group>
4161 <context-group purpose="location"> 4196 <context-group purpose="location">
4162 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4197 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4163 <context context-type="linenumber">1</context> 4198 <context context-type="linenumber">1</context>
4164 </context-group> 4199 </context-group>
4165 </trans-unit> 4200 </trans-unit>
@@ -4169,16 +4204,20 @@ When you will upload a video in this channel, the video support field will be au
4169 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4204 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4170 <context context-type="linenumber">1</context> 4205 <context context-type="linenumber">1</context>
4171 </context-group> 4206 </context-group>
4207 <context-group purpose="location">
4208 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4209 <context context-type="linenumber">1</context>
4210 </context-group>
4172 </trans-unit> 4211 </trans-unit>
4173 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734" datatype="html"> 4212 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e" datatype="html">
4174 <source>Do you really want to unban &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt;?</source> 4213 <source>Do you really want to unban &lt;x id="INTERPOLATION" equiv-text="{{num}}"/&gt; users?</source>
4175 <context-group purpose="location"> 4214 <context-group purpose="location">
4176 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4215 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4177 <context context-type="linenumber">1</context> 4216 <context context-type="linenumber">1</context>
4178 </context-group> 4217 </context-group>
4179 </trans-unit> 4218 </trans-unit>
4180 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd" datatype="html"> 4219 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd" datatype="html">
4181 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; unbanned.</source> 4220 <source>&lt;x id="INTERPOLATION" equiv-text="{{num}}"/&gt; users unbanned.</source>
4182 <context-group purpose="location"> 4221 <context-group purpose="location">
4183 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4222 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4184 <context context-type="linenumber">1</context> 4223 <context context-type="linenumber">1</context>
@@ -4190,21 +4229,96 @@ When you will upload a video in this channel, the video support field will be au
4190 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4229 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4191 <context context-type="linenumber">1</context> 4230 <context context-type="linenumber">1</context>
4192 </context-group> 4231 </context-group>
4232 <context-group purpose="location">
4233 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4234 <context context-type="linenumber">1</context>
4235 </context-group>
4236 </trans-unit>
4237 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51" datatype="html">
4238 <source>If you remove these users, you will not be able to create others with the same username!</source>
4239 <context-group purpose="location">
4240 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4241 <context context-type="linenumber">1</context>
4242 </context-group>
4193 </trans-unit> 4243 </trans-unit>
4194 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603" datatype="html"> 4244 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329" datatype="html">
4195 <source>If you remove this user, you will not be able to create another with the same username!</source> 4245 <source>&lt;x id="INTERPOLATION" equiv-text="{{num}}"/&gt; users deleted.</source>
4196 <context-group purpose="location"> 4246 <context-group purpose="location">
4197 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4247 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4198 <context context-type="linenumber">1</context> 4248 <context context-type="linenumber">1</context>
4199 </context-group> 4249 </context-group>
4200 </trans-unit> 4250 </trans-unit>
4201 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a" datatype="html"> 4251 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650" datatype="html">
4202 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; deleted.</source> 4252 <source>&lt;x id="INTERPOLATION" equiv-text="{{num}}"/&gt; users email set as verified.</source>
4203 <context-group purpose="location"> 4253 <context-group purpose="location">
4204 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context> 4254 <context context-type="sourcefile">src/app/+admin/users/user-list/user-list.component.ts</context>
4205 <context context-type="linenumber">1</context> 4255 <context context-type="linenumber">1</context>
4206 </context-group> 4256 </context-group>
4207 </trans-unit> 4257 </trans-unit>
4258 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de" datatype="html">
4259 <source>Account &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt; unmuted.</source>
4260 <context-group purpose="location">
4261 <context context-type="sourcefile">src/app/+my-account/my-account-blocklist/my-account-blocklist.component.ts</context>
4262 <context context-type="linenumber">1</context>
4263 </context-group>
4264 <context-group purpose="location">
4265 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4266 <context context-type="linenumber">1</context>
4267 </context-group>
4268 </trans-unit>
4269 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c" datatype="html">
4270 <source>Instance &lt;x id="INTERPOLATION" equiv-text="{{host}}"/&gt; unmuted.</source>
4271 <context-group purpose="location">
4272 <context context-type="sourcefile">src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.ts</context>
4273 <context context-type="linenumber">1</context>
4274 </context-group>
4275 <context-group purpose="location">
4276 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
4277 <context context-type="linenumber">1</context>
4278 </context-group>
4279 </trans-unit>
4280 <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f" datatype="html">
4281 <source>My videos history</source>
4282 <context-group purpose="location">
4283 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4284 <context context-type="linenumber">1</context>
4285 </context-group>
4286 </trans-unit>
4287 <trans-unit id="05f6dda1754741495451b8658bd2248856765d95" datatype="html">
4288 <source>Videos history is enabled</source>
4289 <context-group purpose="location">
4290 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4291 <context context-type="linenumber">1</context>
4292 </context-group>
4293 </trans-unit>
4294 <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013" datatype="html">
4295 <source>Videos history is disabled</source>
4296 <context-group purpose="location">
4297 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4298 <context context-type="linenumber">1</context>
4299 </context-group>
4300 </trans-unit>
4301 <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8" datatype="html">
4302 <source>Delete videos history</source>
4303 <context-group purpose="location">
4304 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4305 <context context-type="linenumber">1</context>
4306 </context-group>
4307 </trans-unit>
4308 <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4" datatype="html">
4309 <source>Are you sure you want to delete all your videos history?</source>
4310 <context-group purpose="location">
4311 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4312 <context context-type="linenumber">1</context>
4313 </context-group>
4314 </trans-unit>
4315 <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164" datatype="html">
4316 <source>Videos history deleted</source>
4317 <context-group purpose="location">
4318 <context context-type="sourcefile">src/app/+my-account/my-account-history/my-account-history.component.ts</context>
4319 <context context-type="linenumber">1</context>
4320 </context-group>
4321 </trans-unit>
4208 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e" datatype="html"> 4322 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e" datatype="html">
4209 <source>Ownership accepted</source> 4323 <source>Ownership accepted</source>
4210 <context-group purpose="location"> 4324 <context-group purpose="location">
@@ -4254,6 +4368,76 @@ When you will upload a video in this channel, the video support field will be au
4254 <context context-type="linenumber">1</context> 4368 <context context-type="linenumber">1</context>
4255 </context-group> 4369 </context-group>
4256 </trans-unit> 4370 </trans-unit>
4371 <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585" datatype="html">
4372 <source>New video from your subscriptions</source>
4373 <context-group purpose="location">
4374 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4375 <context context-type="linenumber">1</context>
4376 </context-group>
4377 </trans-unit>
4378 <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5" datatype="html">
4379 <source>New comment on your video</source>
4380 <context-group purpose="location">
4381 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4382 <context context-type="linenumber">1</context>
4383 </context-group>
4384 </trans-unit>
4385 <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e" datatype="html">
4386 <source>New video abuse on local video</source>
4387 <context-group purpose="location">
4388 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4389 <context context-type="linenumber">1</context>
4390 </context-group>
4391 </trans-unit>
4392 <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996" datatype="html">
4393 <source>One of your video is blacklisted/unblacklisted</source>
4394 <context-group purpose="location">
4395 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4396 <context context-type="linenumber">1</context>
4397 </context-group>
4398 </trans-unit>
4399 <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc" datatype="html">
4400 <source>Video published (after transcoding/scheduled update)</source>
4401 <context-group purpose="location">
4402 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4403 <context context-type="linenumber">1</context>
4404 </context-group>
4405 </trans-unit>
4406 <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4" datatype="html">
4407 <source>Video import finished</source>
4408 <context-group purpose="location">
4409 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4410 <context context-type="linenumber">1</context>
4411 </context-group>
4412 </trans-unit>
4413 <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034" datatype="html">
4414 <source>A new user registered on your instance</source>
4415 <context-group purpose="location">
4416 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4417 <context context-type="linenumber">1</context>
4418 </context-group>
4419 </trans-unit>
4420 <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2" datatype="html">
4421 <source>You or your channel(s) has a new follower</source>
4422 <context-group purpose="location">
4423 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4424 <context context-type="linenumber">1</context>
4425 </context-group>
4426 </trans-unit>
4427 <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b" datatype="html">
4428 <source>Someone mentioned you in video comments</source>
4429 <context-group purpose="location">
4430 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4431 <context context-type="linenumber">1</context>
4432 </context-group>
4433 </trans-unit>
4434 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401" datatype="html">
4435 <source>Preferences saved</source>
4436 <context-group purpose="location">
4437 <context context-type="sourcefile">src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts</context>
4438 <context context-type="linenumber">1</context>
4439 </context-group>
4440 </trans-unit>
4257 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b" datatype="html"> 4441 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b" datatype="html">
4258 <source>Profile updated.</source> 4442 <source>Profile updated.</source>
4259 <context-group purpose="location"> 4443 <context-group purpose="location">
@@ -4286,6 +4470,13 @@ When you will upload a video in this channel, the video support field will be au
4286 <context context-type="linenumber">1</context> 4470 <context context-type="linenumber">1</context>
4287 </context-group> 4471 </context-group>
4288 </trans-unit> 4472 </trans-unit>
4473 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47" datatype="html">
4474 <source>This name already exists on this instance.</source>
4475 <context-group purpose="location">
4476 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts</context>
4477 <context context-type="linenumber">1</context>
4478 </context-group>
4479 </trans-unit>
4289 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html"> 4480 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795" datatype="html">
4290 <source>Create</source> 4481 <source>Create</source>
4291 <context-group purpose="location"> 4482 <context-group purpose="location">
@@ -4300,24 +4491,28 @@ When you will upload a video in this channel, the video support field will be au
4300 <context context-type="linenumber">1</context> 4491 <context context-type="linenumber">1</context>
4301 </context-group> 4492 </context-group>
4302 </trans-unit> 4493 </trans-unit>
4303 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814" datatype="html"> 4494 <trans-unit id="3859ca2a7577ba8797058d7d97eb8054bc56ec99" datatype="html">
4304 <source>Do you really want to delete &lt;x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/&gt;? It will delete all videos uploaded in this channel too.</source> 4495 <source>Please type the display name of the video channel (&lt;x id="INTERPOLATION" equiv-text="{{displayName}}"/&gt;) to confirm</source>
4305 <context-group purpose="location"> 4496 <context-group purpose="location">
4306 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context> 4497 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
4307 <context context-type="linenumber">1</context> 4498 <context context-type="linenumber">1</context>
4308 </context-group> 4499 </context-group>
4309 </trans-unit> 4500 </trans-unit>
4310 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e" datatype="html"> 4501 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2" datatype="html">
4311 <source>Please type the name of the video channel to confirm</source> 4502 <source>Video channel &lt;x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/&gt; deleted.</source>
4312 <context-group purpose="location"> 4503 <context-group purpose="location">
4313 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context> 4504 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
4314 <context context-type="linenumber">1</context> 4505 <context context-type="linenumber">1</context>
4315 </context-group> 4506 </context-group>
4316 </trans-unit> 4507 </trans-unit>
4317 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2" datatype="html"> 4508 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894" datatype="html">
4318 <source>Video channel &lt;x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/&gt; deleted.</source> 4509 <source>My videos</source>
4319 <context-group purpose="location"> 4510 <context-group purpose="location">
4320 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context> 4511 <context context-type="sourcefile">src/app/+my-account/my-account-videos/my-account-videos.component.ts</context>
4512 <context context-type="linenumber">1</context>
4513 </context-group>
4514 <context-group purpose="location">
4515 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4321 <context context-type="linenumber">1</context> 4516 <context context-type="linenumber">1</context>
4322 </context-group> 4517 </context-group>
4323 </trans-unit> 4518 </trans-unit>
@@ -4395,15 +4590,57 @@ When you will upload a video in this channel, the video support field will be au
4395 <context context-type="linenumber">1</context> 4590 <context context-type="linenumber">1</context>
4396 </context-group> 4591 </context-group>
4397 </trans-unit> 4592 </trans-unit>
4398 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19" datatype="html"> 4593 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432" datatype="html">
4399 <source>Channels</source> 4594 <source>My library</source>
4595 <context-group purpose="location">
4596 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4597 <context context-type="linenumber">1</context>
4598 </context-group>
4599 </trans-unit>
4600 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f" datatype="html">
4601 <source>My channels</source>
4602 <context-group purpose="location">
4603 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4604 <context context-type="linenumber">1</context>
4605 </context-group>
4606 </trans-unit>
4607 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9" datatype="html">
4608 <source>My subscriptions</source>
4609 <context-group purpose="location">
4610 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4611 <context context-type="linenumber">1</context>
4612 </context-group>
4613 </trans-unit>
4614 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79" datatype="html">
4615 <source>My history</source>
4616 <context-group purpose="location">
4617 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4618 <context context-type="linenumber">1</context>
4619 </context-group>
4620 </trans-unit>
4621 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029" datatype="html">
4622 <source>Misc</source>
4623 <context-group purpose="location">
4624 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4625 <context context-type="linenumber">1</context>
4626 </context-group>
4627 </trans-unit>
4628 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7" datatype="html">
4629 <source>Ownership changes</source>
4630 <context-group purpose="location">
4631 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4632 <context context-type="linenumber">1</context>
4633 </context-group>
4634 </trans-unit>
4635 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6" datatype="html">
4636 <source>My settings</source>
4400 <context-group purpose="location"> 4637 <context-group purpose="location">
4401 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context> 4638 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4402 <context context-type="linenumber">1</context> 4639 <context context-type="linenumber">1</context>
4403 </context-group> 4640 </context-group>
4404 </trans-unit> 4641 </trans-unit>
4405 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d" datatype="html"> 4642 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d" datatype="html">
4406 <source>Video imports</source> 4643 <source>My notifications</source>
4407 <context-group purpose="location"> 4644 <context-group purpose="location">
4408 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context> 4645 <context context-type="sourcefile">src/app/+my-account/my-account.component.ts</context>
4409 <context context-type="linenumber">1</context> 4646 <context context-type="linenumber">1</context>
@@ -4427,6 +4664,101 @@ When you will upload a video in this channel, the video support field will be au
4427 <context context-type="linenumber">1</context> 4664 <context context-type="linenumber">1</context>
4428 </context-group> 4665 </context-group>
4429 </trans-unit> 4666 </trans-unit>
4667 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598" datatype="html">
4668 <source>Subscribe to the account</source>
4669 <context-group purpose="location">
4670 <context context-type="sourcefile">src/app/+video-channels/video-channels.component.ts</context>
4671 <context context-type="linenumber">1</context>
4672 </context-group>
4673 <context-group purpose="location">
4674 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
4675 <context context-type="linenumber">1</context>
4676 </context-group>
4677 </trans-unit>
4678 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013" datatype="html">
4679 <source>Focus the search bar</source>
4680 <context-group purpose="location">
4681 <context context-type="sourcefile">src/app/app.component.ts</context>
4682 <context context-type="linenumber">1</context>
4683 </context-group>
4684 </trans-unit>
4685 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099" datatype="html">
4686 <source>Toggle the left menu</source>
4687 <context-group purpose="location">
4688 <context context-type="sourcefile">src/app/app.component.ts</context>
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
4692 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084" datatype="html">
4693 <source>Go to the videos overview page</source>
4694 <context-group purpose="location">
4695 <context context-type="sourcefile">src/app/app.component.ts</context>
4696 <context context-type="linenumber">1</context>
4697 </context-group>
4698 </trans-unit>
4699 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0" datatype="html">
4700 <source>Go to the trending videos page</source>
4701 <context-group purpose="location">
4702 <context context-type="sourcefile">src/app/app.component.ts</context>
4703 <context context-type="linenumber">1</context>
4704 </context-group>
4705 </trans-unit>
4706 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d" datatype="html">
4707 <source>Go to the recently added videos page</source>
4708 <context-group purpose="location">
4709 <context context-type="sourcefile">src/app/app.component.ts</context>
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5" datatype="html">
4714 <source>Go to the local videos page</source>
4715 <context-group purpose="location">
4716 <context context-type="sourcefile">src/app/app.component.ts</context>
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba" datatype="html">
4721 <source>Go to the videos upload page</source>
4722 <context-group purpose="location">
4723 <context context-type="sourcefile">src/app/app.component.ts</context>
4724 <context context-type="linenumber">1</context>
4725 </context-group>
4726 </trans-unit>
4727 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e" datatype="html">
4728 <source>Toggle Dark theme</source>
4729 <context-group purpose="location">
4730 <context context-type="sourcefile">src/app/app.component.ts</context>
4731 <context context-type="linenumber">1</context>
4732 </context-group>
4733 </trans-unit>
4734 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2" datatype="html">
4735 <source>Go to my subscriptions</source>
4736 <context-group purpose="location">
4737 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
4738 <context context-type="linenumber">1</context>
4739 </context-group>
4740 </trans-unit>
4741 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1" datatype="html">
4742 <source>Go to my videos</source>
4743 <context-group purpose="location">
4744 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
4745 <context context-type="linenumber">1</context>
4746 </context-group>
4747 </trans-unit>
4748 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7" datatype="html">
4749 <source>Go to my imports</source>
4750 <context-group purpose="location">
4751 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
4752 <context context-type="linenumber">1</context>
4753 </context-group>
4754 </trans-unit>
4755 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390" datatype="html">
4756 <source>Go to my channels</source>
4757 <context-group purpose="location">
4758 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
4759 <context context-type="linenumber">1</context>
4760 </context-group>
4761 </trans-unit>
4430 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7" datatype="html"> 4762 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7" datatype="html">
4431 <source>Cannot retrieve OAuth Client credentials: &lt;x id="INTERPOLATION" equiv-text="{{errorText}}"/&gt;. 4763 <source>Cannot retrieve OAuth Client credentials: &lt;x id="INTERPOLATION" equiv-text="{{errorText}}"/&gt;.
4432</source> 4764</source>
@@ -4442,6 +4774,17 @@ When you will upload a video in this channel, the video support field will be au
4442 <context context-type="linenumber">1</context> 4774 <context context-type="linenumber">1</context>
4443 </context-group> 4775 </context-group>
4444 </trans-unit> 4776 </trans-unit>
4777 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d" datatype="html">
4778 <source>Error</source>
4779 <context-group purpose="location">
4780 <context context-type="sourcefile">src/app/core/auth/auth.service.ts</context>
4781 <context context-type="linenumber">1</context>
4782 </context-group>
4783 <context-group purpose="location">
4784 <context context-type="sourcefile">src/app/core/notification/notifier.service.ts</context>
4785 <context context-type="linenumber">1</context>
4786 </context-group>
4787 </trans-unit>
4445 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87" datatype="html"> 4788 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87" datatype="html">
4446 <source>You need to reconnect.</source> 4789 <source>You need to reconnect.</source>
4447 <context-group purpose="location"> 4790 <context-group purpose="location">
@@ -4463,6 +4806,20 @@ When you will upload a video in this channel, the video support field will be au
4463 <context context-type="linenumber">1</context> 4806 <context context-type="linenumber">1</context>
4464 </context-group> 4807 </context-group>
4465 </trans-unit> 4808 </trans-unit>
4809 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5" datatype="html">
4810 <source>Info</source>
4811 <context-group purpose="location">
4812 <context context-type="sourcefile">src/app/core/notification/notifier.service.ts</context>
4813 <context context-type="linenumber">1</context>
4814 </context-group>
4815 </trans-unit>
4816 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba" datatype="html">
4817 <source>Success</source>
4818 <context-group purpose="location">
4819 <context context-type="sourcefile">src/app/core/notification/notifier.service.ts</context>
4820 <context context-type="linenumber">1</context>
4821 </context-group>
4822 </trans-unit>
4466 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe" datatype="html"> 4823 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe" datatype="html">
4467 <source>Incorrect username or password.</source> 4824 <source>Incorrect username or password.</source>
4468 <context-group purpose="location"> 4825 <context-group purpose="location">
@@ -4684,10 +5041,10 @@ When you will upload a video in this channel, the video support field will be au
4684 <context context-type="linenumber">1</context> 5041 <context context-type="linenumber">1</context>
4685 </context-group> 5042 </context-group>
4686 </trans-unit> 5043 </trans-unit>
4687 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149" datatype="html"> 5044 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0" datatype="html">
4688 <source>Username is required.</source> 5045 <source>Email is required.</source>
4689 <context-group purpose="location"> 5046 <context-group purpose="location">
4690 <context context-type="sourcefile">src/app/shared/forms/form-validators/login-validators.service.ts</context> 5047 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
4691 <context context-type="linenumber">1</context> 5048 <context context-type="linenumber">1</context>
4692 </context-group> 5049 </context-group>
4693 <context-group purpose="location"> 5050 <context-group purpose="location">
@@ -4695,10 +5052,10 @@ When you will upload a video in this channel, the video support field will be au
4695 <context context-type="linenumber">1</context> 5052 <context context-type="linenumber">1</context>
4696 </context-group> 5053 </context-group>
4697 </trans-unit> 5054 </trans-unit>
4698 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5" datatype="html"> 5055 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1" datatype="html">
4699 <source>Password is required.</source> 5056 <source>Email must be valid.</source>
4700 <context-group purpose="location"> 5057 <context-group purpose="location">
4701 <context context-type="sourcefile">src/app/shared/forms/form-validators/login-validators.service.ts</context> 5058 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
4702 <context context-type="linenumber">1</context> 5059 <context context-type="linenumber">1</context>
4703 </context-group> 5060 </context-group>
4704 <context-group purpose="location"> 5061 <context-group purpose="location">
@@ -4706,43 +5063,93 @@ When you will upload a video in this channel, the video support field will be au
4706 <context context-type="linenumber">1</context> 5063 <context context-type="linenumber">1</context>
4707 </context-group> 5064 </context-group>
4708 </trans-unit> 5065 </trans-unit>
4709 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154" datatype="html"> 5066 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33" datatype="html">
4710 <source>Confirmation of the password is required.</source> 5067 <source>Your name is required.</source>
4711 <context-group purpose="location"> 5068 <context-group purpose="location">
4712 <context context-type="sourcefile">src/app/shared/forms/form-validators/reset-password-validators.service.ts</context> 5069 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
5070 <context context-type="linenumber">1</context>
5071 </context-group>
5072 </trans-unit>
5073 <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a" datatype="html">
5074 <source>Your name must be at least 1 character long.</source>
5075 <context-group purpose="location">
5076 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
4713 <context context-type="linenumber">1</context> 5077 <context context-type="linenumber">1</context>
4714 </context-group> 5078 </context-group>
4715 </trans-unit> 5079 </trans-unit>
4716 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea" datatype="html"> 5080 <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b" datatype="html">
4717 <source>Username must be at least 3 characters long.</source> 5081 <source>Your name cannot be more than 120 characters long.</source>
5082 <context-group purpose="location">
5083 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
5084 <context context-type="linenumber">1</context>
5085 </context-group>
5086 </trans-unit>
5087 <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2" datatype="html">
5088 <source>A message is required.</source>
5089 <context-group purpose="location">
5090 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
5091 <context context-type="linenumber">1</context>
5092 </context-group>
5093 </trans-unit>
5094 <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64" datatype="html">
5095 <source>The message must be at least 3 characters long.</source>
5096 <context-group purpose="location">
5097 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
5098 <context context-type="linenumber">1</context>
5099 </context-group>
5100 </trans-unit>
5101 <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60" datatype="html">
5102 <source>The message cannot be more than 5000 characters long.</source>
5103 <context-group purpose="location">
5104 <context context-type="sourcefile">src/app/shared/forms/form-validators/instance-validators.service.ts</context>
5105 <context context-type="linenumber">1</context>
5106 </context-group>
5107 </trans-unit>
5108 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149" datatype="html">
5109 <source>Username is required.</source>
5110 <context-group purpose="location">
5111 <context context-type="sourcefile">src/app/shared/forms/form-validators/login-validators.service.ts</context>
5112 <context context-type="linenumber">1</context>
5113 </context-group>
4718 <context-group purpose="location"> 5114 <context-group purpose="location">
4719 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5115 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4720 <context context-type="linenumber">1</context> 5116 <context context-type="linenumber">1</context>
4721 </context-group> 5117 </context-group>
4722 </trans-unit> 5118 </trans-unit>
4723 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef" datatype="html"> 5119 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5" datatype="html">
4724 <source>Username cannot be more than 20 characters long.</source> 5120 <source>Password is required.</source>
5121 <context-group purpose="location">
5122 <context context-type="sourcefile">src/app/shared/forms/form-validators/login-validators.service.ts</context>
5123 <context context-type="linenumber">1</context>
5124 </context-group>
4725 <context-group purpose="location"> 5125 <context-group purpose="location">
4726 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5126 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4727 <context context-type="linenumber">1</context> 5127 <context context-type="linenumber">1</context>
4728 </context-group> 5128 </context-group>
4729 </trans-unit> 5129 </trans-unit>
4730 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9" datatype="html"> 5130 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154" datatype="html">
4731 <source>Username should be only lowercase alphanumeric characters.</source> 5131 <source>Confirmation of the password is required.</source>
5132 <context-group purpose="location">
5133 <context context-type="sourcefile">src/app/shared/forms/form-validators/reset-password-validators.service.ts</context>
5134 <context context-type="linenumber">1</context>
5135 </context-group>
5136 </trans-unit>
5137 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a" datatype="html">
5138 <source>Username must be at least 1 character long.</source>
4732 <context-group purpose="location"> 5139 <context-group purpose="location">
4733 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5140 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4734 <context context-type="linenumber">1</context> 5141 <context context-type="linenumber">1</context>
4735 </context-group> 5142 </context-group>
4736 </trans-unit> 5143 </trans-unit>
4737 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0" datatype="html"> 5144 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a" datatype="html">
4738 <source>Email is required.</source> 5145 <source>Username cannot be more than 50 characters long.</source>
4739 <context-group purpose="location"> 5146 <context-group purpose="location">
4740 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5147 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4741 <context context-type="linenumber">1</context> 5148 <context context-type="linenumber">1</context>
4742 </context-group> 5149 </context-group>
4743 </trans-unit> 5150 </trans-unit>
4744 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1" datatype="html"> 5151 <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c" datatype="html">
4745 <source>Email must be valid.</source> 5152 <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
4746 <context-group purpose="location"> 5153 <context-group purpose="location">
4747 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5154 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4748 <context context-type="linenumber">1</context> 5155 <context context-type="linenumber">1</context>
@@ -4815,8 +5222,8 @@ When you will upload a video in this channel, the video support field will be au
4815 <context context-type="linenumber">1</context> 5222 <context context-type="linenumber">1</context>
4816 </context-group> 5223 </context-group>
4817 </trans-unit> 5224 </trans-unit>
4818 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674" datatype="html"> 5225 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c" datatype="html">
4819 <source>Display name must be at least 3 characters long.</source> 5226 <source>Display name must be at least 1 character long.</source>
4820 <context-group purpose="location"> 5227 <context-group purpose="location">
4821 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5228 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4822 <context context-type="linenumber">1</context> 5229 <context context-type="linenumber">1</context>
@@ -4826,8 +5233,8 @@ When you will upload a video in this channel, the video support field will be au
4826 <context context-type="linenumber">1</context> 5233 <context context-type="linenumber">1</context>
4827 </context-group> 5234 </context-group>
4828 </trans-unit> 5235 </trans-unit>
4829 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9" datatype="html"> 5236 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1" datatype="html">
4830 <source>Display name cannot be more than 120 characters long.</source> 5237 <source>Display name cannot be more than 50 characters long.</source>
4831 <context-group purpose="location"> 5238 <context-group purpose="location">
4832 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5239 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4833 <context context-type="linenumber">1</context> 5240 <context context-type="linenumber">1</context>
@@ -4848,12 +5255,16 @@ When you will upload a video in this channel, the video support field will be au
4848 <context context-type="linenumber">1</context> 5255 <context context-type="linenumber">1</context>
4849 </context-group> 5256 </context-group>
4850 </trans-unit> 5257 </trans-unit>
4851 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3" datatype="html"> 5258 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0" datatype="html">
4852 <source>Description cannot be more than 250 characters long.</source> 5259 <source>Description cannot be more than 1000 characters long.</source>
4853 <context-group purpose="location"> 5260 <context-group purpose="location">
4854 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context> 5261 <context context-type="sourcefile">src/app/shared/forms/form-validators/user-validators.service.ts</context>
4855 <context context-type="linenumber">1</context> 5262 <context context-type="linenumber">1</context>
4856 </context-group> 5263 </context-group>
5264 <context-group purpose="location">
5265 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
5266 <context context-type="linenumber">1</context>
5267 </context-group>
4857 </trans-unit> 5268 </trans-unit>
4858 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561" datatype="html"> 5269 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561" datatype="html">
4859 <source>You must to agree with the instance terms in order to registering on it.</source> 5270 <source>You must to agree with the instance terms in order to registering on it.</source>
@@ -4890,8 +5301,8 @@ When you will upload a video in this channel, the video support field will be au
4890 <context context-type="linenumber">1</context> 5301 <context context-type="linenumber">1</context>
4891 </context-group> 5302 </context-group>
4892 </trans-unit> 5303 </trans-unit>
4893 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9" datatype="html"> 5304 <trans-unit id="8c7d4c82b057aea5dbae811e16935f9bcae4c2aa" datatype="html">
4894 <source>Report reason cannot be more than 300 characters long.</source> 5305 <source>Report reason cannot be more than 3000 characters long.</source>
4895 <context-group purpose="location"> 5306 <context-group purpose="location">
4896 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context> 5307 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
4897 <context context-type="linenumber">1</context> 5308 <context context-type="linenumber">1</context>
@@ -4911,8 +5322,8 @@ When you will upload a video in this channel, the video support field will be au
4911 <context context-type="linenumber">1</context> 5322 <context context-type="linenumber">1</context>
4912 </context-group> 5323 </context-group>
4913 </trans-unit> 5324 </trans-unit>
4914 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f" datatype="html"> 5325 <trans-unit id="23c1c2e105a98b0b6728949418a256b026b8971c" datatype="html">
4915 <source>Moderation comment cannot be more than 300 characters long.</source> 5326 <source>Moderation comment cannot be more than 3000 characters long.</source>
4916 <context-group purpose="location"> 5327 <context-group purpose="location">
4917 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context> 5328 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
4918 <context context-type="linenumber">1</context> 5329 <context context-type="linenumber">1</context>
@@ -4960,36 +5371,36 @@ When you will upload a video in this channel, the video support field will be au
4960 <context context-type="linenumber">1</context> 5371 <context context-type="linenumber">1</context>
4961 </context-group> 5372 </context-group>
4962 </trans-unit> 5373 </trans-unit>
4963 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33" datatype="html"> 5374 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803" datatype="html">
4964 <source>Name is required.</source> 5375 <source>You can only transfer ownership to a local account</source>
4965 <context-group purpose="location"> 5376 <context-group purpose="location">
4966 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5377 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-change-ownership-validators.service.ts</context>
4967 <context context-type="linenumber">1</context> 5378 <context context-type="linenumber">1</context>
4968 </context-group> 5379 </context-group>
4969 </trans-unit> 5380 </trans-unit>
4970 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069" datatype="html"> 5381 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33" datatype="html">
4971 <source>Name must be at least 3 characters long.</source> 5382 <source>Name is required.</source>
4972 <context-group purpose="location"> 5383 <context-group purpose="location">
4973 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5384 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
4974 <context context-type="linenumber">1</context> 5385 <context context-type="linenumber">1</context>
4975 </context-group> 5386 </context-group>
4976 </trans-unit> 5387 </trans-unit>
4977 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482" datatype="html"> 5388 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76" datatype="html">
4978 <source>Name cannot be more than 20 characters long.</source> 5389 <source>Name must be at least 1 character long.</source>
4979 <context-group purpose="location"> 5390 <context-group purpose="location">
4980 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5391 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
4981 <context context-type="linenumber">1</context> 5392 <context context-type="linenumber">1</context>
4982 </context-group> 5393 </context-group>
4983 </trans-unit> 5394 </trans-unit>
4984 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9" datatype="html"> 5395 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d" datatype="html">
4985 <source>Name should be only lowercase alphanumeric characters.</source> 5396 <source>Name cannot be more than 50 characters long.</source>
4986 <context-group purpose="location"> 5397 <context-group purpose="location">
4987 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5398 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
4988 <context context-type="linenumber">1</context> 5399 <context context-type="linenumber">1</context>
4989 </context-group> 5400 </context-group>
4990 </trans-unit> 5401 </trans-unit>
4991 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6" datatype="html"> 5402 <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18" datatype="html">
4992 <source>Description cannot be more than 500 characters long.</source> 5403 <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
4993 <context-group purpose="location"> 5404 <context-group purpose="location">
4994 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5405 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
4995 <context context-type="linenumber">1</context> 5406 <context context-type="linenumber">1</context>
@@ -5002,8 +5413,8 @@ When you will upload a video in this channel, the video support field will be au
5002 <context context-type="linenumber">1</context> 5413 <context context-type="linenumber">1</context>
5003 </context-group> 5414 </context-group>
5004 </trans-unit> 5415 </trans-unit>
5005 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813" datatype="html"> 5416 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85" datatype="html">
5006 <source>Support text cannot be more than 500 characters long.</source> 5417 <source>Support text cannot be more than 1000 characters long.</source>
5007 <context-group purpose="location"> 5418 <context-group purpose="location">
5008 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context> 5419 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-channel-validators.service.ts</context>
5009 <context context-type="linenumber">1</context> 5420 <context context-type="linenumber">1</context>
@@ -5100,8 +5511,8 @@ When you will upload a video in this channel, the video support field will be au
5100 <context context-type="linenumber">1</context> 5511 <context context-type="linenumber">1</context>
5101 </context-group> 5512 </context-group>
5102 </trans-unit> 5513 </trans-unit>
5103 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b" datatype="html"> 5514 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad" datatype="html">
5104 <source>Video support cannot be more than 500 characters long.</source> 5515 <source>Video support cannot be more than 1000 characters long.</source>
5105 <context-group purpose="location"> 5516 <context-group purpose="location">
5106 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-validators.service.ts</context> 5517 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-validators.service.ts</context>
5107 <context context-type="linenumber">1</context> 5518 <context context-type="linenumber">1</context>
@@ -5121,6 +5532,13 @@ When you will upload a video in this channel, the video support field will be au
5121 <context context-type="linenumber">1</context> 5532 <context context-type="linenumber">1</context>
5122 </context-group> 5533 </context-group>
5123 </trans-unit> 5534 </trans-unit>
5535 <trans-unit id="2f5f2093f14679fed82ff76a0cd2a28145a83ca9" datatype="html">
5536 <source>PeerTube cannot handle this kind of file. Accepted extensions are &lt;x id="INTERPOLATION" equiv-text="{{extensions}}"/&gt;.</source>
5537 <context-group purpose="location">
5538 <context context-type="sourcefile">src/app/shared/forms/reactive-file.component.ts</context>
5539 <context context-type="linenumber">1</context>
5540 </context-group>
5541 </trans-unit>
5124 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4" datatype="html"> 5542 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4" datatype="html">
5125 <source>All unsaved data will be lost, are you sure you want to leave this page?</source> 5543 <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
5126 <context-group purpose="location"> 5544 <context-group purpose="location">
@@ -5662,6 +6080,153 @@ When you will upload a video in this channel, the video support field will be au
5662 <context context-type="linenumber">1</context> 6080 <context context-type="linenumber">1</context>
5663 </context-group> 6081 </context-group>
5664 </trans-unit> 6082 </trans-unit>
6083 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681" datatype="html">
6084 <source>&lt;x id="INTERPOLATION" equiv-text="{{num}}"/&gt; users banned.</source>
6085 <context-group purpose="location">
6086 <context context-type="sourcefile">src/app/shared/moderation/user-ban-modal.component.ts</context>
6087 <context context-type="linenumber">1</context>
6088 </context-group>
6089 </trans-unit>
6090 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd" datatype="html">
6091 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; banned.</source>
6092 <context-group purpose="location">
6093 <context context-type="sourcefile">src/app/shared/moderation/user-ban-modal.component.ts</context>
6094 <context context-type="linenumber">1</context>
6095 </context-group>
6096 </trans-unit>
6097 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734" datatype="html">
6098 <source>Do you really want to unban &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt;?</source>
6099 <context-group purpose="location">
6100 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6101 <context context-type="linenumber">1</context>
6102 </context-group>
6103 </trans-unit>
6104 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd" datatype="html">
6105 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; unbanned.</source>
6106 <context-group purpose="location">
6107 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6108 <context context-type="linenumber">1</context>
6109 </context-group>
6110 </trans-unit>
6111 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603" datatype="html">
6112 <source>If you remove this user, you will not be able to create another with the same username!</source>
6113 <context-group purpose="location">
6114 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6115 <context context-type="linenumber">1</context>
6116 </context-group>
6117 </trans-unit>
6118 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a" datatype="html">
6119 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; deleted.</source>
6120 <context-group purpose="location">
6121 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6122 <context context-type="linenumber">1</context>
6123 </context-group>
6124 </trans-unit>
6125 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096" datatype="html">
6126 <source>User &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; email set as verified</source>
6127 <context-group purpose="location">
6128 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6129 <context context-type="linenumber">1</context>
6130 </context-group>
6131 </trans-unit>
6132 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249" datatype="html">
6133 <source>Account &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt; muted.</source>
6134 <context-group purpose="location">
6135 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6136 <context context-type="linenumber">1</context>
6137 </context-group>
6138 </trans-unit>
6139 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6" datatype="html">
6140 <source>Instance &lt;x id="INTERPOLATION" equiv-text="{{host}}"/&gt; muted.</source>
6141 <context-group purpose="location">
6142 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6143 <context context-type="linenumber">1</context>
6144 </context-group>
6145 </trans-unit>
6146 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499" datatype="html">
6147 <source>Account &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt; muted by the instance.</source>
6148 <context-group purpose="location">
6149 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6150 <context context-type="linenumber">1</context>
6151 </context-group>
6152 </trans-unit>
6153 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6" datatype="html">
6154 <source>Account &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt; unmuted by the instance.</source>
6155 <context-group purpose="location">
6156 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6157 <context context-type="linenumber">1</context>
6158 </context-group>
6159 </trans-unit>
6160 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830" datatype="html">
6161 <source>Instance &lt;x id="INTERPOLATION" equiv-text="{{host}}"/&gt; muted by the instance.</source>
6162 <context-group purpose="location">
6163 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6164 <context context-type="linenumber">1</context>
6165 </context-group>
6166 </trans-unit>
6167 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f" datatype="html">
6168 <source>Instance &lt;x id="INTERPOLATION" equiv-text="{{host}}"/&gt; unmuted by the instance.</source>
6169 <context-group purpose="location">
6170 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6171 <context context-type="linenumber">1</context>
6172 </context-group>
6173 </trans-unit>
6174 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc" datatype="html">
6175 <source>Mute this account</source>
6176 <context-group purpose="location">
6177 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6178 <context context-type="linenumber">1</context>
6179 </context-group>
6180 </trans-unit>
6181 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952" datatype="html">
6182 <source>Unmute this account</source>
6183 <context-group purpose="location">
6184 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6185 <context context-type="linenumber">1</context>
6186 </context-group>
6187 </trans-unit>
6188 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d" datatype="html">
6189 <source>Mute the instance</source>
6190 <context-group purpose="location">
6191 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6192 <context context-type="linenumber">1</context>
6193 </context-group>
6194 </trans-unit>
6195 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9" datatype="html">
6196 <source>Unmute the instance</source>
6197 <context-group purpose="location">
6198 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6199 <context context-type="linenumber">1</context>
6200 </context-group>
6201 </trans-unit>
6202 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432" datatype="html">
6203 <source>Mute this account by your instance</source>
6204 <context-group purpose="location">
6205 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6206 <context context-type="linenumber">1</context>
6207 </context-group>
6208 </trans-unit>
6209 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957" datatype="html">
6210 <source>Unmute this account by your instance</source>
6211 <context-group purpose="location">
6212 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6213 <context context-type="linenumber">1</context>
6214 </context-group>
6215 </trans-unit>
6216 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178" datatype="html">
6217 <source>Mute the instance by your instance</source>
6218 <context-group purpose="location">
6219 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6220 <context context-type="linenumber">1</context>
6221 </context-group>
6222 </trans-unit>
6223 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a" datatype="html">
6224 <source>Unmute the instance by your instance</source>
6225 <context-group purpose="location">
6226 <context context-type="sourcefile">src/app/shared/moderation/user-moderation-dropdown.component.ts</context>
6227 <context context-type="linenumber">1</context>
6228 </context-group>
6229 </trans-unit>
5665 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac" datatype="html"> 6230 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac" datatype="html">
5666 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 6231 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5667 <context-group purpose="location"> 6232 <context-group purpose="location">
@@ -5690,6 +6255,13 @@ When you will upload a video in this channel, the video support field will be au
5690 <context context-type="linenumber">1</context> 6255 <context context-type="linenumber">1</context>
5691 </context-group> 6256 </context-group>
5692 </trans-unit> 6257 </trans-unit>
6258 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded" datatype="html">
6259 <source>Subscribed to &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt;</source>
6260 <context-group purpose="location">
6261 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context>
6262 <context context-type="linenumber">1</context>
6263 </context-group>
6264 </trans-unit>
5693 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1" datatype="html"> 6265 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1" datatype="html">
5694 <source>Subscribed</source> 6266 <source>Subscribed</source>
5695 <context-group purpose="location"> 6267 <context-group purpose="location">
@@ -5697,8 +6269,8 @@ When you will upload a video in this channel, the video support field will be au
5697 <context context-type="linenumber">1</context> 6269 <context context-type="linenumber">1</context>
5698 </context-group> 6270 </context-group>
5699 </trans-unit> 6271 </trans-unit>
5700 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded" datatype="html"> 6272 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26" datatype="html">
5701 <source>Subscribed to &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt;</source> 6273 <source>Unsubscribed from &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt;</source>
5702 <context-group purpose="location"> 6274 <context-group purpose="location">
5703 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context> 6275 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context>
5704 <context context-type="linenumber">1</context> 6276 <context context-type="linenumber">1</context>
@@ -5711,10 +6283,10 @@ When you will upload a video in this channel, the video support field will be au
5711 <context context-type="linenumber">1</context> 6283 <context context-type="linenumber">1</context>
5712 </context-group> 6284 </context-group>
5713 </trans-unit> 6285 </trans-unit>
5714 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26" datatype="html"> 6286 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf" datatype="html">
5715 <source>Unsubscribed from &lt;x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/&gt;</source> 6287 <source>Moderator</source>
5716 <context-group purpose="location"> 6288 <context-group purpose="location">
5717 <context context-type="sourcefile">src/app/shared/user-subscription/subscribe-button.component.ts</context> 6289 <context context-type="sourcefile">src/app/shared/users/user.service.ts</context>
5718 <context context-type="linenumber">1</context> 6290 <context context-type="linenumber">1</context>
5719 </context-group> 6291 </context-group>
5720 </trans-unit> 6292 </trans-unit>
@@ -5739,22 +6311,15 @@ When you will upload a video in this channel, the video support field will be au
5739 <context context-type="linenumber">1</context> 6311 <context context-type="linenumber">1</context>
5740 </context-group> 6312 </context-group>
5741 </trans-unit> 6313 </trans-unit>
5742 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2" datatype="html"> 6314 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609" datatype="html">
5743 <source>Welcome</source> 6315 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5744 <context-group purpose="location"> 6316 <context-group purpose="location">
5745 <context context-type="sourcefile">src/app/signup/signup.component.ts</context> 6317 <context context-type="sourcefile">src/app/signup/signup.component.ts</context>
5746 <context context-type="linenumber">1</context> 6318 <context context-type="linenumber">1</context>
5747 </context-group> 6319 </context-group>
5748 </trans-unit> 6320 </trans-unit>
5749 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c" datatype="html"> 6321 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6" datatype="html">
5750 <source>Please check your email to verify your account and complete signup.</source> 6322 <source>You are now logged in as &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt;!</source>
5751 <context-group purpose="location">
5752 <context context-type="sourcefile">src/app/signup/signup.component.ts</context>
5753 <context context-type="linenumber">1</context>
5754 </context-group>
5755 </trans-unit>
5756 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be" datatype="html">
5757 <source>Registration for &lt;x id="INTERPOLATION" equiv-text="{{username}}"/&gt; complete.</source>
5758 <context-group purpose="location"> 6323 <context-group purpose="location">
5759 <context context-type="sourcefile">src/app/signup/signup.component.ts</context> 6324 <context context-type="sourcefile">src/app/signup/signup.component.ts</context>
5760 <context context-type="linenumber">1</context> 6325 <context context-type="linenumber">1</context>
@@ -5792,13 +6357,6 @@ When you will upload a video in this channel, the video support field will be au
5792 <context context-type="linenumber">1</context> 6357 <context context-type="linenumber">1</context>
5793 </context-group> 6358 </context-group>
5794 </trans-unit> 6359 </trans-unit>
5795 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5" datatype="html">
5796 <source>Info</source>
5797 <context-group purpose="location">
5798 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
5799 <context context-type="linenumber">1</context>
5800 </context-group>
5801 </trans-unit>
5802 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9" datatype="html"> 6360 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9" datatype="html">
5803 <source>Upload cancelled</source> 6361 <source>Upload cancelled</source>
5804 <context-group purpose="location"> 6362 <context-group purpose="location">
@@ -5806,13 +6364,6 @@ When you will upload a video in this channel, the video support field will be au
5806 <context context-type="linenumber">1</context> 6364 <context context-type="linenumber">1</context>
5807 </context-group> 6365 </context-group>
5808 </trans-unit> 6366 </trans-unit>
5809 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa" datatype="html">
5810 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5811 <context-group purpose="location">
5812 <context context-type="sourcefile">src/app/videos/+video-edit/video-add-components/video-upload.component.ts</context>
5813 <context context-type="linenumber">1</context>
5814 </context-group>
5815 </trans-unit>
5816 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee" datatype="html"> 6367 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee" datatype="html">
5817 <source>Your video quota is exceeded with this video (video size: &lt;x id="INTERPOLATION" equiv-text="{{videoSize}}"/&gt;, used: &lt;x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/&gt;, quota: &lt;x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/&gt;)</source> 6368 <source>Your video quota is exceeded with this video (video size: &lt;x id="INTERPOLATION" equiv-text="{{videoSize}}"/&gt;, used: &lt;x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/&gt;, quota: &lt;x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/&gt;)</source>
5818 <context-group purpose="location"> 6369 <context-group purpose="location">
@@ -5834,6 +6385,13 @@ When you will upload a video in this channel, the video support field will be au
5834 <context context-type="linenumber">1</context> 6385 <context context-type="linenumber">1</context>
5835 </context-group> 6386 </context-group>
5836 </trans-unit> 6387 </trans-unit>
6388 <trans-unit id="bfdf9de4bd9140f77feb6a5fe2b51f3f0565eaa4" datatype="html">
6389 <source>You have unsaved changes! If you leave, your changes will be lost.</source>
6390 <context-group purpose="location">
6391 <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
6392 <context context-type="linenumber">1</context>
6393 </context-group>
6394 </trans-unit>
5837 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187" datatype="html"> 6395 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187" datatype="html">
5838 <source>Video updated.</source> 6396 <source>Video updated.</source>
5839 <context-group purpose="location"> 6397 <context-group purpose="location">
@@ -5880,6 +6438,20 @@ When you will upload a video in this channel, the video support field will be au
5880 <context context-type="linenumber">1</context> 6438 <context context-type="linenumber">1</context>
5881 </context-group> 6439 </context-group>
5882 </trans-unit> 6440 </trans-unit>
6441 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6" datatype="html">
6442 <source>Like the video</source>
6443 <context-group purpose="location">
6444 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
6445 <context context-type="linenumber">1</context>
6446 </context-group>
6447 </trans-unit>
6448 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8" datatype="html">
6449 <source>Dislike the video</source>
6450 <context-group purpose="location">
6451 <context context-type="sourcefile">src/app/videos/+video-watch/video-watch.component.ts</context>
6452 <context context-type="linenumber">1</context>
6453 </context-group>
6454 </trans-unit>
5883 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95" datatype="html"> 6455 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95" datatype="html">
5884 <source>Do you really want to delete this video?</source> 6456 <source>Do you really want to delete this video?</source>
5885 <context-group purpose="location"> 6457 <context-group purpose="location">
@@ -5908,6 +6480,34 @@ When you will upload a video in this channel, the video support field will be au
5908 <context context-type="linenumber">1</context> 6480 <context context-type="linenumber">1</context>
5909 </context-group> 6481 </context-group>
5910 </trans-unit> 6482 </trans-unit>
6483 <trans-unit id="5b94148c16fa19e3db89972d11e93f790a73a054" datatype="html">
6484 <source>Trending for the last 24 hours</source>
6485 <context-group purpose="location">
6486 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6487 <context context-type="linenumber">1</context>
6488 </context-group>
6489 </trans-unit>
6490 <trans-unit id="8c429645223c24afe30218fc45bb07e352bb1938" datatype="html">
6491 <source>Trending videos are those totalizing the greatest number of views during the last 24 hours.</source>
6492 <context-group purpose="location">
6493 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6494 <context context-type="linenumber">1</context>
6495 </context-group>
6496 </trans-unit>
6497 <trans-unit id="6da9ddede61711ecfeaa94fc61a6b7bb844ab3df" datatype="html">
6498 <source>Trending for the last &lt;x id="INTERPOLATION" equiv-text="{{days}}"/&gt; days</source>
6499 <context-group purpose="location">
6500 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6501 <context context-type="linenumber">1</context>
6502 </context-group>
6503 </trans-unit>
6504 <trans-unit id="98b98154eca3533e16b81c5b08611d19949e8661" datatype="html">
6505 <source>Trending videos are those totalizing the greatest number of views during the last &lt;x id="INTERPOLATION" equiv-text="{{days}}"/&gt; days.</source>
6506 <context-group purpose="location">
6507 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6508 <context context-type="linenumber">1</context>
6509 </context-group>
6510 </trans-unit>
5911 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165" datatype="html"> 6511 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165" datatype="html">
5912 <source>Videos from your subscriptions</source> 6512 <source>Videos from your subscriptions</source>
5913 <context-group purpose="location"> 6513 <context-group purpose="location">
diff --git a/client/src/locale/source/server_en_US.xml b/client/src/locale/source/server_en_US.xml
index 8858a7a59..f5e125549 100644
--- a/client/src/locale/source/server_en_US.xml
+++ b/client/src/locale/source/server_en_US.xml
@@ -41,8 +41,8 @@
41 <source>Entertainment</source> 41 <source>Entertainment</source>
42 <target>undefined</target> 42 <target>undefined</target>
43 </trans-unit> 43 </trans-unit>
44 <trans-unit id="News"> 44 <trans-unit id="News &amp; Politics">
45 <source>News</source> 45 <source>News &amp; Politics</source>
46 <target>undefined</target> 46 <target>undefined</target>
47 </trans-unit> 47 </trans-unit>
48 <trans-unit id="How To"> 48 <trans-unit id="How To">
@@ -137,6 +137,22 @@
137 <source>Failed</source> 137 <source>Failed</source>
138 <target>undefined</target> 138 <target>undefined</target>
139 </trans-unit> 139 </trans-unit>
140 <trans-unit id="This video does not exist.">
141 <source>This video does not exist.</source>
142 <target>undefined</target>
143 </trans-unit>
144 <trans-unit id="We cannot fetch the video. Please try again later.">
145 <source>We cannot fetch the video. Please try again later.</source>
146 <target>undefined</target>
147 </trans-unit>
148 <trans-unit id="Sorry">
149 <source>Sorry</source>
150 <target>undefined</target>
151 </trans-unit>
152 <trans-unit id="This video is not available because the remote instance is not responding.">
153 <source>This video is not available because the remote instance is not responding.</source>
154 <target>undefined</target>
155 </trans-unit>
140 <trans-unit id="Misc"> 156 <trans-unit id="Misc">
141 <source>Misc</source> 157 <source>Misc</source>
142 <target>undefined</target> 158 <target>undefined</target>
diff --git a/client/src/locale/target/angular_ar_001.xml b/client/src/locale/target/angular_ar_001.xml
index c6c3338a7..978f69571 100644
--- a/client/src/locale/target/angular_ar_001.xml
+++ b/client/src/locale/target/angular_ar_001.xml
@@ -38,6 +38,27 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>أختر الشهر</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>أختر السنة</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source>
57 <target>»»</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context>
60 </context-group>
61 </trans-unit>
41 <trans-unit id="ngb.pagination.first-aria"> 62 <trans-unit id="ngb.pagination.first-aria">
42 <source>First</source> 63 <source>First</source>
43 <target>الأول</target> 64 <target>الأول</target>
@@ -45,6 +66,13 @@
45 <context context-type="linenumber">5</context> 66 <context context-type="linenumber">5</context>
46 </context-group> 67 </context-group>
47 </trans-unit> 68 </trans-unit>
69 <trans-unit id="ngb.pagination.previous">
70 <source>«</source>
71 <target>»</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context>
74 </context-group>
75 </trans-unit>
48 <trans-unit id="ngb.pagination.previous-aria"> 76 <trans-unit id="ngb.pagination.previous-aria">
49 <source>Previous</source> 77 <source>Previous</source>
50 <target>السابق</target> 78 <target>السابق</target>
@@ -52,6 +80,13 @@
52 <context context-type="linenumber">13</context> 80 <context context-type="linenumber">13</context>
53 </context-group> 81 </context-group>
54 </trans-unit> 82 </trans-unit>
83 <trans-unit id="ngb.pagination.next">
84 <source>»</source>
85 <target>«</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context>
88 </context-group>
89 </trans-unit>
55 <trans-unit id="ngb.pagination.next-aria"> 90 <trans-unit id="ngb.pagination.next-aria">
56 <source>Next</source> 91 <source>Next</source>
57 <target>التالي</target> 92 <target>التالي</target>
@@ -59,6 +94,13 @@
59 <context context-type="linenumber">27</context> 94 <context context-type="linenumber">27</context>
60 </context-group> 95 </context-group>
61 </trans-unit> 96 </trans-unit>
97 <trans-unit id="ngb.pagination.last">
98 <source>»»</source>
99 <target>««</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context>
102 </context-group>
103 </trans-unit>
62 <trans-unit id="ngb.pagination.last-aria"> 104 <trans-unit id="ngb.pagination.last-aria">
63 <source>Last</source> 105 <source>Last</source>
64 <target>الأخير</target> 106 <target>الأخير</target>
@@ -66,6 +108,13 @@
66 <context context-type="linenumber">34</context> 108 <context context-type="linenumber">34</context>
67 </context-group> 109 </context-group>
68 </trans-unit> 110 </trans-unit>
111 <trans-unit id="ngb.progressbar.value">
112 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
113 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
114 <context-group name="null">
115 <context context-type="linenumber">6</context>
116 </context-group>
117 </trans-unit>
69 <trans-unit id="ngb.timepicker.increment-hours"> 118 <trans-unit id="ngb.timepicker.increment-hours">
70 <source>Increment hours</source> 119 <source>Increment hours</source>
71 <target>زيادة الساعات</target> 120 <target>زيادة الساعات</target>
@@ -73,6 +122,13 @@
73 <context context-type="linenumber">9</context> 122 <context context-type="linenumber">9</context>
74 </context-group> 123 </context-group>
75 </trans-unit> 124 </trans-unit>
125 <trans-unit id="ngb.timepicker.HH">
126 <source>HH</source>
127 <target>ساعة</target>
128 <context-group name="null">
129 <context context-type="linenumber">12</context>
130 </context-group>
131 </trans-unit>
76 <trans-unit id="ngb.timepicker.hours"> 132 <trans-unit id="ngb.timepicker.hours">
77 <source>Hours</source> 133 <source>Hours</source>
78 <target>ساعات</target> 134 <target>ساعات</target>
@@ -94,6 +150,13 @@
94 <context context-type="linenumber">28</context> 150 <context context-type="linenumber">28</context>
95 </context-group> 151 </context-group>
96 </trans-unit> 152 </trans-unit>
153 <trans-unit id="ngb.timepicker.MM">
154 <source>MM</source>
155 <target>دقيقة</target>
156 <context-group name="null">
157 <context context-type="linenumber">31</context>
158 </context-group>
159 </trans-unit>
97 <trans-unit id="ngb.timepicker.minutes"> 160 <trans-unit id="ngb.timepicker.minutes">
98 <source>Minutes</source> 161 <source>Minutes</source>
99 <target>دقائق</target> 162 <target>دقائق</target>
@@ -115,6 +178,13 @@
115 <context context-type="linenumber">47</context> 178 <context context-type="linenumber">47</context>
116 </context-group> 179 </context-group>
117 </trans-unit> 180 </trans-unit>
181 <trans-unit id="ngb.timepicker.SS">
182 <source>SS</source>
183 <target>ثانية</target>
184 <context-group name="null">
185 <context context-type="linenumber">50</context>
186 </context-group>
187 </trans-unit>
118 <trans-unit id="ngb.timepicker.seconds"> 188 <trans-unit id="ngb.timepicker.seconds">
119 <source>Seconds</source> 189 <source>Seconds</source>
120 <target>ثواني</target> 190 <target>ثواني</target>
@@ -150,11 +220,32 @@
150 <context context-type="linenumber">10</context> 220 <context context-type="linenumber">10</context>
151 </context-group> 221 </context-group>
152 </trans-unit> 222 </trans-unit>
223 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
224 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source>
225 <target>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target>
226 <context-group name="null">
227 <context context-type="linenumber">11</context>
228 </context-group>
229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>غير Ù…Ùهرس</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>خاص</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
153 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
154 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
155 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> مشاهدة</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> مشاهدة</target>
156 <context-group name="null"> 247 <context-group name="null">
157 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
158 </context-group> 249 </context-group>
159 </trans-unit> 250 </trans-unit>
160 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -168,7 +259,7 @@
168 <source>Edit</source> 259 <source>Edit</source>
169 <target>تحرير</target> 260 <target>تحرير</target>
170 <context-group name="null"> 261 <context-group name="null">
171 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
172 </context-group> 263 </context-group>
173 </trans-unit> 264 </trans-unit>
174 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -192,11 +283,92 @@
192 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
193 </context-group> 284 </context-group>
194 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Subscribe
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 إلغاء الإشتراك
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>مستخدماً حساب ActivityPub</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>إشتراك بإستخدام حسابك علي <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>إشترك مستخدماً حسابك المحلي</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>إشترك مستخدما حسابك علي Mastodon</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
195 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 346 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
196 <source>Video quota</source> 347 <source>Video quota</source>
197 <target>حصة الÙيديو</target> 348 <target>حصة الÙيديو</target>
198 <context-group name="null"> 349 <context-group name="null">
199 <context context-type="linenumber">19</context> 350 <context context-type="linenumber">42</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
354 <source>Ban</source>
355 <target>حظر</target>
356 <context-group name="null">
357 <context context-type="linenumber">3</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
361 <source>Reason...</source>
362 <target>السبب…</target>
363 <context-group name="null">
364 <context context-type="linenumber">11</context>
365 </context-group>
366 </trans-unit>
367 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
368 <source>Ban this user</source>
369 <target>حظر هذا المستخدم</target>
370 <context-group name="null">
371 <context context-type="linenumber">25</context>
200 </context-group> 372 </context-group>
201 </trans-unit> 373 </trans-unit>
202 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 374 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
@@ -258,7 +430,7 @@
258 <source>Password</source> 430 <source>Password</source>
259 <target>الكلمة السرية</target> 431 <target>الكلمة السرية</target>
260 <context-group name="null"> 432 <context-group name="null">
261 <context context-type="linenumber">12</context> 433 <context context-type="linenumber">13</context>
262 </context-group> 434 </context-group>
263 </trans-unit> 435 </trans-unit>
264 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 436 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -272,7 +444,7 @@
272 <source>Login</source> 444 <source>Login</source>
273 <target>تسجيل الدخول</target> 445 <target>تسجيل الدخول</target>
274 <context-group name="null"> 446 <context-group name="null">
275 <context context-type="linenumber">38</context> 447 <context context-type="linenumber">36</context>
276 </context-group> 448 </context-group>
277 </trans-unit> 449 </trans-unit>
278 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 450 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -300,7 +472,7 @@
300 <source>Send me an email to reset my password</source> 472 <source>Send me an email to reset my password</source>
301 <target>أرسل لي رسالة لإعادة تعيين كلمتي السرية</target> 473 <target>أرسل لي رسالة لإعادة تعيين كلمتي السرية</target>
302 <context-group name="null"> 474 <context-group name="null">
303 <context context-type="linenumber">75</context> 475 <context context-type="linenumber">80</context>
304 </context-group> 476 </context-group>
305 </trans-unit> 477 </trans-unit>
306 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 478 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -353,28 +525,21 @@
353 <source>Example: jane_doe</source> 525 <source>Example: jane_doe</source>
354 <target>مثال: jane_doe</target> 526 <target>مثال: jane_doe</target>
355 <context-group name="null"> 527 <context-group name="null">
356 <context context-type="linenumber">16</context> 528 <context context-type="linenumber">17</context>
357 </context-group>
358 </trans-unit>
359 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
360 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
361 <target>قرأت Ùˆ واÙقت على&lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;شروط&lt;/a&gt; مثيل الخادوم</target>
362 <context-group name="null">
363 <context context-type="linenumber">54</context>
364 </context-group> 529 </context-group>
365 </trans-unit> 530 </trans-unit>
366 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 531 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
367 <source>Signup</source> 532 <source>Signup</source>
368 <target>سجل</target> 533 <target>سجل</target>
369 <context-group name="null"> 534 <context-group name="null">
370 <context context-type="linenumber">88</context> 535 <context context-type="linenumber">78</context>
371 </context-group> 536 </context-group>
372 </trans-unit> 537 </trans-unit>
373 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 538 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
374 <source>Features found on this instance</source> 539 <source>Features found on this instance</source>
375 <target>مميزات مثيل الخادوم</target> 540 <target>مميزات مثيل الخادوم</target>
376 <context-group name="null"> 541 <context-group name="null">
377 <context context-type="linenumber">66</context> 542 <context context-type="linenumber">67</context>
378 </context-group> 543 </context-group>
379 </trans-unit> 544 </trans-unit>
380 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 545 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -384,41 +549,34 @@
384 <context context-type="linenumber">5</context> 549 <context context-type="linenumber">5</context>
385 </context-group> 550 </context-group>
386 </trans-unit> 551 </trans-unit>
387 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
388 <source>Filters</source>
389 <target>عوامل التصÙية</target>
390 <context-group name="null">
391 <context context-type="linenumber">16</context>
392 </context-group>
393 </trans-unit>
394 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 552 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
395 <source> 553 <source>
396 No results found 554 No results found
397 </source> 555 </source>
398 <target>لم يتم العثور على أية نتيجة</target> 556 <target>لم يتم العثور على أية نتيجة</target>
399 <context-group name="null"> 557 <context-group name="null">
400 <context context-type="linenumber">25</context> 558 <context context-type="linenumber">28</context>
401 </context-group> 559 </context-group>
402 </trans-unit> 560 </trans-unit>
403 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 561 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
404 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 562 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
405 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> مشترك</target> 563 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> مشترك</target>
406 <context-group name="null"> 564 <context-group name="null">
407 <context context-type="linenumber">41</context> 565 <context context-type="linenumber">44</context>
408 </context-group> 566 </context-group>
409 </trans-unit> 567 </trans-unit>
410 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 568 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
411 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 569 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
412 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> مشاهدة</target> 570 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> مشاهدة</target>
413 <context-group name="null"> 571 <context-group name="null">
414 <context context-type="linenumber">52</context> 572 <context context-type="linenumber">55</context>
415 </context-group> 573 </context-group>
416 </trans-unit> 574 </trans-unit>
417 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 575 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
418 <source>Change the language</source> 576 <source>Change the language</source>
419 <target>تغيير اللغة</target> 577 <target>تغيير اللغة</target>
420 <context-group name="null"> 578 <context-group name="null">
421 <context context-type="linenumber">88</context> 579 <context context-type="linenumber">86</context>
422 </context-group> 580 </context-group>
423 </trans-unit> 581 </trans-unit>
424 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 582 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -427,7 +585,7 @@
427 </source> 585 </source>
428 <target>صÙحتي العمومية</target> 586 <target>صÙحتي العمومية</target>
429 <context-group name="null"> 587 <context-group name="null">
430 <context context-type="linenumber">18</context> 588 <context context-type="linenumber">16</context>
431 </context-group> 589 </context-group>
432 </trans-unit> 590 </trans-unit>
433 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 591 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -436,7 +594,7 @@
436 </source> 594 </source>
437 <target>حسابي</target> 595 <target>حسابي</target>
438 <context-group name="null"> 596 <context-group name="null">
439 <context context-type="linenumber">22</context> 597 <context context-type="linenumber">20</context>
440 </context-group> 598 </context-group>
441 </trans-unit> 599 </trans-unit>
442 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 600 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -445,7 +603,7 @@
445 </source> 603 </source>
446 <target>Ùيديوهاتي</target> 604 <target>Ùيديوهاتي</target>
447 <context-group name="null"> 605 <context-group name="null">
448 <context context-type="linenumber">26</context> 606 <context context-type="linenumber">24</context>
449 </context-group> 607 </context-group>
450 </trans-unit> 608 </trans-unit>
451 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 609 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -454,14 +612,14 @@
454 </source> 612 </source>
455 <target>الخروج</target> 613 <target>الخروج</target>
456 <context-group name="null"> 614 <context-group name="null">
457 <context context-type="linenumber">30</context> 615 <context context-type="linenumber">28</context>
458 </context-group> 616 </context-group>
459 </trans-unit> 617 </trans-unit>
460 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 618 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
461 <source>Create an account</source> 619 <source>Create an account</source>
462 <target>إنشاء حساب</target> 620 <target>إنشاء حساب</target>
463 <context-group name="null"> 621 <context-group name="null">
464 <context context-type="linenumber">39</context> 622 <context context-type="linenumber">37</context>
465 </context-group> 623 </context-group>
466 </trans-unit> 624 </trans-unit>
467 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 625 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -475,49 +633,49 @@
475 <source>Subscriptions</source> 633 <source>Subscriptions</source>
476 <target>الإشتراكات</target> 634 <target>الإشتراكات</target>
477 <context-group name="null"> 635 <context-group name="null">
478 <context context-type="linenumber">47</context> 636 <context context-type="linenumber">45</context>
479 </context-group> 637 </context-group>
480 </trans-unit> 638 </trans-unit>
481 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 639 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
482 <source>Overview</source> 640 <source>Overview</source>
483 <target>نظرة شاملة</target> 641 <target>نظرة شاملة</target>
484 <context-group name="null"> 642 <context-group name="null">
485 <context context-type="linenumber">52</context> 643 <context context-type="linenumber">50</context>
486 </context-group> 644 </context-group>
487 </trans-unit> 645 </trans-unit>
488 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 646 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
489 <source>Trending</source> 647 <source>Trending</source>
490 <target>الشائعة</target> 648 <target>الشائعة</target>
491 <context-group name="null"> 649 <context-group name="null">
492 <context context-type="linenumber">57</context> 650 <context context-type="linenumber">55</context>
493 </context-group> 651 </context-group>
494 </trans-unit> 652 </trans-unit>
495 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 653 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
496 <source>Recently added</source> 654 <source>Recently added</source>
497 <target>التي تم إضاÙتها حديثًا</target> 655 <target>التي تم إضاÙتها حديثًا</target>
498 <context-group name="null"> 656 <context-group name="null">
499 <context context-type="linenumber">62</context> 657 <context context-type="linenumber">60</context>
500 </context-group> 658 </context-group>
501 </trans-unit> 659 </trans-unit>
502 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 660 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
503 <source>Local</source> 661 <source>Local</source>
504 <target>المحلية</target> 662 <target>المحلية</target>
505 <context-group name="null"> 663 <context-group name="null">
506 <context context-type="linenumber">67</context> 664 <context context-type="linenumber">65</context>
507 </context-group> 665 </context-group>
508 </trans-unit> 666 </trans-unit>
509 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 667 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
510 <source>More</source> 668 <source>More</source>
511 <target>المزيد</target> 669 <target>المزيد</target>
512 <context-group name="null"> 670 <context-group name="null">
513 <context context-type="linenumber">72</context> 671 <context context-type="linenumber">70</context>
514 </context-group> 672 </context-group>
515 </trans-unit> 673 </trans-unit>
516 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 674 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
517 <source>Administration</source> 675 <source>Administration</source>
518 <target>الإدارة</target> 676 <target>الإدارة</target>
519 <context-group name="null"> 677 <context-group name="null">
520 <context context-type="linenumber">76</context> 678 <context context-type="linenumber">74</context>
521 </context-group> 679 </context-group>
522 </trans-unit> 680 </trans-unit>
523 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 681 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -531,7 +689,7 @@
531 <source>Toggle dark interface</source> 689 <source>Toggle dark interface</source>
532 <target>الإنتقال إلى الواجهة الداكنة</target> 690 <target>الإنتقال إلى الواجهة الداكنة</target>
533 <context-group name="null"> 691 <context-group name="null">
534 <context context-type="linenumber">94</context> 692 <context context-type="linenumber">92</context>
535 </context-group> 693 </context-group>
536 </trans-unit> 694 </trans-unit>
537 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 695 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -636,14 +794,14 @@
636 <source>No results.</source> 794 <source>No results.</source>
637 <target>لا نتائج</target> 795 <target>لا نتائج</target>
638 <context-group name="null"> 796 <context-group name="null">
639 <context context-type="linenumber">7</context> 797 <context context-type="linenumber">20</context>
640 </context-group> 798 </context-group>
641 </trans-unit> 799 </trans-unit>
642 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 800 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
643 <source>Instance</source> 801 <source>Instance</source>
644 <target>مثيل الخادوم</target> 802 <target>مثيل الخادوم</target>
645 <context-group name="null"> 803 <context-group name="null">
646 <context context-type="linenumber">8</context> 804 <context context-type="linenumber">12</context>
647 </context-group> 805 </context-group>
648 </trans-unit> 806 </trans-unit>
649 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 807 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -653,15 +811,20 @@
653 <context context-type="linenumber">7</context> 811 <context context-type="linenumber">7</context>
654 </context-group> 812 </context-group>
655 </trans-unit> 813 </trans-unit>
656 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 814 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
657 <source> 815 <source>
658 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 816 Cancel
659</source> 817 </source>
660 <target> 818 <target>إلغاء</target>
661 حول مثيل الخدوم <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
662</target>
663 <context-group name="null"> 819 <context-group name="null">
664 <context context-type="linenumber">1</context> 820 <context context-type="linenumber">26</context>
821 </context-group>
822 </trans-unit>
823 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
824 <source>Submit</source>
825 <target>إرسال</target>
826 <context-group name="null">
827 <context context-type="linenumber">31</context>
665 </context-group> 828 </context-group>
666 </trans-unit> 829 </trans-unit>
667 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 830 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -675,44 +838,14 @@
675 <source>Terms</source> 838 <source>Terms</source>
676 <target>الشروط</target> 839 <target>الشروط</target>
677 <context-group name="null"> 840 <context-group name="null">
678 <context context-type="linenumber">44</context> 841 <context context-type="linenumber">39</context>
679 </context-group> 842 </context-group>
680 </trans-unit> 843 </trans-unit>
681 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 844 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
682 <source>User registration is allowed and</source> 845 <source>User registration is allowed and</source>
683 <target>التسجيل مسموح و</target> 846 <target>التسجيل مسموح و</target>
684 <context-group name="null"> 847 <context-group name="null">
685 <context context-type="linenumber">25</context> 848 <context context-type="linenumber">29</context>
686 </context-group>
687 </trans-unit>
688 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
689 <source>
690 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
691 </source>
692 <target>
693مثيل الخادوم هذا يوÙر مساحة <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> Ù„Ùيديوهات المستخدمين.</target>
694 <context-group name="null">
695 <context context-type="linenumber">27</context>
696 </context-group>
697 </trans-unit>
698 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
699 <source>
700 this instance provides unlimited space for the videos of its users.
701 </source>
702 <target>
703مثيل الخادوم هذا يوÙر مساحة غير محددة Ù„Ùيديوهات المستخدمين.</target>
704 <context-group name="null">
705 <context context-type="linenumber">31</context>
706 </context-group>
707 </trans-unit>
708 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
709 <source>
710 User registration is currently not allowed.
711 </source>
712 <target>
713التسجيل غير مسموح حاليا.</target>
714 <context-group name="null">
715 <context context-type="linenumber">36</context>
716 </context-group> 849 </context-group>
717 </trans-unit> 850 </trans-unit>
718 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 851 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -725,8 +858,7 @@
725 </context-group> 858 </context-group>
726 </trans-unit> 859 </trans-unit>
727 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf"> 860 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf">
728 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source> 861 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source><target>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</target><context-group name="null">
729 <context-group name="null">
730 <context context-type="linenumber">6</context> 862 <context context-type="linenumber">6</context>
731 </context-group> 863 </context-group>
732 </trans-unit> 864 </trans-unit>
@@ -821,18 +953,46 @@
821 <context context-type="linenumber">94</context> 953 <context context-type="linenumber">94</context>
822 </context-group> 954 </context-group>
823 </trans-unit> 955 </trans-unit>
956 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
957 <source>Banned</source>
958 <target>تم حظره</target>
959 <context-group name="null">
960 <context context-type="linenumber">12</context>
961 </context-group>
962 </trans-unit>
963 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
964 <source>Muted</source>
965 <target>تم كتمه</target>
966 <context-group name="null">
967 <context context-type="linenumber">13</context>
968 </context-group>
969 </trans-unit>
970 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
971 <source>Muted by your instance</source>
972 <target>تم كتمه عبر مثيل خادومك</target>
973 <context-group name="null">
974 <context context-type="linenumber">14</context>
975 </context-group>
976 </trans-unit>
977 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
978 <source>Instance muted</source>
979 <target>مثيل الخادوم مكتوم</target>
980 <context-group name="null">
981 <context context-type="linenumber">15</context>
982 </context-group>
983 </trans-unit>
824 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 984 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
825 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 985 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
826 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> مشترك</target> 986 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> مشترك</target>
827 <context-group name="null"> 987 <context-group name="null">
828 <context context-type="linenumber">12</context> 988 <context context-type="linenumber">24</context>
829 </context-group> 989 </context-group>
830 </trans-unit> 990 </trans-unit>
831 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 991 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
832 <source>Video channels</source> 992 <source>Video channels</source>
833 <target>قنوات الÙيديو</target> 993 <target>قنوات الÙيديو</target>
834 <context-group name="null"> 994 <context-group name="null">
835 <context context-type="linenumber">19</context> 995 <context context-type="linenumber">31</context>
836 </context-group> 996 </context-group>
837 </trans-unit> 997 </trans-unit>
838 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 998 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -867,42 +1027,42 @@
867 <source>Short description</source> 1027 <source>Short description</source>
868 <target>الوص٠القصير</target> 1028 <target>الوص٠القصير</target>
869 <context-group name="null"> 1029 <context-group name="null">
870 <context context-type="linenumber">22</context> 1030 <context context-type="linenumber">21</context>
871 </context-group> 1031 </context-group>
872 </trans-unit> 1032 </trans-unit>
873 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1033 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
874 <source>Videos Overview</source> 1034 <source>Videos Overview</source>
875 <target>نظرة شاملة عن الÙيديوهات</target> 1035 <target>نظرة شاملة عن الÙيديوهات</target>
876 <context-group name="null"> 1036 <context-group name="null">
877 <context context-type="linenumber">58</context> 1037 <context context-type="linenumber">51</context>
878 </context-group> 1038 </context-group>
879 </trans-unit> 1039 </trans-unit>
880 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1040 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
881 <source>Videos Trending</source> 1041 <source>Videos Trending</source>
882 <target>الÙيديوهات الشائعة</target> 1042 <target>الÙيديوهات الشائعة</target>
883 <context-group name="null"> 1043 <context-group name="null">
884 <context context-type="linenumber">59</context> 1044 <context context-type="linenumber">52</context>
885 </context-group> 1045 </context-group>
886 </trans-unit> 1046 </trans-unit>
887 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1047 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
888 <source>Videos Recently Added</source> 1048 <source>Videos Recently Added</source>
889 <target>الÙيديوهات المÙضاÙØ© حديثًا</target> 1049 <target>الÙيديوهات المÙضاÙØ© حديثًا</target>
890 <context-group name="null"> 1050 <context-group name="null">
891 <context context-type="linenumber">60</context> 1051 <context context-type="linenumber">53</context>
892 </context-group> 1052 </context-group>
893 </trans-unit> 1053 </trans-unit>
894 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1054 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
895 <source>Local videos</source> 1055 <source>Local videos</source>
896 <target>الÙيديوهات المحلية</target> 1056 <target>الÙيديوهات المحلية</target>
897 <context-group name="null"> 1057 <context-group name="null">
898 <context context-type="linenumber">61</context> 1058 <context context-type="linenumber">54</context>
899 </context-group> 1059 </context-group>
900 </trans-unit> 1060 </trans-unit>
901 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1061 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
902 <source>Policy on videos containing sensitive content</source> 1062 <source>Policy on videos containing sensitive content</source>
903 <target>سياسة الÙيديوهات التي تحتوي على محتوى حساس</target> 1063 <target>سياسة الÙيديوهات التي تحتوي على محتوى حساس</target>
904 <context-group name="null"> 1064 <context-group name="null">
905 <context context-type="linenumber">70</context> 1065 <context context-type="linenumber">61</context>
906 </context-group> 1066 </context-group>
907 </trans-unit> 1067 </trans-unit>
908 <trans-unit id="5e155c34fb3ed8159bf0a486a366cfbc6874f9fe"> 1068 <trans-unit id="5e155c34fb3ed8159bf0a486a366cfbc6874f9fe">
@@ -923,21 +1083,42 @@
923 <source>Signup enabled</source> 1083 <source>Signup enabled</source>
924 <target>التسجيل Ù…ÙÙعل</target> 1084 <target>التسجيل Ù…ÙÙعل</target>
925 <context-group name="null"> 1085 <context-group name="null">
926 <context context-type="linenumber">92</context> 1086 <context context-type="linenumber">84</context>
927 </context-group> 1087 </context-group>
928 </trans-unit> 1088 </trans-unit>
929 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1089 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
930 <source>Signup requires email verification</source> 1090 <source>Signup requires email verification</source>
931 <target>يتطلب التسجيل رسالة تأكيد</target> 1091 <target>يتطلب التسجيل رسالة تأكيد</target>
932 <context-group name="null"> 1092 <context-group name="null">
933 <context context-type="linenumber">97</context> 1093 <context context-type="linenumber">91</context>
934 </context-group> 1094 </context-group>
935 </trans-unit> 1095 </trans-unit>
936 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1096 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
937 <source>Signup limit</source> 1097 <source>Signup limit</source>
938 <target>حد التسجيل</target> 1098 <target>حد التسجيل</target>
939 <context-group name="null"> 1099 <context-group name="null">
940 <context context-type="linenumber">101</context> 1100 <context context-type="linenumber">96</context>
1101 </context-group>
1102 </trans-unit>
1103 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1104 <source>Users</source>
1105 <target>المستخدÙمون</target>
1106 <context-group name="null">
1107 <context context-type="linenumber">105</context>
1108 </context-group>
1109 </trans-unit>
1110 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1111 <source>User default video quota</source>
1112 <target>حصة الÙيديو الاÙتراضية للمستخدم</target>
1113 <context-group name="null">
1114 <context context-type="linenumber">109</context>
1115 </context-group>
1116 </trans-unit>
1117 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1118 <source>User default daily upload limit</source>
1119 <target>حد الرÙع الإÙتراضي للمستخدÙÙ…</target>
1120 <context-group name="null">
1121 <context context-type="linenumber">121</context>
941 </context-group> 1122 </context-group>
942 </trans-unit> 1123 </trans-unit>
943 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1124 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -947,46 +1128,18 @@
947 <context context-type="linenumber">42</context> 1128 <context context-type="linenumber">42</context>
948 </context-group> 1129 </context-group>
949 </trans-unit> 1130 </trans-unit>
950 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce">
951 <source>Video import with HTTP enabled</source>
952 <target>إستيراد المل٠باستخدام HTTP Ù…Ùعل</target>
953 <context-group name="null">
954 <context context-type="linenumber">115</context>
955 </context-group>
956 </trans-unit>
957 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1131 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
958 <source>Administrator</source> 1132 <source>Administrator</source>
959 <target>المدير</target> 1133 <target>المدير</target>
960 <context-group name="null"> 1134 <context-group name="null">
961 <context context-type="linenumber">123</context> 1135 <context context-type="linenumber">155</context>
962 </context-group> 1136 </context-group>
963 </trans-unit> 1137 </trans-unit>
964 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1138 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
965 <source>Admin email</source> 1139 <source>Admin email</source>
966 <target>البريد الإلكتروني للمدير</target> 1140 <target>البريد الإلكتروني للمدير</target>
967 <context-group name="null"> 1141 <context-group name="null">
968 <context context-type="linenumber">126</context> 1142 <context context-type="linenumber">158</context>
969 </context-group>
970 </trans-unit>
971 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
972 <source>Users</source>
973 <target>المستخدÙمون</target>
974 <context-group name="null">
975 <context context-type="linenumber">136</context>
976 </context-group>
977 </trans-unit>
978 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
979 <source>User default video quota</source>
980 <target>حصة الÙيديو الاÙتراضية للمستخدم</target>
981 <context-group name="null">
982 <context context-type="linenumber">139</context>
983 </context-group>
984 </trans-unit>
985 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
986 <source>User default daily upload limit</source>
987 <target>حد الرÙع الإÙتراضي للمستخدÙÙ…</target>
988 <context-group name="null">
989 <context context-type="linenumber">153</context>
990 </context-group> 1143 </context-group>
991 </trans-unit> 1144 </trans-unit>
992 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1145 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1000,42 +1153,42 @@
1000 <source>Twitter</source> 1153 <source>Twitter</source>
1001 <target>تويتر</target> 1154 <target>تويتر</target>
1002 <context-group name="null"> 1155 <context-group name="null">
1003 <context context-type="linenumber">170</context> 1156 <context context-type="linenumber">178</context>
1004 </context-group> 1157 </context-group>
1005 </trans-unit> 1158 </trans-unit>
1006 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1159 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1007 <source>Your Twitter username</source> 1160 <source>Your Twitter username</source>
1008 <target>اسم المستخدÙÙ… الخاص بك على تويتر</target> 1161 <target>اسم المستخدÙÙ… الخاص بك على تويتر</target>
1009 <context-group name="null"> 1162 <context-group name="null">
1010 <context context-type="linenumber">173</context> 1163 <context context-type="linenumber">184</context>
1011 </context-group> 1164 </context-group>
1012 </trans-unit> 1165 </trans-unit>
1013 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1166 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1014 <source>Services</source> 1167 <source>Services</source>
1015 <target>الخدمات</target> 1168 <target>الخدمات</target>
1016 <context-group name="null"> 1169 <context-group name="null">
1017 <context context-type="linenumber">168</context> 1170 <context context-type="linenumber">176</context>
1018 </context-group> 1171 </context-group>
1019 </trans-unit> 1172 </trans-unit>
1020 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1173 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1021 <source>Customizations</source> 1174 <source>Customizations</source>
1022 <target>التخصيصات</target> 1175 <target>التخصيصات</target>
1023 <context-group name="null"> 1176 <context-group name="null">
1024 <context context-type="linenumber">264</context> 1177 <context context-type="linenumber">289</context>
1025 </context-group> 1178 </context-group>
1026 </trans-unit> 1179 </trans-unit>
1027 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1180 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1028 <source>JavaScript</source> 1181 <source>JavaScript</source>
1029 <target>الجاÙا سكريبت</target> 1182 <target>الجاÙا سكريبت</target>
1030 <context-group name="null"> 1183 <context-group name="null">
1031 <context context-type="linenumber">267</context> 1184 <context context-type="linenumber">294</context>
1032 </context-group> 1185 </context-group>
1033 </trans-unit> 1186 </trans-unit>
1034 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1187 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1035 <source>Advanced configuration</source> 1188 <source>Advanced configuration</source>
1036 <target>الإعدادات المتقدمة</target> 1189 <target>الإعدادات المتقدمة</target>
1037 <context-group name="null"> 1190 <context-group name="null">
1038 <context context-type="linenumber">197</context> 1191 <context context-type="linenumber">212</context>
1039 </context-group> 1192 </context-group>
1040 </trans-unit> 1193 </trans-unit>
1041 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1194 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1065,6 +1218,15 @@
1065 <context context-type="linenumber">11</context> 1218 <context context-type="linenumber">11</context>
1066 </context-group> 1219 </context-group>
1067 </trans-unit> 1220 </trans-unit>
1221 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1222 <source>
1223 Jobs
1224 </source>
1225 <target>الإجراءات</target>
1226 <context-group name="null">
1227 <context context-type="linenumber">15</context>
1228 </context-group>
1229 </trans-unit>
1068 <trans-unit id="9c6ce37623b626a102002901ca12c37e7a3a7f13"> 1230 <trans-unit id="9c6ce37623b626a102002901ca12c37e7a3a7f13">
1069 <source> 1231 <source>
1070 Configuration 1232 Configuration
@@ -1074,11 +1236,18 @@
1074 <context context-type="linenumber">19</context> 1236 <context context-type="linenumber">19</context>
1075 </context-group> 1237 </context-group>
1076 </trans-unit> 1238 </trans-unit>
1239 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1240 <source>Filter...</source>
1241 <target>تصÙية...</target>
1242 <context-group name="null">
1243 <context context-type="linenumber">27</context>
1244 </context-group>
1245 </trans-unit>
1077 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1246 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1078 <source>Host</source> 1247 <source>Host</source>
1079 <target>المضيÙ</target> 1248 <target>المضيÙ</target>
1080 <context-group name="null"> 1249 <context-group name="null">
1081 <context context-type="linenumber">8</context> 1250 <context context-type="linenumber">19</context>
1082 </context-group> 1251 </context-group>
1083 </trans-unit> 1252 </trans-unit>
1084 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1253 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1088,6 +1257,20 @@
1088 <context context-type="linenumber">10</context> 1257 <context context-type="linenumber">10</context>
1089 </context-group> 1258 </context-group>
1090 </trans-unit> 1259 </trans-unit>
1260 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1261 <source>Accepted</source>
1262 <target>تم القبول</target>
1263 <context-group name="null">
1264 <context context-type="linenumber">32</context>
1265 </context-group>
1266 </trans-unit>
1267 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1268 <source>Pending</source>
1269 <target>معلق</target>
1270 <context-group name="null">
1271 <context context-type="linenumber">33</context>
1272 </context-group>
1273 </trans-unit>
1091 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1274 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1092 <source>Manage follows</source> 1275 <source>Manage follows</source>
1093 <target>إدارة المتابÙعون</target> 1276 <target>إدارة المتابÙعون</target>
@@ -1116,6 +1299,13 @@
1116 <context context-type="linenumber">9</context> 1299 <context context-type="linenumber">9</context>
1117 </context-group> 1300 </context-group>
1118 </trans-unit> 1301 </trans-unit>
1302 <trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f">
1303 <source>Jobs list</source>
1304 <target>قائمة الإجراءات</target>
1305 <context-group name="null">
1306 <context context-type="linenumber">2</context>
1307 </context-group>
1308 </trans-unit>
1119 <trans-unit id="f61c6867295f3b53d23557021f2f4e0aa1d0b8fc"> 1309 <trans-unit id="f61c6867295f3b53d23557021f2f4e0aa1d0b8fc">
1120 <source>Type</source> 1310 <source>Type</source>
1121 <target>النوع</target> 1311 <target>النوع</target>
@@ -1148,7 +1338,7 @@
1148 <source>Role</source> 1338 <source>Role</source>
1149 <target>الدور</target> 1339 <target>الدور</target>
1150 <context-group name="null"> 1340 <context-group name="null">
1151 <context context-type="linenumber">20</context> 1341 <context context-type="linenumber">43</context>
1152 </context-group> 1342 </context-group>
1153 </trans-unit> 1343 </trans-unit>
1154 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496"> 1344 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
@@ -1158,13 +1348,6 @@
1158 <context context-type="linenumber">72</context> 1348 <context context-type="linenumber">72</context>
1159 </context-group> 1349 </context-group>
1160 </trans-unit> 1350 </trans-unit>
1161 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1162 <source>Reason...</source>
1163 <target>السبب…</target>
1164 <context-group name="null">
1165 <context context-type="linenumber">11</context>
1166 </context-group>
1167 </trans-unit>
1168 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1351 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1169 <source>Users list</source> 1352 <source>Users list</source>
1170 <target>قائمة المستخدÙمون</target> 1353 <target>قائمة المستخدÙمون</target>
@@ -1172,11 +1355,18 @@
1172 <context context-type="linenumber">2</context> 1355 <context context-type="linenumber">2</context>
1173 </context-group> 1356 </context-group>
1174 </trans-unit> 1357 </trans-unit>
1175 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1358 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1176 <source>Actions</source> 1359 <source>Go to the account page</source>
1177 <target>الإجراءات</target> 1360 <target>الإنتقال إلى صÙحة الحساب</target>
1178 <context-group name="null"> 1361 <context-group name="null">
1179 <context context-type="linenumber">33</context> 1362 <context context-type="linenumber">133</context>
1363 </context-group>
1364 </trans-unit>
1365 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1366 <source>Ban reason:</source>
1367 <target>سبب الحظر:</target>
1368 <context-group name="null">
1369 <context context-type="linenumber">95</context>
1180 </context-group> 1370 </context-group>
1181 </trans-unit> 1371 </trans-unit>
1182 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1372 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1221,6 +1411,13 @@
1221 <context context-type="linenumber">33</context> 1411 <context context-type="linenumber">33</context>
1222 </context-group> 1412 </context-group>
1223 </trans-unit> 1413 </trans-unit>
1414 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1415 <source>Actions</source>
1416 <target>الإجراءات</target>
1417 <context-group name="null">
1418 <context context-type="linenumber">35</context>
1419 </context-group>
1420 </trans-unit>
1224 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1421 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1225 <source>Reason:</source> 1422 <source>Reason:</source>
1226 <target>السبب:</target> 1423 <target>السبب:</target>
@@ -1246,7 +1443,7 @@
1246 <source>Blacklist reason:</source> 1443 <source>Blacklist reason:</source>
1247 <target>سبب الحجب:</target> 1444 <target>سبب الحجب:</target>
1248 <context-group name="null"> 1445 <context-group name="null">
1249 <context context-type="linenumber">41</context> 1446 <context context-type="linenumber">43</context>
1250 </context-group> 1447 </context-group>
1251 </trans-unit> 1448 </trans-unit>
1252 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1449 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1263,46 +1460,18 @@
1263 <context context-type="linenumber">7</context> 1460 <context context-type="linenumber">7</context>
1264 </context-group> 1461 </context-group>
1265 </trans-unit> 1462 </trans-unit>
1266 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 1463 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1267 <source>My settings</source> 1464 <source>Account</source>
1268 <target>إعداداتي</target> 1465 <target>الحساب</target>
1269 <context-group name="null">
1270 <context context-type="linenumber">3</context>
1271 </context-group>
1272 </trans-unit>
1273 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1274 <source>My library</source>
1275 <target>مكتبتي</target>
1276 <context-group name="null">
1277 <context context-type="linenumber">7</context>
1278 </context-group>
1279 </trans-unit>
1280 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1281 <source>My channels</source>
1282 <target>قنواتي</target>
1283 <context-group name="null"> 1466 <context-group name="null">
1284 <context context-type="linenumber">12</context> 1467 <context context-type="linenumber">12</context>
1285 </context-group> 1468 </context-group>
1286 </trans-unit> 1469 </trans-unit>
1287 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 1470 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1288 <source>My videos</source> 1471 <source>Unmute</source>
1289 <target>Ùيديوهاتي</target> 1472 <target>إلغاء الكتم</target>
1290 <context-group name="null">
1291 <context context-type="linenumber">14</context>
1292 </context-group>
1293 </trans-unit>
1294 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1295 <source>My subscriptions</source>
1296 <target>اشتراكاتي</target>
1297 <context-group name="null">
1298 <context context-type="linenumber">16</context>
1299 </context-group>
1300 </trans-unit>
1301 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1302 <source>My imports</source>
1303 <target>وارداتي</target>
1304 <context-group name="null"> 1473 <context-group name="null">
1305 <context context-type="linenumber">18</context> 1474 <context context-type="linenumber">23</context>
1306 </context-group> 1475 </context-group>
1307 </trans-unit> 1476 </trans-unit>
1308 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1477 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1316,21 +1485,21 @@
1316 <source>Profile</source> 1485 <source>Profile</source>
1317 <target>المل٠الشخصي</target> 1486 <target>المل٠الشخصي</target>
1318 <context-group name="null"> 1487 <context-group name="null">
1319 <context context-type="linenumber">8</context> 1488 <context context-type="linenumber">7</context>
1320 </context-group> 1489 </context-group>
1321 </trans-unit> 1490 </trans-unit>
1322 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1491 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1323 <source>Video settings</source> 1492 <source>Video settings</source>
1324 <target>إعدادات الÙيديو</target> 1493 <target>إعدادات الÙيديو</target>
1325 <context-group name="null"> 1494 <context-group name="null">
1326 <context context-type="linenumber">15</context> 1495 <context context-type="linenumber">16</context>
1327 </context-group> 1496 </context-group>
1328 </trans-unit> 1497 </trans-unit>
1329 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1498 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1330 <source>Danger zone</source> 1499 <source>Danger zone</source>
1331 <target>منطقة الخطر</target> 1500 <target>منطقة الخطر</target>
1332 <context-group name="null"> 1501 <context-group name="null">
1333 <context context-type="linenumber">18</context> 1502 <context context-type="linenumber">19</context>
1334 </context-group> 1503 </context-group>
1335 </trans-unit> 1504 </trans-unit>
1336 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1505 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1356,13 +1525,6 @@
1356 <context context-type="linenumber">35</context> 1525 <context context-type="linenumber">35</context>
1357 </context-group> 1526 </context-group>
1358 </trans-unit> 1527 </trans-unit>
1359 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1360 <source>Submit</source>
1361 <target>إرسال</target>
1362 <context-group name="null">
1363 <context context-type="linenumber">24</context>
1364 </context-group>
1365 </trans-unit>
1366 <trans-unit id="4a806761798181e907e28ed1af053d466526800d"> 1528 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
1367 <source>Blacklisted</source> 1529 <source>Blacklisted</source>
1368 <target>تم حجبه</target> 1530 <target>تم حجبه</target>
@@ -1421,6 +1583,13 @@
1421 <context context-type="linenumber">8</context> 1583 <context context-type="linenumber">8</context>
1422 </context-group> 1584 </context-group>
1423 </trans-unit> 1585 </trans-unit>
1586 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
1587 <source>Select the target channel</source>
1588 <target>اختيار القناة الهدÙ</target>
1589 <context-group name="null">
1590 <context context-type="linenumber">9</context>
1591 </context-group>
1592 </trans-unit>
1424 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1"> 1593 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
1425 <source>Status</source> 1594 <source>Status</source>
1426 <target>الحالة</target> 1595 <target>الحالة</target>
@@ -1442,6 +1611,13 @@
1442 <context context-type="linenumber">47</context> 1611 <context context-type="linenumber">47</context>
1443 </context-group> 1612 </context-group>
1444 </trans-unit> 1613 </trans-unit>
1614 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
1615 <source>Muted instances</source>
1616 <target>مثيلات الخوادم المكتومة</target>
1617 <context-group name="null">
1618 <context context-type="linenumber">2</context>
1619 </context-group>
1620 </trans-unit>
1445 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 1621 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
1446 <source>Change password</source> 1622 <source>Change password</source>
1447 <target>تغيير الكلمة السرية</target> 1623 <target>تغيير الكلمة السرية</target>
@@ -1449,6 +1625,13 @@
1449 <context context-type="linenumber">30</context> 1625 <context context-type="linenumber">30</context>
1450 </context-group> 1626 </context-group>
1451 </trans-unit> 1627 </trans-unit>
1628 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
1629 <source>Current password</source>
1630 <target>الكلمة السرية الحالية</target>
1631 <context-group name="null">
1632 <context context-type="linenumber">7</context>
1633 </context-group>
1634 </trans-unit>
1452 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 1635 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
1453 <source>New password</source> 1636 <source>New password</source>
1454 <target>الكلمة السرية الجديدة</target> 1637 <target>الكلمة السرية الجديدة</target>
@@ -1467,14 +1650,14 @@
1467 <source>Automatically plays video</source> 1650 <source>Automatically plays video</source>
1468 <target>التشغيل التلقائي للÙيديو</target> 1651 <target>التشغيل التلقائي للÙيديو</target>
1469 <context-group name="null"> 1652 <context-group name="null">
1470 <context context-type="linenumber">20</context> 1653 <context context-type="linenumber">28</context>
1471 </context-group> 1654 </context-group>
1472 </trans-unit> 1655 </trans-unit>
1473 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 1656 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1474 <source>Save</source> 1657 <source>Save</source>
1475 <target>Ø­Ùظ</target> 1658 <target>Ø­Ùظ</target>
1476 <context-group name="null"> 1659 <context-group name="null">
1477 <context context-type="linenumber">23</context> 1660 <context context-type="linenumber">32</context>
1478 </context-group> 1661 </context-group>
1479 </trans-unit> 1662 </trans-unit>
1480 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 1663 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1540,11 +1723,39 @@
1540 <context context-type="linenumber">159</context> 1723 <context context-type="linenumber">159</context>
1541 </context-group> 1724 </context-group>
1542 </trans-unit> 1725 </trans-unit>
1726 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
1727 <source>Sorry, but something went wrong</source>
1728 <target>عذرا، لقد حدث خلل ما</target>
1729 <context-group name="null">
1730 <context context-type="linenumber">49</context>
1731 </context-group>
1732 </trans-unit>
1733 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
1734 <source>Update</source>
1735 <target>تحديث</target>
1736 <context-group name="null">
1737 <context context-type="linenumber">92</context>
1738 </context-group>
1739 </trans-unit>
1740 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9">
1741 <source>Select the file to upload</source>
1742 <target>اختر المل٠الذي تريد ارساله</target>
1743 <context-group name="null">
1744 <context context-type="linenumber">6</context>
1745 </context-group>
1746 </trans-unit>
1747 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
1748 <source>Scheduled</source>
1749 <target>مبرمجة</target>
1750 <context-group name="null">
1751 <context context-type="linenumber">25</context>
1752 </context-group>
1753 </trans-unit>
1543 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1754 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1544 <source>Publish</source> 1755 <source>Publish</source>
1545 <target>أنشر</target> 1756 <target>أنشر</target>
1546 <context-group name="null"> 1757 <context-group name="null">
1547 <context context-type="linenumber">55</context> 1758 <context context-type="linenumber">65</context>
1548 </context-group> 1759 </context-group>
1549 </trans-unit> 1760 </trans-unit>
1550 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 1761 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -1554,6 +1765,13 @@
1554 <context context-type="linenumber">6</context> 1765 <context context-type="linenumber">6</context>
1555 </context-group> 1766 </context-group>
1556 </trans-unit> 1767 </trans-unit>
1768 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
1769 <source>Or</source>
1770 <target>أو</target>
1771 <context-group name="null">
1772 <context context-type="linenumber">11</context>
1773 </context-group>
1774 </trans-unit>
1557 <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3"> 1775 <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3">
1558 <source>Upload a file</source> 1776 <source>Upload a file</source>
1559 <target>إرسال ملÙ</target> 1777 <target>إرسال ملÙ</target>
@@ -1568,6 +1786,13 @@
1568 <context context-type="linenumber">17</context> 1786 <context context-type="linenumber">17</context>
1569 </context-group> 1787 </context-group>
1570 </trans-unit> 1788 </trans-unit>
1789 <trans-unit id="752c401d7dcd708944eef60e411187f71d882340">
1790 <source>Import with torrent</source>
1791 <target>استيراد عبر التورنت</target>
1792 <context-group name="null">
1793 <context context-type="linenumber">24</context>
1794 </context-group>
1795 </trans-unit>
1571 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 1796 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
1572 <source>Title</source> 1797 <source>Title</source>
1573 <target>العنوان</target> 1798 <target>العنوان</target>
@@ -1582,6 +1807,20 @@
1582 <context context-type="linenumber">191</context> 1807 <context context-type="linenumber">191</context>
1583 </context-group> 1808 </context-group>
1584 </trans-unit> 1809 </trans-unit>
1810 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
1811 <source>+ Tag</source>
1812 <target>+ وسم</target>
1813 <context-group name="null">
1814 <context context-type="linenumber">21</context>
1815 </context-group>
1816 </trans-unit>
1817 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
1818 <source>Enter a new tag</source>
1819 <target>أدخل وسمًا جديدا</target>
1820 <context-group name="null">
1821 <context context-type="linenumber">21</context>
1822 </context-group>
1823 </trans-unit>
1585 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a"> 1824 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
1586 <source>Enable video comments</source> 1825 <source>Enable video comments</source>
1587 <target>السماح بالتعليق على الÙيديوهات</target> 1826 <target>السماح بالتعليق على الÙيديوهات</target>
@@ -1600,14 +1839,28 @@
1600 <source>Cancel create</source> 1839 <source>Cancel create</source>
1601 <target>إلغاء الإنشاء</target> 1840 <target>إلغاء الإنشاء</target>
1602 <context-group name="null"> 1841 <context-group name="null">
1603 <context context-type="linenumber">169</context> 1842 <context context-type="linenumber">170</context>
1604 </context-group> 1843 </context-group>
1605 </trans-unit> 1844 </trans-unit>
1606 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 1845 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
1607 <source>Cancel deletion</source> 1846 <source>Cancel deletion</source>
1608 <target>إلغاء الحذÙ</target> 1847 <target>إلغاء الحذÙ</target>
1609 <context-group name="null"> 1848 <context-group name="null">
1610 <context context-type="linenumber">177</context> 1849 <context context-type="linenumber">178</context>
1850 </context-group>
1851 </trans-unit>
1852 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
1853 <source>Upload thumbnail</source>
1854 <target>تحديث الصورة المصغرة</target>
1855 <context-group name="null">
1856 <context context-type="linenumber">196</context>
1857 </context-group>
1858 </trans-unit>
1859 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1860 <source>Upload preview</source>
1861 <target>إرسال معاينة</target>
1862 <context-group name="null">
1863 <context context-type="linenumber">203</context>
1611 </context-group> 1864 </context-group>
1612 </trans-unit> 1865 </trans-unit>
1613 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1866 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1621,7 +1874,7 @@
1621 <source>Advanced settings</source> 1874 <source>Advanced settings</source>
1622 <target>الإعدادات المتقدمة</target> 1875 <target>الإعدادات المتقدمة</target>
1623 <context-group name="null"> 1876 <context-group name="null">
1624 <context context-type="linenumber">190</context> 1877 <context context-type="linenumber">191</context>
1625 </context-group> 1878 </context-group>
1626 </trans-unit> 1879 </trans-unit>
1627 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611"> 1880 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
@@ -1675,15 +1928,6 @@
1675 <context context-type="linenumber">3</context> 1928 <context context-type="linenumber">3</context>
1676 </context-group> 1929 </context-group>
1677 </trans-unit> 1930 </trans-unit>
1678 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
1679 <source>
1680 Cancel
1681 </source>
1682 <target>إلغاء</target>
1683 <context-group name="null">
1684 <context context-type="linenumber">19</context>
1685 </context-group>
1686 </trans-unit>
1687 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 1931 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
1688 <source>Share</source> 1932 <source>Share</source>
1689 <target>شارك</target> 1933 <target>شارك</target>
@@ -1691,6 +1935,13 @@
1691 <context context-type="linenumber">74</context> 1935 <context context-type="linenumber">74</context>
1692 </context-group> 1936 </context-group>
1693 </trans-unit> 1937 </trans-unit>
1938 <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f">
1939 <source>QR-Code</source>
1940 <target>رمز الاستجابة السريعة</target>
1941 <context-group name="null">
1942 <context context-type="linenumber">29</context>
1943 </context-group>
1944 </trans-unit>
1694 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8"> 1945 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
1695 <source>Close</source> 1946 <source>Close</source>
1696 <target>إغلاق</target> 1947 <target>إغلاق</target>
@@ -1719,6 +1970,13 @@
1719 <context context-type="linenumber">57</context> 1970 <context context-type="linenumber">57</context>
1720 </context-group> 1971 </context-group>
1721 </trans-unit> 1972 </trans-unit>
1973 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
1974 <source>Dislike this video</source>
1975 <target>إلغاء الإعجاب بهذه الÙيديو</target>
1976 <context-group name="null">
1977 <context context-type="linenumber">64</context>
1978 </context-group>
1979 </trans-unit>
1722 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2"> 1980 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
1723 <source>Download the video</source> 1981 <source>Download the video</source>
1724 <target>تنزيل الÙيديو</target> 1982 <target>تنزيل الÙيديو</target>
@@ -1747,6 +2005,13 @@
1747 <context context-type="linenumber">91</context> 2005 <context context-type="linenumber">91</context>
1748 </context-group> 2006 </context-group>
1749 </trans-unit> 2007 </trans-unit>
2008 <trans-unit id="007ab5fa2aae8a7372307d3fc45a2dbcb11ffd61">
2009 <source>Blacklist</source>
2010 <target>حجب ÙÙŠ القائمة السوداء</target>
2011 <context-group name="null">
2012 <context context-type="linenumber">96</context>
2013 </context-group>
2014 </trans-unit>
1750 <trans-unit id="803c6317abd2dbafcc93226c4e273c62932e3037"> 2015 <trans-unit id="803c6317abd2dbafcc93226c4e273c62932e3037">
1751 <source>Blacklist this video</source> 2016 <source>Blacklist this video</source>
1752 <target>حجب هذه الÙيديو</target> 2017 <target>حجب هذه الÙيديو</target>
@@ -1782,13 +2047,6 @@
1782 <context context-type="linenumber">123</context> 2047 <context context-type="linenumber">123</context>
1783 </context-group> 2048 </context-group>
1784 </trans-unit> 2049 </trans-unit>
1785 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1786 <source>Go to the account page</source>
1787 <target>الإنتقال إلى صÙحة الحساب</target>
1788 <context-group name="null">
1789 <context context-type="linenumber">133</context>
1790 </context-group>
1791 </trans-unit>
1792 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 2050 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
1793 <source>Show more</source> 2051 <source>Show more</source>
1794 <target>عرض المزيد</target> 2052 <target>عرض المزيد</target>
@@ -1803,6 +2061,36 @@
1803 <context context-type="linenumber">152</context> 2061 <context context-type="linenumber">152</context>
1804 </context-group> 2062 </context-group>
1805 </trans-unit> 2063 </trans-unit>
2064 <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
2065 <source>Friendly Reminder: </source>
2066 <target>تذكير أخوي:</target>
2067 <context-group name="null">
2068 <context context-type="linenumber">208</context>
2069 </context-group>
2070 </trans-unit>
2071 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
2072 <source>More information</source>
2073 <target>المزيد من التÙاصيل</target>
2074 <context-group name="null">
2075 <context context-type="linenumber">212</context>
2076 </context-group>
2077 </trans-unit>
2078 <trans-unit id="bd499ca7913bb5408fd139a4cb4f863852d5f318">
2079 <source>Get more information</source>
2080 <target>احصل على معلومات أكثر</target>
2081 <context-group name="null">
2082 <context context-type="linenumber">212</context>
2083 </context-group>
2084 </trans-unit>
2085 <trans-unit id="20fc98888baf65b5ba9fe9622dc036fa8dec6a5f">
2086 <source>
2087 OK
2088 </source>
2089 <target>نعم</target>
2090 <context-group name="null">
2091 <context context-type="linenumber">215</context>
2092 </context-group>
2093 </trans-unit>
1806 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27"> 2094 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
1807 <source> 2095 <source>
1808 Other videos 2096 Other videos
@@ -1825,7 +2113,7 @@
1825 <source>No comments.</source> 2113 <source>No comments.</source>
1826 <target>ليس هناك تعليقات.</target> 2114 <target>ليس هناك تعليقات.</target>
1827 <context-group name="null"> 2115 <context-group name="null">
1828 <context context-type="linenumber">18</context> 2116 <context context-type="linenumber">17</context>
1829 </context-group> 2117 </context-group>
1830 </trans-unit> 2118 </trans-unit>
1831 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 2119 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -1834,7 +2122,7 @@
1834 </source> 2122 </source>
1835 <target>تم تعطيل التعليقات.</target> 2123 <target>تم تعطيل التعليقات.</target>
1836 <context-group name="null"> 2124 <context-group name="null">
1837 <context context-type="linenumber">64</context> 2125 <context context-type="linenumber">63</context>
1838 </context-group> 2126 </context-group>
1839 </trans-unit> 2127 </trans-unit>
1840 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 2128 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -1853,6 +2141,13 @@
1853 <context context-type="linenumber">20</context> 2141 <context context-type="linenumber">20</context>
1854 </context-group> 2142 </context-group>
1855 </trans-unit> 2143 </trans-unit>
2144 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
2145 <source>login to comment</source>
2146 <target>قم بتسجيل الدخول للتعليق</target>
2147 <context-group name="null">
2148 <context context-type="linenumber">35</context>
2149 </context-group>
2150 </trans-unit>
1856 <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6"> 2151 <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6">
1857 <source>Reply</source> 2152 <source>Reply</source>
1858 <target>الرد</target> 2153 <target>الرد</target>
@@ -1874,16 +2169,44 @@
1874 <context context-type="linenumber">1</context> 2169 <context context-type="linenumber">1</context>
1875 </context-group> 2170 </context-group>
1876 </trans-unit> 2171 </trans-unit>
1877 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 2172 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
1878 <source>Error</source> 2173 <source>240p</source>
1879 <target>خطأ</target> 2174 <target>240p</target>
1880 <context-group name="null"> 2175 <context-group name="null">
1881 <context context-type="linenumber">1</context> 2176 <context context-type="linenumber">1</context>
1882 </context-group> 2177 </context-group>
1883 </trans-unit> 2178 </trans-unit>
1884 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 2179 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
1885 <source>Success</source> 2180 <source>360p</source>
1886 <target>تم بنجاح</target> 2181 <target>360p</target>
2182 <context-group name="null">
2183 <context context-type="linenumber">1</context>
2184 </context-group>
2185 </trans-unit>
2186 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
2187 <source>480p</source>
2188 <target>480p</target>
2189 <context-group name="null">
2190 <context context-type="linenumber">1</context>
2191 </context-group>
2192 </trans-unit>
2193 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
2194 <source>720p</source>
2195 <target>720p</target>
2196 <context-group name="null">
2197 <context context-type="linenumber">1</context>
2198 </context-group>
2199 </trans-unit>
2200 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
2201 <source>1080p</source>
2202 <target>1080p</target>
2203 <context-group name="null">
2204 <context context-type="linenumber">1</context>
2205 </context-group>
2206 </trans-unit>
2207 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2208 <source>Configuration updated.</source>
2209 <target>تم تحديث الإعدادات</target>
1887 <context-group name="null"> 2210 <context-group name="null">
1888 <context context-type="linenumber">1</context> 2211 <context context-type="linenumber">1</context>
1889 </context-group> 2212 </context-group>
@@ -1909,6 +2232,20 @@
1909 <context context-type="linenumber">1</context> 2232 <context context-type="linenumber">1</context>
1910 </context-group> 2233 </context-group>
1911 </trans-unit> 2234 </trans-unit>
2235 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
2236 <source>enabled</source>
2237 <target>Ù…Ùعّل</target>
2238 <context-group name="null">
2239 <context context-type="linenumber">1</context>
2240 </context-group>
2241 </trans-unit>
2242 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
2243 <source>disabled</source>
2244 <target>خامل</target>
2245 <context-group name="null">
2246 <context context-type="linenumber">1</context>
2247 </context-group>
2248 </trans-unit>
1912 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 2249 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
1913 <source>Comment updated.</source> 2250 <source>Comment updated.</source>
1914 <target>تم تحديث التعليق.</target> 2251 <target>تم تحديث التعليق.</target>
@@ -1916,6 +2253,13 @@
1916 <context context-type="linenumber">1</context> 2253 <context context-type="linenumber">1</context>
1917 </context-group> 2254 </context-group>
1918 </trans-unit> 2255 </trans-unit>
2256 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
2257 <source>Delete this report</source>
2258 <target>حذ٠هذا التقرير</target>
2259 <context-group name="null">
2260 <context context-type="linenumber">1</context>
2261 </context-group>
2262 </trans-unit>
1919 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223"> 2263 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
1920 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source> 2264 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
1921 <target>هل تريد إزالت هذا الÙيديو من قائمة الحجب؟ سيكون متوÙرا ÙÙŠ قائمة الÙيديوهات مجددا.</target> 2265 <target>هل تريد إزالت هذا الÙيديو من قائمة الحجب؟ سيكون متوÙرا ÙÙŠ قائمة الÙيديوهات مجددا.</target>
@@ -1937,13 +2281,6 @@
1937 <context context-type="linenumber">1</context> 2281 <context context-type="linenumber">1</context>
1938 </context-group> 2282 </context-group>
1939 </trans-unit> 2283 </trans-unit>
1940 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
1941 <source>Ban</source>
1942 <target>حظر</target>
1943 <context-group name="null">
1944 <context context-type="linenumber">1</context>
1945 </context-group>
1946 </trans-unit>
1947 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 2284 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
1948 <source>Unban</source> 2285 <source>Unban</source>
1949 <target>ألغ الحظر</target> 2286 <target>ألغ الحظر</target>
@@ -1958,16 +2295,16 @@
1958 <context context-type="linenumber">1</context> 2295 <context context-type="linenumber">1</context>
1959 </context-group> 2296 </context-group>
1960 </trans-unit> 2297 </trans-unit>
1961 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 2298 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
1962 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 2299 <source>You cannot delete root.</source>
1963 <target>ه٠تريد إلغاء الحظر عن <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target> 2300 <target>لا يمكنك حذ٠المسخدم الجذر</target>
1964 <context-group name="null"> 2301 <context-group name="null">
1965 <context context-type="linenumber">1</context> 2302 <context context-type="linenumber">1</context>
1966 </context-group> 2303 </context-group>
1967 </trans-unit> 2304 </trans-unit>
1968 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 2305 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
1969 <source>You cannot delete root.</source> 2306 <source>Ownership accepted</source>
1970 <target>لا ÙŠÙكنك حذ٠المسخدم الجذر</target> 2307 <target>تم قبول الملكية</target>
1971 <context-group name="null"> 2308 <context-group name="null">
1972 <context context-type="linenumber">1</context> 2309 <context context-type="linenumber">1</context>
1973 </context-group> 2310 </context-group>
@@ -1979,6 +2316,13 @@
1979 <context context-type="linenumber">1</context> 2316 <context context-type="linenumber">1</context>
1980 </context-group> 2317 </context-group>
1981 </trans-unit> 2318 </trans-unit>
2319 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
2320 <source>You current password is invalid.</source>
2321 <target>كلمتك السرية الحالية غير صالحة. </target>
2322 <context-group name="null">
2323 <context context-type="linenumber">1</context>
2324 </context-group>
2325 </trans-unit>
1982 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 2326 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
1983 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 2327 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
1984 <target>متأكد أنك تريد حذ٠حسابك ؟هذا سيحذ٠بياناتك,قنواتك,Ùيديوهاتك الخ.</target> 2328 <target>متأكد أنك تريد حذ٠حسابك ؟هذا سيحذ٠بياناتك,قنواتك,Ùيديوهاتك الخ.</target>
@@ -2028,6 +2372,13 @@
2028 <context context-type="linenumber">1</context> 2372 <context context-type="linenumber">1</context>
2029 </context-group> 2373 </context-group>
2030 </trans-unit> 2374 </trans-unit>
2375 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
2376 <source>This name already exists on this instance.</source>
2377 <target>هذا الإسم موجود على مثيل الخادوم هذا.</target>
2378 <context-group name="null">
2379 <context context-type="linenumber">1</context>
2380 </context-group>
2381 </trans-unit>
2031 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 2382 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
2032 <source>Create</source> 2383 <source>Create</source>
2033 <target>إنشاء</target> 2384 <target>إنشاء</target>
@@ -2035,16 +2386,149 @@
2035 <context context-type="linenumber">1</context> 2386 <context context-type="linenumber">1</context>
2036 </context-group> 2387 </context-group>
2037 </trans-unit> 2388 </trans-unit>
2038 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e"> 2389 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2039 <source>Please type the name of the video channel to confirm</source> 2390 <source>My videos</source>
2040 <target>رجاء أدخل اسم القنات للتأكيد</target> 2391 <target>Ùيديوهاتي</target>
2392 <context-group name="null">
2393 <context context-type="linenumber">1</context>
2394 </context-group>
2395 </trans-unit>
2396 <trans-unit id="dd9f3264feed4935008861c15d81c947124e4ac3">
2397 <source>Published</source>
2398 <target>المنشورة</target>
2399 <context-group name="null">
2400 <context context-type="linenumber">1</context>
2401 </context-group>
2402 </trans-unit>
2403 <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392">
2404 <source>To import</source>
2405 <target>للاستيراد</target>
2406 <context-group name="null">
2407 <context context-type="linenumber">1</context>
2408 </context-group>
2409 </trans-unit>
2410 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2411 <source>My library</source>
2412 <target>مكتبتي</target>
2413 <context-group name="null">
2414 <context context-type="linenumber">1</context>
2415 </context-group>
2416 </trans-unit>
2417 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2418 <source>My channels</source>
2419 <target>قنواتي</target>
2420 <context-group name="null">
2421 <context context-type="linenumber">1</context>
2422 </context-group>
2423 </trans-unit>
2424 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2425 <source>My subscriptions</source>
2426 <target>اشتراكاتي</target>
2427 <context-group name="null">
2428 <context context-type="linenumber">1</context>
2429 </context-group>
2430 </trans-unit>
2431 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2432 <source>Misc</source>
2433 <target>أخرى</target>
2434 <context-group name="null">
2435 <context context-type="linenumber">1</context>
2436 </context-group>
2437 </trans-unit>
2438 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2439 <source>My settings</source>
2440 <target>إعداداتي</target>
2441 <context-group name="null">
2442 <context context-type="linenumber">1</context>
2443 </context-group>
2444 </trans-unit>
2445 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
2446 <source>Subscribe to the account</source>
2447 <target>الاشتراك ÙÙŠ الحساب</target>
2448 <context-group name="null">
2449 <context context-type="linenumber">1</context>
2450 </context-group>
2451 </trans-unit>
2452 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
2453 <source>Toggle the left menu</source>
2454 <target>الانتقال إلى القائمة اليسرى</target>
2455 <context-group name="null">
2456 <context context-type="linenumber">1</context>
2457 </context-group>
2458 </trans-unit>
2459 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
2460 <source>Go to the videos overview page</source>
2461 <target>الذهاب إلى صÙحة معاينة الÙيديوهات</target>
2462 <context-group name="null">
2463 <context context-type="linenumber">1</context>
2464 </context-group>
2465 </trans-unit>
2466 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
2467 <source>Go to the trending videos page</source>
2468 <target>الذهاب إلى صÙحة الÙيديوهات الشائعة</target>
2469 <context-group name="null">
2470 <context context-type="linenumber">1</context>
2471 </context-group>
2472 </trans-unit>
2473 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
2474 <source>Go to the recently added videos page</source>
2475 <target>الذهاب إلى صÙحةالÙيديوهات المضاÙØ© حديثا</target>
2476 <context-group name="null">
2477 <context context-type="linenumber">1</context>
2478 </context-group>
2479 </trans-unit>
2480 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
2481 <source>Go to the local videos page</source>
2482 <target>الذهاب إلى صÙحة الÙيديوهات المحلية</target>
2483 <context-group name="null">
2484 <context context-type="linenumber">1</context>
2485 </context-group>
2486 </trans-unit>
2487 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
2488 <source>Go to the videos upload page</source>
2489 <target>الذهاب إلى صÙحة إرسال الÙيديوهات</target>
2490 <context-group name="null">
2491 <context context-type="linenumber">1</context>
2492 </context-group>
2493 </trans-unit>
2494 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
2495 <source>Toggle Dark theme</source>
2496 <target>التغيير إلى السمة الداكنة</target>
2497 <context-group name="null">
2498 <context context-type="linenumber">1</context>
2499 </context-group>
2500 </trans-unit>
2501 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
2502 <source>Go to my subscriptions</source>
2503 <target>الذهاب إلى اشتراكاتي</target>
2504 <context-group name="null">
2505 <context context-type="linenumber">1</context>
2506 </context-group>
2507 </trans-unit>
2508 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
2509 <source>Go to my videos</source>
2510 <target>الذهاب إلى Ùيديوهاتي</target>
2511 <context-group name="null">
2512 <context context-type="linenumber">1</context>
2513 </context-group>
2514 </trans-unit>
2515 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
2516 <source>Go to my imports</source>
2517 <target>الذهاب إلى استيراداتي</target>
2518 <context-group name="null">
2519 <context context-type="linenumber">1</context>
2520 </context-group>
2521 </trans-unit>
2522 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
2523 <source>Go to my channels</source>
2524 <target>الذهاب إلى قنواتي</target>
2041 <context-group name="null"> 2525 <context-group name="null">
2042 <context context-type="linenumber">1</context> 2526 <context context-type="linenumber">1</context>
2043 </context-group> 2527 </context-group>
2044 </trans-unit> 2528 </trans-unit>
2045 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 2529 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2046 <source>Channels</source> 2530 <source>Error</source>
2047 <target>القنوات</target> 2531 <target>خطأ</target>
2048 <context-group name="null"> 2532 <context-group name="null">
2049 <context context-type="linenumber">1</context> 2533 <context context-type="linenumber">1</context>
2050 </context-group> 2534 </context-group>
@@ -2063,6 +2547,34 @@
2063 <context context-type="linenumber">1</context> 2547 <context context-type="linenumber">1</context>
2064 </context-group> 2548 </context-group>
2065 </trans-unit> 2549 </trans-unit>
2550 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
2551 <source>Keyboard Shortcuts:</source>
2552 <target>اختصارات لوحة المÙاتيح:</target>
2553 <context-group name="null">
2554 <context context-type="linenumber">1</context>
2555 </context-group>
2556 </trans-unit>
2557 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2558 <source>Info</source>
2559 <target>معلومات</target>
2560 <context-group name="null">
2561 <context context-type="linenumber">1</context>
2562 </context-group>
2563 </trans-unit>
2564 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2565 <source>Success</source>
2566 <target>تم بنجاح</target>
2567 <context-group name="null">
2568 <context context-type="linenumber">1</context>
2569 </context-group>
2570 </trans-unit>
2571 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
2572 <source>Incorrect username or password.</source>
2573 <target>اسم المستخدم أو كلمة المرور خاطئة.</target>
2574 <context-group name="null">
2575 <context context-type="linenumber">1</context>
2576 </context-group>
2577 </trans-unit>
2066 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338"> 2578 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
2067 <source>You account is blocked.</source> 2579 <source>You account is blocked.</source>
2068 <target>إنّ حسابك Ù…ÙÙ‚ÙÙŽÙ„.</target> 2580 <target>إنّ حسابك Ù…ÙÙ‚ÙÙŽÙ„.</target>
@@ -2070,6 +2582,13 @@
2070 <context context-type="linenumber">1</context> 2582 <context context-type="linenumber">1</context>
2071 </context-group> 2583 </context-group>
2072 </trans-unit> 2584 </trans-unit>
2585 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2586 <source>Your password has been successfully reset!</source>
2587 <target>لقد تم إعادة تعيين كلمتك السرية بنجاح!</target>
2588 <context-group name="null">
2589 <context context-type="linenumber">1</context>
2590 </context-group>
2591 </trans-unit>
2073 <trans-unit id="7fb1099e29660162f9154d5b2feee7743a423df6"> 2592 <trans-unit id="7fb1099e29660162f9154d5b2feee7743a423df6">
2074 <source>Today</source> 2593 <source>Today</source>
2075 <target>اليوم</target> 2594 <target>اليوم</target>
@@ -2147,6 +2666,20 @@
2147 <context context-type="linenumber">1</context> 2666 <context context-type="linenumber">1</context>
2148 </context-group> 2667 </context-group>
2149 </trans-unit> 2668 </trans-unit>
2669 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2670 <source>Email is required.</source>
2671 <target>البريد الإلكتروني مطلوب.</target>
2672 <context-group name="null">
2673 <context context-type="linenumber">1</context>
2674 </context-group>
2675 </trans-unit>
2676 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2677 <source>Email must be valid.</source>
2678 <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target>
2679 <context-group name="null">
2680 <context context-type="linenumber">1</context>
2681 </context-group>
2682 </trans-unit>
2150 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2683 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2151 <source>Username is required.</source> 2684 <source>Username is required.</source>
2152 <target>اسم المستخدم مطلوب.</target> 2685 <target>اسم المستخدم مطلوب.</target>
@@ -2168,23 +2701,93 @@
2168 <context context-type="linenumber">1</context> 2701 <context context-type="linenumber">1</context>
2169 </context-group> 2702 </context-group>
2170 </trans-unit> 2703 </trans-unit>
2171 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 2704 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
2172 <source>Username must be at least 3 characters long.</source> 2705 <source>User role is required.</source>
2173 <target>يجب أن يكون طول اسم المستخدÙÙأكبر Ù…ÙÙ† 3 أحرÙ. </target> 2706 <target>دور المستخدم مطÙوب.</target>
2174 <context-group name="null"> 2707 <context-group name="null">
2175 <context context-type="linenumber">1</context> 2708 <context context-type="linenumber">1</context>
2176 </context-group> 2709 </context-group>
2177 </trans-unit> 2710 </trans-unit>
2178 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 2711 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
2179 <source>Email is required.</source> 2712 <source>Display name is required.</source>
2180 <target>البريد الإلكتروني Ùطلوب.</target> 2713 <target>Ø¹Ø±Ø Ø§Ù„Ø§Ø³Ù… لازم.</target>
2181 <context-group name="null"> 2714 <context-group name="null">
2182 <context context-type="linenumber">1</context> 2715 <context context-type="linenumber">1</context>
2183 </context-group> 2716 </context-group>
2184 </trans-unit> 2717 </trans-unit>
2185 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1"> 2718 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2186 <source>Email must be valid.</source> 2719 <source>Description must be at least 3 characters long.</source>
2187 <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target> 2720 <target>طول الوص٠يجب أن يتعدى 3حروÙ.</target>
2721 <context-group name="null">
2722 <context context-type="linenumber">1</context>
2723 </context-group>
2724 </trans-unit>
2725 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
2726 <source>Report reason is required.</source>
2727 <target>سبب الإبلاغ لازم.</target>
2728 <context-group name="null">
2729 <context context-type="linenumber">1</context>
2730 </context-group>
2731 </trans-unit>
2732 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
2733 <source>Moderation comment is required.</source>
2734 <target>تعليق الإشرا٠لازم.</target>
2735 <context-group name="null">
2736 <context context-type="linenumber">1</context>
2737 </context-group>
2738 </trans-unit>
2739 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
2740 <source>The channel is required.</source>
2741 <target>القناة لازمة.</target>
2742 <context-group name="null">
2743 <context context-type="linenumber">1</context>
2744 </context-group>
2745 </trans-unit>
2746 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
2747 <source>The username is required.</source>
2748 <target>اسم المستخدم مطلوب.</target>
2749 <context-group name="null">
2750 <context context-type="linenumber">1</context>
2751 </context-group>
2752 </trans-unit>
2753 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
2754 <source>You can only transfer ownership to a local account</source>
2755 <target>لا يمكن نقل الملكية إلى حساب محلي</target>
2756 <context-group name="null">
2757 <context context-type="linenumber">1</context>
2758 </context-group>
2759 </trans-unit>
2760 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
2761 <source>Name is required.</source>
2762 <target>الاسم مطلوب.</target>
2763 <context-group name="null">
2764 <context context-type="linenumber">1</context>
2765 </context-group>
2766 </trans-unit>
2767 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
2768 <source>Comment is required.</source>
2769 <target>التعليق مطلوب.</target>
2770 <context-group name="null">
2771 <context context-type="linenumber">1</context>
2772 </context-group>
2773 </trans-unit>
2774 <trans-unit id="cdc51eaeab88683610a28af8645cf91d136b39e1">
2775 <source>Video name is required.</source>
2776 <target>اسم الÙيديو مطلوب.</target>
2777 <context-group name="null">
2778 <context context-type="linenumber">1</context>
2779 </context-group>
2780 </trans-unit>
2781 <trans-unit id="a627c58cf1849d7d838696e7f36c1bae1a8b31a4">
2782 <source>Video privacy is required.</source>
2783 <target>خصوصية لاÙيديو مطلوبة.</target>
2784 <context-group name="null">
2785 <context context-type="linenumber">1</context>
2786 </context-group>
2787 </trans-unit>
2788 <trans-unit id="34a0811f9a2a7366cc9efcdad52ea59b105326ea">
2789 <source>A tag should be less than 30 characters long.</source>
2790 <target>طول الوسم لا يجب أن يتجاوز 30 حرÙا.</target>
2188 <context-group name="null"> 2791 <context-group name="null">
2189 <context context-type="linenumber">1</context> 2792 <context context-type="linenumber">1</context>
2190 </context-group> 2793 </context-group>
@@ -2511,6 +3114,20 @@
2511 <context context-type="linenumber">1</context> 3114 <context context-type="linenumber">1</context>
2512 </context-group> 3115 </context-group>
2513 </trans-unit> 3116 </trans-unit>
3117 <trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
3118 <source>Clear</source>
3119 <target>مسح</target>
3120 <context-group name="null">
3121 <context context-type="linenumber">1</context>
3122 </context-group>
3123 </trans-unit>
3124 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
3125 <source>Torrent import</source>
3126 <target>استيراد تورنت</target>
3127 <context-group name="null">
3128 <context context-type="linenumber">1</context>
3129 </context-group>
3130 </trans-unit>
2514 <trans-unit id="dc60677d5a906e69f38a5cf9da7f2eb03931bea0"> 3131 <trans-unit id="dc60677d5a906e69f38a5cf9da7f2eb03931bea0">
2515 <source>Links</source> 3132 <source>Links</source>
2516 <target>الروابط</target> 3133 <target>الروابط</target>
@@ -2539,6 +3156,55 @@
2539 <context context-type="linenumber">1</context> 3156 <context context-type="linenumber">1</context>
2540 </context-group> 3157 </context-group>
2541 </trans-unit> 3158 </trans-unit>
3159 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
3160 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
3161 <target>هل تريد إلغاء الحظر عن <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
3162 <context-group name="null">
3163 <context context-type="linenumber">1</context>
3164 </context-group>
3165 </trans-unit>
3166 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
3167 <source>Mute this account</source>
3168 <target>أكتم هذا الحساب</target>
3169 <context-group name="null">
3170 <context context-type="linenumber">1</context>
3171 </context-group>
3172 </trans-unit>
3173 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
3174 <source>Unmute this account</source>
3175 <target>إلغاء الكتم عن هذا الحساب</target>
3176 <context-group name="null">
3177 <context context-type="linenumber">1</context>
3178 </context-group>
3179 </trans-unit>
3180 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
3181 <source>Mute the instance</source>
3182 <target>كتم مثيل الخادوم</target>
3183 <context-group name="null">
3184 <context context-type="linenumber">1</context>
3185 </context-group>
3186 </trans-unit>
3187 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
3188 <source>Unmute the instance</source>
3189 <target>الغاء الكتم عن مثيل الخادوم</target>
3190 <context-group name="null">
3191 <context context-type="linenumber">1</context>
3192 </context-group>
3193 </trans-unit>
3194 <trans-unit id="ab783a52f2df9ff7a20139cab0da6d0764f3cc5d">
3195 <source>Too many attempts, please try again later.</source>
3196 <target>محاولات كثيرة، يرجى العودة لاحقا.</target>
3197 <context-group name="null">
3198 <context context-type="linenumber">1</context>
3199 </context-group>
3200 </trans-unit>
3201 <trans-unit id="0f286a597f0053c3578a52e044769c204ee516fc">
3202 <source>Server error. Please retry later.</source>
3203 <target>خطأ على السيرÙر. يرجى إعادة المحاولة لاحقا.</target>
3204 <context-group name="null">
3205 <context context-type="linenumber">1</context>
3206 </context-group>
3207 </trans-unit>
2542 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 3208 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
2543 <source>Subscribed</source> 3209 <source>Subscribed</source>
2544 <target>مشترك</target> 3210 <target>مشترك</target>
@@ -2546,9 +3212,9 @@
2546 <context context-type="linenumber">1</context> 3212 <context context-type="linenumber">1</context>
2547 </context-group> 3213 </context-group>
2548 </trans-unit> 3214 </trans-unit>
2549 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 3215 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
2550 <source>Welcome</source> 3216 <source>Moderator</source>
2551 <target>مرحبًا</target> 3217 <target>مشرÙ</target>
2552 <context-group name="null"> 3218 <context-group name="null">
2553 <context context-type="linenumber">1</context> 3219 <context context-type="linenumber">1</context>
2554 </context-group> 3220 </context-group>
@@ -2581,6 +3247,27 @@
2581 <context context-type="linenumber">1</context> 3247 <context context-type="linenumber">1</context>
2582 </context-group> 3248 </context-group>
2583 </trans-unit> 3249 </trans-unit>
3250 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
3251 <source>Copied</source>
3252 <target>تم نسخه</target>
3253 <context-group name="null">
3254 <context context-type="linenumber">1</context>
3255 </context-group>
3256 </trans-unit>
3257 <trans-unit id="fa2601e52cbf5725a13d33fe14458823b882ea50">
3258 <source>Video reported.</source>
3259 <target>Ùيديو تم الإبلاغ عنها.</target>
3260 <context-group name="null">
3261 <context context-type="linenumber">1</context>
3262 </context-group>
3263 </trans-unit>
3264 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
3265 <source>Like the video</source>
3266 <target>الإعجاب بالÙيديو</target>
3267 <context-group name="null">
3268 <context context-type="linenumber">1</context>
3269 </context-group>
3270 </trans-unit>
2584 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 3271 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
2585 <source>Do you really want to delete this video?</source> 3272 <source>Do you really want to delete this video?</source>
2586 <target>متأكد أنك تريد حذ٠هذه الÙيديو؟</target> 3273 <target>متأكد أنك تريد حذ٠هذه الÙيديو؟</target>
diff --git a/client/src/locale/target/angular_ca_ES.xml b/client/src/locale/target/angular_ca_ES.xml
index 1fd88b480..15c1bbca0 100644
--- a/client/src/locale/target/angular_ca_ES.xml
+++ b/client/src/locale/target/angular_ca_ES.xml
@@ -7,7 +7,7 @@
7 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 7 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
8 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualitzacions</target> 8 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualitzacions</target>
9 <context-group name="null"> 9 <context-group name="null">
10 <context context-type="linenumber">13</context> 10 <context context-type="linenumber">16</context>
11 </context-group> 11 </context-group>
12 </trans-unit> 12 </trans-unit>
13 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 13 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -21,7 +21,7 @@
21 <source>Edit</source> 21 <source>Edit</source>
22 <target>Editar</target> 22 <target>Editar</target>
23 <context-group name="null"> 23 <context-group name="null">
24 <context context-type="linenumber">5</context> 24 <context context-type="linenumber">1</context>
25 </context-group> 25 </context-group>
26 </trans-unit> 26 </trans-unit>
27 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 27 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -49,7 +49,14 @@
49 <source>Video quota</source> 49 <source>Video quota</source>
50 <target>Quota de vídeo</target> 50 <target>Quota de vídeo</target>
51 <context-group name="null"> 51 <context-group name="null">
52 <context context-type="linenumber">19</context> 52 <context context-type="linenumber">42</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
56 <source>Reason...</source>
57 <target>Motiu...</target>
58 <context-group name="null">
59 <context context-type="linenumber">11</context>
53 </context-group> 60 </context-group>
54 </trans-unit> 61 </trans-unit>
55 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 62 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
@@ -109,7 +116,7 @@
109 <source>Password</source> 116 <source>Password</source>
110 <target>Contrasenya</target> 117 <target>Contrasenya</target>
111 <context-group name="null"> 118 <context-group name="null">
112 <context context-type="linenumber">12</context> 119 <context context-type="linenumber">13</context>
113 </context-group> 120 </context-group>
114 </trans-unit> 121 </trans-unit>
115 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 122 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -123,7 +130,7 @@
123 <source>Login</source> 130 <source>Login</source>
124 <target>Iniciar sessió</target> 131 <target>Iniciar sessió</target>
125 <context-group name="null"> 132 <context-group name="null">
126 <context context-type="linenumber">38</context> 133 <context context-type="linenumber">36</context>
127 </context-group> 134 </context-group>
128 </trans-unit> 135 </trans-unit>
129 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 136 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -151,7 +158,7 @@
151 <source>Send me an email to reset my password</source> 158 <source>Send me an email to reset my password</source>
152 <target>Envia'm un correu per reiniciar la meva contrasenya</target> 159 <target>Envia'm un correu per reiniciar la meva contrasenya</target>
153 <context-group name="null"> 160 <context-group name="null">
154 <context context-type="linenumber">75</context> 161 <context context-type="linenumber">80</context>
155 </context-group> 162 </context-group>
156 </trans-unit> 163 </trans-unit>
157 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 164 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -204,18 +211,11 @@
204 <context context-type="linenumber">8</context> 211 <context context-type="linenumber">8</context>
205 </context-group> 212 </context-group>
206 </trans-unit> 213 </trans-unit>
207 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
208 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
209 <target>He llegit i estic d'acord amb &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; d'aquesta instància</target>
210 <context-group name="null">
211 <context context-type="linenumber">54</context>
212 </context-group>
213 </trans-unit>
214 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 214 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
215 <source>Signup</source> 215 <source>Signup</source>
216 <target>Registra't</target> 216 <target>Registra't</target>
217 <context-group name="null"> 217 <context-group name="null">
218 <context context-type="linenumber">88</context> 218 <context context-type="linenumber">78</context>
219 </context-group> 219 </context-group>
220 </trans-unit> 220 </trans-unit>
221 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 221 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -236,13 +236,6 @@
236 <context context-type="linenumber">6</context> 236 <context context-type="linenumber">6</context>
237 </context-group> 237 </context-group>
238 </trans-unit> 238 </trans-unit>
239 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
240 <source>Filters</source>
241 <target>Filtres</target>
242 <context-group name="null">
243 <context context-type="linenumber">16</context>
244 </context-group>
245 </trans-unit>
246 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 239 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
247 <source> 240 <source>
248 No results found 241 No results found
@@ -251,21 +244,21 @@
251 Cap resultat 244 Cap resultat
252 </target> 245 </target>
253 <context-group name="null"> 246 <context-group name="null">
254 <context context-type="linenumber">25</context> 247 <context context-type="linenumber">28</context>
255 </context-group> 248 </context-group>
256 </trans-unit> 249 </trans-unit>
257 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 250 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
258 <source>Change the language</source> 251 <source>Change the language</source>
259 <target>Canvia la llengua</target> 252 <target>Canvia la llengua</target>
260 <context-group name="null"> 253 <context-group name="null">
261 <context context-type="linenumber">88</context> 254 <context context-type="linenumber">86</context>
262 </context-group> 255 </context-group>
263 </trans-unit> 256 </trans-unit>
264 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 257 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
265 <source>Create an account</source> 258 <source>Create an account</source>
266 <target>Registrar un compte</target> 259 <target>Registrar un compte</target>
267 <context-group name="null"> 260 <context-group name="null">
268 <context context-type="linenumber">39</context> 261 <context context-type="linenumber">37</context>
269 </context-group> 262 </context-group>
270 </trans-unit> 263 </trans-unit>
271 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 264 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -279,35 +272,35 @@
279 <source>Trending</source> 272 <source>Trending</source>
280 <target>Tendència</target> 273 <target>Tendència</target>
281 <context-group name="null"> 274 <context-group name="null">
282 <context context-type="linenumber">57</context> 275 <context context-type="linenumber">55</context>
283 </context-group> 276 </context-group>
284 </trans-unit> 277 </trans-unit>
285 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 278 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
286 <source>Recently added</source> 279 <source>Recently added</source>
287 <target>Afegits fa poc</target> 280 <target>Afegits fa poc</target>
288 <context-group name="null"> 281 <context-group name="null">
289 <context context-type="linenumber">62</context> 282 <context context-type="linenumber">60</context>
290 </context-group> 283 </context-group>
291 </trans-unit> 284 </trans-unit>
292 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 285 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
293 <source>Local</source> 286 <source>Local</source>
294 <target>Local</target> 287 <target>Local</target>
295 <context-group name="null"> 288 <context-group name="null">
296 <context context-type="linenumber">67</context> 289 <context context-type="linenumber">65</context>
297 </context-group> 290 </context-group>
298 </trans-unit> 291 </trans-unit>
299 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 292 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
300 <source>More</source> 293 <source>More</source>
301 <target>Més</target> 294 <target>Més</target>
302 <context-group name="null"> 295 <context-group name="null">
303 <context context-type="linenumber">72</context> 296 <context context-type="linenumber">70</context>
304 </context-group> 297 </context-group>
305 </trans-unit> 298 </trans-unit>
306 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 299 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
307 <source>Administration</source> 300 <source>Administration</source>
308 <target>Administració</target> 301 <target>Administració</target>
309 <context-group name="null"> 302 <context-group name="null">
310 <context context-type="linenumber">76</context> 303 <context context-type="linenumber">74</context>
311 </context-group> 304 </context-group>
312 </trans-unit> 305 </trans-unit>
313 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 306 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -419,14 +412,14 @@
419 <source>No results.</source> 412 <source>No results.</source>
420 <target>Sense resultats.</target> 413 <target>Sense resultats.</target>
421 <context-group name="null"> 414 <context-group name="null">
422 <context context-type="linenumber">7</context> 415 <context context-type="linenumber">20</context>
423 </context-group> 416 </context-group>
424 </trans-unit> 417 </trans-unit>
425 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 418 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
426 <source>Instance</source> 419 <source>Instance</source>
427 <target>Instància</target> 420 <target>Instància</target>
428 <context-group name="null"> 421 <context-group name="null">
429 <context context-type="linenumber">8</context> 422 <context context-type="linenumber">12</context>
430 </context-group> 423 </context-group>
431 </trans-unit> 424 </trans-unit>
432 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 425 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -436,15 +429,11 @@
436 <context context-type="linenumber">7</context> 429 <context context-type="linenumber">7</context>
437 </context-group> 430 </context-group>
438 </trans-unit> 431 </trans-unit>
439 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 432 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
440 <source> 433 <source>Submit</source>
441 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 434 <target>Envia</target>
442</source>
443 <target>
444 Quant a la instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
445</target>
446 <context-group name="null"> 435 <context-group name="null">
447 <context context-type="linenumber">1</context> 436 <context context-type="linenumber">31</context>
448 </context-group> 437 </context-group>
449 </trans-unit> 438 </trans-unit>
450 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 439 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -458,47 +447,14 @@
458 <source>Terms</source> 447 <source>Terms</source>
459 <target>Termes</target> 448 <target>Termes</target>
460 <context-group name="null"> 449 <context-group name="null">
461 <context context-type="linenumber">44</context> 450 <context context-type="linenumber">39</context>
462 </context-group> 451 </context-group>
463 </trans-unit> 452 </trans-unit>
464 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 453 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
465 <source>User registration is allowed and</source> 454 <source>User registration is allowed and</source>
466 <target>El registre d'usuaris és permès i</target> 455 <target>El registre d'usuaris és permès i</target>
467 <context-group name="null"> 456 <context-group name="null">
468 <context context-type="linenumber">25</context> 457 <context context-type="linenumber">29</context>
469 </context-group>
470 </trans-unit>
471 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
472 <source>
473 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
474 </source>
475 <target>
476 aquesta instància proporciona una quota bàsica de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> d''espai per els vídeos dels seus usuaris.
477 </target>
478 <context-group name="null">
479 <context context-type="linenumber">27</context>
480 </context-group>
481 </trans-unit>
482 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
483 <source>
484 this instance provides unlimited space for the videos of its users.
485 </source>
486 <target>
487 aquesta instància proporciona espai il·limitat per els vídeos del seus usuaris.
488 </target>
489 <context-group name="null">
490 <context context-type="linenumber">31</context>
491 </context-group>
492 </trans-unit>
493 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
494 <source>
495 User registration is currently not allowed.
496 </source>
497 <target>
498 El registre d'usuaris actualment no és permès.
499 </target>
500 <context-group name="null">
501 <context context-type="linenumber">36</context>
502 </context-group> 458 </context-group>
503 </trans-unit> 459 </trans-unit>
504 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 460 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -696,19 +652,6 @@
696 <context context-type="linenumber">83</context> 652 <context context-type="linenumber">83</context>
697 </context-group> 653 </context-group>
698 </trans-unit> 654 </trans-unit>
699 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
700 <source>
701 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
702 In the meantime, we want to test different ideas related to this issue:
703 </source>
704 <target>
705 PeerTube només està en fase beta i vol oferir les millors contramesures possibles en el moment de llançar el estable.
706     Mentrestant, volem provar diferents idees relacionades amb aquest tema:
707 </target>
708 <context-group name="null">
709 <context context-type="linenumber">85</context>
710 </context-group>
711 </trans-unit>
712 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 655 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
713 <source>Set a limit to the number of peers sent by the tracker</source> 656 <source>Set a limit to the number of peers sent by the tracker</source>
714 <target>Estableix un límit al nombre de punts enviats pel rastrejador</target> 657 <target>Estableix un límit al nombre de punts enviats pel rastrejador</target>
@@ -748,14 +691,14 @@
748 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 691 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
749 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscriptors</target> 692 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscriptors</target>
750 <context-group name="null"> 693 <context-group name="null">
751 <context context-type="linenumber">12</context> 694 <context context-type="linenumber">24</context>
752 </context-group> 695 </context-group>
753 </trans-unit> 696 </trans-unit>
754 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 697 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
755 <source>Video channels</source> 698 <source>Video channels</source>
756 <target>Canals de vídeo</target> 699 <target>Canals de vídeo</target>
757 <context-group name="null"> 700 <context-group name="null">
758 <context context-type="linenumber">19</context> 701 <context context-type="linenumber">31</context>
759 </context-group> 702 </context-group>
760 </trans-unit> 703 </trans-unit>
761 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 704 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -797,42 +740,42 @@
797 <source>Short description</source> 740 <source>Short description</source>
798 <target>Descripció curta</target> 741 <target>Descripció curta</target>
799 <context-group name="null"> 742 <context-group name="null">
800 <context context-type="linenumber">22</context> 743 <context context-type="linenumber">21</context>
801 </context-group> 744 </context-group>
802 </trans-unit> 745 </trans-unit>
803 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 746 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
804 <source>Default client route</source> 747 <source>Default client route</source>
805 <target>Ruta per defecte del client</target> 748 <target>Ruta per defecte del client</target>
806 <context-group name="null"> 749 <context-group name="null">
807 <context context-type="linenumber">55</context> 750 <context context-type="linenumber">48</context>
808 </context-group> 751 </context-group>
809 </trans-unit> 752 </trans-unit>
810 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 753 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
811 <source>Videos Trending</source> 754 <source>Videos Trending</source>
812 <target>Vídeos tendència</target> 755 <target>Vídeos tendència</target>
813 <context-group name="null"> 756 <context-group name="null">
814 <context context-type="linenumber">59</context> 757 <context context-type="linenumber">52</context>
815 </context-group> 758 </context-group>
816 </trans-unit> 759 </trans-unit>
817 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 760 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
818 <source>Videos Recently Added</source> 761 <source>Videos Recently Added</source>
819 <target>Vídeos afegits fa poc</target> 762 <target>Vídeos afegits fa poc</target>
820 <context-group name="null"> 763 <context-group name="null">
821 <context context-type="linenumber">60</context> 764 <context context-type="linenumber">53</context>
822 </context-group> 765 </context-group>
823 </trans-unit> 766 </trans-unit>
824 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 767 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
825 <source>Local videos</source> 768 <source>Local videos</source>
826 <target>Vídeos locals</target> 769 <target>Vídeos locals</target>
827 <context-group name="null"> 770 <context-group name="null">
828 <context context-type="linenumber">61</context> 771 <context context-type="linenumber">54</context>
829 </context-group> 772 </context-group>
830 </trans-unit> 773 </trans-unit>
831 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 774 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
832 <source>Policy on videos containing sensitive content</source> 775 <source>Policy on videos containing sensitive content</source>
833 <target>Política sobre vídeos que contenen contingut sensible</target> 776 <target>Política sobre vídeos que contenen contingut sensible</target>
834 <context-group name="null"> 777 <context-group name="null">
835 <context context-type="linenumber">70</context> 778 <context context-type="linenumber">61</context>
836 </context-group> 779 </context-group>
837 </trans-unit> 780 </trans-unit>
838 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 781 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -867,42 +810,42 @@
867 <source>Signup enabled</source> 810 <source>Signup enabled</source>
868 <target>Registre activat</target> 811 <target>Registre activat</target>
869 <context-group name="null"> 812 <context-group name="null">
870 <context context-type="linenumber">92</context> 813 <context context-type="linenumber">84</context>
871 </context-group> 814 </context-group>
872 </trans-unit> 815 </trans-unit>
873 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 816 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
874 <source>Signup limit</source> 817 <source>Signup limit</source>
875 <target>Limit de registres</target> 818 <target>Limit de registres</target>
876 <context-group name="null"> 819 <context-group name="null">
877 <context context-type="linenumber">101</context> 820 <context context-type="linenumber">96</context>
878 </context-group>
879 </trans-unit>
880 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
881 <source>Administrator</source>
882 <target>Administrador</target>
883 <context-group name="null">
884 <context context-type="linenumber">123</context>
885 </context-group>
886 </trans-unit>
887 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
888 <source>Admin email</source>
889 <target>Correu del Administrador</target>
890 <context-group name="null">
891 <context context-type="linenumber">126</context>
892 </context-group> 821 </context-group>
893 </trans-unit> 822 </trans-unit>
894 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 823 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
895 <source>Users</source> 824 <source>Users</source>
896 <target>Usuaris</target> 825 <target>Usuaris</target>
897 <context-group name="null"> 826 <context-group name="null">
898 <context context-type="linenumber">136</context> 827 <context context-type="linenumber">105</context>
899 </context-group> 828 </context-group>
900 </trans-unit> 829 </trans-unit>
901 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 830 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
902 <source>User default video quota</source> 831 <source>User default video quota</source>
903 <target>Quota de vídeo per defecte de l'usuari</target> 832 <target>Quota de vídeo per defecte de l'usuari</target>
904 <context-group name="null"> 833 <context-group name="null">
905 <context context-type="linenumber">139</context> 834 <context context-type="linenumber">109</context>
835 </context-group>
836 </trans-unit>
837 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
838 <source>Administrator</source>
839 <target>Administrador</target>
840 <context-group name="null">
841 <context context-type="linenumber">155</context>
842 </context-group>
843 </trans-unit>
844 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
845 <source>Admin email</source>
846 <target>Correu del Administrador</target>
847 <context-group name="null">
848 <context context-type="linenumber">158</context>
906 </context-group> 849 </context-group>
907 </trans-unit> 850 </trans-unit>
908 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 851 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -916,112 +859,112 @@
916 <source>Twitter</source> 859 <source>Twitter</source>
917 <target>Twitter</target> 860 <target>Twitter</target>
918 <context-group name="null"> 861 <context-group name="null">
919 <context context-type="linenumber">170</context> 862 <context context-type="linenumber">178</context>
920 </context-group> 863 </context-group>
921 </trans-unit> 864 </trans-unit>
922 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 865 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
923 <source>Your Twitter username</source> 866 <source>Your Twitter username</source>
924 <target>El teu nom d'usuari de Twitter</target> 867 <target>El teu nom d'usuari de Twitter</target>
925 <context-group name="null"> 868 <context-group name="null">
926 <context context-type="linenumber">173</context> 869 <context context-type="linenumber">184</context>
927 </context-group> 870 </context-group>
928 </trans-unit> 871 </trans-unit>
929 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 872 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
930 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 873 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
931 <target>Indica el compte de Twitter del lloc web o plataforma en què es va publicar el contingut.</target> 874 <target>Indica el compte de Twitter del lloc web o plataforma en què es va publicar el contingut.</target>
932 <context-group name="null"> 875 <context-group name="null">
933 <context context-type="linenumber">176</context> 876 <context context-type="linenumber">187</context>
934 </context-group> 877 </context-group>
935 </trans-unit> 878 </trans-unit>
936 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 879 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
937 <source>Instance whitelisted by Twitter</source> 880 <source>Instance whitelisted by Twitter</source>
938 <target>Instància a la llista blanca de Twitter</target> 881 <target>Instància a la llista blanca de Twitter</target>
939 <context-group name="null"> 882 <context-group name="null">
940 <context context-type="linenumber">189</context> 883 <context context-type="linenumber">199</context>
941 </context-group> 884 </context-group>
942 </trans-unit> 885 </trans-unit>
943 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 886 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
944 <source>Services</source> 887 <source>Services</source>
945 <target>Serveis</target> 888 <target>Serveis</target>
946 <context-group name="null"> 889 <context-group name="null">
947 <context context-type="linenumber">168</context> 890 <context context-type="linenumber">176</context>
948 </context-group> 891 </context-group>
949 </trans-unit> 892 </trans-unit>
950 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 893 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
951 <source>Transcoding</source> 894 <source>Transcoding</source>
952 <target>Transcodificació</target> 895 <target>Transcodificació</target>
953 <context-group name="null"> 896 <context-group name="null">
954 <context context-type="linenumber">200</context> 897 <context context-type="linenumber">215</context>
955 </context-group> 898 </context-group>
956 </trans-unit> 899 </trans-unit>
957 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 900 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
958 <source>Transcoding enabled</source> 901 <source>Transcoding enabled</source>
959 <target>Transcodificació activada</target> 902 <target>Transcodificació activada</target>
960 <context-group name="null"> 903 <context-group name="null">
961 <context context-type="linenumber">204</context> 904 <context context-type="linenumber">221</context>
962 </context-group> 905 </context-group>
963 </trans-unit> 906 </trans-unit>
964 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 907 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
965 <source>If you disable transcoding, many videos from your users will not work!</source> 908 <source>If you disable transcoding, many videos from your users will not work!</source>
966 <target>Si desactives la transcodificació, molts vídeos dels teus usuaris no funcionaran.</target> 909 <target>Si desactives la transcodificació, molts vídeos dels teus usuaris no funcionaran.</target>
967 <context-group name="null"> 910 <context-group name="null">
968 <context context-type="linenumber">205</context> 911 <context context-type="linenumber">222</context>
969 </context-group> 912 </context-group>
970 </trans-unit> 913 </trans-unit>
971 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 914 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
972 <source>Transcoding threads</source> 915 <source>Transcoding threads</source>
973 <target>Subprocessos per la transcodificació</target> 916 <target>Subprocessos per la transcodificació</target>
974 <context-group name="null"> 917 <context-group name="null">
975 <context context-type="linenumber">211</context> 918 <context context-type="linenumber">237</context>
976 </context-group> 919 </context-group>
977 </trans-unit> 920 </trans-unit>
978 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 921 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
979 <source>Previews cache size</source> 922 <source>Previews cache size</source>
980 <target>Memòria cau per a visualitzacions prèvies</target> 923 <target>Memòria cau per a visualitzacions prèvies</target>
981 <context-group name="null"> 924 <context-group name="null">
982 <context context-type="linenumber">243</context> 925 <context context-type="linenumber">271</context>
983 </context-group> 926 </context-group>
984 </trans-unit> 927 </trans-unit>
985 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 928 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
986 <source>Customizations</source> 929 <source>Customizations</source>
987 <target>Personalitzacions</target> 930 <target>Personalitzacions</target>
988 <context-group name="null"> 931 <context-group name="null">
989 <context context-type="linenumber">264</context> 932 <context context-type="linenumber">289</context>
990 </context-group> 933 </context-group>
991 </trans-unit> 934 </trans-unit>
992 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 935 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
993 <source>JavaScript</source> 936 <source>JavaScript</source>
994 <target>JavaScript</target> 937 <target>JavaScript</target>
995 <context-group name="null"> 938 <context-group name="null">
996 <context context-type="linenumber">267</context> 939 <context context-type="linenumber">294</context>
997 </context-group> 940 </context-group>
998 </trans-unit> 941 </trans-unit>
999 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 942 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1000 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 943 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1001 <target>Escriu directament el codi JavaScript.&lt;br /&gt;Exemple: &lt;pre&gt;console.log('la meva instància és sorprenent');&lt;/pre&gt;</target> 944 <target>Escriu directament el codi JavaScript.&lt;br /&gt;Exemple: &lt;pre&gt;console.log('la meva instància és sorprenent');&lt;/pre&gt;</target>
1002 <context-group name="null"> 945 <context-group name="null">
1003 <context context-type="linenumber">270</context> 946 <context context-type="linenumber">297</context>
1004 </context-group> 947 </context-group>
1005 </trans-unit> 948 </trans-unit>
1006 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 949 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1007 <source>Advanced configuration</source> 950 <source>Advanced configuration</source>
1008 <target>Configuració avançada</target> 951 <target>Configuració avançada</target>
1009 <context-group name="null"> 952 <context-group name="null">
1010 <context context-type="linenumber">197</context> 953 <context context-type="linenumber">212</context>
1011 </context-group> 954 </context-group>
1012 </trans-unit> 955 </trans-unit>
1013 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 956 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1014 <source>Update configuration</source> 957 <source>Update configuration</source>
1015 <target>Actualitza la configuració</target> 958 <target>Actualitza la configuració</target>
1016 <context-group name="null"> 959 <context-group name="null">
1017 <context context-type="linenumber">314</context> 960 <context context-type="linenumber">340</context>
1018 </context-group> 961 </context-group>
1019 </trans-unit> 962 </trans-unit>
1020 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 963 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1021 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 964 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1022 <target>Sembla que la configuració no és vàlida. Cerca possibles errors a les diferents pestanyes.</target> 965 <target>Sembla que la configuració no és vàlida. Cerca possibles errors a les diferents pestanyes.</target>
1023 <context-group name="null"> 966 <context-group name="null">
1024 <context context-type="linenumber">315</context> 967 <context context-type="linenumber">341</context>
1025 </context-group> 968 </context-group>
1026 </trans-unit> 969 </trans-unit>
1027 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 970 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1104,14 +1047,14 @@
1104 <source>Score</source> 1047 <source>Score</source>
1105 <target>Puntuació</target> 1048 <target>Puntuació</target>
1106 <context-group name="null"> 1049 <context-group name="null">
1107 <context context-type="linenumber">8</context> 1050 <context context-type="linenumber">17</context>
1108 </context-group> 1051 </context-group>
1109 </trans-unit> 1052 </trans-unit>
1110 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1053 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1111 <source>Host</source> 1054 <source>Host</source>
1112 <target>Amfitrió</target> 1055 <target>Amfitrió</target>
1113 <context-group name="null"> 1056 <context-group name="null">
1114 <context context-type="linenumber">8</context> 1057 <context context-type="linenumber">19</context>
1115 </context-group> 1058 </context-group>
1116 </trans-unit> 1059 </trans-unit>
1117 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1060 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1202,7 +1145,7 @@
1202 <source>Role</source> 1145 <source>Role</source>
1203 <target>Rol</target> 1146 <target>Rol</target>
1204 <context-group name="null"> 1147 <context-group name="null">
1205 <context context-type="linenumber">20</context> 1148 <context context-type="linenumber">43</context>
1206 </context-group> 1149 </context-group>
1207 </trans-unit> 1150 </trans-unit>
1208 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1151 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1218,13 +1161,6 @@
1218 <context context-type="linenumber">65</context> 1161 <context context-type="linenumber">65</context>
1219 </context-group> 1162 </context-group>
1220 </trans-unit> 1163 </trans-unit>
1221 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1222 <source>Reason...</source>
1223 <target>Motiu...</target>
1224 <context-group name="null">
1225 <context context-type="linenumber">11</context>
1226 </context-group>
1227 </trans-unit>
1228 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1164 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1229 <source>Users list</source> 1165 <source>Users list</source>
1230 <target>Llista d'usuaris</target> 1166 <target>Llista d'usuaris</target>
@@ -1236,7 +1172,14 @@
1236 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1172 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1237 <target>Nom d'usuari <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1173 <target>Nom d'usuari <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1238 <context-group name="null"> 1174 <context-group name="null">
1239 <context context-type="linenumber">17</context> 1175 <context context-type="linenumber">40</context>
1176 </context-group>
1177 </trans-unit>
1178 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1179 <source>Go to the account page</source>
1180 <target>Anar a la pàgina del compte</target>
1181 <context-group name="null">
1182 <context context-type="linenumber">133</context>
1240 </context-group> 1183 </context-group>
1241 </trans-unit> 1184 </trans-unit>
1242 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1185 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
@@ -1274,20 +1217,6 @@
1274 <context context-type="linenumber">7</context> 1217 <context context-type="linenumber">7</context>
1275 </context-group> 1218 </context-group>
1276 </trans-unit> 1219 </trans-unit>
1277 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1278 <source>My settings</source>
1279 <target>La meva configuració</target>
1280 <context-group name="null">
1281 <context context-type="linenumber">3</context>
1282 </context-group>
1283 </trans-unit>
1284 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1285 <source>My videos</source>
1286 <target>Els meus vídeos</target>
1287 <context-group name="null">
1288 <context context-type="linenumber">14</context>
1289 </context-group>
1290 </trans-unit>
1291 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1220 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1292 <source>Video quota:</source> 1221 <source>Video quota:</source>
1293 <target>Quota de vídeo:</target> 1222 <target>Quota de vídeo:</target>
@@ -1299,21 +1228,14 @@
1299 <source>Profile</source> 1228 <source>Profile</source>
1300 <target>Perfil</target> 1229 <target>Perfil</target>
1301 <context-group name="null"> 1230 <context-group name="null">
1302 <context context-type="linenumber">8</context> 1231 <context context-type="linenumber">7</context>
1303 </context-group> 1232 </context-group>
1304 </trans-unit> 1233 </trans-unit>
1305 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1234 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1306 <source>Video settings</source> 1235 <source>Video settings</source>
1307 <target>Ajustos de vídeo</target> 1236 <target>Ajustos de vídeo</target>
1308 <context-group name="null"> 1237 <context-group name="null">
1309 <context context-type="linenumber">15</context> 1238 <context context-type="linenumber">16</context>
1310 </context-group>
1311 </trans-unit>
1312 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1313 <source>Submit</source>
1314 <target>Envia</target>
1315 <context-group name="null">
1316 <context context-type="linenumber">24</context>
1317 </context-group> 1239 </context-group>
1318 </trans-unit> 1240 </trans-unit>
1319 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1241 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1417,14 +1339,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1417 <source>Automatically plays video</source> 1339 <source>Automatically plays video</source>
1418 <target>Reprodueix vídeo automàticament</target> 1340 <target>Reprodueix vídeo automàticament</target>
1419 <context-group name="null"> 1341 <context-group name="null">
1420 <context context-type="linenumber">20</context> 1342 <context context-type="linenumber">28</context>
1421 </context-group> 1343 </context-group>
1422 </trans-unit> 1344 </trans-unit>
1423 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 1345 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1424 <source>Save</source> 1346 <source>Save</source>
1425 <target>Desa</target> 1347 <target>Desa</target>
1426 <context-group name="null"> 1348 <context-group name="null">
1427 <context context-type="linenumber">23</context> 1349 <context context-type="linenumber">32</context>
1428 </context-group> 1350 </context-group>
1429 </trans-unit> 1351 </trans-unit>
1430 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 1352 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1505,14 +1427,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1505 <source>Publish will be available when upload is finished</source> 1427 <source>Publish will be available when upload is finished</source>
1506 <target>La publicació estarà disponible quan finalitzi la càrrega</target> 1428 <target>La publicació estarà disponible quan finalitzi la càrrega</target>
1507 <context-group name="null"> 1429 <context-group name="null">
1508 <context context-type="linenumber">48</context> 1430 <context context-type="linenumber">58</context>
1509 </context-group> 1431 </context-group>
1510 </trans-unit> 1432 </trans-unit>
1511 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1433 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1512 <source>Publish</source> 1434 <source>Publish</source>
1513 <target>Publica</target> 1435 <target>Publica</target>
1514 <context-group name="null"> 1436 <context-group name="null">
1515 <context context-type="linenumber">55</context> 1437 <context context-type="linenumber">65</context>
1516 </context-group> 1438 </context-group>
1517 </trans-unit> 1439 </trans-unit>
1518 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 1440 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -1568,7 +1490,7 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1568 <source>Wait transcoding before publishing the video</source> 1490 <source>Wait transcoding before publishing the video</source>
1569 <target>Espera la transcodificació abans de publicar el vídeo</target> 1491 <target>Espera la transcodificació abans de publicar el vídeo</target>
1570 <context-group name="null"> 1492 <context-group name="null">
1571 <context context-type="linenumber">130</context> 1493 <context context-type="linenumber">131</context>
1572 </context-group> 1494 </context-group>
1573 </trans-unit> 1495 </trans-unit>
1574 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 1496 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1582,14 +1504,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1582 <source>Upload thumbnail</source> 1504 <source>Upload thumbnail</source>
1583 <target>Puja miniatura</target> 1505 <target>Puja miniatura</target>
1584 <context-group name="null"> 1506 <context-group name="null">
1585 <context context-type="linenumber">195</context> 1507 <context context-type="linenumber">196</context>
1586 </context-group> 1508 </context-group>
1587 </trans-unit> 1509 </trans-unit>
1588 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 1510 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1589 <source>Upload preview</source> 1511 <source>Upload preview</source>
1590 <target>Previsualitza la càrrega</target> 1512 <target>Previsualitza la càrrega</target>
1591 <context-group name="null"> 1513 <context-group name="null">
1592 <context context-type="linenumber">202</context> 1514 <context context-type="linenumber">203</context>
1593 </context-group> 1515 </context-group>
1594 </trans-unit> 1516 </trans-unit>
1595 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1517 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1603,14 +1525,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1603 <source>Short text to tell people how they can support you (membership platform...).</source> 1525 <source>Short text to tell people how they can support you (membership platform...).</source>
1604 <target>Text breu per dir a la gent com us poden ajudar (plataforma de pertinença ...).</target> 1526 <target>Text breu per dir a la gent com us poden ajudar (plataforma de pertinença ...).</target>
1605 <context-group name="null"> 1527 <context-group name="null">
1606 <context context-type="linenumber">209</context> 1528 <context context-type="linenumber">210</context>
1607 </context-group> 1529 </context-group>
1608 </trans-unit> 1530 </trans-unit>
1609 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 1531 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1610 <source>Advanced settings</source> 1532 <source>Advanced settings</source>
1611 <target>Ajustos avançats</target> 1533 <target>Ajustos avançats</target>
1612 <context-group name="null"> 1534 <context-group name="null">
1613 <context context-type="linenumber">190</context> 1535 <context context-type="linenumber">191</context>
1614 </context-group> 1536 </context-group>
1615 </trans-unit> 1537 </trans-unit>
1616 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 1538 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -1754,13 +1676,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1754 <context context-type="linenumber">123</context> 1676 <context context-type="linenumber">123</context>
1755 </context-group> 1677 </context-group>
1756 </trans-unit> 1678 </trans-unit>
1757 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1758 <source>Go to the account page</source>
1759 <target>Anar a la pàgina del compte</target>
1760 <context-group name="null">
1761 <context context-type="linenumber">133</context>
1762 </context-group>
1763 </trans-unit>
1764 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 1679 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
1765 <source>Show more</source> 1680 <source>Show more</source>
1766 <target>Veure més</target> 1681 <target>Veure més</target>
@@ -1811,25 +1726,18 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1811 <context context-type="linenumber">3</context> 1726 <context context-type="linenumber">3</context>
1812 </context-group> 1727 </context-group>
1813 </trans-unit> 1728 </trans-unit>
1814 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
1815 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
1816 <target>Pots fer comentaris a la pàgina de la teva instància on aquest vídeo està federat amb el teu compte de PeerTube o mitjançant qualsevol instància del fedivers que sigui compatible amb ActivityPub. Per exemple, amb Mastodon o Pleroma, pots escriure en el quadre de cerca &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; i torna a trobar el vídeo. S''estan treballant en poder fer comentaris directes a &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
1817 <context-group name="null">
1818 <context context-type="linenumber">8</context>
1819 </context-group>
1820 </trans-unit>
1821 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 1729 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
1822 <source>No comments.</source> 1730 <source>No comments.</source>
1823 <target>Cap comentari.</target> 1731 <target>Cap comentari.</target>
1824 <context-group name="null"> 1732 <context-group name="null">
1825 <context context-type="linenumber">18</context> 1733 <context context-type="linenumber">17</context>
1826 </context-group> 1734 </context-group>
1827 </trans-unit> 1735 </trans-unit>
1828 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 1736 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
1829 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 1737 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
1830 <target>Veure totes les <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respostes</target> 1738 <target>Veure totes les <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respostes</target>
1831 <context-group name="null"> 1739 <context-group name="null">
1832 <context context-type="linenumber">55</context> 1740 <context context-type="linenumber">54</context>
1833 </context-group> 1741 </context-group>
1834 </trans-unit> 1742 </trans-unit>
1835 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 1743 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -1840,7 +1748,7 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1840 Els comentaris estan desactivats. 1748 Els comentaris estan desactivats.
1841 </target> 1749 </target>
1842 <context-group name="null"> 1750 <context-group name="null">
1843 <context context-type="linenumber">64</context> 1751 <context context-type="linenumber">63</context>
1844 </context-group> 1752 </context-group>
1845 </trans-unit> 1753 </trans-unit>
1846 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 1754 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -1875,13 +1783,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1875 <context context-type="linenumber">14</context> 1783 <context context-type="linenumber">14</context>
1876 </context-group> 1784 </context-group>
1877 </trans-unit> 1785 </trans-unit>
1878 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
1879 <source>Error getting about from server</source>
1880 <target>S'ha produït un error en obtenir quant a del servidor</target>
1881 <context-group name="null">
1882 <context context-type="linenumber">1</context>
1883 </context-group>
1884 </trans-unit>
1885 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 1786 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
1886 <source>No description</source> 1787 <source>No description</source>
1887 <target>Sense descripció</target> 1788 <target>Sense descripció</target>
@@ -1903,55 +1804,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1903 <context context-type="linenumber">1</context> 1804 <context context-type="linenumber">1</context>
1904 </context-group> 1805 </context-group>
1905 </trans-unit> 1806 </trans-unit>
1906 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1907 <source>Error</source>
1908 <target>Error</target>
1909 <context-group name="null">
1910 <context context-type="linenumber">1</context>
1911 </context-group>
1912 </trans-unit>
1913 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
1914 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
1915 <target>Estableix personalitzacions <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
1916 <context-group name="null">
1917 <context context-type="linenumber">1</context>
1918 </context-group>
1919 </trans-unit>
1920 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
1921 <source>This could lead to security issues or bugs if you do not understand it. </source>
1922 <target>Això podria provocar problemes de seguretat o errors si no ho entens.</target>
1923 <context-group name="null">
1924 <context context-type="linenumber">1</context>
1925 </context-group>
1926 </trans-unit>
1927 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
1928 <source>Are you sure you want to update the configuration?</source>
1929 <target>Estàs segur que vols actualitzar la configuració?</target>
1930 <context-group name="null">
1931 <context context-type="linenumber">1</context>
1932 </context-group>
1933 </trans-unit>
1934 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
1935 <source>Please type</source>
1936 <target>Si us plau escriu</target>
1937 <context-group name="null">
1938 <context context-type="linenumber">1</context>
1939 </context-group>
1940 </trans-unit>
1941 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
1942 <source>to confirm.</source>
1943 <target>per confirmar.</target>
1944 <context-group name="null">
1945 <context context-type="linenumber">1</context>
1946 </context-group>
1947 </trans-unit>
1948 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1949 <source>Success</source>
1950 <target>Èxit</target>
1951 <context-group name="null">
1952 <context context-type="linenumber">1</context>
1953 </context-group>
1954 </trans-unit>
1955 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 1807 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
1956 <source>Configuration updated.</source> 1808 <source>Configuration updated.</source>
1957 <target>S'ha actualitzat la configuració.</target> 1809 <target>S'ha actualitzat la configuració.</target>
@@ -2064,13 +1916,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2064 <context context-type="linenumber">1</context> 1916 <context context-type="linenumber">1</context>
2065 </context-group> 1917 </context-group>
2066 </trans-unit> 1918 </trans-unit>
2067 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
2068 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
2069 <target>Usuari <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminat.</target>
2070 <context-group name="null">
2071 <context context-type="linenumber">1</context>
2072 </context-group>
2073 </trans-unit>
2074 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc"> 1919 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
2075 <source>Password updated.</source> 1920 <source>Password updated.</source>
2076 <target>Contrasenya actualitzada.</target> 1921 <target>Contrasenya actualitzada.</target>
@@ -2120,23 +1965,16 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2120 <context context-type="linenumber">1</context> 1965 <context context-type="linenumber">1</context>
2121 </context-group> 1966 </context-group>
2122 </trans-unit> 1967 </trans-unit>
2123 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 1968 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2124 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 1969 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2125 <target>Estàs segur que vols eliminar <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? També s''esborraràn tots els vídeos carregats en aquest canal.</target> 1970 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target>
2126 <context-group name="null">
2127 <context context-type="linenumber">1</context>
2128 </context-group>
2129 </trans-unit>
2130 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2131 <source>Please type the name of the video channel to confirm</source>
2132 <target>Escriu el nom del canal de vídeo per confirmar</target>
2133 <context-group name="null"> 1971 <context-group name="null">
2134 <context context-type="linenumber">1</context> 1972 <context context-type="linenumber">1</context>
2135 </context-group> 1973 </context-group>
2136 </trans-unit> 1974 </trans-unit>
2137 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 1975 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2138 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 1976 <source>My videos</source>
2139 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target> 1977 <target>Els meus vídeos</target>
2140 <context-group name="null"> 1978 <context-group name="null">
2141 <context context-type="linenumber">1</context> 1979 <context context-type="linenumber">1</context>
2142 </context-group> 1980 </context-group>
@@ -2197,6 +2035,13 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2197 <context context-type="linenumber">1</context> 2035 <context context-type="linenumber">1</context>
2198 </context-group> 2036 </context-group>
2199 </trans-unit> 2037 </trans-unit>
2038 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2039 <source>My settings</source>
2040 <target>La meva configuració</target>
2041 <context-group name="null">
2042 <context context-type="linenumber">1</context>
2043 </context-group>
2044 </trans-unit>
2200 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2045 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2201 <source>Unable to find user id or verification string.</source> 2046 <source>Unable to find user id or verification string.</source>
2202 <target>No es pot trobar l'identificador d'usuari ni la cadena de verificació.</target> 2047 <target>No es pot trobar l'identificador d'usuari ni la cadena de verificació.</target>
@@ -2220,6 +2065,13 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2220 <context context-type="linenumber">1</context> 2065 <context context-type="linenumber">1</context>
2221 </context-group> 2066 </context-group>
2222 </trans-unit> 2067 </trans-unit>
2068 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2069 <source>Error</source>
2070 <target>Error</target>
2071 <context-group name="null">
2072 <context context-type="linenumber">1</context>
2073 </context-group>
2074 </trans-unit>
2223 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2075 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2224 <source>You need to reconnect.</source> 2076 <source>You need to reconnect.</source>
2225 <target>Necessites tornar a connectar.</target> 2077 <target>Necessites tornar a connectar.</target>
@@ -2234,6 +2086,20 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2234 <context context-type="linenumber">1</context> 2086 <context context-type="linenumber">1</context>
2235 </context-group> 2087 </context-group>
2236 </trans-unit> 2088 </trans-unit>
2089 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2090 <source>Info</source>
2091 <target>Informació</target>
2092 <context-group name="null">
2093 <context context-type="linenumber">1</context>
2094 </context-group>
2095 </trans-unit>
2096 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2097 <source>Success</source>
2098 <target>Èxit</target>
2099 <context-group name="null">
2100 <context context-type="linenumber">1</context>
2101 </context-group>
2102 </trans-unit>
2237 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2103 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2238 <source>Your password has been successfully reset!</source> 2104 <source>Your password has been successfully reset!</source>
2239 <target>La contrasenya s'ha restablit correctament.</target> 2105 <target>La contrasenya s'ha restablit correctament.</target>
@@ -2339,6 +2205,20 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2339 <context context-type="linenumber">1</context> 2205 <context context-type="linenumber">1</context>
2340 </context-group> 2206 </context-group>
2341 </trans-unit> 2207 </trans-unit>
2208 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2209 <source>Email is required.</source>
2210 <target>Es requereix un correu electrònic.</target>
2211 <context-group name="null">
2212 <context context-type="linenumber">1</context>
2213 </context-group>
2214 </trans-unit>
2215 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2216 <source>Email must be valid.</source>
2217 <target>El correu electrònic ha de ser vàlid.</target>
2218 <context-group name="null">
2219 <context context-type="linenumber">1</context>
2220 </context-group>
2221 </trans-unit>
2342 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2222 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2343 <source>Username is required.</source> 2223 <source>Username is required.</source>
2344 <target>Es requereix nom d'usuari.</target> 2224 <target>Es requereix nom d'usuari.</target>
@@ -2360,41 +2240,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2360 <context context-type="linenumber">1</context> 2240 <context context-type="linenumber">1</context>
2361 </context-group> 2241 </context-group>
2362 </trans-unit> 2242 </trans-unit>
2363 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2364 <source>Username must be at least 3 characters long.</source>
2365 <target>El nom d'usuari ha de tenir com a mínim 3 caràcters.</target>
2366 <context-group name="null">
2367 <context context-type="linenumber">1</context>
2368 </context-group>
2369 </trans-unit>
2370 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2371 <source>Username cannot be more than 20 characters long.</source>
2372 <target>El nom d'usuari no pot tenir més de 20 caràcters.</target>
2373 <context-group name="null">
2374 <context context-type="linenumber">1</context>
2375 </context-group>
2376 </trans-unit>
2377 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2378 <source>Username should be only lowercase alphanumeric characters.</source>
2379 <target>El nom d'usuari ha de ser només caràcters alfanumèrics en minúscules.</target>
2380 <context-group name="null">
2381 <context context-type="linenumber">1</context>
2382 </context-group>
2383 </trans-unit>
2384 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2385 <source>Email is required.</source>
2386 <target>Es requereix un correu electrònic.</target>
2387 <context-group name="null">
2388 <context context-type="linenumber">1</context>
2389 </context-group>
2390 </trans-unit>
2391 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2392 <source>Email must be valid.</source>
2393 <target>El correu electrònic ha de ser vàlid.</target>
2394 <context-group name="null">
2395 <context context-type="linenumber">1</context>
2396 </context-group>
2397 </trans-unit>
2398 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2243 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2399 <source>Password must be at least 6 characters long.</source> 2244 <source>Password must be at least 6 characters long.</source>
2400 <target>La contrasenya ha de tenir com a mínim 6 caràcters.</target> 2245 <target>La contrasenya ha de tenir com a mínim 6 caràcters.</target>
@@ -2444,20 +2289,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2444 <context context-type="linenumber">1</context> 2289 <context context-type="linenumber">1</context>
2445 </context-group> 2290 </context-group>
2446 </trans-unit> 2291 </trans-unit>
2447 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2448 <source>Display name must be at least 3 characters long.</source>
2449 <target>El nom de visualització ha de tenir un mínim de 3 caràcters.</target>
2450 <context-group name="null">
2451 <context context-type="linenumber">1</context>
2452 </context-group>
2453 </trans-unit>
2454 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
2455 <source>Display name cannot be more than 120 characters long.</source>
2456 <target>El nom de visualització no pot tenir més de 120 caràcters.</target>
2457 <context-group name="null">
2458 <context context-type="linenumber">1</context>
2459 </context-group>
2460 </trans-unit>
2461 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 2292 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2462 <source>Description must be at least 3 characters long.</source> 2293 <source>Description must be at least 3 characters long.</source>
2463 <target>La descripció ha de tenir almenys 3 caràcters de longitud.</target> 2294 <target>La descripció ha de tenir almenys 3 caràcters de longitud.</target>
@@ -2465,13 +2296,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2465 <context context-type="linenumber">1</context> 2296 <context context-type="linenumber">1</context>
2466 </context-group> 2297 </context-group>
2467 </trans-unit> 2298 </trans-unit>
2468 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
2469 <source>Description cannot be more than 250 characters long.</source>
2470 <target>La descripció no pot tenir més de 250 caràcters.</target>
2471 <context-group name="null">
2472 <context context-type="linenumber">1</context>
2473 </context-group>
2474 </trans-unit>
2475 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 2299 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
2476 <source>Report reason is required.</source> 2300 <source>Report reason is required.</source>
2477 <target>Cal un motiu del informe.</target> 2301 <target>Cal un motiu del informe.</target>
@@ -2486,20 +2310,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2486 <context context-type="linenumber">1</context> 2310 <context context-type="linenumber">1</context>
2487 </context-group> 2311 </context-group>
2488 </trans-unit> 2312 </trans-unit>
2489 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
2490 <source>Report reason cannot be more than 300 characters long.</source>
2491 <target>El motiu de l'informe no pot tenir més de 300 caràcters.</target>
2492 <context-group name="null">
2493 <context context-type="linenumber">1</context>
2494 </context-group>
2495 </trans-unit>
2496 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
2497 <source>Description cannot be more than 500 characters long.</source>
2498 <target>La descripció no pot tenir més de 500 caràcters.</target>
2499 <context-group name="null">
2500 <context context-type="linenumber">1</context>
2501 </context-group>
2502 </trans-unit>
2503 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 2313 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2504 <source>Support text must be at least 3 characters long.</source> 2314 <source>Support text must be at least 3 characters long.</source>
2505 <target>El text de suport ha de tenir un mínim de 3 caràcters.</target> 2315 <target>El text de suport ha de tenir un mínim de 3 caràcters.</target>
@@ -2507,13 +2317,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2507 <context context-type="linenumber">1</context> 2317 <context context-type="linenumber">1</context>
2508 </context-group> 2318 </context-group>
2509 </trans-unit> 2319 </trans-unit>
2510 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813">
2511 <source>Support text cannot be more than 500 characters long.</source>
2512 <target>El text de suport no pot tenir més de 500 caràcters.</target>
2513 <context-group name="null">
2514 <context context-type="linenumber">1</context>
2515 </context-group>
2516 </trans-unit>
2517 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 2320 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
2518 <source>Comment is required.</source> 2321 <source>Comment is required.</source>
2519 <target>Es requereix comentari.</target> 2322 <target>Es requereix comentari.</target>
@@ -2605,13 +2408,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2605 <context context-type="linenumber">1</context> 2408 <context context-type="linenumber">1</context>
2606 </context-group> 2409 </context-group>
2607 </trans-unit> 2410 </trans-unit>
2608 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b">
2609 <source>Video support cannot be more than 500 characters long.</source>
2610 <target>La compatibilitat de vídeo no pot tenir més de 500 caràcters.</target>
2611 <context-group name="null">
2612 <context context-type="linenumber">1</context>
2613 </context-group>
2614 </trans-unit>
2615 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 2411 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
2616 <source>A date is required to schedule video update.</source> 2412 <source>A date is required to schedule video update.</source>
2617 <target>Es requereix una data per programar l'actualització de vídeo.</target> 2413 <target>Es requereix una data per programar l'actualització de vídeo.</target>
@@ -3109,6 +2905,13 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
3109 <context context-type="linenumber">1</context> 2905 <context context-type="linenumber">1</context>
3110 </context-group> 2906 </context-group>
3111 </trans-unit> 2907 </trans-unit>
2908 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
2909 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
2910 <target>Usuari <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminat.</target>
2911 <context-group name="null">
2912 <context context-type="linenumber">1</context>
2913 </context-group>
2914 </trans-unit>
3112 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 2915 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
3113 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 2916 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
3114 <target>La sol·licitud és massa gran per al servidor. Contacta amb el teu administrador si vols augmentar la mida del límit.</target> 2917 <target>La sol·licitud és massa gran per al servidor. Contacta amb el teu administrador si vols augmentar la mida del límit.</target>
@@ -3137,13 +2940,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
3137 <context context-type="linenumber">1</context> 2940 <context context-type="linenumber">1</context>
3138 </context-group> 2941 </context-group>
3139 </trans-unit> 2942 </trans-unit>
3140 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
3141 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
3142 <target>El registre per <x id="INTERPOLATION" equiv-text="{{username}}"/> és complet.</target>
3143 <context-group name="null">
3144 <context context-type="linenumber">1</context>
3145 </context-group>
3146 </trans-unit>
3147 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264"> 2943 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
3148 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source> 2944 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
3149 <target>Però es perdran les dades associades (etiquetes, descripció ...), estàs segur que vols deixar aquesta pàgina?</target> 2945 <target>Però es perdran les dades associades (etiquetes, descripció ...), estàs segur que vols deixar aquesta pàgina?</target>
@@ -3158,13 +2954,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
3158 <context context-type="linenumber">1</context> 2954 <context context-type="linenumber">1</context>
3159 </context-group> 2955 </context-group>
3160 </trans-unit> 2956 </trans-unit>
3161 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3162 <source>Info</source>
3163 <target>Informació</target>
3164 <context-group name="null">
3165 <context context-type="linenumber">1</context>
3166 </context-group>
3167 </trans-unit>
3168 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 2957 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3169 <source>Upload cancelled</source> 2958 <source>Upload cancelled</source>
3170 <target>Pujada cancel·lada</target> 2959 <target>Pujada cancel·lada</target>
diff --git a/client/src/locale/target/angular_cs_CZ.xml b/client/src/locale/target/angular_cs_CZ.xml
index deed0d6b1..7b6f99ddb 100644
--- a/client/src/locale/target/angular_cs_CZ.xml
+++ b/client/src/locale/target/angular_cs_CZ.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Zvolte měsíc</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Zvolte rok</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -101,6 +115,20 @@
101 <context context-type="linenumber">6</context> 115 <context context-type="linenumber">6</context>
102 </context-group> 116 </context-group>
103 </trans-unit> 117 </trans-unit>
118 <trans-unit id="ngb.timepicker.increment-hours">
119 <source>Increment hours</source>
120 <target>Zvýšit hodiny</target>
121 <context-group name="null">
122 <context context-type="linenumber">9</context>
123 </context-group>
124 </trans-unit>
125 <trans-unit id="ngb.timepicker.HH">
126 <source>HH</source>
127 <target>HH</target>
128 <context-group name="null">
129 <context context-type="linenumber">12</context>
130 </context-group>
131 </trans-unit>
104 <trans-unit id="ngb.timepicker.hours"> 132 <trans-unit id="ngb.timepicker.hours">
105 <source>Hours</source> 133 <source>Hours</source>
106 <target>Hodiny</target> 134 <target>Hodiny</target>
@@ -108,6 +136,27 @@
108 <context context-type="linenumber">14</context> 136 <context context-type="linenumber">14</context>
109 </context-group> 137 </context-group>
110 </trans-unit> 138 </trans-unit>
139 <trans-unit id="ngb.timepicker.decrement-hours">
140 <source>Decrement hours</source>
141 <target>Snížit hodiny</target>
142 <context-group name="null">
143 <context context-type="linenumber">19</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="ngb.timepicker.increment-minutes">
147 <source>Increment minutes</source>
148 <target>Zvýšit minuty</target>
149 <context-group name="null">
150 <context context-type="linenumber">28</context>
151 </context-group>
152 </trans-unit>
153 <trans-unit id="ngb.timepicker.MM">
154 <source>MM</source>
155 <target>MM</target>
156 <context-group name="null">
157 <context context-type="linenumber">31</context>
158 </context-group>
159 </trans-unit>
111 <trans-unit id="ngb.timepicker.minutes"> 160 <trans-unit id="ngb.timepicker.minutes">
112 <source>Minutes</source> 161 <source>Minutes</source>
113 <target>Minuty</target> 162 <target>Minuty</target>
@@ -115,6 +164,27 @@
115 <context context-type="linenumber">33</context> 164 <context context-type="linenumber">33</context>
116 </context-group> 165 </context-group>
117 </trans-unit> 166 </trans-unit>
167 <trans-unit id="ngb.timepicker.decrement-minutes">
168 <source>Decrement minutes</source>
169 <target>Snížit minuty</target>
170 <context-group name="null">
171 <context context-type="linenumber">38</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="ngb.timepicker.increment-seconds">
175 <source>Increment seconds</source>
176 <target>Zvýšit sekundy</target>
177 <context-group name="null">
178 <context context-type="linenumber">47</context>
179 </context-group>
180 </trans-unit>
181 <trans-unit id="ngb.timepicker.SS">
182 <source>SS</source>
183 <target>SS</target>
184 <context-group name="null">
185 <context context-type="linenumber">50</context>
186 </context-group>
187 </trans-unit>
118 <trans-unit id="ngb.timepicker.seconds"> 188 <trans-unit id="ngb.timepicker.seconds">
119 <source>Seconds</source> 189 <source>Seconds</source>
120 <target>Sekundy</target> 190 <target>Sekundy</target>
@@ -122,6 +192,27 @@
122 <context context-type="linenumber">52</context> 192 <context context-type="linenumber">52</context>
123 </context-group> 193 </context-group>
124 </trans-unit> 194 </trans-unit>
195 <trans-unit id="ngb.timepicker.decrement-seconds">
196 <source>Decrement seconds</source>
197 <target>Snížit sekundy</target>
198 <context-group name="null">
199 <context context-type="linenumber">57</context>
200 </context-group>
201 </trans-unit>
202 <trans-unit id="ngb.timepicker.PM">
203 <source>PM</source>
204 <target>PM</target>
205 <context-group name="null">
206 <context context-type="linenumber">65</context>
207 </context-group>
208 </trans-unit>
209 <trans-unit id="ngb.timepicker.AM">
210 <source>AM</source>
211 <target>AM</target>
212 <context-group name="null">
213 <context context-type="linenumber">66</context>
214 </context-group>
215 </trans-unit>
125 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7"> 216 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
126 <source>Cancel</source> 217 <source>Cancel</source>
127 <target>Zrušit</target> 218 <target>Zrušit</target>
@@ -136,11 +227,25 @@
136 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
137 </context-group> 228 </context-group>
138 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Neveřejné</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Soukromé</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
139 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
140 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
141 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> zhlédnutí</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> zhlédnutí</target>
142 <context-group name="null"> 247 <context-group name="null">
143 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
144 </context-group> 249 </context-group>
145 </trans-unit> 250 </trans-unit>
146 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -154,7 +259,7 @@
154 <source>Edit</source> 259 <source>Edit</source>
155 <target>Upravit</target> 260 <target>Upravit</target>
156 <context-group name="null"> 261 <context-group name="null">
157 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
158 </context-group> 263 </context-group>
159 </trans-unit> 264 </trans-unit>
160 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -178,11 +283,112 @@
178 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
179 </context-group> 284 </context-group>
180 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Odebírat
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 Přestat odebírat
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>Pomocí úÄtu ActivityPub</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>Odebírat úÄtem na <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>Odebírat pÅ™es místní úÄet</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>Odebírat pÅ™es úÄet na Mastodonu:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>Použít syndikaÄní proud</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
354 <source>Subscribe via RSS</source>
355 <target>Odebírat přes RSS</target>
356 <context-group name="null">
357 <context context-type="linenumber">49</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
361 <source>
362 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
363 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
364 </source>
365 <target>
366 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Vzdálený odběr<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
367 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Vzdálená interakce<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
368 </target>
369 <context-group name="null">
370 <context context-type="linenumber">10</context>
371 </context-group>
372 </trans-unit>
373 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
374 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
375 <target>Tento kanál můžete odebírat z jakékoliv instance na fediverse používající ActivityPub. Například u Mastodonu nebo Pleromy můžete napsat URL adresu kanálu do vyhledávacího pole a tam zaÄít odebírat.</target>
376 <context-group name="null">
377 <context context-type="linenumber">17</context>
378 </context-group>
379 </trans-unit>
380 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
381 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
382 <target>S tímto videem můžete interagovat z jakékoliv instance na fediverse používající ActivityPub. Například u Mastodonu nebo Pleromy můžete napsat aktuální URL adresu do vyhledávacího pole a odtamtud interagovat.</target>
383 <context-group name="null">
384 <context context-type="linenumber">22</context>
385 </context-group>
386 </trans-unit>
181 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 387 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
182 <source>Video quota</source> 388 <source>Video quota</source>
183 <target>Limit na videa</target> 389 <target>Limit na videa</target>
184 <context-group name="null"> 390 <context-group name="null">
185 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
186 </context-group> 392 </context-group>
187 </trans-unit> 393 </trans-unit>
188 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -196,6 +402,37 @@
196 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
197 </context-group> 403 </context-group>
198 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>Zablokovat</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>Důvod...</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424Blokovaný uživatel se už nebude moci přihlásit.</target>
425 <context-group name="null">
426 <context context-type="linenumber">17</context>
427 </context-group>
428 </trans-unit>
429 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
430 <source>Ban this user</source>
431 <target>Zablokovat tohoto uživatele</target>
432 <context-group name="null">
433 <context context-type="linenumber">25</context>
434 </context-group>
435 </trans-unit>
199 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 436 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
200 <source> 437 <source>
201 Login 438 Login
@@ -207,6 +444,13 @@
207 <context context-type="linenumber">2</context> 444 <context context-type="linenumber">2</context>
208 </context-group> 445 </context-group>
209 </trans-unit> 446 </trans-unit>
447 <trans-unit id="ae3cb52bf2dee3101ee654812b5d16e8665a9453">
448 <source>Request new verification email.</source>
449 <target>Vyžádat nový ověřovací e-mail.</target>
450 <context-group name="null">
451 <context context-type="linenumber">12</context>
452 </context-group>
453 </trans-unit>
210 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194"> 454 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
211 <source>User</source> 455 <source>User</source>
212 <target>Uživatel</target> 456 <target>Uživatel</target>
@@ -216,7 +460,7 @@
216 </trans-unit> 460 </trans-unit>
217 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478"> 461 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478">
218 <source>Username or email address</source> 462 <source>Username or email address</source>
219 <target>Uživatelské jméno nebo email</target> 463 <target>Uživatelské jméno nebo e-mail</target>
220 <context-group name="null"> 464 <context-group name="null">
221 <context context-type="linenumber">15</context> 465 <context context-type="linenumber">15</context>
222 </context-group> 466 </context-group>
@@ -254,7 +498,7 @@
254 <source>Password</source> 498 <source>Password</source>
255 <target>Heslo</target> 499 <target>Heslo</target>
256 <context-group name="null"> 500 <context-group name="null">
257 <context context-type="linenumber">12</context> 501 <context context-type="linenumber">13</context>
258 </context-group> 502 </context-group>
259 </trans-unit> 503 </trans-unit>
260 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 504 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -268,7 +512,7 @@
268 <source>Login</source> 512 <source>Login</source>
269 <target>Přihlásit</target> 513 <target>Přihlásit</target>
270 <context-group name="null"> 514 <context-group name="null">
271 <context context-type="linenumber">38</context> 515 <context context-type="linenumber">36</context>
272 </context-group> 516 </context-group>
273 </trans-unit> 517 </trans-unit>
274 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 518 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -280,23 +524,23 @@
280 </trans-unit> 524 </trans-unit>
281 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 525 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
282 <source>Email</source> 526 <source>Email</source>
283 <target>Email</target> 527 <target>E-mail</target>
284 <context-group name="null"> 528 <context-group name="null">
285 <context context-type="linenumber">8</context> 529 <context context-type="linenumber">8</context>
286 </context-group> 530 </context-group>
287 </trans-unit> 531 </trans-unit>
288 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529"> 532 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
289 <source>Email address</source> 533 <source>Email address</source>
290 <target>Emailová adresa</target> 534 <target>E-mailová adresa</target>
291 <context-group name="null"> 535 <context-group name="null">
292 <context context-type="linenumber">10</context> 536 <context context-type="linenumber">10</context>
293 </context-group> 537 </context-group>
294 </trans-unit> 538 </trans-unit>
295 <trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55"> 539 <trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55">
296 <source>Send me an email to reset my password</source> 540 <source>Send me an email to reset my password</source>
297 <target>Poslat email pro resetování hesla</target> 541 <target>Poslat e-mail pro resetování hesla</target>
298 <context-group name="null"> 542 <context-group name="null">
299 <context context-type="linenumber">75</context> 543 <context context-type="linenumber">80</context>
300 </context-group> 544 </context-group>
301 </trans-unit> 545 </trans-unit>
302 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 546 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -349,25 +593,146 @@
349 <context context-type="linenumber">8</context> 593 <context context-type="linenumber">8</context>
350 </context-group> 594 </context-group>
351 </trans-unit> 595 </trans-unit>
596 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
597 <source>Example: jane_doe</source>
598 <target>Příklad: jana_novakova</target>
599 <context-group name="null">
600 <context context-type="linenumber">17</context>
601 </context-group>
602 </trans-unit>
603 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
604 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
605 <target>Je mi alespoň 16let a souhlasím s &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Podmínkami&lt;/a&gt; této instance</target>
606 <context-group name="null">
607 <context context-type="linenumber">55</context>
608 </context-group>
609 </trans-unit>
352 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 610 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
353 <source>Signup</source> 611 <source>Signup</source>
354 <target>Registrovat</target> 612 <target>Registrovat</target>
355 <context-group name="null"> 613 <context-group name="null">
356 <context context-type="linenumber">88</context> 614 <context context-type="linenumber">78</context>
615 </context-group>
616 </trans-unit>
617 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
618 <source>Features found on this instance</source>
619 <target>Funkce podporované touto instancí</target>
620 <context-group name="null">
621 <context context-type="linenumber">67</context>
622 </context-group>
623 </trans-unit>
624 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
625 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
626 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> výsledků</target>
627 <context-group name="null">
628 <context context-type="linenumber">5</context>
629 </context-group>
630 </trans-unit>
631 <trans-unit id="4c3960fb1d9b07d1db3b5bda3ee40019211830dc">
632 <source>
633 for <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
634 </source>
635 <target>
636 pro <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
637 </target>
638 <context-group name="null">
639 <context context-type="linenumber">6</context>
640 </context-group>
641 </trans-unit>
642 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
643 <source>
644 Filters
645 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
646 </source>
647 <target>
648 Filtry
649 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
650 </target>
651 <context-group name="null">
652 <context context-type="linenumber">16</context>
653 </context-group>
654 </trans-unit>
655 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
656 <source>
657 No results found
658 </source>
659 <target>
660 Nebyly nalezeny žádné výsledky
661 </target>
662 <context-group name="null">
663 <context context-type="linenumber">28</context>
664 </context-group>
665 </trans-unit>
666 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
667 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
668 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> odběratelů</target>
669 <context-group name="null">
670 <context context-type="linenumber">44</context>
671 </context-group>
672 </trans-unit>
673 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
674 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
675 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> zhlédnutí</target>
676 <context-group name="null">
677 <context context-type="linenumber">55</context>
357 </context-group> 678 </context-group>
358 </trans-unit> 679 </trans-unit>
359 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 680 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
360 <source>Change the language</source> 681 <source>Change the language</source>
361 <target>Změnit jazyk</target> 682 <target>Změnit jazyk</target>
362 <context-group name="null"> 683 <context-group name="null">
363 <context context-type="linenumber">88</context> 684 <context context-type="linenumber">86</context>
685 </context-group>
686 </trans-unit>
687 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
688 <source>
689 My public profile
690 </source>
691 <target>
692 Můj veřejný profil
693 </target>
694 <context-group name="null">
695 <context context-type="linenumber">16</context>
696 </context-group>
697 </trans-unit>
698 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
699 <source>
700 My account
701 </source>
702 <target>
703 Můj úÄet
704 </target>
705 <context-group name="null">
706 <context context-type="linenumber">20</context>
707 </context-group>
708 </trans-unit>
709 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
710 <source>
711 My videos
712 </source>
713 <target>
714 Moje videa
715 </target>
716 <context-group name="null">
717 <context context-type="linenumber">24</context>
718 </context-group>
719 </trans-unit>
720 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
721 <source>
722 Log out
723 </source>
724 <target>
725 Odhlásit
726 </target>
727 <context-group name="null">
728 <context context-type="linenumber">28</context>
364 </context-group> 729 </context-group>
365 </trans-unit> 730 </trans-unit>
366 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 731 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
367 <source>Create an account</source> 732 <source>Create an account</source>
368 <target>VytvoÅ™it úÄet</target> 733 <target>VytvoÅ™it úÄet</target>
369 <context-group name="null"> 734 <context-group name="null">
370 <context context-type="linenumber">39</context> 735 <context context-type="linenumber">37</context>
371 </context-group> 736 </context-group>
372 </trans-unit> 737 </trans-unit>
373 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 738 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -377,32 +742,53 @@
377 <context context-type="linenumber">24</context> 742 <context context-type="linenumber">24</context>
378 </context-group> 743 </context-group>
379 </trans-unit> 744 </trans-unit>
745 <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
746 <source>Subscriptions</source>
747 <target>Odběry</target>
748 <context-group name="null">
749 <context context-type="linenumber">45</context>
750 </context-group>
751 </trans-unit>
752 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
753 <source>Overview</source>
754 <target>Přehled</target>
755 <context-group name="null">
756 <context context-type="linenumber">50</context>
757 </context-group>
758 </trans-unit>
380 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 759 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
381 <source>Trending</source> 760 <source>Trending</source>
382 <target>Trendy</target> 761 <target>Trendy</target>
383 <context-group name="null"> 762 <context-group name="null">
384 <context context-type="linenumber">57</context> 763 <context context-type="linenumber">55</context>
385 </context-group> 764 </context-group>
386 </trans-unit> 765 </trans-unit>
387 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 766 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
388 <source>Recently added</source> 767 <source>Recently added</source>
389 <target>Nedávno přidané</target> 768 <target>Nedávno přidané</target>
390 <context-group name="null"> 769 <context-group name="null">
391 <context context-type="linenumber">62</context> 770 <context context-type="linenumber">60</context>
392 </context-group> 771 </context-group>
393 </trans-unit> 772 </trans-unit>
394 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 773 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
395 <source>Local</source> 774 <source>Local</source>
396 <target>Místní</target> 775 <target>Místní</target>
397 <context-group name="null"> 776 <context-group name="null">
398 <context context-type="linenumber">67</context> 777 <context context-type="linenumber">65</context>
778 </context-group>
779 </trans-unit>
780 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
781 <source>More</source>
782 <target>Další</target>
783 <context-group name="null">
784 <context context-type="linenumber">70</context>
399 </context-group> 785 </context-group>
400 </trans-unit> 786 </trans-unit>
401 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 787 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
402 <source>Administration</source> 788 <source>Administration</source>
403 <target>Administrace</target> 789 <target>Administrace</target>
404 <context-group name="null"> 790 <context-group name="null">
405 <context context-type="linenumber">76</context> 791 <context context-type="linenumber">74</context>
406 </context-group> 792 </context-group>
407 </trans-unit> 793 </trans-unit>
408 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 794 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -412,6 +798,20 @@
412 <context context-type="linenumber">25</context> 798 <context context-type="linenumber">25</context>
413 </context-group> 799 </context-group>
414 </trans-unit> 800 </trans-unit>
801 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
802 <source>Show keyboard shortcuts</source>
803 <target>Zobrazit klávesové zkratky</target>
804 <context-group name="null">
805 <context context-type="linenumber">89</context>
806 </context-group>
807 </trans-unit>
808 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
809 <source>Toggle dark interface</source>
810 <target>Přepnout tmavé rozhraní</target>
811 <context-group name="null">
812 <context context-type="linenumber">92</context>
813 </context-group>
814 </trans-unit>
415 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 815 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
416 <source>Search...</source> 816 <source>Search...</source>
417 <target>Hledat...</target> 817 <target>Hledat...</target>
@@ -426,6 +826,48 @@
426 <context context-type="linenumber">9</context> 826 <context context-type="linenumber">9</context>
427 </context-group> 827 </context-group>
428 </trans-unit> 828 </trans-unit>
829 <trans-unit id="5d43539fc358c3a548b9d487be821db73e2702ff">
830 <source>Sort</source>
831 <target>Seřadit</target>
832 <context-group name="null">
833 <context context-type="linenumber">6</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="98acac685fc4b2d35e5d0cf3cd224d247a756c3e">
837 <source>Published date</source>
838 <target>Datum publikace</target>
839 <context-group name="null">
840 <context context-type="linenumber">15</context>
841 </context-group>
842 </trans-unit>
843 <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
844 <source>Duration</source>
845 <target>Trvání</target>
846 <context-group name="null">
847 <context context-type="linenumber">24</context>
848 </context-group>
849 </trans-unit>
850 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
851 <source>Display sensitive content</source>
852 <target>Zobrazit citlivý obsah</target>
853 <context-group name="null">
854 <context context-type="linenumber">33</context>
855 </context-group>
856 </trans-unit>
857 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
858 <source>Yes</source>
859 <target>Ano</target>
860 <context-group name="null">
861 <context context-type="linenumber">37</context>
862 </context-group>
863 </trans-unit>
864 <trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd">
865 <source>No</source>
866 <target>Ne</target>
867 <context-group name="null">
868 <context context-type="linenumber">42</context>
869 </context-group>
870 </trans-unit>
429 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94"> 871 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
430 <source>Category</source> 872 <source>Category</source>
431 <target>Kategorie</target> 873 <target>Kategorie</target>
@@ -447,18 +889,87 @@
447 <context context-type="linenumber">182</context> 889 <context context-type="linenumber">182</context>
448 </context-group> 890 </context-group>
449 </trans-unit> 891 </trans-unit>
892 <trans-unit id="c8d58c4fbe23e51af3dc8f58cb4a81eac20739e8">
893 <source>All of these tags</source>
894 <target>Všechny tyto štítky</target>
895 <context-group name="null">
896 <context context-type="linenumber">82</context>
897 </context-group>
898 </trans-unit>
899 <trans-unit id="492d2bd18db0cba03f6d9e3b0c42b8639fbe51ab">
900 <source>One of these tags</source>
901 <target>Jeden z těchto štítků</target>
902 <context-group name="null">
903 <context context-type="linenumber">87</context>
904 </context-group>
905 </trans-unit>
906 <trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
907 <source>Filter</source>
908 <target>Filtr</target>
909 <context-group name="null">
910 <context context-type="linenumber">94</context>
911 </context-group>
912 </trans-unit>
913 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
914 <source>Display unlisted and private videos</source>
915 <target>Zobrazit neuvedená a soukromá videa</target>
916 <context-group name="null">
917 <context context-type="linenumber">14</context>
918 </context-group>
919 </trans-unit>
450 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 920 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
451 <source>No results.</source> 921 <source>No results.</source>
452 <target>Žádné výsledky.</target> 922 <target>Žádné výsledky.</target>
453 <context-group name="null"> 923 <context-group name="null">
454 <context context-type="linenumber">7</context> 924 <context context-type="linenumber">20</context>
925 </context-group>
926 </trans-unit>
927 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
928 <source>
929 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
930 </source>
931 <target>
932 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
933 </target>
934 <context-group name="null">
935 <context context-type="linenumber">6</context>
936 </context-group>
937 </trans-unit>
938 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
939 <source>
940 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
941 </source>
942 <target>
943 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
944 </target>
945 <context-group name="null">
946 <context context-type="linenumber">14</context>
947 </context-group>
948 </trans-unit>
949 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
950 <source>
951 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
952 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
953
954 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
955 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
956 </source>
957 <target>
958 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
959 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
960
961 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
962 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
963 </target>
964 <context-group name="null">
965 <context context-type="linenumber">22</context>
455 </context-group> 966 </context-group>
456 </trans-unit> 967 </trans-unit>
457 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 968 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
458 <source>Instance</source> 969 <source>Instance</source>
459 <target>Instance</target> 970 <target>Instance</target>
460 <context-group name="null"> 971 <context-group name="null">
461 <context context-type="linenumber">8</context> 972 <context context-type="linenumber">12</context>
462 </context-group> 973 </context-group>
463 </trans-unit> 974 </trans-unit>
464 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 975 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -468,15 +979,11 @@
468 <context context-type="linenumber">7</context> 979 <context context-type="linenumber">7</context>
469 </context-group> 980 </context-group>
470 </trans-unit> 981 </trans-unit>
471 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 982 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
472 <source> 983 <source>Submit</source>
473 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 984 <target>Odeslat</target>
474</source>
475 <target>
476 O instanci <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
477</target>
478 <context-group name="null"> 985 <context-group name="null">
479 <context context-type="linenumber">1</context> 986 <context context-type="linenumber">31</context>
480 </context-group> 987 </context-group>
481 </trans-unit> 988 </trans-unit>
482 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 989 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -490,47 +997,14 @@
490 <source>Terms</source> 997 <source>Terms</source>
491 <target>Podmínky</target> 998 <target>Podmínky</target>
492 <context-group name="null"> 999 <context-group name="null">
493 <context context-type="linenumber">44</context> 1000 <context context-type="linenumber">39</context>
494 </context-group> 1001 </context-group>
495 </trans-unit> 1002 </trans-unit>
496 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1003 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
497 <source>User registration is allowed and</source> 1004 <source>User registration is allowed and</source>
498 <target>Registrace uživatelů je povolena a</target> 1005 <target>Registrace uživatelů je povolena a</target>
499 <context-group name="null"> 1006 <context-group name="null">
500 <context context-type="linenumber">25</context> 1007 <context context-type="linenumber">29</context>
501 </context-group>
502 </trans-unit>
503 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
504 <source>
505 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
506 </source>
507 <target>
508 tato instance poskytuje základní limit <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> místa pro videa svým uživatelům.
509 </target>
510 <context-group name="null">
511 <context context-type="linenumber">27</context>
512 </context-group>
513 </trans-unit>
514 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
515 <source>
516 this instance provides unlimited space for the videos of its users.
517 </source>
518 <target>
519 tato instance poskytuje neomezený prostor pro videa svých uživatelů.
520 </target>
521 <context-group name="null">
522 <context context-type="linenumber">31</context>
523 </context-group>
524 </trans-unit>
525 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
526 <source>
527 User registration is currently not allowed.
528 </source>
529 <target>
530 Registrace uživatelů není momentálně povolena.
531 </target>
532 <context-group name="null">
533 <context context-type="linenumber">36</context>
534 </context-group> 1008 </context-group>
535 </trans-unit> 1009 </trans-unit>
536 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1010 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -586,8 +1060,8 @@
586 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video. 1060 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
587 </source> 1061 </source>
588 <target> 1062 <target>
589 PeerTube používá BitTorrent protokol pro sdílení pásma mezi uživateli. 1063 PeerTube používá protokol BitTorrent pro sdílení přenosu mezi uživateli.
590 To znamená, že vaše IP adresa je uložena v BitTorrent trackeru služby po dobu stahování nebo sledování videa.</target> 1064 To znamená, že vaše IP adresa je uložena v trackeru BitTorrent této instance po dobu stahování nebo sledování videa.</target>
591 <context-group name="null"> 1065 <context-group name="null">
592 <context context-type="linenumber">20</context> 1066 <context context-type="linenumber">20</context>
593 </context-group> 1067 </context-group>
@@ -617,8 +1091,8 @@
617 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot) 1091 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
618 </source> 1092 </source>
619 <target> 1093 <target>
620 HTTP požadavek musí být zaslán na každý tracker pro každé špehované video. 1094 na každý tracker musí být zaslán HTTP požadavek za každé špehované video.
621 Pokud bychom chtěli špehovat všechna videa na PeerTube, museli bychom poslat tolik požadavků, kolik je zde uloženo video (tedy potenciálně hodně)</target> 1095 Pokud bychom chtěli špehovat všechna videa na PeerTube, museli bychom poslat tolik požadavků, kolik je na PeerTube videí (tedy potenciálně hodně)</target>
622 <context-group name="null"> 1096 <context-group name="null">
623 <context context-type="linenumber">33</context> 1097 <context context-type="linenumber">33</context>
624 </context-group> 1098 </context-group>
@@ -630,7 +1104,7 @@
630 </source> 1104 </source>
631 <target> 1105 <target>
632 Pro každý odeslaný požadavek vrátí tracker limitovaný poÄet náhodných peerů. 1106 Pro každý odeslaný požadavek vrátí tracker limitovaný poÄet náhodných peerů.
633 Pro příklad, pokud je zde 1000 peerů ve skupině a tracker pošle pouze 20 peerů pro každý požadavek, muselo být odesláno alespoň 50 požadavků na získání všech peerů ve skupině</target> 1107 Například, pokud je zde 1000 peerů ve skupině a tracker pošle pouze 20 peerů pro každý požadavek, muselo být odesláno alespoň 50 požadavků na získání všech peerů ve skupině</target>
634 <context-group name="null"> 1108 <context-group name="null">
635 <context context-type="linenumber">38</context> 1109 <context context-type="linenumber">38</context>
636 </context-group> 1110 </context-group>
@@ -665,6 +1139,21 @@
665 <context context-type="linenumber">51</context> 1139 <context context-type="linenumber">51</context>
666 </context-group> 1140 </context-group>
667 </trans-unit> 1141 </trans-unit>
1142 <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
1143 <source>
1144 Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), the protocol is different from classic BitTorrent.
1145 When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
1146 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information
1147 </source>
1148 <target>
1149 Webové peery nejsou veÅ™ejnÄ› dostupné: jelikož používáme WebRTC v prohlížeÄi (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>s knihovnou WebTorrent<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), je protokol odliÅ¡ný od klasického BitTorrentu.
1150 Když jste ve webovém prohlížeÄi, poÅ¡lete trackeru signál obsahující vaÅ¡i IP adresu. Tracker pak náhodnÄ› vybere další peery, kterým pÅ™epoÅ¡le informace.
1151 Pro více informací si pÅ™eÄtÄ›te <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>tento dokument<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1152 </target>
1153 <context-group name="null">
1154 <context context-type="linenumber">55</context>
1155 </context-group>
1156 </trans-unit>
668 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389"> 1157 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
669 <source> 1158 <source>
670 The worst-case scenario of an average person spying on their friends is quite unlikely. 1159 The worst-case scenario of an average person spying on their friends is quite unlikely.
@@ -678,6 +1167,13 @@
678 <context context-type="linenumber">62</context> 1167 <context context-type="linenumber">62</context>
679 </context-group> 1168 </context-group>
680 </trans-unit> 1169 </trans-unit>
1170 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
1171 <source>How does PeerTube compare with YouTube?</source>
1172 <target>Jaký je PeerTube v porovnání s YouTube?</target>
1173 <context-group name="null">
1174 <context context-type="linenumber">67</context>
1175 </context-group>
1176 </trans-unit>
681 <trans-unit id="2432705cbabcb92a8677338901dd5d655383ef4c"> 1177 <trans-unit id="2432705cbabcb92a8677338901dd5d655383ef4c">
682 <source> 1178 <source>
683 The threats to privacy in YouTube are different from PeerTube's. 1179 The threats to privacy in YouTube are different from PeerTube's.
@@ -685,9 +1181,9 @@
685 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics). 1181 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
686 </source> 1182 </source>
687 <target> 1183 <target>
688 Ohrožení soukromí je na YouTube odlišné od toho na PeerTube. 1184 Ohrožení soukromí je na YouTubu odlišné od toho na PeerTubu.
689 V případě YouTube, služba o vás sbírá obrovské mnžoství osobních informací (nejen vaší IP adresu), aby je poté analyzovala a sledovala vás. 1185 V případě YouTube, tato služba o vás sbírá obrovské mnžoství osobních informací (nejen vaší IP adresu), aby je poté analyzovala a sledovala vás.
690 KromÄ› toho, YouTube je vlastnÄ›n Google/Alphabet, spoleÄností, která vás sleduje napÅ™Ã­Ä různými webslužbami (skrze AdSense nebo Google Analytics). 1186 KromÄ› toho je YouTube vlastnÄ›n Googlem/Alphabetem, spoleÄností, která vás sleduje napÅ™Ã­Ä různými webovými stránkami (pÅ™es AdSense nebo Google Analytics).
691 </target> 1187 </target>
692 <context-group name="null"> 1188 <context-group name="null">
693 <context context-type="linenumber">69</context> 1189 <context context-type="linenumber">69</context>
@@ -722,14 +1218,14 @@
722 <context context-type="linenumber">83</context> 1218 <context context-type="linenumber">83</context>
723 </context-group> 1219 </context-group>
724 </trans-unit> 1220 </trans-unit>
725 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1221 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
726 <source> 1222 <source>
727 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1223 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
728 In the meantime, we want to test different ideas related to this issue: 1224 In the meantime, we want to test different ideas related to this issue:
729 </source> 1225 </source>
730 <target> 1226 <target>
731 PeerTube je pouze v beta verzi a snaží se pÅ™inést pouze ta nejlepší možná opatÅ™ení v dobÄ› vydání stabilní verze. 1227 PeerTube je v rané fázi a chceme vám doruÄit ta nejlepší možná opatÅ™ení, dokud nebude vydána stabilní verze.
732 Mezitím, chceme otestovat různé návrhy Å™eÅ¡e­ tohoto problému: 1228 Mezitím chceme vyzkouÅ¡et různé nápady spojené s tímto problémem:
733 </target> 1229 </target>
734 <context-group name="null"> 1230 <context-group name="null">
735 <context context-type="linenumber">85</context> 1231 <context context-type="linenumber">85</context>
@@ -770,18 +1266,25 @@
770 <context context-type="linenumber">95</context> 1266 <context context-type="linenumber">95</context>
771 </context-group> 1267 </context-group>
772 </trans-unit> 1268 </trans-unit>
1269 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1270 <source>Banned</source>
1271 <target>Zablokován</target>
1272 <context-group name="null">
1273 <context context-type="linenumber">12</context>
1274 </context-group>
1275 </trans-unit>
773 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1276 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
774 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1277 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
775 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> odběratelů</target> 1278 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> odběratelů</target>
776 <context-group name="null"> 1279 <context-group name="null">
777 <context context-type="linenumber">12</context> 1280 <context context-type="linenumber">24</context>
778 </context-group> 1281 </context-group>
779 </trans-unit> 1282 </trans-unit>
780 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1283 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
781 <source>Video channels</source> 1284 <source>Video channels</source>
782 <target>Video kanály</target> 1285 <target>Video kanály</target>
783 <context-group name="null"> 1286 <context-group name="null">
784 <context context-type="linenumber">19</context> 1287 <context context-type="linenumber">31</context>
785 </context-group> 1288 </context-group>
786 </trans-unit> 1289 </trans-unit>
787 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1290 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -823,42 +1326,49 @@
823 <source>Short description</source> 1326 <source>Short description</source>
824 <target>Krátký popis</target> 1327 <target>Krátký popis</target>
825 <context-group name="null"> 1328 <context-group name="null">
826 <context context-type="linenumber">22</context> 1329 <context context-type="linenumber">21</context>
827 </context-group> 1330 </context-group>
828 </trans-unit> 1331 </trans-unit>
829 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1332 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
830 <source>Default client route</source> 1333 <source>Default client route</source>
831 <target>Výchozí hlavní stránka</target> 1334 <target>Výchozí hlavní stránka</target>
832 <context-group name="null"> 1335 <context-group name="null">
833 <context context-type="linenumber">55</context> 1336 <context context-type="linenumber">48</context>
1337 </context-group>
1338 </trans-unit>
1339 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1340 <source>Videos Overview</source>
1341 <target>Přehled videí</target>
1342 <context-group name="null">
1343 <context context-type="linenumber">51</context>
834 </context-group> 1344 </context-group>
835 </trans-unit> 1345 </trans-unit>
836 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1346 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
837 <source>Videos Trending</source> 1347 <source>Videos Trending</source>
838 <target>Trendy</target> 1348 <target>Trendy</target>
839 <context-group name="null"> 1349 <context-group name="null">
840 <context context-type="linenumber">59</context> 1350 <context context-type="linenumber">52</context>
841 </context-group> 1351 </context-group>
842 </trans-unit> 1352 </trans-unit>
843 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1353 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
844 <source>Videos Recently Added</source> 1354 <source>Videos Recently Added</source>
845 <target>Naposledy přidaná videa</target> 1355 <target>Naposledy přidaná videa</target>
846 <context-group name="null"> 1356 <context-group name="null">
847 <context context-type="linenumber">60</context> 1357 <context context-type="linenumber">53</context>
848 </context-group> 1358 </context-group>
849 </trans-unit> 1359 </trans-unit>
850 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1360 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
851 <source>Local videos</source> 1361 <source>Local videos</source>
852 <target>Místní videa</target> 1362 <target>Místní videa</target>
853 <context-group name="null"> 1363 <context-group name="null">
854 <context context-type="linenumber">61</context> 1364 <context context-type="linenumber">54</context>
855 </context-group> 1365 </context-group>
856 </trans-unit> 1366 </trans-unit>
857 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1367 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
858 <source>Policy on videos containing sensitive content</source> 1368 <source>Policy on videos containing sensitive content</source>
859 <target>Pravidla pro videa obsahující citlivý obsah</target> 1369 <target>Pravidla pro videa obsahující citlivý obsah</target>
860 <context-group name="null"> 1370 <context-group name="null">
861 <context context-type="linenumber">70</context> 1371 <context context-type="linenumber">61</context>
862 </context-group> 1372 </context-group>
863 </trans-unit> 1373 </trans-unit>
864 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1374 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -893,42 +1403,63 @@
893 <source>Signup enabled</source> 1403 <source>Signup enabled</source>
894 <target>Povolit registrace</target> 1404 <target>Povolit registrace</target>
895 <context-group name="null"> 1405 <context-group name="null">
896 <context context-type="linenumber">92</context> 1406 <context context-type="linenumber">84</context>
897 </context-group>
898 </trans-unit>
899 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
900 <source>Signup limit</source>
901 <target>Limit registrací</target>
902 <context-group name="null">
903 <context context-type="linenumber">101</context>
904 </context-group> 1407 </context-group>
905 </trans-unit> 1408 </trans-unit>
906 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1409 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
907 <source>Administrator</source> 1410 <source>Signup requires email verification</source>
908 <target>Administrátor</target> 1411 <target>Registrace vyžaduje ověření e-mailem.</target>
909 <context-group name="null"> 1412 <context-group name="null">
910 <context context-type="linenumber">123</context> 1413 <context context-type="linenumber">91</context>
911 </context-group> 1414 </context-group>
912 </trans-unit> 1415 </trans-unit>
913 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1416 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
914 <source>Admin email</source> 1417 <source>Signup limit</source>
915 <target>Email administrátora</target> 1418 <target>Limit registrací</target>
916 <context-group name="null"> 1419 <context-group name="null">
917 <context context-type="linenumber">126</context> 1420 <context context-type="linenumber">96</context>
918 </context-group> 1421 </context-group>
919 </trans-unit> 1422 </trans-unit>
920 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 1423 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
921 <source>Users</source> 1424 <source>Users</source>
922 <target>Uživatelé</target> 1425 <target>Uživatelé</target>
923 <context-group name="null"> 1426 <context-group name="null">
924 <context context-type="linenumber">136</context> 1427 <context context-type="linenumber">105</context>
925 </context-group> 1428 </context-group>
926 </trans-unit> 1429 </trans-unit>
927 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 1430 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
928 <source>User default video quota</source> 1431 <source>User default video quota</source>
929 <target>Výchozí limit na uživatele</target> 1432 <target>Výchozí limit na uživatele</target>
930 <context-group name="null"> 1433 <context-group name="null">
931 <context context-type="linenumber">139</context> 1434 <context context-type="linenumber">109</context>
1435 </context-group>
1436 </trans-unit>
1437 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1438 <source>Import</source>
1439 <target>Import</target>
1440 <context-group name="null">
1441 <context context-type="linenumber">42</context>
1442 </context-group>
1443 </trans-unit>
1444 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1445 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1446 <target>Import videa pomocí URL HTTP (např. YouTube) povolen</target>
1447 <context-group name="null">
1448 <context context-type="linenumber">141</context>
1449 </context-group>
1450 </trans-unit>
1451 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1452 <source>Administrator</source>
1453 <target>Administrátor</target>
1454 <context-group name="null">
1455 <context context-type="linenumber">155</context>
1456 </context-group>
1457 </trans-unit>
1458 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1459 <source>Admin email</source>
1460 <target>E-mail administrátora</target>
1461 <context-group name="null">
1462 <context context-type="linenumber">158</context>
932 </context-group> 1463 </context-group>
933 </trans-unit> 1464 </trans-unit>
934 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1465 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -942,112 +1473,134 @@
942 <source>Twitter</source> 1473 <source>Twitter</source>
943 <target>Twitter</target> 1474 <target>Twitter</target>
944 <context-group name="null"> 1475 <context-group name="null">
945 <context context-type="linenumber">170</context> 1476 <context context-type="linenumber">178</context>
946 </context-group> 1477 </context-group>
947 </trans-unit> 1478 </trans-unit>
948 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1479 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
949 <source>Your Twitter username</source> 1480 <source>Your Twitter username</source>
950 <target>Váš úÄet na Twitteru</target> 1481 <target>Váš úÄet na Twitteru</target>
951 <context-group name="null"> 1482 <context-group name="null">
952 <context context-type="linenumber">173</context> 1483 <context context-type="linenumber">184</context>
953 </context-group> 1484 </context-group>
954 </trans-unit> 1485 </trans-unit>
955 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1486 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
956 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1487 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
957 <target>UveÄte Twitter úÄet stránky nebo služby, na které byl obsah publikován.</target> 1488 <target>UveÄte Twitter úÄet stránky nebo služby, na které byl obsah publikován.</target>
958 <context-group name="null"> 1489 <context-group name="null">
959 <context context-type="linenumber">176</context> 1490 <context context-type="linenumber">187</context>
960 </context-group> 1491 </context-group>
961 </trans-unit> 1492 </trans-unit>
962 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1493 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
963 <source>Instance whitelisted by Twitter</source> 1494 <source>Instance whitelisted by Twitter</source>
964 <target>Twitter povolil tuto instanci</target> 1495 <target>Twitter povolil tuto instanci</target>
965 <context-group name="null"> 1496 <context-group name="null">
966 <context context-type="linenumber">189</context> 1497 <context context-type="linenumber">199</context>
967 </context-group> 1498 </context-group>
968 </trans-unit> 1499 </trans-unit>
969 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1500 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
970 <source>Services</source> 1501 <source>Services</source>
971 <target>Služby</target> 1502 <target>Služby</target>
972 <context-group name="null"> 1503 <context-group name="null">
973 <context context-type="linenumber">168</context> 1504 <context context-type="linenumber">176</context>
974 </context-group> 1505 </context-group>
975 </trans-unit> 1506 </trans-unit>
976 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1507 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
977 <source>Transcoding</source> 1508 <source>Transcoding</source>
978 <target>Překódování</target> 1509 <target>Překódování</target>
979 <context-group name="null"> 1510 <context-group name="null">
980 <context context-type="linenumber">200</context> 1511 <context context-type="linenumber">215</context>
981 </context-group> 1512 </context-group>
982 </trans-unit> 1513 </trans-unit>
983 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1514 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
984 <source>Transcoding enabled</source> 1515 <source>Transcoding enabled</source>
985 <target>Překódování povoleno</target> 1516 <target>Překódování povoleno</target>
986 <context-group name="null"> 1517 <context-group name="null">
987 <context context-type="linenumber">204</context> 1518 <context context-type="linenumber">221</context>
988 </context-group> 1519 </context-group>
989 </trans-unit> 1520 </trans-unit>
990 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1521 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
991 <source>If you disable transcoding, many videos from your users will not work!</source> 1522 <source>If you disable transcoding, many videos from your users will not work!</source>
992 <target>Pokud zakážete překódování, mnoho videí od vašich uživatelů nebude fungovat!</target> 1523 <target>Pokud zakážete překódování, mnoho videí od vašich uživatelů nebude fungovat!</target>
993 <context-group name="null"> 1524 <context-group name="null">
994 <context context-type="linenumber">205</context> 1525 <context context-type="linenumber">222</context>
995 </context-group> 1526 </context-group>
996 </trans-unit> 1527 </trans-unit>
997 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1528 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
998 <source>Transcoding threads</source> 1529 <source>Transcoding threads</source>
999 <target>Vlákna na překódování</target> 1530 <target>Vlákna na překódování</target>
1000 <context-group name="null"> 1531 <context-group name="null">
1001 <context context-type="linenumber">211</context> 1532 <context context-type="linenumber">237</context>
1533 </context-group>
1534 </trans-unit>
1535 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1536 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1537 <target>Rozlišení <x id="INTERPOLATION" equiv-text="{{resolution}}"/> povoleno</target>
1538 <context-group name="null">
1539 <context context-type="linenumber">252</context>
1540 </context-group>
1541 </trans-unit>
1542 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1543 <source>
1544 Cache
1545
1546 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1547 </source>
1548 <target>
1549 Mezipaměť
1550
1551 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1552 </target>
1553 <context-group name="null">
1554 <context context-type="linenumber">260</context>
1002 </context-group> 1555 </context-group>
1003 </trans-unit> 1556 </trans-unit>
1004 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1557 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1005 <source>Previews cache size</source> 1558 <source>Previews cache size</source>
1006 <target>Velikost mezipaměti náhledů</target> 1559 <target>Velikost mezipaměti náhledů</target>
1007 <context-group name="null"> 1560 <context-group name="null">
1008 <context context-type="linenumber">243</context> 1561 <context context-type="linenumber">271</context>
1009 </context-group> 1562 </context-group>
1010 </trans-unit> 1563 </trans-unit>
1011 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1564 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1012 <source>Customizations</source> 1565 <source>Customizations</source>
1013 <target>Přizpůsobení</target> 1566 <target>Přizpůsobení</target>
1014 <context-group name="null"> 1567 <context-group name="null">
1015 <context context-type="linenumber">264</context> 1568 <context context-type="linenumber">289</context>
1016 </context-group> 1569 </context-group>
1017 </trans-unit> 1570 </trans-unit>
1018 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1571 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1019 <source>JavaScript</source> 1572 <source>JavaScript</source>
1020 <target>JavaScript</target> 1573 <target>JavaScript</target>
1021 <context-group name="null"> 1574 <context-group name="null">
1022 <context context-type="linenumber">267</context> 1575 <context context-type="linenumber">294</context>
1023 </context-group> 1576 </context-group>
1024 </trans-unit> 1577 </trans-unit>
1025 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1578 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1026 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1579 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1027 <target>Pište přímo JavaScript kód.&lt;br /&gt;Například: &lt;pre&gt;console.log('moje instance je úžasná');&lt;/pre&gt;</target> 1580 <target>Pište přímo JavaScript kód.&lt;br /&gt;Například: &lt;pre&gt;console.log('moje instance je úžasná');&lt;/pre&gt;</target>
1028 <context-group name="null"> 1581 <context-group name="null">
1029 <context context-type="linenumber">270</context> 1582 <context context-type="linenumber">297</context>
1030 </context-group> 1583 </context-group>
1031 </trans-unit> 1584 </trans-unit>
1032 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1585 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1033 <source>Advanced configuration</source> 1586 <source>Advanced configuration</source>
1034 <target>PokroÄilá nastavení</target> 1587 <target>PokroÄilá nastavení</target>
1035 <context-group name="null"> 1588 <context-group name="null">
1036 <context context-type="linenumber">197</context> 1589 <context context-type="linenumber">212</context>
1037 </context-group> 1590 </context-group>
1038 </trans-unit> 1591 </trans-unit>
1039 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1592 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1040 <source>Update configuration</source> 1593 <source>Update configuration</source>
1041 <target>Aktualizovat nastavení</target> 1594 <target>Aktualizovat nastavení</target>
1042 <context-group name="null"> 1595 <context-group name="null">
1043 <context context-type="linenumber">314</context> 1596 <context context-type="linenumber">340</context>
1044 </context-group> 1597 </context-group>
1045 </trans-unit> 1598 </trans-unit>
1046 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1599 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1047 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1600 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1048 <target>Zdá se, že vaše konfigurace není validní. Prosím, vyhledejte potencialní chyby v jiné záložce.</target> 1601 <target>Zdá se, že vaše konfigurace není validní. Prosím, vyhledejte potencialní chyby v jiné záložce.</target>
1049 <context-group name="null"> 1602 <context-group name="null">
1050 <context context-type="linenumber">315</context> 1603 <context context-type="linenumber">341</context>
1051 </context-group> 1604 </context-group>
1052 </trans-unit> 1605 </trans-unit>
1053 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1606 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1072,6 +1625,17 @@
1072 <context context-type="linenumber">7</context> 1625 <context context-type="linenumber">7</context>
1073 </context-group> 1626 </context-group>
1074 </trans-unit> 1627 </trans-unit>
1628 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
1629 <source>
1630 Moderation
1631 </source>
1632 <target>
1633 Moderace
1634 </target>
1635 <context-group name="null">
1636 <context context-type="linenumber">11</context>
1637 </context-group>
1638 </trans-unit>
1075 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 1639 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1076 <source> 1640 <source>
1077 Jobs 1641 Jobs
@@ -1119,6 +1683,13 @@
1119 <context context-type="linenumber">21</context> 1683 <context context-type="linenumber">21</context>
1120 </context-group> 1684 </context-group>
1121 </trans-unit> 1685 </trans-unit>
1686 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1687 <source>Filter...</source>
1688 <target>Filtrovat...</target>
1689 <context-group name="null">
1690 <context context-type="linenumber">27</context>
1691 </context-group>
1692 </trans-unit>
1122 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1693 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1123 <source>ID</source> 1694 <source>ID</source>
1124 <target>ID</target> 1695 <target>ID</target>
@@ -1130,14 +1701,14 @@
1130 <source>Score</source> 1701 <source>Score</source>
1131 <target>Skóre</target> 1702 <target>Skóre</target>
1132 <context-group name="null"> 1703 <context-group name="null">
1133 <context context-type="linenumber">8</context> 1704 <context context-type="linenumber">17</context>
1134 </context-group> 1705 </context-group>
1135 </trans-unit> 1706 </trans-unit>
1136 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1707 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1137 <source>Host</source> 1708 <source>Host</source>
1138 <target>Host</target> 1709 <target>Host</target>
1139 <context-group name="null"> 1710 <context-group name="null">
1140 <context context-type="linenumber">8</context> 1711 <context context-type="linenumber">19</context>
1141 </context-group> 1712 </context-group>
1142 </trans-unit> 1713 </trans-unit>
1143 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1714 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1228,7 +1799,7 @@
1228 <source>Role</source> 1799 <source>Role</source>
1229 <target>Role</target> 1800 <target>Role</target>
1230 <context-group name="null"> 1801 <context-group name="null">
1231 <context context-type="linenumber">20</context> 1802 <context context-type="linenumber">43</context>
1232 </context-group> 1803 </context-group>
1233 </trans-unit> 1804 </trans-unit>
1234 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1805 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1244,13 +1815,6 @@
1244 <context context-type="linenumber">65</context> 1815 <context context-type="linenumber">65</context>
1245 </context-group> 1816 </context-group>
1246 </trans-unit> 1817 </trans-unit>
1247 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1248 <source>Reason...</source>
1249 <target>Důvod...</target>
1250 <context-group name="null">
1251 <context context-type="linenumber">11</context>
1252 </context-group>
1253 </trans-unit>
1254 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1818 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1255 <source>Users list</source> 1819 <source>Users list</source>
1256 <target>Seznam uživatelů</target> 1820 <target>Seznam uživatelů</target>
@@ -1262,9 +1826,48 @@
1262 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1826 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1263 <target>Uživatelské jméno <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1827 <target>Uživatelské jméno <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1264 <context-group name="null"> 1828 <context-group name="null">
1829 <context context-type="linenumber">40</context>
1830 </context-group>
1831 </trans-unit>
1832 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1833 <source>(banned)</source>
1834 <target>(zablokován)</target>
1835 <context-group name="null">
1836 <context context-type="linenumber">65</context>
1837 </context-group>
1838 </trans-unit>
1839 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1840 <source>Go to the account page</source>
1841 <target>Přejít na stránku kanálu</target>
1842 <context-group name="null">
1843 <context context-type="linenumber">133</context>
1844 </context-group>
1845 </trans-unit>
1846 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1847 <source>Ban reason:</source>
1848 <target>Důvod zablokování:</target>
1849 <context-group name="null">
1850 <context context-type="linenumber">95</context>
1851 </context-group>
1852 </trans-unit>
1853 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
1854 <source>
1855 This comment can only be seen by you or the other moderators.
1856 </source>
1857 <target>
1858 Tento komentář můžete vidět pouze vy nebo ostatní moderátoři.
1859 </target>
1860 <context-group name="null">
1265 <context context-type="linenumber">17</context> 1861 <context context-type="linenumber">17</context>
1266 </context-group> 1862 </context-group>
1267 </trans-unit> 1863 </trans-unit>
1864 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
1865 <source>Update this comment</source>
1866 <target>Aktualizovat tento komentář</target>
1867 <context-group name="null">
1868 <context context-type="linenumber">25</context>
1869 </context-group>
1870 </trans-unit>
1268 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1871 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
1269 <source>Reporter</source> 1872 <source>Reporter</source>
1270 <target>Autor nahlášení</target> 1873 <target>Autor nahlášení</target>
@@ -1293,25 +1896,25 @@
1293 <context context-type="linenumber">33</context> 1896 <context context-type="linenumber">33</context>
1294 </context-group> 1897 </context-group>
1295 </trans-unit> 1898 </trans-unit>
1296 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 1899 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1297 <source>Blacklisted videos</source> 1900 <source>Actions</source>
1298 <target>Videa na Äerné listinÄ›</target> 1901 <target>Akce</target>
1299 <context-group name="null"> 1902 <context-group name="null">
1300 <context context-type="linenumber">7</context> 1903 <context context-type="linenumber">35</context>
1301 </context-group> 1904 </context-group>
1302 </trans-unit> 1905 </trans-unit>
1303 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 1906 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1304 <source>My settings</source> 1907 <source>Reason:</source>
1305 <target>Moje nastavení</target> 1908 <target>Důvod:</target>
1306 <context-group name="null"> 1909 <context-group name="null">
1307 <context context-type="linenumber">3</context> 1910 <context context-type="linenumber">53</context>
1308 </context-group> 1911 </context-group>
1309 </trans-unit> 1912 </trans-unit>
1310 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 1913 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1311 <source>My videos</source> 1914 <source>Blacklisted videos</source>
1312 <target>Moje videa</target> 1915 <target>Videa na Äerné listinÄ›</target>
1313 <context-group name="null"> 1916 <context-group name="null">
1314 <context context-type="linenumber">14</context> 1917 <context context-type="linenumber">7</context>
1315 </context-group> 1918 </context-group>
1316 </trans-unit> 1919 </trans-unit>
1317 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1920 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1325,21 +1928,14 @@
1325 <source>Profile</source> 1928 <source>Profile</source>
1326 <target>Profil</target> 1929 <target>Profil</target>
1327 <context-group name="null"> 1930 <context-group name="null">
1328 <context context-type="linenumber">8</context> 1931 <context context-type="linenumber">7</context>
1329 </context-group> 1932 </context-group>
1330 </trans-unit> 1933 </trans-unit>
1331 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1934 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1332 <source>Video settings</source> 1935 <source>Video settings</source>
1333 <target>Nastavení videí</target> 1936 <target>Nastavení videí</target>
1334 <context-group name="null"> 1937 <context-group name="null">
1335 <context context-type="linenumber">15</context> 1938 <context context-type="linenumber">16</context>
1336 </context-group>
1337 </trans-unit>
1338 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1339 <source>Submit</source>
1340 <target>Odeslat</target>
1341 <context-group name="null">
1342 <context context-type="linenumber">24</context>
1343 </context-group> 1939 </context-group>
1344 </trans-unit> 1940 </trans-unit>
1345 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1941 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1443,14 +2039,14 @@ When you will upload a video in this channel, the video support field will be au
1443 <source>Automatically plays video</source> 2039 <source>Automatically plays video</source>
1444 <target>Automaticky přehrávat videa</target> 2040 <target>Automaticky přehrávat videa</target>
1445 <context-group name="null"> 2041 <context-group name="null">
1446 <context context-type="linenumber">20</context> 2042 <context context-type="linenumber">28</context>
1447 </context-group> 2043 </context-group>
1448 </trans-unit> 2044 </trans-unit>
1449 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2045 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1450 <source>Save</source> 2046 <source>Save</source>
1451 <target>Uložit</target> 2047 <target>Uložit</target>
1452 <context-group name="null"> 2048 <context-group name="null">
1453 <context context-type="linenumber">23</context> 2049 <context context-type="linenumber">32</context>
1454 </context-group> 2050 </context-group>
1455 </trans-unit> 2051 </trans-unit>
1456 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2052 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1460,6 +2056,13 @@ When you will upload a video in this channel, the video support field will be au
1460 <context context-type="linenumber">27</context> 2056 <context context-type="linenumber">27</context>
1461 </context-group> 2057 </context-group>
1462 </trans-unit> 2058 </trans-unit>
2059 <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
2060 <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
2061 <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> odběratelů</target>
2062 <context-group name="null">
2063 <context context-type="linenumber">10</context>
2064 </context-group>
2065 </trans-unit>
1463 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9"> 2066 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
1464 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source> 2067 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
1465 <target>(typ souboru: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximální velikost: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target> 2068 <target>(typ souboru: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximální velikost: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
@@ -1531,14 +2134,14 @@ When you will upload a video in this channel, the video support field will be au
1531 <source>Publish will be available when upload is finished</source> 2134 <source>Publish will be available when upload is finished</source>
1532 <target>Publikovat lze jakmile bude dokonÄeno nahrávání</target> 2135 <target>Publikovat lze jakmile bude dokonÄeno nahrávání</target>
1533 <context-group name="null"> 2136 <context-group name="null">
1534 <context context-type="linenumber">48</context> 2137 <context context-type="linenumber">58</context>
1535 </context-group> 2138 </context-group>
1536 </trans-unit> 2139 </trans-unit>
1537 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2140 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1538 <source>Publish</source> 2141 <source>Publish</source>
1539 <target>Publikovat</target> 2142 <target>Publikovat</target>
1540 <context-group name="null"> 2143 <context-group name="null">
1541 <context context-type="linenumber">55</context> 2144 <context context-type="linenumber">65</context>
1542 </context-group> 2145 </context-group>
1543 </trans-unit> 2146 </trans-unit>
1544 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 2147 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -1550,11 +2153,18 @@ When you will upload a video in this channel, the video support field will be au
1550 </trans-unit> 2153 </trans-unit>
1551 <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b"> 2154 <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
1552 <source>Tags</source> 2155 <source>Tags</source>
1553 <target>Tagy</target> 2156 <target>Štítky</target>
1554 <context-group name="null"> 2157 <context-group name="null">
1555 <context context-type="linenumber">191</context> 2158 <context context-type="linenumber">191</context>
1556 </context-group> 2159 </context-group>
1557 </trans-unit> 2160 </trans-unit>
2161 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2162 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2163 <target>Å títky mohou být použity pro navržení relevantních doporuÄení.&lt;/br&gt;Stisknutím klávesy Enter pÅ™idáte nový Å¡títek.</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">18</context>
2166 </context-group>
2167 </trans-unit>
1558 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2168 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
1559 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2169 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
1560 <target>Popisy videí jsou ve výchozím stavu sbaleny a rozbalují se kliknutím.</target> 2170 <target>Popisy videí jsou ve výchozím stavu sbaleny a rozbalují se kliknutím.</target>
@@ -1594,7 +2204,7 @@ When you will upload a video in this channel, the video support field will be au
1594 <source>Wait transcoding before publishing the video</source> 2204 <source>Wait transcoding before publishing the video</source>
1595 <target>Čekat na překódování před publikováním videa</target> 2205 <target>Čekat na překódování před publikováním videa</target>
1596 <context-group name="null"> 2206 <context-group name="null">
1597 <context context-type="linenumber">130</context> 2207 <context context-type="linenumber">131</context>
1598 </context-group> 2208 </context-group>
1599 </trans-unit> 2209 </trans-unit>
1600 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2210 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1608,14 +2218,14 @@ When you will upload a video in this channel, the video support field will be au
1608 <source>Upload thumbnail</source> 2218 <source>Upload thumbnail</source>
1609 <target>Nahrát miniaturu</target> 2219 <target>Nahrát miniaturu</target>
1610 <context-group name="null"> 2220 <context-group name="null">
1611 <context context-type="linenumber">195</context> 2221 <context context-type="linenumber">196</context>
1612 </context-group> 2222 </context-group>
1613 </trans-unit> 2223 </trans-unit>
1614 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2224 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1615 <source>Upload preview</source> 2225 <source>Upload preview</source>
1616 <target>Nahrát náhled</target> 2226 <target>Nahrát náhled</target>
1617 <context-group name="null"> 2227 <context-group name="null">
1618 <context context-type="linenumber">202</context> 2228 <context context-type="linenumber">203</context>
1619 </context-group> 2229 </context-group>
1620 </trans-unit> 2230 </trans-unit>
1621 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2231 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1629,14 +2239,14 @@ When you will upload a video in this channel, the video support field will be au
1629 <source>Short text to tell people how they can support you (membership platform...).</source> 2239 <source>Short text to tell people how they can support you (membership platform...).</source>
1630 <target>Krátký text, co řekne lidem, jak vás mohou podpořit.</target> 2240 <target>Krátký text, co řekne lidem, jak vás mohou podpořit.</target>
1631 <context-group name="null"> 2241 <context-group name="null">
1632 <context context-type="linenumber">209</context> 2242 <context context-type="linenumber">210</context>
1633 </context-group> 2243 </context-group>
1634 </trans-unit> 2244 </trans-unit>
1635 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2245 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1636 <source>Advanced settings</source> 2246 <source>Advanced settings</source>
1637 <target>Rozšířená nastavení</target> 2247 <target>Rozšířená nastavení</target>
1638 <context-group name="null"> 2248 <context-group name="null">
1639 <context context-type="linenumber">190</context> 2249 <context context-type="linenumber">191</context>
1640 </context-group> 2250 </context-group>
1641 </trans-unit> 2251 </trans-unit>
1642 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2252 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -1780,13 +2390,6 @@ When you will upload a video in this channel, the video support field will be au
1780 <context context-type="linenumber">123</context> 2390 <context context-type="linenumber">123</context>
1781 </context-group> 2391 </context-group>
1782 </trans-unit> 2392 </trans-unit>
1783 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1784 <source>Go to the account page</source>
1785 <target>Přejít na stránku kanálu</target>
1786 <context-group name="null">
1787 <context context-type="linenumber">133</context>
1788 </context-group>
1789 </trans-unit>
1790 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 2393 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
1791 <source>Show more</source> 2394 <source>Show more</source>
1792 <target>Zobrazit více</target> 2395 <target>Zobrazit více</target>
@@ -1837,25 +2440,18 @@ When you will upload a video in this channel, the video support field will be au
1837 <context context-type="linenumber">3</context> 2440 <context context-type="linenumber">3</context>
1838 </context-group> 2441 </context-group>
1839 </trans-unit> 2442 </trans-unit>
1840 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
1841 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
1842 <target>Můžete komentovat video na stránkách instance, kde je vaÅ¡e video federováno s PeerTube úÄtem nebo pomocí kterékoliv instance obsahující ActivityPub federaci. V instancích s Mastodon nebo Pleroma napiÅ¡te do vyhledávacího pole &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; a najdÄ›te video. Na přímém komentování se pracuje: &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
1843 <context-group name="null">
1844 <context context-type="linenumber">8</context>
1845 </context-group>
1846 </trans-unit>
1847 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 2443 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
1848 <source>No comments.</source> 2444 <source>No comments.</source>
1849 <target>Žádné komentáře</target> 2445 <target>Žádné komentáře</target>
1850 <context-group name="null"> 2446 <context-group name="null">
1851 <context context-type="linenumber">18</context> 2447 <context context-type="linenumber">17</context>
1852 </context-group> 2448 </context-group>
1853 </trans-unit> 2449 </trans-unit>
1854 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 2450 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
1855 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 2451 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
1856 <target>Zobrazit všech <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> odpovědí</target> 2452 <target>Zobrazit všech <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> odpovědí</target>
1857 <context-group name="null"> 2453 <context-group name="null">
1858 <context context-type="linenumber">55</context> 2454 <context context-type="linenumber">54</context>
1859 </context-group> 2455 </context-group>
1860 </trans-unit> 2456 </trans-unit>
1861 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 2457 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -1866,7 +2462,7 @@ When you will upload a video in this channel, the video support field will be au
1866 Komentáře k tomuto video nejsou povoleny. 2462 Komentáře k tomuto video nejsou povoleny.
1867 </target> 2463 </target>
1868 <context-group name="null"> 2464 <context-group name="null">
1869 <context context-type="linenumber">64</context> 2465 <context context-type="linenumber">63</context>
1870 </context-group> 2466 </context-group>
1871 </trans-unit> 2467 </trans-unit>
1872 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 2468 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -1901,13 +2497,6 @@ When you will upload a video in this channel, the video support field will be au
1901 <context context-type="linenumber">14</context> 2497 <context context-type="linenumber">14</context>
1902 </context-group> 2498 </context-group>
1903 </trans-unit> 2499 </trans-unit>
1904 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
1905 <source>Error getting about from server</source>
1906 <target>Chyba při získávání popisu</target>
1907 <context-group name="null">
1908 <context context-type="linenumber">1</context>
1909 </context-group>
1910 </trans-unit>
1911 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2500 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
1912 <source>No description</source> 2501 <source>No description</source>
1913 <target>Žádný popis</target> 2502 <target>Žádný popis</target>
@@ -1929,55 +2518,6 @@ When you will upload a video in this channel, the video support field will be au
1929 <context context-type="linenumber">1</context> 2518 <context context-type="linenumber">1</context>
1930 </context-group> 2519 </context-group>
1931 </trans-unit> 2520 </trans-unit>
1932 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1933 <source>Error</source>
1934 <target>Chyba</target>
1935 <context-group name="null">
1936 <context context-type="linenumber">1</context>
1937 </context-group>
1938 </trans-unit>
1939 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
1940 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
1941 <target>Nastaveno vlastní <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
1942 <context-group name="null">
1943 <context context-type="linenumber">1</context>
1944 </context-group>
1945 </trans-unit>
1946 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
1947 <source>This could lead to security issues or bugs if you do not understand it. </source>
1948 <target>Tato akce může vést k bezpeÄnostním problémům nebo chybám, pokud jí nerozumíte.</target>
1949 <context-group name="null">
1950 <context context-type="linenumber">1</context>
1951 </context-group>
1952 </trans-unit>
1953 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
1954 <source>Are you sure you want to update the configuration?</source>
1955 <target>Opravdu chcete aktualizovat nastavení?</target>
1956 <context-group name="null">
1957 <context context-type="linenumber">1</context>
1958 </context-group>
1959 </trans-unit>
1960 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
1961 <source>Please type</source>
1962 <target>Prosím napište</target>
1963 <context-group name="null">
1964 <context context-type="linenumber">1</context>
1965 </context-group>
1966 </trans-unit>
1967 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
1968 <source>to confirm.</source>
1969 <target>pro potvrzení.</target>
1970 <context-group name="null">
1971 <context context-type="linenumber">1</context>
1972 </context-group>
1973 </trans-unit>
1974 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1975 <source>Success</source>
1976 <target>Úspěšně</target>
1977 <context-group name="null">
1978 <context context-type="linenumber">1</context>
1979 </context-group>
1980 </trans-unit>
1981 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2521 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
1982 <source>Configuration updated.</source> 2522 <source>Configuration updated.</source>
1983 <target>Nastavení aktualizováno.</target> 2523 <target>Nastavení aktualizováno.</target>
@@ -2083,16 +2623,30 @@ When you will upload a video in this channel, the video support field will be au
2083 <context context-type="linenumber">1</context> 2623 <context context-type="linenumber">1</context>
2084 </context-group> 2624 </context-group>
2085 </trans-unit> 2625 </trans-unit>
2086 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 2626 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
2087 <source>You cannot delete root.</source> 2627 <source>Unban</source>
2088 <target>Uživatel root nelze odstranit.</target> 2628 <target>Odblokovat</target>
2089 <context-group name="null"> 2629 <context-group name="null">
2090 <context context-type="linenumber">1</context> 2630 <context context-type="linenumber">1</context>
2091 </context-group> 2631 </context-group>
2092 </trans-unit> 2632 </trans-unit>
2093 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 2633 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
2094 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 2634 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
2095 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odstraněn.</target> 2635 <target>Opravdu chcete odblokovat <x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů?</target>
2636 <context-group name="null">
2637 <context context-type="linenumber">1</context>
2638 </context-group>
2639 </trans-unit>
2640 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
2641 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
2642 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů odblokováno.</target>
2643 <context-group name="null">
2644 <context context-type="linenumber">1</context>
2645 </context-group>
2646 </trans-unit>
2647 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
2648 <source>You cannot delete root.</source>
2649 <target>Uživatel root nelze odstranit.</target>
2096 <context-group name="null"> 2650 <context-group name="null">
2097 <context context-type="linenumber">1</context> 2651 <context context-type="linenumber">1</context>
2098 </context-group> 2652 </context-group>
@@ -2146,23 +2700,16 @@ When you will upload a video in this channel, the video support field will be au
2146 <context context-type="linenumber">1</context> 2700 <context context-type="linenumber">1</context>
2147 </context-group> 2701 </context-group>
2148 </trans-unit> 2702 </trans-unit>
2149 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2703 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2150 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2704 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2151 <target>Opravdu chcete odstranit <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Tato akce odstraní i veškerá videa na tomto kanálu.</target> 2705 <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target>
2152 <context-group name="null">
2153 <context context-type="linenumber">1</context>
2154 </context-group>
2155 </trans-unit>
2156 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2157 <source>Please type the name of the video channel to confirm</source>
2158 <target>Prosím, napište název tohoto kanálu pro potvrzení</target>
2159 <context-group name="null"> 2706 <context-group name="null">
2160 <context context-type="linenumber">1</context> 2707 <context context-type="linenumber">1</context>
2161 </context-group> 2708 </context-group>
2162 </trans-unit> 2709 </trans-unit>
2163 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2710 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2164 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2711 <source>My videos</source>
2165 <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target> 2712 <target>Moje videa</target>
2166 <context-group name="null"> 2713 <context-group name="null">
2167 <context context-type="linenumber">1</context> 2714 <context context-type="linenumber">1</context>
2168 </context-group> 2715 </context-group>
@@ -2223,6 +2770,20 @@ When you will upload a video in this channel, the video support field will be au
2223 <context context-type="linenumber">1</context> 2770 <context context-type="linenumber">1</context>
2224 </context-group> 2771 </context-group>
2225 </trans-unit> 2772 </trans-unit>
2773 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2774 <source>My subscriptions</source>
2775 <target>Moje odběry</target>
2776 <context-group name="null">
2777 <context context-type="linenumber">1</context>
2778 </context-group>
2779 </trans-unit>
2780 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2781 <source>My settings</source>
2782 <target>Moje nastavení</target>
2783 <context-group name="null">
2784 <context context-type="linenumber">1</context>
2785 </context-group>
2786 </trans-unit>
2226 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2787 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2227 <source>Unable to find user id or verification string.</source> 2788 <source>Unable to find user id or verification string.</source>
2228 <target>Nelze najít uživatelovo id nebo verifikaÄní Å™etÄ›zec.</target> 2789 <target>Nelze najít uživatelovo id nebo verifikaÄní Å™etÄ›zec.</target>
@@ -2230,6 +2791,13 @@ When you will upload a video in this channel, the video support field will be au
2230 <context context-type="linenumber">1</context> 2791 <context context-type="linenumber">1</context>
2231 </context-group> 2792 </context-group>
2232 </trans-unit> 2793 </trans-unit>
2794 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
2795 <source>Subscribe to the account</source>
2796 <target>Odebírat úÄet</target>
2797 <context-group name="null">
2798 <context context-type="linenumber">1</context>
2799 </context-group>
2800 </trans-unit>
2233 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 2801 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
2234 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 2802 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
2235</source> 2803</source>
@@ -2246,6 +2814,13 @@ When you will upload a video in this channel, the video support field will be au
2246 <context context-type="linenumber">1</context> 2814 <context context-type="linenumber">1</context>
2247 </context-group> 2815 </context-group>
2248 </trans-unit> 2816 </trans-unit>
2817 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2818 <source>Error</source>
2819 <target>Chyba</target>
2820 <context-group name="null">
2821 <context context-type="linenumber">1</context>
2822 </context-group>
2823 </trans-unit>
2249 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2824 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2250 <source>You need to reconnect.</source> 2825 <source>You need to reconnect.</source>
2251 <target>Musíte se znovu připojit.</target> 2826 <target>Musíte se znovu připojit.</target>
@@ -2260,6 +2835,20 @@ When you will upload a video in this channel, the video support field will be au
2260 <context context-type="linenumber">1</context> 2835 <context context-type="linenumber">1</context>
2261 </context-group> 2836 </context-group>
2262 </trans-unit> 2837 </trans-unit>
2838 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2839 <source>Info</source>
2840 <target>Info</target>
2841 <context-group name="null">
2842 <context context-type="linenumber">1</context>
2843 </context-group>
2844 </trans-unit>
2845 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2846 <source>Success</source>
2847 <target>Úspěšně</target>
2848 <context-group name="null">
2849 <context context-type="linenumber">1</context>
2850 </context-group>
2851 </trans-unit>
2263 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2852 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2264 <source>Your password has been successfully reset!</source> 2853 <source>Your password has been successfully reset!</source>
2265 <target>Vaše heslo bylo úspěšně resetováno!</target> 2854 <target>Vaše heslo bylo úspěšně resetováno!</target>
@@ -2346,14 +2935,14 @@ When you will upload a video in this channel, the video support field will be au
2346 </trans-unit> 2935 </trans-unit>
2347 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021"> 2936 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
2348 <source>Admin email is required.</source> 2937 <source>Admin email is required.</source>
2349 <target>Email administrátora je vyžadován.</target> 2938 <target>E-mail administrátora je vyžadován.</target>
2350 <context-group name="null"> 2939 <context-group name="null">
2351 <context context-type="linenumber">1</context> 2940 <context context-type="linenumber">1</context>
2352 </context-group> 2941 </context-group>
2353 </trans-unit> 2942 </trans-unit>
2354 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66"> 2943 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
2355 <source>Admin email must be valid.</source> 2944 <source>Admin email must be valid.</source>
2356 <target>Email administrátora musí být platný.</target> 2945 <target>E-mail administrátora musí být platný.</target>
2357 <context-group name="null"> 2946 <context-group name="null">
2358 <context context-type="linenumber">1</context> 2947 <context context-type="linenumber">1</context>
2359 </context-group> 2948 </context-group>
@@ -2365,6 +2954,20 @@ When you will upload a video in this channel, the video support field will be au
2365 <context context-type="linenumber">1</context> 2954 <context context-type="linenumber">1</context>
2366 </context-group> 2955 </context-group>
2367 </trans-unit> 2956 </trans-unit>
2957 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2958 <source>Email is required.</source>
2959 <target>E-mail je vyžadován.</target>
2960 <context-group name="null">
2961 <context context-type="linenumber">1</context>
2962 </context-group>
2963 </trans-unit>
2964 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2965 <source>Email must be valid.</source>
2966 <target>E-mail musí být platný.</target>
2967 <context-group name="null">
2968 <context context-type="linenumber">1</context>
2969 </context-group>
2970 </trans-unit>
2368 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2971 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2369 <source>Username is required.</source> 2972 <source>Username is required.</source>
2370 <target>Uživatelské jméno je vyžadováno.</target> 2973 <target>Uživatelské jméno je vyžadováno.</target>
@@ -2386,41 +2989,6 @@ When you will upload a video in this channel, the video support field will be au
2386 <context context-type="linenumber">1</context> 2989 <context context-type="linenumber">1</context>
2387 </context-group> 2990 </context-group>
2388 </trans-unit> 2991 </trans-unit>
2389 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2390 <source>Username must be at least 3 characters long.</source>
2391 <target>Uživatelské jméno musí mít délku minimálně 3 znaky.</target>
2392 <context-group name="null">
2393 <context context-type="linenumber">1</context>
2394 </context-group>
2395 </trans-unit>
2396 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2397 <source>Username cannot be more than 20 characters long.</source>
2398 <target>Uživatelské jméno nemůže být delší než 20 znaků.</target>
2399 <context-group name="null">
2400 <context context-type="linenumber">1</context>
2401 </context-group>
2402 </trans-unit>
2403 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2404 <source>Username should be only lowercase alphanumeric characters.</source>
2405 <target>Uživatelské jméno by mÄ›lo obsahovat pouze malá písmena a Äíslice.</target>
2406 <context-group name="null">
2407 <context context-type="linenumber">1</context>
2408 </context-group>
2409 </trans-unit>
2410 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2411 <source>Email is required.</source>
2412 <target>Email je vyžadován.</target>
2413 <context-group name="null">
2414 <context context-type="linenumber">1</context>
2415 </context-group>
2416 </trans-unit>
2417 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2418 <source>Email must be valid.</source>
2419 <target>Email musí být platný.</target>
2420 <context-group name="null">
2421 <context context-type="linenumber">1</context>
2422 </context-group>
2423 </trans-unit>
2424 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2992 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2425 <source>Password must be at least 6 characters long.</source> 2993 <source>Password must be at least 6 characters long.</source>
2426 <target>Heslo musí mít délku minimálně 6 znaků.</target> 2994 <target>Heslo musí mít délku minimálně 6 znaků.</target>
@@ -2470,20 +3038,6 @@ When you will upload a video in this channel, the video support field will be au
2470 <context context-type="linenumber">1</context> 3038 <context context-type="linenumber">1</context>
2471 </context-group> 3039 </context-group>
2472 </trans-unit> 3040 </trans-unit>
2473 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2474 <source>Display name must be at least 3 characters long.</source>
2475 <target>Zobrazované jméno musí mít delku minimálně 3 znaky.</target>
2476 <context-group name="null">
2477 <context context-type="linenumber">1</context>
2478 </context-group>
2479 </trans-unit>
2480 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
2481 <source>Display name cannot be more than 120 characters long.</source>
2482 <target>Zobrazované jméno nesmí být delší než 120 znaků.</target>
2483 <context-group name="null">
2484 <context context-type="linenumber">1</context>
2485 </context-group>
2486 </trans-unit>
2487 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3041 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2488 <source>Description must be at least 3 characters long.</source> 3042 <source>Description must be at least 3 characters long.</source>
2489 <target>Popis musí mít délku minimálně 3 znaky.</target> 3043 <target>Popis musí mít délku minimálně 3 znaky.</target>
@@ -2491,13 +3045,6 @@ When you will upload a video in this channel, the video support field will be au
2491 <context context-type="linenumber">1</context> 3045 <context context-type="linenumber">1</context>
2492 </context-group> 3046 </context-group>
2493 </trans-unit> 3047 </trans-unit>
2494 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
2495 <source>Description cannot be more than 250 characters long.</source>
2496 <target>Popis nesmí být delší než 250 znaků.</target>
2497 <context-group name="null">
2498 <context context-type="linenumber">1</context>
2499 </context-group>
2500 </trans-unit>
2501 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 3048 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
2502 <source>Report reason is required.</source> 3049 <source>Report reason is required.</source>
2503 <target>Důvod nahlášení je vyžadován.</target> 3050 <target>Důvod nahlášení je vyžadován.</target>
@@ -2512,20 +3059,6 @@ When you will upload a video in this channel, the video support field will be au
2512 <context context-type="linenumber">1</context> 3059 <context context-type="linenumber">1</context>
2513 </context-group> 3060 </context-group>
2514 </trans-unit> 3061 </trans-unit>
2515 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
2516 <source>Report reason cannot be more than 300 characters long.</source>
2517 <target>Důvod nahlášení nesmí být delší než 300 znaků.</target>
2518 <context-group name="null">
2519 <context context-type="linenumber">1</context>
2520 </context-group>
2521 </trans-unit>
2522 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
2523 <source>Description cannot be more than 500 characters long.</source>
2524 <target>Popis nesmí být delší než 500 znaků.</target>
2525 <context-group name="null">
2526 <context context-type="linenumber">1</context>
2527 </context-group>
2528 </trans-unit>
2529 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3062 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2530 <source>Support text must be at least 3 characters long.</source> 3063 <source>Support text must be at least 3 characters long.</source>
2531 <target>Text pro podporu musí mít délku minimálně 3 znaky.</target> 3064 <target>Text pro podporu musí mít délku minimálně 3 znaky.</target>
@@ -2533,13 +3066,6 @@ When you will upload a video in this channel, the video support field will be au
2533 <context context-type="linenumber">1</context> 3066 <context context-type="linenumber">1</context>
2534 </context-group> 3067 </context-group>
2535 </trans-unit> 3068 </trans-unit>
2536 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813">
2537 <source>Support text cannot be more than 500 characters long.</source>
2538 <target>Text pro podporu nesmí být delší než 500 znaků.</target>
2539 <context-group name="null">
2540 <context context-type="linenumber">1</context>
2541 </context-group>
2542 </trans-unit>
2543 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 3069 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
2544 <source>Comment is required.</source> 3070 <source>Comment is required.</source>
2545 <target>Komentář je vyžadován.</target> 3071 <target>Komentář je vyžadován.</target>
@@ -2631,13 +3157,6 @@ When you will upload a video in this channel, the video support field will be au
2631 <context context-type="linenumber">1</context> 3157 <context context-type="linenumber">1</context>
2632 </context-group> 3158 </context-group>
2633 </trans-unit> 3159 </trans-unit>
2634 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b">
2635 <source>Video support cannot be more than 500 characters long.</source>
2636 <target>Text pro podporu videa nesmí být delší než 500 znaků.</target>
2637 <context-group name="null">
2638 <context context-type="linenumber">1</context>
2639 </context-group>
2640 </trans-unit>
2641 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 3160 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
2642 <source>A date is required to schedule video update.</source> 3161 <source>A date is required to schedule video update.</source>
2643 <target>Datum k naplánování aktualizace videa je vyžadováno.</target> 3162 <target>Datum k naplánování aktualizace videa je vyžadováno.</target>
@@ -3135,6 +3654,41 @@ When you will upload a video in this channel, the video support field will be au
3135 <context context-type="linenumber">1</context> 3654 <context context-type="linenumber">1</context>
3136 </context-group> 3655 </context-group>
3137 </trans-unit> 3656 </trans-unit>
3657 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
3658 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
3659 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů zablokováno.</target>
3660 <context-group name="null">
3661 <context context-type="linenumber">1</context>
3662 </context-group>
3663 </trans-unit>
3664 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
3665 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
3666 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> zablokován.</target>
3667 <context-group name="null">
3668 <context context-type="linenumber">1</context>
3669 </context-group>
3670 </trans-unit>
3671 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
3672 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
3673 <target>Opravdu chcete odblokovat uživatele <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
3674 <context-group name="null">
3675 <context context-type="linenumber">1</context>
3676 </context-group>
3677 </trans-unit>
3678 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
3679 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
3680 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odblokován.</target>
3681 <context-group name="null">
3682 <context context-type="linenumber">1</context>
3683 </context-group>
3684 </trans-unit>
3685 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
3686 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
3687 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odstraněn.</target>
3688 <context-group name="null">
3689 <context context-type="linenumber">1</context>
3690 </context-group>
3691 </trans-unit>
3138 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 3692 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
3139 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 3693 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
3140 <target>Požadavek je příliš velký. Prosím, kontaktujte administrátor pro navýšení limitu.</target> 3694 <target>Požadavek je příliš velký. Prosím, kontaktujte administrátor pro navýšení limitu.</target>
@@ -3163,23 +3717,51 @@ When you will upload a video in this channel, the video support field will be au
3163 <context context-type="linenumber">1</context> 3717 <context context-type="linenumber">1</context>
3164 </context-group> 3718 </context-group>
3165 </trans-unit> 3719 </trans-unit>
3720 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
3721 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
3722 <target>Odebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
3723 <context-group name="null">
3724 <context context-type="linenumber">1</context>
3725 </context-group>
3726 </trans-unit>
3166 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 3727 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
3167 <source>Subscribed</source> 3728 <source>Subscribed</source>
3168 <target>Odebírám</target> 3729 <target>Odebíráte</target>
3730 <context-group name="null">
3731 <context context-type="linenumber">1</context>
3732 </context-group>
3733 </trans-unit>
3734 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
3735 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
3736 <target>Již neodebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
3737 <context-group name="null">
3738 <context context-type="linenumber">1</context>
3739 </context-group>
3740 </trans-unit>
3741 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
3742 <source>Unsubscribed</source>
3743 <target>Odběr zrušen</target>
3744 <context-group name="null">
3745 <context context-type="linenumber">1</context>
3746 </context-group>
3747 </trans-unit>
3748 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
3749 <source>Anyone can see this video</source>
3750 <target>Kdokoliv může vidět toto video</target>
3169 <context-group name="null"> 3751 <context-group name="null">
3170 <context context-type="linenumber">1</context> 3752 <context context-type="linenumber">1</context>
3171 </context-group> 3753 </context-group>
3172 </trans-unit> 3754 </trans-unit>
3173 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be"> 3755 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
3174 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source> 3756 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
3175 <target>Registrace <x id="INTERPOLATION" equiv-text="{{username}}"/> dokonÄena.</target> 3757 <target>Nyní jste pÅ™ihlášen/a jako <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
3176 <context-group name="null"> 3758 <context-group name="null">
3177 <context context-type="linenumber">1</context> 3759 <context context-type="linenumber">1</context>
3178 </context-group> 3760 </context-group>
3179 </trans-unit> 3761 </trans-unit>
3180 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264"> 3762 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
3181 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source> 3763 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
3182 <target>Přiřazená data (tagy, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target> 3764 <target>Ovšem přidružená data (štítky, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target>
3183 <context-group name="null"> 3765 <context-group name="null">
3184 <context context-type="linenumber">1</context> 3766 <context context-type="linenumber">1</context>
3185 </context-group> 3767 </context-group>
@@ -3191,13 +3773,6 @@ When you will upload a video in this channel, the video support field will be au
3191 <context context-type="linenumber">1</context> 3773 <context context-type="linenumber">1</context>
3192 </context-group> 3774 </context-group>
3193 </trans-unit> 3775 </trans-unit>
3194 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3195 <source>Info</source>
3196 <target>Info</target>
3197 <context-group name="null">
3198 <context context-type="linenumber">1</context>
3199 </context-group>
3200 </trans-unit>
3201 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3776 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3202 <source>Upload cancelled</source> 3777 <source>Upload cancelled</source>
3203 <target>Nahrávání zrušeno</target> 3778 <target>Nahrávání zrušeno</target>
@@ -3240,6 +3815,20 @@ When you will upload a video in this channel, the video support field will be au
3240 <context context-type="linenumber">1</context> 3815 <context context-type="linenumber">1</context>
3241 </context-group> 3816 </context-group>
3242 </trans-unit> 3817 </trans-unit>
3818 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
3819 <source>Like the video</source>
3820 <target>To se mi líbí</target>
3821 <context-group name="null">
3822 <context context-type="linenumber">1</context>
3823 </context-group>
3824 </trans-unit>
3825 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
3826 <source>Dislike the video</source>
3827 <target>To se mi nelíbí</target>
3828 <context-group name="null">
3829 <context context-type="linenumber">1</context>
3830 </context-group>
3831 </trans-unit>
3243 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 3832 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
3244 <source>Do you really want to delete this video?</source> 3833 <source>Do you really want to delete this video?</source>
3245 <target>Opravdu chcete odstranit toto video?</target> 3834 <target>Opravdu chcete odstranit toto video?</target>
@@ -3249,7 +3838,7 @@ When you will upload a video in this channel, the video support field will be au
3249 </trans-unit> 3838 </trans-unit>
3250 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e"> 3839 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
3251 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source> 3840 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
3252 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> se to nelíbí</target> 3841 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> lidem se to nelíbí</target>
3253 <context-group name="null"> 3842 <context-group name="null">
3254 <context context-type="linenumber">1</context> 3843 <context context-type="linenumber">1</context>
3255 </context-group> 3844 </context-group>
@@ -3268,5 +3857,12 @@ When you will upload a video in this channel, the video support field will be au
3268 <context context-type="linenumber">1</context> 3857 <context context-type="linenumber">1</context>
3269 </context-group> 3858 </context-group>
3270 </trans-unit> 3859 </trans-unit>
3860 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
3861 <source>Videos from your subscriptions</source>
3862 <target>Videa od vašich odběrů</target>
3863 <context-group name="null">
3864 <context context-type="linenumber">1</context>
3865 </context-group>
3866 </trans-unit>
3271 </body> 3867 </body>
3272 </file></xliff> \ No newline at end of file 3868 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_de_DE.xml b/client/src/locale/target/angular_de_DE.xml
index 12f0dda27..39610dfdb 100644
--- a/client/src/locale/target/angular_de_DE.xml
+++ b/client/src/locale/target/angular_de_DE.xml
@@ -227,11 +227,25 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>nicht gelistet</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Privat</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
230 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
231 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
232 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target>
233 <context-group name="null"> 247 <context-group name="null">
234 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
235 </context-group> 249 </context-group>
236 </trans-unit> 250 </trans-unit>
237 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -245,7 +259,7 @@
245 <source>Edit</source> 259 <source>Edit</source>
246 <target>Bearbeiten</target> 260 <target>Bearbeiten</target>
247 <context-group name="null"> 261 <context-group name="null">
248 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
249 </context-group> 263 </context-group>
250 </trans-unit> 264 </trans-unit>
251 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -269,11 +283,112 @@
269 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
270 </context-group> 284 </context-group>
271 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Abonnieren
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 Abo beenden
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>Mit einem ActivityPub-Konto</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>Mit einem Konto auf <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/> abonnieren</target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>Mit deinem lokalen Konto abonnieren</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>Mit einem Mastodon-Konto abonnieren.</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>Mit einem Feed</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
354 <source>Subscribe via RSS</source>
355 <target>Ãœber RSS abonnieren</target>
356 <context-group name="null">
357 <context context-type="linenumber">49</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
361 <source>
362 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
363 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
364 </source>
365 <target>
366 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Entfernt abonnieren<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
367 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Entfernt interagieren<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
368 </target>
369 <context-group name="null">
370 <context context-type="linenumber">10</context>
371 </context-group>
372 </trans-unit>
373 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
374 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
375 <target>Du kannst diesen Kanal über jede Fediverse-Instanz abonnieren, die ActivityPub unterstützt. Bei Mastodon oder Pleroma kannst du z. B. die URL des Kanals in das Suchfeld eingeben und dann das Abo starten.</target>
376 <context-group name="null">
377 <context context-type="linenumber">17</context>
378 </context-group>
379 </trans-unit>
380 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
381 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
382 <target>Du kannst hiermit über jede Fediverse-Instanz interagieren, die ActivityPub unterstützt. Bei Mastodon oder Pleroma kannst du z. B. die URL des Kanals in das Suchfeld eingeben und dann damit interagieren.</target>
383 <context-group name="null">
384 <context context-type="linenumber">22</context>
385 </context-group>
386 </trans-unit>
272 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 387 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
273 <source>Video quota</source> 388 <source>Video quota</source>
274 <target>Videokontingent</target> 389 <target>Videokontingent</target>
275 <context-group name="null"> 390 <context-group name="null">
276 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
277 </context-group> 392 </context-group>
278 </trans-unit> 393 </trans-unit>
279 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -287,6 +402,38 @@
287 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
288 </context-group> 403 </context-group>
289 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>Sperren</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>Grund...</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424 Ein gesperrter Nutzer wird sich nicht mehr anmelden können.
425 </target>
426 <context-group name="null">
427 <context context-type="linenumber">17</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
431 <source>Ban this user</source>
432 <target>Diesen Nutzer sperren.</target>
433 <context-group name="null">
434 <context context-type="linenumber">25</context>
435 </context-group>
436 </trans-unit>
290 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
291 <source> 438 <source>
292 Login 439 Login
@@ -314,7 +461,7 @@
314 </trans-unit> 461 </trans-unit>
315 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478"> 462 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478">
316 <source>Username or email address</source> 463 <source>Username or email address</source>
317 <target>Benutzername und E-Mail-Adresse</target> 464 <target>Benutzername oder E-Mail-Adresse</target>
318 <context-group name="null"> 465 <context-group name="null">
319 <context context-type="linenumber">15</context> 466 <context context-type="linenumber">15</context>
320 </context-group> 467 </context-group>
@@ -352,7 +499,7 @@
352 <source>Password</source> 499 <source>Password</source>
353 <target>Passwort</target> 500 <target>Passwort</target>
354 <context-group name="null"> 501 <context-group name="null">
355 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
356 </context-group> 503 </context-group>
357 </trans-unit> 504 </trans-unit>
358 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -366,7 +513,7 @@
366 <source>Login</source> 513 <source>Login</source>
367 <target>Anmelden</target> 514 <target>Anmelden</target>
368 <context-group name="null"> 515 <context-group name="null">
369 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
370 </context-group> 517 </context-group>
371 </trans-unit> 518 </trans-unit>
372 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -394,7 +541,7 @@
394 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
395 <target>Mir eine E-Mail schicken, um mein Passwort zurückzusetzen</target> 542 <target>Mir eine E-Mail schicken, um mein Passwort zurückzusetzen</target>
396 <context-group name="null"> 543 <context-group name="null">
397 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
398 </context-group> 545 </context-group>
399 </trans-unit> 546 </trans-unit>
400 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -450,28 +597,28 @@ Konto erstellen</target>
450 <source>Example: jane_doe</source> 597 <source>Example: jane_doe</source>
451 <target>Beispiel: lisa_schmidt</target> 598 <target>Beispiel: lisa_schmidt</target>
452 <context-group name="null"> 599 <context-group name="null">
453 <context context-type="linenumber">16</context> 600 <context context-type="linenumber">17</context>
454 </context-group> 601 </context-group>
455 </trans-unit> 602 </trans-unit>
456 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 603 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
457 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 604 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
458 <target>Ich habe die &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Bestimmungen&lt;/a&gt; dieser Instanz gelesen und stimme ihnen zu.</target> 605 <target>Ich bin mindestens 16 Jahre alt und stimme den &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Bestimmungen&lt;/a&gt; dieser Instanz zu</target>
459 <context-group name="null"> 606 <context-group name="null">
460 <context context-type="linenumber">54</context> 607 <context context-type="linenumber">55</context>
461 </context-group> 608 </context-group>
462 </trans-unit> 609 </trans-unit>
463 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 610 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
464 <source>Signup</source> 611 <source>Signup</source>
465 <target>Registrieren</target> 612 <target>Registrieren</target>
466 <context-group name="null"> 613 <context-group name="null">
467 <context context-type="linenumber">88</context> 614 <context context-type="linenumber">78</context>
468 </context-group> 615 </context-group>
469 </trans-unit> 616 </trans-unit>
470 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 617 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
471 <source>Features found on this instance</source> 618 <source>Features found on this instance</source>
472 <target>Besonderheiten dieser Instanz</target> 619 <target>Besonderheiten dieser Instanz</target>
473 <context-group name="null"> 620 <context-group name="null">
474 <context context-type="linenumber">66</context> 621 <context context-type="linenumber">67</context>
475 </context-group> 622 </context-group>
476 </trans-unit> 623 </trans-unit>
477 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 624 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -492,9 +639,15 @@ Konto erstellen</target>
492 <context context-type="linenumber">6</context> 639 <context context-type="linenumber">6</context>
493 </context-group> 640 </context-group>
494 </trans-unit> 641 </trans-unit>
495 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 642 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
496 <source>Filters</source> 643 <source>
497 <target>Filter</target> 644 Filters
645 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
646 </source>
647 <target>
648 Filter
649 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
650 </target>
498 <context-group name="null"> 651 <context-group name="null">
499 <context context-type="linenumber">16</context> 652 <context context-type="linenumber">16</context>
500 </context-group> 653 </context-group>
@@ -507,28 +660,28 @@ Konto erstellen</target>
507 Keine Ergebnisse gefunden. 660 Keine Ergebnisse gefunden.
508 </target> 661 </target>
509 <context-group name="null"> 662 <context-group name="null">
510 <context context-type="linenumber">25</context> 663 <context context-type="linenumber">28</context>
511 </context-group> 664 </context-group>
512 </trans-unit> 665 </trans-unit>
513 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 666 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
514 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 667 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
515 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> Abonnenten</target> 668 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> Abonnenten</target>
516 <context-group name="null"> 669 <context-group name="null">
517 <context context-type="linenumber">41</context> 670 <context context-type="linenumber">44</context>
518 </context-group> 671 </context-group>
519 </trans-unit> 672 </trans-unit>
520 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 673 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
521 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 674 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
522 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> Aufrufe</target> 675 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> Aufrufe</target>
523 <context-group name="null"> 676 <context-group name="null">
524 <context context-type="linenumber">52</context> 677 <context context-type="linenumber">55</context>
525 </context-group> 678 </context-group>
526 </trans-unit> 679 </trans-unit>
527 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 680 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
528 <source>Change the language</source> 681 <source>Change the language</source>
529 <target>Sprache wechseln</target> 682 <target>Sprache wechseln</target>
530 <context-group name="null"> 683 <context-group name="null">
531 <context context-type="linenumber">88</context> 684 <context context-type="linenumber">86</context>
532 </context-group> 685 </context-group>
533 </trans-unit> 686 </trans-unit>
534 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 687 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -539,7 +692,7 @@ Konto erstellen</target>
539 Mein öffentliches Profil 692 Mein öffentliches Profil
540 </target> 693 </target>
541 <context-group name="null"> 694 <context-group name="null">
542 <context context-type="linenumber">18</context> 695 <context context-type="linenumber">16</context>
543 </context-group> 696 </context-group>
544 </trans-unit> 697 </trans-unit>
545 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 698 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -550,7 +703,7 @@ Konto erstellen</target>
550 Mein Konto 703 Mein Konto
551 </target> 704 </target>
552 <context-group name="null"> 705 <context-group name="null">
553 <context context-type="linenumber">22</context> 706 <context context-type="linenumber">20</context>
554 </context-group> 707 </context-group>
555 </trans-unit> 708 </trans-unit>
556 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 709 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -561,7 +714,7 @@ Konto erstellen</target>
561 Meine Videos 714 Meine Videos
562 </target> 715 </target>
563 <context-group name="null"> 716 <context-group name="null">
564 <context context-type="linenumber">26</context> 717 <context context-type="linenumber">24</context>
565 </context-group> 718 </context-group>
566 </trans-unit> 719 </trans-unit>
567 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 720 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -572,14 +725,14 @@ Konto erstellen</target>
572 Abmelden 725 Abmelden
573 </target> 726 </target>
574 <context-group name="null"> 727 <context-group name="null">
575 <context context-type="linenumber">30</context> 728 <context context-type="linenumber">28</context>
576 </context-group> 729 </context-group>
577 </trans-unit> 730 </trans-unit>
578 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 731 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
579 <source>Create an account</source> 732 <source>Create an account</source>
580 <target>Konto erstellen</target> 733 <target>Konto erstellen</target>
581 <context-group name="null"> 734 <context-group name="null">
582 <context context-type="linenumber">39</context> 735 <context context-type="linenumber">37</context>
583 </context-group> 736 </context-group>
584 </trans-unit> 737 </trans-unit>
585 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 738 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -593,49 +746,49 @@ Konto erstellen</target>
593 <source>Subscriptions</source> 746 <source>Subscriptions</source>
594 <target>Abos</target> 747 <target>Abos</target>
595 <context-group name="null"> 748 <context-group name="null">
596 <context context-type="linenumber">47</context> 749 <context context-type="linenumber">45</context>
597 </context-group> 750 </context-group>
598 </trans-unit> 751 </trans-unit>
599 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 752 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
600 <source>Overview</source> 753 <source>Overview</source>
601 <target>Ãœbersicht</target> 754 <target>Ãœbersicht</target>
602 <context-group name="null"> 755 <context-group name="null">
603 <context context-type="linenumber">52</context> 756 <context context-type="linenumber">50</context>
604 </context-group> 757 </context-group>
605 </trans-unit> 758 </trans-unit>
606 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 759 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
607 <source>Trending</source> 760 <source>Trending</source>
608 <target>Beliebt</target> 761 <target>Beliebt</target>
609 <context-group name="null"> 762 <context-group name="null">
610 <context context-type="linenumber">57</context> 763 <context context-type="linenumber">55</context>
611 </context-group> 764 </context-group>
612 </trans-unit> 765 </trans-unit>
613 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 766 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
614 <source>Recently added</source> 767 <source>Recently added</source>
615 <target>Kürzlich hinzugefügt</target> 768 <target>Kürzlich hinzugefügt</target>
616 <context-group name="null"> 769 <context-group name="null">
617 <context context-type="linenumber">62</context> 770 <context context-type="linenumber">60</context>
618 </context-group> 771 </context-group>
619 </trans-unit> 772 </trans-unit>
620 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 773 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
621 <source>Local</source> 774 <source>Local</source>
622 <target>Lokal</target> 775 <target>Lokal</target>
623 <context-group name="null"> 776 <context-group name="null">
624 <context context-type="linenumber">67</context> 777 <context context-type="linenumber">65</context>
625 </context-group> 778 </context-group>
626 </trans-unit> 779 </trans-unit>
627 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 780 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
628 <source>More</source> 781 <source>More</source>
629 <target>Mehr</target> 782 <target>Mehr</target>
630 <context-group name="null"> 783 <context-group name="null">
631 <context context-type="linenumber">72</context> 784 <context context-type="linenumber">70</context>
632 </context-group> 785 </context-group>
633 </trans-unit> 786 </trans-unit>
634 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 787 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
635 <source>Administration</source> 788 <source>Administration</source>
636 <target>Administration</target> 789 <target>Administration</target>
637 <context-group name="null"> 790 <context-group name="null">
638 <context context-type="linenumber">76</context> 791 <context context-type="linenumber">74</context>
639 </context-group> 792 </context-group>
640 </trans-unit> 793 </trans-unit>
641 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 794 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -645,11 +798,18 @@ Konto erstellen</target>
645 <context context-type="linenumber">25</context> 798 <context context-type="linenumber">25</context>
646 </context-group> 799 </context-group>
647 </trans-unit> 800 </trans-unit>
801 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
802 <source>Show keyboard shortcuts</source>
803 <target>Zeige Tastatur-Kürzel</target>
804 <context-group name="null">
805 <context context-type="linenumber">89</context>
806 </context-group>
807 </trans-unit>
648 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 808 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
649 <source>Toggle dark interface</source> 809 <source>Toggle dark interface</source>
650 <target>Dunkle Oberfläche umschalten</target> 810 <target>Dunkle Oberfläche umschalten</target>
651 <context-group name="null"> 811 <context-group name="null">
652 <context context-type="linenumber">94</context> 812 <context context-type="linenumber">92</context>
653 </context-group> 813 </context-group>
654 </trans-unit> 814 </trans-unit>
655 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 815 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -689,7 +849,7 @@ Konto erstellen</target>
689 </trans-unit> 849 </trans-unit>
690 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238"> 850 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
691 <source>Display sensitive content</source> 851 <source>Display sensitive content</source>
692 <target>Anstößige Inhalte anzeigen</target> 852 <target>Anstößige Inhalte zeigen</target>
693 <context-group name="null"> 853 <context-group name="null">
694 <context context-type="linenumber">33</context> 854 <context context-type="linenumber">33</context>
695 </context-group> 855 </context-group>
@@ -750,11 +910,18 @@ Konto erstellen</target>
750 <context context-type="linenumber">94</context> 910 <context context-type="linenumber">94</context>
751 </context-group> 911 </context-group>
752 </trans-unit> 912 </trans-unit>
913 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
914 <source>Display unlisted and private videos</source>
915 <target>Private und nicht gelisteten Videos aufzeigen</target>
916 <context-group name="null">
917 <context context-type="linenumber">14</context>
918 </context-group>
919 </trans-unit>
753 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 920 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
754 <source>No results.</source> 921 <source>No results.</source>
755 <target>Keine Ergebnisse.</target> 922 <target>Keine Ergebnisse.</target>
756 <context-group name="null"> 923 <context-group name="null">
757 <context context-type="linenumber">7</context> 924 <context context-type="linenumber">20</context>
758 </context-group> 925 </context-group>
759 </trans-unit> 926 </trans-unit>
760 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 927 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -768,6 +935,17 @@ Konto erstellen</target>
768 <context context-type="linenumber">6</context> 935 <context context-type="linenumber">6</context>
769 </context-group> 936 </context-group>
770 </trans-unit> 937 </trans-unit>
938 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
939 <source>
940 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
941 </source>
942 <target>
943 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
944 </target>
945 <context-group name="null">
946 <context context-type="linenumber">14</context>
947 </context-group>
948 </trans-unit>
771 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 949 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
772 <source> 950 <source>
773 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 951 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -791,7 +969,7 @@ Konto erstellen</target>
791 <source>Instance</source> 969 <source>Instance</source>
792 <target>Instanz</target> 970 <target>Instanz</target>
793 <context-group name="null"> 971 <context-group name="null">
794 <context context-type="linenumber">8</context> 972 <context context-type="linenumber">12</context>
795 </context-group> 973 </context-group>
796 </trans-unit> 974 </trans-unit>
797 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 975 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -801,15 +979,22 @@ Konto erstellen</target>
801 <context context-type="linenumber">7</context> 979 <context context-type="linenumber">7</context>
802 </context-group> 980 </context-group>
803 </trans-unit> 981 </trans-unit>
804 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 982 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
805 <source> 983 <source>
806 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 984 Cancel
807</source> 985 </source>
808 <target> 986 <target>
809 Ãœber die Instanz <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 987 Abbrechen
810</target> 988 </target>
811 <context-group name="null"> 989 <context-group name="null">
812 <context context-type="linenumber">1</context> 990 <context context-type="linenumber">26</context>
991 </context-group>
992 </trans-unit>
993 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
994 <source>Submit</source>
995 <target>Abschicken</target>
996 <context-group name="null">
997 <context context-type="linenumber">31</context>
813 </context-group> 998 </context-group>
814 </trans-unit> 999 </trans-unit>
815 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1000 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -823,47 +1008,14 @@ Konto erstellen</target>
823 <source>Terms</source> 1008 <source>Terms</source>
824 <target>Bestimmungen</target> 1009 <target>Bestimmungen</target>
825 <context-group name="null"> 1010 <context-group name="null">
826 <context context-type="linenumber">44</context> 1011 <context context-type="linenumber">39</context>
827 </context-group> 1012 </context-group>
828 </trans-unit> 1013 </trans-unit>
829 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1014 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
830 <source>User registration is allowed and</source> 1015 <source>User registration is allowed and</source>
831 <target>Benutzerregistrierung ist möglich und</target> 1016 <target>Benutzerregistrierung ist möglich und</target>
832 <context-group name="null"> 1017 <context-group name="null">
833 <context context-type="linenumber">25</context> 1018 <context context-type="linenumber">29</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
837 <source>
838 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
839 </source>
840 <target>
841 diese Instanz stellt für die Videos ihrer Nutzer einen Speicherplatz von <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> zur Verfügung.
842 </target>
843 <context-group name="null">
844 <context context-type="linenumber">27</context>
845 </context-group>
846 </trans-unit>
847 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
848 <source>
849 this instance provides unlimited space for the videos of its users.
850 </source>
851 <target>
852 diese Instanz stellt unbegrenzten Speicherplatz für die Videos ihrer Nutzer zur Verfügung.
853 </target>
854 <context-group name="null">
855 <context context-type="linenumber">31</context>
856 </context-group>
857 </trans-unit>
858 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
859 <source>
860 User registration is currently not allowed.
861 </source>
862 <target>
863 Die Benutzerregistrierung ist zur Zeit nicht erlaubt.
864 </target>
865 <context-group name="null">
866 <context context-type="linenumber">36</context>
867 </context-group> 1019 </context-group>
868 </trans-unit> 1020 </trans-unit>
869 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1021 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -879,7 +1031,7 @@ Konto erstellen</target>
879 </trans-unit> 1031 </trans-unit>
880 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf"> 1032 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf">
881 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source> 1033 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source>
882 <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die P2P direkt im Browser verwendet (WebTorrent).</target> 1034 <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die WebTorrent P2P-Technologie direkt im Browser verwendet.</target>
883 <context-group name="null"> 1035 <context-group name="null">
884 <context context-type="linenumber">6</context> 1036 <context context-type="linenumber">6</context>
885 </context-group> 1037 </context-group>
@@ -889,7 +1041,7 @@ Konto erstellen</target>
889 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1041 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
890 </source> 1042 </source>
891 <target> 1043 <target>
892 Es ist freie Open-Source-Software, die unter der <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3-Lizenz<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> steht. 1044 Es handelt sich um freie Open-Source-Software, die unter der <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3-Lizenz<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> steht.
893 </target> 1045 </target>
894 <context-group name="null"> 1046 <context-group name="null">
895 <context context-type="linenumber">8</context> 1047 <context context-type="linenumber">8</context>
@@ -900,7 +1052,7 @@ Konto erstellen</target>
900 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1052 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
901 </source> 1053 </source>
902 <target> 1054 <target>
903 Besuche für weitere Informationen <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1055 Für weitere Informationen besuche <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
904 </target> 1056 </target>
905 <context-group name="null"> 1057 <context-group name="null">
906 <context context-type="linenumber">12</context> 1058 <context context-type="linenumber">12</context>
@@ -919,7 +1071,7 @@ Konto erstellen</target>
919 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video. 1071 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
920 </source> 1072 </source>
921 <target> 1073 <target>
922 PeerTube verwendet das BitTorrent-Protokoll, um Bandbreite zwischen den Usern aufzuteilen. 1074 PeerTube verwendet das BitTorrent-Protokoll, um Bandbreite zwischen den Nutzern aufzuteilen.
923 Das setzt voraus, dass deine IP-Adresse auf dem BitTorrent-Tracker zwischengespeichert wird, solange du dir ein Video ansiehst oder herunterlädst. 1075 Das setzt voraus, dass deine IP-Adresse auf dem BitTorrent-Tracker zwischengespeichert wird, solange du dir ein Video ansiehst oder herunterlädst.
924 </target> 1076 </target>
925 <context-group name="null"> 1077 <context-group name="null">
@@ -939,7 +1091,7 @@ Konto erstellen</target>
939 In practice, this is much more difficult because: 1091 In practice, this is much more difficult because:
940 </source> 1092 </source>
941 <target> 1093 <target>
942 Theoretisch könnte jemand mit genug technischer Erfahrung herausfinden, welche IP-Adresse welches Video herunterlädt. 1094 Theoretisch könnte jemand mit genug technischer Erfahrung herausfinden, mit welcher IP-Adresse welches Video heruntergeladen wird.
943 In der Praxis ist das jedoch sehr schwierig, denn: 1095 In der Praxis ist das jedoch sehr schwierig, denn:
944 </target> 1096 </target>
945 <context-group name="null"> 1097 <context-group name="null">
@@ -953,7 +1105,7 @@ Konto erstellen</target>
953 </source> 1105 </source>
954 <target> 1106 <target>
955 Der Angreifer müsste für jedes Video eine separate HTTP-Anfrage senden. 1107 Der Angreifer müsste für jedes Video eine separate HTTP-Anfrage senden.
956 Möchte er alle Videos von PeerTube verfolgen, so müsste er genausoviele Anfragen senden, wie es Videos gibt. (also eine ganze Menge!) 1108 Möchte er alle Videos von PeerTube verfolgen, so müsste er genau so viele Anfragen senden, wie es Videos gibt – also möglicherweise eine ganze Menge.
957 </target> 1109 </target>
958 <context-group name="null"> 1110 <context-group name="null">
959 <context context-type="linenumber">33</context> 1111 <context context-type="linenumber">33</context>
@@ -966,7 +1118,7 @@ Konto erstellen</target>
966 </source> 1118 </source>
967 <target> 1119 <target>
968 Für jede gesendete Anfrage gibt der Tracker eine begrenzte Anzahl zufälliger Peers zurück. 1120 Für jede gesendete Anfrage gibt der Tracker eine begrenzte Anzahl zufälliger Peers zurück.
969 Wenn sich z. B. 1000 Peers im Schwarm befinden und der Tracker immer nur 20 Peer pro Anfrage versendet, müssten mindestens 50 Anfragen gesendet werden, um jeden Peer im Schwarm zu kennen. 1121 Wenn sich z. B. 1000 Peers im Schwarm befinden und der Tracker immer nur 20 Peers pro Anfrage versendet, müssten mindestens 50 Anfragen gesendet werden, um jeden Peer im Schwarm zu kennen.
970 </target> 1122 </target>
971 <context-group name="null"> 1123 <context-group name="null">
972 <context context-type="linenumber">38</context> 1124 <context context-type="linenumber">38</context>
@@ -977,7 +1129,7 @@ Konto erstellen</target>
977 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour 1129 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
978 </source> 1130 </source>
979 <target> 1131 <target>
980 Diese Anfragen müssen regelmäßig versandt werden, damit bekannt ist, wer anfängt oder aufhört, sich ein Video anzusehen. Es ist leicht, diese Art von Verhalten zu entdecken 1132 Diese Anfragen müssten regelmäßig versendet werden, um es mitzubekommen, wenn jemand anfängt oder aufhört, sich ein Video anzusehen. Es ist leicht, derartiges Verhalten zu entdecken.
981 </target> 1133 </target>
982 <context-group name="null"> 1134 <context-group name="null">
983 <context context-type="linenumber">43</context> 1135 <context context-type="linenumber">43</context>
@@ -988,7 +1140,7 @@ Konto erstellen</target>
988 If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video 1140 If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video
989 </source> 1141 </source>
990 <target> 1142 <target>
991 Wenn eine IP im Tracker gespeichert wird, heißt das nicht unbedingt, dass die zugehörige Person das Video auch tatsächlich angesehen hat. 1143 Wenn eine IP-Adresse im Tracker gespeichert wird, heißt das nicht unbedingt, dass die zugehörige Person das Video auch tatsächlich angesehen hat.
992 </target> 1144 </target>
993 <context-group name="null"> 1145 <context-group name="null">
994 <context context-type="linenumber">47</context> 1146 <context context-type="linenumber">47</context>
@@ -1014,7 +1166,7 @@ Konto erstellen</target>
1014 <target> 1166 <target>
1015 Web-Peers sind nicht öffentlich einsehbar: Weil wir WebRTC im Browser benutzen (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>mit der WebTorrent-Bibliothek<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), ist das Protokoll verschieden vom klassischen BitTorrent. 1167 Web-Peers sind nicht öffentlich einsehbar: Weil wir WebRTC im Browser benutzen (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>mit der WebTorrent-Bibliothek<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), ist das Protokoll verschieden vom klassischen BitTorrent.
1016 Wenn du deinen Browser benutzt, sendest du ein Signal mit deiner IP-Adresse zum Tracker, der zufällig andere Peers aussucht, an die das Signal weitergeleitet wird. 1168 Wenn du deinen Browser benutzt, sendest du ein Signal mit deiner IP-Adresse zum Tracker, der zufällig andere Peers aussucht, an die das Signal weitergeleitet wird.
1017 Siehe <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>dieses Dokument<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> für weitere Informationen 1169 Siehe <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>dieses Dokument<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> für weitere Informationen.
1018 </target> 1170 </target>
1019 <context-group name="null"> 1171 <context-group name="null">
1020 <context context-type="linenumber">55</context> 1172 <context context-type="linenumber">55</context>
@@ -1026,8 +1178,8 @@ Konto erstellen</target>
1026 There are much more effective ways to get that kind of information. 1178 There are much more effective ways to get that kind of information.
1027 </source> 1179 </source>
1028 <target> 1180 <target>
1029 Das Schlimmstfall-Szenario einer durchschnittlichen Person, die ihre Freunde ausspäht ist relativ unwahrscheinlich. 1181 Das Worst-Case-Szenario eines gewöhnlichen Nutzers, der so seine Freunde ausspäht, ist relativ unwahrscheinlich.
1030 Es gibt viel effektivere Möglichkeiten, um an diese Art von Informationen zu gelangen. 1182 Es gibt viel bessere Möglichkeiten, um an diese Informationen zu gelangen.
1031 </target> 1183 </target>
1032 <context-group name="null"> 1184 <context-group name="null">
1033 <context context-type="linenumber">62</context> 1185 <context context-type="linenumber">62</context>
@@ -1079,19 +1231,19 @@ Konto erstellen</target>
1079 </trans-unit> 1231 </trans-unit>
1080 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41"> 1232 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
1081 <source>What will be done to mitigate this problem?</source> 1233 <source>What will be done to mitigate this problem?</source>
1082 <target>Was wird getan, um das Problem zu beheben?</target> 1234 <target>Was wird getan, um dieses Problem zu beheben?</target>
1083 <context-group name="null"> 1235 <context-group name="null">
1084 <context context-type="linenumber">83</context> 1236 <context context-type="linenumber">83</context>
1085 </context-group> 1237 </context-group>
1086 </trans-unit> 1238 </trans-unit>
1087 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1239 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1088 <source> 1240 <source>
1089 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1241 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1090 In the meantime, we want to test different ideas related to this issue: 1242 In the meantime, we want to test different ideas related to this issue:
1091 </source> 1243 </source>
1092 <target> 1244 <target>
1093 PeerTube befindet sich noch in der Beta-Phase und möchte die besten Gegenmaßnahmen bereitstellen, wenn die Software als stabil angesehen wird. 1245 PeerTube ist in der frühen Entwicklungsphase und es ist geplant, die besten Gegenmaßnahmen in der nächsten stabilen Version zu implementieren.
1094 In der Zwischenzeit wollen wir verschiedene Ideen in diesem Zusammenhang ausprobieren: 1246 Bis dahin wollen wir verschiedene Ideen für dieses Problem testen:
1095 </target> 1247 </target>
1096 <context-group name="null"> 1248 <context-group name="null">
1097 <context context-type="linenumber">85</context> 1249 <context context-type="linenumber">85</context>
@@ -1113,7 +1265,7 @@ Konto erstellen</target>
1113 </trans-unit> 1265 </trans-unit>
1114 <trans-unit id="ba77e356eaa5c06caaf5c8734c361d1a5415fe1c"> 1266 <trans-unit id="ba77e356eaa5c06caaf5c8734c361d1a5415fe1c">
1115 <source>Ring a bell if there are unusual requests (being tested)</source> 1267 <source>Ring a bell if there are unusual requests (being tested)</source>
1116 <target>Informiere mich bei merk¼rdigen Anfragen (wird getestet).</target> 1268 <target>Bei ungewöhnlichen Anfragen darauf aufmerksam machen (wird getestet).</target>
1117 <context-group name="null"> 1269 <context-group name="null">
1118 <context context-type="linenumber">93</context> 1270 <context context-type="linenumber">93</context>
1119 </context-group> 1271 </context-group>
@@ -1132,18 +1284,53 @@ Konto erstellen</target>
1132 <context context-type="linenumber">95</context> 1284 <context context-type="linenumber">95</context>
1133 </context-group> 1285 </context-group>
1134 </trans-unit> 1286 </trans-unit>
1287 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1288 <source>Banned</source>
1289 <target>Gebannt</target>
1290 <context-group name="null">
1291 <context context-type="linenumber">12</context>
1292 </context-group>
1293 </trans-unit>
1294 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1295 <source>Muted</source>
1296 <target>Stummgeschaltet</target>
1297 <context-group name="null">
1298 <context context-type="linenumber">13</context>
1299 </context-group>
1300 </trans-unit>
1301 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1302 <source>Muted by your instance</source>
1303 <target>Von deiner Instanz stummgeschaltet</target>
1304 <context-group name="null">
1305 <context context-type="linenumber">14</context>
1306 </context-group>
1307 </trans-unit>
1308 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1309 <source>Instance muted</source>
1310 <target>Instanz stummgeschaltet</target>
1311 <context-group name="null">
1312 <context context-type="linenumber">15</context>
1313 </context-group>
1314 </trans-unit>
1315 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1316 <source>Instance muted by your instance</source>
1317 <target>Diese Instanz wurde deiner Instanz stummgeschaltet</target>
1318 <context-group name="null">
1319 <context context-type="linenumber">16</context>
1320 </context-group>
1321 </trans-unit>
1135 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1322 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1136 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1323 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1137 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> Abonnenten</target> 1324 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> Abonnenten</target>
1138 <context-group name="null"> 1325 <context-group name="null">
1139 <context context-type="linenumber">12</context> 1326 <context context-type="linenumber">24</context>
1140 </context-group> 1327 </context-group>
1141 </trans-unit> 1328 </trans-unit>
1142 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1329 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1143 <source>Video channels</source> 1330 <source>Video channels</source>
1144 <target>Kanäle</target> 1331 <target>Kanäle</target>
1145 <context-group name="null"> 1332 <context-group name="null">
1146 <context context-type="linenumber">19</context> 1333 <context context-type="linenumber">31</context>
1147 </context-group> 1334 </context-group>
1148 </trans-unit> 1335 </trans-unit>
1149 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1336 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1185,54 +1372,54 @@ Konto erstellen</target>
1185 <source>Short description</source> 1372 <source>Short description</source>
1186 <target>Kurze Beschreibung</target> 1373 <target>Kurze Beschreibung</target>
1187 <context-group name="null"> 1374 <context-group name="null">
1188 <context context-type="linenumber">22</context> 1375 <context context-type="linenumber">21</context>
1189 </context-group> 1376 </context-group>
1190 </trans-unit> 1377 </trans-unit>
1191 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1378 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1192 <source>Default client route</source> 1379 <source>Default client route</source>
1193 <target>Standardpfad (Client)</target> 1380 <target>Standardpfad (Client)</target>
1194 <context-group name="null"> 1381 <context-group name="null">
1195 <context context-type="linenumber">55</context> 1382 <context context-type="linenumber">48</context>
1196 </context-group> 1383 </context-group>
1197 </trans-unit> 1384 </trans-unit>
1198 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1385 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1199 <source>Videos Overview</source> 1386 <source>Videos Overview</source>
1200 <target>Video-Ãœbersicht</target> 1387 <target>Video-Ãœbersicht</target>
1201 <context-group name="null"> 1388 <context-group name="null">
1202 <context context-type="linenumber">58</context> 1389 <context context-type="linenumber">51</context>
1203 </context-group> 1390 </context-group>
1204 </trans-unit> 1391 </trans-unit>
1205 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1392 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1206 <source>Videos Trending</source> 1393 <source>Videos Trending</source>
1207 <target>Beliebte Videos</target> 1394 <target>Beliebte Videos</target>
1208 <context-group name="null"> 1395 <context-group name="null">
1209 <context context-type="linenumber">59</context> 1396 <context context-type="linenumber">52</context>
1210 </context-group> 1397 </context-group>
1211 </trans-unit> 1398 </trans-unit>
1212 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1399 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1213 <source>Videos Recently Added</source> 1400 <source>Videos Recently Added</source>
1214 <target>Kürzlich hinzugefügte Videos</target> 1401 <target>Kürzlich hinzugefügte Videos</target>
1215 <context-group name="null"> 1402 <context-group name="null">
1216 <context context-type="linenumber">60</context> 1403 <context context-type="linenumber">53</context>
1217 </context-group> 1404 </context-group>
1218 </trans-unit> 1405 </trans-unit>
1219 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1406 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1220 <source>Local videos</source> 1407 <source>Local videos</source>
1221 <target>Lokale Videos</target> 1408 <target>Lokale Videos</target>
1222 <context-group name="null"> 1409 <context-group name="null">
1223 <context context-type="linenumber">61</context> 1410 <context context-type="linenumber">54</context>
1224 </context-group> 1411 </context-group>
1225 </trans-unit> 1412 </trans-unit>
1226 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1413 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1227 <source>Policy on videos containing sensitive content</source> 1414 <source>Policy on videos containing sensitive content</source>
1228 <target>Verhalten bei Videos mit anstößigen Inhalten</target> 1415 <target>Verhalten bei Videos mit anstößigen Inhalten</target>
1229 <context-group name="null"> 1416 <context-group name="null">
1230 <context context-type="linenumber">70</context> 1417 <context context-type="linenumber">61</context>
1231 </context-group> 1418 </context-group>
1232 </trans-unit> 1419 </trans-unit>
1233 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1420 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
1234 <source>With &lt;strong&gt;Do not list&lt;/strong&gt; or &lt;strong&gt;Blur thumbnails&lt;/strong&gt;, a confirmation will be requested to watch the video.</source> 1421 <source>With &lt;strong&gt;Do not list&lt;/strong&gt; or &lt;strong&gt;Blur thumbnails&lt;/strong&gt;, a confirmation will be requested to watch the video.</source>
1235 <target>Bei Wahl der Optionen &lt;strong&gt;Nicht zeigen&lt;/strong&gt; oder &lt;strong&gt;Vorschaubilder verschwommen anzeigen&lt;/strong&gt; wird vor Ansicht des Videos eine Bestätigung gefordert.</target> 1422 <target>Bei Wahl der Optionen &lt;strong&gt;Nicht zeigen&lt;/strong&gt; oder &lt;strong&gt;Miniaturansichten verschwommen anzeigen&lt;/strong&gt; wird vor Ansicht des Videos eine Bestätigung gefordert.</target>
1236 <context-group name="null"> 1423 <context-group name="null">
1237 <context context-type="linenumber">6</context> 1424 <context context-type="linenumber">6</context>
1238 </context-group> 1425 </context-group>
@@ -1246,7 +1433,7 @@ Konto erstellen</target>
1246 </trans-unit> 1433 </trans-unit>
1247 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2"> 1434 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2">
1248 <source>Blur thumbnails</source> 1435 <source>Blur thumbnails</source>
1249 <target>Vorschaubilder verschwommen anzeigen</target> 1436 <target>Miniaturansichten verschwommen anzeigen</target>
1250 <context-group name="null"> 1437 <context-group name="null">
1251 <context context-type="linenumber">12</context> 1438 <context context-type="linenumber">12</context>
1252 </context-group> 1439 </context-group>
@@ -1262,21 +1449,42 @@ Konto erstellen</target>
1262 <source>Signup enabled</source> 1449 <source>Signup enabled</source>
1263 <target>Registrierung aktiviert</target> 1450 <target>Registrierung aktiviert</target>
1264 <context-group name="null"> 1451 <context-group name="null">
1265 <context context-type="linenumber">92</context> 1452 <context context-type="linenumber">84</context>
1266 </context-group> 1453 </context-group>
1267 </trans-unit> 1454 </trans-unit>
1268 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1455 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1269 <source>Signup requires email verification</source> 1456 <source>Signup requires email verification</source>
1270 <target>Registrierung erfordert eine Bestätigung der E-Mail-Adresse</target> 1457 <target>Registrierung erfordert eine Bestätigung der E-Mail-Adresse</target>
1271 <context-group name="null"> 1458 <context-group name="null">
1272 <context context-type="linenumber">97</context> 1459 <context context-type="linenumber">91</context>
1273 </context-group> 1460 </context-group>
1274 </trans-unit> 1461 </trans-unit>
1275 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1462 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1276 <source>Signup limit</source> 1463 <source>Signup limit</source>
1277 <target>Obergrenze für Registrierungen</target> 1464 <target>Obergrenze für Registrierungen</target>
1278 <context-group name="null"> 1465 <context-group name="null">
1279 <context context-type="linenumber">101</context> 1466 <context context-type="linenumber">96</context>
1467 </context-group>
1468 </trans-unit>
1469 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1470 <source>Users</source>
1471 <target>Benutzer</target>
1472 <context-group name="null">
1473 <context context-type="linenumber">105</context>
1474 </context-group>
1475 </trans-unit>
1476 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1477 <source>User default video quota</source>
1478 <target>Standardkontingent für die Videos eines Nutzers</target>
1479 <context-group name="null">
1480 <context context-type="linenumber">109</context>
1481 </context-group>
1482 </trans-unit>
1483 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1484 <source>User default daily upload limit</source>
1485 <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
1486 <context-group name="null">
1487 <context context-type="linenumber">121</context>
1280 </context-group> 1488 </context-group>
1281 </trans-unit> 1489 </trans-unit>
1282 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1490 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1286,53 +1494,32 @@ Konto erstellen</target>
1286 <context context-type="linenumber">42</context> 1494 <context context-type="linenumber">42</context>
1287 </context-group> 1495 </context-group>
1288 </trans-unit> 1496 </trans-unit>
1289 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1497 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1290 <source>Video import with HTTP enabled</source> 1498 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1291 <target>Video-Import über HTTP aktiviert</target> 1499 <target>Video durch HTTP URL (z.b. YouTube©) import erlaubt.</target>
1292 <context-group name="null"> 1500 <context-group name="null">
1293 <context context-type="linenumber">115</context> 1501 <context context-type="linenumber">141</context>
1294 </context-group> 1502 </context-group>
1295 </trans-unit> 1503 </trans-unit>
1296 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1504 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1297 <source>Video import with a torrent file or a magnet URI enabled</source> 1505 <source>Video import with a torrent file or a magnet URI enabled</source>
1298 <target>Video-Import über eine Torrent-Datei oder einen Magnet-Link aktiviert</target> 1506 <target>Video-Import über eine Torrent-Datei oder einen Magnet-Link aktiviert</target>
1299 <context-group name="null"> 1507 <context-group name="null">
1300 <context context-type="linenumber">120</context> 1508 <context context-type="linenumber">148</context>
1301 </context-group> 1509 </context-group>
1302 </trans-unit> 1510 </trans-unit>
1303 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1511 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1304 <source>Administrator</source> 1512 <source>Administrator</source>
1305 <target>Administrator</target> 1513 <target>Administrator</target>
1306 <context-group name="null"> 1514 <context-group name="null">
1307 <context context-type="linenumber">123</context> 1515 <context context-type="linenumber">155</context>
1308 </context-group> 1516 </context-group>
1309 </trans-unit> 1517 </trans-unit>
1310 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1518 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1311 <source>Admin email</source> 1519 <source>Admin email</source>
1312 <target>Admin E-Mail</target> 1520 <target>Admin E-Mail</target>
1313 <context-group name="null"> 1521 <context-group name="null">
1314 <context context-type="linenumber">126</context> 1522 <context context-type="linenumber">158</context>
1315 </context-group>
1316 </trans-unit>
1317 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1318 <source>Users</source>
1319 <target>Benutzer</target>
1320 <context-group name="null">
1321 <context context-type="linenumber">136</context>
1322 </context-group>
1323 </trans-unit>
1324 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1325 <source>User default video quota</source>
1326 <target>Standardkontingent für die Videos eines Nutzers</target>
1327 <context-group name="null">
1328 <context context-type="linenumber">139</context>
1329 </context-group>
1330 </trans-unit>
1331 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1332 <source>User default daily upload limit</source>
1333 <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
1334 <context-group name="null">
1335 <context context-type="linenumber">153</context>
1336 </context-group> 1523 </context-group>
1337 </trans-unit> 1524 </trans-unit>
1338 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1525 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1346,81 +1533,70 @@ Konto erstellen</target>
1346 <source>Twitter</source> 1533 <source>Twitter</source>
1347 <target>Twitter</target> 1534 <target>Twitter</target>
1348 <context-group name="null"> 1535 <context-group name="null">
1349 <context context-type="linenumber">170</context> 1536 <context context-type="linenumber">178</context>
1350 </context-group> 1537 </context-group>
1351 </trans-unit> 1538 </trans-unit>
1352 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1539 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1353 <source>Your Twitter username</source> 1540 <source>Your Twitter username</source>
1354 <target>Dein Twitter-Benutzername</target> 1541 <target>Dein Twitter-Benutzername</target>
1355 <context-group name="null"> 1542 <context-group name="null">
1356 <context context-type="linenumber">173</context> 1543 <context context-type="linenumber">184</context>
1357 </context-group> 1544 </context-group>
1358 </trans-unit> 1545 </trans-unit>
1359 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1546 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1360 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1547 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1361 <target>Zeigt den Twitter-Account für die Webseite, auf der der Inhalt veröffentlicht wurde.</target> 1548 <target>Zeigt den Twitter-Account für die Webseite, auf der der Inhalt veröffentlicht wurde.</target>
1362 <context-group name="null"> 1549 <context-group name="null">
1363 <context context-type="linenumber">176</context> 1550 <context context-type="linenumber">187</context>
1364 </context-group> 1551 </context-group>
1365 </trans-unit> 1552 </trans-unit>
1366 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1553 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1367 <source>Instance whitelisted by Twitter</source> 1554 <source>Instance whitelisted by Twitter</source>
1368 <target>Instanz von Twitter vertraut</target> 1555 <target>Instanz von Twitter vertraut</target>
1369 <context-group name="null"> 1556 <context-group name="null">
1370 <context context-type="linenumber">189</context> 1557 <context context-type="linenumber">199</context>
1371 </context-group>
1372 </trans-unit>
1373 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1374 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1375 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1376 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1377 <target>Wenn deiner Instanz von Twitter vertraut wird, wird ein Video-Player in den Twitter-Feed deiner geteilten PeerTube-Videos eingebettet.&lt;br /&gt;
1378 Wenn der Instanz nicht vertraut wird, benutzen wir ein Vorschaubild, das zu deiner PeerTube-Instanz führt.&lt;br /&gt;&lt;br /&gt;
1379 Markiere dieses Kontrollkästchen, speichere die Einstellung und probiere es auf &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; mit einer Video-URL deiner Instanz aus (https://example.com/videos/watch/blabla), um herauszufinden, ob deiner Instanz vertraut wird.</target>
1380 <context-group name="null">
1381 <context context-type="linenumber">190</context>
1382 </context-group> 1558 </context-group>
1383 </trans-unit> 1559 </trans-unit>
1384 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1560 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1385 <source>Services</source> 1561 <source>Services</source>
1386 <target>Dienste</target> 1562 <target>Dienste</target>
1387 <context-group name="null"> 1563 <context-group name="null">
1388 <context context-type="linenumber">168</context> 1564 <context context-type="linenumber">176</context>
1389 </context-group> 1565 </context-group>
1390 </trans-unit> 1566 </trans-unit>
1391 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1567 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1392 <source>Transcoding</source> 1568 <source>Transcoding</source>
1393 <target>Transkodierung</target> 1569 <target>Transkodierung</target>
1394 <context-group name="null"> 1570 <context-group name="null">
1395 <context context-type="linenumber">200</context> 1571 <context context-type="linenumber">215</context>
1396 </context-group> 1572 </context-group>
1397 </trans-unit> 1573 </trans-unit>
1398 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1574 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1399 <source>Transcoding enabled</source> 1575 <source>Transcoding enabled</source>
1400 <target>Transkodierung an</target> 1576 <target>Transkodierung an</target>
1401 <context-group name="null"> 1577 <context-group name="null">
1402 <context context-type="linenumber">204</context> 1578 <context context-type="linenumber">221</context>
1403 </context-group> 1579 </context-group>
1404 </trans-unit> 1580 </trans-unit>
1405 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1581 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1406 <source>If you disable transcoding, many videos from your users will not work!</source> 1582 <source>If you disable transcoding, many videos from your users will not work!</source>
1407 <target>Wenn du die Transkodierung abschaltest, werden viele Videos nicht laufen!</target> 1583 <target>Wenn du die Transkodierung abschaltest, werden viele Videos nicht laufen!</target>
1408 <context-group name="null"> 1584 <context-group name="null">
1409 <context context-type="linenumber">205</context> 1585 <context context-type="linenumber">222</context>
1410 </context-group> 1586 </context-group>
1411 </trans-unit> 1587 </trans-unit>
1412 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1588 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1413 <source>Transcoding threads</source> 1589 <source>Transcoding threads</source>
1414 <target>Transcodierungsthreads</target> 1590 <target>Transcodierungsthreads</target>
1415 <context-group name="null"> 1591 <context-group name="null">
1416 <context context-type="linenumber">211</context> 1592 <context context-type="linenumber">237</context>
1417 </context-group> 1593 </context-group>
1418 </trans-unit> 1594 </trans-unit>
1419 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1595 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1420 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1596 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1421 <target>Eingestellte Auflösung: <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target> 1597 <target>Eingestellte Auflösung: <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
1422 <context-group name="null"> 1598 <context-group name="null">
1423 <context context-type="linenumber">227</context> 1599 <context context-type="linenumber">252</context>
1424 </context-group> 1600 </context-group>
1425 </trans-unit> 1601 </trans-unit>
1426 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1602 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1435,105 +1611,70 @@ Konto erstellen</target>
1435 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1611 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1436 </target> 1612 </target>
1437 <context-group name="null"> 1613 <context-group name="null">
1438 <context context-type="linenumber">233</context> 1614 <context context-type="linenumber">260</context>
1439 </context-group> 1615 </context-group>
1440 </trans-unit> 1616 </trans-unit>
1441 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1617 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1442 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1618 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1443 <target>Einige Dateien (Vorschau, Untertitel) werden nicht verteilt gespeichert. Wir laden sie direkt von der Ursprungsinstanz und speichern sie zwischen.</target> 1619 <target>Einige Dateien (Vorschau, Untertitel) werden nicht verteilt gespeichert. Wir laden sie direkt von der Ursprungsinstanz und speichern sie zwischen.</target>
1444 <context-group name="null"> 1620 <context-group name="null">
1445 <context context-type="linenumber">238</context> 1621 <context context-type="linenumber">265</context>
1446 </context-group> 1622 </context-group>
1447 </trans-unit> 1623 </trans-unit>
1448 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1624 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1449 <source>Previews cache size</source> 1625 <source>Previews cache size</source>
1450 <target>Cachegröße der Vorschau</target> 1626 <target>Cachegröße der Vorschau</target>
1451 <context-group name="null"> 1627 <context-group name="null">
1452 <context context-type="linenumber">243</context> 1628 <context context-type="linenumber">271</context>
1453 </context-group> 1629 </context-group>
1454 </trans-unit> 1630 </trans-unit>
1455 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1631 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1456 <source>Video captions cache size</source> 1632 <source>Video captions cache size</source>
1457 <target>Cachegröße der Untertitel</target> 1633 <target>Cachegröße der Untertitel</target>
1458 <context-group name="null"> 1634 <context-group name="null">
1459 <context context-type="linenumber">254</context> 1635 <context context-type="linenumber">280</context>
1460 </context-group> 1636 </context-group>
1461 </trans-unit> 1637 </trans-unit>
1462 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1638 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1463 <source>Customizations</source> 1639 <source>Customizations</source>
1464 <target>Personalisierung</target> 1640 <target>Personalisierung</target>
1465 <context-group name="null"> 1641 <context-group name="null">
1466 <context context-type="linenumber">264</context> 1642 <context context-type="linenumber">289</context>
1467 </context-group> 1643 </context-group>
1468 </trans-unit> 1644 </trans-unit>
1469 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1645 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1470 <source>JavaScript</source> 1646 <source>JavaScript</source>
1471 <target>JavaScript</target> 1647 <target>JavaScript</target>
1472 <context-group name="null"> 1648 <context-group name="null">
1473 <context context-type="linenumber">267</context> 1649 <context context-type="linenumber">294</context>
1474 </context-group> 1650 </context-group>
1475 </trans-unit> 1651 </trans-unit>
1476 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1652 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1477 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1653 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1478 <target>Füge dein JavaScript ein.&lt;br /&gt;Beispiel: &lt;pre&gt;console.log('Meine Instanz ist großartig');&lt;/pre&gt;</target> 1654 <target>Füge dein JavaScript ein.&lt;br /&gt;Beispiel: &lt;pre&gt;console.log('Meine Instanz ist großartig');&lt;/pre&gt;</target>
1479 <context-group name="null"> 1655 <context-group name="null">
1480 <context context-type="linenumber">270</context> 1656 <context context-type="linenumber">297</context>
1481 </context-group>
1482 </trans-unit>
1483 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1484 <source>
1485 Write directly CSS code. Example:&lt;br /&gt;
1486 &lt;pre&gt;
1487 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1488 background-color: red;
1489 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1490 &lt;/pre&gt;
1491
1492 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1493 &lt;pre&gt;
1494 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1495 color: red;
1496 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1497 &lt;/pre&gt;
1498 </source>
1499 <target>
1500 Schreibe direkt CSS-Code. Beispiel:&lt;br /&gt;
1501 &lt;pre&gt;
1502 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1503 background-color: red;
1504 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1505 &lt;/pre&gt;
1506
1507 Stelle &lt;em&gt;#custom-css&lt;/em&gt; voran, um den Stil zu überschreiben. Beispiel:
1508 &lt;pre&gt;
1509 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1510 color: red;
1511 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1512 &lt;/pre&gt;
1513 </target>
1514 <context-group name="null">
1515 <context context-type="linenumber">286</context>
1516 </context-group> 1657 </context-group>
1517 </trans-unit> 1658 </trans-unit>
1518 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1659 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1519 <source>Advanced configuration</source> 1660 <source>Advanced configuration</source>
1520 <target>Erweiterte Einstellungen</target> 1661 <target>Erweiterte Einstellungen</target>
1521 <context-group name="null"> 1662 <context-group name="null">
1522 <context context-type="linenumber">197</context> 1663 <context context-type="linenumber">212</context>
1523 </context-group> 1664 </context-group>
1524 </trans-unit> 1665 </trans-unit>
1525 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1666 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1526 <source>Update configuration</source> 1667 <source>Update configuration</source>
1527 <target>Einstellungen aktualisieren</target> 1668 <target>Einstellungen aktualisieren</target>
1528 <context-group name="null"> 1669 <context-group name="null">
1529 <context context-type="linenumber">314</context> 1670 <context context-type="linenumber">340</context>
1530 </context-group> 1671 </context-group>
1531 </trans-unit> 1672 </trans-unit>
1532 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1673 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1533 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1674 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1534 <target>Die Einstellungen sind anscheinend ungültig. Bitte suche nach potentiellen Fehlern in den verschiedenen Reitern.</target> 1675 <target>Die Einstellungen sind anscheinend ungültig. Bitte suche nach potentiellen Fehlern in den verschiedenen Reitern.</target>
1535 <context-group name="null"> 1676 <context-group name="null">
1536 <context context-type="linenumber">315</context> 1677 <context context-type="linenumber">341</context>
1537 </context-group> 1678 </context-group>
1538 </trans-unit> 1679 </trans-unit>
1539 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1680 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1616,6 +1757,13 @@ Konto erstellen</target>
1616 <context context-type="linenumber">21</context> 1757 <context context-type="linenumber">21</context>
1617 </context-group> 1758 </context-group>
1618 </trans-unit> 1759 </trans-unit>
1760 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1761 <source>Filter...</source>
1762 <target>Filtern...</target>
1763 <context-group name="null">
1764 <context context-type="linenumber">27</context>
1765 </context-group>
1766 </trans-unit>
1619 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1767 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1620 <source>ID</source> 1768 <source>ID</source>
1621 <target>ID</target> 1769 <target>ID</target>
@@ -1627,14 +1775,14 @@ Konto erstellen</target>
1627 <source>Score</source> 1775 <source>Score</source>
1628 <target>Punkte</target> 1776 <target>Punkte</target>
1629 <context-group name="null"> 1777 <context-group name="null">
1630 <context context-type="linenumber">8</context> 1778 <context context-type="linenumber">17</context>
1631 </context-group> 1779 </context-group>
1632 </trans-unit> 1780 </trans-unit>
1633 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1781 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1634 <source>Host</source> 1782 <source>Host</source>
1635 <target>Host</target> 1783 <target>Host</target>
1636 <context-group name="null"> 1784 <context-group name="null">
1637 <context context-type="linenumber">8</context> 1785 <context context-type="linenumber">19</context>
1638 </context-group> 1786 </context-group>
1639 </trans-unit> 1787 </trans-unit>
1640 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1788 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1651,11 +1799,25 @@ Konto erstellen</target>
1651 <context context-type="linenumber">11</context> 1799 <context context-type="linenumber">11</context>
1652 </context-group> 1800 </context-group>
1653 </trans-unit> 1801 </trans-unit>
1802 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1803 <source>Accepted</source>
1804 <target>Akzeptiert</target>
1805 <context-group name="null">
1806 <context context-type="linenumber">32</context>
1807 </context-group>
1808 </trans-unit>
1809 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1810 <source>Pending</source>
1811 <target>Ausstehend</target>
1812 <context-group name="null">
1813 <context context-type="linenumber">33</context>
1814 </context-group>
1815 </trans-unit>
1654 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8"> 1816 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1655 <source>Redundancy allowed</source> 1817 <source>Redundancy allowed</source>
1656 <target>Redundanz erlaubt</target> 1818 <target>Redundanz erlaubt</target>
1657 <context-group name="null"> 1819 <context-group name="null">
1658 <context context-type="linenumber">11</context> 1820 <context context-type="linenumber">22</context>
1659 </context-group> 1821 </context-group>
1660 </trans-unit> 1822 </trans-unit>
1661 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1823 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
@@ -1746,7 +1908,7 @@ Konto erstellen</target>
1746 <source>Role</source> 1908 <source>Role</source>
1747 <target>Benutzerrolle</target> 1909 <target>Benutzerrolle</target>
1748 <context-group name="null"> 1910 <context-group name="null">
1749 <context context-type="linenumber">20</context> 1911 <context context-type="linenumber">43</context>
1750 </context-group> 1912 </context-group>
1751 </trans-unit> 1913 </trans-unit>
1752 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1914 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1768,64 +1930,53 @@ Konto erstellen</target>
1768 <context context-type="linenumber">72</context> 1930 <context context-type="linenumber">72</context>
1769 </context-group> 1931 </context-group>
1770 </trans-unit> 1932 </trans-unit>
1771 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 1933 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1772 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 1934 <source>Users list</source>
1773 <target><x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/> sperren</target> 1935 <target>Benutzerliste</target>
1774 <context-group name="null">
1775 <context context-type="linenumber">3</context>
1776 </context-group>
1777 </trans-unit>
1778 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1779 <source>Reason...</source>
1780 <target>Grund...</target>
1781 <context-group name="null"> 1936 <context-group name="null">
1782 <context context-type="linenumber">11</context> 1937 <context context-type="linenumber">2</context>
1783 </context-group> 1938 </context-group>
1784 </trans-unit> 1939 </trans-unit>
1785 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251"> 1940 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1786 <source> 1941 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1787 A banned user will no longer be able to login. 1942 <target>Benutzername <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1788 </source>
1789 <target>
1790 Ein gesperrter Nutzer wird sich nicht mehr anmelden können.
1791 </target>
1792 <context-group name="null"> 1943 <context-group name="null">
1793 <context context-type="linenumber">17</context> 1944 <context context-type="linenumber">40</context>
1794 </context-group> 1945 </context-group>
1795 </trans-unit> 1946 </trans-unit>
1796 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 1947 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1797 <source>Ban this user</source> 1948 <source>(banned)</source>
1798 <target>Diesen Nutzer sperren.</target> 1949 <target>(gebannt)</target>
1799 <context-group name="null"> 1950 <context-group name="null">
1800 <context context-type="linenumber">25</context> 1951 <context context-type="linenumber">65</context>
1801 </context-group> 1952 </context-group>
1802 </trans-unit> 1953 </trans-unit>
1803 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1954 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1804 <source>Users list</source> 1955 <source>Go to the account page</source>
1805 <target>Benutzerliste</target> 1956 <target>Zur Kontoseite gehen</target>
1806 <context-group name="null"> 1957 <context-group name="null">
1807 <context context-type="linenumber">2</context> 1958 <context context-type="linenumber">133</context>
1808 </context-group> 1959 </context-group>
1809 </trans-unit> 1960 </trans-unit>
1810 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1961 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1811 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1962 <source>User's email must be verified to login</source>
1812 <target>Benutzername <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1963 <target>Die E-Mail-Adresse des Nutzers muss vor dem Einloggen bestätigt werden</target>
1813 <context-group name="null"> 1964 <context-group name="null">
1814 <context context-type="linenumber">17</context> 1965 <context context-type="linenumber">72</context>
1815 </context-group> 1966 </context-group>
1816 </trans-unit> 1967 </trans-unit>
1817 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1968 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1818 <source>Actions</source> 1969 <source>User's email is verified / User can login without email verification</source>
1819 <target>Aktionen</target> 1970 <target>Die E-Mail-Addresse des Nutzers wurde bestätigt / Nutzer kann ohne E-Mail-Bestätigung einloggen</target>
1820 <context-group name="null"> 1971 <context-group name="null">
1821 <context context-type="linenumber">33</context> 1972 <context context-type="linenumber">76</context>
1822 </context-group> 1973 </context-group>
1823 </trans-unit> 1974 </trans-unit>
1824 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1975 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1825 <source>Ban reason:</source> 1976 <source>Ban reason:</source>
1826 <target>Grund für die Sperrung:</target> 1977 <target>Grund für die Sperrung:</target>
1827 <context-group name="null"> 1978 <context-group name="null">
1828 <context context-type="linenumber">51</context> 1979 <context context-type="linenumber">95</context>
1829 </context-group> 1980 </context-group>
1830 </trans-unit> 1981 </trans-unit>
1831 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1982 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1888,6 +2039,13 @@ Konto erstellen</target>
1888 <context context-type="linenumber">33</context> 2039 <context context-type="linenumber">33</context>
1889 </context-group> 2040 </context-group>
1890 </trans-unit> 2041 </trans-unit>
2042 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2043 <source>Actions</source>
2044 <target>Aktionen</target>
2045 <context-group name="null">
2046 <context context-type="linenumber">35</context>
2047 </context-group>
2048 </trans-unit>
1891 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2049 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1892 <source>Reason:</source> 2050 <source>Reason:</source>
1893 <target>Grund:</target> 2051 <target>Grund:</target>
@@ -1920,14 +2078,14 @@ Konto erstellen</target>
1920 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2078 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1921 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2079 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1922 <context-group name="null"> 2080 <context-group name="null">
1923 <context context-type="linenumber">10</context> 2081 <context context-type="linenumber">11</context>
1924 </context-group> 2082 </context-group>
1925 </trans-unit> 2083 </trans-unit>
1926 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2084 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1927 <source>Blacklist reason:</source> 2085 <source>Blacklist reason:</source>
1928 <target>Grund für die Sperre:</target> 2086 <target>Grund für die Sperre:</target>
1929 <context-group name="null"> 2087 <context-group name="null">
1930 <context context-type="linenumber">41</context> 2088 <context context-type="linenumber">43</context>
1931 </context-group> 2089 </context-group>
1932 </trans-unit> 2090 </trans-unit>
1933 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2091 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1951,53 +2109,39 @@ Konto erstellen</target>
1951 <context context-type="linenumber">7</context> 2109 <context context-type="linenumber">7</context>
1952 </context-group> 2110 </context-group>
1953 </trans-unit> 2111 </trans-unit>
1954 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2112 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1955 <source>My settings</source> 2113 <source>Muted accounts</source>
1956 <target>Meine Einstellungen</target> 2114 <target>Stummgeschaltete Accounts</target>
1957 <context-group name="null"> 2115 <context-group name="null">
1958 <context context-type="linenumber">3</context> 2116 <context context-type="linenumber">2</context>
1959 </context-group> 2117 </context-group>
1960 </trans-unit> 2118 </trans-unit>
1961 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2119 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1962 <source>My library</source> 2120 <source>Muted servers</source>
1963 <target>Meine Bibliothek</target> 2121 <target>Stummgeschaltete Server</target>
1964 <context-group name="null"> 2122 <context-group name="null">
1965 <context context-type="linenumber">7</context> 2123 <context context-type="linenumber">11</context>
1966 </context-group> 2124 </context-group>
1967 </trans-unit> 2125 </trans-unit>
1968 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2126 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1969 <source>My channels</source> 2127 <source>Account</source>
1970 <target>Meine Kanäle</target> 2128 <target>Account</target>
1971 <context-group name="null"> 2129 <context-group name="null">
1972 <context context-type="linenumber">12</context> 2130 <context context-type="linenumber">12</context>
1973 </context-group> 2131 </context-group>
1974 </trans-unit> 2132 </trans-unit>
1975 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2133 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
1976 <source>My videos</source> 2134 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1977 <target>Meine Videos</target> 2135 <target>Stummgeschaltet am <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1978 <context-group name="null">
1979 <context context-type="linenumber">14</context>
1980 </context-group>
1981 </trans-unit>
1982 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1983 <source>My subscriptions</source>
1984 <target>Meine Abos</target>
1985 <context-group name="null">
1986 <context context-type="linenumber">16</context>
1987 </context-group>
1988 </trans-unit>
1989 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1990 <source>My imports</source>
1991 <target>Meine Importe</target>
1992 <context-group name="null"> 2136 <context-group name="null">
1993 <context context-type="linenumber">18</context> 2137 <context context-type="linenumber">13</context>
1994 </context-group> 2138 </context-group>
1995 </trans-unit> 2139 </trans-unit>
1996 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7"> 2140 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1997 <source>Ownership changes</source> 2141 <source>Unmute</source>
1998 <target>Änderungen des Besitzers</target> 2142 <target>Stummschalten aufheben</target>
1999 <context-group name="null"> 2143 <context-group name="null">
2000 <context context-type="linenumber">22</context> 2144 <context context-type="linenumber">23</context>
2001 </context-group> 2145 </context-group>
2002 </trans-unit> 2146 </trans-unit>
2003 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2147 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2011,21 +2155,21 @@ Konto erstellen</target>
2011 <source>Profile</source> 2155 <source>Profile</source>
2012 <target>Profil</target> 2156 <target>Profil</target>
2013 <context-group name="null"> 2157 <context-group name="null">
2014 <context context-type="linenumber">8</context> 2158 <context context-type="linenumber">7</context>
2015 </context-group> 2159 </context-group>
2016 </trans-unit> 2160 </trans-unit>
2017 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2161 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2018 <source>Video settings</source> 2162 <source>Video settings</source>
2019 <target>Videoeinstellungen</target> 2163 <target>Videoeinstellungen</target>
2020 <context-group name="null"> 2164 <context-group name="null">
2021 <context context-type="linenumber">15</context> 2165 <context context-type="linenumber">16</context>
2022 </context-group> 2166 </context-group>
2023 </trans-unit> 2167 </trans-unit>
2024 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2168 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2025 <source>Danger zone</source> 2169 <source>Danger zone</source>
2026 <target>Gefahrenzone</target> 2170 <target>Gefahrenzone</target>
2027 <context-group name="null"> 2171 <context-group name="null">
2028 <context context-type="linenumber">18</context> 2172 <context context-type="linenumber">19</context>
2029 </context-group> 2173 </context-group>
2030 </trans-unit> 2174 </trans-unit>
2031 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2175 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2053,13 +2197,6 @@ Konto erstellen</target>
2053 <context context-type="linenumber">35</context> 2197 <context context-type="linenumber">35</context>
2054 </context-group> 2198 </context-group>
2055 </trans-unit> 2199 </trans-unit>
2056 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2057 <source>Submit</source>
2058 <target>Abschicken</target>
2059 <context-group name="null">
2060 <context context-type="linenumber">24</context>
2061 </context-group>
2062 </trans-unit>
2063 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2200 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2064 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2201 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2065 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target> 2202 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target>
@@ -2219,6 +2356,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2219 <context context-type="linenumber">47</context> 2356 <context context-type="linenumber">47</context>
2220 </context-group> 2357 </context-group>
2221 </trans-unit> 2358 </trans-unit>
2359 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2360 <source>Muted instances</source>
2361 <target>Stummgeschaltete Instanzen</target>
2362 <context-group name="null">
2363 <context context-type="linenumber">2</context>
2364 </context-group>
2365 </trans-unit>
2222 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2366 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2223 <source>Change password</source> 2367 <source>Change password</source>
2224 <target>Passwort ändern</target> 2368 <target>Passwort ändern</target>
@@ -2226,6 +2370,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2226 <context context-type="linenumber">30</context> 2370 <context context-type="linenumber">30</context>
2227 </context-group> 2371 </context-group>
2228 </trans-unit> 2372 </trans-unit>
2373 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2374 <source>Current password</source>
2375 <target>Aktuelles Passwort</target>
2376 <context-group name="null">
2377 <context context-type="linenumber">7</context>
2378 </context-group>
2379 </trans-unit>
2229 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2380 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2230 <source>New password</source> 2381 <source>New password</source>
2231 <target>Neues Passwort</target> 2382 <target>Neues Passwort</target>
@@ -2247,18 +2398,25 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2247 <context context-type="linenumber">3</context> 2398 <context context-type="linenumber">3</context>
2248 </context-group> 2399 </context-group>
2249 </trans-unit> 2400 </trans-unit>
2401 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2402 <source>Use WebTorrent to exchange parts of the video with others</source>
2403 <target>WebTorrent benutzen, um Videoteile mit Andere zu verbreiten.</target>
2404 <context-group name="null">
2405 <context context-type="linenumber">21</context>
2406 </context-group>
2407 </trans-unit>
2250 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2408 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2251 <source>Automatically plays video</source> 2409 <source>Automatically plays video</source>
2252 <target>Videos automatisch abspielen</target> 2410 <target>Videos automatisch abspielen</target>
2253 <context-group name="null"> 2411 <context-group name="null">
2254 <context context-type="linenumber">20</context> 2412 <context context-type="linenumber">28</context>
2255 </context-group> 2413 </context-group>
2256 </trans-unit> 2414 </trans-unit>
2257 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2415 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2258 <source>Save</source> 2416 <source>Save</source>
2259 <target>Speichern</target> 2417 <target>Speichern</target>
2260 <context-group name="null"> 2418 <context-group name="null">
2261 <context context-type="linenumber">23</context> 2419 <context context-type="linenumber">32</context>
2262 </context-group> 2420 </context-group>
2263 </trans-unit> 2421 </trans-unit>
2264 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2422 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2289,9 +2447,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2289 <context context-type="linenumber">18</context> 2447 <context context-type="linenumber">18</context>
2290 </context-group> 2448 </context-group>
2291 </trans-unit> 2449 </trans-unit>
2450 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2451 <source>Once you delete your account, there is no going back. Please be certain.</source>
2452 <target>Sobald dein Konto gelöscht ist, gibt es kein Zurück mehr. Sei dir bitte sicher.</target>
2453 <context-group name="null">
2454 <context context-type="linenumber">2</context>
2455 </context-group>
2456 </trans-unit>
2292 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2457 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2293 <source>Delete your account</source> 2458 <source>Delete your account</source>
2294 <target>Lösche dein Konto</target> 2459 <target>Mein Konto löschen</target>
2295 <context-group name="null"> 2460 <context-group name="null">
2296 <context context-type="linenumber">4</context> 2461 <context context-type="linenumber">4</context>
2297 </context-group> 2462 </context-group>
@@ -2384,7 +2549,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2384 </trans-unit> 2549 </trans-unit>
2385 <trans-unit id="bfe7f34fbd4c3afa5f84a5580e0fae942cad2333"> 2550 <trans-unit id="bfe7f34fbd4c3afa5f84a5580e0fae942cad2333">
2386 <source>You can import any URL &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;supported by youtube-dl&lt;/a&gt; or URL that points to a raw MP4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source> 2551 <source>You can import any URL &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;supported by youtube-dl&lt;/a&gt; or URL that points to a raw MP4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source>
2387 <target>Du kannst von jeder URL importieren, &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;die von youtube-dl unterstützt wird&lt;/a&gt; oder jeder URL, die auf eine MP4-Datei zeigt. Du solltest sicherstellen, dass du die Verbreitungsrechte für den Inhalt hast, ansonsten könnte es legale Schwierigkeiten für dich und deine Instanz verursachen.</target> 2552 <target>Du kannst von jeder URL importieren, &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;die von youtube-dl unterstützt wird&lt;/a&gt; sowie von jeder URL, die auf eine MP4-Datei zeigt. Du solltest sicherstellen, dass du die Verbreitungsrechte für den Inhalt hast, ansonsten könnte es legale Schwierigkeiten für dich und deine Instanz verursachen.</target>
2388 <context-group name="null"> 2553 <context-group name="null">
2389 <context context-type="linenumber">9</context> 2554 <context context-type="linenumber">9</context>
2390 </context-group> 2555 </context-group>
@@ -2403,6 +2568,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2403 <context context-type="linenumber">159</context> 2568 <context context-type="linenumber">159</context>
2404 </context-group> 2569 </context-group>
2405 </trans-unit> 2570 </trans-unit>
2571 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2572 <source>Sorry, but something went wrong</source>
2573 <target>Entschuldigung, etwas ist schiefgegangen</target>
2574 <context-group name="null">
2575 <context context-type="linenumber">49</context>
2576 </context-group>
2577 </trans-unit>
2406 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2578 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2407 <source> 2579 <source>
2408 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2580 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2411,7 +2583,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2411 Gückwunsch, das Video unter <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> wird importiert. Du kannst bereits Informationen über dieses Video hinzufügen. 2583 Gückwunsch, das Video unter <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> wird importiert. Du kannst bereits Informationen über dieses Video hinzufügen.
2412</target> 2584</target>
2413 <context-group name="null"> 2585 <context-group name="null">
2414 <context context-type="linenumber">40</context> 2586 <context context-type="linenumber">46</context>
2415 </context-group> 2587 </context-group>
2416 </trans-unit> 2588 </trans-unit>
2417 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2589 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2439,26 +2611,33 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2439 <source>Publish will be available when upload is finished</source> 2611 <source>Publish will be available when upload is finished</source>
2440 <target>Veröffentlichung ist möglich, sobald das Hochladen abgeschlossen ist</target> 2612 <target>Veröffentlichung ist möglich, sobald das Hochladen abgeschlossen ist</target>
2441 <context-group name="null"> 2613 <context-group name="null">
2442 <context context-type="linenumber">48</context> 2614 <context context-type="linenumber">58</context>
2443 </context-group> 2615 </context-group>
2444 </trans-unit> 2616 </trans-unit>
2445 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2617 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2446 <source>Publish</source> 2618 <source>Publish</source>
2447 <target>Veröffentlichen</target> 2619 <target>Veröffentlichen</target>
2448 <context-group name="null"> 2620 <context-group name="null">
2449 <context context-type="linenumber">55</context> 2621 <context context-type="linenumber">65</context>
2450 </context-group> 2622 </context-group>
2451 </trans-unit> 2623 </trans-unit>
2452 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2624 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
2453 <source>Select the torrent to import</source> 2625 <source>Select the torrent to import</source>
2454 <target>Wähle die Torrent-Datei für den Import</target> 2626 <target>Wähle die Torrent-Datei für den Import aus</target>
2455 <context-group name="null"> 2627 <context-group name="null">
2456 <context context-type="linenumber">6</context> 2628 <context context-type="linenumber">6</context>
2457 </context-group> 2629 </context-group>
2458 </trans-unit> 2630 </trans-unit>
2631 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2632 <source>Or</source>
2633 <target>Oder</target>
2634 <context-group name="null">
2635 <context context-type="linenumber">11</context>
2636 </context-group>
2637 </trans-unit>
2459 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2638 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2460 <source>Paste magnet URI</source> 2639 <source>Paste magnet URI</source>
2461 <target>Füge die Magnet URI ein</target> 2640 <target>Füge die Magnet-URI ein</target>
2462 <context-group name="null"> 2641 <context-group name="null">
2463 <context context-type="linenumber">14</context> 2642 <context context-type="linenumber">14</context>
2464 </context-group> 2643 </context-group>
@@ -2478,7 +2657,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2478 Glückwunsch, dieses Video wird mittels BitTorrent importiert! Du kannst bereits Informationen über dieses Video hinzufügen. 2657 Glückwunsch, dieses Video wird mittels BitTorrent importiert! Du kannst bereits Informationen über dieses Video hinzufügen.
2479</target> 2658</target>
2480 <context-group name="null"> 2659 <context-group name="null">
2481 <context context-type="linenumber">48</context> 2660 <context context-type="linenumber">53</context>
2482 </context-group> 2661 </context-group>
2483 </trans-unit> 2662 </trans-unit>
2484 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2663 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2504,7 +2683,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2504 </trans-unit> 2683 </trans-unit>
2505 <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470"> 2684 <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470">
2506 <source>Import with URL</source> 2685 <source>Import with URL</source>
2507 <target>Importiere über einer URL</target> 2686 <target>Importiere über eine URL</target>
2508 <context-group name="null"> 2687 <context-group name="null">
2509 <context context-type="linenumber">17</context> 2688 <context context-type="linenumber">17</context>
2510 </context-group> 2689 </context-group>
@@ -2543,7 +2722,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2543 </trans-unit> 2722 </trans-unit>
2544 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c"> 2723 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
2545 <source>Add this caption</source> 2724 <source>Add this caption</source>
2546 <target>Diesen Untertitel hinzufügen</target> 2725 <target>Untertitel hinzufügen</target>
2547 <context-group name="null"> 2726 <context-group name="null">
2548 <context context-type="linenumber">40</context> 2727 <context context-type="linenumber">40</context>
2549 </context-group> 2728 </context-group>
@@ -2564,11 +2743,25 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2564 </trans-unit> 2743 </trans-unit>
2565 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851"> 2744 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2566 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source> 2745 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2567 <target>Taks können genutzt werden, um relevante Empfehlungen aussprechen zu können.&lt;/br&gt;Drücke die Eingabetaste, um einen neuen Tag hinzuzufügen.</target> 2746 <target>Tags können genutzt werden, um relevante Empfehlungen aussprechen zu können.&lt;/br&gt;Drücke die Eingabetaste, um einen neuen Tag hinzuzufügen.</target>
2568 <context-group name="null"> 2747 <context-group name="null">
2569 <context context-type="linenumber">18</context> 2748 <context context-type="linenumber">18</context>
2570 </context-group> 2749 </context-group>
2571 </trans-unit> 2750 </trans-unit>
2751 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2752 <source>+ Tag</source>
2753 <target>+ Tag</target>
2754 <context-group name="null">
2755 <context context-type="linenumber">21</context>
2756 </context-group>
2757 </trans-unit>
2758 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2759 <source>Enter a new tag</source>
2760 <target>Gib einen neuen Tag ein</target>
2761 <context-group name="null">
2762 <context context-type="linenumber">21</context>
2763 </context-group>
2764 </trans-unit>
2572 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2765 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2573 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2766 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2574 <target>Videobeschreibungen sind standardmäßig gekürzt und müssen manuell aufgeklappt werden.</target> 2767 <target>Videobeschreibungen sind standardmäßig gekürzt und müssen manuell aufgeklappt werden.</target>
@@ -2606,16 +2799,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2606 </trans-unit> 2799 </trans-unit>
2607 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0"> 2800 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
2608 <source>Wait transcoding before publishing the video</source> 2801 <source>Wait transcoding before publishing the video</source>
2609 <target>Warte das Transkodieren ab, bevor du das Video veröffentlichst</target> 2802 <target>Transkodieren abwarten, bevor das Video veröffentlicht wird</target>
2610 <context-group name="null"> 2803 <context-group name="null">
2611 <context context-type="linenumber">130</context> 2804 <context context-type="linenumber">131</context>
2612 </context-group> 2805 </context-group>
2613 </trans-unit> 2806 </trans-unit>
2614 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2807 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2615 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2808 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2616 <target>Wenn du dich entschließt, dass Transkodieren nicht abzuwarten, kann das Video unabspielbar sein, bis das Transkodieren beendet ist.</target> 2809 <target>Wenn du dich entschließt, das Transkodieren nicht abzuwarten, kann das Video unabspielbar sein, bis das Transkodieren beendet ist.</target>
2617 <context-group name="null"> 2810 <context-group name="null">
2618 <context context-type="linenumber">131</context> 2811 <context context-type="linenumber">132</context>
2619 </context-group> 2812 </context-group>
2620 </trans-unit> 2813 </trans-unit>
2621 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2814 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2627,51 +2820,51 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2627 </trans-unit> 2820 </trans-unit>
2628 <trans-unit id="92bcfd1d237a2bfe48dc9f46d074ed26abc8df22"> 2821 <trans-unit id="92bcfd1d237a2bfe48dc9f46d074ed26abc8df22">
2629 <source>Add another caption</source> 2822 <source>Add another caption</source>
2630 <target>Weiteren Untertitel hinzufügen</target> 2823 <target>Weitere Untertitel hinzufügen</target>
2631 <context-group name="null"> 2824 <context-group name="null">
2632 <context context-type="linenumber">146</context> 2825 <context context-type="linenumber">147</context>
2633 </context-group> 2826 </context-group>
2634 </trans-unit> 2827 </trans-unit>
2635 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2828 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2636 <source>See the subtitle file</source> 2829 <source>See the subtitle file</source>
2637 <target>Siehe in der Untertiteldatei</target> 2830 <target>Siehe in der Untertiteldatei</target>
2638 <context-group name="null"> 2831 <context-group name="null">
2639 <context context-type="linenumber">155</context> 2832 <context context-type="linenumber">156</context>
2640 </context-group> 2833 </context-group>
2641 </trans-unit> 2834 </trans-unit>
2642 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2835 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2643 <source>Already uploaded ✔</source> 2836 <source>Already uploaded ✔</source>
2644 <target>Fast hochgeladen ✔</target> 2837 <target>Fast hochgeladen ✔</target>
2645 <context-group name="null"> 2838 <context-group name="null">
2646 <context context-type="linenumber">159</context> 2839 <context context-type="linenumber">160</context>
2647 </context-group> 2840 </context-group>
2648 </trans-unit> 2841 </trans-unit>
2649 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2842 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2650 <source>Will be created on update</source> 2843 <source>Will be created on update</source>
2651 <target>Wird bei einer Aktualisierung erstellt</target> 2844 <target>Wird bei einer Aktualisierung erstellt</target>
2652 <context-group name="null"> 2845 <context-group name="null">
2653 <context context-type="linenumber">167</context> 2846 <context context-type="linenumber">168</context>
2654 </context-group> 2847 </context-group>
2655 </trans-unit> 2848 </trans-unit>
2656 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2849 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2657 <source>Cancel create</source> 2850 <source>Cancel create</source>
2658 <target>Erstellen abbrechen</target> 2851 <target>Erstellen abbrechen</target>
2659 <context-group name="null"> 2852 <context-group name="null">
2660 <context context-type="linenumber">169</context> 2853 <context context-type="linenumber">170</context>
2661 </context-group> 2854 </context-group>
2662 </trans-unit> 2855 </trans-unit>
2663 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2856 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2664 <source>Will be deleted on update</source> 2857 <source>Will be deleted on update</source>
2665 <target>Wird bei einer Aktualisierung gelöscht</target> 2858 <target>Wird bei einer Aktualisierung gelöscht</target>
2666 <context-group name="null"> 2859 <context-group name="null">
2667 <context context-type="linenumber">175</context> 2860 <context context-type="linenumber">176</context>
2668 </context-group> 2861 </context-group>
2669 </trans-unit> 2862 </trans-unit>
2670 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2863 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2671 <source>Cancel deletion</source> 2864 <source>Cancel deletion</source>
2672 <target>Löschen abbrechen</target> 2865 <target>Löschen abbrechen</target>
2673 <context-group name="null"> 2866 <context-group name="null">
2674 <context context-type="linenumber">177</context> 2867 <context context-type="linenumber">178</context>
2675 </context-group> 2868 </context-group>
2676 </trans-unit> 2869 </trans-unit>
2677 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2870 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2682,28 +2875,28 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2682 Bis auf Weiteres keine Untertitel. 2875 Bis auf Weiteres keine Untertitel.
2683 </target> 2876 </target>
2684 <context-group name="null"> 2877 <context-group name="null">
2685 <context context-type="linenumber">182</context> 2878 <context context-type="linenumber">183</context>
2686 </context-group> 2879 </context-group>
2687 </trans-unit> 2880 </trans-unit>
2688 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2881 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2689 <source>Captions</source> 2882 <source>Captions</source>
2690 <target>Untertitel</target> 2883 <target>Untertitel</target>
2691 <context-group name="null"> 2884 <context-group name="null">
2692 <context context-type="linenumber">139</context> 2885 <context context-type="linenumber">140</context>
2693 </context-group> 2886 </context-group>
2694 </trans-unit> 2887 </trans-unit>
2695 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2888 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2696 <source>Upload thumbnail</source> 2889 <source>Upload thumbnail</source>
2697 <target>Vorschaubild hochladen</target> 2890 <target>Miniaturansicht hochladen</target>
2698 <context-group name="null"> 2891 <context-group name="null">
2699 <context context-type="linenumber">195</context> 2892 <context context-type="linenumber">196</context>
2700 </context-group> 2893 </context-group>
2701 </trans-unit> 2894 </trans-unit>
2702 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2895 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2703 <source>Upload preview</source> 2896 <source>Upload preview</source>
2704 <target>Vorschau hochladen</target> 2897 <target>Vorschau hochladen</target>
2705 <context-group name="null"> 2898 <context-group name="null">
2706 <context context-type="linenumber">202</context> 2899 <context context-type="linenumber">203</context>
2707 </context-group> 2900 </context-group>
2708 </trans-unit> 2901 </trans-unit>
2709 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2902 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2717,14 +2910,14 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2717 <source>Short text to tell people how they can support you (membership platform...).</source> 2910 <source>Short text to tell people how they can support you (membership platform...).</source>
2718 <target>Ein kurzer Text, der anderen erklärt, wie sie dich unterstützen können.</target> 2911 <target>Ein kurzer Text, der anderen erklärt, wie sie dich unterstützen können.</target>
2719 <context-group name="null"> 2912 <context-group name="null">
2720 <context context-type="linenumber">209</context> 2913 <context context-type="linenumber">210</context>
2721 </context-group> 2914 </context-group>
2722 </trans-unit> 2915 </trans-unit>
2723 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2916 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2724 <source>Advanced settings</source> 2917 <source>Advanced settings</source>
2725 <target>Erweiterte Einstellungen</target> 2918 <target>Erweiterte Einstellungen</target>
2726 <context-group name="null"> 2919 <context-group name="null">
2727 <context context-type="linenumber">190</context> 2920 <context context-type="linenumber">191</context>
2728 </context-group> 2921 </context-group>
2729 </trans-unit> 2922 </trans-unit>
2730 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2923 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2791,17 +2984,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2791 <context context-type="linenumber">3</context> 2984 <context context-type="linenumber">3</context>
2792 </context-group> 2985 </context-group>
2793 </trans-unit> 2986 </trans-unit>
2794 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2795 <source>
2796 Cancel
2797 </source>
2798 <target>
2799 Abbrechen
2800 </target>
2801 <context-group name="null">
2802 <context context-type="linenumber">19</context>
2803 </context-group>
2804 </trans-unit>
2805 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2987 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2806 <source>Share</source> 2988 <source>Share</source>
2807 <target>Teilen</target> 2989 <target>Teilen</target>
@@ -3001,13 +3183,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3001 <context context-type="linenumber">134</context> 3183 <context context-type="linenumber">134</context>
3002 </context-group> 3184 </context-group>
3003 </trans-unit> 3185 </trans-unit>
3004 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
3005 <source>Go to the account page</source>
3006 <target>Gehe zur Kontoseite</target>
3007 <context-group name="null">
3008 <context context-type="linenumber">133</context>
3009 </context-group>
3010 </trans-unit>
3011 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3186 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3012 <source>Show more</source> 3187 <source>Show more</source>
3013 <target>Mehr anzeigen</target> 3188 <target>Mehr anzeigen</target>
@@ -3087,25 +3262,18 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3087 <context context-type="linenumber">3</context> 3262 <context context-type="linenumber">3</context>
3088 </context-group> 3263 </context-group>
3089 </trans-unit> 3264 </trans-unit>
3090 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3091 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3092 <target>Du kannst entweder auf der Seite deiner Fediverse-Instanz kommentieren oder auf einer anderen, die ActivityPub unterstützt. Bei Mastodon oder Pleroma kannst du z. B. in das Suchfeld &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; eingeben und das Video wiederfinden. An der Möglichkeit zur direkten Kommentierung wird gearbeitet: &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
3093 <context-group name="null">
3094 <context context-type="linenumber">8</context>
3095 </context-group>
3096 </trans-unit>
3097 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3265 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3098 <source>No comments.</source> 3266 <source>No comments.</source>
3099 <target>Keine Kommentare.</target> 3267 <target>Keine Kommentare.</target>
3100 <context-group name="null"> 3268 <context-group name="null">
3101 <context context-type="linenumber">18</context> 3269 <context context-type="linenumber">17</context>
3102 </context-group> 3270 </context-group>
3103 </trans-unit> 3271 </trans-unit>
3104 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3272 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3105 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3273 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3106 <target>Zeige alle <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> Antworten</target> 3274 <target>Zeige alle <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> Antworten</target>
3107 <context-group name="null"> 3275 <context-group name="null">
3108 <context context-type="linenumber">55</context> 3276 <context context-type="linenumber">54</context>
3109 </context-group> 3277 </context-group>
3110 </trans-unit> 3278 </trans-unit>
3111 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3279 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3116,7 +3284,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3116 Kommentare sind abgeschaltet. 3284 Kommentare sind abgeschaltet.
3117 </target> 3285 </target>
3118 <context-group name="null"> 3286 <context-group name="null">
3119 <context context-type="linenumber">64</context> 3287 <context context-type="linenumber">63</context>
3120 </context-group> 3288 </context-group>
3121 </trans-unit> 3289 </trans-unit>
3122 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3290 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3137,6 +3305,57 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3137 <context context-type="linenumber">20</context> 3305 <context context-type="linenumber">20</context>
3138 </context-group> 3306 </context-group>
3139 </trans-unit> 3307 </trans-unit>
3308 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3309 <source>You are one step away from commenting</source>
3310 <target>Du bist einen Schritt vom Kommentieren entfernt</target>
3311 <context-group name="null">
3312 <context context-type="linenumber">28</context>
3313 </context-group>
3314 </trans-unit>
3315 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3316 <source>
3317 If you have an account on this instance, you can login:
3318 </source>
3319 <target>
3320 Wenn du über ein Konto auf dieser Instanz verfügst, kannst du dich anmelden.
3321 </target>
3322 <context-group name="null">
3323 <context context-type="linenumber">32</context>
3324 </context-group>
3325 </trans-unit>
3326 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3327 <source>login to comment</source>
3328 <target>melde dich an, um zu kommentieren</target>
3329 <context-group name="null">
3330 <context context-type="linenumber">35</context>
3331 </context-group>
3332 </trans-unit>
3333 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3334 <source>
3335 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3336 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3337 from within the software's interface.
3338 </source>
3339 <target>
3340 Ansonsten kannst du mit einem Konto einer beliebigen Instanz kommentieren, die ActitityPub unterstützt.
3341 Auf den meisten Plattformen kannst du das Video kommentieren, indem du die URL des Videos in das Suchfeld
3342 eingibst und dann den Anweisungen der Website folgst.
3343 </target>
3344 <context-group name="null">
3345 <context context-type="linenumber">36</context>
3346 </context-group>
3347 </trans-unit>
3348 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3349 <source>
3350 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3351 </source>
3352 <target>
3353 Falls du über ein Mastodon- oder Pleroma-Konto verfügst, kannst du es dort direkt öffnen.
3354 </target>
3355 <context-group name="null">
3356 <context context-type="linenumber">41</context>
3357 </context-group>
3358 </trans-unit>
3140 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3359 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3141 <source>Highlighted comment</source> 3360 <source>Highlighted comment</source>
3142 <target>Markierter Kommentar</target> 3361 <target>Markierter Kommentar</target>
@@ -3151,13 +3370,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3151 <context context-type="linenumber">14</context> 3370 <context context-type="linenumber">14</context>
3152 </context-group> 3371 </context-group>
3153 </trans-unit> 3372 </trans-unit>
3154 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3155 <source>Error getting about from server</source>
3156 <target>Server-Fehler.</target>
3157 <context-group name="null">
3158 <context context-type="linenumber">1</context>
3159 </context-group>
3160 </trans-unit>
3161 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3373 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3162 <source>No description</source> 3374 <source>No description</source>
3163 <target>Keine Beschreibung</target> 3375 <target>Keine Beschreibung</target>
@@ -3179,51 +3391,44 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3179 <context context-type="linenumber">1</context> 3391 <context context-type="linenumber">1</context>
3180 </context-group> 3392 </context-group>
3181 </trans-unit> 3393 </trans-unit>
3182 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3394 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3183 <source>Error</source> 3395 <source>240p</source>
3184 <target>Fehler</target> 3396 <target>240p</target>
3185 <context-group name="null">
3186 <context context-type="linenumber">1</context>
3187 </context-group>
3188 </trans-unit>
3189 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3190 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3191 <target><x id="INTERPOLATION" equiv-text="{{customizationsText}}"/> wurde verändert.</target>
3192 <context-group name="null"> 3397 <context-group name="null">
3193 <context context-type="linenumber">1</context> 3398 <context context-type="linenumber">1</context>
3194 </context-group> 3399 </context-group>
3195 </trans-unit> 3400 </trans-unit>
3196 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3401 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3197 <source>This could lead to security issues or bugs if you do not understand it. </source> 3402 <source>360p</source>
3198 <target>Das könnte zu Sicherheitslücken führen, falls du es nicht verstehst.</target> 3403 <target>360p</target>
3199 <context-group name="null"> 3404 <context-group name="null">
3200 <context context-type="linenumber">1</context> 3405 <context context-type="linenumber">1</context>
3201 </context-group> 3406 </context-group>
3202 </trans-unit> 3407 </trans-unit>
3203 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3408 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3204 <source>Are you sure you want to update the configuration?</source> 3409 <source>480p</source>
3205 <target>Willst du die Einstellungen wirklich aktualisieren?</target> 3410 <target>480p</target>
3206 <context-group name="null"> 3411 <context-group name="null">
3207 <context context-type="linenumber">1</context> 3412 <context context-type="linenumber">1</context>
3208 </context-group> 3413 </context-group>
3209 </trans-unit> 3414 </trans-unit>
3210 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3415 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3211 <source>Please type</source> 3416 <source>720p</source>
3212 <target>Bitte eingeben</target> 3417 <target>720p</target>
3213 <context-group name="null"> 3418 <context-group name="null">
3214 <context context-type="linenumber">1</context> 3419 <context context-type="linenumber">1</context>
3215 </context-group> 3420 </context-group>
3216 </trans-unit> 3421 </trans-unit>
3217 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3422 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3218 <source>to confirm.</source> 3423 <source>1080p</source>
3219 <target>zur Bestätigung.</target> 3424 <target>1080p</target>
3220 <context-group name="null"> 3425 <context-group name="null">
3221 <context context-type="linenumber">1</context> 3426 <context context-type="linenumber">1</context>
3222 </context-group> 3427 </context-group>
3223 </trans-unit> 3428 </trans-unit>
3224 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 3429 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3225 <source>Success</source> 3430 <source>Auto (via ffmpeg)</source>
3226 <target>Erfolg</target> 3431 <target>Automatisch (über ffmpeg)</target>
3227 <context-group name="null"> 3432 <context-group name="null">
3228 <context context-type="linenumber">1</context> 3433 <context context-type="linenumber">1</context>
3229 </context-group> 3434 </context-group>
@@ -3242,6 +3447,69 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3242 <context context-type="linenumber">1</context> 3447 <context context-type="linenumber">1</context>
3243 </context-group> 3448 </context-group>
3244 </trans-unit> 3449 </trans-unit>
3450 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3451 <source>100MB</source>
3452 <target>100MB</target>
3453 <context-group name="null">
3454 <context context-type="linenumber">1</context>
3455 </context-group>
3456 </trans-unit>
3457 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3458 <source>500MB</source>
3459 <target>500MB</target>
3460 <context-group name="null">
3461 <context context-type="linenumber">1</context>
3462 </context-group>
3463 </trans-unit>
3464 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3465 <source>1GB</source>
3466 <target>1GB</target>
3467 <context-group name="null">
3468 <context context-type="linenumber">1</context>
3469 </context-group>
3470 </trans-unit>
3471 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3472 <source>5GB</source>
3473 <target>5GB</target>
3474 <context-group name="null">
3475 <context context-type="linenumber">1</context>
3476 </context-group>
3477 </trans-unit>
3478 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3479 <source>20GB</source>
3480 <target>20GB</target>
3481 <context-group name="null">
3482 <context context-type="linenumber">1</context>
3483 </context-group>
3484 </trans-unit>
3485 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3486 <source>50GB</source>
3487 <target>50GB</target>
3488 <context-group name="null">
3489 <context context-type="linenumber">1</context>
3490 </context-group>
3491 </trans-unit>
3492 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3493 <source>10MB</source>
3494 <target>10MB</target>
3495 <context-group name="null">
3496 <context context-type="linenumber">1</context>
3497 </context-group>
3498 </trans-unit>
3499 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3500 <source>50MB</source>
3501 <target>50MB</target>
3502 <context-group name="null">
3503 <context context-type="linenumber">1</context>
3504 </context-group>
3505 </trans-unit>
3506 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3507 <source>2GB</source>
3508 <target>2GB</target>
3509 <context-group name="null">
3510 <context context-type="linenumber">1</context>
3511 </context-group>
3512 </trans-unit>
3245 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3513 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3246 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3514 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3247 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> ist ungültig</target> 3515 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> ist ungültig</target>
@@ -3326,6 +3594,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3326 <context context-type="linenumber">1</context> 3594 <context context-type="linenumber">1</context>
3327 </context-group> 3595 </context-group>
3328 </trans-unit> 3596 </trans-unit>
3597 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3598 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3599 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ist von deiner Instanz nicht mehr stummgeschatet.</target>
3600 <context-group name="null">
3601 <context context-type="linenumber">1</context>
3602 </context-group>
3603 </trans-unit>
3604 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3605 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3606 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> ist von deiner Instanz nicht mehr stummgeschaltet.</target>
3607 <context-group name="null">
3608 <context context-type="linenumber">1</context>
3609 </context-group>
3610 </trans-unit>
3329 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3611 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3330 <source>Comment updated.</source> 3612 <source>Comment updated.</source>
3331 <target>Kommentar aktualisiert.</target> 3613 <target>Kommentar aktualisiert.</target>
@@ -3333,6 +3615,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3333 <context context-type="linenumber">1</context> 3615 <context context-type="linenumber">1</context>
3334 </context-group> 3616 </context-group>
3335 </trans-unit> 3617 </trans-unit>
3618 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3619 <source>Delete this report</source>
3620 <target>Missbrauchsmeldung löschen</target>
3621 <context-group name="null">
3622 <context context-type="linenumber">1</context>
3623 </context-group>
3624 </trans-unit>
3336 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3625 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3337 <source>Update moderation comment</source> 3626 <source>Update moderation comment</source>
3338 <target>Moderationskommentar aktualisieren</target> 3627 <target>Moderationskommentar aktualisieren</target>
@@ -3354,9 +3643,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3354 <context context-type="linenumber">1</context> 3643 <context context-type="linenumber">1</context>
3355 </context-group> 3644 </context-group>
3356 </trans-unit> 3645 </trans-unit>
3357 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3646 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3358 <source>Do you really want to delete this abuse?</source> 3647 <source>Do you really want to delete this abuse report?</source>
3359 <target>Möchtest du diese Missbrauchsmeldung wirklich löschen?</target> 3648 <target>Wollen Sie wirklich diese Missbrauchsmeldung löschen?</target>
3360 <context-group name="null"> 3649 <context-group name="null">
3361 <context context-type="linenumber">1</context> 3650 <context context-type="linenumber">1</context>
3362 </context-group> 3651 </context-group>
@@ -3403,23 +3692,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3403 <context context-type="linenumber">1</context> 3692 <context context-type="linenumber">1</context>
3404 </context-group> 3693 </context-group>
3405 </trans-unit> 3694 </trans-unit>
3406 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 3695 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3407 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 3696 <source>Unban</source>
3408 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> gesperrt.</target> 3697 <target>Sperre aufheben</target>
3409 <context-group name="null">
3410 <context context-type="linenumber">1</context>
3411 </context-group>
3412 </trans-unit>
3413 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3414 <source>Ban</source>
3415 <target>Sperren</target>
3416 <context-group name="null"> 3698 <context-group name="null">
3417 <context context-type="linenumber">1</context> 3699 <context context-type="linenumber">1</context>
3418 </context-group> 3700 </context-group>
3419 </trans-unit> 3701 </trans-unit>
3420 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3702 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3421 <source>Unban</source> 3703 <source>Set Email as Verified</source>
3422 <target>Sperre aufheben</target> 3704 <target>E-Mail als bestätigt setzen</target>
3423 <context-group name="null"> 3705 <context-group name="null">
3424 <context context-type="linenumber">1</context> 3706 <context context-type="linenumber">1</context>
3425 </context-group> 3707 </context-group>
@@ -3431,16 +3713,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3431 <context context-type="linenumber">1</context> 3713 <context context-type="linenumber">1</context>
3432 </context-group> 3714 </context-group>
3433 </trans-unit> 3715 </trans-unit>
3434 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 3716 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3435 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 3717 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3436 <target>Möchtest du die Sperre von <x id="INTERPOLATION" equiv-text="{{username}}"/> wirklich aufheben?</target> 3718 <target>Willst du wirklich den Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufheben?</target>
3437 <context-group name="null"> 3719 <context-group name="null">
3438 <context context-type="linenumber">1</context> 3720 <context context-type="linenumber">1</context>
3439 </context-group> 3721 </context-group>
3440 </trans-unit> 3722 </trans-unit>
3441 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 3723 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3442 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 3724 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3443 <target>Sperre von Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> aufgehoben.</target> 3725 <target>Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufgehoben.</target>
3444 <context-group name="null"> 3726 <context-group name="null">
3445 <context context-type="linenumber">1</context> 3727 <context context-type="linenumber">1</context>
3446 </context-group> 3728 </context-group>
@@ -3452,16 +3734,37 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3452 <context context-type="linenumber">1</context> 3734 <context context-type="linenumber">1</context>
3453 </context-group> 3735 </context-group>
3454 </trans-unit> 3736 </trans-unit>
3455 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603"> 3737 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3456 <source>If you remove this user, you will not be able to create another with the same username!</source> 3738 <source>If you remove these users, you will not be able to create others with the same username!</source>
3457 <target>Wenn du diesen Nutzer entfernst, wirst du keinen neuen mit dem gleichen Nutzernamen erstellen können!</target> 3739 <target>Wenn du diesen Benutzer löschst, kannst du keine neuen Benutzer mit gleichem Benutzernamen einrichten !</target>
3458 <context-group name="null"> 3740 <context-group name="null">
3459 <context context-type="linenumber">1</context> 3741 <context context-type="linenumber">1</context>
3460 </context-group> 3742 </context-group>
3461 </trans-unit> 3743 </trans-unit>
3462 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3744 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3463 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3745 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3464 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> entfernt.</target> 3746 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gelöscht.</target>
3747 <context-group name="null">
3748 <context context-type="linenumber">1</context>
3749 </context-group>
3750 </trans-unit>
3751 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3752 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3753 <target>E-Mail von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern als bestätigt markiert.</target>
3754 <context-group name="null">
3755 <context context-type="linenumber">1</context>
3756 </context-group>
3757 </trans-unit>
3758 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3759 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3760 <target>Stummschaltung von Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> aufgehoben.</target>
3761 <context-group name="null">
3762 <context context-type="linenumber">1</context>
3763 </context-group>
3764 </trans-unit>
3765 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3766 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3767 <target>Stummschaltung von Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> aufgehoben.</target>
3465 <context-group name="null"> 3768 <context-group name="null">
3466 <context context-type="linenumber">1</context> 3769 <context context-type="linenumber">1</context>
3467 </context-group> 3770 </context-group>
@@ -3480,6 +3783,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3480 <context context-type="linenumber">1</context> 3783 <context context-type="linenumber">1</context>
3481 </context-group> 3784 </context-group>
3482 </trans-unit> 3785 </trans-unit>
3786 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3787 <source>You current password is invalid.</source>
3788 <target>Dein aktuelles Passwort ist ungültig.</target>
3789 <context-group name="null">
3790 <context context-type="linenumber">1</context>
3791 </context-group>
3792 </trans-unit>
3483 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3793 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3484 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3794 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3485 <target>Bist du sicher, dass du dein Konto löschen möchtest? Das wird all deine Daten löschen, inkl. aller Kanäle, Videos etc.</target> 3795 <target>Bist du sicher, dass du dein Konto löschen möchtest? Das wird all deine Daten löschen, inkl. aller Kanäle, Videos etc.</target>
@@ -3536,6 +3846,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3536 <context context-type="linenumber">1</context> 3846 <context context-type="linenumber">1</context>
3537 </context-group> 3847 </context-group>
3538 </trans-unit> 3848 </trans-unit>
3849 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3850 <source>This name already exists on this instance.</source>
3851 <target>Dieser Name existiert bereits auf dieser Instanz.</target>
3852 <context-group name="null">
3853 <context context-type="linenumber">1</context>
3854 </context-group>
3855 </trans-unit>
3539 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3856 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3540 <source>Create</source> 3857 <source>Create</source>
3541 <target>Erstellen</target> 3858 <target>Erstellen</target>
@@ -3550,23 +3867,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3550 <context context-type="linenumber">1</context> 3867 <context context-type="linenumber">1</context>
3551 </context-group> 3868 </context-group>
3552 </trans-unit> 3869 </trans-unit>
3553 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3870 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3554 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3871 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3555 <target>Willst du wirklich <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> löschen? Alle hochgeladenen Videos des Kanals werden dann ebenfalls unwiderruflich gelöscht.</target> 3872 <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target>
3556 <context-group name="null">
3557 <context context-type="linenumber">1</context>
3558 </context-group>
3559 </trans-unit>
3560 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3561 <source>Please type the name of the video channel to confirm</source>
3562 <target>Bitte gib zur Bestätigung den Namen des Videokanals ein</target>
3563 <context-group name="null"> 3873 <context-group name="null">
3564 <context context-type="linenumber">1</context> 3874 <context context-type="linenumber">1</context>
3565 </context-group> 3875 </context-group>
3566 </trans-unit> 3876 </trans-unit>
3567 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3877 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3568 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3878 <source>My videos</source>
3569 <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target> 3879 <target>Meine Videos</target>
3570 <context-group name="null"> 3880 <context-group name="null">
3571 <context context-type="linenumber">1</context> 3881 <context context-type="linenumber">1</context>
3572 </context-group> 3882 </context-group>
@@ -3641,16 +3951,44 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3641 <context context-type="linenumber">1</context> 3951 <context context-type="linenumber">1</context>
3642 </context-group> 3952 </context-group>
3643 </trans-unit> 3953 </trans-unit>
3644 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3954 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3645 <source>Channels</source> 3955 <source>My library</source>
3646 <target>Kanäle</target> 3956 <target>Meine Bibliothek</target>
3957 <context-group name="null">
3958 <context context-type="linenumber">1</context>
3959 </context-group>
3960 </trans-unit>
3961 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3962 <source>My channels</source>
3963 <target>Meine Kanäle</target>
3964 <context-group name="null">
3965 <context context-type="linenumber">1</context>
3966 </context-group>
3967 </trans-unit>
3968 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3969 <source>My subscriptions</source>
3970 <target>Meine Abos</target>
3647 <context-group name="null"> 3971 <context-group name="null">
3648 <context context-type="linenumber">1</context> 3972 <context context-type="linenumber">1</context>
3649 </context-group> 3973 </context-group>
3650 </trans-unit> 3974 </trans-unit>
3651 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3975 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3652 <source>Video imports</source> 3976 <source>Misc</source>
3653 <target>Video-Importe</target> 3977 <target>Verschiedenes</target>
3978 <context-group name="null">
3979 <context context-type="linenumber">1</context>
3980 </context-group>
3981 </trans-unit>
3982 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3983 <source>Ownership changes</source>
3984 <target>Besitzer ändern</target>
3985 <context-group name="null">
3986 <context context-type="linenumber">1</context>
3987 </context-group>
3988 </trans-unit>
3989 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3990 <source>My settings</source>
3991 <target>Meine Einstellungen</target>
3654 <context-group name="null"> 3992 <context-group name="null">
3655 <context context-type="linenumber">1</context> 3993 <context context-type="linenumber">1</context>
3656 </context-group> 3994 </context-group>
@@ -3669,6 +4007,97 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3669 <context context-type="linenumber">1</context> 4007 <context context-type="linenumber">1</context>
3670 </context-group> 4008 </context-group>
3671 </trans-unit> 4009 </trans-unit>
4010 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4011 <source>Subscribe to the account</source>
4012 <target>Diesen Account abonnieren</target>
4013 <context-group name="null">
4014 <context context-type="linenumber">1</context>
4015 </context-group>
4016 </trans-unit>
4017 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4018 <source>Focus the search bar</source>
4019 <target>Die Suchleiste fokussieren</target>
4020 <context-group name="null">
4021 <context context-type="linenumber">1</context>
4022 </context-group>
4023 </trans-unit>
4024 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4025 <source>Toggle the left menu</source>
4026 <target>Linkes Menü umschalten</target>
4027 <context-group name="null">
4028 <context context-type="linenumber">1</context>
4029 </context-group>
4030 </trans-unit>
4031 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4032 <source>Go to the videos overview page</source>
4033 <target>Zum Videoübersichtseite gehen</target>
4034 <context-group name="null">
4035 <context context-type="linenumber">1</context>
4036 </context-group>
4037 </trans-unit>
4038 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4039 <source>Go to the trending videos page</source>
4040 <target>Zum Trendingsvideosseite gehen</target>
4041 <context-group name="null">
4042 <context context-type="linenumber">1</context>
4043 </context-group>
4044 </trans-unit>
4045 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4046 <source>Go to the recently added videos page</source>
4047 <target>Zum neuliche hingefügten videos Seite gehen</target>
4048 <context-group name="null">
4049 <context context-type="linenumber">1</context>
4050 </context-group>
4051 </trans-unit>
4052 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4053 <source>Go to the local videos page</source>
4054 <target>Zum lokalvideoseite gehen</target>
4055 <context-group name="null">
4056 <context context-type="linenumber">1</context>
4057 </context-group>
4058 </trans-unit>
4059 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4060 <source>Go to the videos upload page</source>
4061 <target>Zum videouploadsseite gehen</target>
4062 <context-group name="null">
4063 <context context-type="linenumber">1</context>
4064 </context-group>
4065 </trans-unit>
4066 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4067 <source>Toggle Dark theme</source>
4068 <target>Dunkles Theme umschalten</target>
4069 <context-group name="null">
4070 <context context-type="linenumber">1</context>
4071 </context-group>
4072 </trans-unit>
4073 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4074 <source>Go to my subscriptions</source>
4075 <target>Gehe zu meinen Abos</target>
4076 <context-group name="null">
4077 <context context-type="linenumber">1</context>
4078 </context-group>
4079 </trans-unit>
4080 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4081 <source>Go to my videos</source>
4082 <target>zur meine Videos gehen</target>
4083 <context-group name="null">
4084 <context context-type="linenumber">1</context>
4085 </context-group>
4086 </trans-unit>
4087 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4088 <source>Go to my imports</source>
4089 <target>Gehe zu meinen Importen</target>
4090 <context-group name="null">
4091 <context context-type="linenumber">1</context>
4092 </context-group>
4093 </trans-unit>
4094 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4095 <source>Go to my channels</source>
4096 <target>Gehe zu meinen Kanälen</target>
4097 <context-group name="null">
4098 <context context-type="linenumber">1</context>
4099 </context-group>
4100 </trans-unit>
3672 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4101 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3673 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4102 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3674</source> 4103</source>
@@ -3685,6 +4114,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3685 <context context-type="linenumber">1</context> 4114 <context context-type="linenumber">1</context>
3686 </context-group> 4115 </context-group>
3687 </trans-unit> 4116 </trans-unit>
4117 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4118 <source>Error</source>
4119 <target>Fehler</target>
4120 <context-group name="null">
4121 <context context-type="linenumber">1</context>
4122 </context-group>
4123 </trans-unit>
3688 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4124 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3689 <source>You need to reconnect.</source> 4125 <source>You need to reconnect.</source>
3690 <target>Bitte verbinde dich erneut.</target> 4126 <target>Bitte verbinde dich erneut.</target>
@@ -3706,6 +4142,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3706 <context context-type="linenumber">1</context> 4142 <context context-type="linenumber">1</context>
3707 </context-group> 4143 </context-group>
3708 </trans-unit> 4144 </trans-unit>
4145 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4146 <source>Info</source>
4147 <target>Infos</target>
4148 <context-group name="null">
4149 <context context-type="linenumber">1</context>
4150 </context-group>
4151 </trans-unit>
4152 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4153 <source>Success</source>
4154 <target>Erfolg</target>
4155 <context-group name="null">
4156 <context context-type="linenumber">1</context>
4157 </context-group>
4158 </trans-unit>
3709 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4159 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3710 <source>Incorrect username or password.</source> 4160 <source>Incorrect username or password.</source>
3711 <target>Falscher Benutzername oder falsches Passwort.</target> 4161 <target>Falscher Benutzername oder falsches Passwort.</target>
@@ -3923,6 +4373,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3923 <context context-type="linenumber">1</context> 4373 <context context-type="linenumber">1</context>
3924 </context-group> 4374 </context-group>
3925 </trans-unit> 4375 </trans-unit>
4376 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4377 <source>Email is required.</source>
4378 <target>Bitte gib eine E-Mail-Adresse ein.</target>
4379 <context-group name="null">
4380 <context context-type="linenumber">1</context>
4381 </context-group>
4382 </trans-unit>
4383 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4384 <source>Email must be valid.</source>
4385 <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
4386 <context-group name="null">
4387 <context context-type="linenumber">1</context>
4388 </context-group>
4389 </trans-unit>
3926 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4390 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3927 <source>Username is required.</source> 4391 <source>Username is required.</source>
3928 <target>Bitte gib einen Benutzernamen ein.</target> 4392 <target>Bitte gib einen Benutzernamen ein.</target>
@@ -3944,41 +4408,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3944 <context context-type="linenumber">1</context> 4408 <context context-type="linenumber">1</context>
3945 </context-group> 4409 </context-group>
3946 </trans-unit> 4410 </trans-unit>
3947 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3948 <source>Username must be at least 3 characters long.</source>
3949 <target>Der Benutzername muss mindestens 3 Zeichen lang sein.</target>
3950 <context-group name="null">
3951 <context context-type="linenumber">1</context>
3952 </context-group>
3953 </trans-unit>
3954 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3955 <source>Username cannot be more than 20 characters long.</source>
3956 <target>Der Benutzername darf nicht länger als 20 Zeichen lang sein.</target>
3957 <context-group name="null">
3958 <context context-type="linenumber">1</context>
3959 </context-group>
3960 </trans-unit>
3961 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3962 <source>Username should be only lowercase alphanumeric characters.</source>
3963 <target>Der Benutzername sollte nur kleine alphanumerische Zeichen enthalten.</target>
3964 <context-group name="null">
3965 <context context-type="linenumber">1</context>
3966 </context-group>
3967 </trans-unit>
3968 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3969 <source>Email is required.</source>
3970 <target>Bitte gib eine E-Mail-Adresse ein.</target>
3971 <context-group name="null">
3972 <context context-type="linenumber">1</context>
3973 </context-group>
3974 </trans-unit>
3975 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3976 <source>Email must be valid.</source>
3977 <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
3978 <context-group name="null">
3979 <context context-type="linenumber">1</context>
3980 </context-group>
3981 </trans-unit>
3982 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4411 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3983 <source>Password must be at least 6 characters long.</source> 4412 <source>Password must be at least 6 characters long.</source>
3984 <target>Das Passwort muss mindestens 6 Zeichen lang sein.</target> 4413 <target>Das Passwort muss mindestens 6 Zeichen lang sein.</target>
@@ -4042,20 +4471,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4042 <context context-type="linenumber">1</context> 4471 <context context-type="linenumber">1</context>
4043 </context-group> 4472 </context-group>
4044 </trans-unit> 4473 </trans-unit>
4045 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4046 <source>Display name must be at least 3 characters long.</source>
4047 <target>Der Anzeigename muss mindestens 3 Zeichen lang sein.</target>
4048 <context-group name="null">
4049 <context context-type="linenumber">1</context>
4050 </context-group>
4051 </trans-unit>
4052 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4053 <source>Display name cannot be more than 120 characters long.</source>
4054 <target>Der Anzeigename darf nicht länger als 120 Zeichen lang sein.</target>
4055 <context-group name="null">
4056 <context context-type="linenumber">1</context>
4057 </context-group>
4058 </trans-unit>
4059 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4474 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4060 <source>Description must be at least 3 characters long.</source> 4475 <source>Description must be at least 3 characters long.</source>
4061 <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target> 4476 <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target>
@@ -4063,9 +4478,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4063 <context context-type="linenumber">1</context> 4478 <context context-type="linenumber">1</context>
4064 </context-group> 4479 </context-group>
4065 </trans-unit> 4480 </trans-unit>
4066 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4481 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4067 <source>Description cannot be more than 250 characters long.</source> 4482 <source>Description cannot be more than 1000 characters long.</source>
4068 <target>Die Beschreibung darf nicht mehr als 250 Zeichen umfassen.</target> 4483 <target>Beschreibung kann nicht länger als 1000 Zeichen sein.</target>
4069 <context-group name="null"> 4484 <context-group name="null">
4070 <context context-type="linenumber">1</context> 4485 <context context-type="linenumber">1</context>
4071 </context-group> 4486 </context-group>
@@ -4105,13 +4520,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4105 <context context-type="linenumber">1</context> 4520 <context context-type="linenumber">1</context>
4106 </context-group> 4521 </context-group>
4107 </trans-unit> 4522 </trans-unit>
4108 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4109 <source>Report reason cannot be more than 300 characters long.</source>
4110 <target>Der Grund für die Meldung darf nicht mehr als 300 Zeichen umfassen.</target>
4111 <context-group name="null">
4112 <context context-type="linenumber">1</context>
4113 </context-group>
4114 </trans-unit>
4115 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4523 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4116 <source>Moderation comment is required.</source> 4524 <source>Moderation comment is required.</source>
4117 <target>Der Moderationskommentar muss angegeben werden.</target> 4525 <target>Der Moderationskommentar muss angegeben werden.</target>
@@ -4126,13 +4534,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4126 <context context-type="linenumber">1</context> 4534 <context context-type="linenumber">1</context>
4127 </context-group> 4535 </context-group>
4128 </trans-unit> 4536 </trans-unit>
4129 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4130 <source>Moderation comment cannot be more than 300 characters long.</source>
4131 <target>Der Moderationskommentar darf nicht mehr als 300 Zeichen umfassen.</target>
4132 <context-group name="null">
4133 <context context-type="linenumber">1</context>
4134 </context-group>
4135 </trans-unit>
4136 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4537 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4137 <source>The channel is required.</source> 4538 <source>The channel is required.</source>
4138 <target>Der Kanal muss angegeben werden.</target> 4539 <target>Der Kanal muss angegeben werden.</target>
@@ -4175,37 +4576,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4175 <context context-type="linenumber">1</context> 4576 <context context-type="linenumber">1</context>
4176 </context-group> 4577 </context-group>
4177 </trans-unit> 4578 </trans-unit>
4178 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4579 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4179 <source>Name is required.</source> 4580 <source>You can only transfer ownership to a local account</source>
4180 <target>Der Name muss angegeben werden.</target> 4581 <target>Du kannst den Besitz nur auf einen lokalen Account übertragen</target>
4181 <context-group name="null">
4182 <context context-type="linenumber">1</context>
4183 </context-group>
4184 </trans-unit>
4185 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4186 <source>Name must be at least 3 characters long.</source>
4187 <target>Der Name muss mindestens 3 Zeichen umfassen.</target>
4188 <context-group name="null">
4189 <context context-type="linenumber">1</context>
4190 </context-group>
4191 </trans-unit>
4192 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4193 <source>Name cannot be more than 20 characters long.</source>
4194 <target>Der Name darf nicht mehr als 20 Zeichen umfassen.</target>
4195 <context-group name="null">
4196 <context context-type="linenumber">1</context>
4197 </context-group>
4198 </trans-unit>
4199 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4200 <source>Name should be only lowercase alphanumeric characters.</source>
4201 <target>Der Name sollte nur kleine alphanumerische Zeichen enthalten.</target>
4202 <context-group name="null"> 4582 <context-group name="null">
4203 <context context-type="linenumber">1</context> 4583 <context context-type="linenumber">1</context>
4204 </context-group> 4584 </context-group>
4205 </trans-unit> 4585 </trans-unit>
4206 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 4586 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4207 <source>Description cannot be more than 500 characters long.</source> 4587 <source>Name is required.</source>
4208 <target>Die Beschreibung darf nicht mehr als 500 Zeichen umfassen.</target> 4588 <target>Der Name muss angegeben werden.</target>
4209 <context-group name="null"> 4589 <context-group name="null">
4210 <context context-type="linenumber">1</context> 4590 <context context-type="linenumber">1</context>
4211 </context-group> 4591 </context-group>
@@ -4217,9 +4597,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4217 <context context-type="linenumber">1</context> 4597 <context context-type="linenumber">1</context>
4218 </context-group> 4598 </context-group>
4219 </trans-unit> 4599 </trans-unit>
4220 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4600 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4221 <source>Support text cannot be more than 500 characters long.</source> 4601 <source>Support text cannot be more than 1000 characters long.</source>
4222 <target>Die Beschreibung zur Unterstützung darf nicht mehr als 500 Zeichen umfassen.</target> 4602 <target>Die Beschreibung zur Unterstützung kann nicht mehr als 1000 Zeichen lang sein.</target>
4223 <context-group name="null"> 4603 <context-group name="null">
4224 <context context-type="linenumber">1</context> 4604 <context context-type="linenumber">1</context>
4225 </context-group> 4605 </context-group>
@@ -4315,9 +4695,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4315 <context context-type="linenumber">1</context> 4695 <context context-type="linenumber">1</context>
4316 </context-group> 4696 </context-group>
4317 </trans-unit> 4697 </trans-unit>
4318 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4698 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4319 <source>Video support cannot be more than 500 characters long.</source> 4699 <source>Video support cannot be more than 1000 characters long.</source>
4320 <target>Die Beschreibung zur Unterstützung darf nicht mehr als 500 Zeichen umfassen.</target> 4700 <target>Die Beschreibung zur Unterstützung darf nicht mehr als 1000 Zeichen umfassen.</target>
4321 <context-group name="null"> 4701 <context-group name="null">
4322 <context context-type="linenumber">1</context> 4702 <context context-type="linenumber">1</context>
4323 </context-group> 4703 </context-group>
@@ -4807,14 +5187,14 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4807 </trans-unit> 5187 </trans-unit>
4808 <trans-unit id="457f161d3ca706b8de263b0cd58e493d54e7d4c5"> 5188 <trans-unit id="457f161d3ca706b8de263b0cd58e493d54e7d4c5">
4809 <source><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatible that supports:</source> 5189 <source><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatible that supports:</source>
4810 <target>Kompatibilität mit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> mit Unterstützung von:</target> 5190 <target><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>-Unterstützung von:</target>
4811 <context-group name="null"> 5191 <context-group name="null">
4812 <context context-type="linenumber">1</context> 5192 <context context-type="linenumber">1</context>
4813 </context-group> 5193 </context-group>
4814 </trans-unit> 5194 </trans-unit>
4815 <trans-unit id="ab4426b60f13c00b61d6b714d390dc629f314980"> 5195 <trans-unit id="ab4426b60f13c00b61d6b714d390dc629f314980">
4816 <source>Emphasis</source> 5196 <source>Emphasis</source>
4817 <target>Hervorhebung</target> 5197 <target>Hervorhebungen</target>
4818 <context-group name="null"> 5198 <context-group name="null">
4819 <context context-type="linenumber">1</context> 5199 <context context-type="linenumber">1</context>
4820 </context-group> 5200 </context-group>
@@ -4847,6 +5227,153 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4847 <context context-type="linenumber">1</context> 5227 <context context-type="linenumber">1</context>
4848 </context-group> 5228 </context-group>
4849 </trans-unit> 5229 </trans-unit>
5230 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5231 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5232 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gebannt.</target>
5233 <context-group name="null">
5234 <context context-type="linenumber">1</context>
5235 </context-group>
5236 </trans-unit>
5237 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5238 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5239 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> gesperrt.</target>
5240 <context-group name="null">
5241 <context context-type="linenumber">1</context>
5242 </context-group>
5243 </trans-unit>
5244 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5245 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5246 <target>Möchtest du die Sperre von <x id="INTERPOLATION" equiv-text="{{username}}"/> wirklich aufheben?</target>
5247 <context-group name="null">
5248 <context context-type="linenumber">1</context>
5249 </context-group>
5250 </trans-unit>
5251 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5252 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5253 <target>Sperre von Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> aufgehoben.</target>
5254 <context-group name="null">
5255 <context context-type="linenumber">1</context>
5256 </context-group>
5257 </trans-unit>
5258 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5259 <source>If you remove this user, you will not be able to create another with the same username!</source>
5260 <target>Wenn du diesen Nutzer entfernst, wirst du keinen neuen mit dem gleichen Nutzernamen erstellen können!</target>
5261 <context-group name="null">
5262 <context context-type="linenumber">1</context>
5263 </context-group>
5264 </trans-unit>
5265 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5266 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5267 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> entfernt.</target>
5268 <context-group name="null">
5269 <context context-type="linenumber">1</context>
5270 </context-group>
5271 </trans-unit>
5272 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5273 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5274 <target>E-Mail des Benutzers <x id="INTERPOLATION" equiv-text="{{username}}"/> als bestätigt markiert</target>
5275 <context-group name="null">
5276 <context context-type="linenumber">1</context>
5277 </context-group>
5278 </trans-unit>
5279 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5280 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5281 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> stummgeschaltet.</target>
5282 <context-group name="null">
5283 <context context-type="linenumber">1</context>
5284 </context-group>
5285 </trans-unit>
5286 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5287 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5288 <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> stummgeschaltet.</target>
5289 <context-group name="null">
5290 <context context-type="linenumber">1</context>
5291 </context-group>
5292 </trans-unit>
5293 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5294 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5295 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> von der Instanz stummgeschaltet.</target>
5296 <context-group name="null">
5297 <context context-type="linenumber">1</context>
5298 </context-group>
5299 </trans-unit>
5300 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5301 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5302 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
5303 <context-group name="null">
5304 <context context-type="linenumber">1</context>
5305 </context-group>
5306 </trans-unit>
5307 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5308 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5309 <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> von der Instanz stummgeschaltet.</target>
5310 <context-group name="null">
5311 <context context-type="linenumber">1</context>
5312 </context-group>
5313 </trans-unit>
5314 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5315 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5316 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
5317 <context-group name="null">
5318 <context context-type="linenumber">1</context>
5319 </context-group>
5320 </trans-unit>
5321 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5322 <source>Mute this account</source>
5323 <target>Dieses Konto stummschalten</target>
5324 <context-group name="null">
5325 <context context-type="linenumber">1</context>
5326 </context-group>
5327 </trans-unit>
5328 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5329 <source>Unmute this account</source>
5330 <target>Stummschaltung für dieses Konto aufheben</target>
5331 <context-group name="null">
5332 <context context-type="linenumber">1</context>
5333 </context-group>
5334 </trans-unit>
5335 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5336 <source>Mute the instance</source>
5337 <target>Diese Instanz stummschalten</target>
5338 <context-group name="null">
5339 <context context-type="linenumber">1</context>
5340 </context-group>
5341 </trans-unit>
5342 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5343 <source>Unmute the instance</source>
5344 <target>Stummschaltung für diese Instanz aufheben</target>
5345 <context-group name="null">
5346 <context context-type="linenumber">1</context>
5347 </context-group>
5348 </trans-unit>
5349 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5350 <source>Mute this account by your instance</source>
5351 <target>Dieses Konto durch deine Instanz stummschalten lassen</target>
5352 <context-group name="null">
5353 <context context-type="linenumber">1</context>
5354 </context-group>
5355 </trans-unit>
5356 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5357 <source>Unmute this account by your instance</source>
5358 <target>Stummschaltung dieses Kontos durch deine Instanz aufheben</target>
5359 <context-group name="null">
5360 <context context-type="linenumber">1</context>
5361 </context-group>
5362 </trans-unit>
5363 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5364 <source>Mute the instance by your instance</source>
5365 <target>Diese Instanz durch deine Instanz stummschalten lassen</target>
5366 <context-group name="null">
5367 <context context-type="linenumber">1</context>
5368 </context-group>
5369 </trans-unit>
5370 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5371 <source>Unmute the instance by your instance</source>
5372 <target>Stummschaltung dieser Instanz durch deine Instanz aufheben</target>
5373 <context-group name="null">
5374 <context context-type="linenumber">1</context>
5375 </context-group>
5376 </trans-unit>
4850 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5377 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4851 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5378 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4852 <target>Die Anfrage ist zu groß. Bitte kontaktiere den Administrator, um die Obergrenze für die Größe zu erhöhen.</target> 5379 <target>Die Anfrage ist zu groß. Bitte kontaktiere den Administrator, um die Obergrenze für die Größe zu erhöhen.</target>
@@ -4875,6 +5402,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4875 <context context-type="linenumber">1</context> 5402 <context context-type="linenumber">1</context>
4876 </context-group> 5403 </context-group>
4877 </trans-unit> 5404 </trans-unit>
5405 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5406 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5407 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> abonniert</target>
5408 <context-group name="null">
5409 <context context-type="linenumber">1</context>
5410 </context-group>
5411 </trans-unit>
4878 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5412 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4879 <source>Subscribed</source> 5413 <source>Subscribed</source>
4880 <target>Abonniert</target> 5414 <target>Abonniert</target>
@@ -4882,9 +5416,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4882 <context context-type="linenumber">1</context> 5416 <context context-type="linenumber">1</context>
4883 </context-group> 5417 </context-group>
4884 </trans-unit> 5418 </trans-unit>
4885 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5419 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
4886 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5420 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4887 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> abonniert</target> 5421 <target>Abo von <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> beendet</target>
4888 <context-group name="null"> 5422 <context-group name="null">
4889 <context context-type="linenumber">1</context> 5423 <context context-type="linenumber">1</context>
4890 </context-group> 5424 </context-group>
@@ -4896,9 +5430,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4896 <context context-type="linenumber">1</context> 5430 <context context-type="linenumber">1</context>
4897 </context-group> 5431 </context-group>
4898 </trans-unit> 5432 </trans-unit>
4899 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5433 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
4900 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5434 <source>Moderator</source>
4901 <target>Abo von <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> beendet</target> 5435 <target>Moderator</target>
4902 <context-group name="null"> 5436 <context-group name="null">
4903 <context context-type="linenumber">1</context> 5437 <context context-type="linenumber">1</context>
4904 </context-group> 5438 </context-group>
@@ -4924,23 +5458,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4924 <context context-type="linenumber">1</context> 5458 <context context-type="linenumber">1</context>
4925 </context-group> 5459 </context-group>
4926 </trans-unit> 5460 </trans-unit>
4927 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 5461 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
4928 <source>Welcome</source> 5462 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
4929 <target>Willkommen</target> 5463 <target>Wilkommen! Bitte überprüfe deine Mails um dein Benutzerkonto zu bestätigen und die Registrierung abzuschließen.</target>
4930 <context-group name="null"> 5464 <context-group name="null">
4931 <context context-type="linenumber">1</context> 5465 <context context-type="linenumber">1</context>
4932 </context-group> 5466 </context-group>
4933 </trans-unit> 5467 </trans-unit>
4934 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c"> 5468 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
4935 <source>Please check your email to verify your account and complete signup.</source> 5469 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
4936 <target>Bitte sieh nun in deinen E-Mails nach, um die Registrierung abzuschließen.</target> 5470 <target>Du bist jetzt eingeloggt als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
4937 <context-group name="null">
4938 <context context-type="linenumber">1</context>
4939 </context-group>
4940 </trans-unit>
4941 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
4942 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
4943 <target>Registrierung für <x id="INTERPOLATION" equiv-text="{{username}}"/> abgeschlossen.</target>
4944 <context-group name="null"> 5471 <context-group name="null">
4945 <context context-type="linenumber">1</context> 5472 <context context-type="linenumber">1</context>
4946 </context-group> 5473 </context-group>
@@ -4973,13 +5500,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4973 <context context-type="linenumber">1</context> 5500 <context context-type="linenumber">1</context>
4974 </context-group> 5501 </context-group>
4975 </trans-unit> 5502 </trans-unit>
4976 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4977 <source>Info</source>
4978 <target>Infos</target>
4979 <context-group name="null">
4980 <context context-type="linenumber">1</context>
4981 </context-group>
4982 </trans-unit>
4983 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5503 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4984 <source>Upload cancelled</source> 5504 <source>Upload cancelled</source>
4985 <target>Hochladen abgebrochen</target> 5505 <target>Hochladen abgebrochen</target>
@@ -4987,13 +5507,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4987 <context context-type="linenumber">1</context> 5507 <context context-type="linenumber">1</context>
4988 </context-group> 5508 </context-group>
4989 </trans-unit> 5509 </trans-unit>
4990 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4991 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4992 <target>Leider kann PeerTube keine Videos verarbeiten, die größer als 8 GB sind.</target>
4993 <context-group name="null">
4994 <context context-type="linenumber">1</context>
4995 </context-group>
4996 </trans-unit>
4997 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5510 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4998 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 5511 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4999 <target>Dein Videokontingent wird mit diesem Video überschritten (Videogröße: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, benutzt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, Kontingent: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5512 <target>Dein Videokontingent wird mit diesem Video überschritten (Videogröße: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, benutzt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, Kontingent: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -5057,6 +5570,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5057 <context context-type="linenumber">1</context> 5570 <context context-type="linenumber">1</context>
5058 </context-group> 5571 </context-group>
5059 </trans-unit> 5572 </trans-unit>
5573 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5574 <source>Like the video</source>
5575 <target>Das Video gefällt Mir !</target>
5576 <context-group name="null">
5577 <context context-type="linenumber">1</context>
5578 </context-group>
5579 </trans-unit>
5580 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5581 <source>Dislike the video</source>
5582 <target>Das Video gefällt Mir nicht mehr.</target>
5583 <context-group name="null">
5584 <context context-type="linenumber">1</context>
5585 </context-group>
5586 </trans-unit>
5060 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5587 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5061 <source>Do you really want to delete this video?</source> 5588 <source>Do you really want to delete this video?</source>
5062 <target>Möchtest du das Video wirklich löschen?</target> 5589 <target>Möchtest du das Video wirklich löschen?</target>
@@ -5066,7 +5593,7 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5066 </trans-unit> 5593 </trans-unit>
5067 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e"> 5594 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
5068 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source> 5595 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
5069 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> Likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> Dislikes</target> 5596 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> gefällt das / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> gefällt das nicht</target>
5070 <context-group name="null"> 5597 <context-group name="null">
5071 <context context-type="linenumber">1</context> 5598 <context context-type="linenumber">1</context>
5072 </context-group> 5599 </context-group>
diff --git a/client/src/locale/target/angular_eo.xml b/client/src/locale/target/angular_eo.xml
index 3eb88bb99..0d54b5a5d 100644
--- a/client/src/locale/target/angular_eo.xml
+++ b/client/src/locale/target/angular_eo.xml
@@ -126,7 +126,7 @@
126 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 126 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
127 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> rigardoj</target> 127 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> rigardoj</target>
128 <context-group name="null"> 128 <context-group name="null">
129 <context context-type="linenumber">13</context> 129 <context context-type="linenumber">16</context>
130 </context-group> 130 </context-group>
131 </trans-unit> 131 </trans-unit>
132 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 132 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -140,7 +140,7 @@
140 <source>Edit</source> 140 <source>Edit</source>
141 <target>Redakti</target> 141 <target>Redakti</target>
142 <context-group name="null"> 142 <context-group name="null">
143 <context context-type="linenumber">5</context> 143 <context context-type="linenumber">1</context>
144 </context-group> 144 </context-group>
145 </trans-unit> 145 </trans-unit>
146 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 146 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -168,7 +168,14 @@
168 <source>Video quota</source> 168 <source>Video quota</source>
169 <target>Datumlimo por filmoj</target> 169 <target>Datumlimo por filmoj</target>
170 <context-group name="null"> 170 <context-group name="null">
171 <context context-type="linenumber">19</context> 171 <context context-type="linenumber">42</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
175 <source>Reason...</source>
176 <target>Kialo…</target>
177 <context-group name="null">
178 <context context-type="linenumber">11</context>
172 </context-group> 179 </context-group>
173 </trans-unit> 180 </trans-unit>
174 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 181 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
@@ -229,7 +236,7 @@
229 <source>Password</source> 236 <source>Password</source>
230 <target>Pasvorto</target> 237 <target>Pasvorto</target>
231 <context-group name="null"> 238 <context-group name="null">
232 <context context-type="linenumber">12</context> 239 <context context-type="linenumber">13</context>
233 </context-group> 240 </context-group>
234 </trans-unit> 241 </trans-unit>
235 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 242 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -243,7 +250,7 @@
243 <source>Login</source> 250 <source>Login</source>
244 <target>Saluti</target> 251 <target>Saluti</target>
245 <context-group name="null"> 252 <context-group name="null">
246 <context context-type="linenumber">38</context> 253 <context context-type="linenumber">36</context>
247 </context-group> 254 </context-group>
248 </trans-unit> 255 </trans-unit>
249 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 256 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -271,7 +278,7 @@
271 <source>Send me an email to reset my password</source> 278 <source>Send me an email to reset my password</source>
272 <target>Sendu al mi retleteron por restarigi mian pasvorton</target> 279 <target>Sendu al mi retleteron por restarigi mian pasvorton</target>
273 <context-group name="null"> 280 <context-group name="null">
274 <context context-type="linenumber">75</context> 281 <context context-type="linenumber">80</context>
275 </context-group> 282 </context-group>
276 </trans-unit> 283 </trans-unit>
277 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 284 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -324,18 +331,11 @@
324 <context context-type="linenumber">8</context> 331 <context context-type="linenumber">8</context>
325 </context-group> 332 </context-group>
326 </trans-unit> 333 </trans-unit>
327 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
328 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
329 <target>Mi legis kaj konsentis &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;la kondiĉojn&lt;/a&gt; de ĉi tiu nodo</target>
330 <context-group name="null">
331 <context context-type="linenumber">54</context>
332 </context-group>
333 </trans-unit>
334 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 334 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
335 <source>Signup</source> 335 <source>Signup</source>
336 <target>RegistriÄo</target> 336 <target>RegistriÄo</target>
337 <context-group name="null"> 337 <context-group name="null">
338 <context context-type="linenumber">88</context> 338 <context context-type="linenumber">78</context>
339 </context-group> 339 </context-group>
340 </trans-unit> 340 </trans-unit>
341 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 341 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -356,13 +356,6 @@
356 <context context-type="linenumber">6</context> 356 <context context-type="linenumber">6</context>
357 </context-group> 357 </context-group>
358 </trans-unit> 358 </trans-unit>
359 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
360 <source>Filters</source>
361 <target>Filtriloj</target>
362 <context-group name="null">
363 <context context-type="linenumber">16</context>
364 </context-group>
365 </trans-unit>
366 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 359 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
367 <source> 360 <source>
368 No results found 361 No results found
@@ -371,14 +364,14 @@
371 Neniuj rezultoj troviÄis 364 Neniuj rezultoj troviÄis
372 </target> 365 </target>
373 <context-group name="null"> 366 <context-group name="null">
374 <context context-type="linenumber">25</context> 367 <context context-type="linenumber">28</context>
375 </context-group> 368 </context-group>
376 </trans-unit> 369 </trans-unit>
377 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 370 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
378 <source>Change the language</source> 371 <source>Change the language</source>
379 <target>ÅœanÄi la lingvon</target> 372 <target>ÅœanÄi la lingvon</target>
380 <context-group name="null"> 373 <context-group name="null">
381 <context context-type="linenumber">88</context> 374 <context context-type="linenumber">86</context>
382 </context-group> 375 </context-group>
383 </trans-unit> 376 </trans-unit>
384 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 377 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -389,7 +382,7 @@
389 Miaj filmoj 382 Miaj filmoj
390 </target> 383 </target>
391 <context-group name="null"> 384 <context-group name="null">
392 <context context-type="linenumber">26</context> 385 <context context-type="linenumber">24</context>
393 </context-group> 386 </context-group>
394 </trans-unit> 387 </trans-unit>
395 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 388 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -400,14 +393,14 @@
400 AdiaÅ­i 393 AdiaÅ­i
401 </target> 394 </target>
402 <context-group name="null"> 395 <context-group name="null">
403 <context context-type="linenumber">30</context> 396 <context context-type="linenumber">28</context>
404 </context-group> 397 </context-group>
405 </trans-unit> 398 </trans-unit>
406 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 399 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
407 <source>Create an account</source> 400 <source>Create an account</source>
408 <target>Krei konton</target> 401 <target>Krei konton</target>
409 <context-group name="null"> 402 <context-group name="null">
410 <context context-type="linenumber">39</context> 403 <context context-type="linenumber">37</context>
411 </context-group> 404 </context-group>
412 </trans-unit> 405 </trans-unit>
413 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 406 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -421,49 +414,49 @@
421 <source>Subscriptions</source> 414 <source>Subscriptions</source>
422 <target>Abonoj</target> 415 <target>Abonoj</target>
423 <context-group name="null"> 416 <context-group name="null">
424 <context context-type="linenumber">47</context> 417 <context context-type="linenumber">45</context>
425 </context-group> 418 </context-group>
426 </trans-unit> 419 </trans-unit>
427 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 420 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
428 <source>Overview</source> 421 <source>Overview</source>
429 <target>Superrigardo</target> 422 <target>Superrigardo</target>
430 <context-group name="null"> 423 <context-group name="null">
431 <context context-type="linenumber">52</context> 424 <context context-type="linenumber">50</context>
432 </context-group> 425 </context-group>
433 </trans-unit> 426 </trans-unit>
434 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 427 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
435 <source>Trending</source> 428 <source>Trending</source>
436 <target>Furoraj</target> 429 <target>Furoraj</target>
437 <context-group name="null"> 430 <context-group name="null">
438 <context context-type="linenumber">57</context> 431 <context context-type="linenumber">55</context>
439 </context-group> 432 </context-group>
440 </trans-unit> 433 </trans-unit>
441 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 434 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
442 <source>Recently added</source> 435 <source>Recently added</source>
443 <target>FreÅe aldonitaj</target> 436 <target>FreÅe aldonitaj</target>
444 <context-group name="null"> 437 <context-group name="null">
445 <context context-type="linenumber">62</context> 438 <context context-type="linenumber">60</context>
446 </context-group> 439 </context-group>
447 </trans-unit> 440 </trans-unit>
448 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 441 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
449 <source>Local</source> 442 <source>Local</source>
450 <target>Lokaj</target> 443 <target>Lokaj</target>
451 <context-group name="null"> 444 <context-group name="null">
452 <context context-type="linenumber">67</context> 445 <context context-type="linenumber">65</context>
453 </context-group> 446 </context-group>
454 </trans-unit> 447 </trans-unit>
455 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 448 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
456 <source>More</source> 449 <source>More</source>
457 <target>Pli</target> 450 <target>Pli</target>
458 <context-group name="null"> 451 <context-group name="null">
459 <context context-type="linenumber">72</context> 452 <context context-type="linenumber">70</context>
460 </context-group> 453 </context-group>
461 </trans-unit> 454 </trans-unit>
462 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 455 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
463 <source>Administration</source> 456 <source>Administration</source>
464 <target>Administrado</target> 457 <target>Administrado</target>
465 <context-group name="null"> 458 <context-group name="null">
466 <context context-type="linenumber">76</context> 459 <context context-type="linenumber">74</context>
467 </context-group> 460 </context-group>
468 </trans-unit> 461 </trans-unit>
469 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 462 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -575,14 +568,14 @@
575 <source>No results.</source> 568 <source>No results.</source>
576 <target>Nenio troviÄis.</target> 569 <target>Nenio troviÄis.</target>
577 <context-group name="null"> 570 <context-group name="null">
578 <context context-type="linenumber">7</context> 571 <context context-type="linenumber">20</context>
579 </context-group> 572 </context-group>
580 </trans-unit> 573 </trans-unit>
581 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 574 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
582 <source>Instance</source> 575 <source>Instance</source>
583 <target>Nodo</target> 576 <target>Nodo</target>
584 <context-group name="null"> 577 <context-group name="null">
585 <context context-type="linenumber">8</context> 578 <context context-type="linenumber">12</context>
586 </context-group> 579 </context-group>
587 </trans-unit> 580 </trans-unit>
588 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 581 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -592,15 +585,11 @@
592 <context context-type="linenumber">7</context> 585 <context context-type="linenumber">7</context>
593 </context-group> 586 </context-group>
594 </trans-unit> 587 </trans-unit>
595 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 588 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
596 <source> 589 <source>Submit</source>
597 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 590 <target>Sendi</target>
598</source>
599 <target>
600 Pri la nodo « <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> »
601</target>
602 <context-group name="null"> 591 <context-group name="null">
603 <context context-type="linenumber">1</context> 592 <context context-type="linenumber">31</context>
604 </context-group> 593 </context-group>
605 </trans-unit> 594 </trans-unit>
606 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 595 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -614,47 +603,14 @@
614 <source>Terms</source> 603 <source>Terms</source>
615 <target>Kondiĉoj</target> 604 <target>Kondiĉoj</target>
616 <context-group name="null"> 605 <context-group name="null">
617 <context context-type="linenumber">44</context> 606 <context context-type="linenumber">39</context>
618 </context-group> 607 </context-group>
619 </trans-unit> 608 </trans-unit>
620 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 609 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
621 <source>User registration is allowed and</source> 610 <source>User registration is allowed and</source>
622 <target>Registrado de uzantoj estas permesata kaj</target> 611 <target>Registrado de uzantoj estas permesata kaj</target>
623 <context-group name="null"> 612 <context-group name="null">
624 <context context-type="linenumber">25</context> 613 <context context-type="linenumber">29</context>
625 </context-group>
626 </trans-unit>
627 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
628 <source>
629 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
630 </source>
631 <target>
632 ĉi tiu nodo donas bazan datumlimon de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> da spaco por filmoj de siaj uzantoj.
633 </target>
634 <context-group name="null">
635 <context context-type="linenumber">27</context>
636 </context-group>
637 </trans-unit>
638 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
639 <source>
640 this instance provides unlimited space for the videos of its users.
641 </source>
642 <target>
643 ĉi tiu nodo donas senliman spacon por filmoj de siaj uzantoj.
644 </target>
645 <context-group name="null">
646 <context context-type="linenumber">31</context>
647 </context-group>
648 </trans-unit>
649 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
650 <source>
651 User registration is currently not allowed.
652 </source>
653 <target>
654 Registrado de novaj uzantoj nun ne estas permesata.
655 </target>
656 <context-group name="null">
657 <context context-type="linenumber">36</context>
658 </context-group> 614 </context-group>
659 </trans-unit> 615 </trans-unit>
660 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 616 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -875,19 +831,6 @@
875 <context context-type="linenumber">83</context> 831 <context context-type="linenumber">83</context>
876 </context-group> 832 </context-group>
877 </trans-unit> 833 </trans-unit>
878 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
879 <source>
880 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
881 In the meantime, we want to test different ideas related to this issue:
882 </source>
883 <target>
884 PeerTube estas nur beta-versia, kaj ni volas liveri kiel eble plej bonajn Åirmojn kiam la stabilo versio eldoniÄos.
885 Dume, ni volas testi diversajn ideojn pri la problemo:
886 </target>
887 <context-group name="null">
888 <context context-type="linenumber">85</context>
889 </context-group>
890 </trans-unit>
891 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 834 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
892 <source>Set a limit to the number of peers sent by the tracker</source> 835 <source>Set a limit to the number of peers sent by the tracker</source>
893 <target>Limigi nombron da samtavolanoj sendatan de la kunordigilo</target> 836 <target>Limigi nombron da samtavolanoj sendatan de la kunordigilo</target>
@@ -927,14 +870,14 @@
927 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 870 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
928 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonantoj</target> 871 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonantoj</target>
929 <context-group name="null"> 872 <context-group name="null">
930 <context context-type="linenumber">12</context> 873 <context context-type="linenumber">24</context>
931 </context-group> 874 </context-group>
932 </trans-unit> 875 </trans-unit>
933 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 876 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
934 <source>Video channels</source> 877 <source>Video channels</source>
935 <target>Filmaj kanaloj</target> 878 <target>Filmaj kanaloj</target>
936 <context-group name="null"> 879 <context-group name="null">
937 <context context-type="linenumber">19</context> 880 <context context-type="linenumber">31</context>
938 </context-group> 881 </context-group>
939 </trans-unit> 882 </trans-unit>
940 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 883 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -976,49 +919,49 @@
976 <source>Short description</source> 919 <source>Short description</source>
977 <target>Mallonga priskribo</target> 920 <target>Mallonga priskribo</target>
978 <context-group name="null"> 921 <context-group name="null">
979 <context context-type="linenumber">22</context> 922 <context context-type="linenumber">21</context>
980 </context-group> 923 </context-group>
981 </trans-unit> 924 </trans-unit>
982 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 925 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
983 <source>Default client route</source> 926 <source>Default client route</source>
984 <target>Norma klienta vojo</target> 927 <target>Norma klienta vojo</target>
985 <context-group name="null"> 928 <context-group name="null">
986 <context context-type="linenumber">55</context> 929 <context context-type="linenumber">48</context>
987 </context-group> 930 </context-group>
988 </trans-unit> 931 </trans-unit>
989 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 932 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
990 <source>Videos Overview</source> 933 <source>Videos Overview</source>
991 <target>Filma superrigardo</target> 934 <target>Filma superrigardo</target>
992 <context-group name="null"> 935 <context-group name="null">
993 <context context-type="linenumber">58</context> 936 <context context-type="linenumber">51</context>
994 </context-group> 937 </context-group>
995 </trans-unit> 938 </trans-unit>
996 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 939 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
997 <source>Videos Trending</source> 940 <source>Videos Trending</source>
998 <target>Filmoj furoraj</target> 941 <target>Filmoj furoraj</target>
999 <context-group name="null"> 942 <context-group name="null">
1000 <context context-type="linenumber">59</context> 943 <context context-type="linenumber">52</context>
1001 </context-group> 944 </context-group>
1002 </trans-unit> 945 </trans-unit>
1003 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 946 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1004 <source>Videos Recently Added</source> 947 <source>Videos Recently Added</source>
1005 <target>Filmoj freÅe aldonitaj</target> 948 <target>Filmoj freÅe aldonitaj</target>
1006 <context-group name="null"> 949 <context-group name="null">
1007 <context context-type="linenumber">60</context> 950 <context context-type="linenumber">53</context>
1008 </context-group> 951 </context-group>
1009 </trans-unit> 952 </trans-unit>
1010 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 953 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1011 <source>Local videos</source> 954 <source>Local videos</source>
1012 <target>Filmoj lokaj</target> 955 <target>Filmoj lokaj</target>
1013 <context-group name="null"> 956 <context-group name="null">
1014 <context context-type="linenumber">61</context> 957 <context context-type="linenumber">54</context>
1015 </context-group> 958 </context-group>
1016 </trans-unit> 959 </trans-unit>
1017 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 960 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1018 <source>Policy on videos containing sensitive content</source> 961 <source>Policy on videos containing sensitive content</source>
1019 <target>Politiko pri filmoj kun konsterna enhavo</target> 962 <target>Politiko pri filmoj kun konsterna enhavo</target>
1020 <context-group name="null"> 963 <context-group name="null">
1021 <context context-type="linenumber">70</context> 964 <context context-type="linenumber">61</context>
1022 </context-group> 965 </context-group>
1023 </trans-unit> 966 </trans-unit>
1024 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 967 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1053,21 +996,35 @@
1053 <source>Signup enabled</source> 996 <source>Signup enabled</source>
1054 <target>RegistriÄoj Åaltitaj</target> 997 <target>RegistriÄoj Åaltitaj</target>
1055 <context-group name="null"> 998 <context-group name="null">
1056 <context context-type="linenumber">92</context> 999 <context context-type="linenumber">84</context>
1057 </context-group> 1000 </context-group>
1058 </trans-unit> 1001 </trans-unit>
1059 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1002 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1060 <source>Signup requires email verification</source> 1003 <source>Signup requires email verification</source>
1061 <target>RegistriÄo bezonas kontrolon de retpoÅtadreso</target> 1004 <target>RegistriÄo bezonas kontrolon de retpoÅtadreso</target>
1062 <context-group name="null"> 1005 <context-group name="null">
1063 <context context-type="linenumber">97</context> 1006 <context context-type="linenumber">91</context>
1064 </context-group> 1007 </context-group>
1065 </trans-unit> 1008 </trans-unit>
1066 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1009 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1067 <source>Signup limit</source> 1010 <source>Signup limit</source>
1068 <target>Limo de registriÄoj</target> 1011 <target>Limo de registriÄoj</target>
1069 <context-group name="null"> 1012 <context-group name="null">
1070 <context context-type="linenumber">101</context> 1013 <context context-type="linenumber">96</context>
1014 </context-group>
1015 </trans-unit>
1016 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1017 <source>Users</source>
1018 <target>Uzantoj</target>
1019 <context-group name="null">
1020 <context context-type="linenumber">105</context>
1021 </context-group>
1022 </trans-unit>
1023 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1024 <source>User default video quota</source>
1025 <target>Norma datumlimo por filmoj de uzantoj</target>
1026 <context-group name="null">
1027 <context context-type="linenumber">109</context>
1071 </context-group> 1028 </context-group>
1072 </trans-unit> 1029 </trans-unit>
1073 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1030 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1077,46 +1034,25 @@
1077 <context context-type="linenumber">42</context> 1034 <context context-type="linenumber">42</context>
1078 </context-group> 1035 </context-group>
1079 </trans-unit> 1036 </trans-unit>
1080 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce">
1081 <source>Video import with HTTP enabled</source>
1082 <target>Enporto de filmoj per HTTP Åaltita</target>
1083 <context-group name="null">
1084 <context context-type="linenumber">115</context>
1085 </context-group>
1086 </trans-unit>
1087 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1037 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1088 <source>Video import with a torrent file or a magnet URI enabled</source> 1038 <source>Video import with a torrent file or a magnet URI enabled</source>
1089 <target>Enporto de filmoj per torenta dosiero aÅ­ magneta ligilo Åaltita</target> 1039 <target>Enporto de filmoj per torenta dosiero aÅ­ magneta ligilo Åaltita</target>
1090 <context-group name="null"> 1040 <context-group name="null">
1091 <context context-type="linenumber">120</context> 1041 <context context-type="linenumber">148</context>
1092 </context-group> 1042 </context-group>
1093 </trans-unit> 1043 </trans-unit>
1094 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1044 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1095 <source>Administrator</source> 1045 <source>Administrator</source>
1096 <target>Administranto</target> 1046 <target>Administranto</target>
1097 <context-group name="null"> 1047 <context-group name="null">
1098 <context context-type="linenumber">123</context> 1048 <context context-type="linenumber">155</context>
1099 </context-group> 1049 </context-group>
1100 </trans-unit> 1050 </trans-unit>
1101 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1051 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1102 <source>Admin email</source> 1052 <source>Admin email</source>
1103 <target>RetpoÅtadreso de administranto</target> 1053 <target>RetpoÅtadreso de administranto</target>
1104 <context-group name="null"> 1054 <context-group name="null">
1105 <context context-type="linenumber">126</context> 1055 <context context-type="linenumber">158</context>
1106 </context-group>
1107 </trans-unit>
1108 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1109 <source>Users</source>
1110 <target>Uzantoj</target>
1111 <context-group name="null">
1112 <context context-type="linenumber">136</context>
1113 </context-group>
1114 </trans-unit>
1115 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1116 <source>User default video quota</source>
1117 <target>Norma datumlimo por filmoj de uzantoj</target>
1118 <context-group name="null">
1119 <context context-type="linenumber">139</context>
1120 </context-group> 1056 </context-group>
1121 </trans-unit> 1057 </trans-unit>
1122 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1058 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1130,133 +1066,133 @@
1130 <source>Twitter</source> 1066 <source>Twitter</source>
1131 <target>Tvitero</target> 1067 <target>Tvitero</target>
1132 <context-group name="null"> 1068 <context-group name="null">
1133 <context context-type="linenumber">170</context> 1069 <context context-type="linenumber">178</context>
1134 </context-group> 1070 </context-group>
1135 </trans-unit> 1071 </trans-unit>
1136 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1072 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1137 <source>Your Twitter username</source> 1073 <source>Your Twitter username</source>
1138 <target>Via Tvitera salutnomo</target> 1074 <target>Via Tvitera salutnomo</target>
1139 <context-group name="null"> 1075 <context-group name="null">
1140 <context context-type="linenumber">173</context> 1076 <context context-type="linenumber">184</context>
1141 </context-group> 1077 </context-group>
1142 </trans-unit> 1078 </trans-unit>
1143 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1079 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1144 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1080 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1145 <target>Indikas konton de Twitter por la retejo aÅ­ platformo, sur kiu la afero publikiÄis.</target> 1081 <target>Indikas konton de Twitter por la retejo aÅ­ platformo, sur kiu la afero publikiÄis.</target>
1146 <context-group name="null"> 1082 <context-group name="null">
1147 <context context-type="linenumber">176</context> 1083 <context context-type="linenumber">187</context>
1148 </context-group> 1084 </context-group>
1149 </trans-unit> 1085 </trans-unit>
1150 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1086 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1151 <source>Instance whitelisted by Twitter</source> 1087 <source>Instance whitelisted by Twitter</source>
1152 <target>Nodo permesata de Twitter</target> 1088 <target>Nodo permesata de Twitter</target>
1153 <context-group name="null"> 1089 <context-group name="null">
1154 <context context-type="linenumber">189</context> 1090 <context context-type="linenumber">199</context>
1155 </context-group> 1091 </context-group>
1156 </trans-unit> 1092 </trans-unit>
1157 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1093 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1158 <source>Services</source> 1094 <source>Services</source>
1159 <target>Servoj</target> 1095 <target>Servoj</target>
1160 <context-group name="null"> 1096 <context-group name="null">
1161 <context context-type="linenumber">168</context> 1097 <context context-type="linenumber">176</context>
1162 </context-group> 1098 </context-group>
1163 </trans-unit> 1099 </trans-unit>
1164 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1100 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1165 <source>Transcoding</source> 1101 <source>Transcoding</source>
1166 <target>Transkodado</target> 1102 <target>Transkodado</target>
1167 <context-group name="null"> 1103 <context-group name="null">
1168 <context context-type="linenumber">200</context> 1104 <context context-type="linenumber">215</context>
1169 </context-group> 1105 </context-group>
1170 </trans-unit> 1106 </trans-unit>
1171 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1107 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1172 <source>Transcoding enabled</source> 1108 <source>Transcoding enabled</source>
1173 <target>Transkodado Åaltita</target> 1109 <target>Transkodado Åaltita</target>
1174 <context-group name="null"> 1110 <context-group name="null">
1175 <context context-type="linenumber">204</context> 1111 <context context-type="linenumber">221</context>
1176 </context-group> 1112 </context-group>
1177 </trans-unit> 1113 </trans-unit>
1178 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1114 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1179 <source>If you disable transcoding, many videos from your users will not work!</source> 1115 <source>If you disable transcoding, many videos from your users will not work!</source>
1180 <target>Se vi malÅaltos transkodadon, multaj filmoj de viaj uzantoj eble ne funkcios!</target> 1116 <target>Se vi malÅaltos transkodadon, multaj filmoj de viaj uzantoj eble ne funkcios!</target>
1181 <context-group name="null"> 1117 <context-group name="null">
1182 <context context-type="linenumber">205</context> 1118 <context context-type="linenumber">222</context>
1183 </context-group> 1119 </context-group>
1184 </trans-unit> 1120 </trans-unit>
1185 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1121 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1186 <source>Transcoding threads</source> 1122 <source>Transcoding threads</source>
1187 <target>Fadenoj por transkodado</target> 1123 <target>Fadenoj por transkodado</target>
1188 <context-group name="null"> 1124 <context-group name="null">
1189 <context context-type="linenumber">211</context> 1125 <context context-type="linenumber">237</context>
1190 </context-group> 1126 </context-group>
1191 </trans-unit> 1127 </trans-unit>
1192 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1128 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1193 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1129 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1194 <target>Distingo <x id="INTERPOLATION" equiv-text="{{resolution}}"/> Åaltita</target> 1130 <target>Distingo <x id="INTERPOLATION" equiv-text="{{resolution}}"/> Åaltita</target>
1195 <context-group name="null"> 1131 <context-group name="null">
1196 <context context-type="linenumber">227</context> 1132 <context context-type="linenumber">252</context>
1197 </context-group> 1133 </context-group>
1198 </trans-unit> 1134 </trans-unit>
1199 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1135 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1200 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1136 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1201 <target>Iuj dosieroj ne estas federataj (antaÅ­rigardoj, transskriboj). Ni prenas kaj kaÅmemoras ilin rekte el la fonta nodo.</target> 1137 <target>Iuj dosieroj ne estas federataj (antaÅ­rigardoj, transskriboj). Ni prenas kaj kaÅmemoras ilin rekte el la fonta nodo.</target>
1202 <context-group name="null"> 1138 <context-group name="null">
1203 <context context-type="linenumber">238</context> 1139 <context context-type="linenumber">265</context>
1204 </context-group> 1140 </context-group>
1205 </trans-unit> 1141 </trans-unit>
1206 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1142 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1207 <source>Previews cache size</source> 1143 <source>Previews cache size</source>
1208 <target>Grando de antaÅ­rigarda kaÅmemoro</target> 1144 <target>Grando de antaÅ­rigarda kaÅmemoro</target>
1209 <context-group name="null"> 1145 <context-group name="null">
1210 <context context-type="linenumber">243</context> 1146 <context context-type="linenumber">271</context>
1211 </context-group> 1147 </context-group>
1212 </trans-unit> 1148 </trans-unit>
1213 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1149 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1214 <source>Video captions cache size</source> 1150 <source>Video captions cache size</source>
1215 <target>Grandeco de kaÅmemoro por filmaj transskriboj.</target> 1151 <target>Grandeco de kaÅmemoro por filmaj transskriboj.</target>
1216 <context-group name="null"> 1152 <context-group name="null">
1217 <context context-type="linenumber">254</context> 1153 <context context-type="linenumber">280</context>
1218 </context-group> 1154 </context-group>
1219 </trans-unit> 1155 </trans-unit>
1220 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1156 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1221 <source>Customizations</source> 1157 <source>Customizations</source>
1222 <target>Adaptoj</target> 1158 <target>Adaptoj</target>
1223 <context-group name="null"> 1159 <context-group name="null">
1224 <context context-type="linenumber">264</context> 1160 <context context-type="linenumber">289</context>
1225 </context-group> 1161 </context-group>
1226 </trans-unit> 1162 </trans-unit>
1227 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1163 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1228 <source>JavaScript</source> 1164 <source>JavaScript</source>
1229 <target>Äœavoskripto</target> 1165 <target>Äœavoskripto</target>
1230 <context-group name="null"> 1166 <context-group name="null">
1231 <context context-type="linenumber">267</context> 1167 <context context-type="linenumber">294</context>
1232 </context-group> 1168 </context-group>
1233 </trans-unit> 1169 </trans-unit>
1234 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1170 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1235 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1171 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1236 <target>Skribu rekte Äœavoskriptan kodon.&lt;br /&gt;Ekzemple: &lt;pre&gt;console.log('mia nodo bonegas');&lt;/pre&gt;</target> 1172 <target>Skribu rekte Äœavoskriptan kodon.&lt;br /&gt;Ekzemple: &lt;pre&gt;console.log('mia nodo bonegas');&lt;/pre&gt;</target>
1237 <context-group name="null"> 1173 <context-group name="null">
1238 <context context-type="linenumber">270</context> 1174 <context context-type="linenumber">297</context>
1239 </context-group> 1175 </context-group>
1240 </trans-unit> 1176 </trans-unit>
1241 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1177 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1242 <source>Advanced configuration</source> 1178 <source>Advanced configuration</source>
1243 <target>Specialaj agordoj</target> 1179 <target>Specialaj agordoj</target>
1244 <context-group name="null"> 1180 <context-group name="null">
1245 <context context-type="linenumber">197</context> 1181 <context context-type="linenumber">212</context>
1246 </context-group> 1182 </context-group>
1247 </trans-unit> 1183 </trans-unit>
1248 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1184 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1249 <source>Update configuration</source> 1185 <source>Update configuration</source>
1250 <target>Efektivigi agordojn</target> 1186 <target>Efektivigi agordojn</target>
1251 <context-group name="null"> 1187 <context-group name="null">
1252 <context context-type="linenumber">314</context> 1188 <context context-type="linenumber">340</context>
1253 </context-group> 1189 </context-group>
1254 </trans-unit> 1190 </trans-unit>
1255 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1191 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1256 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1192 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1257 <target>Ŝajnas, ke la agordo estas nevalida. Bonvolu serĉi eblajn erarojn en la langetoj.</target> 1193 <target>Ŝajnas, ke la agordo estas nevalida. Bonvolu serĉi eblajn erarojn en la langetoj.</target>
1258 <context-group name="null"> 1194 <context-group name="null">
1259 <context context-type="linenumber">315</context> 1195 <context context-type="linenumber">341</context>
1260 </context-group> 1196 </context-group>
1261 </trans-unit> 1197 </trans-unit>
1262 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1198 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1339,14 +1275,14 @@
1339 <source>Score</source> 1275 <source>Score</source>
1340 <target>Poentaro</target> 1276 <target>Poentaro</target>
1341 <context-group name="null"> 1277 <context-group name="null">
1342 <context context-type="linenumber">8</context> 1278 <context context-type="linenumber">17</context>
1343 </context-group> 1279 </context-group>
1344 </trans-unit> 1280 </trans-unit>
1345 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1281 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1346 <source>Host</source> 1282 <source>Host</source>
1347 <target>Gastiganto</target> 1283 <target>Gastiganto</target>
1348 <context-group name="null"> 1284 <context-group name="null">
1349 <context context-type="linenumber">8</context> 1285 <context context-type="linenumber">19</context>
1350 </context-group> 1286 </context-group>
1351 </trans-unit> 1287 </trans-unit>
1352 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1288 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1451,7 +1387,7 @@
1451 <source>Role</source> 1387 <source>Role</source>
1452 <target>Rolo</target> 1388 <target>Rolo</target>
1453 <context-group name="null"> 1389 <context-group name="null">
1454 <context context-type="linenumber">20</context> 1390 <context context-type="linenumber">43</context>
1455 </context-group> 1391 </context-group>
1456 </trans-unit> 1392 </trans-unit>
1457 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1393 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1467,13 +1403,6 @@
1467 <context context-type="linenumber">65</context> 1403 <context context-type="linenumber">65</context>
1468 </context-group> 1404 </context-group>
1469 </trans-unit> 1405 </trans-unit>
1470 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1471 <source>Reason...</source>
1472 <target>Kialo…</target>
1473 <context-group name="null">
1474 <context context-type="linenumber">11</context>
1475 </context-group>
1476 </trans-unit>
1477 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1406 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1478 <source>Users list</source> 1407 <source>Users list</source>
1479 <target>Listo de uzantoj</target> 1408 <target>Listo de uzantoj</target>
@@ -1485,7 +1414,14 @@
1485 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1414 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1486 <target>Salutnomo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1415 <target>Salutnomo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1487 <context-group name="null"> 1416 <context-group name="null">
1488 <context context-type="linenumber">17</context> 1417 <context context-type="linenumber">40</context>
1418 </context-group>
1419 </trans-unit>
1420 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1421 <source>Go to the account page</source>
1422 <target>Iri al paÄo de la konto</target>
1423 <context-group name="null">
1424 <context context-type="linenumber">133</context>
1489 </context-group> 1425 </context-group>
1490 </trans-unit> 1426 </trans-unit>
1491 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1427 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
@@ -1523,41 +1459,6 @@
1523 <context context-type="linenumber">7</context> 1459 <context context-type="linenumber">7</context>
1524 </context-group> 1460 </context-group>
1525 </trans-unit> 1461 </trans-unit>
1526 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1527 <source>My settings</source>
1528 <target>Miaj agordoj</target>
1529 <context-group name="null">
1530 <context context-type="linenumber">3</context>
1531 </context-group>
1532 </trans-unit>
1533 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1534 <source>My channels</source>
1535 <target>Miaj kanaloj</target>
1536 <context-group name="null">
1537 <context context-type="linenumber">12</context>
1538 </context-group>
1539 </trans-unit>
1540 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1541 <source>My videos</source>
1542 <target>Miaj filmoj</target>
1543 <context-group name="null">
1544 <context context-type="linenumber">14</context>
1545 </context-group>
1546 </trans-unit>
1547 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1548 <source>My subscriptions</source>
1549 <target>Miaj abonoj</target>
1550 <context-group name="null">
1551 <context context-type="linenumber">16</context>
1552 </context-group>
1553 </trans-unit>
1554 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1555 <source>My imports</source>
1556 <target>Miaj enportoj</target>
1557 <context-group name="null">
1558 <context context-type="linenumber">18</context>
1559 </context-group>
1560 </trans-unit>
1561 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1462 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1562 <source>Video quota:</source> 1463 <source>Video quota:</source>
1563 <target>Datumlimo por filmoj:</target> 1464 <target>Datumlimo por filmoj:</target>
@@ -1569,28 +1470,21 @@
1569 <source>Profile</source> 1470 <source>Profile</source>
1570 <target>Profilo</target> 1471 <target>Profilo</target>
1571 <context-group name="null"> 1472 <context-group name="null">
1572 <context context-type="linenumber">8</context> 1473 <context context-type="linenumber">7</context>
1573 </context-group> 1474 </context-group>
1574 </trans-unit> 1475 </trans-unit>
1575 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1476 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1576 <source>Video settings</source> 1477 <source>Video settings</source>
1577 <target>Filmaj agordoj:</target> 1478 <target>Filmaj agordoj:</target>
1578 <context-group name="null"> 1479 <context-group name="null">
1579 <context context-type="linenumber">15</context> 1480 <context context-type="linenumber">16</context>
1580 </context-group> 1481 </context-group>
1581 </trans-unit> 1482 </trans-unit>
1582 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1483 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1583 <source>Danger zone</source> 1484 <source>Danger zone</source>
1584 <target>DanÄera areo</target> 1485 <target>DanÄera areo</target>
1585 <context-group name="null"> 1486 <context-group name="null">
1586 <context context-type="linenumber">18</context> 1487 <context context-type="linenumber">19</context>
1587 </context-group>
1588 </trans-unit>
1589 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1590 <source>Submit</source>
1591 <target>Sendi</target>
1592 <context-group name="null">
1593 <context context-type="linenumber">24</context>
1594 </context-group> 1488 </context-group>
1595 </trans-unit> 1489 </trans-unit>
1596 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1490 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1701,14 +1595,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1701 <source>Automatically plays video</source> 1595 <source>Automatically plays video</source>
1702 <target>Memfare ludas filmon</target> 1596 <target>Memfare ludas filmon</target>
1703 <context-group name="null"> 1597 <context-group name="null">
1704 <context context-type="linenumber">20</context> 1598 <context context-type="linenumber">28</context>
1705 </context-group> 1599 </context-group>
1706 </trans-unit> 1600 </trans-unit>
1707 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 1601 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1708 <source>Save</source> 1602 <source>Save</source>
1709 <target>Konservi</target> 1603 <target>Konservi</target>
1710 <context-group name="null"> 1604 <context-group name="null">
1711 <context context-type="linenumber">23</context> 1605 <context context-type="linenumber">32</context>
1712 </context-group> 1606 </context-group>
1713 </trans-unit> 1607 </trans-unit>
1714 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 1608 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1807,7 +1701,7 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1807 Gratulon; la filmo <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> enportiÄos! Vi jam povas aldoni informojn pri Äi. 1701 Gratulon; la filmo <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> enportiÄos! Vi jam povas aldoni informojn pri Äi.
1808</target> 1702</target>
1809 <context-group name="null"> 1703 <context-group name="null">
1810 <context context-type="linenumber">40</context> 1704 <context context-type="linenumber">46</context>
1811 </context-group> 1705 </context-group>
1812 </trans-unit> 1706 </trans-unit>
1813 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 1707 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -1828,14 +1722,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1828 <source>Publish will be available when upload is finished</source> 1722 <source>Publish will be available when upload is finished</source>
1829 <target>Eldono eblos post fino de alÅuto</target> 1723 <target>Eldono eblos post fino de alÅuto</target>
1830 <context-group name="null"> 1724 <context-group name="null">
1831 <context context-type="linenumber">48</context> 1725 <context context-type="linenumber">58</context>
1832 </context-group> 1726 </context-group>
1833 </trans-unit> 1727 </trans-unit>
1834 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1728 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1835 <source>Publish</source> 1729 <source>Publish</source>
1836 <target>Eldoni</target> 1730 <target>Eldoni</target>
1837 <context-group name="null"> 1731 <context-group name="null">
1838 <context context-type="linenumber">55</context> 1732 <context context-type="linenumber">65</context>
1839 </context-group> 1733 </context-group>
1840 </trans-unit> 1734 </trans-unit>
1841 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 1735 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -1867,7 +1761,7 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1867 Gratulon; la filmo enportiÄos per « BitTorrent »! Vi jam povas aldoni informojn pri Äi. 1761 Gratulon; la filmo enportiÄos per « BitTorrent »! Vi jam povas aldoni informojn pri Äi.
1868</target> 1762</target>
1869 <context-group name="null"> 1763 <context-group name="null">
1870 <context context-type="linenumber">48</context> 1764 <context context-type="linenumber">53</context>
1871 </context-group> 1765 </context-group>
1872 </trans-unit> 1766 </trans-unit>
1873 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 1767 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -1979,14 +1873,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1979 <source>Wait transcoding before publishing the video</source> 1873 <source>Wait transcoding before publishing the video</source>
1980 <target>Atendi transkodadon antaÅ­ publikigi la filmon</target> 1874 <target>Atendi transkodadon antaÅ­ publikigi la filmon</target>
1981 <context-group name="null"> 1875 <context-group name="null">
1982 <context context-type="linenumber">130</context> 1876 <context context-type="linenumber">131</context>
1983 </context-group> 1877 </context-group>
1984 </trans-unit> 1878 </trans-unit>
1985 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 1879 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
1986 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 1880 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
1987 <target>Se vi decidos ne atendi finon de transkodado antaÅ­ publikigo, Äi povus esti neludebla Äis la transkodo finiÄos.</target> 1881 <target>Se vi decidos ne atendi finon de transkodado antaÅ­ publikigo, Äi povus esti neludebla Äis la transkodo finiÄos.</target>
1988 <context-group name="null"> 1882 <context-group name="null">
1989 <context context-type="linenumber">131</context> 1883 <context context-type="linenumber">132</context>
1990 </context-group> 1884 </context-group>
1991 </trans-unit> 1885 </trans-unit>
1992 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 1886 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2000,49 +1894,49 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2000 <source>Add another caption</source> 1894 <source>Add another caption</source>
2001 <target>Aldoni alian transskribon</target> 1895 <target>Aldoni alian transskribon</target>
2002 <context-group name="null"> 1896 <context-group name="null">
2003 <context context-type="linenumber">146</context> 1897 <context context-type="linenumber">147</context>
2004 </context-group> 1898 </context-group>
2005 </trans-unit> 1899 </trans-unit>
2006 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 1900 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2007 <source>See the subtitle file</source> 1901 <source>See the subtitle file</source>
2008 <target>Rigardi la dosieron kun subtekstoj</target> 1902 <target>Rigardi la dosieron kun subtekstoj</target>
2009 <context-group name="null"> 1903 <context-group name="null">
2010 <context context-type="linenumber">155</context> 1904 <context context-type="linenumber">156</context>
2011 </context-group> 1905 </context-group>
2012 </trans-unit> 1906 </trans-unit>
2013 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 1907 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2014 <source>Cancel create</source> 1908 <source>Cancel create</source>
2015 <target>Nuligi kreon</target> 1909 <target>Nuligi kreon</target>
2016 <context-group name="null"> 1910 <context-group name="null">
2017 <context context-type="linenumber">169</context> 1911 <context context-type="linenumber">170</context>
2018 </context-group> 1912 </context-group>
2019 </trans-unit> 1913 </trans-unit>
2020 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 1914 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2021 <source>Cancel deletion</source> 1915 <source>Cancel deletion</source>
2022 <target>Nuligi forigon</target> 1916 <target>Nuligi forigon</target>
2023 <context-group name="null"> 1917 <context-group name="null">
2024 <context context-type="linenumber">177</context> 1918 <context context-type="linenumber">178</context>
2025 </context-group> 1919 </context-group>
2026 </trans-unit> 1920 </trans-unit>
2027 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 1921 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2028 <source>Captions</source> 1922 <source>Captions</source>
2029 <target>Transskriboj</target> 1923 <target>Transskriboj</target>
2030 <context-group name="null"> 1924 <context-group name="null">
2031 <context context-type="linenumber">139</context> 1925 <context context-type="linenumber">140</context>
2032 </context-group> 1926 </context-group>
2033 </trans-unit> 1927 </trans-unit>
2034 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 1928 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2035 <source>Upload thumbnail</source> 1929 <source>Upload thumbnail</source>
2036 <target>AlÅuti miniaturon</target> 1930 <target>AlÅuti miniaturon</target>
2037 <context-group name="null"> 1931 <context-group name="null">
2038 <context context-type="linenumber">195</context> 1932 <context context-type="linenumber">196</context>
2039 </context-group> 1933 </context-group>
2040 </trans-unit> 1934 </trans-unit>
2041 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 1935 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2042 <source>Upload preview</source> 1936 <source>Upload preview</source>
2043 <target>AlÅuti antaÅ­rigardon</target> 1937 <target>AlÅuti antaÅ­rigardon</target>
2044 <context-group name="null"> 1938 <context-group name="null">
2045 <context context-type="linenumber">202</context> 1939 <context context-type="linenumber">203</context>
2046 </context-group> 1940 </context-group>
2047 </trans-unit> 1941 </trans-unit>
2048 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1942 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2056,14 +1950,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2056 <source>Short text to tell people how they can support you (membership platform...).</source> 1950 <source>Short text to tell people how they can support you (membership platform...).</source>
2057 <target>Mallonga teksto por sciigi homojn, kiel ili povas subteni vin.</target> 1951 <target>Mallonga teksto por sciigi homojn, kiel ili povas subteni vin.</target>
2058 <context-group name="null"> 1952 <context-group name="null">
2059 <context context-type="linenumber">209</context> 1953 <context context-type="linenumber">210</context>
2060 </context-group> 1954 </context-group>
2061 </trans-unit> 1955 </trans-unit>
2062 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 1956 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2063 <source>Advanced settings</source> 1957 <source>Advanced settings</source>
2064 <target>Specialaj agordoj</target> 1958 <target>Specialaj agordoj</target>
2065 <context-group name="null"> 1959 <context-group name="null">
2066 <context context-type="linenumber">190</context> 1960 <context context-type="linenumber">191</context>
2067 </context-group> 1961 </context-group>
2068 </trans-unit> 1962 </trans-unit>
2069 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 1963 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2239,13 +2133,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2239 <context context-type="linenumber">123</context> 2133 <context context-type="linenumber">123</context>
2240 </context-group> 2134 </context-group>
2241 </trans-unit> 2135 </trans-unit>
2242 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2243 <source>Go to the account page</source>
2244 <target>Iri al paÄo de la konto</target>
2245 <context-group name="null">
2246 <context context-type="linenumber">133</context>
2247 </context-group>
2248 </trans-unit>
2249 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 2136 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2250 <source>Show more</source> 2137 <source>Show more</source>
2251 <target>Montri pli</target> 2138 <target>Montri pli</target>
@@ -2296,25 +2183,18 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2296 <context context-type="linenumber">3</context> 2183 <context context-type="linenumber">3</context>
2297 </context-group> 2184 </context-group>
2298 </trans-unit> 2185 </trans-unit>
2299 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
2300 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
2301 <target>Vi povas komenti aÅ­ sur la paÄo de via nodo, kie tiu ĉi filmo estas federata kun via konto ĉe PeerTube, aÅ­ per iu ajn nodo en fediverso, subtenanta protokolon « ActivityPub ». Ekzemple, en Mastodon aÅ­ Pleroma vi povas tajpi en serĉujon « &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; » kaj retrovi la filmon. Rektaj ebloj komenti estas prilaborataj en &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
2302 <context-group name="null">
2303 <context context-type="linenumber">8</context>
2304 </context-group>
2305 </trans-unit>
2306 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 2186 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
2307 <source>No comments.</source> 2187 <source>No comments.</source>
2308 <target>Neniuj komentoj.</target> 2188 <target>Neniuj komentoj.</target>
2309 <context-group name="null"> 2189 <context-group name="null">
2310 <context context-type="linenumber">18</context> 2190 <context context-type="linenumber">17</context>
2311 </context-group> 2191 </context-group>
2312 </trans-unit> 2192 </trans-unit>
2313 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 2193 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2314 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 2194 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2315 <target>Montri ĉiujn <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respondojn</target> 2195 <target>Montri ĉiujn <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respondojn</target>
2316 <context-group name="null"> 2196 <context-group name="null">
2317 <context context-type="linenumber">55</context> 2197 <context context-type="linenumber">54</context>
2318 </context-group> 2198 </context-group>
2319 </trans-unit> 2199 </trans-unit>
2320 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 2200 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2325,7 +2205,7 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2325 Komentoj estas malÅaltitaj. 2205 Komentoj estas malÅaltitaj.
2326 </target> 2206 </target>
2327 <context-group name="null"> 2207 <context-group name="null">
2328 <context context-type="linenumber">64</context> 2208 <context context-type="linenumber">63</context>
2329 </context-group> 2209 </context-group>
2330 </trans-unit> 2210 </trans-unit>
2331 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 2211 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -2360,13 +2240,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2360 <context context-type="linenumber">14</context> 2240 <context context-type="linenumber">14</context>
2361 </context-group> 2241 </context-group>
2362 </trans-unit> 2242 </trans-unit>
2363 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2364 <source>Error getting about from server</source>
2365 <target>Eraro ricevante prion de la servilo</target>
2366 <context-group name="null">
2367 <context context-type="linenumber">1</context>
2368 </context-group>
2369 </trans-unit>
2370 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2243 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2371 <source>No description</source> 2244 <source>No description</source>
2372 <target>Neniu priskribo</target> 2245 <target>Neniu priskribo</target>
@@ -2388,55 +2261,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2388 <context context-type="linenumber">1</context> 2261 <context context-type="linenumber">1</context>
2389 </context-group> 2262 </context-group>
2390 </trans-unit> 2263 </trans-unit>
2391 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2392 <source>Error</source>
2393 <target>Eraro</target>
2394 <context-group name="null">
2395 <context context-type="linenumber">1</context>
2396 </context-group>
2397 </trans-unit>
2398 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
2399 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
2400 <target>Vi agordis propran <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
2401 <context-group name="null">
2402 <context context-type="linenumber">1</context>
2403 </context-group>
2404 </trans-unit>
2405 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
2406 <source>This could lead to security issues or bugs if you do not understand it. </source>
2407 <target>Tio ĉi povas estigi sekurecajn problemojn aÅ­ erarojn, se vi ne komprenas Äin.</target>
2408 <context-group name="null">
2409 <context context-type="linenumber">1</context>
2410 </context-group>
2411 </trans-unit>
2412 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
2413 <source>Are you sure you want to update the configuration?</source>
2414 <target>Ĉu vi certe volas Äisdatigi la agordon?</target>
2415 <context-group name="null">
2416 <context context-type="linenumber">1</context>
2417 </context-group>
2418 </trans-unit>
2419 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
2420 <source>Please type</source>
2421 <target>Bonvolu tajpi</target>
2422 <context-group name="null">
2423 <context context-type="linenumber">1</context>
2424 </context-group>
2425 </trans-unit>
2426 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
2427 <source>to confirm.</source>
2428 <target>por konfirmi.</target>
2429 <context-group name="null">
2430 <context context-type="linenumber">1</context>
2431 </context-group>
2432 </trans-unit>
2433 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2434 <source>Success</source>
2435 <target>Sukceso</target>
2436 <context-group name="null">
2437 <context context-type="linenumber">1</context>
2438 </context-group>
2439 </trans-unit>
2440 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2264 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2441 <source>Configuration updated.</source> 2265 <source>Configuration updated.</source>
2442 <target>Agordo Äisdatigita</target> 2266 <target>Agordo Äisdatigita</target>
@@ -2549,13 +2373,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2549 <context context-type="linenumber">1</context> 2373 <context context-type="linenumber">1</context>
2550 </context-group> 2374 </context-group>
2551 </trans-unit> 2375 </trans-unit>
2552 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
2553 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
2554 <target>Uzanto <x id="INTERPOLATION" equiv-text="{{username}}"/> forigita.</target>
2555 <context-group name="null">
2556 <context context-type="linenumber">1</context>
2557 </context-group>
2558 </trans-unit>
2559 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc"> 2376 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
2560 <source>Password updated.</source> 2377 <source>Password updated.</source>
2561 <target>Pasvorto Äisdatigita.</target> 2378 <target>Pasvorto Äisdatigita.</target>
@@ -2633,23 +2450,16 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2633 <context context-type="linenumber">1</context> 2450 <context context-type="linenumber">1</context>
2634 </context-group> 2451 </context-group>
2635 </trans-unit> 2452 </trans-unit>
2636 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2453 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2637 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2454 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2638 <target>Ĉu vi certe volas forigi kanalon <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Tiel vi ankaÅ­ forigos ĉiujn filmojn alÅutitajn al tiu ĉi kanalo.</target> 2455 <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target>
2639 <context-group name="null">
2640 <context context-type="linenumber">1</context>
2641 </context-group>
2642 </trans-unit>
2643 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2644 <source>Please type the name of the video channel to confirm</source>
2645 <target>Bonvolu tajpi nomon de la filma kanalo por konfirmi</target>
2646 <context-group name="null"> 2456 <context-group name="null">
2647 <context context-type="linenumber">1</context> 2457 <context context-type="linenumber">1</context>
2648 </context-group> 2458 </context-group>
2649 </trans-unit> 2459 </trans-unit>
2650 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2460 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2651 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2461 <source>My videos</source>
2652 <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target> 2462 <target>Miaj filmoj</target>
2653 <context-group name="null"> 2463 <context-group name="null">
2654 <context context-type="linenumber">1</context> 2464 <context context-type="linenumber">1</context>
2655 </context-group> 2465 </context-group>
@@ -2710,6 +2520,27 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2710 <context context-type="linenumber">1</context> 2520 <context context-type="linenumber">1</context>
2711 </context-group> 2521 </context-group>
2712 </trans-unit> 2522 </trans-unit>
2523 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2524 <source>My channels</source>
2525 <target>Miaj kanaloj</target>
2526 <context-group name="null">
2527 <context context-type="linenumber">1</context>
2528 </context-group>
2529 </trans-unit>
2530 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2531 <source>My subscriptions</source>
2532 <target>Miaj abonoj</target>
2533 <context-group name="null">
2534 <context context-type="linenumber">1</context>
2535 </context-group>
2536 </trans-unit>
2537 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2538 <source>My settings</source>
2539 <target>Miaj agordoj</target>
2540 <context-group name="null">
2541 <context context-type="linenumber">1</context>
2542 </context-group>
2543 </trans-unit>
2713 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2544 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2714 <source>Unable to find user id or verification string.</source> 2545 <source>Unable to find user id or verification string.</source>
2715 <target>Ne povas trovi identigilon aŭ kontrolan ĉenon de uzanto</target> 2546 <target>Ne povas trovi identigilon aŭ kontrolan ĉenon de uzanto</target>
@@ -2733,6 +2564,13 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2733 <context context-type="linenumber">1</context> 2564 <context context-type="linenumber">1</context>
2734 </context-group> 2565 </context-group>
2735 </trans-unit> 2566 </trans-unit>
2567 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2568 <source>Error</source>
2569 <target>Eraro</target>
2570 <context-group name="null">
2571 <context context-type="linenumber">1</context>
2572 </context-group>
2573 </trans-unit>
2736 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2574 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2737 <source>You need to reconnect.</source> 2575 <source>You need to reconnect.</source>
2738 <target>Vi devas rekonektiÄi</target> 2576 <target>Vi devas rekonektiÄi</target>
@@ -2747,6 +2585,20 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2747 <context context-type="linenumber">1</context> 2585 <context context-type="linenumber">1</context>
2748 </context-group> 2586 </context-group>
2749 </trans-unit> 2587 </trans-unit>
2588 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2589 <source>Info</source>
2590 <target>Informoj</target>
2591 <context-group name="null">
2592 <context context-type="linenumber">1</context>
2593 </context-group>
2594 </trans-unit>
2595 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2596 <source>Success</source>
2597 <target>Sukceso</target>
2598 <context-group name="null">
2599 <context context-type="linenumber">1</context>
2600 </context-group>
2601 </trans-unit>
2750 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1"> 2602 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
2751 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source> 2603 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
2752 <target>Retletero kun instrukcioj por restarigi la pasvorton sendiÄos al <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target> 2604 <target>Retletero kun instrukcioj por restarigi la pasvorton sendiÄos al <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
@@ -2943,6 +2795,20 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2943 <context context-type="linenumber">1</context> 2795 <context context-type="linenumber">1</context>
2944 </context-group> 2796 </context-group>
2945 </trans-unit> 2797 </trans-unit>
2798 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2799 <source>Email is required.</source>
2800 <target>Necesas retpoÅtadreso.</target>
2801 <context-group name="null">
2802 <context context-type="linenumber">1</context>
2803 </context-group>
2804 </trans-unit>
2805 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2806 <source>Email must be valid.</source>
2807 <target>RetpoÅtadreso devas esti valida.</target>
2808 <context-group name="null">
2809 <context context-type="linenumber">1</context>
2810 </context-group>
2811 </trans-unit>
2946 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2812 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2947 <source>Username is required.</source> 2813 <source>Username is required.</source>
2948 <target>Necesas salutnomo.</target> 2814 <target>Necesas salutnomo.</target>
@@ -2964,41 +2830,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2964 <context context-type="linenumber">1</context> 2830 <context context-type="linenumber">1</context>
2965 </context-group> 2831 </context-group>
2966 </trans-unit> 2832 </trans-unit>
2967 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2968 <source>Username must be at least 3 characters long.</source>
2969 <target>Salutnomo devas havi almenaÅ­ 3 signojn.</target>
2970 <context-group name="null">
2971 <context context-type="linenumber">1</context>
2972 </context-group>
2973 </trans-unit>
2974 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2975 <source>Username cannot be more than 20 characters long.</source>
2976 <target>Salutnomo ne povas havi pli ol 20 signojn.</target>
2977 <context-group name="null">
2978 <context context-type="linenumber">1</context>
2979 </context-group>
2980 </trans-unit>
2981 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2982 <source>Username should be only lowercase alphanumeric characters.</source>
2983 <target>Salutnomo havu nur ciferojn kaj minusklajn literojn.</target>
2984 <context-group name="null">
2985 <context context-type="linenumber">1</context>
2986 </context-group>
2987 </trans-unit>
2988 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2989 <source>Email is required.</source>
2990 <target>Necesas retpoÅtadreso.</target>
2991 <context-group name="null">
2992 <context context-type="linenumber">1</context>
2993 </context-group>
2994 </trans-unit>
2995 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2996 <source>Email must be valid.</source>
2997 <target>RetpoÅtadreso devas esti valida.</target>
2998 <context-group name="null">
2999 <context context-type="linenumber">1</context>
3000 </context-group>
3001 </trans-unit>
3002 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2833 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3003 <source>Password must be at least 6 characters long.</source> 2834 <source>Password must be at least 6 characters long.</source>
3004 <target>Pasvorto devas havi almenaÅ­ 6 signojn.</target> 2835 <target>Pasvorto devas havi almenaÅ­ 6 signojn.</target>
@@ -3048,20 +2879,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3048 <context context-type="linenumber">1</context> 2879 <context context-type="linenumber">1</context>
3049 </context-group> 2880 </context-group>
3050 </trans-unit> 2881 </trans-unit>
3051 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3052 <source>Display name must be at least 3 characters long.</source>
3053 <target>Prezenta nomo devas havi almenaÅ­ 3 signojn.</target>
3054 <context-group name="null">
3055 <context context-type="linenumber">1</context>
3056 </context-group>
3057 </trans-unit>
3058 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3059 <source>Display name cannot be more than 120 characters long.</source>
3060 <target>Prezenta nomo ne povas havi pli ol 120 signojn.</target>
3061 <context-group name="null">
3062 <context context-type="linenumber">1</context>
3063 </context-group>
3064 </trans-unit>
3065 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 2882 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3066 <source>Description must be at least 3 characters long.</source> 2883 <source>Description must be at least 3 characters long.</source>
3067 <target>Priskribo havu almenaÅ­ 3 signojn.</target> 2884 <target>Priskribo havu almenaÅ­ 3 signojn.</target>
@@ -3069,13 +2886,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3069 <context context-type="linenumber">1</context> 2886 <context context-type="linenumber">1</context>
3070 </context-group> 2887 </context-group>
3071 </trans-unit> 2888 </trans-unit>
3072 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
3073 <source>Description cannot be more than 250 characters long.</source>
3074 <target>Priskribo ne povas havi pli ol 250 signojn.</target>
3075 <context-group name="null">
3076 <context context-type="linenumber">1</context>
3077 </context-group>
3078 </trans-unit>
3079 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561"> 2889 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
3080 <source>You must to agree with the instance terms in order to registering on it.</source> 2890 <source>You must to agree with the instance terms in order to registering on it.</source>
3081 <target>Vi devas konsenti kun la kondiĉoj de la nodo por registriÄi ĉe Äi.</target> 2891 <target>Vi devas konsenti kun la kondiĉoj de la nodo por registriÄi ĉe Äi.</target>
@@ -3097,13 +2907,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3097 <context context-type="linenumber">1</context> 2907 <context context-type="linenumber">1</context>
3098 </context-group> 2908 </context-group>
3099 </trans-unit> 2909 </trans-unit>
3100 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3101 <source>Report reason cannot be more than 300 characters long.</source>
3102 <target>Kialo de raporto maldevas havi pli ol 300 signojn.</target>
3103 <context-group name="null">
3104 <context context-type="linenumber">1</context>
3105 </context-group>
3106 </trans-unit>
3107 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e"> 2910 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
3108 <source>Video caption language is required.</source> 2911 <source>Video caption language is required.</source>
3109 <target>Necesas lingvo de filma transskribo.</target> 2912 <target>Necesas lingvo de filma transskribo.</target>
@@ -3118,13 +2921,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3118 <context context-type="linenumber">1</context> 2921 <context context-type="linenumber">1</context>
3119 </context-group> 2922 </context-group>
3120 </trans-unit> 2923 </trans-unit>
3121 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
3122 <source>Description cannot be more than 500 characters long.</source>
3123 <target>Priskribo ne povas havi pli ol 500 signojn.</target>
3124 <context-group name="null">
3125 <context context-type="linenumber">1</context>
3126 </context-group>
3127 </trans-unit>
3128 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 2924 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
3129 <source>Support text must be at least 3 characters long.</source> 2925 <source>Support text must be at least 3 characters long.</source>
3130 <target>Teksto pri subteno devas havi almenaÅ­ 3 signojn.</target> 2926 <target>Teksto pri subteno devas havi almenaÅ­ 3 signojn.</target>
@@ -3132,13 +2928,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3132 <context context-type="linenumber">1</context> 2928 <context context-type="linenumber">1</context>
3133 </context-group> 2929 </context-group>
3134 </trans-unit> 2930 </trans-unit>
3135 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813">
3136 <source>Support text cannot be more than 500 characters long.</source>
3137 <target>Teksto pri subteno ne povas havi pli ol 500 signojn.</target>
3138 <context-group name="null">
3139 <context context-type="linenumber">1</context>
3140 </context-group>
3141 </trans-unit>
3142 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 2931 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
3143 <source>Comment is required.</source> 2932 <source>Comment is required.</source>
3144 <target>Necesas komento.</target> 2933 <target>Necesas komento.</target>
@@ -3230,13 +3019,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3230 <context context-type="linenumber">1</context> 3019 <context context-type="linenumber">1</context>
3231 </context-group> 3020 </context-group>
3232 </trans-unit> 3021 </trans-unit>
3233 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b">
3234 <source>Video support cannot be more than 500 characters long.</source>
3235 <target>Loka teksto pri subteno ne povas havi pli ol 500 signojn.</target>
3236 <context-group name="null">
3237 <context context-type="linenumber">1</context>
3238 </context-group>
3239 </trans-unit>
3240 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 3022 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
3241 <source>A date is required to schedule video update.</source> 3023 <source>A date is required to schedule video update.</source>
3242 <target>Necesas dato por plani Äisdatigon de filmo.</target> 3024 <target>Necesas dato por plani Äisdatigon de filmo.</target>
@@ -3741,6 +3523,13 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3741 <context context-type="linenumber">1</context> 3523 <context context-type="linenumber">1</context>
3742 </context-group> 3524 </context-group>
3743 </trans-unit> 3525 </trans-unit>
3526 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
3527 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
3528 <target>Uzanto <x id="INTERPOLATION" equiv-text="{{username}}"/> forigita.</target>
3529 <context-group name="null">
3530 <context context-type="linenumber">1</context>
3531 </context-group>
3532 </trans-unit>
3744 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 3533 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
3745 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 3534 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
3746 <target>Peto estas tro granda por la servilo. Bonvolu kontakti vian administranton se vi volas pligrandigi la limon.</target> 3535 <target>Peto estas tro granda por la servilo. Bonvolu kontakti vian administranton se vi volas pligrandigi la limon.</target>
@@ -3769,13 +3558,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3769 <context context-type="linenumber">1</context> 3558 <context context-type="linenumber">1</context>
3770 </context-group> 3559 </context-group>
3771 </trans-unit> 3560 </trans-unit>
3772 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
3773 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
3774 <target>RegistriÄo de <x id="INTERPOLATION" equiv-text="{{username}}"/> finita.</target>
3775 <context-group name="null">
3776 <context context-type="linenumber">1</context>
3777 </context-group>
3778 </trans-unit>
3779 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c"> 3561 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c">
3780 <source>Your video was uploaded to your account and is private.</source> 3562 <source>Your video was uploaded to your account and is private.</source>
3781 <target>Via filmo alÅutiÄis al via konto kaj estas privata.</target> 3563 <target>Via filmo alÅutiÄis al via konto kaj estas privata.</target>
@@ -3797,13 +3579,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3797 <context context-type="linenumber">1</context> 3579 <context context-type="linenumber">1</context>
3798 </context-group> 3580 </context-group>
3799 </trans-unit> 3581 </trans-unit>
3800 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3801 <source>Info</source>
3802 <target>Informoj</target>
3803 <context-group name="null">
3804 <context context-type="linenumber">1</context>
3805 </context-group>
3806 </trans-unit>
3807 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3582 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3808 <source>Upload cancelled</source> 3583 <source>Upload cancelled</source>
3809 <target>AlÅuto nuligita.</target> 3584 <target>AlÅuto nuligita.</target>
@@ -3811,13 +3586,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3811 <context context-type="linenumber">1</context> 3586 <context context-type="linenumber">1</context>
3812 </context-group> 3587 </context-group>
3813 </trans-unit> 3588 </trans-unit>
3814 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
3815 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
3816 <target>Pardonu nin, sed PeerTube ne kapablas trakti filmojn super 8GB</target>
3817 <context-group name="null">
3818 <context context-type="linenumber">1</context>
3819 </context-group>
3820 </trans-unit>
3821 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce"> 3589 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
3822 <source>Video published.</source> 3590 <source>Video published.</source>
3823 <target>Filmo publikigita.</target> 3591 <target>Filmo publikigita.</target>
diff --git a/client/src/locale/target/angular_es_ES.xml b/client/src/locale/target/angular_es_ES.xml
index 1c64ac9a9..828de2a57 100644
--- a/client/src/locale/target/angular_es_ES.xml
+++ b/client/src/locale/target/angular_es_ES.xml
@@ -3,6 +3,223 @@
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1"> 3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="es-ES"> 4 <file source-language="en-US" datatype="plaintext" original="" target-language="es-ES">
5 <body> 5 <body>
6 <trans-unit id="ngb.alert.close">
7 <source>Close</source>
8 <target>tppCerrar</target>
9 <context-group name="null">
10 <context context-type="linenumber">2</context>
11 </context-group>
12 </trans-unit>
13 <trans-unit id="ngb.carousel.previous">
14 <source>Previous</source>
15 <target>Anterior</target>
16 <context-group name="null">
17 <context context-type="linenumber">13</context>
18 </context-group>
19 </trans-unit>
20 <trans-unit id="ngb.carousel.next">
21 <source>Next</source>
22 <target>Siguiente</target>
23 <context-group name="null">
24 <context context-type="linenumber">17</context>
25 </context-group>
26 </trans-unit>
27 <trans-unit id="ngb.datepicker.previous-month">
28 <source>Previous month</source>
29 <target>Último mes</target>
30 <context-group name="null">
31 <context context-type="linenumber">5</context>
32 </context-group>
33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source>
36 <target>Próximo mes</target>
37 <context-group name="null">
38 <context context-type="linenumber">27</context>
39 </context-group>
40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Seleccionar un mes</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Seleccionar un año</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source>
57 <target>««</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context>
60 </context-group>
61 </trans-unit>
62 <trans-unit id="ngb.pagination.first-aria">
63 <source>First</source>
64 <target>Primero</target>
65 <context-group name="null">
66 <context context-type="linenumber">5</context>
67 </context-group>
68 </trans-unit>
69 <trans-unit id="ngb.pagination.previous">
70 <source>«</source>
71 <target>«</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context>
74 </context-group>
75 </trans-unit>
76 <trans-unit id="ngb.pagination.previous-aria">
77 <source>Previous</source>
78 <target>Anterior</target>
79 <context-group name="null">
80 <context context-type="linenumber">13</context>
81 </context-group>
82 </trans-unit>
83 <trans-unit id="ngb.pagination.next">
84 <source>»</source>
85 <target>»</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context>
88 </context-group>
89 </trans-unit>
90 <trans-unit id="ngb.pagination.next-aria">
91 <source>Next</source>
92 <target>Siguiente</target>
93 <context-group name="null">
94 <context context-type="linenumber">27</context>
95 </context-group>
96 </trans-unit>
97 <trans-unit id="ngb.pagination.last">
98 <source>»»</source>
99 <target>»»</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context>
102 </context-group>
103 </trans-unit>
104 <trans-unit id="ngb.pagination.last-aria">
105 <source>Last</source>
106 <target>Último</target>
107 <context-group name="null">
108 <context context-type="linenumber">34</context>
109 </context-group>
110 </trans-unit>
111 <trans-unit id="ngb.progressbar.value">
112 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
113 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
114 <context-group name="null">
115 <context context-type="linenumber">6</context>
116 </context-group>
117 </trans-unit>
118 <trans-unit id="ngb.timepicker.increment-hours">
119 <source>Increment hours</source>
120 <target>Aumentar horas</target>
121 <context-group name="null">
122 <context context-type="linenumber">9</context>
123 </context-group>
124 </trans-unit>
125 <trans-unit id="ngb.timepicker.HH">
126 <source>HH</source>
127 <target>h</target>
128 <context-group name="null">
129 <context context-type="linenumber">12</context>
130 </context-group>
131 </trans-unit>
132 <trans-unit id="ngb.timepicker.hours">
133 <source>Hours</source>
134 <target>horas</target>
135 <context-group name="null">
136 <context context-type="linenumber">14</context>
137 </context-group>
138 </trans-unit>
139 <trans-unit id="ngb.timepicker.decrement-hours">
140 <source>Decrement hours</source>
141 <target>Disminuir horas</target>
142 <context-group name="null">
143 <context context-type="linenumber">19</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="ngb.timepicker.increment-minutes">
147 <source>Increment minutes</source>
148 <target>Aumentar minutos</target>
149 <context-group name="null">
150 <context context-type="linenumber">28</context>
151 </context-group>
152 </trans-unit>
153 <trans-unit id="ngb.timepicker.MM">
154 <source>MM</source>
155 <target>m</target>
156 <context-group name="null">
157 <context context-type="linenumber">31</context>
158 </context-group>
159 </trans-unit>
160 <trans-unit id="ngb.timepicker.minutes">
161 <source>Minutes</source>
162 <target>minutos</target>
163 <context-group name="null">
164 <context context-type="linenumber">33</context>
165 </context-group>
166 </trans-unit>
167 <trans-unit id="ngb.timepicker.decrement-minutes">
168 <source>Decrement minutes</source>
169 <target>minutos</target>
170 <context-group name="null">
171 <context context-type="linenumber">38</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="ngb.timepicker.increment-seconds">
175 <source>Increment seconds</source>
176 <target>aumentar segundos</target>
177 <context-group name="null">
178 <context context-type="linenumber">47</context>
179 </context-group>
180 </trans-unit>
181 <trans-unit id="ngb.timepicker.SS">
182 <source>SS</source>
183 <target>s</target>
184 <context-group name="null">
185 <context context-type="linenumber">50</context>
186 </context-group>
187 </trans-unit>
188 <trans-unit id="ngb.timepicker.seconds">
189 <source>Seconds</source>
190 <target>segundos</target>
191 <context-group name="null">
192 <context context-type="linenumber">52</context>
193 </context-group>
194 </trans-unit>
195 <trans-unit id="ngb.timepicker.decrement-seconds">
196 <source>Decrement seconds</source>
197 <target>disminuir segundos</target>
198 <context-group name="null">
199 <context context-type="linenumber">57</context>
200 </context-group>
201 </trans-unit>
202 <trans-unit id="ngb.timepicker.PM">
203 <source>PM</source>
204 <target>pm</target>
205 <context-group name="null">
206 <context context-type="linenumber">65</context>
207 </context-group>
208 </trans-unit>
209 <trans-unit id="ngb.timepicker.AM">
210 <source>AM</source>
211 <target>am</target>
212 <context-group name="null">
213 <context context-type="linenumber">66</context>
214 </context-group>
215 </trans-unit>
216 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
217 <source>Cancel</source>
218 <target>cancelar</target>
219 <context-group name="null">
220 <context context-type="linenumber">10</context>
221 </context-group>
222 </trans-unit>
6 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46"> 223 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
7 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source> 224 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source>
8 <target>(extensioness: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, tamaño máximo: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target> 225 <target>(extensioness: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, tamaño máximo: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target>
@@ -10,11 +227,174 @@
10 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
11 </context-group> 228 </context-group>
12 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>No tiene notificaciones</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> ha publicado un <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nuevo vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
249 <source>
250 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been unblacklisted
251 </source>
252 <target>
253 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido desbloqueado
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">11</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been blacklisted
262 </source>
263 <target>
264 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido bloqueado
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">15</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
271 <source>
272 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
273 </source>
274 <target>
275 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Una nueva denuncia de abuso<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido creada sobre el vídeo <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">19</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
282 <source>
283 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
284 </source>
285 <target>
286 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> ha comentado su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
287 </target>
288 <context-group name="null">
289 <context context-type="linenumber">23</context>
290 </context-group>
291 </trans-unit>
292 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
293 <source>
294 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
295 </source>
296 <target>
297 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido publicado
298 </target>
299 <context-group name="null">
300 <context context-type="linenumber">27</context>
301 </context-group>
302 </trans-unit>
303 <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
304 <source>
305 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
306 </source>
307 <target>
308 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> exitosa
309 </target>
310 <context-group name="null">
311 <context context-type="linenumber">31</context>
312 </context-group>
313 </trans-unit>
314 <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
315 <source>
316 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
317 </source>
318 <target>
319 Error durante la <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/>
320 </target>
321 <context-group name="null">
322 <context context-type="linenumber">35</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
326 <source>
327 User <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> on your instance
328 </source>
329 <target>
330 Nuevo usuario <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/>registrado<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> en su instancia
331 </target>
332 <context-group name="null">
333 <context context-type="linenumber">39</context>
334 </context-group>
335 </trans-unit>
336 <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
337 <source>
338 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> is following
339
340 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
341 your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
342 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
343 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
344 </source>
345 <target>
346 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ahora sigue
347
348 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
349 su canal <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
350 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
351 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>su cuenta<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
352 </target>
353 <context-group name="null">
354 <context context-type="linenumber">43</context>
355 </context-group>
356 </trans-unit>
357 <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
358 <source>
359 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
360 </source>
361 <target>
362 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> le ha mencionado en el <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>vídeo <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
363 </target>
364 <context-group name="null">
365 <context context-type="linenumber">52</context>
366 </context-group>
367 </trans-unit>
368 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
369 <source>
370 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
371 </source>
372 <target>
373 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
374 </target>
375 <context-group name="null">
376 <context context-type="linenumber">57</context>
377 </context-group>
378 </trans-unit>
379 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
380 <source>Unlisted</source>
381 <target>No listado</target>
382 <context-group name="null">
383 <context context-type="linenumber">10</context>
384 </context-group>
385 </trans-unit>
386 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
387 <source>Private</source>
388 <target>Privado</target>
389 <context-group name="null">
390 <context context-type="linenumber">11</context>
391 </context-group>
392 </trans-unit>
13 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 393 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
14 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 394 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
15 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizaciones</target> 395 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizaciones</target>
16 <context-group name="null"> 396 <context-group name="null">
17 <context context-type="linenumber">13</context> 397 <context context-type="linenumber">16</context>
18 </context-group> 398 </context-group>
19 </trans-unit> 399 </trans-unit>
20 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 400 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -28,7 +408,7 @@
28 <source>Edit</source> 408 <source>Edit</source>
29 <target>Modificar</target> 409 <target>Modificar</target>
30 <context-group name="null"> 410 <context-group name="null">
31 <context context-type="linenumber">5</context> 411 <context context-type="linenumber">1</context>
32 </context-group> 412 </context-group>
33 </trans-unit> 413 </trans-unit>
34 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 414 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -52,11 +432,161 @@
52 <context context-type="linenumber">19</context> 432 <context context-type="linenumber">19</context>
53 </context-group> 433 </context-group>
54 </trans-unit> 434 </trans-unit>
435 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
436 <source>
437 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
438 Subscribe
439 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
440 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
441 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
442 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
443 </source>
444 <target>
445 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
446 Suscribirse
447 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
448 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
449 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
450 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
451 </target>
452 <context-group name="null">
453 <context context-type="linenumber">5</context>
454 </context-group>
455 </trans-unit>
456 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
457 <source>
458 Unsubscribe
459 </source>
460 <target>
461Cancelar la subscripción</target>
462 <context-group name="null">
463 <context context-type="linenumber">18</context>
464 </context-group>
465 </trans-unit>
466 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
467 <source>Using an ActivityPub account</source>
468 <target>Usar una cuenta ActivityPub</target>
469 <context-group name="null">
470 <context context-type="linenumber">36</context>
471 </context-group>
472 </trans-unit>
473 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
474 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
475 <target>Suscribirse con una cuenta sobre <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
476 <context-group name="null">
477 <context context-type="linenumber">39</context>
478 </context-group>
479 </trans-unit>
480 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
481 <source>Subscribe with your local account</source>
482 <target>Suscribirse con su cuenta local</target>
483 <context-group name="null">
484 <context context-type="linenumber">40</context>
485 </context-group>
486 </trans-unit>
487 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
488 <source>Subscribe with a Mastodon account:</source>
489 <target>Suscribirse con una cuenta Mastodon:</target>
490 <context-group name="null">
491 <context context-type="linenumber">43</context>
492 </context-group>
493 </trans-unit>
494 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
495 <source>Using a syndication feed</source>
496 <target>Usar un flujo de sindicación</target>
497 <context-group name="null">
498 <context context-type="linenumber">48</context>
499 </context-group>
500 </trans-unit>
501 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
502 <source>Subscribe via RSS</source>
503 <target>Suscribirse vía RSS</target>
504 <context-group name="null">
505 <context context-type="linenumber">49</context>
506 </context-group>
507 </trans-unit>
508 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
509 <source>
510 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
511 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
512 </source>
513 <target>
514 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Suscripción remota<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
515 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Interacción remota<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
516 </target>
517 <context-group name="null">
518 <context context-type="linenumber">10</context>
519 </context-group>
520 </trans-unit>
521 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
522 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
523 <target>Puede suscribirse al canal usando cualquier instancia del fediverse compatible con ActivityPub. Por ejemplo con Mastodon o Pleroma puede ingresar el URL del canal en el campo de búsqueda y suscribirse allí.</target>
524 <context-group name="null">
525 <context context-type="linenumber">17</context>
526 </context-group>
527 </trans-unit>
528 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
529 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
530 <target>Puede interactuar con eso usando cualquier instancia del fediverse compatible con ActivityPub. Por ejemplo con Mastodon o Pleroma puedes ingresar el URL actual en el campo de búsqueda e interactuar con el desde allí.</target>
531 <context-group name="null">
532 <context context-type="linenumber">22</context>
533 </context-group>
534 </trans-unit>
55 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 535 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
56 <source>Video quota</source> 536 <source>Video quota</source>
57 <target>Cuota de vídeo</target> 537 <target>Cuota de vídeo</target>
58 <context-group name="null"> 538 <context-group name="null">
59 <context context-type="linenumber">19</context> 539 <context context-type="linenumber">42</context>
540 </context-group>
541 </trans-unit>
542 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
543 <source>
544 Unlimited <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per day)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
545 </source>
546 <target>
547 Illimitado <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> por día)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
548 </target>
549 <context-group name="null">
550 <context context-type="linenumber">14</context>
551 </context-group>
552 </trans-unit>
553 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
554 <source>Ban</source>
555 <target>Expulsar</target>
556 <context-group name="null">
557 <context context-type="linenumber">3</context>
558 </context-group>
559 </trans-unit>
560 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
561 <source>Reason...</source>
562 <target>Motivo...</target>
563 <context-group name="null">
564 <context context-type="linenumber">11</context>
565 </context-group>
566 </trans-unit>
567 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
568 <source>
569 A banned user will no longer be able to login.
570 </source>
571 <target>
572 Un usuario expulsado ya no podrá conectarse.
573 </target>
574 <context-group name="null">
575 <context context-type="linenumber">17</context>
576 </context-group>
577 </trans-unit>
578 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
579 <source>Ban this user</source>
580 <target>Expulsar este usuario</target>
581 <context-group name="null">
582 <context context-type="linenumber">25</context>
583 </context-group>
584 </trans-unit>
585 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
586 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
587 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
588 <context-group name="null">
589 <context context-type="linenumber">11</context>
60 </context-group> 590 </context-group>
61 </trans-unit> 591 </trans-unit>
62 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 592 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
@@ -69,6 +599,13 @@ Iniciar sesión</target>
69 <context context-type="linenumber">2</context> 599 <context context-type="linenumber">2</context>
70 </context-group> 600 </context-group>
71 </trans-unit> 601 </trans-unit>
602 <trans-unit id="ae3cb52bf2dee3101ee654812b5d16e8665a9453">
603 <source>Request new verification email.</source>
604 <target>Solicitar un nuevo correo de verificación.</target>
605 <context-group name="null">
606 <context context-type="linenumber">12</context>
607 </context-group>
608 </trans-unit>
72 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194"> 609 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
73 <source>User</source> 610 <source>User</source>
74 <target>Usuario</target> 611 <target>Usuario</target>
@@ -116,7 +653,7 @@ Iniciar sesión</target>
116 <source>Password</source> 653 <source>Password</source>
117 <target>Contraseña</target> 654 <target>Contraseña</target>
118 <context-group name="null"> 655 <context-group name="null">
119 <context context-type="linenumber">12</context> 656 <context context-type="linenumber">13</context>
120 </context-group> 657 </context-group>
121 </trans-unit> 658 </trans-unit>
122 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 659 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -130,7 +667,7 @@ Iniciar sesión</target>
130 <source>Login</source> 667 <source>Login</source>
131 <target>Identificarse</target> 668 <target>Identificarse</target>
132 <context-group name="null"> 669 <context-group name="null">
133 <context context-type="linenumber">38</context> 670 <context context-type="linenumber">36</context>
134 </context-group> 671 </context-group>
135 </trans-unit> 672 </trans-unit>
136 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 673 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -140,6 +677,17 @@ Iniciar sesión</target>
140 <context context-type="linenumber">57</context> 677 <context context-type="linenumber">57</context>
141 </context-group> 678 </context-group>
142 </trans-unit> 679 </trans-unit>
680 <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
681 <source>
682 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
683 </source>
684 <target>
685 Lo sentimos, no puede recuperar su contraseña porque el administrador de su instancia no configuró el sistema de correos electrónicos de PeerTube.
686 </target>
687 <context-group name="null">
688 <context context-type="linenumber">63</context>
689 </context-group>
690 </trans-unit>
143 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 691 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
144 <source>Email</source> 692 <source>Email</source>
145 <target>Correo electrónico </target> 693 <target>Correo electrónico </target>
@@ -158,7 +706,7 @@ Iniciar sesión</target>
158 <source>Send me an email to reset my password</source> 706 <source>Send me an email to reset my password</source>
159 <target>Enviar un correo electrónico para restablecer mi contraseña</target> 707 <target>Enviar un correo electrónico para restablecer mi contraseña</target>
160 <context-group name="null"> 708 <context-group name="null">
161 <context context-type="linenumber">75</context> 709 <context context-type="linenumber">80</context>
162 </context-group> 710 </context-group>
163 </trans-unit> 711 </trans-unit>
164 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 712 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -209,18 +757,32 @@ Iniciar sesión</target>
209 <context context-type="linenumber">8</context> 757 <context context-type="linenumber">8</context>
210 </context-group> 758 </context-group>
211 </trans-unit> 759 </trans-unit>
212 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 760 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
213 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 761 <source>Example: jane_doe</source>
214 <target>He leído y estoy de acuerdo con los &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Términos de uso&lt;/a&gt; de este nodo</target> 762 <target>Ejemplo: jane_doe</target>
215 <context-group name="null"> 763 <context-group name="null">
216 <context context-type="linenumber">54</context> 764 <context context-type="linenumber">17</context>
765 </context-group>
766 </trans-unit>
767 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
768 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
769 <target>Tengo 16 años o más y estoy de acuerdo con los &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Términos&lt;/a&gt; de esta instancia</target>
770 <context-group name="null">
771 <context context-type="linenumber">55</context>
217 </context-group> 772 </context-group>
218 </trans-unit> 773 </trans-unit>
219 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 774 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
220 <source>Signup</source> 775 <source>Signup</source>
221 <target>Registro</target> 776 <target>Registro</target>
222 <context-group name="null"> 777 <context-group name="null">
223 <context context-type="linenumber">88</context> 778 <context context-type="linenumber">78</context>
779 </context-group>
780 </trans-unit>
781 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
782 <source>Features found on this instance</source>
783 <target>Funcionalidades encontradas en esta instancia</target>
784 <context-group name="null">
785 <context context-type="linenumber">67</context>
224 </context-group> 786 </context-group>
225 </trans-unit> 787 </trans-unit>
226 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 788 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -241,9 +803,15 @@ Iniciar sesión</target>
241 <context context-type="linenumber">6</context> 803 <context context-type="linenumber">6</context>
242 </context-group> 804 </context-group>
243 </trans-unit> 805 </trans-unit>
244 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 806 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
245 <source>Filters</source> 807 <source>
246 <target>Filtros</target> 808 Filters
809 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
810 </source>
811 <target>
812 Filtros
813 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
814 </target>
247 <context-group name="null"> 815 <context-group name="null">
248 <context context-type="linenumber">16</context> 816 <context context-type="linenumber">16</context>
249 </context-group> 817 </context-group>
@@ -256,21 +824,90 @@ Iniciar sesión</target>
256 No hubo resultados 824 No hubo resultados
257 </target> 825 </target>
258 <context-group name="null"> 826 <context-group name="null">
259 <context context-type="linenumber">25</context> 827 <context context-type="linenumber">28</context>
828 </context-group>
829 </trans-unit>
830 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
831 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
832 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> suscriptores</target>
833 <context-group name="null">
834 <context context-type="linenumber">44</context>
835 </context-group>
836 </trans-unit>
837 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
838 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
839 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> vistas</target>
840 <context-group name="null">
841 <context context-type="linenumber">55</context>
260 </context-group> 842 </context-group>
261 </trans-unit> 843 </trans-unit>
262 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 844 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
263 <source>Change the language</source> 845 <source>Change the language</source>
264 <target>Cambiar el idioma</target> 846 <target>Cambiar el idioma</target>
265 <context-group name="null"> 847 <context-group name="null">
266 <context context-type="linenumber">88</context> 848 <context context-type="linenumber">86</context>
849 </context-group>
850 </trans-unit>
851 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
852 <source>
853 Help to translate PeerTube!
854 </source>
855 <target>
856 ¡Ayude a traducir PeerTube!
857 </target>
858 <context-group name="null">
859 <context context-type="linenumber">8</context>
860 </context-group>
861 </trans-unit>
862 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
863 <source>
864 My public profile
865 </source>
866 <target>
867 Mi perfil público
868 </target>
869 <context-group name="null">
870 <context context-type="linenumber">16</context>
871 </context-group>
872 </trans-unit>
873 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
874 <source>
875 My account
876 </source>
877 <target>
878 Mi cuenta
879 </target>
880 <context-group name="null">
881 <context context-type="linenumber">20</context>
882 </context-group>
883 </trans-unit>
884 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
885 <source>
886 My videos
887 </source>
888 <target>
889 Mis vídeos
890 </target>
891 <context-group name="null">
892 <context context-type="linenumber">24</context>
893 </context-group>
894 </trans-unit>
895 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
896 <source>
897 Log out
898 </source>
899 <target>
900 Desconectarse
901 </target>
902 <context-group name="null">
903 <context context-type="linenumber">28</context>
267 </context-group> 904 </context-group>
268 </trans-unit> 905 </trans-unit>
269 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 906 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
270 <source>Create an account</source> 907 <source>Create an account</source>
271 <target>Crear una cuenta</target> 908 <target>Crear una cuenta</target>
272 <context-group name="null"> 909 <context-group name="null">
273 <context context-type="linenumber">39</context> 910 <context context-type="linenumber">37</context>
274 </context-group> 911 </context-group>
275 </trans-unit> 912 </trans-unit>
276 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 913 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -280,39 +917,53 @@ Iniciar sesión</target>
280 <context context-type="linenumber">24</context> 917 <context context-type="linenumber">24</context>
281 </context-group> 918 </context-group>
282 </trans-unit> 919 </trans-unit>
920 <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
921 <source>Subscriptions</source>
922 <target>Suscripciones</target>
923 <context-group name="null">
924 <context context-type="linenumber">45</context>
925 </context-group>
926 </trans-unit>
927 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
928 <source>Overview</source>
929 <target>Vista general</target>
930 <context-group name="null">
931 <context context-type="linenumber">50</context>
932 </context-group>
933 </trans-unit>
283 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 934 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
284 <source>Trending</source> 935 <source>Trending</source>
285 <target>Tendencias</target> 936 <target>Tendencias</target>
286 <context-group name="null"> 937 <context-group name="null">
287 <context context-type="linenumber">57</context> 938 <context context-type="linenumber">55</context>
288 </context-group> 939 </context-group>
289 </trans-unit> 940 </trans-unit>
290 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 941 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
291 <source>Recently added</source> 942 <source>Recently added</source>
292 <target>Añadidos recientemente</target> 943 <target>Añadidos recientemente</target>
293 <context-group name="null"> 944 <context-group name="null">
294 <context context-type="linenumber">62</context> 945 <context context-type="linenumber">60</context>
295 </context-group> 946 </context-group>
296 </trans-unit> 947 </trans-unit>
297 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 948 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
298 <source>Local</source> 949 <source>Local</source>
299 <target>Local</target> 950 <target>Local</target>
300 <context-group name="null"> 951 <context-group name="null">
301 <context context-type="linenumber">67</context> 952 <context context-type="linenumber">65</context>
302 </context-group> 953 </context-group>
303 </trans-unit> 954 </trans-unit>
304 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 955 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
305 <source>More</source> 956 <source>More</source>
306 <target>Más</target> 957 <target>Más</target>
307 <context-group name="null"> 958 <context-group name="null">
308 <context context-type="linenumber">72</context> 959 <context context-type="linenumber">70</context>
309 </context-group> 960 </context-group>
310 </trans-unit> 961 </trans-unit>
311 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 962 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
312 <source>Administration</source> 963 <source>Administration</source>
313 <target>Administración</target> 964 <target>Administración</target>
314 <context-group name="null"> 965 <context-group name="null">
315 <context context-type="linenumber">76</context> 966 <context context-type="linenumber">74</context>
316 </context-group> 967 </context-group>
317 </trans-unit> 968 </trans-unit>
318 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 969 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -322,6 +973,48 @@ Iniciar sesión</target>
322 <context context-type="linenumber">25</context> 973 <context context-type="linenumber">25</context>
323 </context-group> 974 </context-group>
324 </trans-unit> 975 </trans-unit>
976 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
977 <source>Show keyboard shortcuts</source>
978 <target>Mostrar los atajos de teclado</target>
979 <context-group name="null">
980 <context context-type="linenumber">89</context>
981 </context-group>
982 </trans-unit>
983 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
984 <source>Toggle dark interface</source>
985 <target>Alternar con la interfaz oscura</target>
986 <context-group name="null">
987 <context context-type="linenumber">92</context>
988 </context-group>
989 </trans-unit>
990 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
991 <source>View your notifications</source>
992 <target>Ver sus notificaciones</target>
993 <context-group name="null">
994 <context context-type="linenumber">3</context>
995 </context-group>
996 </trans-unit>
997 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
998 <source>Notifications</source>
999 <target>Notificaciones</target>
1000 <context-group name="null">
1001 <context context-type="linenumber">10</context>
1002 </context-group>
1003 </trans-unit>
1004 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
1005 <source>Update your notification preferences</source>
1006 <target>Actualizar sus preferencias de notificación</target>
1007 <context-group name="null">
1008 <context context-type="linenumber">15</context>
1009 </context-group>
1010 </trans-unit>
1011 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
1012 <source>See all your notifications</source>
1013 <target>Ver todas sus notificaciones</target>
1014 <context-group name="null">
1015 <context context-type="linenumber">22</context>
1016 </context-group>
1017 </trans-unit>
325 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 1018 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
326 <source>Search...</source> 1019 <source>Search...</source>
327 <target>Buscar...</target> 1020 <target>Buscar...</target>
@@ -420,18 +1113,66 @@ Iniciar sesión</target>
420 <context context-type="linenumber">94</context> 1113 <context context-type="linenumber">94</context>
421 </context-group> 1114 </context-group>
422 </trans-unit> 1115 </trans-unit>
1116 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
1117 <source>Display unlisted and private videos</source>
1118 <target>Mostrar los vídeos no listados y privados</target>
1119 <context-group name="null">
1120 <context context-type="linenumber">14</context>
1121 </context-group>
1122 </trans-unit>
423 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1123 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
424 <source>No results.</source> 1124 <source>No results.</source>
425 <target> Ningún resultados</target> 1125 <target> Ningún resultados</target>
426 <context-group name="null"> 1126 <context-group name="null">
427 <context context-type="linenumber">7</context> 1127 <context context-type="linenumber">20</context>
1128 </context-group>
1129 </trans-unit>
1130 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
1131 <source>
1132 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1133 </source>
1134 <target>
1135 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1136 </target>
1137 <context-group name="null">
1138 <context context-type="linenumber">6</context>
1139 </context-group>
1140 </trans-unit>
1141 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
1142 <source>
1143 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1144 </source>
1145 <target>
1146 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1147 </target>
1148 <context-group name="null">
1149 <context context-type="linenumber">14</context>
1150 </context-group>
1151 </trans-unit>
1152 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
1153 <source>
1154 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
1155 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
1156
1157 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
1158 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1159 </source>
1160 <target>
1161 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
1162 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
1163
1164 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
1165 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1166 </target>
1167 <context-group name="null">
1168 <context context-type="linenumber">22</context>
428 </context-group> 1169 </context-group>
429 </trans-unit> 1170 </trans-unit>
430 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 1171 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
431 <source>Instance</source> 1172 <source>Instance</source>
432 <target>Nodo</target> 1173 <target>Nodo</target>
433 <context-group name="null"> 1174 <context-group name="null">
434 <context context-type="linenumber">8</context> 1175 <context context-type="linenumber">12</context>
435 </context-group> 1176 </context-group>
436 </trans-unit> 1177 </trans-unit>
437 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 1178 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -441,15 +1182,64 @@ Iniciar sesión</target>
441 <context context-type="linenumber">7</context> 1182 <context context-type="linenumber">7</context>
442 </context-group> 1183 </context-group>
443 </trans-unit> 1184 </trans-unit>
444 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1185 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
1186 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
1187 <target>Contactar al administrador de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1188 <context-group name="null">
1189 <context context-type="linenumber">3</context>
1190 </context-group>
1191 </trans-unit>
1192 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
1193 <source>Your name</source>
1194 <target>Su nombre</target>
1195 <context-group name="null">
1196 <context context-type="linenumber">11</context>
1197 </context-group>
1198 </trans-unit>
1199 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
1200 <source>Your email</source>
1201 <target>Su dirección de correo electrónico</target>
1202 <context-group name="null">
1203 <context context-type="linenumber">20</context>
1204 </context-group>
1205 </trans-unit>
1206 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
1207 <source>Your message</source>
1208 <target>Su mensaje</target>
1209 <context-group name="null">
1210 <context context-type="linenumber">29</context>
1211 </context-group>
1212 </trans-unit>
1213 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
445 <source> 1214 <source>
446 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1215 Cancel
447</source> 1216 </source>
448 <target> 1217 <target>
449 Acerca del nodo <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 1218 Cancelar
450</target> 1219 </target>
451 <context-group name="null"> 1220 <context-group name="null">
452 <context context-type="linenumber">1</context> 1221 <context context-type="linenumber">26</context>
1222 </context-group>
1223 </trans-unit>
1224 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1225 <source>Submit</source>
1226 <target>Enviar</target>
1227 <context-group name="null">
1228 <context context-type="linenumber">31</context>
1229 </context-group>
1230 </trans-unit>
1231 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
1232 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
1233 <target>Acerca de la instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1234 <context-group name="null">
1235 <context context-type="linenumber">4</context>
1236 </context-group>
1237 </trans-unit>
1238 <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
1239 <source>Contact administrator</source>
1240 <target>Contactar al administrador</target>
1241 <context-group name="null">
1242 <context context-type="linenumber">6</context>
453 </context-group> 1243 </context-group>
454 </trans-unit> 1244 </trans-unit>
455 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1245 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -463,47 +1253,47 @@ Iniciar sesión</target>
463 <source>Terms</source> 1253 <source>Terms</source>
464 <target>Términos de uso</target> 1254 <target>Términos de uso</target>
465 <context-group name="null"> 1255 <context-group name="null">
466 <context context-type="linenumber">44</context> 1256 <context context-type="linenumber">39</context>
467 </context-group> 1257 </context-group>
468 </trans-unit> 1258 </trans-unit>
469 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1259 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
470 <source>User registration is allowed and</source> 1260 <source>User registration is allowed and</source>
471 <target>El registro de usuarios está permitido y</target> 1261 <target>El registro de usuarios está permitido y</target>
472 <context-group name="null"> 1262 <context-group name="null">
473 <context context-type="linenumber">25</context> 1263 <context context-type="linenumber">29</context>
474 </context-group> 1264 </context-group>
475 </trans-unit> 1265 </trans-unit>
476 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1266 <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
477 <source> 1267 <source>
478 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1268 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
479 </source> 1269 </source>
480 <target> 1270 <target>
481 este nodo ofrece una cuota estándar de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> de espacio para los vídeos de sus usuarios. 1271 esta instancia provee un espacio máximo de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para los vídeos de sus usuarios.
482 </target> 1272 </target>
483 <context-group name="null"> 1273 <context-group name="null">
484 <context context-type="linenumber">27</context> 1274 <context context-type="linenumber">31</context>
485 </context-group> 1275 </context-group>
486 </trans-unit> 1276 </trans-unit>
487 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1277 <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
488 <source> 1278 <source>
489 this instance provides unlimited space for the videos of its users. 1279 this instance provides unlimited space for the videos of its users.
490 </source> 1280 </source>
491 <target> 1281 <target>
492 este nodo ofrece espacio ilimitado para los vídeos de sus usuarios. 1282 esta instancia provee un espacio ilimitado para los vídeos de sus usuarios.
493 </target> 1283 </target>
494 <context-group name="null"> 1284 <context-group name="null">
495 <context context-type="linenumber">31</context> 1285 <context context-type="linenumber">35</context>
496 </context-group> 1286 </context-group>
497 </trans-unit> 1287 </trans-unit>
498 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1288 <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
499 <source> 1289 <source>
500 User registration is currently not allowed. 1290 User registration is currently not allowed.
501 </source> 1291 </source>
502 <target> 1292 <target>
503 El registro de usuarios no está permitido actualmente. 1293 El registro de usuarios no está abierto actualmente.
504 </target> 1294 </target>
505 <context-group name="null"> 1295 <context-group name="null">
506 <context context-type="linenumber">36</context> 1296 <context context-type="linenumber">40</context>
507 </context-group> 1297 </context-group>
508 </trans-unit> 1298 </trans-unit>
509 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1299 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -724,14 +1514,14 @@ Iniciar sesión</target>
724 <context context-type="linenumber">83</context> 1514 <context context-type="linenumber">83</context>
725 </context-group> 1515 </context-group>
726 </trans-unit> 1516 </trans-unit>
727 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1517 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
728 <source> 1518 <source>
729 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1519 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
730 In the meantime, we want to test different ideas related to this issue: 1520 In the meantime, we want to test different ideas related to this issue:
731 </source> 1521 </source>
732 <target> 1522 <target>
733 PeerTube está solo en beta, y quiere proporcionar las mejores contramedidas posibles para cuando se publique la versión estable. 1523 PeerTube está en sus primeros pasos, y quiere proponer las mejores contramedidas posibles al momento de la publicación de la versión estable.
734 Mientras tanto, queremos probar diferentes ideas relacionadas con este problema: 1524 Mientras tanto, queremos probar diferentes ideas relacionadas con el problema:
735 </target> 1525 </target>
736 <context-group name="null"> 1526 <context-group name="null">
737 <context context-type="linenumber">85</context> 1527 <context context-type="linenumber">85</context>
@@ -772,18 +1562,53 @@ Iniciar sesión</target>
772 <context context-type="linenumber">95</context> 1562 <context context-type="linenumber">95</context>
773 </context-group> 1563 </context-group>
774 </trans-unit> 1564 </trans-unit>
1565 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1566 <source>Banned</source>
1567 <target>Expulsados</target>
1568 <context-group name="null">
1569 <context context-type="linenumber">12</context>
1570 </context-group>
1571 </trans-unit>
1572 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1573 <source>Muted</source>
1574 <target>Silenciados</target>
1575 <context-group name="null">
1576 <context context-type="linenumber">13</context>
1577 </context-group>
1578 </trans-unit>
1579 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1580 <source>Muted by your instance</source>
1581 <target>Silenciados por tu instancia</target>
1582 <context-group name="null">
1583 <context context-type="linenumber">14</context>
1584 </context-group>
1585 </trans-unit>
1586 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1587 <source>Instance muted</source>
1588 <target>Instancia silenciada</target>
1589 <context-group name="null">
1590 <context context-type="linenumber">15</context>
1591 </context-group>
1592 </trans-unit>
1593 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1594 <source>Instance muted by your instance</source>
1595 <target>Instancia silenciada por tu instancia</target>
1596 <context-group name="null">
1597 <context context-type="linenumber">16</context>
1598 </context-group>
1599 </trans-unit>
775 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1600 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
776 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1601 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
777 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> suscriptores</target> 1602 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> suscriptores</target>
778 <context-group name="null"> 1603 <context-group name="null">
779 <context context-type="linenumber">12</context> 1604 <context context-type="linenumber">24</context>
780 </context-group> 1605 </context-group>
781 </trans-unit> 1606 </trans-unit>
782 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1607 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
783 <source>Video channels</source> 1608 <source>Video channels</source>
784 <target>Canales de vídeo</target> 1609 <target>Canales de vídeo</target>
785 <context-group name="null"> 1610 <context-group name="null">
786 <context context-type="linenumber">19</context> 1611 <context context-type="linenumber">31</context>
787 </context-group> 1612 </context-group>
788 </trans-unit> 1613 </trans-unit>
789 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1614 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -825,42 +1650,49 @@ Iniciar sesión</target>
825 <source>Short description</source> 1650 <source>Short description</source>
826 <target>Descripción corta</target> 1651 <target>Descripción corta</target>
827 <context-group name="null"> 1652 <context-group name="null">
828 <context context-type="linenumber">22</context> 1653 <context context-type="linenumber">21</context>
829 </context-group> 1654 </context-group>
830 </trans-unit> 1655 </trans-unit>
831 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1656 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
832 <source>Default client route</source> 1657 <source>Default client route</source>
833 <target>Routa de cliente por defecto</target> 1658 <target>Routa de cliente por defecto</target>
834 <context-group name="null"> 1659 <context-group name="null">
835 <context context-type="linenumber">55</context> 1660 <context context-type="linenumber">48</context>
1661 </context-group>
1662 </trans-unit>
1663 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1664 <source>Videos Overview</source>
1665 <target>Vista general de los vídeos</target>
1666 <context-group name="null">
1667 <context context-type="linenumber">51</context>
836 </context-group> 1668 </context-group>
837 </trans-unit> 1669 </trans-unit>
838 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1670 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
839 <source>Videos Trending</source> 1671 <source>Videos Trending</source>
840 <target>Vídeos en Tendencia</target> 1672 <target>Vídeos en Tendencia</target>
841 <context-group name="null"> 1673 <context-group name="null">
842 <context context-type="linenumber">59</context> 1674 <context context-type="linenumber">52</context>
843 </context-group> 1675 </context-group>
844 </trans-unit> 1676 </trans-unit>
845 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1677 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
846 <source>Videos Recently Added</source> 1678 <source>Videos Recently Added</source>
847 <target>Vídeos Recientemente Añadidos</target> 1679 <target>Vídeos Recientemente Añadidos</target>
848 <context-group name="null"> 1680 <context-group name="null">
849 <context context-type="linenumber">60</context> 1681 <context context-type="linenumber">53</context>
850 </context-group> 1682 </context-group>
851 </trans-unit> 1683 </trans-unit>
852 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1684 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
853 <source>Local videos</source> 1685 <source>Local videos</source>
854 <target>Vídeos locales</target> 1686 <target>Vídeos locales</target>
855 <context-group name="null"> 1687 <context-group name="null">
856 <context context-type="linenumber">61</context> 1688 <context context-type="linenumber">54</context>
857 </context-group> 1689 </context-group>
858 </trans-unit> 1690 </trans-unit>
859 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1691 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
860 <source>Policy on videos containing sensitive content</source> 1692 <source>Policy on videos containing sensitive content</source>
861 <target>Política para los vídeos que contengan material sensible</target> 1693 <target>Política para los vídeos que contengan material sensible</target>
862 <context-group name="null"> 1694 <context-group name="null">
863 <context context-type="linenumber">70</context> 1695 <context context-type="linenumber">61</context>
864 </context-group> 1696 </context-group>
865 </trans-unit> 1697 </trans-unit>
866 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1698 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -895,14 +1727,42 @@ Iniciar sesión</target>
895 <source>Signup enabled</source> 1727 <source>Signup enabled</source>
896 <target>Registro habilitado</target> 1728 <target>Registro habilitado</target>
897 <context-group name="null"> 1729 <context-group name="null">
898 <context context-type="linenumber">92</context> 1730 <context context-type="linenumber">84</context>
1731 </context-group>
1732 </trans-unit>
1733 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1734 <source>Signup requires email verification</source>
1735 <target>La suscripción requiere una verificación mediante correo electrónico</target>
1736 <context-group name="null">
1737 <context context-type="linenumber">91</context>
899 </context-group> 1738 </context-group>
900 </trans-unit> 1739 </trans-unit>
901 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1740 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
902 <source>Signup limit</source> 1741 <source>Signup limit</source>
903 <target>Límite de registro</target> 1742 <target>Límite de registro</target>
904 <context-group name="null"> 1743 <context-group name="null">
905 <context context-type="linenumber">101</context> 1744 <context context-type="linenumber">96</context>
1745 </context-group>
1746 </trans-unit>
1747 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1748 <source>Users</source>
1749 <target>Usuarios</target>
1750 <context-group name="null">
1751 <context context-type="linenumber">105</context>
1752 </context-group>
1753 </trans-unit>
1754 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1755 <source>User default video quota</source>
1756 <target>Cuota de vídeo por defecto del usuario</target>
1757 <context-group name="null">
1758 <context context-type="linenumber">109</context>
1759 </context-group>
1760 </trans-unit>
1761 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1762 <source>User default daily upload limit</source>
1763 <target>Límite diario de subida por día por usuario</target>
1764 <context-group name="null">
1765 <context context-type="linenumber">121</context>
906 </context-group> 1766 </context-group>
907 </trans-unit> 1767 </trans-unit>
908 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1768 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -912,46 +1772,39 @@ Iniciar sesión</target>
912 <context context-type="linenumber">42</context> 1772 <context context-type="linenumber">42</context>
913 </context-group> 1773 </context-group>
914 </trans-unit> 1774 </trans-unit>
915 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1775 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
916 <source>Video import with HTTP enabled</source> 1776 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
917 <target>Importar video con HTTP activado</target> 1777 <target>La importación de vídeos mediante URL HTTP (por ejemplo YouTube) está activada</target>
918 <context-group name="null"> 1778 <context-group name="null">
919 <context context-type="linenumber">115</context> 1779 <context context-type="linenumber">141</context>
920 </context-group> 1780 </context-group>
921 </trans-unit> 1781 </trans-unit>
922 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1782 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
923 <source>Video import with a torrent file or a magnet URI enabled</source> 1783 <source>Video import with a torrent file or a magnet URI enabled</source>
924 <target>Importar video con un archivo torrent o un enlace magnet activado</target> 1784 <target>Importar video con un archivo torrent o un enlace magnet activado</target>
925 <context-group name="null"> 1785 <context-group name="null">
926 <context context-type="linenumber">120</context> 1786 <context context-type="linenumber">148</context>
927 </context-group> 1787 </context-group>
928 </trans-unit> 1788 </trans-unit>
929 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1789 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
930 <source>Administrator</source> 1790 <source>Administrator</source>
931 <target>Administrador</target> 1791 <target>Administrador</target>
932 <context-group name="null"> 1792 <context-group name="null">
933 <context context-type="linenumber">123</context> 1793 <context context-type="linenumber">155</context>
934 </context-group> 1794 </context-group>
935 </trans-unit> 1795 </trans-unit>
936 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1796 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
937 <source>Admin email</source> 1797 <source>Admin email</source>
938 <target>Correo del administrador</target> 1798 <target>Correo del administrador</target>
939 <context-group name="null"> 1799 <context-group name="null">
940 <context context-type="linenumber">126</context> 1800 <context context-type="linenumber">158</context>
941 </context-group> 1801 </context-group>
942 </trans-unit> 1802 </trans-unit>
943 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 1803 <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
944 <source>Users</source> 1804 <source>Enable contact form</source>
945 <target>Usuarios</target> 1805 <target>Habilitar el formulario de contacto</target>
946 <context-group name="null">
947 <context context-type="linenumber">136</context>
948 </context-group>
949 </trans-unit>
950 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
951 <source>User default video quota</source>
952 <target>Cuota de vídeo por defecto del usuario</target>
953 <context-group name="null"> 1806 <context-group name="null">
954 <context context-type="linenumber">139</context> 1807 <context context-type="linenumber">169</context>
955 </context-group> 1808 </context-group>
956 </trans-unit> 1809 </trans-unit>
957 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1810 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -965,133 +1818,208 @@ Iniciar sesión</target>
965 <source>Twitter</source> 1818 <source>Twitter</source>
966 <target>Twitter</target> 1819 <target>Twitter</target>
967 <context-group name="null"> 1820 <context-group name="null">
968 <context context-type="linenumber">170</context> 1821 <context context-type="linenumber">178</context>
969 </context-group> 1822 </context-group>
970 </trans-unit> 1823 </trans-unit>
971 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1824 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
972 <source>Your Twitter username</source> 1825 <source>Your Twitter username</source>
973 <target>Tu usuario de Twitter</target> 1826 <target>Tu usuario de Twitter</target>
974 <context-group name="null"> 1827 <context-group name="null">
975 <context context-type="linenumber">173</context> 1828 <context context-type="linenumber">184</context>
976 </context-group> 1829 </context-group>
977 </trans-unit> 1830 </trans-unit>
978 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1831 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
979 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1832 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
980 <target>Indica la cuenta de Twitter del sitio web o de la plataforma en la que el contenido fue publicado</target> 1833 <target>Indica la cuenta de Twitter del sitio web o de la plataforma en la que el contenido fue publicado</target>
981 <context-group name="null"> 1834 <context-group name="null">
982 <context context-type="linenumber">176</context> 1835 <context context-type="linenumber">187</context>
983 </context-group> 1836 </context-group>
984 </trans-unit> 1837 </trans-unit>
985 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1838 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
986 <source>Instance whitelisted by Twitter</source> 1839 <source>Instance whitelisted by Twitter</source>
987 <target>Nodo en lista blanca de Twitter</target> 1840 <target>Nodo en lista blanca de Twitter</target>
988 <context-group name="null"> 1841 <context-group name="null">
989 <context context-type="linenumber">189</context> 1842 <context context-type="linenumber">199</context>
1843 </context-group>
1844 </trans-unit>
1845 <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
1846 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1847 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1848 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1849 <target>Si su instancia está autorizada por Twitter, un reproductor de vídeo estará incorporado al hilo Twitter cuando se comparta un vídeo desde PeerTube.&lt;br /&gt;
1850 Si la instancia no está autorizada, usamos una tarjeta con una imagen con vínculo que redireccionará hacia su instancia PeerTube.&lt;br /&gt;&lt;br /&gt;
1851 Seleccione esta casilla, guarde la configuración y pruebe colocando el URL de un vídeo de su instancia (https://example.com/videos/watch/blabla) en &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; para verificar si su instancia está autorizada por Twitter.</target>
1852 <context-group name="null">
1853 <context context-type="linenumber">200</context>
990 </context-group> 1854 </context-group>
991 </trans-unit> 1855 </trans-unit>
992 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1856 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
993 <source>Services</source> 1857 <source>Services</source>
994 <target>Servicios</target> 1858 <target>Servicios</target>
995 <context-group name="null"> 1859 <context-group name="null">
996 <context context-type="linenumber">168</context> 1860 <context context-type="linenumber">176</context>
997 </context-group> 1861 </context-group>
998 </trans-unit> 1862 </trans-unit>
999 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1863 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1000 <source>Transcoding</source> 1864 <source>Transcoding</source>
1001 <target>Transcodificar</target> 1865 <target>Transcodificar</target>
1002 <context-group name="null"> 1866 <context-group name="null">
1003 <context context-type="linenumber">200</context> 1867 <context context-type="linenumber">215</context>
1004 </context-group> 1868 </context-group>
1005 </trans-unit> 1869 </trans-unit>
1006 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1870 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1007 <source>Transcoding enabled</source> 1871 <source>Transcoding enabled</source>
1008 <target>Transcodificación activada</target> 1872 <target>Transcodificación activada</target>
1009 <context-group name="null"> 1873 <context-group name="null">
1010 <context context-type="linenumber">204</context> 1874 <context context-type="linenumber">221</context>
1011 </context-group> 1875 </context-group>
1012 </trans-unit> 1876 </trans-unit>
1013 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1877 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1014 <source>If you disable transcoding, many videos from your users will not work!</source> 1878 <source>If you disable transcoding, many videos from your users will not work!</source>
1015 <target>¡Si desactivas la transcodificación, muchos vídeos de tus usuarios no funcionarán!</target> 1879 <target>¡Si desactivas la transcodificación, muchos vídeos de tus usuarios no funcionarán!</target>
1016 <context-group name="null"> 1880 <context-group name="null">
1017 <context context-type="linenumber">205</context> 1881 <context context-type="linenumber">222</context>
1882 </context-group>
1883 </trans-unit>
1884 <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
1885 <source>Allow additional extensions</source>
1886 <target>Autorizar extensiones adicionales</target>
1887 <context-group name="null">
1888 <context context-type="linenumber">231</context>
1889 </context-group>
1890 </trans-unit>
1891 <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
1892 <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
1893 <target>Autorizar sus usuarios a subir vídeos .mkv, .mov, .avi y .flv</target>
1894 <context-group name="null">
1895 <context context-type="linenumber">232</context>
1018 </context-group> 1896 </context-group>
1019 </trans-unit> 1897 </trans-unit>
1020 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1898 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1021 <source>Transcoding threads</source> 1899 <source>Transcoding threads</source>
1022 <target>Hilos de transcodificaciones</target> 1900 <target>Hilos de transcodificaciones</target>
1023 <context-group name="null"> 1901 <context-group name="null">
1024 <context context-type="linenumber">211</context> 1902 <context context-type="linenumber">237</context>
1025 </context-group> 1903 </context-group>
1026 </trans-unit> 1904 </trans-unit>
1027 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1905 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1028 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1906 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1029 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 1907 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
1030 <context-group name="null"> 1908 <context-group name="null">
1031 <context context-type="linenumber">227</context> 1909 <context context-type="linenumber">252</context>
1910 </context-group>
1911 </trans-unit>
1912 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1913 <source>
1914 Cache
1915
1916 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1917 </source>
1918 <target>
1919 Caché
1920
1921 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1922 </target>
1923 <context-group name="null">
1924 <context context-type="linenumber">260</context>
1032 </context-group> 1925 </context-group>
1033 </trans-unit> 1926 </trans-unit>
1034 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1927 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1035 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1928 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1036 <target>Algunos archivos (previsualizaciones, subtítulos) no están federados. Los obtenemos directamente del nodo de origen y las ponemos en caché.</target> 1929 <target>Algunos archivos (previsualizaciones, subtítulos) no están federados. Los obtenemos directamente del nodo de origen y las ponemos en caché.</target>
1037 <context-group name="null"> 1930 <context-group name="null">
1038 <context context-type="linenumber">238</context> 1931 <context context-type="linenumber">265</context>
1039 </context-group> 1932 </context-group>
1040 </trans-unit> 1933 </trans-unit>
1041 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1934 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1042 <source>Previews cache size</source> 1935 <source>Previews cache size</source>
1043 <target>Tamaño de caché de las previsualizaciones</target> 1936 <target>Tamaño de caché de las previsualizaciones</target>
1044 <context-group name="null"> 1937 <context-group name="null">
1045 <context context-type="linenumber">243</context> 1938 <context context-type="linenumber">271</context>
1046 </context-group> 1939 </context-group>
1047 </trans-unit> 1940 </trans-unit>
1048 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1941 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1049 <source>Video captions cache size</source> 1942 <source>Video captions cache size</source>
1050 <target>Tamaño de caché de los subtítulos</target> 1943 <target>Tamaño de caché de los subtítulos</target>
1051 <context-group name="null"> 1944 <context-group name="null">
1052 <context context-type="linenumber">254</context> 1945 <context context-type="linenumber">280</context>
1053 </context-group> 1946 </context-group>
1054 </trans-unit> 1947 </trans-unit>
1055 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1948 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1056 <source>Customizations</source> 1949 <source>Customizations</source>
1057 <target>Personalizaciones</target> 1950 <target>Personalizaciones</target>
1058 <context-group name="null"> 1951 <context-group name="null">
1059 <context context-type="linenumber">264</context> 1952 <context context-type="linenumber">289</context>
1060 </context-group> 1953 </context-group>
1061 </trans-unit> 1954 </trans-unit>
1062 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1955 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1063 <source>JavaScript</source> 1956 <source>JavaScript</source>
1064 <target>JavaScript</target> 1957 <target>JavaScript</target>
1065 <context-group name="null"> 1958 <context-group name="null">
1066 <context context-type="linenumber">267</context> 1959 <context context-type="linenumber">294</context>
1067 </context-group> 1960 </context-group>
1068 </trans-unit> 1961 </trans-unit>
1069 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1962 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1070 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1963 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1071 <target>Escribir código Javascript directamente.&lt;br /&gt;Ejemplo: &lt;pre&gt;console.log('mi nodo es maravilloso');&lt;/pre&gt;</target> 1964 <target>Escribir código Javascript directamente.&lt;br /&gt;Ejemplo: &lt;pre&gt;console.log('mi nodo es maravilloso');&lt;/pre&gt;</target>
1072 <context-group name="null"> 1965 <context-group name="null">
1073 <context context-type="linenumber">270</context> 1966 <context context-type="linenumber">297</context>
1967 </context-group>
1968 </trans-unit>
1969 <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
1970 <source>
1971 Write directly CSS code. Example:&lt;br /&gt;
1972 &lt;pre&gt;
1973 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1974 background-color: red;
1975 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1976 &lt;/pre&gt;
1977
1978 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1979 &lt;pre&gt;
1980 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1981 color: red;
1982 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1983 &lt;/pre&gt;
1984 </source>
1985 <target>
1986 Escriba directamente código CSS. Por ejemplo:&lt;br /&gt;
1987 &lt;pre&gt;
1988 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1989 background-color: red;
1990 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1991 &lt;/pre&gt;
1992
1993 Prefijar con &lt;em&gt;#custom-css&lt;/em&gt; para sobrecargar estilos. Por ejemplo:
1994 &lt;pre&gt;
1995 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1996 color: red;
1997 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1998 &lt;/pre&gt;
1999 </target>
2000 <context-group name="null">
2001 <context context-type="linenumber">311</context>
1074 </context-group> 2002 </context-group>
1075 </trans-unit> 2003 </trans-unit>
1076 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 2004 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1077 <source>Advanced configuration</source> 2005 <source>Advanced configuration</source>
1078 <target>Configuración avanzada</target> 2006 <target>Configuración avanzada</target>
1079 <context-group name="null"> 2007 <context-group name="null">
1080 <context context-type="linenumber">197</context> 2008 <context context-type="linenumber">212</context>
1081 </context-group> 2009 </context-group>
1082 </trans-unit> 2010 </trans-unit>
1083 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 2011 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1084 <source>Update configuration</source> 2012 <source>Update configuration</source>
1085 <target>Actualizar configuración</target> 2013 <target>Actualizar configuración</target>
1086 <context-group name="null"> 2014 <context-group name="null">
1087 <context context-type="linenumber">314</context> 2015 <context context-type="linenumber">340</context>
1088 </context-group> 2016 </context-group>
1089 </trans-unit> 2017 </trans-unit>
1090 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 2018 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1091 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 2019 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1092 <target>Parece que la configuración no es válida. Por favor, busque errores potenciales en las diferentes pestañas.</target> 2020 <target>Parece que la configuración no es válida. Por favor, busque errores potenciales en las diferentes pestañas.</target>
1093 <context-group name="null"> 2021 <context-group name="null">
1094 <context context-type="linenumber">315</context> 2022 <context context-type="linenumber">341</context>
1095 </context-group> 2023 </context-group>
1096 </trans-unit> 2024 </trans-unit>
1097 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 2025 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1116,6 +2044,17 @@ Iniciar sesión</target>
1116 <context context-type="linenumber">7</context> 2044 <context context-type="linenumber">7</context>
1117 </context-group> 2045 </context-group>
1118 </trans-unit> 2046 </trans-unit>
2047 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
2048 <source>
2049 Moderation
2050 </source>
2051 <target>
2052 Moderación
2053 </target>
2054 <context-group name="null">
2055 <context context-type="linenumber">11</context>
2056 </context-group>
2057 </trans-unit>
1119 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 2058 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1120 <source> 2059 <source>
1121 Jobs 2060 Jobs
@@ -1163,6 +2102,13 @@ Iniciar sesión</target>
1163 <context context-type="linenumber">21</context> 2102 <context context-type="linenumber">21</context>
1164 </context-group> 2103 </context-group>
1165 </trans-unit> 2104 </trans-unit>
2105 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
2106 <source>Filter...</source>
2107 <target>Filtrar...</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">27</context>
2110 </context-group>
2111 </trans-unit>
1166 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 2112 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1167 <source>ID</source> 2113 <source>ID</source>
1168 <target>ID</target> 2114 <target>ID</target>
@@ -1174,14 +2120,14 @@ Iniciar sesión</target>
1174 <source>Score</source> 2120 <source>Score</source>
1175 <target>Puntuación</target> 2121 <target>Puntuación</target>
1176 <context-group name="null"> 2122 <context-group name="null">
1177 <context context-type="linenumber">8</context> 2123 <context context-type="linenumber">17</context>
1178 </context-group> 2124 </context-group>
1179 </trans-unit> 2125 </trans-unit>
1180 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 2126 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1181 <source>Host</source> 2127 <source>Host</source>
1182 <target>Host</target> 2128 <target>Host</target>
1183 <context-group name="null"> 2129 <context-group name="null">
1184 <context context-type="linenumber">8</context> 2130 <context context-type="linenumber">19</context>
1185 </context-group> 2131 </context-group>
1186 </trans-unit> 2132 </trans-unit>
1187 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 2133 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1198,6 +2144,27 @@ Iniciar sesión</target>
1198 <context context-type="linenumber">11</context> 2144 <context context-type="linenumber">11</context>
1199 </context-group> 2145 </context-group>
1200 </trans-unit> 2146 </trans-unit>
2147 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
2148 <source>Accepted</source>
2149 <target>Aceptado</target>
2150 <context-group name="null">
2151 <context context-type="linenumber">32</context>
2152 </context-group>
2153 </trans-unit>
2154 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
2155 <source>Pending</source>
2156 <target>Pendiente</target>
2157 <context-group name="null">
2158 <context context-type="linenumber">33</context>
2159 </context-group>
2160 </trans-unit>
2161 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
2162 <source>Redundancy allowed</source>
2163 <target>Redundancia autorizada</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">22</context>
2166 </context-group>
2167 </trans-unit>
1201 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 2168 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1202 <source>Manage follows</source> 2169 <source>Manage follows</source>
1203 <target>Gestionar seguimientos</target> 2170 <target>Gestionar seguimientos</target>
@@ -1286,7 +2253,7 @@ Iniciar sesión</target>
1286 <source>Role</source> 2253 <source>Role</source>
1287 <target>Rol</target> 2254 <target>Rol</target>
1288 <context-group name="null"> 2255 <context-group name="null">
1289 <context context-type="linenumber">20</context> 2256 <context context-type="linenumber">43</context>
1290 </context-group> 2257 </context-group>
1291 </trans-unit> 2258 </trans-unit>
1292 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 2259 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1302,11 +2269,11 @@ Iniciar sesión</target>
1302 <context context-type="linenumber">65</context> 2269 <context context-type="linenumber">65</context>
1303 </context-group> 2270 </context-group>
1304 </trans-unit> 2271 </trans-unit>
1305 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125"> 2272 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
1306 <source>Reason...</source> 2273 <source>Daily video quota</source>
1307 <target>Motivo...</target> 2274 <target>Cuota diaria de vídeo</target>
1308 <context-group name="null"> 2275 <context-group name="null">
1309 <context context-type="linenumber">11</context> 2276 <context context-type="linenumber">72</context>
1310 </context-group> 2277 </context-group>
1311 </trans-unit> 2278 </trans-unit>
1312 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 2279 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
@@ -1316,13 +2283,80 @@ Iniciar sesión</target>
1316 <context context-type="linenumber">2</context> 2283 <context context-type="linenumber">2</context>
1317 </context-group> 2284 </context-group>
1318 </trans-unit> 2285 </trans-unit>
2286 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
2287 <source>Batch actions</source>
2288 <target>Acciones másivas</target>
2289 <context-group name="null">
2290 <context context-type="linenumber">19</context>
2291 </context-group>
2292 </trans-unit>
1319 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 2293 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1320 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2294 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1321 <target>Nombre de usuario <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2295 <target>Nombre de usuario <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1322 <context-group name="null"> 2296 <context-group name="null">
2297 <context context-type="linenumber">40</context>
2298 </context-group>
2299 </trans-unit>
2300 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
2301 <source>(banned)</source>
2302 <target>(expulsado)</target>
2303 <context-group name="null">
2304 <context context-type="linenumber">65</context>
2305 </context-group>
2306 </trans-unit>
2307 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2308 <source>Go to the account page</source>
2309 <target>Ir a la página de la cuenta</target>
2310 <context-group name="null">
2311 <context context-type="linenumber">133</context>
2312 </context-group>
2313 </trans-unit>
2314 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
2315 <source>User's email must be verified to login</source>
2316 <target>Se requiere validar la dirección de correo electrónico del usuario antes de conectarse</target>
2317 <context-group name="null">
2318 <context context-type="linenumber">72</context>
2319 </context-group>
2320 </trans-unit>
2321 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2322 <source>User's email is verified / User can login without email verification</source>
2323 <target>La dirección de correo electrónico del usuario ha sido verificada / El usuario puede conectarse sin verificación de dirección de correo electrónico</target>
2324 <context-group name="null">
2325 <context context-type="linenumber">76</context>
2326 </context-group>
2327 </trans-unit>
2328 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2329 <source>Ban reason:</source>
2330 <target>Razón de la expulsión:</target>
2331 <context-group name="null">
2332 <context context-type="linenumber">95</context>
2333 </context-group>
2334 </trans-unit>
2335 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
2336 <source>Moderation comment</source>
2337 <target>Comentarios de moderación</target>
2338 <context-group name="null">
2339 <context context-type="linenumber">3</context>
2340 </context-group>
2341 </trans-unit>
2342 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
2343 <source>
2344 This comment can only be seen by you or the other moderators.
2345 </source>
2346 <target>
2347 Este comentario puede ser visto solo por usted y los otros moderadores.
2348 </target>
2349 <context-group name="null">
1323 <context context-type="linenumber">17</context> 2350 <context context-type="linenumber">17</context>
1324 </context-group> 2351 </context-group>
1325 </trans-unit> 2352 </trans-unit>
2353 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
2354 <source>Update this comment</source>
2355 <target>Actualizar este comentario</target>
2356 <context-group name="null">
2357 <context context-type="linenumber">25</context>
2358 </context-group>
2359 </trans-unit>
1326 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 2360 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
1327 <source>Reporter</source> 2361 <source>Reporter</source>
1328 <target>Reportador</target> 2362 <target>Reportador</target>
@@ -1337,6 +2371,13 @@ Iniciar sesión</target>
1337 <context context-type="linenumber">14</context> 2371 <context context-type="linenumber">14</context>
1338 </context-group> 2372 </context-group>
1339 </trans-unit> 2373 </trans-unit>
2374 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
2375 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2376 <target>Estado <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2377 <context-group name="null">
2378 <context context-type="linenumber">11</context>
2379 </context-group>
2380 </trans-unit>
1340 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7"> 2381 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
1341 <source>Go to the account</source> 2382 <source>Go to the account</source>
1342 <target>Ir a la cuenta</target> 2383 <target>Ir a la cuenta</target>
@@ -1351,6 +2392,69 @@ Iniciar sesión</target>
1351 <context context-type="linenumber">33</context> 2392 <context context-type="linenumber">33</context>
1352 </context-group> 2393 </context-group>
1353 </trans-unit> 2394 </trans-unit>
2395 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2396 <source>Actions</source>
2397 <target>Acciones</target>
2398 <context-group name="null">
2399 <context context-type="linenumber">35</context>
2400 </context-group>
2401 </trans-unit>
2402 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
2403 <source>Reason:</source>
2404 <target>Razón:</target>
2405 <context-group name="null">
2406 <context context-type="linenumber">53</context>
2407 </context-group>
2408 </trans-unit>
2409 <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
2410 <source>Moderation comment:</source>
2411 <target>Comentario de moderación:</target>
2412 <context-group name="null">
2413 <context context-type="linenumber">57</context>
2414 </context-group>
2415 </trans-unit>
2416 <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
2417 <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2418 <target>Nombre del vídeo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2419 <context-group name="null">
2420 <context context-type="linenumber">8</context>
2421 </context-group>
2422 </trans-unit>
2423 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
2424 <source>Sensitive</source>
2425 <target>Sensible</target>
2426 <context-group name="null">
2427 <context context-type="linenumber">9</context>
2428 </context-group>
2429 </trans-unit>
2430 <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
2431 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2432 <target>Fecha <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2433 <context-group name="null">
2434 <context context-type="linenumber">11</context>
2435 </context-group>
2436 </trans-unit>
2437 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2438 <source>Blacklist reason:</source>
2439 <target>Razón del bloqueo:</target>
2440 <context-group name="null">
2441 <context context-type="linenumber">43</context>
2442 </context-group>
2443 </trans-unit>
2444 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
2445 <source>Moderation</source>
2446 <target>Moderación</target>
2447 <context-group name="null">
2448 <context context-type="linenumber">2</context>
2449 </context-group>
2450 </trans-unit>
2451 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
2452 <source>Video abuses</source>
2453 <target>Vídeos denunciados como abusivos</target>
2454 <context-group name="null">
2455 <context context-type="linenumber">5</context>
2456 </context-group>
2457 </trans-unit>
1354 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2458 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1355 <source>Blacklisted videos</source> 2459 <source>Blacklisted videos</source>
1356 <target>Vídeos en lista negra</target> 2460 <target>Vídeos en lista negra</target>
@@ -1358,18 +2462,39 @@ Iniciar sesión</target>
1358 <context context-type="linenumber">7</context> 2462 <context context-type="linenumber">7</context>
1359 </context-group> 2463 </context-group>
1360 </trans-unit> 2464 </trans-unit>
1361 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2465 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1362 <source>My settings</source> 2466 <source>Muted accounts</source>
1363 <target>Mis ajustes</target> 2467 <target>Cuentas silenciadas</target>
1364 <context-group name="null"> 2468 <context-group name="null">
1365 <context context-type="linenumber">3</context> 2469 <context context-type="linenumber">2</context>
1366 </context-group> 2470 </context-group>
1367 </trans-unit> 2471 </trans-unit>
1368 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2472 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1369 <source>My videos</source> 2473 <source>Muted servers</source>
1370 <target>Mis vídeos</target> 2474 <target>Servidores silenciados</target>
1371 <context-group name="null"> 2475 <context-group name="null">
1372 <context context-type="linenumber">14</context> 2476 <context context-type="linenumber">11</context>
2477 </context-group>
2478 </trans-unit>
2479 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2480 <source>Account</source>
2481 <target>Cuenta</target>
2482 <context-group name="null">
2483 <context context-type="linenumber">12</context>
2484 </context-group>
2485 </trans-unit>
2486 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2487 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2488 <target>Silenciado en <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2489 <context-group name="null">
2490 <context context-type="linenumber">13</context>
2491 </context-group>
2492 </trans-unit>
2493 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2494 <source>Unmute</source>
2495 <target>Dejar de silenciar</target>
2496 <context-group name="null">
2497 <context context-type="linenumber">23</context>
1373 </context-group> 2498 </context-group>
1374 </trans-unit> 2499 </trans-unit>
1375 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2500 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1383,28 +2508,46 @@ Iniciar sesión</target>
1383 <source>Profile</source> 2508 <source>Profile</source>
1384 <target>Perfil</target> 2509 <target>Perfil</target>
1385 <context-group name="null"> 2510 <context-group name="null">
1386 <context context-type="linenumber">8</context> 2511 <context context-type="linenumber">7</context>
1387 </context-group> 2512 </context-group>
1388 </trans-unit> 2513 </trans-unit>
1389 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2514 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1390 <source>Video settings</source> 2515 <source>Video settings</source>
1391 <target>Ajustes de vídeo</target> 2516 <target>Ajustes de vídeo</target>
1392 <context-group name="null"> 2517 <context-group name="null">
1393 <context context-type="linenumber">15</context> 2518 <context context-type="linenumber">16</context>
1394 </context-group> 2519 </context-group>
1395 </trans-unit> 2520 </trans-unit>
1396 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2521 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1397 <source>Danger zone</source> 2522 <source>Danger zone</source>
1398 <target>Zona peligrosa</target> 2523 <target>Zona peligrosa</target>
1399 <context-group name="null"> 2524 <context-group name="null">
1400 <context context-type="linenumber">18</context> 2525 <context context-type="linenumber">19</context>
1401 </context-group> 2526 </context-group>
1402 </trans-unit> 2527 </trans-unit>
1403 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd"> 2528 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
1404 <source>Submit</source> 2529 <source>Change ownership</source>
1405 <target>Enviar</target> 2530 <target>Cambiar el titular</target>
1406 <context-group name="null"> 2531 <context-group name="null">
1407 <context context-type="linenumber">24</context> 2532 <context context-type="linenumber">46</context>
2533 </context-group>
2534 </trans-unit>
2535 <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
2536 <source>Select the next owner</source>
2537 <target>Seleccionar el próxima titular</target>
2538 <context-group name="null">
2539 <context context-type="linenumber">9</context>
2540 </context-group>
2541 </trans-unit>
2542 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
2543 <source>
2544 Cancel
2545 </source>
2546 <target>
2547 Cancelar
2548 </target>
2549 <context-group name="null">
2550 <context context-type="linenumber">35</context>
1408 </context-group> 2551 </context-group>
1409 </trans-unit> 2552 </trans-unit>
1410 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2553 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1414,6 +2557,13 @@ Iniciar sesión</target>
1414 <context context-type="linenumber">19</context> 2557 <context context-type="linenumber">19</context>
1415 </context-group> 2558 </context-group>
1416 </trans-unit> 2559 </trans-unit>
2560 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
2561 <source>Blacklisted</source>
2562 <target>Bloqueado</target>
2563 <context-group name="null">
2564 <context context-type="linenumber">22</context>
2565 </context-group>
2566 </trans-unit>
1417 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 2567 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
1418 <source> 2568 <source>
1419 Cancel 2569 Cancel
@@ -1445,6 +2595,13 @@ Cancelar</target>
1445 <context context-type="linenumber">6</context> 2595 <context context-type="linenumber">6</context>
1446 </context-group> 2596 </context-group>
1447 </trans-unit> 2597 </trans-unit>
2598 <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
2599 <source>Example: my_channel</source>
2600 <target>Por ejemplo: mi_canal</target>
2601 <context-group name="null">
2602 <context context-type="linenumber">15</context>
2603 </context-group>
2604 </trans-unit>
1448 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9"> 2605 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
1449 <source>Display name</source> 2606 <source>Display name</source>
1450 <target>Nombre a mostrar</target> 2607 <target>Nombre a mostrar</target>
@@ -1468,6 +2625,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1468 <context context-type="linenumber">8</context> 2625 <context context-type="linenumber">8</context>
1469 </context-group> 2626 </context-group>
1470 </trans-unit> 2627 </trans-unit>
2628 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2629 <source>You don't have any subscriptions yet.</source>
2630 <target>No tiene suscripciones todavía.</target>
2631 <context-group name="null">
2632 <context context-type="linenumber">1</context>
2633 </context-group>
2634 </trans-unit>
1471 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2635 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
1472 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2636 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
1473 <target>Creado por <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2637 <target>Creado por <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -1482,6 +2646,117 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1482 <context context-type="linenumber">16</context> 2646 <context context-type="linenumber">16</context>
1483 </context-group> 2647 </context-group>
1484 </trans-unit> 2648 </trans-unit>
2649 <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
2650 <source>Accept ownership</source>
2651 <target>Aceptar la titularidad</target>
2652 <context-group name="null">
2653 <context context-type="linenumber">3</context>
2654 </context-group>
2655 </trans-unit>
2656 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
2657 <source>Select the target channel</source>
2658 <target>Seleccionar el canal objetivo</target>
2659 <context-group name="null">
2660 <context context-type="linenumber">9</context>
2661 </context-group>
2662 </trans-unit>
2663 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2664 <source>Initiator</source>
2665 <target>Iniciador</target>
2666 <context-group name="null">
2667 <context context-type="linenumber">13</context>
2668 </context-group>
2669 </trans-unit>
2670 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2671 <source>
2672 Created
2673 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2674 </source>
2675 <target>
2676 Creado
2677 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2678 </target>
2679 <context-group name="null">
2680 <context context-type="linenumber">15</context>
2681 </context-group>
2682 </trans-unit>
2683 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
2684 <source>Status</source>
2685 <target>Estatus</target>
2686 <context-group name="null">
2687 <context context-type="linenumber">19</context>
2688 </context-group>
2689 </trans-unit>
2690 <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
2691 <source>Action</source>
2692 <target>Acción</target>
2693 <context-group name="null">
2694 <context context-type="linenumber">20</context>
2695 </context-group>
2696 </trans-unit>
2697 <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
2698 <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
2699 <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
2700 <context-group name="null">
2701 <context context-type="linenumber">39</context>
2702 </context-group>
2703 </trans-unit>
2704 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2705 <source>Refuse</source>
2706 <target>Rechazar</target>
2707 <context-group name="null">
2708 <context context-type="linenumber">47</context>
2709 </context-group>
2710 </trans-unit>
2711 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2712 <source>Muted instances</source>
2713 <target>Instancias silenciadas</target>
2714 <context-group name="null">
2715 <context context-type="linenumber">2</context>
2716 </context-group>
2717 </trans-unit>
2718 <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
2719 <source>History enabled</source>
2720 <target>Historial habilitado</target>
2721 <context-group name="null">
2722 <context context-type="linenumber">4</context>
2723 </context-group>
2724 </trans-unit>
2725 <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
2726 <source>Delete history</source>
2727 <target>Borrar el historial</target>
2728 <context-group name="null">
2729 <context context-type="linenumber">8</context>
2730 </context-group>
2731 </trans-unit>
2732 <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
2733 <source>You don't have videos history yet.</source>
2734 <target>No tiene historial de vídeos todavía</target>
2735 <context-group name="null">
2736 <context context-type="linenumber">13</context>
2737 </context-group>
2738 </trans-unit>
2739 <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
2740 <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2741 <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
2742 <context-group name="null">
2743 <context context-type="linenumber">22</context>
2744 </context-group>
2745 </trans-unit>
2746 <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
2747 <source>Notification preferences</source>
2748 <target>Preferencias de notificación</target>
2749 <context-group name="null">
2750 <context context-type="linenumber">2</context>
2751 </context-group>
2752 </trans-unit>
2753 <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
2754 <source>Mark all as read</source>
2755 <target>Marcar todo como leído</target>
2756 <context-group name="null">
2757 <context context-type="linenumber">4</context>
2758 </context-group>
2759 </trans-unit>
1485 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2760 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
1486 <source>Change password</source> 2761 <source>Change password</source>
1487 <target>Cambiar contraseña</target> 2762 <target>Cambiar contraseña</target>
@@ -1489,6 +2764,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1489 <context context-type="linenumber">30</context> 2764 <context context-type="linenumber">30</context>
1490 </context-group> 2765 </context-group>
1491 </trans-unit> 2766 </trans-unit>
2767 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2768 <source>Current password</source>
2769 <target>Contraseña actual</target>
2770 <context-group name="null">
2771 <context context-type="linenumber">7</context>
2772 </context-group>
2773 </trans-unit>
1492 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2774 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
1493 <source>New password</source> 2775 <source>New password</source>
1494 <target>Nueva contraseña</target> 2776 <target>Nueva contraseña</target>
@@ -1510,18 +2792,25 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1510 <context context-type="linenumber">3</context> 2792 <context context-type="linenumber">3</context>
1511 </context-group> 2793 </context-group>
1512 </trans-unit> 2794 </trans-unit>
2795 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2796 <source>Use WebTorrent to exchange parts of the video with others</source>
2797 <target>Usar WebTorrent para intercambiar partes del vídeo con otros</target>
2798 <context-group name="null">
2799 <context context-type="linenumber">21</context>
2800 </context-group>
2801 </trans-unit>
1513 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2802 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
1514 <source>Automatically plays video</source> 2803 <source>Automatically plays video</source>
1515 <target>Reproducir vídeo automáticamente</target> 2804 <target>Reproducir vídeo automáticamente</target>
1516 <context-group name="null"> 2805 <context-group name="null">
1517 <context context-type="linenumber">20</context> 2806 <context context-type="linenumber">28</context>
1518 </context-group> 2807 </context-group>
1519 </trans-unit> 2808 </trans-unit>
1520 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2809 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1521 <source>Save</source> 2810 <source>Save</source>
1522 <target>Guardar</target> 2811 <target>Guardar</target>
1523 <context-group name="null"> 2812 <context-group name="null">
1524 <context context-type="linenumber">23</context> 2813 <context context-type="linenumber">32</context>
1525 </context-group> 2814 </context-group>
1526 </trans-unit> 2815 </trans-unit>
1527 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2816 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1552,6 +2841,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1552 <context context-type="linenumber">18</context> 2841 <context context-type="linenumber">18</context>
1553 </context-group> 2842 </context-group>
1554 </trans-unit> 2843 </trans-unit>
2844 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2845 <source>Once you delete your account, there is no going back. Please be certain.</source>
2846 <target>Eliminar su cuenta es definitivo. ¿Está seguro?</target>
2847 <context-group name="null">
2848 <context context-type="linenumber">2</context>
2849 </context-group>
2850 </trans-unit>
1555 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2851 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
1556 <source>Delete your account</source> 2852 <source>Delete your account</source>
1557 <target>Eliminar tu cuenta</target> 2853 <target>Eliminar tu cuenta</target>
@@ -1559,6 +2855,20 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1559 <context context-type="linenumber">4</context> 2855 <context context-type="linenumber">4</context>
1560 </context-group> 2856 </context-group>
1561 </trans-unit> 2857 </trans-unit>
2858 <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
2859 <source>Activities</source>
2860 <target>Actividades</target>
2861 <context-group name="null">
2862 <context context-type="linenumber">2</context>
2863 </context-group>
2864 </trans-unit>
2865 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2866 <source>Web</source>
2867 <target>Web</target>
2868 <context-group name="null">
2869 <context context-type="linenumber">3</context>
2870 </context-group>
2871 </trans-unit>
1562 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2872 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
1563 <source> 2873 <source>
1564 Sorry, but we couldn't find the page you were looking for. 2874 Sorry, but we couldn't find the page you were looking for.
@@ -1570,6 +2880,60 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1570 <context context-type="linenumber">1</context> 2880 <context context-type="linenumber">1</context>
1571 </context-group> 2881 </context-group>
1572 </trans-unit> 2882 </trans-unit>
2883 <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
2884 <source>
2885 Verify account email confirmation
2886 </source>
2887 <target>
2888 Verificar la confirmación de la dirección de correo electrónico de la cuenta
2889 </target>
2890 <context-group name="null">
2891 <context context-type="linenumber">2</context>
2892 </context-group>
2893 </trans-unit>
2894 <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
2895 <source>
2896 Your email has been verified and you may now login. Redirecting...
2897 </source>
2898 <target>
2899 Su dirección de correo electrónico ha sido verificada y puede conectarse ahora. En curso de redirección...
2900 </target>
2901 <context-group name="null">
2902 <context context-type="linenumber">6</context>
2903 </context-group>
2904 </trans-unit>
2905 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
2906 <source>An error occurred. </source>
2907 <target>Un error ocurrió.</target>
2908 <context-group name="null">
2909 <context context-type="linenumber">11</context>
2910 </context-group>
2911 </trans-unit>
2912 <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
2913 <source>
2914 Request email for account verification
2915 </source>
2916 <target>
2917 Solicitar un correo electrónico de verificación de la cuenta
2918 </target>
2919 <context-group name="null">
2920 <context context-type="linenumber">2</context>
2921 </context-group>
2922 </trans-unit>
2923 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
2924 <source>Send verification email</source>
2925 <target>Enviar un correo electrónico de verificación</target>
2926 <context-group name="null">
2927 <context context-type="linenumber">17</context>
2928 </context-group>
2929 </trans-unit>
2930 <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
2931 <source>This instance does not require email verification.</source>
2932 <target>Esta instancia no requiere verificación por correo electrónico</target>
2933 <context-group name="null">
2934 <context context-type="linenumber">20</context>
2935 </context-group>
2936 </trans-unit>
1573 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8"> 2937 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
1574 <source>Support this channel</source> 2938 <source>Support this channel</source>
1575 <target>Apoyar este canal</target> 2939 <target>Apoyar este canal</target>
@@ -1612,6 +2976,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1612 <context context-type="linenumber">159</context> 2976 <context context-type="linenumber">159</context>
1613 </context-group> 2977 </context-group>
1614 </trans-unit> 2978 </trans-unit>
2979 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2980 <source>Sorry, but something went wrong</source>
2981 <target>Disculpas, algo salió mal</target>
2982 <context-group name="null">
2983 <context context-type="linenumber">49</context>
2984 </context-group>
2985 </trans-unit>
1615 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2986 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
1616 <source> 2987 <source>
1617 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2988 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -1620,7 +2991,7 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1620 Enhorabuena, el vídeo en <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> sera importado! Ya puedes añadir información sobre este vídeo. 2991 Enhorabuena, el vídeo en <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> sera importado! Ya puedes añadir información sobre este vídeo.
1621</target> 2992</target>
1622 <context-group name="null"> 2993 <context-group name="null">
1623 <context context-type="linenumber">40</context> 2994 <context context-type="linenumber">46</context>
1624 </context-group> 2995 </context-group>
1625 </trans-unit> 2996 </trans-unit>
1626 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2997 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -1637,18 +3008,25 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1637 <context context-type="linenumber">6</context> 3008 <context context-type="linenumber">6</context>
1638 </context-group> 3009 </context-group>
1639 </trans-unit> 3010 </trans-unit>
3011 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
3012 <source>Scheduled</source>
3013 <target>Programado</target>
3014 <context-group name="null">
3015 <context context-type="linenumber">25</context>
3016 </context-group>
3017 </trans-unit>
1640 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 3018 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
1641 <source>Publish will be available when upload is finished</source> 3019 <source>Publish will be available when upload is finished</source>
1642 <target>La publicación estará disponible cuando finalice la subida</target> 3020 <target>La publicación estará disponible cuando finalice la subida</target>
1643 <context-group name="null"> 3021 <context-group name="null">
1644 <context context-type="linenumber">48</context> 3022 <context context-type="linenumber">58</context>
1645 </context-group> 3023 </context-group>
1646 </trans-unit> 3024 </trans-unit>
1647 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 3025 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1648 <source>Publish</source> 3026 <source>Publish</source>
1649 <target>Publicar</target> 3027 <target>Publicar</target>
1650 <context-group name="null"> 3028 <context-group name="null">
1651 <context context-type="linenumber">55</context> 3029 <context context-type="linenumber">65</context>
1652 </context-group> 3030 </context-group>
1653 </trans-unit> 3031 </trans-unit>
1654 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 3032 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -1658,6 +3036,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1658 <context context-type="linenumber">6</context> 3036 <context context-type="linenumber">6</context>
1659 </context-group> 3037 </context-group>
1660 </trans-unit> 3038 </trans-unit>
3039 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
3040 <source>Or</source>
3041 <target>O</target>
3042 <context-group name="null">
3043 <context context-type="linenumber">11</context>
3044 </context-group>
3045 </trans-unit>
1661 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 3046 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
1662 <source>Paste magnet URI</source> 3047 <source>Paste magnet URI</source>
1663 <target>Pegar el enlace magnético</target> 3048 <target>Pegar el enlace magnético</target>
@@ -1680,7 +3065,7 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
1680Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir información sobre este vídeo. 3065Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir información sobre este vídeo.
1681</target> 3066</target>
1682 <context-group name="null"> 3067 <context-group name="null">
1683 <context context-type="linenumber">48</context> 3068 <context context-type="linenumber">53</context>
1684 </context-group> 3069 </context-group>
1685 </trans-unit> 3070 </trans-unit>
1686 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 3071 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -1732,6 +3117,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1732 <context context-type="linenumber">24</context> 3117 <context context-type="linenumber">24</context>
1733 </context-group> 3118 </context-group>
1734 </trans-unit> 3119 </trans-unit>
3120 <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
3121 <source>
3122 This will replace an existing caption!
3123 </source>
3124 <target>
3125 Eso remplazará el texto existente!
3126 </target>
3127 <context-group name="null">
3128 <context context-type="linenumber">29</context>
3129 </context-group>
3130 </trans-unit>
1735 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c"> 3131 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
1736 <source>Add this caption</source> 3132 <source>Add this caption</source>
1737 <target>Añadir este subtítulo</target> 3133 <target>Añadir este subtítulo</target>
@@ -1753,6 +3149,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1753 <context context-type="linenumber">191</context> 3149 <context context-type="linenumber">191</context>
1754 </context-group> 3150 </context-group>
1755 </trans-unit> 3151 </trans-unit>
3152 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
3153 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
3154 <target>Se puede utilizar etiquetas para sugerir recomendaciones relevantes.&lt;/br&gt;Presione Enter para añadir una nueva etiqueta.</target>
3155 <context-group name="null">
3156 <context context-type="linenumber">18</context>
3157 </context-group>
3158 </trans-unit>
3159 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
3160 <source>+ Tag</source>
3161 <target>+ Etiqueta</target>
3162 <context-group name="null">
3163 <context context-type="linenumber">21</context>
3164 </context-group>
3165 </trans-unit>
3166 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
3167 <source>Enter a new tag</source>
3168 <target>Ingresar una nueva etiqueta</target>
3169 <context-group name="null">
3170 <context context-type="linenumber">21</context>
3171 </context-group>
3172 </trans-unit>
1756 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 3173 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
1757 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 3174 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
1758 <target>Las descripciones de vídeo se muestran truncadas por defecto y requieren de acción manual para expandirlas.</target> 3175 <target>Las descripciones de vídeo se muestran truncadas por defecto y requieren de acción manual para expandirlas.</target>
@@ -1792,14 +3209,14 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1792 <source>Wait transcoding before publishing the video</source> 3209 <source>Wait transcoding before publishing the video</source>
1793 <target>Esperar transcodificación antes de publicar el vídeo</target> 3210 <target>Esperar transcodificación antes de publicar el vídeo</target>
1794 <context-group name="null"> 3211 <context-group name="null">
1795 <context context-type="linenumber">130</context> 3212 <context context-type="linenumber">131</context>
1796 </context-group> 3213 </context-group>
1797 </trans-unit> 3214 </trans-unit>
1798 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 3215 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
1799 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 3216 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
1800 <target>Si decides no esperar a la transcodificación antes de publicar el vídeo, quizás no se pueda reproducir hasta que finalice la transcodificación.</target> 3217 <target>Si decides no esperar a la transcodificación antes de publicar el vídeo, quizás no se pueda reproducir hasta que finalice la transcodificación.</target>
1801 <context-group name="null"> 3218 <context-group name="null">
1802 <context context-type="linenumber">131</context> 3219 <context context-type="linenumber">132</context>
1803 </context-group> 3220 </context-group>
1804 </trans-unit> 3221 </trans-unit>
1805 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 3222 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1813,49 +3230,81 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1813 <source>Add another caption</source> 3230 <source>Add another caption</source>
1814 <target>Añadir otro subtítulo</target> 3231 <target>Añadir otro subtítulo</target>
1815 <context-group name="null"> 3232 <context-group name="null">
1816 <context context-type="linenumber">146</context> 3233 <context context-type="linenumber">147</context>
1817 </context-group> 3234 </context-group>
1818 </trans-unit> 3235 </trans-unit>
1819 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 3236 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
1820 <source>See the subtitle file</source> 3237 <source>See the subtitle file</source>
1821 <target>Ver el archivo de subtítulo</target> 3238 <target>Ver el archivo de subtítulo</target>
1822 <context-group name="null"> 3239 <context-group name="null">
1823 <context context-type="linenumber">155</context> 3240 <context context-type="linenumber">156</context>
3241 </context-group>
3242 </trans-unit>
3243 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
3244 <source>Already uploaded ✔</source>
3245 <target>Ya ha sido subido ✔</target>
3246 <context-group name="null">
3247 <context context-type="linenumber">160</context>
3248 </context-group>
3249 </trans-unit>
3250 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
3251 <source>Will be created on update</source>
3252 <target>Estará creado al actualizar</target>
3253 <context-group name="null">
3254 <context context-type="linenumber">168</context>
1824 </context-group> 3255 </context-group>
1825 </trans-unit> 3256 </trans-unit>
1826 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 3257 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
1827 <source>Cancel create</source> 3258 <source>Cancel create</source>
1828 <target>Cancelar creación</target> 3259 <target>Cancelar creación</target>
1829 <context-group name="null"> 3260 <context-group name="null">
1830 <context context-type="linenumber">169</context> 3261 <context context-type="linenumber">170</context>
3262 </context-group>
3263 </trans-unit>
3264 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
3265 <source>Will be deleted on update</source>
3266 <target>Estará eliminado al actualizar</target>
3267 <context-group name="null">
3268 <context context-type="linenumber">176</context>
1831 </context-group> 3269 </context-group>
1832 </trans-unit> 3270 </trans-unit>
1833 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3271 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
1834 <source>Cancel deletion</source> 3272 <source>Cancel deletion</source>
1835 <target>Cancelar borrado</target> 3273 <target>Cancelar borrado</target>
1836 <context-group name="null"> 3274 <context-group name="null">
1837 <context context-type="linenumber">177</context> 3275 <context context-type="linenumber">178</context>
3276 </context-group>
3277 </trans-unit>
3278 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
3279 <source>
3280 No captions for now.
3281 </source>
3282 <target>
3283 Ningún texto por el momento.
3284 </target>
3285 <context-group name="null">
3286 <context context-type="linenumber">183</context>
1838 </context-group> 3287 </context-group>
1839 </trans-unit> 3288 </trans-unit>
1840 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3289 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
1841 <source>Captions</source> 3290 <source>Captions</source>
1842 <target>Subtítulos</target> 3291 <target>Subtítulos</target>
1843 <context-group name="null"> 3292 <context-group name="null">
1844 <context context-type="linenumber">139</context> 3293 <context context-type="linenumber">140</context>
1845 </context-group> 3294 </context-group>
1846 </trans-unit> 3295 </trans-unit>
1847 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3296 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
1848 <source>Upload thumbnail</source> 3297 <source>Upload thumbnail</source>
1849 <target>Subir miniatura</target> 3298 <target>Subir miniatura</target>
1850 <context-group name="null"> 3299 <context-group name="null">
1851 <context context-type="linenumber">195</context> 3300 <context context-type="linenumber">196</context>
1852 </context-group> 3301 </context-group>
1853 </trans-unit> 3302 </trans-unit>
1854 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3303 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1855 <source>Upload preview</source> 3304 <source>Upload preview</source>
1856 <target>Subir previsualización</target> 3305 <target>Subir previsualización</target>
1857 <context-group name="null"> 3306 <context-group name="null">
1858 <context context-type="linenumber">202</context> 3307 <context context-type="linenumber">203</context>
1859 </context-group> 3308 </context-group>
1860 </trans-unit> 3309 </trans-unit>
1861 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3310 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1869,14 +3318,14 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1869 <source>Short text to tell people how they can support you (membership platform...).</source> 3318 <source>Short text to tell people how they can support you (membership platform...).</source>
1870 <target>Breve texto para explicar a la gente cómo pueden apoyarte (plataforma de miembros...).</target> 3319 <target>Breve texto para explicar a la gente cómo pueden apoyarte (plataforma de miembros...).</target>
1871 <context-group name="null"> 3320 <context-group name="null">
1872 <context context-type="linenumber">209</context> 3321 <context context-type="linenumber">210</context>
1873 </context-group> 3322 </context-group>
1874 </trans-unit> 3323 </trans-unit>
1875 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3324 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1876 <source>Advanced settings</source> 3325 <source>Advanced settings</source>
1877 <target>Ajustes avanzados</target> 3326 <target>Ajustes avanzados</target>
1878 <context-group name="null"> 3327 <context-group name="null">
1879 <context context-type="linenumber">190</context> 3328 <context context-type="linenumber">191</context>
1880 </context-group> 3329 </context-group>
1881 </trans-unit> 3330 </trans-unit>
1882 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3331 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -1918,6 +3367,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1918 <context context-type="linenumber">37</context> 3367 <context context-type="linenumber">37</context>
1919 </context-group> 3368 </context-group>
1920 </trans-unit> 3369 </trans-unit>
3370 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
3371 <source>
3372 Cancel
3373 </source>
3374 <target>
3375 Cancelar
3376 </target>
3377 <context-group name="null">
3378 <context context-type="linenumber">47</context>
3379 </context-group>
3380 </trans-unit>
1921 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd"> 3381 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
1922 <source>Download</source> 3382 <source>Download</source>
1923 <target>Descargar</target> 3383 <target>Descargar</target>
@@ -1932,6 +3392,19 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1932 <context context-type="linenumber">3</context> 3392 <context context-type="linenumber">3</context>
1933 </context-group> 3393 </context-group>
1934 </trans-unit> 3394 </trans-unit>
3395 <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
3396 <source>
3397 Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3398 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> It will be forwarded to origin instance <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/> too.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
3399 </source>
3400 <target>
3401 Su reporte estará enviado a los moderadores de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3402 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> También estará transferido a la instancia original <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/>.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
3403 </target>
3404 <context-group name="null">
3405 <context context-type="linenumber">9</context>
3406 </context-group>
3407 </trans-unit>
1935 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3408 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
1936 <source>Share</source> 3409 <source>Share</source>
1937 <target>Compartir</target> 3410 <target>Compartir</target>
@@ -1953,6 +3426,31 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1953 <context context-type="linenumber">34</context> 3426 <context context-type="linenumber">34</context>
1954 </context-group> 3427 </context-group>
1955 </trans-unit> 3428 </trans-unit>
3429 <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
3430 <source>
3431 The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
3432 </source>
3433 <target>
3434 El URL no es seguro (no utiliza HTTPS), por lo que el vídeo embebido no funcionará en los sitios web HTTPS (los navegadores web bloquean las consultas HTTP inseguras en los sitios web HTTPS).
3435 </target>
3436 <context-group name="null">
3437 <context context-type="linenumber">45</context>
3438 </context-group>
3439 </trans-unit>
3440 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
3441 <source>Close</source>
3442 <target>Cerrar</target>
3443 <context-group name="null">
3444 <context context-type="linenumber">51</context>
3445 </context-group>
3446 </trans-unit>
3447 <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
3448 <source>Blacklist video</source>
3449 <target>Bloquear el vídeo</target>
3450 <context-group name="null">
3451 <context context-type="linenumber">3</context>
3452 </context-group>
3453 </trans-unit>
1956 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d"> 3454 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
1957 <source> 3455 <source>
1958 The video is being imported, it will be available when the import is finished. 3456 The video is being imported, it will be available when the import is finished.
@@ -1975,6 +3473,46 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
1975 <context context-type="linenumber">15</context> 3473 <context context-type="linenumber">15</context>
1976 </context-group> 3474 </context-group>
1977 </trans-unit> 3475 </trans-unit>
3476 <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
3477 <source>
3478 This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3479 </source>
3480 <target>
3481 Este vídeo será publicado el <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3482 </target>
3483 <context-group name="null">
3484 <context context-type="linenumber">19</context>
3485 </context-group>
3486 </trans-unit>
3487 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
3488 <source>This video is blacklisted.</source>
3489 <target>Este vídeo está bloqueado</target>
3490 <context-group name="null">
3491 <context context-type="linenumber">24</context>
3492 </context-group>
3493 </trans-unit>
3494 <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
3495 <source>
3496 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3497 </source>
3498 <target>
3499 Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
3500 </target>
3501 <context-group name="null">
3502 <context context-type="linenumber">37</context>
3503 </context-group>
3504 </trans-unit>
3505 <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
3506 <source>
3507 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3508 </source>
3509 <target>
3510 Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
3511 </target>
3512 <context-group name="null">
3513 <context context-type="linenumber">46</context>
3514 </context-group>
3515 </trans-unit>
1978 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced"> 3516 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
1979 <source>Like this video</source> 3517 <source>Like this video</source>
1980 <target>Me gusta este vídeo</target> 3518 <target>Me gusta este vídeo</target>
@@ -2038,6 +3576,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2038 <context context-type="linenumber">100</context> 3576 <context context-type="linenumber">100</context>
2039 </context-group> 3577 </context-group>
2040 </trans-unit> 3578 </trans-unit>
3579 <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
3580 <source>Unblacklist this video</source>
3581 <target>Desbloquear este vídeo</target>
3582 <context-group name="null">
3583 <context context-type="linenumber">99</context>
3584 </context-group>
3585 </trans-unit>
2041 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5"> 3586 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
2042 <source>Delete this video</source> 3587 <source>Delete this video</source>
2043 <target>Eliminar este vídeo</target> 3588 <target>Eliminar este vídeo</target>
@@ -2052,11 +3597,11 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2052 <context context-type="linenumber">123</context> 3597 <context context-type="linenumber">123</context>
2053 </context-group> 3598 </context-group>
2054 </trans-unit> 3599 </trans-unit>
2055 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c"> 3600 <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
2056 <source>Go to the account page</source> 3601 <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
2057 <target>Ir a la página de la cuenta</target> 3602 <target>Por <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
2058 <context-group name="null"> 3603 <context-group name="null">
2059 <context context-type="linenumber">133</context> 3604 <context context-type="linenumber">134</context>
2060 </context-group> 3605 </context-group>
2061 </trans-unit> 3606 </trans-unit>
2062 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3607 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
@@ -2073,6 +3618,24 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2073 <context context-type="linenumber">152</context> 3618 <context context-type="linenumber">152</context>
2074 </context-group> 3619 </context-group>
2075 </trans-unit> 3620 </trans-unit>
3621 <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
3622 <source>Friendly Reminder: </source>
3623 <target>Recuerdo amistoso:</target>
3624 <context-group name="null">
3625 <context context-type="linenumber">208</context>
3626 </context-group>
3627 </trans-unit>
3628 <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
3629 <source>
3630 the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
3631 </source>
3632 <target>
3633 el sistema utilizado para compartir este vídeo implica que algunas informaciones técnicas acerca de su sistema (como la dirección IP pública) pueden estar enviadas a otros pares.
3634 </target>
3635 <context-group name="null">
3636 <context context-type="linenumber">209</context>
3637 </context-group>
3638 </trans-unit>
2076 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e"> 3639 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
2077 <source>More information</source> 3640 <source>More information</source>
2078 <target>Más información</target> 3641 <target>Más información</target>
@@ -2098,6 +3661,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2098 <context context-type="linenumber">215</context> 3661 <context context-type="linenumber">215</context>
2099 </context-group> 3662 </context-group>
2100 </trans-unit> 3663 </trans-unit>
3664 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
3665 <source>
3666 Other videos
3667 </source>
3668 <target>
3669 Otros vídeos
3670 </target>
3671 <context-group name="null">
3672 <context context-type="linenumber">2</context>
3673 </context-group>
3674 </trans-unit>
2101 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7"> 3675 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
2102 <source> 3676 <source>
2103 Comments 3677 Comments
@@ -2109,25 +3683,18 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2109 <context context-type="linenumber">3</context> 3683 <context context-type="linenumber">3</context>
2110 </context-group> 3684 </context-group>
2111 </trans-unit> 3685 </trans-unit>
2112 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
2113 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
2114 <target>Puedes comentar bien a través de la página de tu nodo donde este vídeo está federado con tu cuenta de PeerTube, o bien a través de cualquier instancia del fediverso equipada con ActivityPub. Por ejemplo, con Mastodon o Pleroma puede escribir en la caja de búsqueda &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; y encontrar el vídeo. Estamos trabajando en la capacidad de comentar directamente en &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
2115 <context-group name="null">
2116 <context context-type="linenumber">8</context>
2117 </context-group>
2118 </trans-unit>
2119 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3686 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
2120 <source>No comments.</source> 3687 <source>No comments.</source>
2121 <target>No hay comentarios</target> 3688 <target>No hay comentarios</target>
2122 <context-group name="null"> 3689 <context-group name="null">
2123 <context context-type="linenumber">18</context> 3690 <context context-type="linenumber">17</context>
2124 </context-group> 3691 </context-group>
2125 </trans-unit> 3692 </trans-unit>
2126 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3693 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2127 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3694 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2128 <target>Ver las <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respuestas</target> 3695 <target>Ver las <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respuestas</target>
2129 <context-group name="null"> 3696 <context-group name="null">
2130 <context context-type="linenumber">55</context> 3697 <context context-type="linenumber">54</context>
2131 </context-group> 3698 </context-group>
2132 </trans-unit> 3699 </trans-unit>
2133 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3700 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2138,7 +3705,7 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2138 Los comentarios están inhabilitados. 3705 Los comentarios están inhabilitados.
2139 </target> 3706 </target>
2140 <context-group name="null"> 3707 <context-group name="null">
2141 <context context-type="linenumber">64</context> 3708 <context context-type="linenumber">63</context>
2142 </context-group> 3709 </context-group>
2143 </trans-unit> 3710 </trans-unit>
2144 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3711 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -2159,6 +3726,57 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2159 <context context-type="linenumber">20</context> 3726 <context context-type="linenumber">20</context>
2160 </context-group> 3727 </context-group>
2161 </trans-unit> 3728 </trans-unit>
3729 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3730 <source>You are one step away from commenting</source>
3731 <target>Está a un paso de poder comentar</target>
3732 <context-group name="null">
3733 <context context-type="linenumber">28</context>
3734 </context-group>
3735 </trans-unit>
3736 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3737 <source>
3738 If you have an account on this instance, you can login:
3739 </source>
3740 <target>
3741 Si tiene una cuenta en esta instancia, puede conectarse:
3742 </target>
3743 <context-group name="null">
3744 <context context-type="linenumber">32</context>
3745 </context-group>
3746 </trans-unit>
3747 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3748 <source>login to comment</source>
3749 <target>conectarse para comentar</target>
3750 <context-group name="null">
3751 <context context-type="linenumber">35</context>
3752 </context-group>
3753 </trans-unit>
3754 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3755 <source>
3756 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3757 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3758 from within the software's interface.
3759 </source>
3760 <target>
3761 Sino, puede comentar usando una cuenta de cualquier instancia compatible con ActivityPub.
3762 En la mayoría de las plataformas, puede encontrar el vídeo colocando su URL en el campo de búsqueda y luego comentarlo
3763 desde la interfaz del software.
3764 </target>
3765 <context-group name="null">
3766 <context context-type="linenumber">36</context>
3767 </context-group>
3768 </trans-unit>
3769 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3770 <source>
3771 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3772 </source>
3773 <target>
3774 Si tiene una cuenta en Mastodon o Pleroma, puede abrirlo directamente en su interfaz:
3775 </target>
3776 <context-group name="null">
3777 <context context-type="linenumber">41</context>
3778 </context-group>
3779 </trans-unit>
2162 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3780 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
2163 <source>Highlighted comment</source> 3781 <source>Highlighted comment</source>
2164 <target>Comentario resaltado</target> 3782 <target>Comentario resaltado</target>
@@ -2173,9 +3791,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2173 <context context-type="linenumber">14</context> 3791 <context context-type="linenumber">14</context>
2174 </context-group> 3792 </context-group>
2175 </trans-unit> 3793 </trans-unit>
2176 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08"> 3794 <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
2177 <source>Error getting about from server</source> 3795 <source>Cannot get about information from server</source>
2178 <target>Error al obtener información del servidor</target> 3796 <target>No se puede obtener información del servidor</target>
3797 <context-group name="null">
3798 <context context-type="linenumber">1</context>
3799 </context-group>
3800 </trans-unit>
3801 <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
3802 <source>Your message has been sent.</source>
3803 <target>Su mensaje ha sido remitido</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3808 <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
3809 <source>You already sent this form recently</source>
3810 <target>Ya envió este formulario recientemente</target>
2179 <context-group name="null"> 3811 <context-group name="null">
2180 <context context-type="linenumber">1</context> 3812 <context context-type="linenumber">1</context>
2181 </context-group> 3813 </context-group>
@@ -2201,51 +3833,44 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2201 <context context-type="linenumber">1</context> 3833 <context context-type="linenumber">1</context>
2202 </context-group> 3834 </context-group>
2203 </trans-unit> 3835 </trans-unit>
2204 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3836 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2205 <source>Error</source> 3837 <source>240p</source>
2206 <target>Error</target> 3838 <target>240p</target>
2207 <context-group name="null"> 3839 <context-group name="null">
2208 <context context-type="linenumber">1</context> 3840 <context context-type="linenumber">1</context>
2209 </context-group> 3841 </context-group>
2210 </trans-unit> 3842 </trans-unit>
2211 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed"> 3843 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
2212 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source> 3844 <source>360p</source>
2213 <target>Ajustaste de forma personalizada <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target> 3845 <target>360p</target>
2214 <context-group name="null"> 3846 <context-group name="null">
2215 <context context-type="linenumber">1</context> 3847 <context context-type="linenumber">1</context>
2216 </context-group> 3848 </context-group>
2217 </trans-unit> 3849 </trans-unit>
2218 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3850 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
2219 <source>This could lead to security issues or bugs if you do not understand it. </source> 3851 <source>480p</source>
2220 <target>Esto podría provocar problemas de seguridad o bugs si no lo entiendes. </target> 3852 <target>480p</target>
2221 <context-group name="null"> 3853 <context-group name="null">
2222 <context context-type="linenumber">1</context> 3854 <context context-type="linenumber">1</context>
2223 </context-group> 3855 </context-group>
2224 </trans-unit> 3856 </trans-unit>
2225 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3857 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
2226 <source>Are you sure you want to update the configuration?</source> 3858 <source>720p</source>
2227 <target>¿Estás seguro de que quieres actualizar la configuración?</target> 3859 <target>720p</target>
2228 <context-group name="null"> 3860 <context-group name="null">
2229 <context context-type="linenumber">1</context> 3861 <context context-type="linenumber">1</context>
2230 </context-group> 3862 </context-group>
2231 </trans-unit> 3863 </trans-unit>
2232 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3864 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
2233 <source>Please type</source> 3865 <source>1080p</source>
2234 <target>Por favor escribe</target> 3866 <target>1080p</target>
2235 <context-group name="null"> 3867 <context-group name="null">
2236 <context context-type="linenumber">1</context> 3868 <context context-type="linenumber">1</context>
2237 </context-group> 3869 </context-group>
2238 </trans-unit> 3870 </trans-unit>
2239 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3871 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
2240 <source>to confirm.</source> 3872 <source>Auto (via ffmpeg)</source>
2241 <target>para confirmar.</target> 3873 <target>Auto (vía ffmpeg)</target>
2242 <context-group name="null">
2243 <context context-type="linenumber">1</context>
2244 </context-group>
2245 </trans-unit>
2246 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2247 <source>Success</source>
2248 <target>Correcto</target>
2249 <context-group name="null"> 3874 <context-group name="null">
2250 <context context-type="linenumber">1</context> 3875 <context context-type="linenumber">1</context>
2251 </context-group> 3876 </context-group>
@@ -2264,6 +3889,69 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2264 <context context-type="linenumber">1</context> 3889 <context context-type="linenumber">1</context>
2265 </context-group> 3890 </context-group>
2266 </trans-unit> 3891 </trans-unit>
3892 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3893 <source>100MB</source>
3894 <target>100MB</target>
3895 <context-group name="null">
3896 <context context-type="linenumber">1</context>
3897 </context-group>
3898 </trans-unit>
3899 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3900 <source>500MB</source>
3901 <target>500MB</target>
3902 <context-group name="null">
3903 <context context-type="linenumber">1</context>
3904 </context-group>
3905 </trans-unit>
3906 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3907 <source>1GB</source>
3908 <target>1GB</target>
3909 <context-group name="null">
3910 <context context-type="linenumber">1</context>
3911 </context-group>
3912 </trans-unit>
3913 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3914 <source>5GB</source>
3915 <target>5GB</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3921 <source>20GB</source>
3922 <target>20GB</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3928 <source>50GB</source>
3929 <target>50GB</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3935 <source>10MB</source>
3936 <target>10MB</target>
3937 <context-group name="null">
3938 <context context-type="linenumber">1</context>
3939 </context-group>
3940 </trans-unit>
3941 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3942 <source>50MB</source>
3943 <target>50MB</target>
3944 <context-group name="null">
3945 <context context-type="linenumber">1</context>
3946 </context-group>
3947 </trans-unit>
3948 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3949 <source>2GB</source>
3950 <target>2GB</target>
3951 <context-group name="null">
3952 <context context-type="linenumber">1</context>
3953 </context-group>
3954 </trans-unit>
2267 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3955 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
2268 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3956 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
2269 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> no es válido</target> 3957 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> no es válido</target>
@@ -2327,6 +4015,97 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2327 <context context-type="linenumber">1</context> 4015 <context context-type="linenumber">1</context>
2328 </context-group> 4016 </context-group>
2329 </trans-unit> 4017 </trans-unit>
4018 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
4019 <source>enabled</source>
4020 <target>habilitada</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
4026 <source>disabled</source>
4027 <target>deshabilitada</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="1123807fc813c816404598147173403d00117557">
4033 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
4034 <target>La redundancia para <x id="INTERPOLATION" equiv-text="{{host}}"/> está <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
4035 <context-group name="null">
4036 <context context-type="linenumber">1</context>
4037 </context-group>
4038 </trans-unit>
4039 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
4040 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
4041 <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> no está silenciada por su instancia.</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
4047 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
4048 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> no está silenciada por su instancia.</target>
4049 <context-group name="null">
4050 <context context-type="linenumber">1</context>
4051 </context-group>
4052 </trans-unit>
4053 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
4054 <source>Comment updated.</source>
4055 <target>Comentario actualizado</target>
4056 <context-group name="null">
4057 <context context-type="linenumber">1</context>
4058 </context-group>
4059 </trans-unit>
4060 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
4061 <source>Delete this report</source>
4062 <target>Eliminar este reporte</target>
4063 <context-group name="null">
4064 <context context-type="linenumber">1</context>
4065 </context-group>
4066 </trans-unit>
4067 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
4068 <source>Update moderation comment</source>
4069 <target>Actualizar el comentario de moderación</target>
4070 <context-group name="null">
4071 <context context-type="linenumber">1</context>
4072 </context-group>
4073 </trans-unit>
4074 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
4075 <source>Mark as accepted</source>
4076 <target>Marcar como aceptado</target>
4077 <context-group name="null">
4078 <context context-type="linenumber">1</context>
4079 </context-group>
4080 </trans-unit>
4081 <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
4082 <source>Mark as rejected</source>
4083 <target>Marcar como rechazado</target>
4084 <context-group name="null">
4085 <context context-type="linenumber">1</context>
4086 </context-group>
4087 </trans-unit>
4088 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
4089 <source>Do you really want to delete this abuse report?</source>
4090 <target>¿Confirma la eliminación del reporte de abuso?</target>
4091 <context-group name="null">
4092 <context context-type="linenumber">1</context>
4093 </context-group>
4094 </trans-unit>
4095 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
4096 <source>Abuse deleted.</source>
4097 <target>Reporte de abuso eliminado.</target>
4098 <context-group name="null">
4099 <context context-type="linenumber">1</context>
4100 </context-group>
4101 </trans-unit>
4102 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
4103 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
4104 <target>¿Confirmar el desbloqueo de este vídeo? Estará disponible de nuevo en la lista de vídeos.</target>
4105 <context-group name="null">
4106 <context context-type="linenumber">1</context>
4107 </context-group>
4108 </trans-unit>
2330 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f"> 4109 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
2331 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source> 4110 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
2332 <target>Vídeo <x id="INTERPOLATION" equiv-text="{{name}}"/> eliminado de la lista negra.</target> 4111 <target>Vídeo <x id="INTERPOLATION" equiv-text="{{name}}"/> eliminado de la lista negra.</target>
@@ -2355,6 +4134,41 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2355 <context context-type="linenumber">1</context> 4134 <context context-type="linenumber">1</context>
2356 </context-group> 4135 </context-group>
2357 </trans-unit> 4136 </trans-unit>
4137 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
4138 <source>Unban</source>
4139 <target>Dejar sin efecto la expulsión</target>
4140 <context-group name="null">
4141 <context context-type="linenumber">1</context>
4142 </context-group>
4143 </trans-unit>
4144 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
4145 <source>Set Email as Verified</source>
4146 <target>Establecer la dirección de correo electrónico como Verificada</target>
4147 <context-group name="null">
4148 <context context-type="linenumber">1</context>
4149 </context-group>
4150 </trans-unit>
4151 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
4152 <source>You cannot ban root.</source>
4153 <target>No puede expulsar al root.</target>
4154 <context-group name="null">
4155 <context context-type="linenumber">1</context>
4156 </context-group>
4157 </trans-unit>
4158 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
4159 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
4160 <target>¿Confirma dejar sin efecto la expulsión de <x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios?</target>
4161 <context-group name="null">
4162 <context context-type="linenumber">1</context>
4163 </context-group>
4164 </trans-unit>
4165 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
4166 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
4167 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios expulsados.</target>
4168 <context-group name="null">
4169 <context context-type="linenumber">1</context>
4170 </context-group>
4171 </trans-unit>
2358 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 4172 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
2359 <source>You cannot delete root.</source> 4173 <source>You cannot delete root.</source>
2360 <target>No puedes eliminar al root.</target> 4174 <target>No puedes eliminar al root.</target>
@@ -2362,9 +4176,86 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2362 <context context-type="linenumber">1</context> 4176 <context context-type="linenumber">1</context>
2363 </context-group> 4177 </context-group>
2364 </trans-unit> 4178 </trans-unit>
2365 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 4179 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
2366 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 4180 <source>If you remove these users, you will not be able to create others with the same username!</source>
2367 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminado.</target> 4181 <target>¡Si elimina estos usuarios, no será posible crear otros con el mismo nombre de usuario!</target>
4182 <context-group name="null">
4183 <context context-type="linenumber">1</context>
4184 </context-group>
4185 </trans-unit>
4186 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
4187 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
4188 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios eliminados.</target>
4189 <context-group name="null">
4190 <context context-type="linenumber">1</context>
4191 </context-group>
4192 </trans-unit>
4193 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
4194 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
4195 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> direcciones de correo electrónico de usuarios establecidas como verificadas.</target>
4196 <context-group name="null">
4197 <context context-type="linenumber">1</context>
4198 </context-group>
4199 </trans-unit>
4200 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
4201 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
4202 <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no está silenciada.</target>
4203 <context-group name="null">
4204 <context context-type="linenumber">1</context>
4205 </context-group>
4206 </trans-unit>
4207 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
4208 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
4209 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no está silenciada.</target>
4210 <context-group name="null">
4211 <context context-type="linenumber">1</context>
4212 </context-group>
4213 </trans-unit>
4214 <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
4215 <source>My videos history</source>
4216 <target>Mi historial de vídeos</target>
4217 <context-group name="null">
4218 <context context-type="linenumber">1</context>
4219 </context-group>
4220 </trans-unit>
4221 <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
4222 <source>Videos history is enabled</source>
4223 <target>El historial de vídeos está habilitado</target>
4224 <context-group name="null">
4225 <context context-type="linenumber">1</context>
4226 </context-group>
4227 </trans-unit>
4228 <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
4229 <source>Videos history is disabled</source>
4230 <target>El historial de vídeos está deshabilitado</target>
4231 <context-group name="null">
4232 <context context-type="linenumber">1</context>
4233 </context-group>
4234 </trans-unit>
4235 <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
4236 <source>Delete videos history</source>
4237 <target>Eliminar el historial de vídeos</target>
4238 <context-group name="null">
4239 <context context-type="linenumber">1</context>
4240 </context-group>
4241 </trans-unit>
4242 <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
4243 <source>Are you sure you want to delete all your videos history?</source>
4244 <target>¿Confirma la eliminación de todo su historial de vídeos?</target>
4245 <context-group name="null">
4246 <context context-type="linenumber">1</context>
4247 </context-group>
4248 </trans-unit>
4249 <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
4250 <source>Videos history deleted</source>
4251 <target>Historial de vídeos eliminado</target>
4252 <context-group name="null">
4253 <context context-type="linenumber">1</context>
4254 </context-group>
4255 </trans-unit>
4256 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
4257 <source>Ownership accepted</source>
4258 <target>Titularidad aceptada</target>
2368 <context-group name="null"> 4259 <context-group name="null">
2369 <context context-type="linenumber">1</context> 4260 <context context-type="linenumber">1</context>
2370 </context-group> 4261 </context-group>
@@ -2376,6 +4267,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2376 <context context-type="linenumber">1</context> 4267 <context context-type="linenumber">1</context>
2377 </context-group> 4268 </context-group>
2378 </trans-unit> 4269 </trans-unit>
4270 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
4271 <source>You current password is invalid.</source>
4272 <target>Su contraseña actual es invalida.</target>
4273 <context-group name="null">
4274 <context context-type="linenumber">1</context>
4275 </context-group>
4276 </trans-unit>
2379 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 4277 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
2380 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 4278 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
2381 <target>Estás seguro de querer eliminar tu cuenta? Todos tus datos serán eliminados, incluyendo canales, vídeos, etc.</target> 4279 <target>Estás seguro de querer eliminar tu cuenta? Todos tus datos serán eliminados, incluyendo canales, vídeos, etc.</target>
@@ -2404,6 +4302,76 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2404 <context context-type="linenumber">1</context> 4302 <context context-type="linenumber">1</context>
2405 </context-group> 4303 </context-group>
2406 </trans-unit> 4304 </trans-unit>
4305 <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
4306 <source>New video from your subscriptions</source>
4307 <target>Nuevo vídeo desde sus suscripciones</target>
4308 <context-group name="null">
4309 <context context-type="linenumber">1</context>
4310 </context-group>
4311 </trans-unit>
4312 <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
4313 <source>New comment on your video</source>
4314 <target>Nuevo comentario en su vídeo</target>
4315 <context-group name="null">
4316 <context context-type="linenumber">1</context>
4317 </context-group>
4318 </trans-unit>
4319 <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
4320 <source>New video abuse on local video</source>
4321 <target>Nueva denuncia de abuso sobre un vídeo local</target>
4322 <context-group name="null">
4323 <context context-type="linenumber">1</context>
4324 </context-group>
4325 </trans-unit>
4326 <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
4327 <source>One of your video is blacklisted/unblacklisted</source>
4328 <target>Uno de sus vídeos ha sido bloqueado/desbloqueado</target>
4329 <context-group name="null">
4330 <context context-type="linenumber">1</context>
4331 </context-group>
4332 </trans-unit>
4333 <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
4334 <source>Video published (after transcoding/scheduled update)</source>
4335 <target>Vídeo publicado (después de una transcodificación / actualización programada)</target>
4336 <context-group name="null">
4337 <context context-type="linenumber">1</context>
4338 </context-group>
4339 </trans-unit>
4340 <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
4341 <source>Video import finished</source>
4342 <target>Importación de vídeo terminada</target>
4343 <context-group name="null">
4344 <context context-type="linenumber">1</context>
4345 </context-group>
4346 </trans-unit>
4347 <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
4348 <source>A new user registered on your instance</source>
4349 <target>Un nuevo usuario se registró en su instancia</target>
4350 <context-group name="null">
4351 <context context-type="linenumber">1</context>
4352 </context-group>
4353 </trans-unit>
4354 <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
4355 <source>You or your channel(s) has a new follower</source>
4356 <target>Usted o su(s) canal(es) tiene un nuevo seguidor</target>
4357 <context-group name="null">
4358 <context context-type="linenumber">1</context>
4359 </context-group>
4360 </trans-unit>
4361 <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
4362 <source>Someone mentioned you in video comments</source>
4363 <target>Alguien le mencionó en comentarios de vídeo</target>
4364 <context-group name="null">
4365 <context context-type="linenumber">1</context>
4366 </context-group>
4367 </trans-unit>
4368 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
4369 <source>Preferences saved</source>
4370 <target>Preferencias guardadas</target>
4371 <context-group name="null">
4372 <context context-type="linenumber">1</context>
4373 </context-group>
4374 </trans-unit>
2407 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 4375 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
2408 <source>Profile updated.</source> 4376 <source>Profile updated.</source>
2409 <target>Perfil actualizado.</target> 4377 <target>Perfil actualizado.</target>
@@ -2432,6 +4400,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2432 <context context-type="linenumber">1</context> 4400 <context context-type="linenumber">1</context>
2433 </context-group> 4401 </context-group>
2434 </trans-unit> 4402 </trans-unit>
4403 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
4404 <source>This name already exists on this instance.</source>
4405 <target>El nombre ya existe en esta instancia.</target>
4406 <context-group name="null">
4407 <context context-type="linenumber">1</context>
4408 </context-group>
4409 </trans-unit>
2435 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 4410 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
2436 <source>Create</source> 4411 <source>Create</source>
2437 <target>Crear</target> 4412 <target>Crear</target>
@@ -2446,23 +4421,16 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2446 <context context-type="linenumber">1</context> 4421 <context context-type="linenumber">1</context>
2447 </context-group> 4422 </context-group>
2448 </trans-unit> 4423 </trans-unit>
2449 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4424 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2450 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4425 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2451 <target>¿De verdad quieres eliminar <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Esto eliminará también todos los vídeos subidos a este canal.</target> 4426 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target>
2452 <context-group name="null">
2453 <context context-type="linenumber">1</context>
2454 </context-group>
2455 </trans-unit>
2456 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2457 <source>Please type the name of the video channel to confirm</source>
2458 <target>Por favor escribe el nombre del canal de vídeo para confirmar</target>
2459 <context-group name="null"> 4427 <context-group name="null">
2460 <context context-type="linenumber">1</context> 4428 <context context-type="linenumber">1</context>
2461 </context-group> 4429 </context-group>
2462 </trans-unit> 4430 </trans-unit>
2463 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4431 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2464 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4432 <source>My videos</source>
2465 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target> 4433 <target>Mis vídeos</target>
2466 <context-group name="null"> 4434 <context-group name="null">
2467 <context context-type="linenumber">1</context> 4435 <context context-type="linenumber">1</context>
2468 </context-group> 4436 </context-group>
@@ -2530,6 +4498,76 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2530 <context context-type="linenumber">1</context> 4498 <context context-type="linenumber">1</context>
2531 </context-group> 4499 </context-group>
2532 </trans-unit> 4500 </trans-unit>
4501 <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
4502 <source>Ownership change request sent.</source>
4503 <target>Solicitud de cambio de titularidad enviada.</target>
4504 <context-group name="null">
4505 <context context-type="linenumber">1</context>
4506 </context-group>
4507 </trans-unit>
4508 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4509 <source>My library</source>
4510 <target>Mi biblioteca</target>
4511 <context-group name="null">
4512 <context context-type="linenumber">1</context>
4513 </context-group>
4514 </trans-unit>
4515 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4516 <source>My channels</source>
4517 <target>Mis canales</target>
4518 <context-group name="null">
4519 <context context-type="linenumber">1</context>
4520 </context-group>
4521 </trans-unit>
4522 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4523 <source>My subscriptions</source>
4524 <target>Mis suscripciones</target>
4525 <context-group name="null">
4526 <context context-type="linenumber">1</context>
4527 </context-group>
4528 </trans-unit>
4529 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4530 <source>My history</source>
4531 <target>Mi historial</target>
4532 <context-group name="null">
4533 <context context-type="linenumber">1</context>
4534 </context-group>
4535 </trans-unit>
4536 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4537 <source>Misc</source>
4538 <target>Diversos</target>
4539 <context-group name="null">
4540 <context context-type="linenumber">1</context>
4541 </context-group>
4542 </trans-unit>
4543 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4544 <source>Ownership changes</source>
4545 <target>Cambios de titularidad</target>
4546 <context-group name="null">
4547 <context context-type="linenumber">1</context>
4548 </context-group>
4549 </trans-unit>
4550 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
4551 <source>My settings</source>
4552 <target>Mis ajustes</target>
4553 <context-group name="null">
4554 <context context-type="linenumber">1</context>
4555 </context-group>
4556 </trans-unit>
4557 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
4558 <source>My notifications</source>
4559 <target>Mis notificaciones</target>
4560 <context-group name="null">
4561 <context context-type="linenumber">1</context>
4562 </context-group>
4563 </trans-unit>
4564 <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
4565 <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
4566 <target>Un correo electrónico con un vínculo de verificación será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
4567 <context-group name="null">
4568 <context context-type="linenumber">1</context>
4569 </context-group>
4570 </trans-unit>
2533 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 4571 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2534 <source>Unable to find user id or verification string.</source> 4572 <source>Unable to find user id or verification string.</source>
2535 <target>No se pudo encontrar el id de usuario o la cadena de verificación.</target> 4573 <target>No se pudo encontrar el id de usuario o la cadena de verificación.</target>
@@ -2537,6 +4575,97 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2537 <context context-type="linenumber">1</context> 4575 <context context-type="linenumber">1</context>
2538 </context-group> 4576 </context-group>
2539 </trans-unit> 4577 </trans-unit>
4578 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4579 <source>Subscribe to the account</source>
4580 <target>Suscribirse a la cuenta</target>
4581 <context-group name="null">
4582 <context context-type="linenumber">1</context>
4583 </context-group>
4584 </trans-unit>
4585 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4586 <source>Focus the search bar</source>
4587 <target>Enfocar la barra de búsqueda</target>
4588 <context-group name="null">
4589 <context context-type="linenumber">1</context>
4590 </context-group>
4591 </trans-unit>
4592 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4593 <source>Toggle the left menu</source>
4594 <target>Conmutar el menú de la izquierda</target>
4595 <context-group name="null">
4596 <context context-type="linenumber">1</context>
4597 </context-group>
4598 </trans-unit>
4599 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4600 <source>Go to the videos overview page</source>
4601 <target>Ir a la página general de vídeos</target>
4602 <context-group name="null">
4603 <context context-type="linenumber">1</context>
4604 </context-group>
4605 </trans-unit>
4606 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4607 <source>Go to the trending videos page</source>
4608 <target>Ir a la página de vídeos populares</target>
4609 <context-group name="null">
4610 <context context-type="linenumber">1</context>
4611 </context-group>
4612 </trans-unit>
4613 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4614 <source>Go to the recently added videos page</source>
4615 <target>Ir a la página de vídeos recientes</target>
4616 <context-group name="null">
4617 <context context-type="linenumber">1</context>
4618 </context-group>
4619 </trans-unit>
4620 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4621 <source>Go to the local videos page</source>
4622 <target>Ir a la página de vídeos locales</target>
4623 <context-group name="null">
4624 <context context-type="linenumber">1</context>
4625 </context-group>
4626 </trans-unit>
4627 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4628 <source>Go to the videos upload page</source>
4629 <target>Ir a la página de subida de vídeos</target>
4630 <context-group name="null">
4631 <context context-type="linenumber">1</context>
4632 </context-group>
4633 </trans-unit>
4634 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4635 <source>Toggle Dark theme</source>
4636 <target>Conmutar el tema Oscuro</target>
4637 <context-group name="null">
4638 <context context-type="linenumber">1</context>
4639 </context-group>
4640 </trans-unit>
4641 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4642 <source>Go to my subscriptions</source>
4643 <target>Ir a mis suscripciones</target>
4644 <context-group name="null">
4645 <context context-type="linenumber">1</context>
4646 </context-group>
4647 </trans-unit>
4648 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4649 <source>Go to my videos</source>
4650 <target>Ir a mis vídeos</target>
4651 <context-group name="null">
4652 <context context-type="linenumber">1</context>
4653 </context-group>
4654 </trans-unit>
4655 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4656 <source>Go to my imports</source>
4657 <target>Ir a mis importaciones</target>
4658 <context-group name="null">
4659 <context context-type="linenumber">1</context>
4660 </context-group>
4661 </trans-unit>
4662 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4663 <source>Go to my channels</source>
4664 <target>Ir a mis canales</target>
4665 <context-group name="null">
4666 <context context-type="linenumber">1</context>
4667 </context-group>
4668 </trans-unit>
2540 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4669 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
2541 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4670 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
2542</source> 4671</source>
@@ -2553,6 +4682,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2553 <context context-type="linenumber">1</context> 4682 <context context-type="linenumber">1</context>
2554 </context-group> 4683 </context-group>
2555 </trans-unit> 4684 </trans-unit>
4685 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4686 <source>Error</source>
4687 <target>Error</target>
4688 <context-group name="null">
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
2556 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4692 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2557 <source>You need to reconnect.</source> 4693 <source>You need to reconnect.</source>
2558 <target>Tienes que reconectar.</target> 4694 <target>Tienes que reconectar.</target>
@@ -2567,6 +4703,41 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2567 <context context-type="linenumber">1</context> 4703 <context context-type="linenumber">1</context>
2568 </context-group> 4704 </context-group>
2569 </trans-unit> 4705 </trans-unit>
4706 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4707 <source>Keyboard Shortcuts:</source>
4708 <target>Atajos de teclado:</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4714 <source>Info</source>
4715 <target>Info</target>
4716 <context-group name="null">
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4721 <source>Success</source>
4722 <target>Correcto</target>
4723 <context-group name="null">
4724 <context context-type="linenumber">1</context>
4725 </context-group>
4726 </trans-unit>
4727 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4728 <source>Incorrect username or password.</source>
4729 <target>Nombre de usuario o contraseña incorrecta</target>
4730 <context-group name="null">
4731 <context context-type="linenumber">1</context>
4732 </context-group>
4733 </trans-unit>
4734 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
4735 <source>You account is blocked.</source>
4736 <target>Su cuenta ha sido bloqueada</target>
4737 <context-group name="null">
4738 <context context-type="linenumber">1</context>
4739 </context-group>
4740 </trans-unit>
2570 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1"> 4741 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
2571 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source> 4742 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
2572 <target>Un correo con las instrucciones para restablecer la contraseña será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target> 4743 <target>Un correo con las instrucciones para restablecer la contraseña será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
@@ -2763,6 +4934,69 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2763 <context context-type="linenumber">1</context> 4934 <context context-type="linenumber">1</context>
2764 </context-group> 4935 </context-group>
2765 </trans-unit> 4936 </trans-unit>
4937 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
4938 <source>Transcoding threads must be greater or equal to 0.</source>
4939 <target>El número de subprocesos de transcodificación tiene que ser superior o igual a 0.</target>
4940 <context-group name="null">
4941 <context context-type="linenumber">1</context>
4942 </context-group>
4943 </trans-unit>
4944 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4945 <source>Email is required.</source>
4946 <target>Se requiere un correo electrónico.</target>
4947 <context-group name="null">
4948 <context context-type="linenumber">1</context>
4949 </context-group>
4950 </trans-unit>
4951 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4952 <source>Email must be valid.</source>
4953 <target>El correo electrónico ha de ser válido.</target>
4954 <context-group name="null">
4955 <context context-type="linenumber">1</context>
4956 </context-group>
4957 </trans-unit>
4958 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
4959 <source>Your name is required.</source>
4960 <target>Su nombre es requerido.</target>
4961 <context-group name="null">
4962 <context context-type="linenumber">1</context>
4963 </context-group>
4964 </trans-unit>
4965 <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
4966 <source>Your name must be at least 1 character long.</source>
4967 <target>Su nombre tiene que contener por lo menos 1 carácter.</target>
4968 <context-group name="null">
4969 <context context-type="linenumber">1</context>
4970 </context-group>
4971 </trans-unit>
4972 <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
4973 <source>Your name cannot be more than 120 characters long.</source>
4974 <target>Su nombre no puede contener más de 120 caracteres.</target>
4975 <context-group name="null">
4976 <context context-type="linenumber">1</context>
4977 </context-group>
4978 </trans-unit>
4979 <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
4980 <source>A message is required.</source>
4981 <target>Se tiene que colocar un mensaje.</target>
4982 <context-group name="null">
4983 <context context-type="linenumber">1</context>
4984 </context-group>
4985 </trans-unit>
4986 <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
4987 <source>The message must be at least 3 characters long.</source>
4988 <target>El mensaje tiene que contener por lo menos 3 caracteres.</target>
4989 <context-group name="null">
4990 <context context-type="linenumber">1</context>
4991 </context-group>
4992 </trans-unit>
4993 <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
4994 <source>The message cannot be more than 5000 characters long.</source>
4995 <target>El mensaje no puede contener más de 5.000 caracteres.</target>
4996 <context-group name="null">
4997 <context context-type="linenumber">1</context>
4998 </context-group>
4999 </trans-unit>
2766 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 5000 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2767 <source>Username is required.</source> 5001 <source>Username is required.</source>
2768 <target>Se requiere un nombre de usuario.</target> 5002 <target>Se requiere un nombre de usuario.</target>
@@ -2784,37 +5018,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2784 <context context-type="linenumber">1</context> 5018 <context context-type="linenumber">1</context>
2785 </context-group> 5019 </context-group>
2786 </trans-unit> 5020 </trans-unit>
2787 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 5021 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
2788 <source>Username must be at least 3 characters long.</source> 5022 <source>Username must be at least 1 character long.</source>
2789 <target>El nombre de usuario ha de ocupar más de 3 caracteres.</target> 5023 <target>El nombre de usuario tiene que contener por lo menos un carácter.</target>
2790 <context-group name="null">
2791 <context context-type="linenumber">1</context>
2792 </context-group>
2793 </trans-unit>
2794 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2795 <source>Username cannot be more than 20 characters long.</source>
2796 <target>El nombre de usuario no puede ocupar más de 20 caracteres.</target>
2797 <context-group name="null"> 5024 <context-group name="null">
2798 <context context-type="linenumber">1</context> 5025 <context context-type="linenumber">1</context>
2799 </context-group> 5026 </context-group>
2800 </trans-unit> 5027 </trans-unit>
2801 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9"> 5028 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
2802 <source>Username should be only lowercase alphanumeric characters.</source> 5029 <source>Username cannot be more than 50 characters long.</source>
2803 <target>El nombre de usuario debe utilizar únicamente caracteres alfanuméricos en minúscula.</target> 5030 <target>El nombre de usuario no puede contener más de 50 caracteres.</target>
2804 <context-group name="null"> 5031 <context-group name="null">
2805 <context context-type="linenumber">1</context> 5032 <context context-type="linenumber">1</context>
2806 </context-group> 5033 </context-group>
2807 </trans-unit> 5034 </trans-unit>
2808 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 5035 <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
2809 <source>Email is required.</source> 5036 <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
2810 <target>Se requiere un correo electrónico.</target> 5037 <target>El nombre de usuario puede contener minúsculas, cifras, puntos y barras bajas.</target>
2811 <context-group name="null">
2812 <context context-type="linenumber">1</context>
2813 </context-group>
2814 </trans-unit>
2815 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2816 <source>Email must be valid.</source>
2817 <target>El correo electrónico ha de ser válido.</target>
2818 <context-group name="null"> 5038 <context-group name="null">
2819 <context context-type="linenumber">1</context> 5039 <context context-type="linenumber">1</context>
2820 </context-group> 5040 </context-group>
@@ -2854,6 +5074,20 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2854 <context context-type="linenumber">1</context> 5074 <context context-type="linenumber">1</context>
2855 </context-group> 5075 </context-group>
2856 </trans-unit> 5076 </trans-unit>
5077 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
5078 <source>Daily upload limit is required.</source>
5079 <target>Se requiere colocar un límite diario de subida.</target>
5080 <context-group name="null">
5081 <context context-type="linenumber">1</context>
5082 </context-group>
5083 </trans-unit>
5084 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
5085 <source>Daily upload limit must be greater than -1.</source>
5086 <target>El límite diario de subida tiene que ser superior a -1.</target>
5087 <context-group name="null">
5088 <context context-type="linenumber">1</context>
5089 </context-group>
5090 </trans-unit>
2857 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85"> 5091 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
2858 <source>User role is required.</source> 5092 <source>User role is required.</source>
2859 <target>Se requiere un rol de usuario.</target> 5093 <target>Se requiere un rol de usuario.</target>
@@ -2868,16 +5102,16 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2868 <context context-type="linenumber">1</context> 5102 <context context-type="linenumber">1</context>
2869 </context-group> 5103 </context-group>
2870 </trans-unit> 5104 </trans-unit>
2871 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5105 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
2872 <source>Display name must be at least 3 characters long.</source> 5106 <source>Display name must be at least 1 character long.</source>
2873 <target>El nombre para mostrar debe ocupar como mínimo 3 caracteres.</target> 5107 <target>El nombre mostrado tiene que contener por lo menos 1 carácter.</target>
2874 <context-group name="null"> 5108 <context-group name="null">
2875 <context context-type="linenumber">1</context> 5109 <context context-type="linenumber">1</context>
2876 </context-group> 5110 </context-group>
2877 </trans-unit> 5111 </trans-unit>
2878 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5112 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
2879 <source>Display name cannot be more than 120 characters long.</source> 5113 <source>Display name cannot be more than 50 characters long.</source>
2880 <target>El nombre a mostrar no puede ocupar más de 120 caracteres.</target> 5114 <target>El nombre mostrado no puede contener más de 50 caracteres.</target>
2881 <context-group name="null"> 5115 <context-group name="null">
2882 <context context-type="linenumber">1</context> 5116 <context context-type="linenumber">1</context>
2883 </context-group> 5117 </context-group>
@@ -2889,9 +5123,9 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2889 <context context-type="linenumber">1</context> 5123 <context context-type="linenumber">1</context>
2890 </context-group> 5124 </context-group>
2891 </trans-unit> 5125 </trans-unit>
2892 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 5126 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
2893 <source>Description cannot be more than 250 characters long.</source> 5127 <source>Description cannot be more than 1000 characters long.</source>
2894 <target>La descripción no puede ocupar más de 250 caracteres.</target> 5128 <target>La descripción no puede contener más de 1.000 caracteres.</target>
2895 <context-group name="null"> 5129 <context-group name="null">
2896 <context context-type="linenumber">1</context> 5130 <context context-type="linenumber">1</context>
2897 </context-group> 5131 </context-group>
@@ -2903,6 +5137,20 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2903 <context context-type="linenumber">1</context> 5137 <context context-type="linenumber">1</context>
2904 </context-group> 5138 </context-group>
2905 </trans-unit> 5139 </trans-unit>
5140 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
5141 <source>Ban reason must be at least 3 characters long.</source>
5142 <target>La razón de la expulsión tiene que contener por lo menos 3 caracteres.</target>
5143 <context-group name="null">
5144 <context context-type="linenumber">1</context>
5145 </context-group>
5146 </trans-unit>
5147 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
5148 <source>Ban reason cannot be more than 250 characters long.</source>
5149 <target>La razón de la expulsión no puede contener más de 250 caracteres.</target>
5150 <context-group name="null">
5151 <context context-type="linenumber">1</context>
5152 </context-group>
5153 </trans-unit>
2906 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 5154 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
2907 <source>Report reason is required.</source> 5155 <source>Report reason is required.</source>
2908 <target>Se requiere un motivo para reportar.</target> 5156 <target>Se requiere un motivo para reportar.</target>
@@ -2917,9 +5165,37 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2917 <context context-type="linenumber">1</context> 5165 <context context-type="linenumber">1</context>
2918 </context-group> 5166 </context-group>
2919 </trans-unit> 5167 </trans-unit>
2920 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9"> 5168 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
2921 <source>Report reason cannot be more than 300 characters long.</source> 5169 <source>Moderation comment is required.</source>
2922 <target>El motivo del reporte no puede ocupar más de 300 caracteres.</target> 5170 <target>Se requiere llenar el comentario de moderación.</target>
5171 <context-group name="null">
5172 <context context-type="linenumber">1</context>
5173 </context-group>
5174 </trans-unit>
5175 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
5176 <source>Moderation comment must be at least 2 characters long.</source>
5177 <target>El comentario de moderación tiene que contener por lo menos 2 caracteres.</target>
5178 <context-group name="null">
5179 <context context-type="linenumber">1</context>
5180 </context-group>
5181 </trans-unit>
5182 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
5183 <source>The channel is required.</source>
5184 <target>Se requiere llenar el canal.</target>
5185 <context-group name="null">
5186 <context context-type="linenumber">1</context>
5187 </context-group>
5188 </trans-unit>
5189 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
5190 <source>Blacklist reason must be at least 2 characters long.</source>
5191 <target>La razón del bloqueo tiene que contener por lo menos 2 caracteres.</target>
5192 <context-group name="null">
5193 <context context-type="linenumber">1</context>
5194 </context-group>
5195 </trans-unit>
5196 <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
5197 <source>Blacklist reason cannot be more than 300 characters long.</source>
5198 <target>La razón del bloqueo no puede contener más de 300 caracteres.</target>
2923 <context-group name="null"> 5199 <context-group name="null">
2924 <context context-type="linenumber">1</context> 5200 <context context-type="linenumber">1</context>
2925 </context-group> 5201 </context-group>
@@ -2938,9 +5214,44 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2938 <context context-type="linenumber">1</context> 5214 <context context-type="linenumber">1</context>
2939 </context-group> 5215 </context-group>
2940 </trans-unit> 5216 </trans-unit>
2941 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 5217 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
2942 <source>Description cannot be more than 500 characters long.</source> 5218 <source>The username is required.</source>
2943 <target>La descripción no puede ocupar más de 500 caracteres.</target> 5219 <target>Se requiere llenar el nombre de usuario.</target>
5220 <context-group name="null">
5221 <context context-type="linenumber">1</context>
5222 </context-group>
5223 </trans-unit>
5224 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
5225 <source>You can only transfer ownership to a local account</source>
5226 <target>Solo puede transferir la titularidad a una cuenta local</target>
5227 <context-group name="null">
5228 <context context-type="linenumber">1</context>
5229 </context-group>
5230 </trans-unit>
5231 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
5232 <source>Name is required.</source>
5233 <target>Se requiere llenar el nombre.</target>
5234 <context-group name="null">
5235 <context context-type="linenumber">1</context>
5236 </context-group>
5237 </trans-unit>
5238 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
5239 <source>Name must be at least 1 character long.</source>
5240 <target>El nombre tiene que contener por lo menos 1 carácter.</target>
5241 <context-group name="null">
5242 <context context-type="linenumber">1</context>
5243 </context-group>
5244 </trans-unit>
5245 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
5246 <source>Name cannot be more than 50 characters long.</source>
5247 <target>El nombre no puede contener más de 50 caracteres.</target>
5248 <context-group name="null">
5249 <context context-type="linenumber">1</context>
5250 </context-group>
5251 </trans-unit>
5252 <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
5253 <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
5254 <target>El nombre puede contener minúsculas, cifras, puntos y barras bajas.</target>
2944 <context-group name="null"> 5255 <context-group name="null">
2945 <context context-type="linenumber">1</context> 5256 <context context-type="linenumber">1</context>
2946 </context-group> 5257 </context-group>
@@ -2952,9 +5263,9 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2952 <context context-type="linenumber">1</context> 5263 <context context-type="linenumber">1</context>
2953 </context-group> 5264 </context-group>
2954 </trans-unit> 5265 </trans-unit>
2955 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 5266 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
2956 <source>Support text cannot be more than 500 characters long.</source> 5267 <source>Support text cannot be more than 1000 characters long.</source>
2957 <target>El texto para el apoyo no puede ocupar más de 500 caracteres.</target> 5268 <target>El texto de apoyo no puede contener más de 1.000 caracteres.</target>
2958 <context-group name="null"> 5269 <context-group name="null">
2959 <context context-type="linenumber">1</context> 5270 <context context-type="linenumber">1</context>
2960 </context-group> 5271 </context-group>
@@ -3050,9 +5361,9 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3050 <context context-type="linenumber">1</context> 5361 <context context-type="linenumber">1</context>
3051 </context-group> 5362 </context-group>
3052 </trans-unit> 5363 </trans-unit>
3053 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 5364 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
3054 <source>Video support cannot be more than 500 characters long.</source> 5365 <source>Video support cannot be more than 1000 characters long.</source>
3055 <target>El apoyo para el vídeo no puede ocupar más de 500 caracteres.</target> 5366 <target>El soporte de vídeo no puede contener más de 1.000 caracteres.</target>
3056 <context-group name="null"> 5367 <context-group name="null">
3057 <context context-type="linenumber">1</context> 5368 <context context-type="linenumber">1</context>
3058 </context-group> 5369 </context-group>
@@ -3407,6 +5718,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3407 <context context-type="linenumber">1</context> 5718 <context context-type="linenumber">1</context>
3408 </context-group> 5719 </context-group>
3409 </trans-unit> 5720 </trans-unit>
5721 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
5722 <source>Transcode your videos in multiple resolutions</source>
5723 <target>Transcodificar sus vídeos en múltiples resoluciones</target>
5724 <context-group name="null">
5725 <context context-type="linenumber">1</context>
5726 </context-group>
5727 </trans-unit>
5728 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
5729 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
5730 <target>Importación HTTP (YouTube, Vimeo, URL directo...)</target>
5731 <context-group name="null">
5732 <context context-type="linenumber">1</context>
5733 </context-group>
5734 </trans-unit>
5735 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
5736 <source>Torrent import</source>
5737 <target>Importación de torrent</target>
5738 <context-group name="null">
5739 <context context-type="linenumber">1</context>
5740 </context-group>
5741 </trans-unit>
3410 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba"> 5742 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
3411 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source> 5743 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
3412 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target> 5744 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
@@ -3561,6 +5893,153 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3561 <context context-type="linenumber">1</context> 5893 <context context-type="linenumber">1</context>
3562 </context-group> 5894 </context-group>
3563 </trans-unit> 5895 </trans-unit>
5896 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5897 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5898 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios bloqueados.</target>
5899 <context-group name="null">
5900 <context context-type="linenumber">1</context>
5901 </context-group>
5902 </trans-unit>
5903 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5904 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5905 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> bloqueado.</target>
5906 <context-group name="null">
5907 <context context-type="linenumber">1</context>
5908 </context-group>
5909 </trans-unit>
5910 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5911 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5912 <target>¿Confirma el desbloqueo de <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
5913 <context-group name="null">
5914 <context context-type="linenumber">1</context>
5915 </context-group>
5916 </trans-unit>
5917 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5918 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5919 <target>El usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> ha sido desbloqueado.</target>
5920 <context-group name="null">
5921 <context context-type="linenumber">1</context>
5922 </context-group>
5923 </trans-unit>
5924 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5925 <source>If you remove this user, you will not be able to create another with the same username!</source>
5926 <target>¡Si elimina este usuario, no podrá crear otro con el mismo nombre de usuario!</target>
5927 <context-group name="null">
5928 <context context-type="linenumber">1</context>
5929 </context-group>
5930 </trans-unit>
5931 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5932 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5933 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminado.</target>
5934 <context-group name="null">
5935 <context context-type="linenumber">1</context>
5936 </context-group>
5937 </trans-unit>
5938 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5939 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5940 <target>El correo electrónico del usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> establecido como verificado</target>
5941 <context-group name="null">
5942 <context context-type="linenumber">1</context>
5943 </context-group>
5944 </trans-unit>
5945 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5946 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5947 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada.</target>
5948 <context-group name="null">
5949 <context context-type="linenumber">1</context>
5950 </context-group>
5951 </trans-unit>
5952 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5953 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5954 <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada.</target>
5955 <context-group name="null">
5956 <context context-type="linenumber">1</context>
5957 </context-group>
5958 </trans-unit>
5959 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5960 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5961 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada por la instancia.</target>
5962 <context-group name="null">
5963 <context context-type="linenumber">1</context>
5964 </context-group>
5965 </trans-unit>
5966 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5967 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5968 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no silenciada por la instancia.</target>
5969 <context-group name="null">
5970 <context context-type="linenumber">1</context>
5971 </context-group>
5972 </trans-unit>
5973 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5974 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5975 <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada por la instancia.</target>
5976 <context-group name="null">
5977 <context context-type="linenumber">1</context>
5978 </context-group>
5979 </trans-unit>
5980 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5981 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5982 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no es silenciada por la instancia.</target>
5983 <context-group name="null">
5984 <context context-type="linenumber">1</context>
5985 </context-group>
5986 </trans-unit>
5987 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5988 <source>Mute this account</source>
5989 <target>Silenciar esta cuenta</target>
5990 <context-group name="null">
5991 <context context-type="linenumber">1</context>
5992 </context-group>
5993 </trans-unit>
5994 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5995 <source>Unmute this account</source>
5996 <target>Dejar de silenciar esta cuenta</target>
5997 <context-group name="null">
5998 <context context-type="linenumber">1</context>
5999 </context-group>
6000 </trans-unit>
6001 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
6002 <source>Mute the instance</source>
6003 <target>Silenciar esta instancia</target>
6004 <context-group name="null">
6005 <context context-type="linenumber">1</context>
6006 </context-group>
6007 </trans-unit>
6008 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
6009 <source>Unmute the instance</source>
6010 <target>Dejar de silenciar esta instancia</target>
6011 <context-group name="null">
6012 <context context-type="linenumber">1</context>
6013 </context-group>
6014 </trans-unit>
6015 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
6016 <source>Mute this account by your instance</source>
6017 <target>Silenciar esta cuenta por su instancia</target>
6018 <context-group name="null">
6019 <context context-type="linenumber">1</context>
6020 </context-group>
6021 </trans-unit>
6022 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
6023 <source>Unmute this account by your instance</source>
6024 <target>Dejar de silenciar esta cuenta por su instancia</target>
6025 <context-group name="null">
6026 <context context-type="linenumber">1</context>
6027 </context-group>
6028 </trans-unit>
6029 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
6030 <source>Mute the instance by your instance</source>
6031 <target>Silenciar esta instancia por su instancia</target>
6032 <context-group name="null">
6033 <context context-type="linenumber">1</context>
6034 </context-group>
6035 </trans-unit>
6036 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
6037 <source>Unmute the instance by your instance</source>
6038 <target>Dejar de silenciar esta instancia por su instancia</target>
6039 <context-group name="null">
6040 <context context-type="linenumber">1</context>
6041 </context-group>
6042 </trans-unit>
3564 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 6043 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
3565 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 6044 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
3566 <target>La petición es demasiado grande para el servidor. Por favor contacta con tu administrador si quieres aumentar el límite de tamaño.</target> 6045 <target>La petición es demasiado grande para el servidor. Por favor contacta con tu administrador si quieres aumentar el límite de tamaño.</target>
@@ -3589,9 +6068,72 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3589 <context context-type="linenumber">1</context> 6068 <context context-type="linenumber">1</context>
3590 </context-group> 6069 </context-group>
3591 </trans-unit> 6070 </trans-unit>
3592 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be"> 6071 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
3593 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source> 6072 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
3594 <target>Registro de <x id="INTERPOLATION" equiv-text="{{username}}"/> completo.</target> 6073 <target>Suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
6074 <context-group name="null">
6075 <context context-type="linenumber">1</context>
6076 </context-group>
6077 </trans-unit>
6078 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
6079 <source>Subscribed</source>
6080 <target>Suscrito</target>
6081 <context-group name="null">
6082 <context context-type="linenumber">1</context>
6083 </context-group>
6084 </trans-unit>
6085 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
6086 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
6087 <target>Ya no está suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
6088 <context-group name="null">
6089 <context context-type="linenumber">1</context>
6090 </context-group>
6091 </trans-unit>
6092 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
6093 <source>Unsubscribed</source>
6094 <target>Ya no está suscrito</target>
6095 <context-group name="null">
6096 <context context-type="linenumber">1</context>
6097 </context-group>
6098 </trans-unit>
6099 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
6100 <source>Moderator</source>
6101 <target>Moderador</target>
6102 <context-group name="null">
6103 <context context-type="linenumber">1</context>
6104 </context-group>
6105 </trans-unit>
6106 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
6107 <source>Only I can see this video</source>
6108 <target>Soy el único que pueda ver este vídeo</target>
6109 <context-group name="null">
6110 <context context-type="linenumber">1</context>
6111 </context-group>
6112 </trans-unit>
6113 <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
6114 <source>Only people with the private link can see this video</source>
6115 <target>Solo las personas que tengan el vínculo privado pueden ver este vídeo</target>
6116 <context-group name="null">
6117 <context context-type="linenumber">1</context>
6118 </context-group>
6119 </trans-unit>
6120 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
6121 <source>Anyone can see this video</source>
6122 <target>Todos pueden ver este vídeo</target>
6123 <context-group name="null">
6124 <context context-type="linenumber">1</context>
6125 </context-group>
6126 </trans-unit>
6127 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
6128 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
6129 <target>¡Le damos la bienvenida! Ahora revise sus correos electrónicos para verificar su cuenta y terminar el proceso de registro. </target>
6130 <context-group name="null">
6131 <context context-type="linenumber">1</context>
6132 </context-group>
6133 </trans-unit>
6134 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
6135 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
6136 <target>¡Está conectado como <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
3595 <context-group name="null"> 6137 <context-group name="null">
3596 <context context-type="linenumber">1</context> 6138 <context context-type="linenumber">1</context>
3597 </context-group> 6139 </context-group>
@@ -3624,23 +6166,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3624 <context context-type="linenumber">1</context> 6166 <context context-type="linenumber">1</context>
3625 </context-group> 6167 </context-group>
3626 </trans-unit> 6168 </trans-unit>
3627 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5"> 6169 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3628 <source>Info</source> 6170 <source>Upload cancelled</source>
3629 <target>Info</target> 6171 <target>Subida cancelada</target>
3630 <context-group name="null"> 6172 <context-group name="null">
3631 <context context-type="linenumber">1</context> 6173 <context context-type="linenumber">1</context>
3632 </context-group> 6174 </context-group>
3633 </trans-unit> 6175 </trans-unit>
3634 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 6176 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
3635 <source>Upload cancelled</source> 6177 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
3636 <target>Subida cancelada</target> 6178 <target>Con este vídeo, está pasando su cuota de espacio (tamaño del vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, espacio utilizado: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, cuota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
3637 <context-group name="null"> 6179 <context-group name="null">
3638 <context context-type="linenumber">1</context> 6180 <context context-type="linenumber">1</context>
3639 </context-group> 6181 </context-group>
3640 </trans-unit> 6182 </trans-unit>
3641 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa"> 6183 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
3642 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source> 6184 <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
3643 <target>Lo sentimos pero PeerTube no puede manejar vídeos &gt; 8 GB</target> 6185 <target>Con este vídeo, su cuota de espacio diario ha sido excedido (tamaño del vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, espacio usado: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, cuota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
3644 <context-group name="null"> 6186 <context-group name="null">
3645 <context context-type="linenumber">1</context> 6187 <context context-type="linenumber">1</context>
3646 </context-group> 6188 </context-group>
@@ -3666,6 +6208,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3666 <context context-type="linenumber">1</context> 6208 <context context-type="linenumber">1</context>
3667 </context-group> 6209 </context-group>
3668 </trans-unit> 6210 </trans-unit>
6211 <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
6212 <source>Video blacklisted.</source>
6213 <target>Vídeo bloqueado</target>
6214 <context-group name="null">
6215 <context context-type="linenumber">1</context>
6216 </context-group>
6217 </trans-unit>
3669 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5"> 6218 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
3670 <source>Copied</source> 6219 <source>Copied</source>
3671 <target>Copiado</target> 6220 <target>Copiado</target>
@@ -3680,6 +6229,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3680 <context context-type="linenumber">1</context> 6229 <context context-type="linenumber">1</context>
3681 </context-group> 6230 </context-group>
3682 </trans-unit> 6231 </trans-unit>
6232 <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
6233 <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
6234 <target>Iniciar a <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
6235 <context-group name="null">
6236 <context context-type="linenumber">1</context>
6237 </context-group>
6238 </trans-unit>
6239 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
6240 <source>Like the video</source>
6241 <target>Colocar Me gusta a este vídeo</target>
6242 <context-group name="null">
6243 <context context-type="linenumber">1</context>
6244 </context-group>
6245 </trans-unit>
6246 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
6247 <source>Dislike the video</source>
6248 <target>Eliminar Me gusta de este vídeo</target>
6249 <context-group name="null">
6250 <context context-type="linenumber">1</context>
6251 </context-group>
6252 </trans-unit>
3683 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 6253 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
3684 <source>Do you really want to delete this video?</source> 6254 <source>Do you really want to delete this video?</source>
3685 <target>¿De verdad quieres eliminar este vídeo?</target> 6255 <target>¿De verdad quieres eliminar este vídeo?</target>
@@ -3708,5 +6278,12 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3708 <context context-type="linenumber">1</context> 6278 <context context-type="linenumber">1</context>
3709 </context-group> 6279 </context-group>
3710 </trans-unit> 6280 </trans-unit>
6281 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
6282 <source>Videos from your subscriptions</source>
6283 <target>Vídeos desde sus suscripciones</target>
6284 <context-group name="null">
6285 <context context-type="linenumber">1</context>
6286 </context-group>
6287 </trans-unit>
3711 </body> 6288 </body>
3712 </file></xliff> \ No newline at end of file 6289 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_eu_ES.xml b/client/src/locale/target/angular_eu_ES.xml
index 20046ea3f..0393ab85c 100644
--- a/client/src/locale/target/angular_eu_ES.xml
+++ b/client/src/locale/target/angular_eu_ES.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Hautatu hilabetea</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Hautatu urtea</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -213,11 +227,25 @@
213 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
214 </context-group> 228 </context-group>
215 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Zerrendatu gabea</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Pribatua</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
216 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
218 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target>
219 <context-group name="null"> 247 <context-group name="null">
220 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
221 </context-group> 249 </context-group>
222 </trans-unit> 250 </trans-unit>
223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -231,7 +259,7 @@
231 <source>Edit</source> 259 <source>Edit</source>
232 <target>Editatu</target> 260 <target>Editatu</target>
233 <context-group name="null"> 261 <context-group name="null">
234 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
235 </context-group> 263 </context-group>
236 </trans-unit> 264 </trans-unit>
237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -255,11 +283,112 @@
255 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
256 </context-group> 284 </context-group>
257 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Harpidetu
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 Desharpidetu
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>ActivityPub kontu bat erabiliz</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>Harpidetu <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/> ostalariko kontu batekin</target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>Harpidetu zure tokiko kontuarekin</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>Harpidetu Mastodon kontu batekin:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>Sindikazio jario bat erabiliz</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
354 <source>Subscribe via RSS</source>
355 <target>Harpidetu RSS bidez</target>
356 <context-group name="null">
357 <context context-type="linenumber">49</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
361 <source>
362 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
363 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
364 </source>
365 <target>
366 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Urruneko harpidetza<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
367 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Urruneko interakzioa<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
368 </target>
369 <context-group name="null">
370 <context context-type="linenumber">10</context>
371 </context-group>
372 </trans-unit>
373 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
374 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
375 <target>Kanal honetara harpidetu zaitezke ActivityPub onartzen duen fedibertsoko instantzia batetik, esaterako Mastodon edo Pleroma instantzietan, bilaketa kutxan URLa idatzi dezakezu eta handik harpidetu.</target>
376 <context-group name="null">
377 <context context-type="linenumber">17</context>
378 </context-group>
379 </trans-unit>
380 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
381 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
382 <target>Kontu honekin elkarrekintzak izan ditzakezu zaitezke ActivityPub onartzen duen edozein instantziatik. Esaterako Mastodon edo Pleroma instantzietan, bilaketa kutxan URLa idatzi dezakezu eta handik elkarrekintza hasi.</target>
383 <context-group name="null">
384 <context context-type="linenumber">22</context>
385 </context-group>
386 </trans-unit>
258 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 387 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
259 <source>Video quota</source> 388 <source>Video quota</source>
260 <target>Bideo-kuota</target> 389 <target>Bideo-kuota</target>
261 <context-group name="null"> 390 <context-group name="null">
262 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
263 </context-group> 392 </context-group>
264 </trans-unit> 393 </trans-unit>
265 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -273,6 +402,38 @@
273 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
274 </context-group> 403 </context-group>
275 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>Debekatu</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>Arrazoia...</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424 Debekatutako erabiltzaile batek ezin izango du saioa hasi.
425 </target>
426 <context-group name="null">
427 <context context-type="linenumber">17</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
431 <source>Ban this user</source>
432 <target>Debekatu erabiltzaile hau</target>
433 <context-group name="null">
434 <context context-type="linenumber">25</context>
435 </context-group>
436 </trans-unit>
276 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
277 <source> 438 <source>
278 Login 439 Login
@@ -338,7 +499,7 @@
338 <source>Password</source> 499 <source>Password</source>
339 <target>Pasahitza</target> 500 <target>Pasahitza</target>
340 <context-group name="null"> 501 <context-group name="null">
341 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
342 </context-group> 503 </context-group>
343 </trans-unit> 504 </trans-unit>
344 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -352,7 +513,7 @@
352 <source>Login</source> 513 <source>Login</source>
353 <target>Hasi saioa</target> 514 <target>Hasi saioa</target>
354 <context-group name="null"> 515 <context-group name="null">
355 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
356 </context-group> 517 </context-group>
357 </trans-unit> 518 </trans-unit>
358 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -380,7 +541,7 @@
380 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
381 <target>Bidali e-mail bat nire pasahitza berrezartzeko</target> 542 <target>Bidali e-mail bat nire pasahitza berrezartzeko</target>
382 <context-group name="null"> 543 <context-group name="null">
383 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
384 </context-group> 545 </context-group>
385 </trans-unit> 546 </trans-unit>
386 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -437,28 +598,28 @@
437 <source>Example: jane_doe</source> 598 <source>Example: jane_doe</source>
438 <target>Adibidez: jone_inorrez</target> 599 <target>Adibidez: jone_inorrez</target>
439 <context-group name="null"> 600 <context-group name="null">
440 <context context-type="linenumber">16</context> 601 <context context-type="linenumber">17</context>
441 </context-group> 602 </context-group>
442 </trans-unit> 603 </trans-unit>
443 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 604 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
444 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 605 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
445 <target>Instantzia honetako &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Baldintzak&lt;/a&gt; irakurri ditut eta ados nago</target> 606 <target>16 urte edo gehiago ditut eta onartzen ditut instantzia honen &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;erabilera badintzak&lt;/a&gt;</target>
446 <context-group name="null"> 607 <context-group name="null">
447 <context context-type="linenumber">54</context> 608 <context context-type="linenumber">55</context>
448 </context-group> 609 </context-group>
449 </trans-unit> 610 </trans-unit>
450 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 611 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
451 <source>Signup</source> 612 <source>Signup</source>
452 <target>Eman izena</target> 613 <target>Eman izena</target>
453 <context-group name="null"> 614 <context-group name="null">
454 <context context-type="linenumber">88</context> 615 <context context-type="linenumber">78</context>
455 </context-group> 616 </context-group>
456 </trans-unit> 617 </trans-unit>
457 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
458 <source>Features found on this instance</source> 619 <source>Features found on this instance</source>
459 <target>Instantzia honetako ezaugarriak</target> 620 <target>Instantzia honetako ezaugarriak</target>
460 <context-group name="null"> 621 <context-group name="null">
461 <context context-type="linenumber">66</context> 622 <context context-type="linenumber">67</context>
462 </context-group> 623 </context-group>
463 </trans-unit> 624 </trans-unit>
464 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 625 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -479,9 +640,15 @@
479 <context context-type="linenumber">6</context> 640 <context context-type="linenumber">6</context>
480 </context-group> 641 </context-group>
481 </trans-unit> 642 </trans-unit>
482 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 643 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
483 <source>Filters</source> 644 <source>
484 <target>Iragazkiak</target> 645 Filters
646 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
647 </source>
648 <target>
649 Iragazkiak
650 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
651 </target>
485 <context-group name="null"> 652 <context-group name="null">
486 <context context-type="linenumber">16</context> 653 <context context-type="linenumber">16</context>
487 </context-group> 654 </context-group>
@@ -494,28 +661,28 @@
494 Ez da emaitzarik aurkitu 661 Ez da emaitzarik aurkitu
495 </target> 662 </target>
496 <context-group name="null"> 663 <context-group name="null">
497 <context context-type="linenumber">25</context> 664 <context context-type="linenumber">28</context>
498 </context-group> 665 </context-group>
499 </trans-unit> 666 </trans-unit>
500 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 667 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
501 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 668 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
502 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> harpidedun</target> 669 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> harpidedun</target>
503 <context-group name="null"> 670 <context-group name="null">
504 <context context-type="linenumber">41</context> 671 <context context-type="linenumber">44</context>
505 </context-group> 672 </context-group>
506 </trans-unit> 673 </trans-unit>
507 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 674 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
508 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 675 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
509 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> ikustaldi</target> 676 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> ikustaldi</target>
510 <context-group name="null"> 677 <context-group name="null">
511 <context context-type="linenumber">52</context> 678 <context context-type="linenumber">55</context>
512 </context-group> 679 </context-group>
513 </trans-unit> 680 </trans-unit>
514 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 681 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
515 <source>Change the language</source> 682 <source>Change the language</source>
516 <target>Aldatu hizkuntza</target> 683 <target>Aldatu hizkuntza</target>
517 <context-group name="null"> 684 <context-group name="null">
518 <context context-type="linenumber">88</context> 685 <context context-type="linenumber">86</context>
519 </context-group> 686 </context-group>
520 </trans-unit> 687 </trans-unit>
521 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -526,7 +693,7 @@
526 Nire profil publikoa 693 Nire profil publikoa
527 </target> 694 </target>
528 <context-group name="null"> 695 <context-group name="null">
529 <context context-type="linenumber">18</context> 696 <context context-type="linenumber">16</context>
530 </context-group> 697 </context-group>
531 </trans-unit> 698 </trans-unit>
532 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -537,7 +704,7 @@
537 Nire kontua 704 Nire kontua
538 </target> 705 </target>
539 <context-group name="null"> 706 <context-group name="null">
540 <context context-type="linenumber">22</context> 707 <context context-type="linenumber">20</context>
541 </context-group> 708 </context-group>
542 </trans-unit> 709 </trans-unit>
543 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -548,7 +715,7 @@
548 Nire bideoak 715 Nire bideoak
549 </target> 716 </target>
550 <context-group name="null"> 717 <context-group name="null">
551 <context context-type="linenumber">26</context> 718 <context context-type="linenumber">24</context>
552 </context-group> 719 </context-group>
553 </trans-unit> 720 </trans-unit>
554 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -559,14 +726,14 @@
559 Amaitu saioa 726 Amaitu saioa
560 </target> 727 </target>
561 <context-group name="null"> 728 <context-group name="null">
562 <context context-type="linenumber">30</context> 729 <context context-type="linenumber">28</context>
563 </context-group> 730 </context-group>
564 </trans-unit> 731 </trans-unit>
565 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
566 <source>Create an account</source> 733 <source>Create an account</source>
567 <target>Sortu kontu bat</target> 734 <target>Sortu kontu bat</target>
568 <context-group name="null"> 735 <context-group name="null">
569 <context context-type="linenumber">39</context> 736 <context context-type="linenumber">37</context>
570 </context-group> 737 </context-group>
571 </trans-unit> 738 </trans-unit>
572 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -580,49 +747,49 @@
580 <source>Subscriptions</source> 747 <source>Subscriptions</source>
581 <target>Harpidetzak</target> 748 <target>Harpidetzak</target>
582 <context-group name="null"> 749 <context-group name="null">
583 <context context-type="linenumber">47</context> 750 <context context-type="linenumber">45</context>
584 </context-group> 751 </context-group>
585 </trans-unit> 752 </trans-unit>
586 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
587 <source>Overview</source> 754 <source>Overview</source>
588 <target>Gainbegirada</target> 755 <target>Gainbegirada</target>
589 <context-group name="null"> 756 <context-group name="null">
590 <context context-type="linenumber">52</context> 757 <context context-type="linenumber">50</context>
591 </context-group> 758 </context-group>
592 </trans-unit> 759 </trans-unit>
593 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
594 <source>Trending</source> 761 <source>Trending</source>
595 <target>Joerak</target> 762 <target>Joerak</target>
596 <context-group name="null"> 763 <context-group name="null">
597 <context context-type="linenumber">57</context> 764 <context context-type="linenumber">55</context>
598 </context-group> 765 </context-group>
599 </trans-unit> 766 </trans-unit>
600 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
601 <source>Recently added</source> 768 <source>Recently added</source>
602 <target>Gehitutako azkenak</target> 769 <target>Gehitutako azkenak</target>
603 <context-group name="null"> 770 <context-group name="null">
604 <context context-type="linenumber">62</context> 771 <context context-type="linenumber">60</context>
605 </context-group> 772 </context-group>
606 </trans-unit> 773 </trans-unit>
607 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
608 <source>Local</source> 775 <source>Local</source>
609 <target>Tokikoa</target> 776 <target>Tokikoa</target>
610 <context-group name="null"> 777 <context-group name="null">
611 <context context-type="linenumber">67</context> 778 <context context-type="linenumber">65</context>
612 </context-group> 779 </context-group>
613 </trans-unit> 780 </trans-unit>
614 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
615 <source>More</source> 782 <source>More</source>
616 <target>Gehiago</target> 783 <target>Gehiago</target>
617 <context-group name="null"> 784 <context-group name="null">
618 <context context-type="linenumber">72</context> 785 <context context-type="linenumber">70</context>
619 </context-group> 786 </context-group>
620 </trans-unit> 787 </trans-unit>
621 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
622 <source>Administration</source> 789 <source>Administration</source>
623 <target>Administrazioa</target> 790 <target>Administrazioa</target>
624 <context-group name="null"> 791 <context-group name="null">
625 <context context-type="linenumber">76</context> 792 <context context-type="linenumber">74</context>
626 </context-group> 793 </context-group>
627 </trans-unit> 794 </trans-unit>
628 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -632,11 +799,18 @@
632 <context context-type="linenumber">25</context> 799 <context context-type="linenumber">25</context>
633 </context-group> 800 </context-group>
634 </trans-unit> 801 </trans-unit>
802 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
803 <source>Show keyboard shortcuts</source>
804 <target>Erakutsi teklatu-lasterbideak</target>
805 <context-group name="null">
806 <context context-type="linenumber">89</context>
807 </context-group>
808 </trans-unit>
635 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
636 <source>Toggle dark interface</source> 810 <source>Toggle dark interface</source>
637 <target>Txandakatu interfaze iluna</target> 811 <target>Txandakatu interfaze iluna</target>
638 <context-group name="null"> 812 <context-group name="null">
639 <context context-type="linenumber">94</context> 813 <context context-type="linenumber">92</context>
640 </context-group> 814 </context-group>
641 </trans-unit> 815 </trans-unit>
642 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -737,11 +911,18 @@
737 <context context-type="linenumber">94</context> 911 <context context-type="linenumber">94</context>
738 </context-group> 912 </context-group>
739 </trans-unit> 913 </trans-unit>
914 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
915 <source>Display unlisted and private videos</source>
916 <target>Bistaratu zerrendatu gabeko bideoak eta bideo pribatuak</target>
917 <context-group name="null">
918 <context context-type="linenumber">14</context>
919 </context-group>
920 </trans-unit>
740 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
741 <source>No results.</source> 922 <source>No results.</source>
742 <target>Emaitzarik ez.</target> 923 <target>Emaitzarik ez.</target>
743 <context-group name="null"> 924 <context-group name="null">
744 <context context-type="linenumber">7</context> 925 <context context-type="linenumber">20</context>
745 </context-group> 926 </context-group>
746 </trans-unit> 927 </trans-unit>
747 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -755,6 +936,17 @@
755 <context context-type="linenumber">6</context> 936 <context context-type="linenumber">6</context>
756 </context-group> 937 </context-group>
757 </trans-unit> 938 </trans-unit>
939 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
940 <source>
941 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
942 </source>
943 <target>
944 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
945 </target>
946 <context-group name="null">
947 <context context-type="linenumber">14</context>
948 </context-group>
949 </trans-unit>
758 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 950 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
759 <source> 951 <source>
760 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 952 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -778,7 +970,7 @@
778 <source>Instance</source> 970 <source>Instance</source>
779 <target>Instantzia</target> 971 <target>Instantzia</target>
780 <context-group name="null"> 972 <context-group name="null">
781 <context context-type="linenumber">8</context> 973 <context context-type="linenumber">12</context>
782 </context-group> 974 </context-group>
783 </trans-unit> 975 </trans-unit>
784 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 976 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -788,15 +980,22 @@
788 <context context-type="linenumber">7</context> 980 <context context-type="linenumber">7</context>
789 </context-group> 981 </context-group>
790 </trans-unit> 982 </trans-unit>
791 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 983 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
792 <source> 984 <source>
793 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 985 Cancel
794</source> 986 </source>
795 <target> 987 <target>
796 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instantziari buruz 988 Utzi
797</target> 989 </target>
798 <context-group name="null"> 990 <context-group name="null">
799 <context context-type="linenumber">1</context> 991 <context context-type="linenumber">26</context>
992 </context-group>
993 </trans-unit>
994 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
995 <source>Submit</source>
996 <target>Bidali</target>
997 <context-group name="null">
998 <context context-type="linenumber">31</context>
800 </context-group> 999 </context-group>
801 </trans-unit> 1000 </trans-unit>
802 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1001 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -810,45 +1009,14 @@
810 <source>Terms</source> 1009 <source>Terms</source>
811 <target>Baldintzak</target> 1010 <target>Baldintzak</target>
812 <context-group name="null"> 1011 <context-group name="null">
813 <context context-type="linenumber">44</context> 1012 <context context-type="linenumber">39</context>
814 </context-group> 1013 </context-group>
815 </trans-unit> 1014 </trans-unit>
816 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1015 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
817 <source>User registration is allowed and</source> 1016 <source>User registration is allowed and</source>
818 <target>Erabiltzaile berriek izena ematea onartzen da eta</target> 1017 <target>Erabiltzaile berriek izena ematea onartzen da eta</target>
819 <context-group name="null"> 1018 <context-group name="null">
820 <context context-type="linenumber">25</context> 1019 <context context-type="linenumber">29</context>
821 </context-group>
822 </trans-unit>
823 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
824 <source>
825 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
826 </source>
827 <target>
828 instantzia honek <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> eskaintzen ditu erabiltzaileen bideoetarako oinarrizko kuota gisa.
829 </target>
830 <context-group name="null">
831 <context context-type="linenumber">27</context>
832 </context-group>
833 </trans-unit>
834 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
835 <source>
836 this instance provides unlimited space for the videos of its users.
837 </source>
838 <target>
839 instantzia honek mugagabeko espazioa eskaintzen du bere erabiltzaileen bideoetarako. </target>
840 <context-group name="null">
841 <context context-type="linenumber">31</context>
842 </context-group>
843 </trans-unit>
844 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
845 <source>
846 User registration is currently not allowed.
847 </source>
848 <target>
849Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
850 <context-group name="null">
851 <context context-type="linenumber">36</context>
852 </context-group> 1020 </context-group>
853 </trans-unit> 1021 </trans-unit>
854 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1022 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1067,14 +1235,14 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1067 <context context-type="linenumber">83</context> 1235 <context context-type="linenumber">83</context>
1068 </context-group> 1236 </context-group>
1069 </trans-unit> 1237 </trans-unit>
1070 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1238 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1071 <source> 1239 <source>
1072 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1240 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1073 In the meantime, we want to test different ideas related to this issue: 1241 In the meantime, we want to test different ideas related to this issue:
1074 </source> 1242 </source>
1075 <target> 1243 <target>
1076 PeerTube beta-n dago, eta ahalik eta babes onena ezartzeko gogoa dugu kaleratzen denerako. 1244 PeerTube oso berria da oraindik, eta egonkortzen denerako babes-neurri egokienak ezarri nahi ditugu.
1077 Bitartean hainbat ideia saiatu nahi ditugu honetarako: 1245 Bitartean, hainbat ideia saiatu nahi ditugu gai honen inguruan:
1078 </target> 1246 </target>
1079 <context-group name="null"> 1247 <context-group name="null">
1080 <context context-type="linenumber">85</context> 1248 <context context-type="linenumber">85</context>
@@ -1115,18 +1283,53 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1115 <context context-type="linenumber">95</context> 1283 <context context-type="linenumber">95</context>
1116 </context-group> 1284 </context-group>
1117 </trans-unit> 1285 </trans-unit>
1286 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1287 <source>Banned</source>
1288 <target>Debekatua</target>
1289 <context-group name="null">
1290 <context context-type="linenumber">12</context>
1291 </context-group>
1292 </trans-unit>
1293 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1294 <source>Muted</source>
1295 <target>Mututua</target>
1296 <context-group name="null">
1297 <context context-type="linenumber">13</context>
1298 </context-group>
1299 </trans-unit>
1300 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1301 <source>Muted by your instance</source>
1302 <target>Zure instantziak mututua</target>
1303 <context-group name="null">
1304 <context context-type="linenumber">14</context>
1305 </context-group>
1306 </trans-unit>
1307 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1308 <source>Instance muted</source>
1309 <target>Mutututako instantzia</target>
1310 <context-group name="null">
1311 <context context-type="linenumber">15</context>
1312 </context-group>
1313 </trans-unit>
1314 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1315 <source>Instance muted by your instance</source>
1316 <target>Zure instantziak mutututako instantzia</target>
1317 <context-group name="null">
1318 <context context-type="linenumber">16</context>
1319 </context-group>
1320 </trans-unit>
1118 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1321 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1119 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1322 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1120 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> harpidedun</target> 1323 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> harpidedun</target>
1121 <context-group name="null"> 1324 <context-group name="null">
1122 <context context-type="linenumber">12</context> 1325 <context context-type="linenumber">24</context>
1123 </context-group> 1326 </context-group>
1124 </trans-unit> 1327 </trans-unit>
1125 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1328 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1126 <source>Video channels</source> 1329 <source>Video channels</source>
1127 <target>Bideo kanalak</target> 1330 <target>Bideo kanalak</target>
1128 <context-group name="null"> 1331 <context-group name="null">
1129 <context context-type="linenumber">19</context> 1332 <context context-type="linenumber">31</context>
1130 </context-group> 1333 </context-group>
1131 </trans-unit> 1334 </trans-unit>
1132 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1335 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1168,49 +1371,49 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1168 <source>Short description</source> 1371 <source>Short description</source>
1169 <target>Deskripzio laburra</target> 1372 <target>Deskripzio laburra</target>
1170 <context-group name="null"> 1373 <context-group name="null">
1171 <context context-type="linenumber">22</context> 1374 <context context-type="linenumber">21</context>
1172 </context-group> 1375 </context-group>
1173 </trans-unit> 1376 </trans-unit>
1174 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1377 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1175 <source>Default client route</source> 1378 <source>Default client route</source>
1176 <target>Lehenetsitako bezeroaren ibilbidea</target> 1379 <target>Lehenetsitako bezeroaren ibilbidea</target>
1177 <context-group name="null"> 1380 <context-group name="null">
1178 <context context-type="linenumber">55</context> 1381 <context context-type="linenumber">48</context>
1179 </context-group> 1382 </context-group>
1180 </trans-unit> 1383 </trans-unit>
1181 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1384 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1182 <source>Videos Overview</source> 1385 <source>Videos Overview</source>
1183 <target>Bideoen gainbegirada</target> 1386 <target>Bideoen gainbegirada</target>
1184 <context-group name="null"> 1387 <context-group name="null">
1185 <context context-type="linenumber">58</context> 1388 <context context-type="linenumber">51</context>
1186 </context-group> 1389 </context-group>
1187 </trans-unit> 1390 </trans-unit>
1188 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1391 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1189 <source>Videos Trending</source> 1392 <source>Videos Trending</source>
1190 <target>Joera diren bideoak</target> 1393 <target>Joera diren bideoak</target>
1191 <context-group name="null"> 1394 <context-group name="null">
1192 <context context-type="linenumber">59</context> 1395 <context context-type="linenumber">52</context>
1193 </context-group> 1396 </context-group>
1194 </trans-unit> 1397 </trans-unit>
1195 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1398 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1196 <source>Videos Recently Added</source> 1399 <source>Videos Recently Added</source>
1197 <target>Azkenaldian gehitutako bidoeak</target> 1400 <target>Azkenaldian gehitutako bidoeak</target>
1198 <context-group name="null"> 1401 <context-group name="null">
1199 <context context-type="linenumber">60</context> 1402 <context context-type="linenumber">53</context>
1200 </context-group> 1403 </context-group>
1201 </trans-unit> 1404 </trans-unit>
1202 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1405 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1203 <source>Local videos</source> 1406 <source>Local videos</source>
1204 <target>Tokiko bideoak</target> 1407 <target>Tokiko bideoak</target>
1205 <context-group name="null"> 1408 <context-group name="null">
1206 <context context-type="linenumber">61</context> 1409 <context context-type="linenumber">54</context>
1207 </context-group> 1410 </context-group>
1208 </trans-unit> 1411 </trans-unit>
1209 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1412 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1210 <source>Policy on videos containing sensitive content</source> 1413 <source>Policy on videos containing sensitive content</source>
1211 <target>Eduki hunkigarria duten bideoen politika</target> 1414 <target>Eduki hunkigarria duten bideoen politika</target>
1212 <context-group name="null"> 1415 <context-group name="null">
1213 <context context-type="linenumber">70</context> 1416 <context context-type="linenumber">61</context>
1214 </context-group> 1417 </context-group>
1215 </trans-unit> 1418 </trans-unit>
1216 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1419 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1245,21 +1448,42 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1245 <source>Signup enabled</source> 1448 <source>Signup enabled</source>
1246 <target>Izena ematea gaituta</target> 1449 <target>Izena ematea gaituta</target>
1247 <context-group name="null"> 1450 <context-group name="null">
1248 <context context-type="linenumber">92</context> 1451 <context context-type="linenumber">84</context>
1249 </context-group> 1452 </context-group>
1250 </trans-unit> 1453 </trans-unit>
1251 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1454 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1252 <source>Signup requires email verification</source> 1455 <source>Signup requires email verification</source>
1253 <target>Izena emateko e-mail helbidea baieztatu behar da</target> 1456 <target>Izena emateko e-mail helbidea baieztatu behar da</target>
1254 <context-group name="null"> 1457 <context-group name="null">
1255 <context context-type="linenumber">97</context> 1458 <context context-type="linenumber">91</context>
1256 </context-group> 1459 </context-group>
1257 </trans-unit> 1460 </trans-unit>
1258 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1461 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1259 <source>Signup limit</source> 1462 <source>Signup limit</source>
1260 <target>Izena emateko muga</target> 1463 <target>Izena emateko muga</target>
1261 <context-group name="null"> 1464 <context-group name="null">
1262 <context context-type="linenumber">101</context> 1465 <context context-type="linenumber">96</context>
1466 </context-group>
1467 </trans-unit>
1468 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1469 <source>Users</source>
1470 <target>Erabiltzaileak</target>
1471 <context-group name="null">
1472 <context context-type="linenumber">105</context>
1473 </context-group>
1474 </trans-unit>
1475 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1476 <source>User default video quota</source>
1477 <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
1478 <context-group name="null">
1479 <context context-type="linenumber">109</context>
1480 </context-group>
1481 </trans-unit>
1482 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1483 <source>User default daily upload limit</source>
1484 <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
1485 <context-group name="null">
1486 <context context-type="linenumber">121</context>
1263 </context-group> 1487 </context-group>
1264 </trans-unit> 1488 </trans-unit>
1265 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1489 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1269,53 +1493,32 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1269 <context context-type="linenumber">42</context> 1493 <context context-type="linenumber">42</context>
1270 </context-group> 1494 </context-group>
1271 </trans-unit> 1495 </trans-unit>
1272 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1496 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1273 <source>Video import with HTTP enabled</source> 1497 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1274 <target>Bideoa HTTP bidez inportatzea gaituta</target> 1498 <target>HTTP URL bidezko bideoen inportazioa gaituta (adibidez YouTube)</target>
1275 <context-group name="null"> 1499 <context-group name="null">
1276 <context context-type="linenumber">115</context> 1500 <context context-type="linenumber">141</context>
1277 </context-group> 1501 </context-group>
1278 </trans-unit> 1502 </trans-unit>
1279 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1503 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1280 <source>Video import with a torrent file or a magnet URI enabled</source> 1504 <source>Video import with a torrent file or a magnet URI enabled</source>
1281 <target>Bideoa torrent fitxategia edo magnet URL bidez inportatzea gaituta</target> 1505 <target>Bideoa torrent fitxategia edo magnet URL bidez inportatzea gaituta</target>
1282 <context-group name="null"> 1506 <context-group name="null">
1283 <context context-type="linenumber">120</context> 1507 <context context-type="linenumber">148</context>
1284 </context-group> 1508 </context-group>
1285 </trans-unit> 1509 </trans-unit>
1286 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1510 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1287 <source>Administrator</source> 1511 <source>Administrator</source>
1288 <target>Administratzailea</target> 1512 <target>Administratzailea</target>
1289 <context-group name="null"> 1513 <context-group name="null">
1290 <context context-type="linenumber">123</context> 1514 <context context-type="linenumber">155</context>
1291 </context-group> 1515 </context-group>
1292 </trans-unit> 1516 </trans-unit>
1293 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1517 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1294 <source>Admin email</source> 1518 <source>Admin email</source>
1295 <target>Administratzailearen e-maila</target> 1519 <target>Administratzailearen e-maila</target>
1296 <context-group name="null"> 1520 <context-group name="null">
1297 <context context-type="linenumber">126</context> 1521 <context context-type="linenumber">158</context>
1298 </context-group>
1299 </trans-unit>
1300 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1301 <source>Users</source>
1302 <target>Erabiltzaileak</target>
1303 <context-group name="null">
1304 <context context-type="linenumber">136</context>
1305 </context-group>
1306 </trans-unit>
1307 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1308 <source>User default video quota</source>
1309 <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
1310 <context-group name="null">
1311 <context context-type="linenumber">139</context>
1312 </context-group>
1313 </trans-unit>
1314 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1315 <source>User default daily upload limit</source>
1316 <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
1317 <context-group name="null">
1318 <context context-type="linenumber">153</context>
1319 </context-group> 1522 </context-group>
1320 </trans-unit> 1523 </trans-unit>
1321 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1524 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1329,70 +1532,70 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1329 <source>Twitter</source> 1532 <source>Twitter</source>
1330 <target>Twitter</target> 1533 <target>Twitter</target>
1331 <context-group name="null"> 1534 <context-group name="null">
1332 <context context-type="linenumber">170</context> 1535 <context context-type="linenumber">178</context>
1333 </context-group> 1536 </context-group>
1334 </trans-unit> 1537 </trans-unit>
1335 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1538 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1336 <source>Your Twitter username</source> 1539 <source>Your Twitter username</source>
1337 <target>Zure Twitter erabiltzaile-izena</target> 1540 <target>Zure Twitter erabiltzaile-izena</target>
1338 <context-group name="null"> 1541 <context-group name="null">
1339 <context context-type="linenumber">173</context> 1542 <context context-type="linenumber">184</context>
1340 </context-group> 1543 </context-group>
1341 </trans-unit> 1544 </trans-unit>
1342 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1545 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1343 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1546 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1344 <target>Edukia argitaratuko den webgune edo plataformarentzat Twitter kontua adierazten du.</target> 1547 <target>Edukia argitaratuko den webgune edo plataformarentzat Twitter kontua adierazten du.</target>
1345 <context-group name="null"> 1548 <context-group name="null">
1346 <context context-type="linenumber">176</context> 1549 <context context-type="linenumber">187</context>
1347 </context-group> 1550 </context-group>
1348 </trans-unit> 1551 </trans-unit>
1349 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1552 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1350 <source>Instance whitelisted by Twitter</source> 1553 <source>Instance whitelisted by Twitter</source>
1351 <target>Twitter-ek onartutako instantzia</target> 1554 <target>Twitter-ek onartutako instantzia</target>
1352 <context-group name="null"> 1555 <context-group name="null">
1353 <context context-type="linenumber">189</context> 1556 <context context-type="linenumber">199</context>
1354 </context-group> 1557 </context-group>
1355 </trans-unit> 1558 </trans-unit>
1356 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1559 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1357 <source>Services</source> 1560 <source>Services</source>
1358 <target>Zerbitzuak</target> 1561 <target>Zerbitzuak</target>
1359 <context-group name="null"> 1562 <context-group name="null">
1360 <context context-type="linenumber">168</context> 1563 <context context-type="linenumber">176</context>
1361 </context-group> 1564 </context-group>
1362 </trans-unit> 1565 </trans-unit>
1363 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1566 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1364 <source>Transcoding</source> 1567 <source>Transcoding</source>
1365 <target>Transkodeketa</target> 1568 <target>Transkodeketa</target>
1366 <context-group name="null"> 1569 <context-group name="null">
1367 <context context-type="linenumber">200</context> 1570 <context context-type="linenumber">215</context>
1368 </context-group> 1571 </context-group>
1369 </trans-unit> 1572 </trans-unit>
1370 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1573 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1371 <source>Transcoding enabled</source> 1574 <source>Transcoding enabled</source>
1372 <target>Transkodeketa gaituta</target> 1575 <target>Transkodeketa gaituta</target>
1373 <context-group name="null"> 1576 <context-group name="null">
1374 <context context-type="linenumber">204</context> 1577 <context context-type="linenumber">221</context>
1375 </context-group> 1578 </context-group>
1376 </trans-unit> 1579 </trans-unit>
1377 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1580 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1378 <source>If you disable transcoding, many videos from your users will not work!</source> 1581 <source>If you disable transcoding, many videos from your users will not work!</source>
1379 <target>Transkodeketa desgaitzen baduzu, erabiltzaileen bideo askok ez dute funtzionatuko!</target> 1582 <target>Transkodeketa desgaitzen baduzu, erabiltzaileen bideo askok ez dute funtzionatuko!</target>
1380 <context-group name="null"> 1583 <context-group name="null">
1381 <context context-type="linenumber">205</context> 1584 <context context-type="linenumber">222</context>
1382 </context-group> 1585 </context-group>
1383 </trans-unit> 1586 </trans-unit>
1384 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1587 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1385 <source>Transcoding threads</source> 1588 <source>Transcoding threads</source>
1386 <target>Transkodetze hariak</target> 1589 <target>Transkodetze hariak</target>
1387 <context-group name="null"> 1590 <context-group name="null">
1388 <context context-type="linenumber">211</context> 1591 <context context-type="linenumber">237</context>
1389 </context-group> 1592 </context-group>
1390 </trans-unit> 1593 </trans-unit>
1391 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1594 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1392 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1595 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1393 <target><x id="INTERPOLATION" equiv-text="{{resolution}}"/> bereizmena gaituta</target> 1596 <target><x id="INTERPOLATION" equiv-text="{{resolution}}"/> bereizmena gaituta</target>
1394 <context-group name="null"> 1597 <context-group name="null">
1395 <context context-type="linenumber">227</context> 1598 <context context-type="linenumber">252</context>
1396 </context-group> 1599 </context-group>
1397 </trans-unit> 1600 </trans-unit>
1398 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1601 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1407,105 +1610,70 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1407 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1610 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1408 </target> 1611 </target>
1409 <context-group name="null"> 1612 <context-group name="null">
1410 <context context-type="linenumber">233</context> 1613 <context context-type="linenumber">260</context>
1411 </context-group> 1614 </context-group>
1412 </trans-unit> 1615 </trans-unit>
1413 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1616 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1414 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1617 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1415 <target>Fitxategi batzuk ez dira federatzen (aurrebistak, azpitituluak). Zuzenean jatorrizko instantziatik jasotzen ditugu eta cachean gorde.</target> 1618 <target>Fitxategi batzuk ez dira federatzen (aurrebistak, azpitituluak). Zuzenean jatorrizko instantziatik jasotzen ditugu eta cachean gorde.</target>
1416 <context-group name="null"> 1619 <context-group name="null">
1417 <context context-type="linenumber">238</context> 1620 <context context-type="linenumber">265</context>
1418 </context-group> 1621 </context-group>
1419 </trans-unit> 1622 </trans-unit>
1420 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1623 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1421 <source>Previews cache size</source> 1624 <source>Previews cache size</source>
1422 <target>Aurrebisten cachearen tamaina</target> 1625 <target>Aurrebisten cachearen tamaina</target>
1423 <context-group name="null"> 1626 <context-group name="null">
1424 <context context-type="linenumber">243</context> 1627 <context context-type="linenumber">271</context>
1425 </context-group> 1628 </context-group>
1426 </trans-unit> 1629 </trans-unit>
1427 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1630 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1428 <source>Video captions cache size</source> 1631 <source>Video captions cache size</source>
1429 <target>Bideoaren azpitituluen cachearen tamaina</target> 1632 <target>Bideoaren azpitituluen cachearen tamaina</target>
1430 <context-group name="null"> 1633 <context-group name="null">
1431 <context context-type="linenumber">254</context> 1634 <context context-type="linenumber">280</context>
1432 </context-group> 1635 </context-group>
1433 </trans-unit> 1636 </trans-unit>
1434 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1637 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1435 <source>Customizations</source> 1638 <source>Customizations</source>
1436 <target>Pertsonalizazioak</target> 1639 <target>Pertsonalizazioak</target>
1437 <context-group name="null"> 1640 <context-group name="null">
1438 <context context-type="linenumber">264</context> 1641 <context context-type="linenumber">289</context>
1439 </context-group> 1642 </context-group>
1440 </trans-unit> 1643 </trans-unit>
1441 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1644 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1442 <source>JavaScript</source> 1645 <source>JavaScript</source>
1443 <target>JavaScript</target> 1646 <target>JavaScript</target>
1444 <context-group name="null"> 1647 <context-group name="null">
1445 <context context-type="linenumber">267</context> 1648 <context context-type="linenumber">294</context>
1446 </context-group> 1649 </context-group>
1447 </trans-unit> 1650 </trans-unit>
1448 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1651 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1449 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1652 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1450 <target>IdatziJavaScript kodea zuzenean.&lt;br /&gt;Adibidez: &lt;pre&gt;console.log('nire instantzia zoragarria da');&lt;/pre&gt;</target> 1653 <target>IdatziJavaScript kodea zuzenean.&lt;br /&gt;Adibidez: &lt;pre&gt;console.log('nire instantzia zoragarria da');&lt;/pre&gt;</target>
1451 <context-group name="null"> 1654 <context-group name="null">
1452 <context context-type="linenumber">270</context> 1655 <context context-type="linenumber">297</context>
1453 </context-group>
1454 </trans-unit>
1455 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1456 <source>
1457 Write directly CSS code. Example:&lt;br /&gt;
1458 &lt;pre&gt;
1459 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1460 background-color: red;
1461 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1462 &lt;/pre&gt;
1463
1464 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1465 &lt;pre&gt;
1466 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1467 color: red;
1468 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1469 &lt;/pre&gt;
1470 </source>
1471 <target>
1472 Idatzi CSS kodea zuzenean. Adibidez:&lt;br /&gt;
1473 &lt;pre&gt;
1474 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1475 background-color: red;
1476 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1477 &lt;/pre&gt;
1478
1479 Idatzi aurretik &lt;em&gt;#custom-css&lt;/em&gt; estiloak gainidazteko. Adibidez:
1480 &lt;pre&gt;
1481 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1482 color: red;
1483 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1484 &lt;/pre&gt;
1485 </target>
1486 <context-group name="null">
1487 <context context-type="linenumber">286</context>
1488 </context-group> 1656 </context-group>
1489 </trans-unit> 1657 </trans-unit>
1490 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1658 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1491 <source>Advanced configuration</source> 1659 <source>Advanced configuration</source>
1492 <target>Konfigurazio aurreratua</target> 1660 <target>Konfigurazio aurreratua</target>
1493 <context-group name="null"> 1661 <context-group name="null">
1494 <context context-type="linenumber">197</context> 1662 <context context-type="linenumber">212</context>
1495 </context-group> 1663 </context-group>
1496 </trans-unit> 1664 </trans-unit>
1497 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1665 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1498 <source>Update configuration</source> 1666 <source>Update configuration</source>
1499 <target>Eguneratu konfigurazioa</target> 1667 <target>Eguneratu konfigurazioa</target>
1500 <context-group name="null"> 1668 <context-group name="null">
1501 <context context-type="linenumber">314</context> 1669 <context context-type="linenumber">340</context>
1502 </context-group> 1670 </context-group>
1503 </trans-unit> 1671 </trans-unit>
1504 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1672 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1505 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1673 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1506 <target>Konfigurazioa baliogabea dela dirudi. Bilatu zer egon daitekeen gaizki fitxa desberdinetan begiratuz.</target> 1674 <target>Konfigurazioa baliogabea dela dirudi. Bilatu zer egon daitekeen gaizki fitxa desberdinetan begiratuz.</target>
1507 <context-group name="null"> 1675 <context-group name="null">
1508 <context context-type="linenumber">315</context> 1676 <context context-type="linenumber">341</context>
1509 </context-group> 1677 </context-group>
1510 </trans-unit> 1678 </trans-unit>
1511 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1679 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1588,6 +1756,13 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1588 <context context-type="linenumber">21</context> 1756 <context context-type="linenumber">21</context>
1589 </context-group> 1757 </context-group>
1590 </trans-unit> 1758 </trans-unit>
1759 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1760 <source>Filter...</source>
1761 <target>Iragazkia...</target>
1762 <context-group name="null">
1763 <context context-type="linenumber">27</context>
1764 </context-group>
1765 </trans-unit>
1591 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1766 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1592 <source>ID</source> 1767 <source>ID</source>
1593 <target>ID-a</target> 1768 <target>ID-a</target>
@@ -1599,14 +1774,14 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1599 <source>Score</source> 1774 <source>Score</source>
1600 <target>Puntuazioa</target> 1775 <target>Puntuazioa</target>
1601 <context-group name="null"> 1776 <context-group name="null">
1602 <context context-type="linenumber">8</context> 1777 <context context-type="linenumber">17</context>
1603 </context-group> 1778 </context-group>
1604 </trans-unit> 1779 </trans-unit>
1605 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1780 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1606 <source>Host</source> 1781 <source>Host</source>
1607 <target>Ostalaria </target> 1782 <target>Ostalaria </target>
1608 <context-group name="null"> 1783 <context-group name="null">
1609 <context context-type="linenumber">8</context> 1784 <context context-type="linenumber">19</context>
1610 </context-group> 1785 </context-group>
1611 </trans-unit> 1786 </trans-unit>
1612 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1787 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1623,6 +1798,27 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1623 <context context-type="linenumber">11</context> 1798 <context context-type="linenumber">11</context>
1624 </context-group> 1799 </context-group>
1625 </trans-unit> 1800 </trans-unit>
1801 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1802 <source>Accepted</source>
1803 <target>Onartua</target>
1804 <context-group name="null">
1805 <context context-type="linenumber">32</context>
1806 </context-group>
1807 </trans-unit>
1808 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1809 <source>Pending</source>
1810 <target>Zain</target>
1811 <context-group name="null">
1812 <context context-type="linenumber">33</context>
1813 </context-group>
1814 </trans-unit>
1815 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1816 <source>Redundancy allowed</source>
1817 <target>Erredundantzia onartua</target>
1818 <context-group name="null">
1819 <context context-type="linenumber">22</context>
1820 </context-group>
1821 </trans-unit>
1626 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1822 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1627 <source>Manage follows</source> 1823 <source>Manage follows</source>
1628 <target>Kudeatu jarraipenak</target> 1824 <target>Kudeatu jarraipenak</target>
@@ -1711,7 +1907,7 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1711 <source>Role</source> 1907 <source>Role</source>
1712 <target>Rola</target> 1908 <target>Rola</target>
1713 <context-group name="null"> 1909 <context-group name="null">
1714 <context context-type="linenumber">20</context> 1910 <context context-type="linenumber">43</context>
1715 </context-group> 1911 </context-group>
1716 </trans-unit> 1912 </trans-unit>
1717 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1913 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1734,64 +1930,53 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1734 <context context-type="linenumber">72</context> 1930 <context context-type="linenumber">72</context>
1735 </context-group> 1931 </context-group>
1736 </trans-unit> 1932 </trans-unit>
1737 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 1933 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1738 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 1934 <source>Users list</source>
1739 <target>Debekatu <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target> 1935 <target>Erabiltzaileen zerrenda</target>
1740 <context-group name="null">
1741 <context context-type="linenumber">3</context>
1742 </context-group>
1743 </trans-unit>
1744 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1745 <source>Reason...</source>
1746 <target>Arrazoia...</target>
1747 <context-group name="null"> 1936 <context-group name="null">
1748 <context context-type="linenumber">11</context> 1937 <context context-type="linenumber">2</context>
1749 </context-group> 1938 </context-group>
1750 </trans-unit> 1939 </trans-unit>
1751 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251"> 1940 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1752 <source> 1941 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1753 A banned user will no longer be able to login. 1942 <target>Erabiltzaile-izena <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1754 </source>
1755 <target>
1756 Debekatutako erabiltzaile batek ezin izango du saioa hasi.
1757 </target>
1758 <context-group name="null"> 1943 <context-group name="null">
1759 <context context-type="linenumber">17</context> 1944 <context context-type="linenumber">40</context>
1760 </context-group> 1945 </context-group>
1761 </trans-unit> 1946 </trans-unit>
1762 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 1947 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1763 <source>Ban this user</source> 1948 <source>(banned)</source>
1764 <target>Debekatu erabiltzaile hau</target> 1949 <target>(debekatua)</target>
1765 <context-group name="null"> 1950 <context-group name="null">
1766 <context context-type="linenumber">25</context> 1951 <context context-type="linenumber">65</context>
1767 </context-group> 1952 </context-group>
1768 </trans-unit> 1953 </trans-unit>
1769 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1954 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1770 <source>Users list</source> 1955 <source>Go to the account page</source>
1771 <target>Erabiltzaileen zerrenda</target> 1956 <target>Joan kontuaren orrira</target>
1772 <context-group name="null"> 1957 <context-group name="null">
1773 <context context-type="linenumber">2</context> 1958 <context context-type="linenumber">133</context>
1774 </context-group> 1959 </context-group>
1775 </trans-unit> 1960 </trans-unit>
1776 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1961 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1777 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1962 <source>User's email must be verified to login</source>
1778 <target>Erabiltzaile-izena <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1963 <target>Erabiltzailearen e-mail helbidea baieztatu behar da saioa hasi aurretik</target>
1779 <context-group name="null"> 1964 <context-group name="null">
1780 <context context-type="linenumber">17</context> 1965 <context context-type="linenumber">72</context>
1781 </context-group> 1966 </context-group>
1782 </trans-unit> 1967 </trans-unit>
1783 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1968 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1784 <source>Actions</source> 1969 <source>User's email is verified / User can login without email verification</source>
1785 <target>Ekintzak</target> 1970 <target>Erabiltzailearen e-mail helbidea baieztatuta dago / Erabiltzaileak e-mail helbidea baieztatu gabe saioa hasi dezake</target>
1786 <context-group name="null"> 1971 <context-group name="null">
1787 <context context-type="linenumber">33</context> 1972 <context context-type="linenumber">76</context>
1788 </context-group> 1973 </context-group>
1789 </trans-unit> 1974 </trans-unit>
1790 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1975 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1791 <source>Ban reason:</source> 1976 <source>Ban reason:</source>
1792 <target>Debekatzeko arrazoia:</target> 1977 <target>Debekatzeko arrazoia:</target>
1793 <context-group name="null"> 1978 <context-group name="null">
1794 <context context-type="linenumber">51</context> 1979 <context context-type="linenumber">95</context>
1795 </context-group> 1980 </context-group>
1796 </trans-unit> 1981 </trans-unit>
1797 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1982 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1854,6 +2039,13 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1854 <context context-type="linenumber">33</context> 2039 <context context-type="linenumber">33</context>
1855 </context-group> 2040 </context-group>
1856 </trans-unit> 2041 </trans-unit>
2042 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2043 <source>Actions</source>
2044 <target>Ekintzak</target>
2045 <context-group name="null">
2046 <context context-type="linenumber">35</context>
2047 </context-group>
2048 </trans-unit>
1857 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2049 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1858 <source>Reason:</source> 2050 <source>Reason:</source>
1859 <target>Arrazoia:</target> 2051 <target>Arrazoia:</target>
@@ -1886,14 +2078,14 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1886 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2078 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1887 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2079 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1888 <context-group name="null"> 2080 <context-group name="null">
1889 <context context-type="linenumber">10</context> 2081 <context context-type="linenumber">11</context>
1890 </context-group> 2082 </context-group>
1891 </trans-unit> 2083 </trans-unit>
1892 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2084 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1893 <source>Blacklist reason:</source> 2085 <source>Blacklist reason:</source>
1894 <target>Zerrenda beltzean sartzeko arrazoia:</target> 2086 <target>Zerrenda beltzean sartzeko arrazoia:</target>
1895 <context-group name="null"> 2087 <context-group name="null">
1896 <context context-type="linenumber">41</context> 2088 <context context-type="linenumber">43</context>
1897 </context-group> 2089 </context-group>
1898 </trans-unit> 2090 </trans-unit>
1899 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2091 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1917,53 +2109,32 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1917 <context context-type="linenumber">7</context> 2109 <context context-type="linenumber">7</context>
1918 </context-group> 2110 </context-group>
1919 </trans-unit> 2111 </trans-unit>
1920 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2112 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1921 <source>My settings</source> 2113 <source>Muted accounts</source>
1922 <target>Nire ezarpenak</target> 2114 <target>Mutututako kontuak</target>
1923 <context-group name="null"> 2115 <context-group name="null">
1924 <context context-type="linenumber">3</context> 2116 <context context-type="linenumber">2</context>
1925 </context-group> 2117 </context-group>
1926 </trans-unit> 2118 </trans-unit>
1927 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2119 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1928 <source>My library</source> 2120 <source>Muted servers</source>
1929 <target>Nire liburutegia</target> 2121 <target>Mutututako zerbitzariak</target>
1930 <context-group name="null"> 2122 <context-group name="null">
1931 <context context-type="linenumber">7</context> 2123 <context context-type="linenumber">11</context>
1932 </context-group> 2124 </context-group>
1933 </trans-unit> 2125 </trans-unit>
1934 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2126 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1935 <source>My channels</source> 2127 <source>Account</source>
1936 <target>Nire kanalak</target> 2128 <target>Kontua</target>
1937 <context-group name="null"> 2129 <context-group name="null">
1938 <context context-type="linenumber">12</context> 2130 <context context-type="linenumber">12</context>
1939 </context-group> 2131 </context-group>
1940 </trans-unit> 2132 </trans-unit>
1941 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2133 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1942 <source>My videos</source> 2134 <source>Unmute</source>
1943 <target>Nire bideoak</target> 2135 <target>Desmututu</target>
1944 <context-group name="null">
1945 <context context-type="linenumber">14</context>
1946 </context-group>
1947 </trans-unit>
1948 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1949 <source>My subscriptions</source>
1950 <target>Nire harpidetzak</target>
1951 <context-group name="null">
1952 <context context-type="linenumber">16</context>
1953 </context-group>
1954 </trans-unit>
1955 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1956 <source>My imports</source>
1957 <target>Nire inportazioak</target>
1958 <context-group name="null">
1959 <context context-type="linenumber">18</context>
1960 </context-group>
1961 </trans-unit>
1962 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1963 <source>Ownership changes</source>
1964 <target>Jabetza aldaketak</target>
1965 <context-group name="null"> 2136 <context-group name="null">
1966 <context context-type="linenumber">22</context> 2137 <context context-type="linenumber">23</context>
1967 </context-group> 2138 </context-group>
1968 </trans-unit> 2139 </trans-unit>
1969 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2140 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1977,21 +2148,21 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1977 <source>Profile</source> 2148 <source>Profile</source>
1978 <target>Profila</target> 2149 <target>Profila</target>
1979 <context-group name="null"> 2150 <context-group name="null">
1980 <context context-type="linenumber">8</context> 2151 <context context-type="linenumber">7</context>
1981 </context-group> 2152 </context-group>
1982 </trans-unit> 2153 </trans-unit>
1983 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2154 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1984 <source>Video settings</source> 2155 <source>Video settings</source>
1985 <target>Bideo ezarpenak</target> 2156 <target>Bideo ezarpenak</target>
1986 <context-group name="null"> 2157 <context-group name="null">
1987 <context context-type="linenumber">15</context> 2158 <context context-type="linenumber">16</context>
1988 </context-group> 2159 </context-group>
1989 </trans-unit> 2160 </trans-unit>
1990 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2161 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1991 <source>Danger zone</source> 2162 <source>Danger zone</source>
1992 <target>Eremu arriskutsua</target> 2163 <target>Eremu arriskutsua</target>
1993 <context-group name="null"> 2164 <context-group name="null">
1994 <context context-type="linenumber">18</context> 2165 <context context-type="linenumber">19</context>
1995 </context-group> 2166 </context-group>
1996 </trans-unit> 2167 </trans-unit>
1997 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2168 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2019,13 +2190,6 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2019 <context context-type="linenumber">35</context> 2190 <context context-type="linenumber">35</context>
2020 </context-group> 2191 </context-group>
2021 </trans-unit> 2192 </trans-unit>
2022 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2023 <source>Submit</source>
2024 <target>Bidali</target>
2025 <context-group name="null">
2026 <context context-type="linenumber">24</context>
2027 </context-group>
2028 </trans-unit>
2029 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2193 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2030 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2194 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2031 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target> 2195 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target>
@@ -2102,6 +2266,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2102 <context context-type="linenumber">8</context> 2266 <context context-type="linenumber">8</context>
2103 </context-group> 2267 </context-group>
2104 </trans-unit> 2268 </trans-unit>
2269 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2270 <source>You don't have any subscriptions yet.</source>
2271 <target>Ez duzu harpidetzarik oraindik.</target>
2272 <context-group name="null">
2273 <context context-type="linenumber">1</context>
2274 </context-group>
2275 </trans-unit>
2105 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2276 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
2106 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2277 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
2107 <target><x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/>(e)k sortuta</target> 2278 <target><x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/>(e)k sortuta</target>
@@ -2177,6 +2348,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2177 <context context-type="linenumber">47</context> 2348 <context context-type="linenumber">47</context>
2178 </context-group> 2349 </context-group>
2179 </trans-unit> 2350 </trans-unit>
2351 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2352 <source>Muted instances</source>
2353 <target>Mutututako instantziak</target>
2354 <context-group name="null">
2355 <context context-type="linenumber">2</context>
2356 </context-group>
2357 </trans-unit>
2180 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2358 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2181 <source>Change password</source> 2359 <source>Change password</source>
2182 <target>Aldatu pasahitza</target> 2360 <target>Aldatu pasahitza</target>
@@ -2184,6 +2362,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2184 <context context-type="linenumber">30</context> 2362 <context context-type="linenumber">30</context>
2185 </context-group> 2363 </context-group>
2186 </trans-unit> 2364 </trans-unit>
2365 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2366 <source>Current password</source>
2367 <target>Oraingo pasahitza</target>
2368 <context-group name="null">
2369 <context context-type="linenumber">7</context>
2370 </context-group>
2371 </trans-unit>
2187 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2372 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2188 <source>New password</source> 2373 <source>New password</source>
2189 <target>Pasahitz berria</target> 2374 <target>Pasahitz berria</target>
@@ -2205,18 +2390,25 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2205 <context context-type="linenumber">3</context> 2390 <context context-type="linenumber">3</context>
2206 </context-group> 2391 </context-group>
2207 </trans-unit> 2392 </trans-unit>
2393 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2394 <source>Use WebTorrent to exchange parts of the video with others</source>
2395 <target>Erabili WebTorrent bideoaren zatiak besteekin partekatzeko</target>
2396 <context-group name="null">
2397 <context context-type="linenumber">21</context>
2398 </context-group>
2399 </trans-unit>
2208 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2400 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2209 <source>Automatically plays video</source> 2401 <source>Automatically plays video</source>
2210 <target>Automatikoki abiatzen du bideoa</target> 2402 <target>Automatikoki abiatzen du bideoa</target>
2211 <context-group name="null"> 2403 <context-group name="null">
2212 <context context-type="linenumber">20</context> 2404 <context context-type="linenumber">28</context>
2213 </context-group> 2405 </context-group>
2214 </trans-unit> 2406 </trans-unit>
2215 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2407 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2216 <source>Save</source> 2408 <source>Save</source>
2217 <target>Gorde</target> 2409 <target>Gorde</target>
2218 <context-group name="null"> 2410 <context-group name="null">
2219 <context context-type="linenumber">23</context> 2411 <context context-type="linenumber">32</context>
2220 </context-group> 2412 </context-group>
2221 </trans-unit> 2413 </trans-unit>
2222 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2414 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2247,6 +2439,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2247 <context context-type="linenumber">18</context> 2439 <context context-type="linenumber">18</context>
2248 </context-group> 2440 </context-group>
2249 </trans-unit> 2441 </trans-unit>
2442 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2443 <source>Once you delete your account, there is no going back. Please be certain.</source>
2444 <target>Behin kontua ezabatuta ez dago atzera egiterik. Ziurtatu hau dela nahi duzuna.</target>
2445 <context-group name="null">
2446 <context context-type="linenumber">2</context>
2447 </context-group>
2448 </trans-unit>
2250 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2449 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2251 <source>Delete your account</source> 2450 <source>Delete your account</source>
2252 <target>Ezabatu zure kontua</target> 2451 <target>Ezabatu zure kontua</target>
@@ -2361,6 +2560,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2361 <context context-type="linenumber">159</context> 2560 <context context-type="linenumber">159</context>
2362 </context-group> 2561 </context-group>
2363 </trans-unit> 2562 </trans-unit>
2563 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2564 <source>Sorry, but something went wrong</source>
2565 <target>Akatsen bat egon da</target>
2566 <context-group name="null">
2567 <context context-type="linenumber">49</context>
2568 </context-group>
2569 </trans-unit>
2364 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2570 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2365 <source> 2571 <source>
2366 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2572 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2369,7 +2575,7 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2369 Zorionak, <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> helbideko bideoa inportatuko da! Bideoaren informazioa gehitzen hasi zaitezke jada. 2575 Zorionak, <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> helbideko bideoa inportatuko da! Bideoaren informazioa gehitzen hasi zaitezke jada.
2370</target> 2576</target>
2371 <context-group name="null"> 2577 <context-group name="null">
2372 <context context-type="linenumber">40</context> 2578 <context context-type="linenumber">46</context>
2373 </context-group> 2579 </context-group>
2374 </trans-unit> 2580 </trans-unit>
2375 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2581 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2386,18 +2592,25 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2386 <context context-type="linenumber">6</context> 2592 <context context-type="linenumber">6</context>
2387 </context-group> 2593 </context-group>
2388 </trans-unit> 2594 </trans-unit>
2595 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2596 <source>Scheduled</source>
2597 <target>Programatuta</target>
2598 <context-group name="null">
2599 <context context-type="linenumber">25</context>
2600 </context-group>
2601 </trans-unit>
2389 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2602 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
2390 <source>Publish will be available when upload is finished</source> 2603 <source>Publish will be available when upload is finished</source>
2391 <target>Argitaratzea behin igoera bukatzean egongo da erabilgarri</target> 2604 <target>Argitaratzea behin igoera bukatzean egongo da erabilgarri</target>
2392 <context-group name="null"> 2605 <context-group name="null">
2393 <context context-type="linenumber">48</context> 2606 <context context-type="linenumber">58</context>
2394 </context-group> 2607 </context-group>
2395 </trans-unit> 2608 </trans-unit>
2396 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2609 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2397 <source>Publish</source> 2610 <source>Publish</source>
2398 <target>Argitaratu</target> 2611 <target>Argitaratu</target>
2399 <context-group name="null"> 2612 <context-group name="null">
2400 <context context-type="linenumber">55</context> 2613 <context context-type="linenumber">65</context>
2401 </context-group> 2614 </context-group>
2402 </trans-unit> 2615 </trans-unit>
2403 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2616 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2407,6 +2620,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2407 <context context-type="linenumber">6</context> 2620 <context context-type="linenumber">6</context>
2408 </context-group> 2621 </context-group>
2409 </trans-unit> 2622 </trans-unit>
2623 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2624 <source>Or</source>
2625 <target>Edo</target>
2626 <context-group name="null">
2627 <context context-type="linenumber">11</context>
2628 </context-group>
2629 </trans-unit>
2410 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2630 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2411 <source>Paste magnet URI</source> 2631 <source>Paste magnet URI</source>
2412 <target>Itsatsi magnet URLa</target> 2632 <target>Itsatsi magnet URLa</target>
@@ -2429,7 +2649,7 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2429 Zorionak, bideoa BitTorrent bidez inportatuko da! Bideoaren informazioa gehitzen hasi zaitezke. 2649 Zorionak, bideoa BitTorrent bidez inportatuko da! Bideoaren informazioa gehitzen hasi zaitezke.
2430</target> 2650</target>
2431 <context-group name="null"> 2651 <context-group name="null">
2432 <context context-type="linenumber">48</context> 2652 <context context-type="linenumber">53</context>
2433 </context-group> 2653 </context-group>
2434 </trans-unit> 2654 </trans-unit>
2435 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2655 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2520,6 +2740,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2520 <context context-type="linenumber">18</context> 2740 <context context-type="linenumber">18</context>
2521 </context-group> 2741 </context-group>
2522 </trans-unit> 2742 </trans-unit>
2743 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2744 <source>+ Tag</source>
2745 <target>+Etiketa</target>
2746 <context-group name="null">
2747 <context context-type="linenumber">21</context>
2748 </context-group>
2749 </trans-unit>
2750 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2751 <source>Enter a new tag</source>
2752 <target>Sartu etiketa berria</target>
2753 <context-group name="null">
2754 <context context-type="linenumber">21</context>
2755 </context-group>
2756 </trans-unit>
2523 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2757 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2524 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2758 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2525 <target>Lehenetsita bideoen deskripzioak mozten dira eta eskuz hedatu behar dira.</target> 2759 <target>Lehenetsita bideoen deskripzioak mozten dira eta eskuz hedatu behar dira.</target>
@@ -2559,14 +2793,14 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2559 <source>Wait transcoding before publishing the video</source> 2793 <source>Wait transcoding before publishing the video</source>
2560 <target>Itxaron transkodetzeari bideoa argitaratu aurretik</target> 2794 <target>Itxaron transkodetzeari bideoa argitaratu aurretik</target>
2561 <context-group name="null"> 2795 <context-group name="null">
2562 <context context-type="linenumber">130</context> 2796 <context context-type="linenumber">131</context>
2563 </context-group> 2797 </context-group>
2564 </trans-unit> 2798 </trans-unit>
2565 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2799 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2566 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2800 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2567 <target>Bideoa argitaratu aurretik ez baduzu transkodetzea bukatu arte itxaroten, bideoa transkodetzea bukatu arte ezin ikustea gerta daiteke.</target> 2801 <target>Bideoa argitaratu aurretik ez baduzu transkodetzea bukatu arte itxaroten, bideoa transkodetzea bukatu arte ezin ikustea gerta daiteke.</target>
2568 <context-group name="null"> 2802 <context-group name="null">
2569 <context context-type="linenumber">131</context> 2803 <context context-type="linenumber">132</context>
2570 </context-group> 2804 </context-group>
2571 </trans-unit> 2805 </trans-unit>
2572 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2806 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2580,49 +2814,81 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2580 <source>Add another caption</source> 2814 <source>Add another caption</source>
2581 <target>Gehitu beste azpititulu bat</target> 2815 <target>Gehitu beste azpititulu bat</target>
2582 <context-group name="null"> 2816 <context-group name="null">
2583 <context context-type="linenumber">146</context> 2817 <context context-type="linenumber">147</context>
2584 </context-group> 2818 </context-group>
2585 </trans-unit> 2819 </trans-unit>
2586 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2820 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2587 <source>See the subtitle file</source> 2821 <source>See the subtitle file</source>
2588 <target>Ikusi azpitituluen fitxategia</target> 2822 <target>Ikusi azpitituluen fitxategia</target>
2589 <context-group name="null"> 2823 <context-group name="null">
2590 <context context-type="linenumber">155</context> 2824 <context context-type="linenumber">156</context>
2825 </context-group>
2826 </trans-unit>
2827 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2828 <source>Already uploaded ✔</source>
2829 <target>Jadanik igota ✔</target>
2830 <context-group name="null">
2831 <context context-type="linenumber">160</context>
2832 </context-group>
2833 </trans-unit>
2834 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2835 <source>Will be created on update</source>
2836 <target>Eguneratzean sortuko da</target>
2837 <context-group name="null">
2838 <context context-type="linenumber">168</context>
2591 </context-group> 2839 </context-group>
2592 </trans-unit> 2840 </trans-unit>
2593 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2841 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2594 <source>Cancel create</source> 2842 <source>Cancel create</source>
2595 <target>Ezeztatu sorkuntza</target> 2843 <target>Ezeztatu sorkuntza</target>
2596 <context-group name="null"> 2844 <context-group name="null">
2597 <context context-type="linenumber">169</context> 2845 <context context-type="linenumber">170</context>
2846 </context-group>
2847 </trans-unit>
2848 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2849 <source>Will be deleted on update</source>
2850 <target>Eguneratzean ezabatuko da</target>
2851 <context-group name="null">
2852 <context context-type="linenumber">176</context>
2598 </context-group> 2853 </context-group>
2599 </trans-unit> 2854 </trans-unit>
2600 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2855 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2601 <source>Cancel deletion</source> 2856 <source>Cancel deletion</source>
2602 <target>Ezeztatu ezabaketa</target> 2857 <target>Ezeztatu ezabaketa</target>
2603 <context-group name="null"> 2858 <context-group name="null">
2604 <context context-type="linenumber">177</context> 2859 <context context-type="linenumber">178</context>
2860 </context-group>
2861 </trans-unit>
2862 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
2863 <source>
2864 No captions for now.
2865 </source>
2866 <target>
2867 Azpititulurik ez oraingoz.
2868 </target>
2869 <context-group name="null">
2870 <context context-type="linenumber">183</context>
2605 </context-group> 2871 </context-group>
2606 </trans-unit> 2872 </trans-unit>
2607 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2873 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2608 <source>Captions</source> 2874 <source>Captions</source>
2609 <target>Azpitituluak</target> 2875 <target>Azpitituluak</target>
2610 <context-group name="null"> 2876 <context-group name="null">
2611 <context context-type="linenumber">139</context> 2877 <context context-type="linenumber">140</context>
2612 </context-group> 2878 </context-group>
2613 </trans-unit> 2879 </trans-unit>
2614 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2880 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2615 <source>Upload thumbnail</source> 2881 <source>Upload thumbnail</source>
2616 <target>Igo irudia</target> 2882 <target>Igo irudia</target>
2617 <context-group name="null"> 2883 <context-group name="null">
2618 <context context-type="linenumber">195</context> 2884 <context context-type="linenumber">196</context>
2619 </context-group> 2885 </context-group>
2620 </trans-unit> 2886 </trans-unit>
2621 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2887 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2622 <source>Upload preview</source> 2888 <source>Upload preview</source>
2623 <target>Igo aurrebista</target> 2889 <target>Igo aurrebista</target>
2624 <context-group name="null"> 2890 <context-group name="null">
2625 <context context-type="linenumber">202</context> 2891 <context context-type="linenumber">203</context>
2626 </context-group> 2892 </context-group>
2627 </trans-unit> 2893 </trans-unit>
2628 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2894 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2636,14 +2902,14 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2636 <source>Short text to tell people how they can support you (membership platform...).</source> 2902 <source>Short text to tell people how they can support you (membership platform...).</source>
2637 <target>Jendeari zu nola babestu azaltzeko testu labur bat (kidetza plataforma...).</target> 2903 <target>Jendeari zu nola babestu azaltzeko testu labur bat (kidetza plataforma...).</target>
2638 <context-group name="null"> 2904 <context-group name="null">
2639 <context context-type="linenumber">209</context> 2905 <context context-type="linenumber">210</context>
2640 </context-group> 2906 </context-group>
2641 </trans-unit> 2907 </trans-unit>
2642 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2908 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2643 <source>Advanced settings</source> 2909 <source>Advanced settings</source>
2644 <target>Ezarpen aurreratuak</target> 2910 <target>Ezarpen aurreratuak</target>
2645 <context-group name="null"> 2911 <context-group name="null">
2646 <context context-type="linenumber">190</context> 2912 <context context-type="linenumber">191</context>
2647 </context-group> 2913 </context-group>
2648 </trans-unit> 2914 </trans-unit>
2649 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2915 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2710,17 +2976,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2710 <context context-type="linenumber">3</context> 2976 <context context-type="linenumber">3</context>
2711 </context-group> 2977 </context-group>
2712 </trans-unit> 2978 </trans-unit>
2713 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2714 <source>
2715 Cancel
2716 </source>
2717 <target>
2718 Utzi
2719 </target>
2720 <context-group name="null">
2721 <context context-type="linenumber">19</context>
2722 </context-group>
2723 </trans-unit>
2724 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2979 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2725 <source>Share</source> 2980 <source>Share</source>
2726 <target>Partekatu</target> 2981 <target>Partekatu</target>
@@ -2920,13 +3175,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2920 <context context-type="linenumber">134</context> 3175 <context context-type="linenumber">134</context>
2921 </context-group> 3176 </context-group>
2922 </trans-unit> 3177 </trans-unit>
2923 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2924 <source>Go to the account page</source>
2925 <target>Joan kontuaren orrira</target>
2926 <context-group name="null">
2927 <context context-type="linenumber">133</context>
2928 </context-group>
2929 </trans-unit>
2930 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3178 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2931 <source>Show more</source> 3179 <source>Show more</source>
2932 <target>Erakutsi gehiago</target> 3180 <target>Erakutsi gehiago</target>
@@ -3006,25 +3254,18 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3006 <context context-type="linenumber">3</context> 3254 <context context-type="linenumber">3</context>
3007 </context-group> 3255 </context-group>
3008 </trans-unit> 3256 </trans-unit>
3009 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3010 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3011 <target>Bideo hau zure PeerTube kontuarekin federatzen den zure instantziaren orrian egin dezakezu iruzkina, edo ActivityPub onartzen duen fedibertsoko edozein instantzian. Adibidez Mastodon edo Pleroma instantzietan, bilaketa kutxan &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; idatzi dezakezu bideoa aurkitzeko. Iruzkinak zuzenean egitek aukera garapenean dago: &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
3012 <context-group name="null">
3013 <context context-type="linenumber">8</context>
3014 </context-group>
3015 </trans-unit>
3016 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3257 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3017 <source>No comments.</source> 3258 <source>No comments.</source>
3018 <target>Iruzkinik ez.</target> 3259 <target>Iruzkinik ez.</target>
3019 <context-group name="null"> 3260 <context-group name="null">
3020 <context context-type="linenumber">18</context> 3261 <context context-type="linenumber">17</context>
3021 </context-group> 3262 </context-group>
3022 </trans-unit> 3263 </trans-unit>
3023 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3264 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3024 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3265 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3025 <target>Ikusi <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> erantzun</target> 3266 <target>Ikusi <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> erantzun</target>
3026 <context-group name="null"> 3267 <context-group name="null">
3027 <context context-type="linenumber">55</context> 3268 <context context-type="linenumber">54</context>
3028 </context-group> 3269 </context-group>
3029 </trans-unit> 3270 </trans-unit>
3030 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3271 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3035,7 +3276,7 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3035 Iruzkinak desgaituta daude. 3276 Iruzkinak desgaituta daude.
3036 </target> 3277 </target>
3037 <context-group name="null"> 3278 <context-group name="null">
3038 <context context-type="linenumber">64</context> 3279 <context context-type="linenumber">63</context>
3039 </context-group> 3280 </context-group>
3040 </trans-unit> 3281 </trans-unit>
3041 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3282 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3056,6 +3297,40 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3056 <context context-type="linenumber">20</context> 3297 <context context-type="linenumber">20</context>
3057 </context-group> 3298 </context-group>
3058 </trans-unit> 3299 </trans-unit>
3300 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3301 <source>You are one step away from commenting</source>
3302 <target>Iruzkina egitetik urrats batera zaude</target>
3303 <context-group name="null">
3304 <context context-type="linenumber">28</context>
3305 </context-group>
3306 </trans-unit>
3307 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3308 <source>
3309 If you have an account on this instance, you can login:
3310 </source>
3311 <target>
3312 Instantzia honetan kontua baduzu, saioa hasi dezakezu:
3313 </target>
3314 <context-group name="null">
3315 <context context-type="linenumber">32</context>
3316 </context-group>
3317 </trans-unit>
3318 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3319 <source>login to comment</source>
3320 <target>hasi saioa iruzkinak egiteko</target>
3321 <context-group name="null">
3322 <context context-type="linenumber">35</context>
3323 </context-group>
3324 </trans-unit>
3325 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3326 <source>
3327 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3328 </source>
3329 <target>Mastodon edo Pleroma sareetan kontua baduzu, zuzenean ireki dezakezu hango interfazean:</target>
3330 <context-group name="null">
3331 <context context-type="linenumber">41</context>
3332 </context-group>
3333 </trans-unit>
3059 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3334 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3060 <source>Highlighted comment</source> 3335 <source>Highlighted comment</source>
3061 <target>Nabarmendutako iruzkina</target> 3336 <target>Nabarmendutako iruzkina</target>
@@ -3070,13 +3345,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3070 <context context-type="linenumber">14</context> 3345 <context context-type="linenumber">14</context>
3071 </context-group> 3346 </context-group>
3072 </trans-unit> 3347 </trans-unit>
3073 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3074 <source>Error getting about from server</source>
3075 <target>Errorea informazioa zerbitzaritik jasotzean</target>
3076 <context-group name="null">
3077 <context context-type="linenumber">1</context>
3078 </context-group>
3079 </trans-unit>
3080 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3348 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3081 <source>No description</source> 3349 <source>No description</source>
3082 <target>Deskripziorik ez</target> 3350 <target>Deskripziorik ez</target>
@@ -3098,51 +3366,44 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3098 <context context-type="linenumber">1</context> 3366 <context context-type="linenumber">1</context>
3099 </context-group> 3367 </context-group>
3100 </trans-unit> 3368 </trans-unit>
3101 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3369 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3102 <source>Error</source> 3370 <source>240p</source>
3103 <target>Errorea</target> 3371 <target>240p</target>
3104 <context-group name="null">
3105 <context context-type="linenumber">1</context>
3106 </context-group>
3107 </trans-unit>
3108 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3109 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3110 <target><x id="INTERPOLATION" equiv-text="{{customizationsText}}"/> pertsonalizatua ezarri duzu. </target>
3111 <context-group name="null"> 3372 <context-group name="null">
3112 <context context-type="linenumber">1</context> 3373 <context context-type="linenumber">1</context>
3113 </context-group> 3374 </context-group>
3114 </trans-unit> 3375 </trans-unit>
3115 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3376 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3116 <source>This could lead to security issues or bugs if you do not understand it. </source> 3377 <source>360p</source>
3117 <target>Honek segurtasun arazoak edo akatsak ekar litzake egindakoa ulertzen ez baduzu. </target> 3378 <target>360p</target>
3118 <context-group name="null"> 3379 <context-group name="null">
3119 <context context-type="linenumber">1</context> 3380 <context context-type="linenumber">1</context>
3120 </context-group> 3381 </context-group>
3121 </trans-unit> 3382 </trans-unit>
3122 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3383 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3123 <source>Are you sure you want to update the configuration?</source> 3384 <source>480p</source>
3124 <target>Ziur konfigurazioa aldatu nahi duzula?</target> 3385 <target>480p</target>
3125 <context-group name="null"> 3386 <context-group name="null">
3126 <context context-type="linenumber">1</context> 3387 <context context-type="linenumber">1</context>
3127 </context-group> 3388 </context-group>
3128 </trans-unit> 3389 </trans-unit>
3129 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3390 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3130 <source>Please type</source> 3391 <source>720p</source>
3131 <target>Idatzi</target> 3392 <target>720p</target>
3132 <context-group name="null"> 3393 <context-group name="null">
3133 <context context-type="linenumber">1</context> 3394 <context context-type="linenumber">1</context>
3134 </context-group> 3395 </context-group>
3135 </trans-unit> 3396 </trans-unit>
3136 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3397 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3137 <source>to confirm.</source> 3398 <source>1080p</source>
3138 <target>berresteko.</target> 3399 <target>1080p</target>
3139 <context-group name="null"> 3400 <context-group name="null">
3140 <context context-type="linenumber">1</context> 3401 <context context-type="linenumber">1</context>
3141 </context-group> 3402 </context-group>
3142 </trans-unit> 3403 </trans-unit>
3143 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 3404 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3144 <source>Success</source> 3405 <source>Auto (via ffmpeg)</source>
3145 <target>Arrakasta</target> 3406 <target>Automatikoa (ffmpeg bidez)</target>
3146 <context-group name="null"> 3407 <context-group name="null">
3147 <context context-type="linenumber">1</context> 3408 <context context-type="linenumber">1</context>
3148 </context-group> 3409 </context-group>
@@ -3161,6 +3422,69 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3161 <context context-type="linenumber">1</context> 3422 <context context-type="linenumber">1</context>
3162 </context-group> 3423 </context-group>
3163 </trans-unit> 3424 </trans-unit>
3425 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3426 <source>100MB</source>
3427 <target>100MB</target>
3428 <context-group name="null">
3429 <context context-type="linenumber">1</context>
3430 </context-group>
3431 </trans-unit>
3432 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3433 <source>500MB</source>
3434 <target>500MB</target>
3435 <context-group name="null">
3436 <context context-type="linenumber">1</context>
3437 </context-group>
3438 </trans-unit>
3439 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3440 <source>1GB</source>
3441 <target>1GB</target>
3442 <context-group name="null">
3443 <context context-type="linenumber">1</context>
3444 </context-group>
3445 </trans-unit>
3446 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3447 <source>5GB</source>
3448 <target>5GB</target>
3449 <context-group name="null">
3450 <context context-type="linenumber">1</context>
3451 </context-group>
3452 </trans-unit>
3453 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3454 <source>20GB</source>
3455 <target>20GB</target>
3456 <context-group name="null">
3457 <context context-type="linenumber">1</context>
3458 </context-group>
3459 </trans-unit>
3460 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3461 <source>50GB</source>
3462 <target>50GB</target>
3463 <context-group name="null">
3464 <context context-type="linenumber">1</context>
3465 </context-group>
3466 </trans-unit>
3467 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3468 <source>10MB</source>
3469 <target>10MB</target>
3470 <context-group name="null">
3471 <context context-type="linenumber">1</context>
3472 </context-group>
3473 </trans-unit>
3474 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3475 <source>50MB</source>
3476 <target>50MB</target>
3477 <context-group name="null">
3478 <context context-type="linenumber">1</context>
3479 </context-group>
3480 </trans-unit>
3481 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3482 <source>2GB</source>
3483 <target>2GB</target>
3484 <context-group name="null">
3485 <context context-type="linenumber">1</context>
3486 </context-group>
3487 </trans-unit>
3164 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3488 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3165 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3489 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3166 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> baliogabea da</target> 3490 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> baliogabea da</target>
@@ -3224,6 +3548,34 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3224 <context context-type="linenumber">1</context> 3548 <context context-type="linenumber">1</context>
3225 </context-group> 3549 </context-group>
3226 </trans-unit> 3550 </trans-unit>
3551 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
3552 <source>enabled</source>
3553 <target>gaituta</target>
3554 <context-group name="null">
3555 <context context-type="linenumber">1</context>
3556 </context-group>
3557 </trans-unit>
3558 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
3559 <source>disabled</source>
3560 <target>desgaituta</target>
3561 <context-group name="null">
3562 <context context-type="linenumber">1</context>
3563 </context-group>
3564 </trans-unit>
3565 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3566 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3567 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> kontua zure instantziak desmutututa.</target>
3568 <context-group name="null">
3569 <context context-type="linenumber">1</context>
3570 </context-group>
3571 </trans-unit>
3572 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3573 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3574 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> instantzia zure instantziak demutututa.</target>
3575 <context-group name="null">
3576 <context context-type="linenumber">1</context>
3577 </context-group>
3578 </trans-unit>
3227 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3579 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3228 <source>Comment updated.</source> 3580 <source>Comment updated.</source>
3229 <target>Iruzkina eguneratua.</target> 3581 <target>Iruzkina eguneratua.</target>
@@ -3231,6 +3583,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3231 <context context-type="linenumber">1</context> 3583 <context context-type="linenumber">1</context>
3232 </context-group> 3584 </context-group>
3233 </trans-unit> 3585 </trans-unit>
3586 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3587 <source>Delete this report</source>
3588 <target>Ezabatu salaketa hau</target>
3589 <context-group name="null">
3590 <context context-type="linenumber">1</context>
3591 </context-group>
3592 </trans-unit>
3234 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3593 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3235 <source>Update moderation comment</source> 3594 <source>Update moderation comment</source>
3236 <target>Eguneratu moderazio iruzkina</target> 3595 <target>Eguneratu moderazio iruzkina</target>
@@ -3252,9 +3611,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3252 <context context-type="linenumber">1</context> 3611 <context context-type="linenumber">1</context>
3253 </context-group> 3612 </context-group>
3254 </trans-unit> 3613 </trans-unit>
3255 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3614 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3256 <source>Do you really want to delete this abuse?</source> 3615 <source>Do you really want to delete this abuse report?</source>
3257 <target>Ziur zaude gehiegikeria hau ezabatu nahi duzula?</target> 3616 <target>Ziur gehiegikeria salaketa hau ezabatu nahi duzula?</target>
3258 <context-group name="null"> 3617 <context-group name="null">
3259 <context context-type="linenumber">1</context> 3618 <context context-type="linenumber">1</context>
3260 </context-group> 3619 </context-group>
@@ -3301,23 +3660,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3301 <context context-type="linenumber">1</context> 3660 <context context-type="linenumber">1</context>
3302 </context-group> 3661 </context-group>
3303 </trans-unit> 3662 </trans-unit>
3304 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 3663 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3305 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 3664 <source>Unban</source>
3306 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailea debekatuta.</target> 3665 <target>Kendu debekua</target>
3307 <context-group name="null">
3308 <context context-type="linenumber">1</context>
3309 </context-group>
3310 </trans-unit>
3311 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3312 <source>Ban</source>
3313 <target>Debekatu</target>
3314 <context-group name="null"> 3666 <context-group name="null">
3315 <context context-type="linenumber">1</context> 3667 <context context-type="linenumber">1</context>
3316 </context-group> 3668 </context-group>
3317 </trans-unit> 3669 </trans-unit>
3318 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3670 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3319 <source>Unban</source> 3671 <source>Set Email as Verified</source>
3320 <target>Kendu debekua</target> 3672 <target>Ezarri e-maila baieztatua gisa</target>
3321 <context-group name="null"> 3673 <context-group name="null">
3322 <context context-type="linenumber">1</context> 3674 <context context-type="linenumber">1</context>
3323 </context-group> 3675 </context-group>
@@ -3329,16 +3681,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3329 <context context-type="linenumber">1</context> 3681 <context context-type="linenumber">1</context>
3330 </context-group> 3682 </context-group>
3331 </trans-unit> 3683 </trans-unit>
3332 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 3684 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3333 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 3685 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3334 <target>Ziur zaude <x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzaileari debekua kendu nahi diozula?</target> 3686 <target>Ziur <x id="INTERPOLATION" equiv-text="{{num}}"/> erabiltzaileei debekua kendu nahi diozula?</target>
3335 <context-group name="null"> 3687 <context-group name="null">
3336 <context context-type="linenumber">1</context> 3688 <context context-type="linenumber">1</context>
3337 </context-group> 3689 </context-group>
3338 </trans-unit> 3690 </trans-unit>
3339 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 3691 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3340 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 3692 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3341 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzaileari debekua kendu zaio.</target> 3693 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> erabiltzaileei debekua kendu zaie.</target>
3342 <context-group name="null"> 3694 <context-group name="null">
3343 <context context-type="linenumber">1</context> 3695 <context context-type="linenumber">1</context>
3344 </context-group> 3696 </context-group>
@@ -3350,9 +3702,37 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3350 <context context-type="linenumber">1</context> 3702 <context context-type="linenumber">1</context>
3351 </context-group> 3703 </context-group>
3352 </trans-unit> 3704 </trans-unit>
3353 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3705 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3354 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3706 <source>If you remove these users, you will not be able to create others with the same username!</source>
3355 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailea ezabatuta.</target> 3707 <target>Erabiltzaile hauek kentzen badituzu, ezin izango duzu izen bereko beste konturik sortu!</target>
3708 <context-group name="null">
3709 <context context-type="linenumber">1</context>
3710 </context-group>
3711 </trans-unit>
3712 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3713 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3714 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> erabiltzaile ezabatuta.</target>
3715 <context-group name="null">
3716 <context context-type="linenumber">1</context>
3717 </context-group>
3718 </trans-unit>
3719 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3720 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3721 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> erabiltzailearen e-mail helbidea baieztatua gisa ezarri da.</target>
3722 <context-group name="null">
3723 <context context-type="linenumber">1</context>
3724 </context-group>
3725 </trans-unit>
3726 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3727 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3728 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> kontua desmutututa.</target>
3729 <context-group name="null">
3730 <context context-type="linenumber">1</context>
3731 </context-group>
3732 </trans-unit>
3733 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3734 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3735 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> instantzia desmutututa.</target>
3356 <context-group name="null"> 3736 <context-group name="null">
3357 <context context-type="linenumber">1</context> 3737 <context context-type="linenumber">1</context>
3358 </context-group> 3738 </context-group>
@@ -3371,6 +3751,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3371 <context context-type="linenumber">1</context> 3751 <context context-type="linenumber">1</context>
3372 </context-group> 3752 </context-group>
3373 </trans-unit> 3753 </trans-unit>
3754 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3755 <source>You current password is invalid.</source>
3756 <target>Zure uneko pasahitza baliogabea da.</target>
3757 <context-group name="null">
3758 <context context-type="linenumber">1</context>
3759 </context-group>
3760 </trans-unit>
3374 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3761 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3375 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3762 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3376 <target>Ziur kontua ezabatu nahi duzula? Honek zure datu guztiak ezabatuko ditu, kanalak, bideoak eta abar barne.</target> 3763 <target>Ziur kontua ezabatu nahi duzula? Honek zure datu guztiak ezabatuko ditu, kanalak, bideoak eta abar barne.</target>
@@ -3427,6 +3814,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3427 <context context-type="linenumber">1</context> 3814 <context context-type="linenumber">1</context>
3428 </context-group> 3815 </context-group>
3429 </trans-unit> 3816 </trans-unit>
3817 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3818 <source>This name already exists on this instance.</source>
3819 <target>Izen hau hartuta dago instantzia honetan</target>
3820 <context-group name="null">
3821 <context context-type="linenumber">1</context>
3822 </context-group>
3823 </trans-unit>
3430 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3824 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3431 <source>Create</source> 3825 <source>Create</source>
3432 <target>Sortu</target> 3826 <target>Sortu</target>
@@ -3441,23 +3835,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3441 <context context-type="linenumber">1</context> 3835 <context context-type="linenumber">1</context>
3442 </context-group> 3836 </context-group>
3443 </trans-unit> 3837 </trans-unit>
3444 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3838 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3445 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3839 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3446 <target>Ziur <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ezabatu nahi duzula? Kanalera igotako bideo guztiak ezabatuko dira ere.</target> 3840 <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target>
3447 <context-group name="null">
3448 <context context-type="linenumber">1</context>
3449 </context-group>
3450 </trans-unit>
3451 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3452 <source>Please type the name of the video channel to confirm</source>
3453 <target>Idatzi bideo kanalaren izena berresteko</target>
3454 <context-group name="null"> 3841 <context-group name="null">
3455 <context context-type="linenumber">1</context> 3842 <context context-type="linenumber">1</context>
3456 </context-group> 3843 </context-group>
3457 </trans-unit> 3844 </trans-unit>
3458 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3845 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3459 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3846 <source>My videos</source>
3460 <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target> 3847 <target>Nire bideoak</target>
3461 <context-group name="null"> 3848 <context-group name="null">
3462 <context context-type="linenumber">1</context> 3849 <context context-type="linenumber">1</context>
3463 </context-group> 3850 </context-group>
@@ -3532,16 +3919,44 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3532 <context context-type="linenumber">1</context> 3919 <context context-type="linenumber">1</context>
3533 </context-group> 3920 </context-group>
3534 </trans-unit> 3921 </trans-unit>
3535 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3922 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3536 <source>Channels</source> 3923 <source>My library</source>
3537 <target>Kanalak</target> 3924 <target>Nire liburutegia</target>
3925 <context-group name="null">
3926 <context context-type="linenumber">1</context>
3927 </context-group>
3928 </trans-unit>
3929 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3930 <source>My channels</source>
3931 <target>Nire kanalak</target>
3932 <context-group name="null">
3933 <context context-type="linenumber">1</context>
3934 </context-group>
3935 </trans-unit>
3936 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3937 <source>My subscriptions</source>
3938 <target>Nire harpidetzak</target>
3939 <context-group name="null">
3940 <context context-type="linenumber">1</context>
3941 </context-group>
3942 </trans-unit>
3943 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3944 <source>Misc</source>
3945 <target>Denetarik</target>
3538 <context-group name="null"> 3946 <context-group name="null">
3539 <context context-type="linenumber">1</context> 3947 <context context-type="linenumber">1</context>
3540 </context-group> 3948 </context-group>
3541 </trans-unit> 3949 </trans-unit>
3542 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3950 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3543 <source>Video imports</source> 3951 <source>Ownership changes</source>
3544 <target>Bideo inportazioak</target> 3952 <target>Jabetza aldaketak</target>
3953 <context-group name="null">
3954 <context context-type="linenumber">1</context>
3955 </context-group>
3956 </trans-unit>
3957 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3958 <source>My settings</source>
3959 <target>Nire ezarpenak</target>
3545 <context-group name="null"> 3960 <context-group name="null">
3546 <context context-type="linenumber">1</context> 3961 <context context-type="linenumber">1</context>
3547 </context-group> 3962 </context-group>
@@ -3560,6 +3975,97 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3560 <context context-type="linenumber">1</context> 3975 <context context-type="linenumber">1</context>
3561 </context-group> 3976 </context-group>
3562 </trans-unit> 3977 </trans-unit>
3978 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3979 <source>Subscribe to the account</source>
3980 <target>Harpidetu kontura</target>
3981 <context-group name="null">
3982 <context context-type="linenumber">1</context>
3983 </context-group>
3984 </trans-unit>
3985 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
3986 <source>Focus the search bar</source>
3987 <target>Eman fokua bilaketa barrari</target>
3988 <context-group name="null">
3989 <context context-type="linenumber">1</context>
3990 </context-group>
3991 </trans-unit>
3992 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
3993 <source>Toggle the left menu</source>
3994 <target>Txandakatu ezkerreko menua</target>
3995 <context-group name="null">
3996 <context context-type="linenumber">1</context>
3997 </context-group>
3998 </trans-unit>
3999 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4000 <source>Go to the videos overview page</source>
4001 <target>Joan bideoen ikuspegi orokorraren orrira </target>
4002 <context-group name="null">
4003 <context context-type="linenumber">1</context>
4004 </context-group>
4005 </trans-unit>
4006 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4007 <source>Go to the trending videos page</source>
4008 <target>Joan puri-purian dauden bideoen orrira</target>
4009 <context-group name="null">
4010 <context context-type="linenumber">1</context>
4011 </context-group>
4012 </trans-unit>
4013 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4014 <source>Go to the recently added videos page</source>
4015 <target>Joan gehitutako azken bideoen orrira</target>
4016 <context-group name="null">
4017 <context context-type="linenumber">1</context>
4018 </context-group>
4019 </trans-unit>
4020 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4021 <source>Go to the local videos page</source>
4022 <target>Joan bideo lokalen orrira</target>
4023 <context-group name="null">
4024 <context context-type="linenumber">1</context>
4025 </context-group>
4026 </trans-unit>
4027 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4028 <source>Go to the videos upload page</source>
4029 <target>Joan bideoak igotzeko orrira</target>
4030 <context-group name="null">
4031 <context context-type="linenumber">1</context>
4032 </context-group>
4033 </trans-unit>
4034 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4035 <source>Toggle Dark theme</source>
4036 <target>Txandakatu gai iluna</target>
4037 <context-group name="null">
4038 <context context-type="linenumber">1</context>
4039 </context-group>
4040 </trans-unit>
4041 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4042 <source>Go to my subscriptions</source>
4043 <target>Joan nire harpidetzetara</target>
4044 <context-group name="null">
4045 <context context-type="linenumber">1</context>
4046 </context-group>
4047 </trans-unit>
4048 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4049 <source>Go to my videos</source>
4050 <target>Joan nire bideoetara</target>
4051 <context-group name="null">
4052 <context context-type="linenumber">1</context>
4053 </context-group>
4054 </trans-unit>
4055 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4056 <source>Go to my imports</source>
4057 <target>Joan nire inportazioetara</target>
4058 <context-group name="null">
4059 <context context-type="linenumber">1</context>
4060 </context-group>
4061 </trans-unit>
4062 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4063 <source>Go to my channels</source>
4064 <target>Joan nire kanaletara</target>
4065 <context-group name="null">
4066 <context context-type="linenumber">1</context>
4067 </context-group>
4068 </trans-unit>
3563 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4069 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3564 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4070 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3565</source> 4071</source>
@@ -3576,6 +4082,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3576 <context context-type="linenumber">1</context> 4082 <context context-type="linenumber">1</context>
3577 </context-group> 4083 </context-group>
3578 </trans-unit> 4084 </trans-unit>
4085 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4086 <source>Error</source>
4087 <target>Errorea</target>
4088 <context-group name="null">
4089 <context context-type="linenumber">1</context>
4090 </context-group>
4091 </trans-unit>
3579 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4092 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3580 <source>You need to reconnect.</source> 4093 <source>You need to reconnect.</source>
3581 <target>Berriro konektatu behar duzu.</target> 4094 <target>Berriro konektatu behar duzu.</target>
@@ -3590,6 +4103,27 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3590 <context context-type="linenumber">1</context> 4103 <context context-type="linenumber">1</context>
3591 </context-group> 4104 </context-group>
3592 </trans-unit> 4105 </trans-unit>
4106 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4107 <source>Keyboard Shortcuts:</source>
4108 <target>Teklatu laster-bideak:</target>
4109 <context-group name="null">
4110 <context context-type="linenumber">1</context>
4111 </context-group>
4112 </trans-unit>
4113 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4114 <source>Info</source>
4115 <target>Informazioa</target>
4116 <context-group name="null">
4117 <context context-type="linenumber">1</context>
4118 </context-group>
4119 </trans-unit>
4120 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4121 <source>Success</source>
4122 <target>Arrakasta</target>
4123 <context-group name="null">
4124 <context context-type="linenumber">1</context>
4125 </context-group>
4126 </trans-unit>
3593 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4127 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3594 <source>Incorrect username or password.</source> 4128 <source>Incorrect username or password.</source>
3595 <target>Erabiltzaile-izen edo pasahitz okerra.</target> 4129 <target>Erabiltzaile-izen edo pasahitz okerra.</target>
@@ -3807,6 +4341,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3807 <context context-type="linenumber">1</context> 4341 <context context-type="linenumber">1</context>
3808 </context-group> 4342 </context-group>
3809 </trans-unit> 4343 </trans-unit>
4344 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4345 <source>Email is required.</source>
4346 <target>E-maila behar da.</target>
4347 <context-group name="null">
4348 <context context-type="linenumber">1</context>
4349 </context-group>
4350 </trans-unit>
4351 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4352 <source>Email must be valid.</source>
4353 <target>E-maila baliozkoa izan behar da.</target>
4354 <context-group name="null">
4355 <context context-type="linenumber">1</context>
4356 </context-group>
4357 </trans-unit>
3810 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4358 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3811 <source>Username is required.</source> 4359 <source>Username is required.</source>
3812 <target>Erabiltzaile izena beha da.</target> 4360 <target>Erabiltzaile izena beha da.</target>
@@ -3828,41 +4376,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3828 <context context-type="linenumber">1</context> 4376 <context context-type="linenumber">1</context>
3829 </context-group> 4377 </context-group>
3830 </trans-unit> 4378 </trans-unit>
3831 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3832 <source>Username must be at least 3 characters long.</source>
3833 <target>Erabiltzaile-izenak gutxienez 3 karaktere izan behar ditu.</target>
3834 <context-group name="null">
3835 <context context-type="linenumber">1</context>
3836 </context-group>
3837 </trans-unit>
3838 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3839 <source>Username cannot be more than 20 characters long.</source>
3840 <target>Erabiltzaile-izenak ezin ditu 20 karaktere baino gehiago izan.</target>
3841 <context-group name="null">
3842 <context context-type="linenumber">1</context>
3843 </context-group>
3844 </trans-unit>
3845 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3846 <source>Username should be only lowercase alphanumeric characters.</source>
3847 <target>Erabiltzaile-izena minuskulaz dauden karaktere alfanumerikoak besterik ezin ditu izan.</target>
3848 <context-group name="null">
3849 <context context-type="linenumber">1</context>
3850 </context-group>
3851 </trans-unit>
3852 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3853 <source>Email is required.</source>
3854 <target>E-maila behar da.</target>
3855 <context-group name="null">
3856 <context context-type="linenumber">1</context>
3857 </context-group>
3858 </trans-unit>
3859 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3860 <source>Email must be valid.</source>
3861 <target>E-maila baliozkoa izan behar da.</target>
3862 <context-group name="null">
3863 <context context-type="linenumber">1</context>
3864 </context-group>
3865 </trans-unit>
3866 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4379 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3867 <source>Password must be at least 6 characters long.</source> 4380 <source>Password must be at least 6 characters long.</source>
3868 <target>Pasahitza gutxienez 6 karaktere luze izan behar da.</target> 4381 <target>Pasahitza gutxienez 6 karaktere luze izan behar da.</target>
@@ -3926,20 +4439,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3926 <context context-type="linenumber">1</context> 4439 <context context-type="linenumber">1</context>
3927 </context-group> 4440 </context-group>
3928 </trans-unit> 4441 </trans-unit>
3929 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3930 <source>Display name must be at least 3 characters long.</source>
3931 <target>Pantaila-izena gutxienez 3 karaktere luze izan behar da.</target>
3932 <context-group name="null">
3933 <context context-type="linenumber">1</context>
3934 </context-group>
3935 </trans-unit>
3936 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3937 <source>Display name cannot be more than 120 characters long.</source>
3938 <target>Pantaila-izena ezin da 120 karaktere baino luzeagoa izan.</target>
3939 <context-group name="null">
3940 <context context-type="linenumber">1</context>
3941 </context-group>
3942 </trans-unit>
3943 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4442 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3944 <source>Description must be at least 3 characters long.</source> 4443 <source>Description must be at least 3 characters long.</source>
3945 <target>Deskripzioa gutxienez 3 karaktere luze izan behar da.</target> 4444 <target>Deskripzioa gutxienez 3 karaktere luze izan behar da.</target>
@@ -3947,9 +4446,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3947 <context context-type="linenumber">1</context> 4446 <context context-type="linenumber">1</context>
3948 </context-group> 4447 </context-group>
3949 </trans-unit> 4448 </trans-unit>
3950 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4449 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
3951 <source>Description cannot be more than 250 characters long.</source> 4450 <source>Description cannot be more than 1000 characters long.</source>
3952 <target>Deskripzioa ezin da 250 karaktere baino luzeagoa izan.</target> 4451 <target>Deskripzioa ezin da 1000 karaktere baino luzeagoa izan.</target>
3953 <context-group name="null"> 4452 <context-group name="null">
3954 <context context-type="linenumber">1</context> 4453 <context context-type="linenumber">1</context>
3955 </context-group> 4454 </context-group>
@@ -3989,13 +4488,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3989 <context context-type="linenumber">1</context> 4488 <context context-type="linenumber">1</context>
3990 </context-group> 4489 </context-group>
3991 </trans-unit> 4490 </trans-unit>
3992 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3993 <source>Report reason cannot be more than 300 characters long.</source>
3994 <target>Salatzeko arrazoia ezin da 300 karaktere baino luzeagoa izan.</target>
3995 <context-group name="null">
3996 <context context-type="linenumber">1</context>
3997 </context-group>
3998 </trans-unit>
3999 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4491 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4000 <source>Moderation comment is required.</source> 4492 <source>Moderation comment is required.</source>
4001 <target>Moderazio iruzkina derrigorrezkoa da.</target> 4493 <target>Moderazio iruzkina derrigorrezkoa da.</target>
@@ -4010,13 +4502,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4010 <context context-type="linenumber">1</context> 4502 <context context-type="linenumber">1</context>
4011 </context-group> 4503 </context-group>
4012 </trans-unit> 4504 </trans-unit>
4013 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4014 <source>Moderation comment cannot be more than 300 characters long.</source>
4015 <target>Moderazio iruzkina ezin da 300 karaktere baino luzeagoa izan.</target>
4016 <context-group name="null">
4017 <context context-type="linenumber">1</context>
4018 </context-group>
4019 </trans-unit>
4020 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4505 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4021 <source>The channel is required.</source> 4506 <source>The channel is required.</source>
4022 <target>Kanala derrigorrezkoa da.</target> 4507 <target>Kanala derrigorrezkoa da.</target>
@@ -4059,37 +4544,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4059 <context context-type="linenumber">1</context> 4544 <context context-type="linenumber">1</context>
4060 </context-group> 4545 </context-group>
4061 </trans-unit> 4546 </trans-unit>
4062 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4547 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4063 <source>Name is required.</source> 4548 <source>You can only transfer ownership to a local account</source>
4064 <target>Izena derrigorrezkoa da.</target> 4549 <target>Jabetza tokiko kontu batera besterik ezin duzu pasatu</target>
4065 <context-group name="null">
4066 <context context-type="linenumber">1</context>
4067 </context-group>
4068 </trans-unit>
4069 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4070 <source>Name must be at least 3 characters long.</source>
4071 <target>Izena gutxienez 3 karakterekoa izan behar da</target>
4072 <context-group name="null"> 4550 <context-group name="null">
4073 <context context-type="linenumber">1</context> 4551 <context context-type="linenumber">1</context>
4074 </context-group> 4552 </context-group>
4075 </trans-unit> 4553 </trans-unit>
4076 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 4554 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4077 <source>Name cannot be more than 20 characters long.</source> 4555 <source>Name is required.</source>
4078 <target>Izena ezin da20 karaktere baino luzeagoa izan</target> 4556 <target>Izena derrigorrezkoa da.</target>
4079 <context-group name="null">
4080 <context context-type="linenumber">1</context>
4081 </context-group>
4082 </trans-unit>
4083 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4084 <source>Name should be only lowercase alphanumeric characters.</source>
4085 <target>Izenak karaktere alfanumerikoak minuskulan besterik ezin ditu izan.</target>
4086 <context-group name="null">
4087 <context context-type="linenumber">1</context>
4088 </context-group>
4089 </trans-unit>
4090 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
4091 <source>Description cannot be more than 500 characters long.</source>
4092 <target>Deskripzioa ezin da 500 karaktere baino luzeagoa izan.</target>
4093 <context-group name="null"> 4557 <context-group name="null">
4094 <context context-type="linenumber">1</context> 4558 <context context-type="linenumber">1</context>
4095 </context-group> 4559 </context-group>
@@ -4101,9 +4565,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4101 <context context-type="linenumber">1</context> 4565 <context context-type="linenumber">1</context>
4102 </context-group> 4566 </context-group>
4103 </trans-unit> 4567 </trans-unit>
4104 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4568 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4105 <source>Support text cannot be more than 500 characters long.</source> 4569 <source>Support text cannot be more than 1000 characters long.</source>
4106 <target>Babes testua ezin da 500 karaktere baino luzeagoa izan.</target> 4570 <target>Laguntza testua ezin da 1000 karaktere baino luzeagoa izan</target>
4107 <context-group name="null"> 4571 <context-group name="null">
4108 <context context-type="linenumber">1</context> 4572 <context context-type="linenumber">1</context>
4109 </context-group> 4573 </context-group>
@@ -4199,9 +4663,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4199 <context context-type="linenumber">1</context> 4663 <context context-type="linenumber">1</context>
4200 </context-group> 4664 </context-group>
4201 </trans-unit> 4665 </trans-unit>
4202 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4666 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4203 <source>Video support cannot be more than 500 characters long.</source> 4667 <source>Video support cannot be more than 1000 characters long.</source>
4204 <target>Bideo babesa ezin da 500 karaktere baino luzeagoa izan.</target> 4668 <target>Bideoaren laguntza ezin da 1000 karaktere baino luzeagoa izan</target>
4205 <context-group name="null"> 4669 <context-group name="null">
4206 <context context-type="linenumber">1</context> 4670 <context context-type="linenumber">1</context>
4207 </context-group> 4671 </context-group>
@@ -4731,6 +5195,153 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4731 <context context-type="linenumber">1</context> 5195 <context context-type="linenumber">1</context>
4732 </context-group> 5196 </context-group>
4733 </trans-unit> 5197 </trans-unit>
5198 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5199 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5200 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> erabiltzaile debekatuta.</target>
5201 <context-group name="null">
5202 <context context-type="linenumber">1</context>
5203 </context-group>
5204 </trans-unit>
5205 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5206 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5207 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailea debekatuta.</target>
5208 <context-group name="null">
5209 <context context-type="linenumber">1</context>
5210 </context-group>
5211 </trans-unit>
5212 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5213 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5214 <target>Ziur zaude <x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzaileari debekua kendu nahi diozula?</target>
5215 <context-group name="null">
5216 <context context-type="linenumber">1</context>
5217 </context-group>
5218 </trans-unit>
5219 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5220 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5221 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzaileari debekua kendu zaio.</target>
5222 <context-group name="null">
5223 <context context-type="linenumber">1</context>
5224 </context-group>
5225 </trans-unit>
5226 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5227 <source>If you remove this user, you will not be able to create another with the same username!</source>
5228 <target>Erabiltzaile hau kentzen baduzu, ezin izango duzu erabiltzaile-izen bera duen beste bat sortu gero!</target>
5229 <context-group name="null">
5230 <context context-type="linenumber">1</context>
5231 </context-group>
5232 </trans-unit>
5233 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5234 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5235 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailea ezabatuta.</target>
5236 <context-group name="null">
5237 <context context-type="linenumber">1</context>
5238 </context-group>
5239 </trans-unit>
5240 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5241 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5242 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailearen e-mail helbidea baieztatua gisa ezarri da</target>
5243 <context-group name="null">
5244 <context context-type="linenumber">1</context>
5245 </context-group>
5246 </trans-unit>
5247 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5248 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5249 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> kontua mutututa.</target>
5250 <context-group name="null">
5251 <context context-type="linenumber">1</context>
5252 </context-group>
5253 </trans-unit>
5254 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5255 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5256 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> instantzia mutututa.</target>
5257 <context-group name="null">
5258 <context context-type="linenumber">1</context>
5259 </context-group>
5260 </trans-unit>
5261 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5262 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5263 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> kontua instantziak mutututa.</target>
5264 <context-group name="null">
5265 <context context-type="linenumber">1</context>
5266 </context-group>
5267 </trans-unit>
5268 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5269 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5270 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> kontua instantziak desmutututa.</target>
5271 <context-group name="null">
5272 <context context-type="linenumber">1</context>
5273 </context-group>
5274 </trans-unit>
5275 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5276 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5277 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> instantzia instantziak mutututa.</target>
5278 <context-group name="null">
5279 <context context-type="linenumber">1</context>
5280 </context-group>
5281 </trans-unit>
5282 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5283 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5284 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> kontua instantziak desmutututa.</target>
5285 <context-group name="null">
5286 <context context-type="linenumber">1</context>
5287 </context-group>
5288 </trans-unit>
5289 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5290 <source>Mute this account</source>
5291 <target>Mututu kontu hau</target>
5292 <context-group name="null">
5293 <context context-type="linenumber">1</context>
5294 </context-group>
5295 </trans-unit>
5296 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5297 <source>Unmute this account</source>
5298 <target>Desmututu kontu hau</target>
5299 <context-group name="null">
5300 <context context-type="linenumber">1</context>
5301 </context-group>
5302 </trans-unit>
5303 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5304 <source>Mute the instance</source>
5305 <target>Mututu instantzia</target>
5306 <context-group name="null">
5307 <context context-type="linenumber">1</context>
5308 </context-group>
5309 </trans-unit>
5310 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5311 <source>Unmute the instance</source>
5312 <target>Desmututu instantzia</target>
5313 <context-group name="null">
5314 <context context-type="linenumber">1</context>
5315 </context-group>
5316 </trans-unit>
5317 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5318 <source>Mute this account by your instance</source>
5319 <target>Mututu kontu hau zure instantziaren bidez</target>
5320 <context-group name="null">
5321 <context context-type="linenumber">1</context>
5322 </context-group>
5323 </trans-unit>
5324 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5325 <source>Unmute this account by your instance</source>
5326 <target>Desmututu kontu hau zure instantziaren bidez</target>
5327 <context-group name="null">
5328 <context context-type="linenumber">1</context>
5329 </context-group>
5330 </trans-unit>
5331 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5332 <source>Mute the instance by your instance</source>
5333 <target>Mututu instantzia hau zure instantziaren bidez</target>
5334 <context-group name="null">
5335 <context context-type="linenumber">1</context>
5336 </context-group>
5337 </trans-unit>
5338 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5339 <source>Unmute the instance by your instance</source>
5340 <target>Desmututu instantzia hau zure instantziaren bidez</target>
5341 <context-group name="null">
5342 <context context-type="linenumber">1</context>
5343 </context-group>
5344 </trans-unit>
4734 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5345 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4735 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5346 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4736 <target>Eskaria luzeegia da zerbitzariarentzat. Jarri zure administratzailearekin kontaktuan muga handitu nahi baduzu.</target> 5347 <target>Eskaria luzeegia da zerbitzariarentzat. Jarri zure administratzailearekin kontaktuan muga handitu nahi baduzu.</target>
@@ -4759,6 +5370,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4759 <context context-type="linenumber">1</context> 5370 <context context-type="linenumber">1</context>
4760 </context-group> 5371 </context-group>
4761 </trans-unit> 5372 </trans-unit>
5373 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5374 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5375 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ra harpidetuta</target>
5376 <context-group name="null">
5377 <context context-type="linenumber">1</context>
5378 </context-group>
5379 </trans-unit>
4762 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5380 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4763 <source>Subscribed</source> 5381 <source>Subscribed</source>
4764 <target>Harpidetuta</target> 5382 <target>Harpidetuta</target>
@@ -4766,9 +5384,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4766 <context context-type="linenumber">1</context> 5384 <context context-type="linenumber">1</context>
4767 </context-group> 5385 </context-group>
4768 </trans-unit> 5386 </trans-unit>
4769 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5387 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
4770 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5388 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4771 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ra harpidetuta</target> 5389 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ko harpidetza kenduta</target>
4772 <context-group name="null"> 5390 <context-group name="null">
4773 <context context-type="linenumber">1</context> 5391 <context context-type="linenumber">1</context>
4774 </context-group> 5392 </context-group>
@@ -4780,9 +5398,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4780 <context context-type="linenumber">1</context> 5398 <context context-type="linenumber">1</context>
4781 </context-group> 5399 </context-group>
4782 </trans-unit> 5400 </trans-unit>
4783 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5401 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
4784 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5402 <source>Moderator</source>
4785 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ko harpidetza kenduta</target> 5403 <target>Moderatzailea</target>
4786 <context-group name="null"> 5404 <context-group name="null">
4787 <context context-type="linenumber">1</context> 5405 <context context-type="linenumber">1</context>
4788 </context-group> 5406 </context-group>
@@ -4808,23 +5426,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4808 <context context-type="linenumber">1</context> 5426 <context context-type="linenumber">1</context>
4809 </context-group> 5427 </context-group>
4810 </trans-unit> 5428 </trans-unit>
4811 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 5429 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
4812 <source>Welcome</source> 5430 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
4813 <target>Ongi etorri</target> 5431 <target>Ongi etorri! Egiaztatu zure e-maila kontua baieztatzeko eta izen ematea osatzeko.</target>
4814 <context-group name="null">
4815 <context context-type="linenumber">1</context>
4816 </context-group>
4817 </trans-unit>
4818 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
4819 <source>Please check your email to verify your account and complete signup.</source>
4820 <target>Egiaztatu mesedez zure e-maila zure kontua egiaztatzeko eta erregistroa burutzeko.</target>
4821 <context-group name="null"> 5432 <context-group name="null">
4822 <context context-type="linenumber">1</context> 5433 <context context-type="linenumber">1</context>
4823 </context-group> 5434 </context-group>
4824 </trans-unit> 5435 </trans-unit>
4825 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be"> 5436 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
4826 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source> 5437 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
4827 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> erabiltzailearen izen-ematea burututa.</target> 5438 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> gisa hasi duzu saioa!</target>
4828 <context-group name="null"> 5439 <context-group name="null">
4829 <context context-type="linenumber">1</context> 5440 <context context-type="linenumber">1</context>
4830 </context-group> 5441 </context-group>
@@ -4857,23 +5468,23 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4857 <context context-type="linenumber">1</context> 5468 <context context-type="linenumber">1</context>
4858 </context-group> 5469 </context-group>
4859 </trans-unit> 5470 </trans-unit>
4860 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5"> 5471 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4861 <source>Info</source> 5472 <source>Upload cancelled</source>
4862 <target>Informazioa</target> 5473 <target>Igoera ezeztatuta</target>
4863 <context-group name="null"> 5474 <context-group name="null">
4864 <context context-type="linenumber">1</context> 5475 <context context-type="linenumber">1</context>
4865 </context-group> 5476 </context-group>
4866 </trans-unit> 5477 </trans-unit>
4867 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5478 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4868 <source>Upload cancelled</source> 5479 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4869 <target>Igoera ezeztatuta</target> 5480 <target>Zure bideo-kuota bideo honekin gainditzen da (bideoaren tamaina: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, erabilita: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, kuota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
4870 <context-group name="null"> 5481 <context-group name="null">
4871 <context context-type="linenumber">1</context> 5482 <context context-type="linenumber">1</context>
4872 </context-group> 5483 </context-group>
4873 </trans-unit> 5484 </trans-unit>
4874 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa"> 5485 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
4875 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source> 5486 <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
4876 <target>Sentitzen dugu, PeerTubek ezin du 8GB baino gehiagoko bideorik kudeatu</target> 5487 <target>Zure eguneko bideo-kuota bideo honekin gainditzen da (bideoaren tamaina: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, erabilita: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, kuota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
4877 <context-group name="null"> 5488 <context-group name="null">
4878 <context context-type="linenumber">1</context> 5489 <context context-type="linenumber">1</context>
4879 </context-group> 5490 </context-group>
@@ -4927,6 +5538,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4927 <context context-type="linenumber">1</context> 5538 <context context-type="linenumber">1</context>
4928 </context-group> 5539 </context-group>
4929 </trans-unit> 5540 </trans-unit>
5541 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5542 <source>Like the video</source>
5543 <target>Gehitu bideoa gogokoetara</target>
5544 <context-group name="null">
5545 <context context-type="linenumber">1</context>
5546 </context-group>
5547 </trans-unit>
5548 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5549 <source>Dislike the video</source>
5550 <target>Kendu bideoa gogokoetatik</target>
5551 <context-group name="null">
5552 <context context-type="linenumber">1</context>
5553 </context-group>
5554 </trans-unit>
4930 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5555 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
4931 <source>Do you really want to delete this video?</source> 5556 <source>Do you really want to delete this video?</source>
4932 <target>Ziur bideo hau ezabatu nahi duzula?</target> 5557 <target>Ziur bideo hau ezabatu nahi duzula?</target>
diff --git a/client/src/locale/target/angular_fa_IR.xml b/client/src/locale/target/angular_fa_IR.xml
index 149b4019a..2a59cfc34 100644
--- a/client/src/locale/target/angular_fa_IR.xml
+++ b/client/src/locale/target/angular_fa_IR.xml
@@ -224,7 +224,7 @@
224 <source>Edit</source> 224 <source>Edit</source>
225 <target>ویرایش</target> 225 <target>ویرایش</target>
226 <context-group name="null"> 226 <context-group name="null">
227 <context context-type="linenumber">5</context> 227 <context context-type="linenumber">1</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f82f53a2544638939a8ba93c0fb1b0a4419c3196"> 230 <trans-unit id="f82f53a2544638939a8ba93c0fb1b0a4419c3196">
@@ -241,6 +241,13 @@
241 <context context-type="linenumber">19</context> 241 <context context-type="linenumber">19</context>
242 </context-group> 242 </context-group>
243 </trans-unit> 243 </trans-unit>
244 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
245 <source>Reason...</source>
246 <target>دلیل...</target>
247 <context-group name="null">
248 <context context-type="linenumber">11</context>
249 </context-group>
250 </trans-unit>
244 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 251 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
245 <source> 252 <source>
246 Login 253 Login
@@ -281,7 +288,7 @@
281 <source>Password</source> 288 <source>Password</source>
282 <target>گذرواژه</target> 289 <target>گذرواژه</target>
283 <context-group name="null"> 290 <context-group name="null">
284 <context context-type="linenumber">12</context> 291 <context context-type="linenumber">13</context>
285 </context-group> 292 </context-group>
286 </trans-unit> 293 </trans-unit>
287 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 294 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -295,7 +302,7 @@
295 <source>Login</source> 302 <source>Login</source>
296 <target>ورود</target> 303 <target>ورود</target>
297 <context-group name="null"> 304 <context-group name="null">
298 <context context-type="linenumber">38</context> 305 <context context-type="linenumber">36</context>
299 </context-group> 306 </context-group>
300 </trans-unit> 307 </trans-unit>
301 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 308 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -323,7 +330,7 @@
323 <source>Send me an email to reset my password</source> 330 <source>Send me an email to reset my password</source>
324 <target>یک رایانامه برای بازنشانی گذرواژه برای من بÙرست</target> 331 <target>یک رایانامه برای بازنشانی گذرواژه برای من بÙرست</target>
325 <context-group name="null"> 332 <context-group name="null">
326 <context context-type="linenumber">75</context> 333 <context context-type="linenumber">80</context>
327 </context-group> 334 </context-group>
328 </trans-unit> 335 </trans-unit>
329 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 336 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -370,8 +377,7 @@
370 </context-group> 377 </context-group>
371 </trans-unit> 378 </trans-unit>
372 <trans-unit id="08c74dc9762957593b91f6eb5d65efdfc975bf48"> 379 <trans-unit id="08c74dc9762957593b91f6eb5d65efdfc975bf48">
373 <source>Username</source> 380 <source>Username</source><target>Username</target><context-group name="null">
374 <context-group name="null">
375 <context context-type="linenumber">8</context> 381 <context context-type="linenumber">8</context>
376 </context-group> 382 </context-group>
377 </trans-unit> 383 </trans-unit>
@@ -379,21 +385,14 @@
379 <source>Example: jane_doe</source> 385 <source>Example: jane_doe</source>
380 <target>نمونه: مهراد_روستا</target> 386 <target>نمونه: مهراد_روستا</target>
381 <context-group name="null"> 387 <context-group name="null">
382 <context context-type="linenumber">16</context> 388 <context context-type="linenumber">17</context>
383 </context-group> 389 </context-group>
384 </trans-unit> 390 </trans-unit>
385 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 391 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
386 <source>Signup</source> 392 <source>Signup</source>
387 <target>ثبت‌نام</target> 393 <target>ثبت‌نام</target>
388 <context-group name="null"> 394 <context-group name="null">
389 <context context-type="linenumber">88</context> 395 <context context-type="linenumber">78</context>
390 </context-group>
391 </trans-unit>
392 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
393 <source>Filters</source>
394 <target>Ùیلتر‌ها</target>
395 <context-group name="null">
396 <context context-type="linenumber">16</context>
397 </context-group> 396 </context-group>
398 </trans-unit> 397 </trans-unit>
399 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 398 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
@@ -404,14 +403,14 @@
404 نتیجه‌ای یاÙت نشد 403 نتیجه‌ای یاÙت نشد
405 </target> 404 </target>
406 <context-group name="null"> 405 <context-group name="null">
407 <context context-type="linenumber">25</context> 406 <context context-type="linenumber">28</context>
408 </context-group> 407 </context-group>
409 </trans-unit> 408 </trans-unit>
410 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 409 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
411 <source>Change the language</source> 410 <source>Change the language</source>
412 <target>تغییر زبان</target> 411 <target>تغییر زبان</target>
413 <context-group name="null"> 412 <context-group name="null">
414 <context context-type="linenumber">88</context> 413 <context context-type="linenumber">86</context>
415 </context-group> 414 </context-group>
416 </trans-unit> 415 </trans-unit>
417 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 416 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -422,7 +421,7 @@
422 نمایه‌ عمومی من 421 نمایه‌ عمومی من
423 </target> 422 </target>
424 <context-group name="null"> 423 <context-group name="null">
425 <context context-type="linenumber">18</context> 424 <context context-type="linenumber">16</context>
426 </context-group> 425 </context-group>
427 </trans-unit> 426 </trans-unit>
428 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 427 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -433,7 +432,7 @@
433 حساب کاربری من 432 حساب کاربری من
434 </target> 433 </target>
435 <context-group name="null"> 434 <context-group name="null">
436 <context context-type="linenumber">22</context> 435 <context context-type="linenumber">20</context>
437 </context-group> 436 </context-group>
438 </trans-unit> 437 </trans-unit>
439 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 438 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -444,7 +443,7 @@
444 ویدئو‌های من 443 ویدئو‌های من
445 </target> 444 </target>
446 <context-group name="null"> 445 <context-group name="null">
447 <context context-type="linenumber">26</context> 446 <context context-type="linenumber">24</context>
448 </context-group> 447 </context-group>
449 </trans-unit> 448 </trans-unit>
450 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 449 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -455,14 +454,14 @@
455 خروج 454 خروج
456 </target> 455 </target>
457 <context-group name="null"> 456 <context-group name="null">
458 <context context-type="linenumber">30</context> 457 <context context-type="linenumber">28</context>
459 </context-group> 458 </context-group>
460 </trans-unit> 459 </trans-unit>
461 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 460 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
462 <source>Create an account</source> 461 <source>Create an account</source>
463 <target>ساخت حساب</target> 462 <target>ساخت حساب</target>
464 <context-group name="null"> 463 <context-group name="null">
465 <context context-type="linenumber">39</context> 464 <context context-type="linenumber">37</context>
466 </context-group> 465 </context-group>
467 </trans-unit> 466 </trans-unit>
468 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 467 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -476,49 +475,49 @@
476 <source>Subscriptions</source> 475 <source>Subscriptions</source>
477 <target>اشتراک</target> 476 <target>اشتراک</target>
478 <context-group name="null"> 477 <context-group name="null">
479 <context context-type="linenumber">47</context> 478 <context context-type="linenumber">45</context>
480 </context-group> 479 </context-group>
481 </trans-unit> 480 </trans-unit>
482 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 481 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
483 <source>Overview</source> 482 <source>Overview</source>
484 <target>نمای‌کلی</target> 483 <target>نمای‌کلی</target>
485 <context-group name="null"> 484 <context-group name="null">
486 <context context-type="linenumber">52</context> 485 <context context-type="linenumber">50</context>
487 </context-group> 486 </context-group>
488 </trans-unit> 487 </trans-unit>
489 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 488 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
490 <source>Trending</source> 489 <source>Trending</source>
491 <target>مورد بحث</target> 490 <target>مورد بحث</target>
492 <context-group name="null"> 491 <context-group name="null">
493 <context context-type="linenumber">57</context> 492 <context context-type="linenumber">55</context>
494 </context-group> 493 </context-group>
495 </trans-unit> 494 </trans-unit>
496 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 495 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
497 <source>Recently added</source> 496 <source>Recently added</source>
498 <target>به تازگی اضاÙÙ‡ شده</target> 497 <target>به تازگی اضاÙÙ‡ شده</target>
499 <context-group name="null"> 498 <context-group name="null">
500 <context context-type="linenumber">62</context> 499 <context context-type="linenumber">60</context>
501 </context-group> 500 </context-group>
502 </trans-unit> 501 </trans-unit>
503 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 502 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
504 <source>Local</source> 503 <source>Local</source>
505 <target>محلی</target> 504 <target>محلی</target>
506 <context-group name="null"> 505 <context-group name="null">
507 <context context-type="linenumber">67</context> 506 <context context-type="linenumber">65</context>
508 </context-group> 507 </context-group>
509 </trans-unit> 508 </trans-unit>
510 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 509 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
511 <source>More</source> 510 <source>More</source>
512 <target>دیگر</target> 511 <target>دیگر</target>
513 <context-group name="null"> 512 <context-group name="null">
514 <context context-type="linenumber">72</context> 513 <context context-type="linenumber">70</context>
515 </context-group> 514 </context-group>
516 </trans-unit> 515 </trans-unit>
517 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 516 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
518 <source>Administration</source> 517 <source>Administration</source>
519 <target>مدیریت</target> 518 <target>مدیریت</target>
520 <context-group name="null"> 519 <context-group name="null">
521 <context context-type="linenumber">76</context> 520 <context context-type="linenumber">74</context>
522 </context-group> 521 </context-group>
523 </trans-unit> 522 </trans-unit>
524 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 523 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -529,9 +528,8 @@
529 </context-group> 528 </context-group>
530 </trans-unit> 529 </trans-unit>
531 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 530 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
532 <source>Toggle dark interface</source> 531 <source>Toggle dark interface</source><target>Toggle dark interface</target><context-group name="null">
533 <context-group name="null"> 532 <context context-type="linenumber">92</context>
534 <context context-type="linenumber">94</context>
535 </context-group> 533 </context-group>
536 </trans-unit> 534 </trans-unit>
537 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 535 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -615,7 +613,7 @@
615 <source>No results.</source> 613 <source>No results.</source>
616 <target>بدون نتیجه.</target> 614 <target>بدون نتیجه.</target>
617 <context-group name="null"> 615 <context-group name="null">
618 <context context-type="linenumber">7</context> 616 <context context-type="linenumber">20</context>
619 </context-group> 617 </context-group>
620 </trans-unit> 618 </trans-unit>
621 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 619 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -661,14 +659,14 @@
661 <source>Videos Overview</source> 659 <source>Videos Overview</source>
662 <target>نمای‌کلی ویدئو‌ها</target> 660 <target>نمای‌کلی ویدئو‌ها</target>
663 <context-group name="null"> 661 <context-group name="null">
664 <context context-type="linenumber">58</context> 662 <context context-type="linenumber">51</context>
665 </context-group> 663 </context-group>
666 </trans-unit> 664 </trans-unit>
667 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 665 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
668 <source>Local videos</source> 666 <source>Local videos</source>
669 <target>ویدئو‌های محلی</target> 667 <target>ویدئو‌های محلی</target>
670 <context-group name="null"> 668 <context-group name="null">
671 <context context-type="linenumber">61</context> 669 <context context-type="linenumber">54</context>
672 </context-group> 670 </context-group>
673 </trans-unit> 671 </trans-unit>
674 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e"> 672 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e">
@@ -682,7 +680,14 @@
682 <source>Signup enabled</source> 680 <source>Signup enabled</source>
683 <target>ثبت‌نام Ùعال است</target> 681 <target>ثبت‌نام Ùعال است</target>
684 <context-group name="null"> 682 <context-group name="null">
685 <context context-type="linenumber">92</context> 683 <context context-type="linenumber">84</context>
684 </context-group>
685 </trans-unit>
686 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
687 <source>Users</source>
688 <target>کاربران</target>
689 <context-group name="null">
690 <context context-type="linenumber">105</context>
686 </context-group> 691 </context-group>
687 </trans-unit> 692 </trans-unit>
688 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 693 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -696,35 +701,28 @@
696 <source>Administrator</source> 701 <source>Administrator</source>
697 <target>مدیر</target> 702 <target>مدیر</target>
698 <context-group name="null"> 703 <context-group name="null">
699 <context context-type="linenumber">123</context> 704 <context context-type="linenumber">155</context>
700 </context-group>
701 </trans-unit>
702 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
703 <source>Users</source>
704 <target>کاربران</target>
705 <context-group name="null">
706 <context context-type="linenumber">136</context>
707 </context-group> 705 </context-group>
708 </trans-unit> 706 </trans-unit>
709 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc"> 707 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
710 <source>Twitter</source> 708 <source>Twitter</source>
711 <target>توییتر</target> 709 <target>توییتر</target>
712 <context-group name="null"> 710 <context-group name="null">
713 <context context-type="linenumber">170</context> 711 <context context-type="linenumber">178</context>
714 </context-group> 712 </context-group>
715 </trans-unit> 713 </trans-unit>
716 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 714 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
717 <source>Your Twitter username</source> 715 <source>Your Twitter username</source>
718 <target>نام‌کاربری توییتر شما</target> 716 <target>نام‌کاربری توییتر شما</target>
719 <context-group name="null"> 717 <context-group name="null">
720 <context context-type="linenumber">173</context> 718 <context context-type="linenumber">184</context>
721 </context-group> 719 </context-group>
722 </trans-unit> 720 </trans-unit>
723 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 721 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
724 <source>JavaScript</source> 722 <source>JavaScript</source>
725 <target>جاوااکسریپت</target> 723 <target>جاوااکسریپت</target>
726 <context-group name="null"> 724 <context-group name="null">
727 <context context-type="linenumber">267</context> 725 <context context-type="linenumber">294</context>
728 </context-group> 726 </context-group>
729 </trans-unit> 727 </trans-unit>
730 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 728 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -753,25 +751,23 @@
753 <source>Score</source> 751 <source>Score</source>
754 <target>امتیاز</target> 752 <target>امتیاز</target>
755 <context-group name="null"> 753 <context-group name="null">
756 <context context-type="linenumber">8</context> 754 <context context-type="linenumber">17</context>
757 </context-group> 755 </context-group>
758 </trans-unit> 756 </trans-unit>
759 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 757 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
760 <source>Host</source> 758 <source>Host</source>
761 <target>میزبان</target> 759 <target>میزبان</target>
762 <context-group name="null"> 760 <context-group name="null">
763 <context context-type="linenumber">8</context> 761 <context context-type="linenumber">19</context>
764 </context-group> 762 </context-group>
765 </trans-unit> 763 </trans-unit>
766 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 764 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
767 <source>State</source> 765 <source>State</source><target>State</target><context-group name="null">
768 <context-group name="null">
769 <context context-type="linenumber">10</context> 766 <context context-type="linenumber">10</context>
770 </context-group> 767 </context-group>
771 </trans-unit> 768 </trans-unit>
772 <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246"> 769 <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246">
773 <source>Follow</source> 770 <source>Follow</source><target>Follow</target><context-group name="null">
774 <context-group name="null">
775 <context context-type="linenumber">7</context> 771 <context context-type="linenumber">7</context>
776 </context-group> 772 </context-group>
777 </trans-unit> 773 </trans-unit>
@@ -800,14 +796,7 @@
800 <source>Role</source> 796 <source>Role</source>
801 <target>نقش</target> 797 <target>نقش</target>
802 <context-group name="null"> 798 <context-group name="null">
803 <context context-type="linenumber">20</context> 799 <context context-type="linenumber">43</context>
804 </context-group>
805 </trans-unit>
806 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
807 <source>Reason...</source>
808 <target>دلیل...</target>
809 <context-group name="null">
810 <context context-type="linenumber">11</context>
811 </context-group> 800 </context-group>
812 </trans-unit> 801 </trans-unit>
813 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 802 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
@@ -824,18 +813,25 @@
824 <context context-type="linenumber">14</context> 813 <context context-type="linenumber">14</context>
825 </context-group> 814 </context-group>
826 </trans-unit> 815 </trans-unit>
816 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
817 <source>My videos</source>
818 <target>ویديو‌های من</target>
819 <context-group name="null">
820 <context context-type="linenumber">1</context>
821 </context-group>
822 </trans-unit>
827 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 823 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
828 <source>My settings</source> 824 <source>My settings</source>
829 <target>تنظیمات من</target> 825 <target>تنظیمات من</target>
830 <context-group name="null"> 826 <context-group name="null">
831 <context context-type="linenumber">3</context> 827 <context context-type="linenumber">1</context>
832 </context-group> 828 </context-group>
833 </trans-unit> 829 </trans-unit>
834 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 830 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
835 <source>My videos</source> 831 <source>Info</source>
836 <target>ویديو‌های ÙÙ†</target> 832 <target>راÙنما</target>
837 <context-group name="null"> 833 <context-group name="null">
838 <context context-type="linenumber">14</context> 834 <context context-type="linenumber">1</context>
839 </context-group> 835 </context-group>
840 </trans-unit> 836 </trans-unit>
841 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0"> 837 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
@@ -1041,20 +1037,6 @@
1041 <context context-type="linenumber">1</context> 1037 <context context-type="linenumber">1</context>
1042 </context-group> 1038 </context-group>
1043 </trans-unit> 1039 </trans-unit>
1044 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2">
1045 <source>Welcome</source>
1046 <target>خوش‌آمدید</target>
1047 <context-group name="null">
1048 <context context-type="linenumber">1</context>
1049 </context-group>
1050 </trans-unit>
1051 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
1052 <source>Info</source>
1053 <target>راهنما</target>
1054 <context-group name="null">
1055 <context context-type="linenumber">1</context>
1056 </context-group>
1057 </trans-unit>
1058 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 1040 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
1059 <source>Upload cancelled</source> 1041 <source>Upload cancelled</source>
1060 <target>بارگزاری لغوشد</target> 1042 <target>بارگزاری لغوشد</target>
diff --git a/client/src/locale/target/angular_fr_FR.xml b/client/src/locale/target/angular_fr_FR.xml
index 2db81316b..23cfec618 100644
--- a/client/src/locale/target/angular_fr_FR.xml
+++ b/client/src/locale/target/angular_fr_FR.xml
@@ -227,11 +227,174 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>Vous n'avez pas de notifications.</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publié une <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nouvelle vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
249 <source>
250 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been unblacklisted
251 </source>
252 <target>
253 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été débloquée
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">11</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been blacklisted
262 </source>
263 <target>
264 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été bloquée
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">15</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
271 <source>
272 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
273 </source>
274 <target>
275 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Un nouveau signalement<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été créé sur la vidéo <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">19</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
282 <source>
283 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
284 </source>
285 <target>
286 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a commenté votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
287 </target>
288 <context-group name="null">
289 <context context-type="linenumber">23</context>
290 </context-group>
291 </trans-unit>
292 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
293 <source>
294 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
295 </source>
296 <target>
297 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été publiée
298 </target>
299 <context-group name="null">
300 <context context-type="linenumber">27</context>
301 </context-group>
302 </trans-unit>
303 <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
304 <source>
305 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
306 </source>
307 <target>
308 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a été importée
309 </target>
310 <context-group name="null">
311 <context context-type="linenumber">31</context>
312 </context-group>
313 </trans-unit>
314 <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
315 <source>
316 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
317 </source>
318 <target>
319 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>L'importation de votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a échoué
320 </target>
321 <context-group name="null">
322 <context context-type="linenumber">35</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
326 <source>
327 User <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> on your instance
328 </source>
329 <target>
330 L'utilisateur <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> a créé un compte<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> sur votre instance
331 </target>
332 <context-group name="null">
333 <context context-type="linenumber">39</context>
334 </context-group>
335 </trans-unit>
336 <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
337 <source>
338 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> is following
339
340 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
341 your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
342 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
343 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
344 </source>
345 <target>
346 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> suit
347
348 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
349 votre chaîne <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
350 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
351 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>votre compte<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
352 </target>
353 <context-group name="null">
354 <context context-type="linenumber">43</context>
355 </context-group>
356 </trans-unit>
357 <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
358 <source>
359 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
360 </source>
361 <target>
362 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> vous a mentionné sur la vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
363 </target>
364 <context-group name="null">
365 <context context-type="linenumber">52</context>
366 </context-group>
367 </trans-unit>
368 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
369 <source>
370 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
371 </source>
372 <target>
373 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
374 </target>
375 <context-group name="null">
376 <context context-type="linenumber">57</context>
377 </context-group>
378 </trans-unit>
379 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
380 <source>Unlisted</source>
381 <target>Non répertoriée</target>
382 <context-group name="null">
383 <context context-type="linenumber">10</context>
384 </context-group>
385 </trans-unit>
386 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
387 <source>Private</source>
388 <target>Privée</target>
389 <context-group name="null">
390 <context context-type="linenumber">11</context>
391 </context-group>
392 </trans-unit>
230 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 393 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
231 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 394 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
232 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target> 395 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
233 <context-group name="null"> 396 <context-group name="null">
234 <context context-type="linenumber">13</context> 397 <context context-type="linenumber">16</context>
235 </context-group> 398 </context-group>
236 </trans-unit> 399 </trans-unit>
237 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 400 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -245,7 +408,7 @@
245 <source>Edit</source> 408 <source>Edit</source>
246 <target>Modifier</target> 409 <target>Modifier</target>
247 <context-group name="null"> 410 <context-group name="null">
248 <context context-type="linenumber">5</context> 411 <context context-type="linenumber">1</context>
249 </context-group> 412 </context-group>
250 </trans-unit> 413 </trans-unit>
251 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 414 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -301,6 +464,13 @@
301 <context context-type="linenumber">18</context> 464 <context context-type="linenumber">18</context>
302 </context-group> 465 </context-group>
303 </trans-unit> 466 </trans-unit>
467 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
468 <source>Using an ActivityPub account</source>
469 <target>En utilisant un compte ActivityPub</target>
470 <context-group name="null">
471 <context context-type="linenumber">36</context>
472 </context-group>
473 </trans-unit>
304 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3"> 474 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
305 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source> 475 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
306 <target>S'abonner avec un compte sur <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target> 476 <target>S'abonner avec un compte sur <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
@@ -315,6 +485,13 @@
315 <context context-type="linenumber">40</context> 485 <context context-type="linenumber">40</context>
316 </context-group> 486 </context-group>
317 </trans-unit> 487 </trans-unit>
488 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
489 <source>Subscribe with a Mastodon account:</source>
490 <target>S'abonner avec un compte Mastodon :</target>
491 <context-group name="null">
492 <context context-type="linenumber">43</context>
493 </context-group>
494 </trans-unit>
318 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1"> 495 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
319 <source>Using a syndication feed</source> 496 <source>Using a syndication feed</source>
320 <target>Utilisation d'un flux de syndication</target> 497 <target>Utilisation d'un flux de syndication</target>
@@ -360,7 +537,7 @@
360 <source>Video quota</source> 537 <source>Video quota</source>
361 <target>Quota des vidéos</target> 538 <target>Quota des vidéos</target>
362 <context-group name="null"> 539 <context-group name="null">
363 <context context-type="linenumber">19</context> 540 <context context-type="linenumber">42</context>
364 </context-group> 541 </context-group>
365 </trans-unit> 542 </trans-unit>
366 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 543 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -374,6 +551,45 @@
374 <context context-type="linenumber">14</context> 551 <context context-type="linenumber">14</context>
375 </context-group> 552 </context-group>
376 </trans-unit> 553 </trans-unit>
554 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
555 <source>Ban</source>
556 <target>Bannir</target>
557 <context-group name="null">
558 <context context-type="linenumber">3</context>
559 </context-group>
560 </trans-unit>
561 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
562 <source>Reason...</source>
563 <target>Motivation…</target>
564 <context-group name="null">
565 <context context-type="linenumber">11</context>
566 </context-group>
567 </trans-unit>
568 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
569 <source>
570 A banned user will no longer be able to login.
571 </source>
572 <target>
573 Un utilisateur banni ne sera plus capable de se connecter.
574 </target>
575 <context-group name="null">
576 <context context-type="linenumber">17</context>
577 </context-group>
578 </trans-unit>
579 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
580 <source>Ban this user</source>
581 <target>Bannir cet utilisateur</target>
582 <context-group name="null">
583 <context context-type="linenumber">25</context>
584 </context-group>
585 </trans-unit>
586 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
587 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
588 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
589 <context-group name="null">
590 <context context-type="linenumber">11</context>
591 </context-group>
592 </trans-unit>
377 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 593 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
378 <source> 594 <source>
379 Login 595 Login
@@ -438,7 +654,7 @@
438 <source>Password</source> 654 <source>Password</source>
439 <target>Mot de passe</target> 655 <target>Mot de passe</target>
440 <context-group name="null"> 656 <context-group name="null">
441 <context context-type="linenumber">12</context> 657 <context context-type="linenumber">13</context>
442 </context-group> 658 </context-group>
443 </trans-unit> 659 </trans-unit>
444 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 660 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -452,7 +668,7 @@
452 <source>Login</source> 668 <source>Login</source>
453 <target>Se connecter</target> 669 <target>Se connecter</target>
454 <context-group name="null"> 670 <context-group name="null">
455 <context context-type="linenumber">38</context> 671 <context context-type="linenumber">36</context>
456 </context-group> 672 </context-group>
457 </trans-unit> 673 </trans-unit>
458 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 674 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -462,6 +678,17 @@
462 <context context-type="linenumber">57</context> 678 <context context-type="linenumber">57</context>
463 </context-group> 679 </context-group>
464 </trans-unit> 680 </trans-unit>
681 <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
682 <source>
683 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
684 </source>
685 <target>
686 Désolé, vous ne pouvez pas récupérer votre mot de passe car l'administrateur de votre instance n'a pas configuré le système de mails de PeerTube.
687 </target>
688 <context-group name="null">
689 <context context-type="linenumber">63</context>
690 </context-group>
691 </trans-unit>
465 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 692 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
466 <source>Email</source> 693 <source>Email</source>
467 <target>Courriel</target> 694 <target>Courriel</target>
@@ -480,7 +707,7 @@
480 <source>Send me an email to reset my password</source> 707 <source>Send me an email to reset my password</source>
481 <target>M'envoyer un courriel pour réinitialiser mon mot de passe</target> 708 <target>M'envoyer un courriel pour réinitialiser mon mot de passe</target>
482 <context-group name="null"> 709 <context-group name="null">
483 <context context-type="linenumber">75</context> 710 <context context-type="linenumber">80</context>
484 </context-group> 711 </context-group>
485 </trans-unit> 712 </trans-unit>
486 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 713 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -537,28 +764,28 @@
537 <source>Example: jane_doe</source> 764 <source>Example: jane_doe</source>
538 <target>Exemple: jane_doe</target> 765 <target>Exemple: jane_doe</target>
539 <context-group name="null"> 766 <context-group name="null">
540 <context context-type="linenumber">16</context> 767 <context context-type="linenumber">17</context>
541 </context-group> 768 </context-group>
542 </trans-unit> 769 </trans-unit>
543 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 770 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
544 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 771 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
545 <target>J'ai lu et j'accepte les &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Conditions d'utilisation&lt;/a&gt; de cette instance</target> 772 <target>J'ai au moins 16 ans et je suis d'accord avec les &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;conditions d'utilisations&lt;/a&gt; de l'instance</target>
546 <context-group name="null"> 773 <context-group name="null">
547 <context context-type="linenumber">54</context> 774 <context context-type="linenumber">55</context>
548 </context-group> 775 </context-group>
549 </trans-unit> 776 </trans-unit>
550 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 777 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
551 <source>Signup</source> 778 <source>Signup</source>
552 <target>Créer un compte</target> 779 <target>Créer un compte</target>
553 <context-group name="null"> 780 <context-group name="null">
554 <context context-type="linenumber">88</context> 781 <context context-type="linenumber">78</context>
555 </context-group> 782 </context-group>
556 </trans-unit> 783 </trans-unit>
557 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 784 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
558 <source>Features found on this instance</source> 785 <source>Features found on this instance</source>
559 <target>Fonctionnalités présentes sur cette instance</target> 786 <target>Fonctionnalités présentes sur cette instance</target>
560 <context-group name="null"> 787 <context-group name="null">
561 <context context-type="linenumber">66</context> 788 <context context-type="linenumber">67</context>
562 </context-group> 789 </context-group>
563 </trans-unit> 790 </trans-unit>
564 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 791 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -579,9 +806,15 @@
579 <context context-type="linenumber">6</context> 806 <context context-type="linenumber">6</context>
580 </context-group> 807 </context-group>
581 </trans-unit> 808 </trans-unit>
582 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 809 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
583 <source>Filters</source> 810 <source>
584 <target>Filtres</target> 811 Filters
812 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
813 </source>
814 <target>
815 Filtres
816 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
817 </target>
585 <context-group name="null"> 818 <context-group name="null">
586 <context context-type="linenumber">16</context> 819 <context context-type="linenumber">16</context>
587 </context-group> 820 </context-group>
@@ -594,28 +827,39 @@
594 Aucun résultat trouvé 827 Aucun résultat trouvé
595 </target> 828 </target>
596 <context-group name="null"> 829 <context-group name="null">
597 <context context-type="linenumber">25</context> 830 <context context-type="linenumber">28</context>
598 </context-group> 831 </context-group>
599 </trans-unit> 832 </trans-unit>
600 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 833 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
601 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 834 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
602 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonnés</target> 835 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonnés</target>
603 <context-group name="null"> 836 <context-group name="null">
604 <context context-type="linenumber">41</context> 837 <context context-type="linenumber">44</context>
605 </context-group> 838 </context-group>
606 </trans-unit> 839 </trans-unit>
607 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 840 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
608 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 841 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
609 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> vues</target> 842 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> vues</target>
610 <context-group name="null"> 843 <context-group name="null">
611 <context context-type="linenumber">52</context> 844 <context context-type="linenumber">55</context>
612 </context-group> 845 </context-group>
613 </trans-unit> 846 </trans-unit>
614 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 847 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
615 <source>Change the language</source> 848 <source>Change the language</source>
616 <target>Changer la langue</target> 849 <target>Changer la langue</target>
617 <context-group name="null"> 850 <context-group name="null">
618 <context context-type="linenumber">88</context> 851 <context context-type="linenumber">86</context>
852 </context-group>
853 </trans-unit>
854 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
855 <source>
856 Help to translate PeerTube!
857 </source>
858 <target>
859 Aidez à traduire PeerTube !
860 </target>
861 <context-group name="null">
862 <context context-type="linenumber">8</context>
619 </context-group> 863 </context-group>
620 </trans-unit> 864 </trans-unit>
621 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 865 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -626,7 +870,7 @@
626 Mon profil public 870 Mon profil public
627 </target> 871 </target>
628 <context-group name="null"> 872 <context-group name="null">
629 <context context-type="linenumber">18</context> 873 <context context-type="linenumber">16</context>
630 </context-group> 874 </context-group>
631 </trans-unit> 875 </trans-unit>
632 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 876 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -637,7 +881,7 @@
637 Mon compte 881 Mon compte
638 </target> 882 </target>
639 <context-group name="null"> 883 <context-group name="null">
640 <context context-type="linenumber">22</context> 884 <context context-type="linenumber">20</context>
641 </context-group> 885 </context-group>
642 </trans-unit> 886 </trans-unit>
643 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 887 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -648,7 +892,7 @@
648 Mes vidéos 892 Mes vidéos
649 </target> 893 </target>
650 <context-group name="null"> 894 <context-group name="null">
651 <context context-type="linenumber">26</context> 895 <context context-type="linenumber">24</context>
652 </context-group> 896 </context-group>
653 </trans-unit> 897 </trans-unit>
654 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 898 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -659,14 +903,14 @@
659 Se déconnecter 903 Se déconnecter
660 </target> 904 </target>
661 <context-group name="null"> 905 <context-group name="null">
662 <context context-type="linenumber">30</context> 906 <context context-type="linenumber">28</context>
663 </context-group> 907 </context-group>
664 </trans-unit> 908 </trans-unit>
665 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 909 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
666 <source>Create an account</source> 910 <source>Create an account</source>
667 <target>Créer un compte</target> 911 <target>Créer un compte</target>
668 <context-group name="null"> 912 <context-group name="null">
669 <context context-type="linenumber">39</context> 913 <context context-type="linenumber">37</context>
670 </context-group> 914 </context-group>
671 </trans-unit> 915 </trans-unit>
672 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 916 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -680,49 +924,49 @@
680 <source>Subscriptions</source> 924 <source>Subscriptions</source>
681 <target>Abonnements</target> 925 <target>Abonnements</target>
682 <context-group name="null"> 926 <context-group name="null">
683 <context context-type="linenumber">47</context> 927 <context context-type="linenumber">45</context>
684 </context-group> 928 </context-group>
685 </trans-unit> 929 </trans-unit>
686 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 930 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
687 <source>Overview</source> 931 <source>Overview</source>
688 <target>Vue d'ensemble</target> 932 <target>Vue d'ensemble</target>
689 <context-group name="null"> 933 <context-group name="null">
690 <context context-type="linenumber">52</context> 934 <context context-type="linenumber">50</context>
691 </context-group> 935 </context-group>
692 </trans-unit> 936 </trans-unit>
693 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 937 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
694 <source>Trending</source> 938 <source>Trending</source>
695 <target>Tendances</target> 939 <target>Tendances</target>
696 <context-group name="null"> 940 <context-group name="null">
697 <context context-type="linenumber">57</context> 941 <context context-type="linenumber">55</context>
698 </context-group> 942 </context-group>
699 </trans-unit> 943 </trans-unit>
700 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 944 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
701 <source>Recently added</source> 945 <source>Recently added</source>
702 <target>Récemment ajoutées</target> 946 <target>Récemment ajoutées</target>
703 <context-group name="null"> 947 <context-group name="null">
704 <context context-type="linenumber">62</context> 948 <context context-type="linenumber">60</context>
705 </context-group> 949 </context-group>
706 </trans-unit> 950 </trans-unit>
707 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 951 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
708 <source>Local</source> 952 <source>Local</source>
709 <target>Locales</target> 953 <target>Locales</target>
710 <context-group name="null"> 954 <context-group name="null">
711 <context context-type="linenumber">67</context> 955 <context context-type="linenumber">65</context>
712 </context-group> 956 </context-group>
713 </trans-unit> 957 </trans-unit>
714 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 958 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
715 <source>More</source> 959 <source>More</source>
716 <target>Plus</target> 960 <target>Plus</target>
717 <context-group name="null"> 961 <context-group name="null">
718 <context context-type="linenumber">72</context> 962 <context context-type="linenumber">70</context>
719 </context-group> 963 </context-group>
720 </trans-unit> 964 </trans-unit>
721 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 965 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
722 <source>Administration</source> 966 <source>Administration</source>
723 <target>Administration</target> 967 <target>Administration</target>
724 <context-group name="null"> 968 <context-group name="null">
725 <context context-type="linenumber">76</context> 969 <context context-type="linenumber">74</context>
726 </context-group> 970 </context-group>
727 </trans-unit> 971 </trans-unit>
728 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 972 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -736,14 +980,42 @@
736 <source>Show keyboard shortcuts</source> 980 <source>Show keyboard shortcuts</source>
737 <target>Montrer les raccourcis clavier</target> 981 <target>Montrer les raccourcis clavier</target>
738 <context-group name="null"> 982 <context-group name="null">
739 <context context-type="linenumber">91</context> 983 <context context-type="linenumber">89</context>
740 </context-group> 984 </context-group>
741 </trans-unit> 985 </trans-unit>
742 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 986 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
743 <source>Toggle dark interface</source> 987 <source>Toggle dark interface</source>
744 <target>(Dés)activer le thème sombre</target> 988 <target>(Dés)activer le thème sombre</target>
745 <context-group name="null"> 989 <context-group name="null">
746 <context context-type="linenumber">94</context> 990 <context context-type="linenumber">92</context>
991 </context-group>
992 </trans-unit>
993 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
994 <source>View your notifications</source>
995 <target>Voir vos notifications</target>
996 <context-group name="null">
997 <context context-type="linenumber">3</context>
998 </context-group>
999 </trans-unit>
1000 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
1001 <source>Notifications</source>
1002 <target>Notifications</target>
1003 <context-group name="null">
1004 <context context-type="linenumber">10</context>
1005 </context-group>
1006 </trans-unit>
1007 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
1008 <source>Update your notification preferences</source>
1009 <target>Mettre à jour vos préférences de notification</target>
1010 <context-group name="null">
1011 <context context-type="linenumber">15</context>
1012 </context-group>
1013 </trans-unit>
1014 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
1015 <source>See all your notifications</source>
1016 <target>Voir toutes vos notifications</target>
1017 <context-group name="null">
1018 <context context-type="linenumber">22</context>
747 </context-group> 1019 </context-group>
748 </trans-unit> 1020 </trans-unit>
749 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 1021 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -844,11 +1116,18 @@
844 <context context-type="linenumber">94</context> 1116 <context context-type="linenumber">94</context>
845 </context-group> 1117 </context-group>
846 </trans-unit> 1118 </trans-unit>
1119 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
1120 <source>Display unlisted and private videos</source>
1121 <target>Afficher les vidéos privées et non répertoriées</target>
1122 <context-group name="null">
1123 <context context-type="linenumber">14</context>
1124 </context-group>
1125 </trans-unit>
847 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1126 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
848 <source>No results.</source> 1127 <source>No results.</source>
849 <target>Aucun résultat.</target> 1128 <target>Aucun résultat.</target>
850 <context-group name="null"> 1129 <context-group name="null">
851 <context context-type="linenumber">7</context> 1130 <context context-type="linenumber">20</context>
852 </context-group> 1131 </context-group>
853 </trans-unit> 1132 </trans-unit>
854 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 1133 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -862,6 +1141,17 @@
862 <context context-type="linenumber">6</context> 1141 <context context-type="linenumber">6</context>
863 </context-group> 1142 </context-group>
864 </trans-unit> 1143 </trans-unit>
1144 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
1145 <source>
1146 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1147 </source>
1148 <target>
1149 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1150 </target>
1151 <context-group name="null">
1152 <context context-type="linenumber">14</context>
1153 </context-group>
1154 </trans-unit>
865 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 1155 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
866 <source> 1156 <source>
867 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 1157 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -885,7 +1175,7 @@
885 <source>Instance</source> 1175 <source>Instance</source>
886 <target>Instance</target> 1176 <target>Instance</target>
887 <context-group name="null"> 1177 <context-group name="null">
888 <context context-type="linenumber">8</context> 1178 <context context-type="linenumber">12</context>
889 </context-group> 1179 </context-group>
890 </trans-unit> 1180 </trans-unit>
891 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 1181 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -895,14 +1185,64 @@
895 <context context-type="linenumber">7</context> 1185 <context context-type="linenumber">7</context>
896 </context-group> 1186 </context-group>
897 </trans-unit> 1187 </trans-unit>
898 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1188 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
1189 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
1190 <target>Contacter l'administrateur de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1191 <context-group name="null">
1192 <context context-type="linenumber">3</context>
1193 </context-group>
1194 </trans-unit>
1195 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
1196 <source>Your name</source>
1197 <target>Votre nom</target>
1198 <context-group name="null">
1199 <context context-type="linenumber">11</context>
1200 </context-group>
1201 </trans-unit>
1202 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
1203 <source>Your email</source>
1204 <target>Votre mail</target>
1205 <context-group name="null">
1206 <context context-type="linenumber">20</context>
1207 </context-group>
1208 </trans-unit>
1209 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
1210 <source>Your message</source>
1211 <target>Votre message</target>
1212 <context-group name="null">
1213 <context context-type="linenumber">29</context>
1214 </context-group>
1215 </trans-unit>
1216 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
899 <source> 1217 <source>
900 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1218 Cancel
901</source> 1219 </source>
902 <target> 1220 <target>
903 À propos de l'instance : <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> </target> 1221 Annuler
1222 </target>
904 <context-group name="null"> 1223 <context-group name="null">
905 <context context-type="linenumber">1</context> 1224 <context context-type="linenumber">26</context>
1225 </context-group>
1226 </trans-unit>
1227 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1228 <source>Submit</source>
1229 <target>Envoyer</target>
1230 <context-group name="null">
1231 <context context-type="linenumber">31</context>
1232 </context-group>
1233 </trans-unit>
1234 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
1235 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
1236 <target>À propos de l'instance <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1237 <context-group name="null">
1238 <context context-type="linenumber">4</context>
1239 </context-group>
1240 </trans-unit>
1241 <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
1242 <source>Contact administrator</source>
1243 <target>Contact de l'administrateur</target>
1244 <context-group name="null">
1245 <context context-type="linenumber">6</context>
906 </context-group> 1246 </context-group>
907 </trans-unit> 1247 </trans-unit>
908 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1248 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -916,47 +1256,47 @@
916 <source>Terms</source> 1256 <source>Terms</source>
917 <target>Conditions d'utilisation</target> 1257 <target>Conditions d'utilisation</target>
918 <context-group name="null"> 1258 <context-group name="null">
919 <context context-type="linenumber">44</context> 1259 <context context-type="linenumber">39</context>
920 </context-group> 1260 </context-group>
921 </trans-unit> 1261 </trans-unit>
922 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1262 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
923 <source>User registration is allowed and</source> 1263 <source>User registration is allowed and</source>
924 <target>La création de comptes utilisateurs est autorisée et</target> 1264 <target>La création de comptes utilisateurs est autorisée et</target>
925 <context-group name="null"> 1265 <context-group name="null">
926 <context context-type="linenumber">25</context> 1266 <context context-type="linenumber">29</context>
927 </context-group> 1267 </context-group>
928 </trans-unit> 1268 </trans-unit>
929 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1269 <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
930 <source> 1270 <source>
931 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1271 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
932 </source> 1272 </source>
933 <target> 1273 <target>
934 cette instance fournit un quota de base de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs. 1274 cette instance propose un quota d'espace de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs.
935 </target> 1275 </target>
936 <context-group name="null"> 1276 <context-group name="null">
937 <context context-type="linenumber">27</context> 1277 <context context-type="linenumber">31</context>
938 </context-group> 1278 </context-group>
939 </trans-unit> 1279 </trans-unit>
940 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1280 <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
941 <source> 1281 <source>
942 this instance provides unlimited space for the videos of its users. 1282 this instance provides unlimited space for the videos of its users.
943 </source> 1283 </source>
944 <target> 1284 <target>
945 cette instance met à disposition de ses utilisateurs un espace de stockage vidéo illimité. 1285 cette instance propose un espace illimité pour les vidéos de ses utilisateurs.
946 </target> 1286 </target>
947 <context-group name="null"> 1287 <context-group name="null">
948 <context context-type="linenumber">31</context> 1288 <context context-type="linenumber">35</context>
949 </context-group> 1289 </context-group>
950 </trans-unit> 1290 </trans-unit>
951 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1291 <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
952 <source> 1292 <source>
953 User registration is currently not allowed. 1293 User registration is currently not allowed.
954 </source> 1294 </source>
955 <target> 1295 <target>
956 Vous ne pouvez pas créer de comptes utilisateurs pour le moment. 1296 La création de nouveaux compte n'est pas autorisée pour l'instant.
957 </target> 1297 </target>
958 <context-group name="null"> 1298 <context-group name="null">
959 <context context-type="linenumber">36</context> 1299 <context context-type="linenumber">40</context>
960 </context-group> 1300 </context-group>
961 </trans-unit> 1301 </trans-unit>
962 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1302 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1177,13 +1517,13 @@
1177 <context context-type="linenumber">83</context> 1517 <context context-type="linenumber">83</context>
1178 </context-group> 1518 </context-group>
1179 </trans-unit> 1519 </trans-unit>
1180 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1520 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1181 <source> 1521 <source>
1182 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1522 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1183 In the meantime, we want to test different ideas related to this issue: 1523 In the meantime, we want to test different ideas related to this issue:
1184 </source> 1524 </source>
1185 <target> 1525 <target>
1186 PeerTube n'est qu'en version bêta, et veut livrer les meilleures contre-mesures possibles d'ici la sortie de la version stable. 1526 PeerTube n'en est qu'à ses débuts, et veut fournir les meilleures contre-mesures possibles jusqu'à ce que la version finale sorte.
1187 En attendant, nous voulons tester différentes idées liées à cette question : 1527 En attendant, nous voulons tester différentes idées liées à cette question :
1188 </target> 1528 </target>
1189 <context-group name="null"> 1529 <context-group name="null">
@@ -1225,18 +1565,53 @@
1225 <context context-type="linenumber">95</context> 1565 <context context-type="linenumber">95</context>
1226 </context-group> 1566 </context-group>
1227 </trans-unit> 1567 </trans-unit>
1568 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1569 <source>Banned</source>
1570 <target>Bannis</target>
1571 <context-group name="null">
1572 <context context-type="linenumber">12</context>
1573 </context-group>
1574 </trans-unit>
1575 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1576 <source>Muted</source>
1577 <target>Silencieux</target>
1578 <context-group name="null">
1579 <context context-type="linenumber">13</context>
1580 </context-group>
1581 </trans-unit>
1582 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1583 <source>Muted by your instance</source>
1584 <target>Rendu silencieux par votre instance</target>
1585 <context-group name="null">
1586 <context context-type="linenumber">14</context>
1587 </context-group>
1588 </trans-unit>
1589 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1590 <source>Instance muted</source>
1591 <target>Instance muette</target>
1592 <context-group name="null">
1593 <context context-type="linenumber">15</context>
1594 </context-group>
1595 </trans-unit>
1596 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1597 <source>Instance muted by your instance</source>
1598 <target>Instance rendue muette par votre instance</target>
1599 <context-group name="null">
1600 <context context-type="linenumber">16</context>
1601 </context-group>
1602 </trans-unit>
1228 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1603 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1229 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1604 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1230 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnés</target> 1605 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnés</target>
1231 <context-group name="null"> 1606 <context-group name="null">
1232 <context context-type="linenumber">12</context> 1607 <context context-type="linenumber">24</context>
1233 </context-group> 1608 </context-group>
1234 </trans-unit> 1609 </trans-unit>
1235 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1610 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1236 <source>Video channels</source> 1611 <source>Video channels</source>
1237 <target>Chaînes de vidéos</target> 1612 <target>Chaînes de vidéos</target>
1238 <context-group name="null"> 1613 <context-group name="null">
1239 <context context-type="linenumber">19</context> 1614 <context context-type="linenumber">31</context>
1240 </context-group> 1615 </context-group>
1241 </trans-unit> 1616 </trans-unit>
1242 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1617 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1278,49 +1653,49 @@
1278 <source>Short description</source> 1653 <source>Short description</source>
1279 <target>Courte description</target> 1654 <target>Courte description</target>
1280 <context-group name="null"> 1655 <context-group name="null">
1281 <context context-type="linenumber">22</context> 1656 <context context-type="linenumber">21</context>
1282 </context-group> 1657 </context-group>
1283 </trans-unit> 1658 </trans-unit>
1284 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1659 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1285 <source>Default client route</source> 1660 <source>Default client route</source>
1286 <target>Route du client par défaut</target> 1661 <target>Route du client par défaut</target>
1287 <context-group name="null"> 1662 <context-group name="null">
1288 <context context-type="linenumber">55</context> 1663 <context context-type="linenumber">48</context>
1289 </context-group> 1664 </context-group>
1290 </trans-unit> 1665 </trans-unit>
1291 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1666 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1292 <source>Videos Overview</source> 1667 <source>Videos Overview</source>
1293 <target>Vue d'ensemble des vidéos</target> 1668 <target>Vue d'ensemble des vidéos</target>
1294 <context-group name="null"> 1669 <context-group name="null">
1295 <context context-type="linenumber">58</context> 1670 <context context-type="linenumber">51</context>
1296 </context-group> 1671 </context-group>
1297 </trans-unit> 1672 </trans-unit>
1298 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1673 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1299 <source>Videos Trending</source> 1674 <source>Videos Trending</source>
1300 <target>Vidéos tendance</target> 1675 <target>Vidéos tendance</target>
1301 <context-group name="null"> 1676 <context-group name="null">
1302 <context context-type="linenumber">59</context> 1677 <context context-type="linenumber">52</context>
1303 </context-group> 1678 </context-group>
1304 </trans-unit> 1679 </trans-unit>
1305 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1680 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1306 <source>Videos Recently Added</source> 1681 <source>Videos Recently Added</source>
1307 <target>Vidéos récemment ajoutées</target> 1682 <target>Vidéos récemment ajoutées</target>
1308 <context-group name="null"> 1683 <context-group name="null">
1309 <context context-type="linenumber">60</context> 1684 <context context-type="linenumber">53</context>
1310 </context-group> 1685 </context-group>
1311 </trans-unit> 1686 </trans-unit>
1312 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1687 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1313 <source>Local videos</source> 1688 <source>Local videos</source>
1314 <target>Vidéos locales</target> 1689 <target>Vidéos locales</target>
1315 <context-group name="null"> 1690 <context-group name="null">
1316 <context context-type="linenumber">61</context> 1691 <context context-type="linenumber">54</context>
1317 </context-group> 1692 </context-group>
1318 </trans-unit> 1693 </trans-unit>
1319 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1694 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1320 <source>Policy on videos containing sensitive content</source> 1695 <source>Policy on videos containing sensitive content</source>
1321 <target>Politique concernant les vidéos ayant du contenu sensible</target> 1696 <target>Politique concernant les vidéos ayant du contenu sensible</target>
1322 <context-group name="null"> 1697 <context-group name="null">
1323 <context context-type="linenumber">70</context> 1698 <context context-type="linenumber">61</context>
1324 </context-group> 1699 </context-group>
1325 </trans-unit> 1700 </trans-unit>
1326 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1701 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1355,21 +1730,42 @@
1355 <source>Signup enabled</source> 1730 <source>Signup enabled</source>
1356 <target>Enregistrement activé</target> 1731 <target>Enregistrement activé</target>
1357 <context-group name="null"> 1732 <context-group name="null">
1358 <context context-type="linenumber">92</context> 1733 <context context-type="linenumber">84</context>
1359 </context-group> 1734 </context-group>
1360 </trans-unit> 1735 </trans-unit>
1361 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1736 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1362 <source>Signup requires email verification</source> 1737 <source>Signup requires email verification</source>
1363 <target>L'inscription requiert la vérification par courriel</target> 1738 <target>L'inscription requiert la vérification par courriel</target>
1364 <context-group name="null"> 1739 <context-group name="null">
1365 <context context-type="linenumber">97</context> 1740 <context context-type="linenumber">91</context>
1366 </context-group> 1741 </context-group>
1367 </trans-unit> 1742 </trans-unit>
1368 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1743 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1369 <source>Signup limit</source> 1744 <source>Signup limit</source>
1370 <target>Limitation des enregistrements</target> 1745 <target>Limitation des enregistrements</target>
1371 <context-group name="null"> 1746 <context-group name="null">
1372 <context context-type="linenumber">101</context> 1747 <context context-type="linenumber">96</context>
1748 </context-group>
1749 </trans-unit>
1750 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1751 <source>Users</source>
1752 <target>Utilisateurs</target>
1753 <context-group name="null">
1754 <context context-type="linenumber">105</context>
1755 </context-group>
1756 </trans-unit>
1757 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1758 <source>User default video quota</source>
1759 <target>Quota de vidéos par défaut par utilisateur </target>
1760 <context-group name="null">
1761 <context context-type="linenumber">109</context>
1762 </context-group>
1763 </trans-unit>
1764 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1765 <source>User default daily upload limit</source>
1766 <target>La limite journalière de téléversement est atteinte</target>
1767 <context-group name="null">
1768 <context context-type="linenumber">121</context>
1373 </context-group> 1769 </context-group>
1374 </trans-unit> 1770 </trans-unit>
1375 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1771 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1379,53 +1775,39 @@
1379 <context context-type="linenumber">42</context> 1775 <context context-type="linenumber">42</context>
1380 </context-group> 1776 </context-group>
1381 </trans-unit> 1777 </trans-unit>
1382 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1778 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1383 <source>Video import with HTTP enabled</source> 1779 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1384 <target>Import de vidéo avec HTTP activé</target> 1780 <target>Import de vidéo via une URL (YouTube par exemple) activé</target>
1385 <context-group name="null"> 1781 <context-group name="null">
1386 <context context-type="linenumber">115</context> 1782 <context context-type="linenumber">141</context>
1387 </context-group> 1783 </context-group>
1388 </trans-unit> 1784 </trans-unit>
1389 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1785 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1390 <source>Video import with a torrent file or a magnet URI enabled</source> 1786 <source>Video import with a torrent file or a magnet URI enabled</source>
1391 <target>Import de vidéo avec un fichier torrent ou URL magnet activé</target> 1787 <target>Import de vidéo avec un fichier torrent ou URL magnet activé</target>
1392 <context-group name="null"> 1788 <context-group name="null">
1393 <context context-type="linenumber">120</context> 1789 <context context-type="linenumber">148</context>
1394 </context-group> 1790 </context-group>
1395 </trans-unit> 1791 </trans-unit>
1396 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1792 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1397 <source>Administrator</source> 1793 <source>Administrator</source>
1398 <target>Administrateur</target> 1794 <target>Administrateur</target>
1399 <context-group name="null"> 1795 <context-group name="null">
1400 <context context-type="linenumber">123</context> 1796 <context context-type="linenumber">155</context>
1401 </context-group> 1797 </context-group>
1402 </trans-unit> 1798 </trans-unit>
1403 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1799 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1404 <source>Admin email</source> 1800 <source>Admin email</source>
1405 <target>Email de l'administrateur</target> 1801 <target>Email de l'administrateur</target>
1406 <context-group name="null"> 1802 <context-group name="null">
1407 <context context-type="linenumber">126</context> 1803 <context context-type="linenumber">158</context>
1408 </context-group>
1409 </trans-unit>
1410 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1411 <source>Users</source>
1412 <target>Utilisateurs</target>
1413 <context-group name="null">
1414 <context context-type="linenumber">136</context>
1415 </context-group>
1416 </trans-unit>
1417 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1418 <source>User default video quota</source>
1419 <target>Quota de vidéos par défaut par utilisateur </target>
1420 <context-group name="null">
1421 <context context-type="linenumber">139</context>
1422 </context-group> 1804 </context-group>
1423 </trans-unit> 1805 </trans-unit>
1424 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe"> 1806 <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
1425 <source>User default daily upload limit</source> 1807 <source>Enable contact form</source>
1426 <target>La limite journalière de téléversement est atteinte</target> 1808 <target>Activer le formulaire de contact</target>
1427 <context-group name="null"> 1809 <context-group name="null">
1428 <context context-type="linenumber">153</context> 1810 <context context-type="linenumber">169</context>
1429 </context-group> 1811 </context-group>
1430 </trans-unit> 1812 </trans-unit>
1431 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1813 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1439,81 +1821,95 @@
1439 <source>Twitter</source> 1821 <source>Twitter</source>
1440 <target>Twitter</target> 1822 <target>Twitter</target>
1441 <context-group name="null"> 1823 <context-group name="null">
1442 <context context-type="linenumber">170</context> 1824 <context context-type="linenumber">178</context>
1443 </context-group> 1825 </context-group>
1444 </trans-unit> 1826 </trans-unit>
1445 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1827 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1446 <source>Your Twitter username</source> 1828 <source>Your Twitter username</source>
1447 <target>Votre identifiant Twitter</target> 1829 <target>Votre identifiant Twitter</target>
1448 <context-group name="null"> 1830 <context-group name="null">
1449 <context context-type="linenumber">173</context> 1831 <context context-type="linenumber">184</context>
1450 </context-group> 1832 </context-group>
1451 </trans-unit> 1833 </trans-unit>
1452 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1834 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1453 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1835 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1454 <target>Indique le compte Twitter pour le site ou la plateforme sur laquelle le contenu a été publié.</target> 1836 <target>Indique le compte Twitter pour le site ou la plateforme sur laquelle le contenu a été publié.</target>
1455 <context-group name="null"> 1837 <context-group name="null">
1456 <context context-type="linenumber">176</context> 1838 <context context-type="linenumber">187</context>
1457 </context-group> 1839 </context-group>
1458 </trans-unit> 1840 </trans-unit>
1459 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1841 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1460 <source>Instance whitelisted by Twitter</source> 1842 <source>Instance whitelisted by Twitter</source>
1461 <target>Instance sur la liste blanche de Twitter</target> 1843 <target>Instance sur la liste blanche de Twitter</target>
1462 <context-group name="null"> 1844 <context-group name="null">
1463 <context context-type="linenumber">189</context> 1845 <context context-type="linenumber">199</context>
1464 </context-group> 1846 </context-group>
1465 </trans-unit> 1847 </trans-unit>
1466 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a"> 1848 <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
1467 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt; 1849 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1468 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt; 1850 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1469 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source> 1851 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1470 <target>Si votre instance est sur la liste blanche de Twitter, un lecteur vidéo sera intégré dans le fil d'actualité de Twitter lors d'un partage d'une vidéo PeerTube.&lt;br /&gt; 1852 <target>Si votre instance est autorisée par Twitter, un lecteur de vidéo sera inséré dans le flux Twitter pour les partages de vidéo depuis PeerTube.&lt;br /&gt;
1471Si l'instance n'est pas sur liste blanche, nous utilisons un lien-image qui redirigera sur votre instance PeerTube.&lt;br /&gt;&lt;br /&gt; 1853 Si votre instance n'est pas autorisée, une carte sera inséré avec une image et un lien vers votre instance PeerTube.&lt;br /&gt;&lt;br /&gt;
1472Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidéo de votre instance (https://example.com/videos/watch/blabla) sur &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; pour voir si votre instance est sur liste blanche.</target> 1854 Selectionnez cette case, sauvegardez la configuration et pour tester si votre instance est autorisée par Twitter, insérez l'URL d'une vidéo de votre instance (https://example.com/videos/watch/blabla) sur &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt;.</target>
1473 <context-group name="null"> 1855 <context-group name="null">
1474 <context context-type="linenumber">190</context> 1856 <context context-type="linenumber">200</context>
1475 </context-group> 1857 </context-group>
1476 </trans-unit> 1858 </trans-unit>
1477 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1859 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1478 <source>Services</source> 1860 <source>Services</source>
1479 <target>Services</target> 1861 <target>Services</target>
1480 <context-group name="null"> 1862 <context-group name="null">
1481 <context context-type="linenumber">168</context> 1863 <context context-type="linenumber">176</context>
1482 </context-group> 1864 </context-group>
1483 </trans-unit> 1865 </trans-unit>
1484 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1866 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1485 <source>Transcoding</source> 1867 <source>Transcoding</source>
1486 <target>Encodage</target> 1868 <target>Encodage</target>
1487 <context-group name="null"> 1869 <context-group name="null">
1488 <context context-type="linenumber">200</context> 1870 <context context-type="linenumber">215</context>
1489 </context-group> 1871 </context-group>
1490 </trans-unit> 1872 </trans-unit>
1491 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1873 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1492 <source>Transcoding enabled</source> 1874 <source>Transcoding enabled</source>
1493 <target>Encodage activé</target> 1875 <target>Encodage activé</target>
1494 <context-group name="null"> 1876 <context-group name="null">
1495 <context context-type="linenumber">204</context> 1877 <context context-type="linenumber">221</context>
1496 </context-group> 1878 </context-group>
1497 </trans-unit> 1879 </trans-unit>
1498 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1880 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1499 <source>If you disable transcoding, many videos from your users will not work!</source> 1881 <source>If you disable transcoding, many videos from your users will not work!</source>
1500 <target>Si vous désactivez le transcodage, de nombreuses vidéos d'utilisateurs ne fonctionneront pas !</target> 1882 <target>Si vous désactivez le transcodage, de nombreuses vidéos d'utilisateurs ne fonctionneront pas !</target>
1501 <context-group name="null"> 1883 <context-group name="null">
1502 <context context-type="linenumber">205</context> 1884 <context context-type="linenumber">222</context>
1885 </context-group>
1886 </trans-unit>
1887 <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
1888 <source>Allow additional extensions</source>
1889 <target>Permettre des extensions additionnelles</target>
1890 <context-group name="null">
1891 <context context-type="linenumber">231</context>
1892 </context-group>
1893 </trans-unit>
1894 <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
1895 <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
1896 <target>Autoriser vos utilisateurs à publier des vidéos .mkv, .mov, .avi et .flv.</target>
1897 <context-group name="null">
1898 <context context-type="linenumber">232</context>
1503 </context-group> 1899 </context-group>
1504 </trans-unit> 1900 </trans-unit>
1505 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1901 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1506 <source>Transcoding threads</source> 1902 <source>Transcoding threads</source>
1507 <target>Nombre de threads pour l'encodage</target> 1903 <target>Nombre de threads pour l'encodage</target>
1508 <context-group name="null"> 1904 <context-group name="null">
1509 <context context-type="linenumber">211</context> 1905 <context context-type="linenumber">237</context>
1510 </context-group> 1906 </context-group>
1511 </trans-unit> 1907 </trans-unit>
1512 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1908 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1513 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1909 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1514 <target>Résolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activée</target> 1910 <target>Résolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activée</target>
1515 <context-group name="null"> 1911 <context-group name="null">
1516 <context context-type="linenumber">227</context> 1912 <context context-type="linenumber">252</context>
1517 </context-group> 1913 </context-group>
1518 </trans-unit> 1914 </trans-unit>
1519 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1915 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1528,105 +1924,105 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1528 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1924 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1529 </target> 1925 </target>
1530 <context-group name="null"> 1926 <context-group name="null">
1531 <context context-type="linenumber">233</context> 1927 <context context-type="linenumber">260</context>
1532 </context-group> 1928 </context-group>
1533 </trans-unit> 1929 </trans-unit>
1534 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1930 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1535 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1931 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1536 <target>Certain fichiers ne sont pas fédérés (miniature, sous-titre). Nous les récupérons directement depuis l'instance d'origine et nous les gardons en cache.</target> 1932 <target>Certain fichiers ne sont pas fédérés (miniature, sous-titre). Nous les récupérons directement depuis l'instance d'origine et nous les gardons en cache.</target>
1537 <context-group name="null"> 1933 <context-group name="null">
1538 <context context-type="linenumber">238</context> 1934 <context context-type="linenumber">265</context>
1539 </context-group> 1935 </context-group>
1540 </trans-unit> 1936 </trans-unit>
1541 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1937 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1542 <source>Previews cache size</source> 1938 <source>Previews cache size</source>
1543 <target>Taille du cache des prévisualisations </target> 1939 <target>Taille du cache des prévisualisations </target>
1544 <context-group name="null"> 1940 <context-group name="null">
1545 <context context-type="linenumber">243</context> 1941 <context context-type="linenumber">271</context>
1546 </context-group> 1942 </context-group>
1547 </trans-unit> 1943 </trans-unit>
1548 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1944 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1549 <source>Video captions cache size</source> 1945 <source>Video captions cache size</source>
1550 <target>Taille du cache des sous-titres</target> 1946 <target>Taille du cache des sous-titres</target>
1551 <context-group name="null"> 1947 <context-group name="null">
1552 <context context-type="linenumber">254</context> 1948 <context context-type="linenumber">280</context>
1553 </context-group> 1949 </context-group>
1554 </trans-unit> 1950 </trans-unit>
1555 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1951 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1556 <source>Customizations</source> 1952 <source>Customizations</source>
1557 <target>Personnalisations</target> 1953 <target>Personnalisations</target>
1558 <context-group name="null"> 1954 <context-group name="null">
1559 <context context-type="linenumber">264</context> 1955 <context context-type="linenumber">289</context>
1560 </context-group> 1956 </context-group>
1561 </trans-unit> 1957 </trans-unit>
1562 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1958 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1563 <source>JavaScript</source> 1959 <source>JavaScript</source>
1564 <target>JavaScript</target> 1960 <target>JavaScript</target>
1565 <context-group name="null"> 1961 <context-group name="null">
1566 <context context-type="linenumber">267</context> 1962 <context context-type="linenumber">294</context>
1567 </context-group> 1963 </context-group>
1568 </trans-unit> 1964 </trans-unit>
1569 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1965 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1570 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1966 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1571 <target>Écrivez directement du code JavaScript.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instance est super géniale');&lt;/pre&gt;</target> 1967 <target>Écrivez directement du code JavaScript.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instance est super géniale');&lt;/pre&gt;</target>
1572 <context-group name="null"> 1968 <context-group name="null">
1573 <context context-type="linenumber">270</context> 1969 <context context-type="linenumber">297</context>
1574 </context-group> 1970 </context-group>
1575 </trans-unit> 1971 </trans-unit>
1576 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5"> 1972 <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
1577 <source> 1973 <source>
1578 Write directly CSS code. Example:&lt;br /&gt; 1974 Write directly CSS code. Example:&lt;br /&gt;
1579 &lt;pre&gt; 1975 &lt;pre&gt;
1580 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1976 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1581 background-color: red; 1977 background-color: red;
1582 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1978 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1583 &lt;/pre&gt; 1979 &lt;/pre&gt;
1584 1980
1585 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example: 1981 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1586 &lt;pre&gt; 1982 &lt;pre&gt;
1587 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1983 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1588 color: red; 1984 color: red;
1589 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1985 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1590 &lt;/pre&gt; 1986 &lt;/pre&gt;
1591 </source> 1987 </source>
1592 <target> 1988 <target>
1593 Écrivez directement du code CSS. Exemple :&lt;br /&gt; 1989 Écrivez directement du code CSS. Par exemple:&lt;br /&gt;
1594 &lt;pre&gt; 1990 &lt;pre&gt;
1595 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1991 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1596 background-color: red; 1992 background-color: red;
1597 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1993 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1598 &lt;/pre&gt; 1994 &lt;/pre&gt;
1599 1995
1600 Ajoutez le préfixe &lt;em&gt;#custom-css&lt;/em&gt; pour remplacer les styles. Exemple: 1996 Ajoutez le préfixe &lt;em&gt;#custom-css&lt;/em&gt; pour surcharger les styles. Par exemple:
1601 &lt;pre&gt; 1997 &lt;pre&gt;
1602 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1998 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1603 color: red; 1999 color: red;
1604 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 2000 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1605 &lt;/pre&gt; 2001 &lt;/pre&gt;
1606 </target> 2002 </target>
1607 <context-group name="null"> 2003 <context-group name="null">
1608 <context context-type="linenumber">286</context> 2004 <context context-type="linenumber">311</context>
1609 </context-group> 2005 </context-group>
1610 </trans-unit> 2006 </trans-unit>
1611 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 2007 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1612 <source>Advanced configuration</source> 2008 <source>Advanced configuration</source>
1613 <target>Configuration avancée</target> 2009 <target>Configuration avancée</target>
1614 <context-group name="null"> 2010 <context-group name="null">
1615 <context context-type="linenumber">197</context> 2011 <context context-type="linenumber">212</context>
1616 </context-group> 2012 </context-group>
1617 </trans-unit> 2013 </trans-unit>
1618 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 2014 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1619 <source>Update configuration</source> 2015 <source>Update configuration</source>
1620 <target>Mettre à jour la configuration</target> 2016 <target>Mettre à jour la configuration</target>
1621 <context-group name="null"> 2017 <context-group name="null">
1622 <context context-type="linenumber">314</context> 2018 <context context-type="linenumber">340</context>
1623 </context-group> 2019 </context-group>
1624 </trans-unit> 2020 </trans-unit>
1625 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 2021 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1626 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 2022 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1627 <target>Il semblerait que la configuration soit invalide. Merci de chercher des erreurs potentielles dans les différents onglets.</target> 2023 <target>Il semblerait que la configuration soit invalide. Merci de chercher des erreurs potentielles dans les différents onglets.</target>
1628 <context-group name="null"> 2024 <context-group name="null">
1629 <context context-type="linenumber">315</context> 2025 <context context-type="linenumber">341</context>
1630 </context-group> 2026 </context-group>
1631 </trans-unit> 2027 </trans-unit>
1632 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 2028 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1709,6 +2105,13 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1709 <context context-type="linenumber">21</context> 2105 <context context-type="linenumber">21</context>
1710 </context-group> 2106 </context-group>
1711 </trans-unit> 2107 </trans-unit>
2108 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
2109 <source>Filter...</source>
2110 <target>Filtrage...</target>
2111 <context-group name="null">
2112 <context context-type="linenumber">27</context>
2113 </context-group>
2114 </trans-unit>
1712 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 2115 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1713 <source>ID</source> 2116 <source>ID</source>
1714 <target>ID</target> 2117 <target>ID</target>
@@ -1720,14 +2123,14 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1720 <source>Score</source> 2123 <source>Score</source>
1721 <target>Score</target> 2124 <target>Score</target>
1722 <context-group name="null"> 2125 <context-group name="null">
1723 <context context-type="linenumber">8</context> 2126 <context context-type="linenumber">17</context>
1724 </context-group> 2127 </context-group>
1725 </trans-unit> 2128 </trans-unit>
1726 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 2129 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1727 <source>Host</source> 2130 <source>Host</source>
1728 <target>Hôte</target> 2131 <target>Hôte</target>
1729 <context-group name="null"> 2132 <context-group name="null">
1730 <context context-type="linenumber">8</context> 2133 <context context-type="linenumber">19</context>
1731 </context-group> 2134 </context-group>
1732 </trans-unit> 2135 </trans-unit>
1733 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 2136 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1748,21 +2151,21 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1748 <source>Accepted</source> 2151 <source>Accepted</source>
1749 <target>Accepté</target> 2152 <target>Accepté</target>
1750 <context-group name="null"> 2153 <context-group name="null">
1751 <context context-type="linenumber">21</context> 2154 <context context-type="linenumber">32</context>
1752 </context-group> 2155 </context-group>
1753 </trans-unit> 2156 </trans-unit>
1754 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506"> 2157 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1755 <source>Pending</source> 2158 <source>Pending</source>
1756 <target>En attente</target> 2159 <target>En attente</target>
1757 <context-group name="null"> 2160 <context-group name="null">
1758 <context context-type="linenumber">22</context> 2161 <context context-type="linenumber">33</context>
1759 </context-group> 2162 </context-group>
1760 </trans-unit> 2163 </trans-unit>
1761 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8"> 2164 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1762 <source>Redundancy allowed</source> 2165 <source>Redundancy allowed</source>
1763 <target>Redondance autorisée</target> 2166 <target>Redondance autorisée</target>
1764 <context-group name="null"> 2167 <context-group name="null">
1765 <context context-type="linenumber">11</context> 2168 <context context-type="linenumber">22</context>
1766 </context-group> 2169 </context-group>
1767 </trans-unit> 2170 </trans-unit>
1768 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 2171 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
@@ -1853,7 +2256,7 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1853 <source>Role</source> 2256 <source>Role</source>
1854 <target>Rôle</target> 2257 <target>Rôle</target>
1855 <context-group name="null"> 2258 <context-group name="null">
1856 <context context-type="linenumber">20</context> 2259 <context context-type="linenumber">43</context>
1857 </context-group> 2260 </context-group>
1858 </trans-unit> 2261 </trans-unit>
1859 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 2262 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1876,64 +2279,60 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1876 <context context-type="linenumber">72</context> 2279 <context context-type="linenumber">72</context>
1877 </context-group> 2280 </context-group>
1878 </trans-unit> 2281 </trans-unit>
1879 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 2282 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1880 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 2283 <source>Users list</source>
1881 <target>Bannir <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target> 2284 <target>Liste des utilisateurs</target>
1882 <context-group name="null"> 2285 <context-group name="null">
1883 <context context-type="linenumber">3</context> 2286 <context context-type="linenumber">2</context>
1884 </context-group> 2287 </context-group>
1885 </trans-unit> 2288 </trans-unit>
1886 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125"> 2289 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1887 <source>Reason...</source> 2290 <source>Batch actions</source>
1888 <target>Motivation…</target> 2291 <target>Actions en lot</target>
1889 <context-group name="null"> 2292 <context-group name="null">
1890 <context context-type="linenumber">11</context> 2293 <context context-type="linenumber">19</context>
1891 </context-group> 2294 </context-group>
1892 </trans-unit> 2295 </trans-unit>
1893 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251"> 2296 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1894 <source> 2297 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1895 A banned user will no longer be able to login. 2298 <target>Identifiant <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1896 </source>
1897 <target>
1898 Un utilisateur banni ne sera plus capable de se connecter.
1899 </target>
1900 <context-group name="null"> 2299 <context-group name="null">
1901 <context context-type="linenumber">17</context> 2300 <context context-type="linenumber">40</context>
1902 </context-group> 2301 </context-group>
1903 </trans-unit> 2302 </trans-unit>
1904 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 2303 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1905 <source>Ban this user</source> 2304 <source>(banned)</source>
1906 <target>Bannir cet utilisateur</target> 2305 <target>(banni)</target>
1907 <context-group name="null"> 2306 <context-group name="null">
1908 <context context-type="linenumber">25</context> 2307 <context context-type="linenumber">65</context>
1909 </context-group> 2308 </context-group>
1910 </trans-unit> 2309 </trans-unit>
1911 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 2310 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1912 <source>Users list</source> 2311 <source>Go to the account page</source>
1913 <target>Liste des utilisateurs</target> 2312 <target>Accéder au profil public de l'utilisateur</target>
1914 <context-group name="null"> 2313 <context-group name="null">
1915 <context context-type="linenumber">2</context> 2314 <context context-type="linenumber">133</context>
1916 </context-group> 2315 </context-group>
1917 </trans-unit> 2316 </trans-unit>
1918 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 2317 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1919 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2318 <source>User's email must be verified to login</source>
1920 <target>Identifiant <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2319 <target>L'adresse mail de l'utilisateur doit être vérifiée afin de se connecter</target>
1921 <context-group name="null"> 2320 <context-group name="null">
1922 <context context-type="linenumber">17</context> 2321 <context context-type="linenumber">72</context>
1923 </context-group> 2322 </context-group>
1924 </trans-unit> 2323 </trans-unit>
1925 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 2324 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1926 <source>Actions</source> 2325 <source>User's email is verified / User can login without email verification</source>
1927 <target>Actions</target> 2326 <target>L'adresse mail de l'utilisateur est vérifié / L'utilisateur peut se connecter sans vérification mail</target>
1928 <context-group name="null"> 2327 <context-group name="null">
1929 <context context-type="linenumber">33</context> 2328 <context context-type="linenumber">76</context>
1930 </context-group> 2329 </context-group>
1931 </trans-unit> 2330 </trans-unit>
1932 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 2331 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1933 <source>Ban reason:</source> 2332 <source>Ban reason:</source>
1934 <target>Raison du bannissement :</target> 2333 <target>Raison du bannissement :</target>
1935 <context-group name="null"> 2334 <context-group name="null">
1936 <context context-type="linenumber">51</context> 2335 <context context-type="linenumber">95</context>
1937 </context-group> 2336 </context-group>
1938 </trans-unit> 2337 </trans-unit>
1939 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 2338 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1996,6 +2395,13 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
1996 <context context-type="linenumber">33</context> 2395 <context context-type="linenumber">33</context>
1997 </context-group> 2396 </context-group>
1998 </trans-unit> 2397 </trans-unit>
2398 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2399 <source>Actions</source>
2400 <target>Actions</target>
2401 <context-group name="null">
2402 <context context-type="linenumber">35</context>
2403 </context-group>
2404 </trans-unit>
1999 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2405 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
2000 <source>Reason:</source> 2406 <source>Reason:</source>
2001 <target>Raison :</target> 2407 <target>Raison :</target>
@@ -2028,14 +2434,14 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
2028 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2434 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2029 <target>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2435 <target>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2030 <context-group name="null"> 2436 <context-group name="null">
2031 <context context-type="linenumber">10</context> 2437 <context context-type="linenumber">11</context>
2032 </context-group> 2438 </context-group>
2033 </trans-unit> 2439 </trans-unit>
2034 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2440 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2035 <source>Blacklist reason:</source> 2441 <source>Blacklist reason:</source>
2036 <target>Raison de mise sur liste noire :</target> 2442 <target>Raison de mise sur liste noire :</target>
2037 <context-group name="null"> 2443 <context-group name="null">
2038 <context context-type="linenumber">41</context> 2444 <context context-type="linenumber">43</context>
2039 </context-group> 2445 </context-group>
2040 </trans-unit> 2446 </trans-unit>
2041 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2447 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2059,53 +2465,39 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
2059 <context context-type="linenumber">7</context> 2465 <context context-type="linenumber">7</context>
2060 </context-group> 2466 </context-group>
2061 </trans-unit> 2467 </trans-unit>
2062 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2468 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
2063 <source>My settings</source> 2469 <source>Muted accounts</source>
2064 <target>Mes paramètres</target> 2470 <target>Comptes silencieux</target>
2065 <context-group name="null"> 2471 <context-group name="null">
2066 <context context-type="linenumber">3</context> 2472 <context context-type="linenumber">2</context>
2067 </context-group> 2473 </context-group>
2068 </trans-unit> 2474 </trans-unit>
2069 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2475 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
2070 <source>My library</source> 2476 <source>Muted servers</source>
2071 <target>Ma bibliothèque</target> 2477 <target>Serveurs silencieux</target>
2072 <context-group name="null"> 2478 <context-group name="null">
2073 <context context-type="linenumber">7</context> 2479 <context context-type="linenumber">11</context>
2074 </context-group> 2480 </context-group>
2075 </trans-unit> 2481 </trans-unit>
2076 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2482 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2077 <source>My channels</source> 2483 <source>Account</source>
2078 <target>Mes chaînes</target> 2484 <target>Comptes</target>
2079 <context-group name="null"> 2485 <context-group name="null">
2080 <context context-type="linenumber">12</context> 2486 <context context-type="linenumber">12</context>
2081 </context-group> 2487 </context-group>
2082 </trans-unit> 2488 </trans-unit>
2083 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2489 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2084 <source>My videos</source> 2490 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2085 <target>Mes vidéos</target> 2491 <target>Rendu silencieux <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2086 <context-group name="null"> 2492 <context-group name="null">
2087 <context context-type="linenumber">14</context> 2493 <context context-type="linenumber">13</context>
2088 </context-group>
2089 </trans-unit>
2090 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2091 <source>My subscriptions</source>
2092 <target>Mes abonnements</target>
2093 <context-group name="null">
2094 <context context-type="linenumber">16</context>
2095 </context-group>
2096 </trans-unit>
2097 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2098 <source>My imports</source>
2099 <target>Mes imports</target>
2100 <context-group name="null">
2101 <context context-type="linenumber">18</context>
2102 </context-group> 2494 </context-group>
2103 </trans-unit> 2495 </trans-unit>
2104 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7"> 2496 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2105 <source>Ownership changes</source> 2497 <source>Unmute</source>
2106 <target>Changements de propriétaires</target> 2498 <target>Réactiver</target>
2107 <context-group name="null"> 2499 <context-group name="null">
2108 <context context-type="linenumber">22</context> 2500 <context context-type="linenumber">23</context>
2109 </context-group> 2501 </context-group>
2110 </trans-unit> 2502 </trans-unit>
2111 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2503 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2119,21 +2511,21 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
2119 <source>Profile</source> 2511 <source>Profile</source>
2120 <target>Profil</target> 2512 <target>Profil</target>
2121 <context-group name="null"> 2513 <context-group name="null">
2122 <context context-type="linenumber">8</context> 2514 <context context-type="linenumber">7</context>
2123 </context-group> 2515 </context-group>
2124 </trans-unit> 2516 </trans-unit>
2125 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2517 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2126 <source>Video settings</source> 2518 <source>Video settings</source>
2127 <target>Paramètres de la vidéo</target> 2519 <target>Paramètres de la vidéo</target>
2128 <context-group name="null"> 2520 <context-group name="null">
2129 <context context-type="linenumber">15</context> 2521 <context context-type="linenumber">16</context>
2130 </context-group> 2522 </context-group>
2131 </trans-unit> 2523 </trans-unit>
2132 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2524 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2133 <source>Danger zone</source> 2525 <source>Danger zone</source>
2134 <target>Zone dangereuse</target> 2526 <target>Zone dangereuse</target>
2135 <context-group name="null"> 2527 <context-group name="null">
2136 <context context-type="linenumber">18</context> 2528 <context context-type="linenumber">19</context>
2137 </context-group> 2529 </context-group>
2138 </trans-unit> 2530 </trans-unit>
2139 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2531 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2161,13 +2553,6 @@ Cochez cette case, sauvegardez la configuration et testez avec l'URL d'une vidé
2161 <context context-type="linenumber">35</context> 2553 <context context-type="linenumber">35</context>
2162 </context-group> 2554 </context-group>
2163 </trans-unit> 2555 </trans-unit>
2164 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2165 <source>Submit</source>
2166 <target>Envoyer</target>
2167 <context-group name="null">
2168 <context context-type="linenumber">24</context>
2169 </context-group>
2170 </trans-unit>
2171 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2556 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2172 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2557 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2173 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target> 2558 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
@@ -2327,6 +2712,55 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2327 <context context-type="linenumber">47</context> 2712 <context context-type="linenumber">47</context>
2328 </context-group> 2713 </context-group>
2329 </trans-unit> 2714 </trans-unit>
2715 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2716 <source>Muted instances</source>
2717 <target>Instances muettes</target>
2718 <context-group name="null">
2719 <context context-type="linenumber">2</context>
2720 </context-group>
2721 </trans-unit>
2722 <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
2723 <source>History enabled</source>
2724 <target>Historique activé</target>
2725 <context-group name="null">
2726 <context context-type="linenumber">4</context>
2727 </context-group>
2728 </trans-unit>
2729 <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
2730 <source>Delete history</source>
2731 <target>Supprimer l'historique</target>
2732 <context-group name="null">
2733 <context context-type="linenumber">8</context>
2734 </context-group>
2735 </trans-unit>
2736 <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
2737 <source>You don't have videos history yet.</source>
2738 <target>Vous n'avez pas d'historique de vidéos pour l'instant.</target>
2739 <context-group name="null">
2740 <context context-type="linenumber">13</context>
2741 </context-group>
2742 </trans-unit>
2743 <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
2744 <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2745 <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
2746 <context-group name="null">
2747 <context context-type="linenumber">22</context>
2748 </context-group>
2749 </trans-unit>
2750 <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
2751 <source>Notification preferences</source>
2752 <target>Préférences de notification</target>
2753 <context-group name="null">
2754 <context context-type="linenumber">2</context>
2755 </context-group>
2756 </trans-unit>
2757 <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
2758 <source>Mark all as read</source>
2759 <target>Tout marqué comme lu</target>
2760 <context-group name="null">
2761 <context context-type="linenumber">4</context>
2762 </context-group>
2763 </trans-unit>
2330 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2764 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2331 <source>Change password</source> 2765 <source>Change password</source>
2332 <target>Changer le mot de passe</target> 2766 <target>Changer le mot de passe</target>
@@ -2334,6 +2768,13 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2334 <context context-type="linenumber">30</context> 2768 <context context-type="linenumber">30</context>
2335 </context-group> 2769 </context-group>
2336 </trans-unit> 2770 </trans-unit>
2771 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2772 <source>Current password</source>
2773 <target>Mot de passe actuel</target>
2774 <context-group name="null">
2775 <context context-type="linenumber">7</context>
2776 </context-group>
2777 </trans-unit>
2337 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2778 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2338 <source>New password</source> 2779 <source>New password</source>
2339 <target>Nouveau mot de passe</target> 2780 <target>Nouveau mot de passe</target>
@@ -2355,18 +2796,25 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2355 <context context-type="linenumber">3</context> 2796 <context context-type="linenumber">3</context>
2356 </context-group> 2797 </context-group>
2357 </trans-unit> 2798 </trans-unit>
2799 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2800 <source>Use WebTorrent to exchange parts of the video with others</source>
2801 <target>Utilise WebTorrent pour échanger des bouts de vidéo avec les autres.</target>
2802 <context-group name="null">
2803 <context context-type="linenumber">21</context>
2804 </context-group>
2805 </trans-unit>
2358 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2806 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2359 <source>Automatically plays video</source> 2807 <source>Automatically plays video</source>
2360 <target>Lire automatiquement les vidéos</target> 2808 <target>Lire automatiquement les vidéos</target>
2361 <context-group name="null"> 2809 <context-group name="null">
2362 <context context-type="linenumber">20</context> 2810 <context context-type="linenumber">28</context>
2363 </context-group> 2811 </context-group>
2364 </trans-unit> 2812 </trans-unit>
2365 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2813 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2366 <source>Save</source> 2814 <source>Save</source>
2367 <target>Enregistrer</target> 2815 <target>Enregistrer</target>
2368 <context-group name="null"> 2816 <context-group name="null">
2369 <context context-type="linenumber">23</context> 2817 <context context-type="linenumber">32</context>
2370 </context-group> 2818 </context-group>
2371 </trans-unit> 2819 </trans-unit>
2372 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2820 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2397,6 +2845,13 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2397 <context context-type="linenumber">18</context> 2845 <context context-type="linenumber">18</context>
2398 </context-group> 2846 </context-group>
2399 </trans-unit> 2847 </trans-unit>
2848 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2849 <source>Once you delete your account, there is no going back. Please be certain.</source>
2850 <target>Une fois votre compte supprimé vous ne pourrez pas revenir en arrière. Soyez sûr de ce que vous faites.</target>
2851 <context-group name="null">
2852 <context context-type="linenumber">2</context>
2853 </context-group>
2854 </trans-unit>
2400 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2855 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2401 <source>Delete your account</source> 2856 <source>Delete your account</source>
2402 <target>Supprimer votre compte</target> 2857 <target>Supprimer votre compte</target>
@@ -2404,6 +2859,20 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2404 <context context-type="linenumber">4</context> 2859 <context context-type="linenumber">4</context>
2405 </context-group> 2860 </context-group>
2406 </trans-unit> 2861 </trans-unit>
2862 <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
2863 <source>Activities</source>
2864 <target>Activités</target>
2865 <context-group name="null">
2866 <context context-type="linenumber">2</context>
2867 </context-group>
2868 </trans-unit>
2869 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2870 <source>Web</source>
2871 <target>Web</target>
2872 <context-group name="null">
2873 <context context-type="linenumber">3</context>
2874 </context-group>
2875 </trans-unit>
2407 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2876 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
2408 <source> 2877 <source>
2409 Sorry, but we couldn't find the page you were looking for. 2878 Sorry, but we couldn't find the page you were looking for.
@@ -2512,15 +2981,22 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2512 <context context-type="linenumber">159</context> 2981 <context context-type="linenumber">159</context>
2513 </context-group> 2982 </context-group>
2514 </trans-unit> 2983 </trans-unit>
2984 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2985 <source>Sorry, but something went wrong</source>
2986 <target>Désolé, mais quelque chose s'est mal passé</target>
2987 <context-group name="null">
2988 <context context-type="linenumber">49</context>
2989 </context-group>
2990 </trans-unit>
2515 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2991 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2516 <source> 2992 <source>
2517 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2993 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
2518</source> 2994</source>
2519 <target> 2995 <target>
2520 Félicitation, la vidéo : <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> va être importée. Vous pouvez déjà ajouter les informations relatives à celle ci. 2996 Félicitations, la vidéo : <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> va être importée. Vous pouvez déjà ajouter les informations relatives à celle-ci.
2521</target> 2997</target>
2522 <context-group name="null"> 2998 <context-group name="null">
2523 <context context-type="linenumber">40</context> 2999 <context context-type="linenumber">46</context>
2524 </context-group> 3000 </context-group>
2525 </trans-unit> 3001 </trans-unit>
2526 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 3002 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2548,14 +3024,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2548 <source>Publish will be available when upload is finished</source> 3024 <source>Publish will be available when upload is finished</source>
2549 <target>Vous pourrez publier cette vidéo lorsque l'envoi sera terminé</target> 3025 <target>Vous pourrez publier cette vidéo lorsque l'envoi sera terminé</target>
2550 <context-group name="null"> 3026 <context-group name="null">
2551 <context context-type="linenumber">48</context> 3027 <context context-type="linenumber">58</context>
2552 </context-group> 3028 </context-group>
2553 </trans-unit> 3029 </trans-unit>
2554 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 3030 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2555 <source>Publish</source> 3031 <source>Publish</source>
2556 <target>Publier</target> 3032 <target>Publier</target>
2557 <context-group name="null"> 3033 <context-group name="null">
2558 <context context-type="linenumber">55</context> 3034 <context context-type="linenumber">65</context>
2559 </context-group> 3035 </context-group>
2560 </trans-unit> 3036 </trans-unit>
2561 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 3037 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2565,6 +3041,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2565 <context context-type="linenumber">6</context> 3041 <context context-type="linenumber">6</context>
2566 </context-group> 3042 </context-group>
2567 </trans-unit> 3043 </trans-unit>
3044 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
3045 <source>Or</source>
3046 <target>Ou</target>
3047 <context-group name="null">
3048 <context context-type="linenumber">11</context>
3049 </context-group>
3050 </trans-unit>
2568 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 3051 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2569 <source>Paste magnet URI</source> 3052 <source>Paste magnet URI</source>
2570 <target>Copier l'URL magnet</target> 3053 <target>Copier l'URL magnet</target>
@@ -2585,9 +3068,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2585 Congratulations, the video will be imported with BitTorrent! You can already add information about this video. 3068 Congratulations, the video will be imported with BitTorrent! You can already add information about this video.
2586</source> 3069</source>
2587 <target> 3070 <target>
2588 Félicitation, la vidéo va être importée avec BitTorrent ! Vous pouvez déjà ajouter les informations relatives à celle ci.</target> 3071 Félicitations, la vidéo va être importée avec BitTorrent ! Vous pouvez déjà ajouter les informations relatives à celle-ci.</target>
2589 <context-group name="null"> 3072 <context-group name="null">
2590 <context context-type="linenumber">48</context> 3073 <context context-type="linenumber">53</context>
2591 </context-group> 3074 </context-group>
2592 </trans-unit> 3075 </trans-unit>
2593 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 3076 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2673,11 +3156,25 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2673 </trans-unit> 3156 </trans-unit>
2674 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851"> 3157 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2675 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source> 3158 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2676 <target>Les étiquettes peuvent être utilisées pour suggérer des recommendations plus pertinentes.&lt;/br&gt;Appuyez sur Entrée pour ajouter une nouvelle étiquette.</target> 3159 <target>Les étiquettes peuvent être utilisées pour suggérer des recommandations plus pertinentes.&lt;/br&gt;Appuyez sur Entrée pour ajouter une nouvelle étiquette.</target>
2677 <context-group name="null"> 3160 <context-group name="null">
2678 <context context-type="linenumber">18</context> 3161 <context context-type="linenumber">18</context>
2679 </context-group> 3162 </context-group>
2680 </trans-unit> 3163 </trans-unit>
3164 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
3165 <source>+ Tag</source>
3166 <target>+ Tag</target>
3167 <context-group name="null">
3168 <context context-type="linenumber">21</context>
3169 </context-group>
3170 </trans-unit>
3171 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
3172 <source>Enter a new tag</source>
3173 <target>Entrez un nouveau tag</target>
3174 <context-group name="null">
3175 <context context-type="linenumber">21</context>
3176 </context-group>
3177 </trans-unit>
2681 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 3178 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2682 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 3179 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2683 <target>Les descriptions des vidéos sont tronquées par défaut et requièrent une action manuelle pour être pleinement affichées.</target> 3180 <target>Les descriptions des vidéos sont tronquées par défaut et requièrent une action manuelle pour être pleinement affichées.</target>
@@ -2717,14 +3214,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2717 <source>Wait transcoding before publishing the video</source> 3214 <source>Wait transcoding before publishing the video</source>
2718 <target>Attendre l'encodage avant de publier la vidéo</target> 3215 <target>Attendre l'encodage avant de publier la vidéo</target>
2719 <context-group name="null"> 3216 <context-group name="null">
2720 <context context-type="linenumber">130</context> 3217 <context context-type="linenumber">131</context>
2721 </context-group> 3218 </context-group>
2722 </trans-unit> 3219 </trans-unit>
2723 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 3220 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2724 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 3221 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2725 <target>Si vous décidez de ne pas attendre la fin du traitement avant la publication de la vidéo, elle pourrait bien être injouable.</target> 3222 <target>Si vous décidez de ne pas attendre la fin du traitement avant la publication de la vidéo, elle pourrait bien être injouable.</target>
2726 <context-group name="null"> 3223 <context-group name="null">
2727 <context context-type="linenumber">131</context> 3224 <context context-type="linenumber">132</context>
2728 </context-group> 3225 </context-group>
2729 </trans-unit> 3226 </trans-unit>
2730 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 3227 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2738,49 +3235,49 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2738 <source>Add another caption</source> 3235 <source>Add another caption</source>
2739 <target>Ajouter un nouveau sous-titre</target> 3236 <target>Ajouter un nouveau sous-titre</target>
2740 <context-group name="null"> 3237 <context-group name="null">
2741 <context context-type="linenumber">146</context> 3238 <context context-type="linenumber">147</context>
2742 </context-group> 3239 </context-group>
2743 </trans-unit> 3240 </trans-unit>
2744 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 3241 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2745 <source>See the subtitle file</source> 3242 <source>See the subtitle file</source>
2746 <target>Voir le fichier de sous-titres</target> 3243 <target>Voir le fichier de sous-titres</target>
2747 <context-group name="null"> 3244 <context-group name="null">
2748 <context context-type="linenumber">155</context> 3245 <context context-type="linenumber">156</context>
2749 </context-group> 3246 </context-group>
2750 </trans-unit> 3247 </trans-unit>
2751 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 3248 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2752 <source>Already uploaded ✔</source> 3249 <source>Already uploaded ✔</source>
2753 <target>Déjà téléversé ✔</target> 3250 <target>Déjà téléversé ✔</target>
2754 <context-group name="null"> 3251 <context-group name="null">
2755 <context context-type="linenumber">159</context> 3252 <context context-type="linenumber">160</context>
2756 </context-group> 3253 </context-group>
2757 </trans-unit> 3254 </trans-unit>
2758 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 3255 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2759 <source>Will be created on update</source> 3256 <source>Will be created on update</source>
2760 <target>Sera créé après la mise à jour</target> 3257 <target>Sera créé après la mise à jour</target>
2761 <context-group name="null"> 3258 <context-group name="null">
2762 <context context-type="linenumber">167</context> 3259 <context context-type="linenumber">168</context>
2763 </context-group> 3260 </context-group>
2764 </trans-unit> 3261 </trans-unit>
2765 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 3262 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2766 <source>Cancel create</source> 3263 <source>Cancel create</source>
2767 <target>Annuler la création</target> 3264 <target>Annuler la création</target>
2768 <context-group name="null"> 3265 <context-group name="null">
2769 <context context-type="linenumber">169</context> 3266 <context context-type="linenumber">170</context>
2770 </context-group> 3267 </context-group>
2771 </trans-unit> 3268 </trans-unit>
2772 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 3269 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2773 <source>Will be deleted on update</source> 3270 <source>Will be deleted on update</source>
2774 <target>Sera supprimé après la mise à jour</target> 3271 <target>Sera supprimé après la mise à jour</target>
2775 <context-group name="null"> 3272 <context-group name="null">
2776 <context context-type="linenumber">175</context> 3273 <context context-type="linenumber">176</context>
2777 </context-group> 3274 </context-group>
2778 </trans-unit> 3275 </trans-unit>
2779 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3276 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2780 <source>Cancel deletion</source> 3277 <source>Cancel deletion</source>
2781 <target>Annuler la suppression</target> 3278 <target>Annuler la suppression</target>
2782 <context-group name="null"> 3279 <context-group name="null">
2783 <context context-type="linenumber">177</context> 3280 <context context-type="linenumber">178</context>
2784 </context-group> 3281 </context-group>
2785 </trans-unit> 3282 </trans-unit>
2786 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 3283 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2791,28 +3288,28 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2791 Pas de sous-titres pour le moment. 3288 Pas de sous-titres pour le moment.
2792 </target> 3289 </target>
2793 <context-group name="null"> 3290 <context-group name="null">
2794 <context context-type="linenumber">182</context> 3291 <context context-type="linenumber">183</context>
2795 </context-group> 3292 </context-group>
2796 </trans-unit> 3293 </trans-unit>
2797 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3294 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2798 <source>Captions</source> 3295 <source>Captions</source>
2799 <target>Sous-titres</target> 3296 <target>Sous-titres</target>
2800 <context-group name="null"> 3297 <context-group name="null">
2801 <context context-type="linenumber">139</context> 3298 <context context-type="linenumber">140</context>
2802 </context-group> 3299 </context-group>
2803 </trans-unit> 3300 </trans-unit>
2804 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3301 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2805 <source>Upload thumbnail</source> 3302 <source>Upload thumbnail</source>
2806 <target>Téléverser une vignette</target> 3303 <target>Téléverser une vignette</target>
2807 <context-group name="null"> 3304 <context-group name="null">
2808 <context context-type="linenumber">195</context> 3305 <context context-type="linenumber">196</context>
2809 </context-group> 3306 </context-group>
2810 </trans-unit> 3307 </trans-unit>
2811 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3308 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2812 <source>Upload preview</source> 3309 <source>Upload preview</source>
2813 <target>Téléverser un aperçu</target> 3310 <target>Téléverser un aperçu</target>
2814 <context-group name="null"> 3311 <context-group name="null">
2815 <context context-type="linenumber">202</context> 3312 <context context-type="linenumber">203</context>
2816 </context-group> 3313 </context-group>
2817 </trans-unit> 3314 </trans-unit>
2818 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3315 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2826,14 +3323,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2826 <source>Short text to tell people how they can support you (membership platform...).</source> 3323 <source>Short text to tell people how they can support you (membership platform...).</source>
2827 <target>Courte description des moyens qu'ont les utilisateurs de vous soutenir (financement participatif, etc.).</target> 3324 <target>Courte description des moyens qu'ont les utilisateurs de vous soutenir (financement participatif, etc.).</target>
2828 <context-group name="null"> 3325 <context-group name="null">
2829 <context context-type="linenumber">209</context> 3326 <context context-type="linenumber">210</context>
2830 </context-group> 3327 </context-group>
2831 </trans-unit> 3328 </trans-unit>
2832 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3329 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2833 <source>Advanced settings</source> 3330 <source>Advanced settings</source>
2834 <target>Paramétrage avancé</target> 3331 <target>Paramétrage avancé</target>
2835 <context-group name="null"> 3332 <context-group name="null">
2836 <context context-type="linenumber">190</context> 3333 <context context-type="linenumber">191</context>
2837 </context-group> 3334 </context-group>
2838 </trans-unit> 3335 </trans-unit>
2839 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3336 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2900,15 +3397,17 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2900 <context context-type="linenumber">3</context> 3397 <context context-type="linenumber">3</context>
2901 </context-group> 3398 </context-group>
2902 </trans-unit> 3399 </trans-unit>
2903 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb"> 3400 <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
2904 <source> 3401 <source>
2905 Cancel 3402 Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
2906 </source> 3403 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> It will be forwarded to origin instance <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/> too.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
3404 </source>
2907 <target> 3405 <target>
2908 Annuler 3406 Votre signalement sera envoyé aux modérateurs de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
2909 </target> 3407 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> Il sera également transmis à l'instance d'origine <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/><x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
3408 </target>
2910 <context-group name="null"> 3409 <context-group name="null">
2911 <context context-type="linenumber">19</context> 3410 <context context-type="linenumber">9</context>
2912 </context-group> 3411 </context-group>
2913 </trans-unit> 3412 </trans-unit>
2914 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3413 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
@@ -2962,8 +3461,7 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2962 The video is being imported, it will be available when the import is finished. 3461 The video is being imported, it will be available when the import is finished.
2963 </source> 3462 </source>
2964 <target> 3463 <target>
2965 La vidéo est en cours d'importation, elle sera disponible quand l'importation sera fini. 3464 La vidéo est en cours d'importation, elle sera disponible quand l'importation sera finie.</target>
2966 </target>
2967 <context-group name="null"> 3465 <context-group name="null">
2968 <context context-type="linenumber">11</context> 3466 <context context-type="linenumber">11</context>
2969 </context-group> 3467 </context-group>
@@ -3110,13 +3608,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3110 <context context-type="linenumber">134</context> 3608 <context context-type="linenumber">134</context>
3111 </context-group> 3609 </context-group>
3112 </trans-unit> 3610 </trans-unit>
3113 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
3114 <source>Go to the account page</source>
3115 <target>Accéder au profil public de l'utilisateur</target>
3116 <context-group name="null">
3117 <context context-type="linenumber">133</context>
3118 </context-group>
3119 </trans-unit>
3120 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3611 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3121 <source>Show more</source> 3612 <source>Show more</source>
3122 <target>Voir plus</target> 3613 <target>Voir plus</target>
@@ -3196,25 +3687,18 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3196 <context context-type="linenumber">3</context> 3687 <context context-type="linenumber">3</context>
3197 </context-group> 3688 </context-group>
3198 </trans-unit> 3689 </trans-unit>
3199 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3200 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3201 <target>Vous pouvez commenter soit sur la page de votre instance où cette vidéo est fédérée avec votre compte PeerTube, soit via n'importe quelle instance Fediverse compatible avec ActivityPub. Par exemple, avec Mastodon ou Pleroma vous pouvez taper dans le champ de recherche : &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; et retrouver la vidéo. Les commentaires directs sont en cours de développement, cela peut être suivi via cette issue &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
3202 <context-group name="null">
3203 <context context-type="linenumber">8</context>
3204 </context-group>
3205 </trans-unit>
3206 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3690 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3207 <source>No comments.</source> 3691 <source>No comments.</source>
3208 <target>Aucun commentaire.</target> 3692 <target>Aucun commentaire.</target>
3209 <context-group name="null"> 3693 <context-group name="null">
3210 <context context-type="linenumber">18</context> 3694 <context context-type="linenumber">17</context>
3211 </context-group> 3695 </context-group>
3212 </trans-unit> 3696 </trans-unit>
3213 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3697 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3214 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3698 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3215 <target>Voir les <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> réponses</target> 3699 <target>Voir les <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> réponses</target>
3216 <context-group name="null"> 3700 <context-group name="null">
3217 <context context-type="linenumber">55</context> 3701 <context context-type="linenumber">54</context>
3218 </context-group> 3702 </context-group>
3219 </trans-unit> 3703 </trans-unit>
3220 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3704 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3225,7 +3709,7 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3225 Les commentaires sont désactivés. 3709 Les commentaires sont désactivés.
3226 </target> 3710 </target>
3227 <context-group name="null"> 3711 <context-group name="null">
3228 <context context-type="linenumber">64</context> 3712 <context context-type="linenumber">63</context>
3229 </context-group> 3713 </context-group>
3230 </trans-unit> 3714 </trans-unit>
3231 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3715 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3271,6 +3755,32 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3271 <context context-type="linenumber">35</context> 3755 <context context-type="linenumber">35</context>
3272 </context-group> 3756 </context-group>
3273 </trans-unit> 3757 </trans-unit>
3758 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3759 <source>
3760 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3761 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3762 from within the software's interface.
3763 </source>
3764 <target>
3765 Sinon, vous pouvez commenter en utilisant un compte sur n'importe quelle instance compatible avec le protocole ActivityPub.
3766 Sur la plupart des plateformes, vous pouvez trouver la vidéo en tapant son adresse dans la barre de recherche et en la commentant.
3767 depuis l'interface du logiciel.
3768 </target>
3769 <context-group name="null">
3770 <context context-type="linenumber">36</context>
3771 </context-group>
3772 </trans-unit>
3773 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3774 <source>
3775 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3776 </source>
3777 <target>
3778 Si vous avez un compte sur Mastodon ou Pleroma, vous pouvez directement l'ouvrir dans leur interface :
3779 </target>
3780 <context-group name="null">
3781 <context context-type="linenumber">41</context>
3782 </context-group>
3783 </trans-unit>
3274 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3784 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3275 <source>Highlighted comment</source> 3785 <source>Highlighted comment</source>
3276 <target>Commentaire mis en exergue</target> 3786 <target>Commentaire mis en exergue</target>
@@ -3285,9 +3795,23 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3285 <context context-type="linenumber">14</context> 3795 <context context-type="linenumber">14</context>
3286 </context-group> 3796 </context-group>
3287 </trans-unit> 3797 </trans-unit>
3288 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08"> 3798 <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
3289 <source>Error getting about from server</source> 3799 <source>Cannot get about information from server</source>
3290 <target>Erreur lors de la récupération des informations 'à propos' du serveur</target> 3800 <target>Impossible d'obtenir la description du serveur</target>
3801 <context-group name="null">
3802 <context context-type="linenumber">1</context>
3803 </context-group>
3804 </trans-unit>
3805 <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
3806 <source>Your message has been sent.</source>
3807 <target>Votre message a été envoyé</target>
3808 <context-group name="null">
3809 <context context-type="linenumber">1</context>
3810 </context-group>
3811 </trans-unit>
3812 <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
3813 <source>You already sent this form recently</source>
3814 <target>Vous avez déjà rempli ce formulaire récemment</target>
3291 <context-group name="null"> 3815 <context-group name="null">
3292 <context context-type="linenumber">1</context> 3816 <context context-type="linenumber">1</context>
3293 </context-group> 3817 </context-group>
@@ -3355,55 +3879,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3355 <context context-type="linenumber">1</context> 3879 <context context-type="linenumber">1</context>
3356 </context-group> 3880 </context-group>
3357 </trans-unit> 3881 </trans-unit>
3358 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3359 <source>Error</source>
3360 <target>Erreur</target>
3361 <context-group name="null">
3362 <context context-type="linenumber">1</context>
3363 </context-group>
3364 </trans-unit>
3365 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3366 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3367 <target>Vous avez défini du <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
3368 <context-group name="null">
3369 <context context-type="linenumber">1</context>
3370 </context-group>
3371 </trans-unit>
3372 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
3373 <source>This could lead to security issues or bugs if you do not understand it. </source>
3374 <target>Cela pourrait mener à des problèmes de sécurité ou à des bogues ; soyez sûr de comprendre ce que vous faites.</target>
3375 <context-group name="null">
3376 <context context-type="linenumber">1</context>
3377 </context-group>
3378 </trans-unit>
3379 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
3380 <source>Are you sure you want to update the configuration?</source>
3381 <target>Êtes-vous sûr de vouloir modifier la configuration ?</target>
3382 <context-group name="null">
3383 <context context-type="linenumber">1</context>
3384 </context-group>
3385 </trans-unit>
3386 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
3387 <source>Please type</source>
3388 <target>Merci de taper</target>
3389 <context-group name="null">
3390 <context context-type="linenumber">1</context>
3391 </context-group>
3392 </trans-unit>
3393 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
3394 <source>to confirm.</source>
3395 <target>pour confirmer.</target>
3396 <context-group name="null">
3397 <context context-type="linenumber">1</context>
3398 </context-group>
3399 </trans-unit>
3400 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3401 <source>Success</source>
3402 <target>Réussite</target>
3403 <context-group name="null">
3404 <context context-type="linenumber">1</context>
3405 </context-group>
3406 </trans-unit>
3407 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3882 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3408 <source>Configuration updated.</source> 3883 <source>Configuration updated.</source>
3409 <target>La configuration a été mise à jour.</target> 3884 <target>La configuration a été mise à jour.</target>
@@ -3565,6 +4040,20 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3565 <context context-type="linenumber">1</context> 4040 <context context-type="linenumber">1</context>
3566 </context-group> 4041 </context-group>
3567 </trans-unit> 4042 </trans-unit>
4043 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
4044 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
4045 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé par votre instance.</target>
4046 <context-group name="null">
4047 <context context-type="linenumber">1</context>
4048 </context-group>
4049 </trans-unit>
4050 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
4051 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
4052 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> réactivé par votre instance.</target>
4053 <context-group name="null">
4054 <context context-type="linenumber">1</context>
4055 </context-group>
4056 </trans-unit>
3568 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 4057 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3569 <source>Comment updated.</source> 4058 <source>Comment updated.</source>
3570 <target>Commentaire mis à jour.</target> 4059 <target>Commentaire mis à jour.</target>
@@ -3572,6 +4061,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3572 <context context-type="linenumber">1</context> 4061 <context context-type="linenumber">1</context>
3573 </context-group> 4062 </context-group>
3574 </trans-unit> 4063 </trans-unit>
4064 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
4065 <source>Delete this report</source>
4066 <target>Supprimer ce rapport</target>
4067 <context-group name="null">
4068 <context context-type="linenumber">1</context>
4069 </context-group>
4070 </trans-unit>
3575 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 4071 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3576 <source>Update moderation comment</source> 4072 <source>Update moderation comment</source>
3577 <target>Éditer le commentaire de modération</target> 4073 <target>Éditer le commentaire de modération</target>
@@ -3593,9 +4089,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3593 <context context-type="linenumber">1</context> 4089 <context context-type="linenumber">1</context>
3594 </context-group> 4090 </context-group>
3595 </trans-unit> 4091 </trans-unit>
3596 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 4092 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3597 <source>Do you really want to delete this abuse?</source> 4093 <source>Do you really want to delete this abuse report?</source>
3598 <target>Voulez-vous vraiment supprimer ce rapport ?</target> 4094 <target>Voulez-vous vraiment supprimer ce rapport d'abus ?</target>
3599 <context-group name="null"> 4095 <context-group name="null">
3600 <context context-type="linenumber">1</context> 4096 <context context-type="linenumber">1</context>
3601 </context-group> 4097 </context-group>
@@ -3642,23 +4138,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3642 <context context-type="linenumber">1</context> 4138 <context context-type="linenumber">1</context>
3643 </context-group> 4139 </context-group>
3644 </trans-unit> 4140 </trans-unit>
3645 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 4141 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3646 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 4142 <source>Unban</source>
3647 <target>Utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> banni.</target> 4143 <target>Rétablir</target>
3648 <context-group name="null">
3649 <context context-type="linenumber">1</context>
3650 </context-group>
3651 </trans-unit>
3652 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3653 <source>Ban</source>
3654 <target>Bannir</target>
3655 <context-group name="null"> 4144 <context-group name="null">
3656 <context context-type="linenumber">1</context> 4145 <context context-type="linenumber">1</context>
3657 </context-group> 4146 </context-group>
3658 </trans-unit> 4147 </trans-unit>
3659 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 4148 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3660 <source>Unban</source> 4149 <source>Set Email as Verified</source>
3661 <target>Rétablir</target> 4150 <target>Définir l'adresse mail comme vérifiée</target>
3662 <context-group name="null"> 4151 <context-group name="null">
3663 <context context-type="linenumber">1</context> 4152 <context context-type="linenumber">1</context>
3664 </context-group> 4153 </context-group>
@@ -3670,16 +4159,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3670 <context context-type="linenumber">1</context> 4159 <context context-type="linenumber">1</context>
3671 </context-group> 4160 </context-group>
3672 </trans-unit> 4161 </trans-unit>
3673 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 4162 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3674 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 4163 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3675 <target>Voulez-vous réellement rétablir <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target> 4164 <target>Voulez-vous vraiment rétablir <x id="INTERPOLATION" equiv-text="{{num}}"/> utilisateur·ices ?</target>
3676 <context-group name="null"> 4165 <context-group name="null">
3677 <context context-type="linenumber">1</context> 4166 <context context-type="linenumber">1</context>
3678 </context-group> 4167 </context-group>
3679 </trans-unit> 4168 </trans-unit>
3680 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 4169 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3681 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 4170 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3682 <target>L'utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> est rétabli.</target> 4171 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilisateur·ices rétablis.</target>
3683 <context-group name="null"> 4172 <context-group name="null">
3684 <context context-type="linenumber">1</context> 4173 <context context-type="linenumber">1</context>
3685 </context-group> 4174 </context-group>
@@ -3691,16 +4180,79 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3691 <context context-type="linenumber">1</context> 4180 <context context-type="linenumber">1</context>
3692 </context-group> 4181 </context-group>
3693 </trans-unit> 4182 </trans-unit>
3694 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603"> 4183 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3695 <source>If you remove this user, you will not be able to create another with the same username!</source> 4184 <source>If you remove these users, you will not be able to create others with the same username!</source>
3696 <target>Si vous supprimez ce compte, vous ne pourrez plus en créer de nouveau avec le même nom !</target> 4185 <target>Si vous supprimez ces utilisateur·ices, vous ne pourrez plus en créer de nouveau avec le même nom !</target>
3697 <context-group name="null"> 4186 <context-group name="null">
3698 <context context-type="linenumber">1</context> 4187 <context context-type="linenumber">1</context>
3699 </context-group> 4188 </context-group>
3700 </trans-unit> 4189 </trans-unit>
3701 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 4190 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3702 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 4191 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3703 <target>Utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> supprimé.</target> 4192 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilisateur·ices supprimé·e·s.</target>
4193 <context-group name="null">
4194 <context context-type="linenumber">1</context>
4195 </context-group>
4196 </trans-unit>
4197 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
4198 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
4199 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> adresses mail d'utilisateurs ont été vérifiées.</target>
4200 <context-group name="null">
4201 <context context-type="linenumber">1</context>
4202 </context-group>
4203 </trans-unit>
4204 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
4205 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
4206 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé.</target>
4207 <context-group name="null">
4208 <context context-type="linenumber">1</context>
4209 </context-group>
4210 </trans-unit>
4211 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
4212 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
4213 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> réactivée.</target>
4214 <context-group name="null">
4215 <context context-type="linenumber">1</context>
4216 </context-group>
4217 </trans-unit>
4218 <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
4219 <source>My videos history</source>
4220 <target>Mon historique de vidéos</target>
4221 <context-group name="null">
4222 <context context-type="linenumber">1</context>
4223 </context-group>
4224 </trans-unit>
4225 <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
4226 <source>Videos history is enabled</source>
4227 <target>Historique de vidéos activé</target>
4228 <context-group name="null">
4229 <context context-type="linenumber">1</context>
4230 </context-group>
4231 </trans-unit>
4232 <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
4233 <source>Videos history is disabled</source>
4234 <target>Historique de vidéos désactivé</target>
4235 <context-group name="null">
4236 <context context-type="linenumber">1</context>
4237 </context-group>
4238 </trans-unit>
4239 <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
4240 <source>Delete videos history</source>
4241 <target>Supprimer l'historique de vidéos</target>
4242 <context-group name="null">
4243 <context context-type="linenumber">1</context>
4244 </context-group>
4245 </trans-unit>
4246 <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
4247 <source>Are you sure you want to delete all your videos history?</source>
4248 <target>Êtes vous sur de vouloir supprimer toutes les vidéos de votre historique ?</target>
4249 <context-group name="null">
4250 <context context-type="linenumber">1</context>
4251 </context-group>
4252 </trans-unit>
4253 <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
4254 <source>Videos history deleted</source>
4255 <target>Historique de vidéos supprimé</target>
3704 <context-group name="null"> 4256 <context-group name="null">
3705 <context context-type="linenumber">1</context> 4257 <context context-type="linenumber">1</context>
3706 </context-group> 4258 </context-group>
@@ -3719,6 +4271,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3719 <context context-type="linenumber">1</context> 4271 <context context-type="linenumber">1</context>
3720 </context-group> 4272 </context-group>
3721 </trans-unit> 4273 </trans-unit>
4274 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
4275 <source>You current password is invalid.</source>
4276 <target>Votre mot de passe actuel est invalide.</target>
4277 <context-group name="null">
4278 <context context-type="linenumber">1</context>
4279 </context-group>
4280 </trans-unit>
3722 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 4281 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3723 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 4282 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3724 <target>Êtes-vous sûr de vouloir supprimer votre compte ? Cela supprimera toutes vos données, incluant vos chaînes, vidéos etc.</target> 4283 <target>Êtes-vous sûr de vouloir supprimer votre compte ? Cela supprimera toutes vos données, incluant vos chaînes, vidéos etc.</target>
@@ -3747,6 +4306,76 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3747 <context context-type="linenumber">1</context> 4306 <context context-type="linenumber">1</context>
3748 </context-group> 4307 </context-group>
3749 </trans-unit> 4308 </trans-unit>
4309 <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
4310 <source>New video from your subscriptions</source>
4311 <target>Nouvelle vidéo depuis vos souscriptions</target>
4312 <context-group name="null">
4313 <context context-type="linenumber">1</context>
4314 </context-group>
4315 </trans-unit>
4316 <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
4317 <source>New comment on your video</source>
4318 <target>Nouveau commentaire sur votre vidéo</target>
4319 <context-group name="null">
4320 <context context-type="linenumber">1</context>
4321 </context-group>
4322 </trans-unit>
4323 <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
4324 <source>New video abuse on local video</source>
4325 <target>Nouveau signalement sur une vidéo locale</target>
4326 <context-group name="null">
4327 <context context-type="linenumber">1</context>
4328 </context-group>
4329 </trans-unit>
4330 <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
4331 <source>One of your video is blacklisted/unblacklisted</source>
4332 <target>Une de vos vidéos a été bloquée/débloquée</target>
4333 <context-group name="null">
4334 <context context-type="linenumber">1</context>
4335 </context-group>
4336 </trans-unit>
4337 <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
4338 <source>Video published (after transcoding/scheduled update)</source>
4339 <target>Vidéo publiée (après transcodage / mise à jour programmée)</target>
4340 <context-group name="null">
4341 <context context-type="linenumber">1</context>
4342 </context-group>
4343 </trans-unit>
4344 <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
4345 <source>Video import finished</source>
4346 <target>Import de vidéo terminé</target>
4347 <context-group name="null">
4348 <context context-type="linenumber">1</context>
4349 </context-group>
4350 </trans-unit>
4351 <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
4352 <source>A new user registered on your instance</source>
4353 <target>Nouveau compte créé sur votre instance</target>
4354 <context-group name="null">
4355 <context context-type="linenumber">1</context>
4356 </context-group>
4357 </trans-unit>
4358 <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
4359 <source>You or your channel(s) has a new follower</source>
4360 <target>Vous (ou votre chaîne) avez un nouveau suiveur</target>
4361 <context-group name="null">
4362 <context context-type="linenumber">1</context>
4363 </context-group>
4364 </trans-unit>
4365 <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
4366 <source>Someone mentioned you in video comments</source>
4367 <target>Quelqu'un vous a mentionné dans les commentaires d'une vidéo</target>
4368 <context-group name="null">
4369 <context context-type="linenumber">1</context>
4370 </context-group>
4371 </trans-unit>
4372 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
4373 <source>Preferences saved</source>
4374 <target>Préférences sauvegardées</target>
4375 <context-group name="null">
4376 <context context-type="linenumber">1</context>
4377 </context-group>
4378 </trans-unit>
3750 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 4379 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3751 <source>Profile updated.</source> 4380 <source>Profile updated.</source>
3752 <target>Profil mis à jour.</target> 4381 <target>Profil mis à jour.</target>
@@ -3775,6 +4404,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3775 <context context-type="linenumber">1</context> 4404 <context context-type="linenumber">1</context>
3776 </context-group> 4405 </context-group>
3777 </trans-unit> 4406 </trans-unit>
4407 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
4408 <source>This name already exists on this instance.</source>
4409 <target>Ce nom existe déjà sur cette instance.</target>
4410 <context-group name="null">
4411 <context context-type="linenumber">1</context>
4412 </context-group>
4413 </trans-unit>
3778 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 4414 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3779 <source>Create</source> 4415 <source>Create</source>
3780 <target>Créer</target> 4416 <target>Créer</target>
@@ -3789,23 +4425,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3789 <context context-type="linenumber">1</context> 4425 <context context-type="linenumber">1</context>
3790 </context-group> 4426 </context-group>
3791 </trans-unit> 4427 </trans-unit>
3792 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4428 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3793 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4429 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3794 <target>Voulez-vous vraiment supprimer <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ? Ceci supprimera aussi toutes les vidéos téléversées dans cette chaîne.</target> 4430 <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target>
3795 <context-group name="null">
3796 <context context-type="linenumber">1</context>
3797 </context-group>
3798 </trans-unit>
3799 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3800 <source>Please type the name of the video channel to confirm</source>
3801 <target>Merci de confirmer le nom de la chaîne</target>
3802 <context-group name="null"> 4431 <context-group name="null">
3803 <context context-type="linenumber">1</context> 4432 <context context-type="linenumber">1</context>
3804 </context-group> 4433 </context-group>
3805 </trans-unit> 4434 </trans-unit>
3806 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4435 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3807 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4436 <source>My videos</source>
3808 <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target> 4437 <target>Mes vidéos</target>
3809 <context-group name="null"> 4438 <context-group name="null">
3810 <context context-type="linenumber">1</context> 4439 <context context-type="linenumber">1</context>
3811 </context-group> 4440 </context-group>
@@ -3819,7 +4448,7 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3819 </trans-unit> 4448 </trans-unit>
3820 <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83"> 4449 <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83">
3821 <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source> 4450 <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source>
3822 <target><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos supprimées.</target> 4451 <target><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> vidéos supprimées.</target>
3823 <context-group name="null"> 4452 <context-group name="null">
3824 <context context-type="linenumber">1</context> 4453 <context context-type="linenumber">1</context>
3825 </context-group> 4454 </context-group>
@@ -3880,16 +4509,58 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3880 <context context-type="linenumber">1</context> 4509 <context context-type="linenumber">1</context>
3881 </context-group> 4510 </context-group>
3882 </trans-unit> 4511 </trans-unit>
3883 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 4512 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3884 <source>Channels</source> 4513 <source>My library</source>
3885 <target>Chaînes</target> 4514 <target>Ma bibliothèque</target>
4515 <context-group name="null">
4516 <context context-type="linenumber">1</context>
4517 </context-group>
4518 </trans-unit>
4519 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4520 <source>My channels</source>
4521 <target>Mes chaînes</target>
4522 <context-group name="null">
4523 <context context-type="linenumber">1</context>
4524 </context-group>
4525 </trans-unit>
4526 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4527 <source>My subscriptions</source>
4528 <target>Mes abonnements</target>
4529 <context-group name="null">
4530 <context context-type="linenumber">1</context>
4531 </context-group>
4532 </trans-unit>
4533 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4534 <source>My history</source>
4535 <target>Mon historique</target>
4536 <context-group name="null">
4537 <context context-type="linenumber">1</context>
4538 </context-group>
4539 </trans-unit>
4540 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4541 <source>Misc</source>
4542 <target>Divers</target>
4543 <context-group name="null">
4544 <context context-type="linenumber">1</context>
4545 </context-group>
4546 </trans-unit>
4547 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4548 <source>Ownership changes</source>
4549 <target>Changements de propriétaires</target>
3886 <context-group name="null"> 4550 <context-group name="null">
3887 <context context-type="linenumber">1</context> 4551 <context context-type="linenumber">1</context>
3888 </context-group> 4552 </context-group>
3889 </trans-unit> 4553 </trans-unit>
3890 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 4554 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3891 <source>Video imports</source> 4555 <source>My settings</source>
3892 <target>Importations de vidéos</target> 4556 <target>Mes paramètres</target>
4557 <context-group name="null">
4558 <context context-type="linenumber">1</context>
4559 </context-group>
4560 </trans-unit>
4561 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
4562 <source>My notifications</source>
4563 <target>Mes notifications</target>
3893 <context-group name="null"> 4564 <context-group name="null">
3894 <context context-type="linenumber">1</context> 4565 <context context-type="linenumber">1</context>
3895 </context-group> 4566 </context-group>
@@ -3908,6 +4579,97 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3908 <context context-type="linenumber">1</context> 4579 <context context-type="linenumber">1</context>
3909 </context-group> 4580 </context-group>
3910 </trans-unit> 4581 </trans-unit>
4582 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4583 <source>Subscribe to the account</source>
4584 <target>S'abonner à ce compte.</target>
4585 <context-group name="null">
4586 <context context-type="linenumber">1</context>
4587 </context-group>
4588 </trans-unit>
4589 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4590 <source>Focus the search bar</source>
4591 <target>Focus sur la barre de recherche.</target>
4592 <context-group name="null">
4593 <context context-type="linenumber">1</context>
4594 </context-group>
4595 </trans-unit>
4596 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4597 <source>Toggle the left menu</source>
4598 <target>(Dés)activer le menu de gauche.</target>
4599 <context-group name="null">
4600 <context context-type="linenumber">1</context>
4601 </context-group>
4602 </trans-unit>
4603 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4604 <source>Go to the videos overview page</source>
4605 <target>Aller sur la page de vue d'ensemble des vidéos.</target>
4606 <context-group name="null">
4607 <context context-type="linenumber">1</context>
4608 </context-group>
4609 </trans-unit>
4610 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4611 <source>Go to the trending videos page</source>
4612 <target>Aller sur la page des Tendances.</target>
4613 <context-group name="null">
4614 <context context-type="linenumber">1</context>
4615 </context-group>
4616 </trans-unit>
4617 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4618 <source>Go to the recently added videos page</source>
4619 <target>Aller sur la page des vidéos récemment ajoutées.</target>
4620 <context-group name="null">
4621 <context context-type="linenumber">1</context>
4622 </context-group>
4623 </trans-unit>
4624 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4625 <source>Go to the local videos page</source>
4626 <target>Aller sur la page des vidéos locales.</target>
4627 <context-group name="null">
4628 <context context-type="linenumber">1</context>
4629 </context-group>
4630 </trans-unit>
4631 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4632 <source>Go to the videos upload page</source>
4633 <target>Aller sur la page de téléversement de vidéo.</target>
4634 <context-group name="null">
4635 <context context-type="linenumber">1</context>
4636 </context-group>
4637 </trans-unit>
4638 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4639 <source>Toggle Dark theme</source>
4640 <target>(Dés)activer le thème sombre</target>
4641 <context-group name="null">
4642 <context context-type="linenumber">1</context>
4643 </context-group>
4644 </trans-unit>
4645 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4646 <source>Go to my subscriptions</source>
4647 <target>Aller voir mes abonnements.</target>
4648 <context-group name="null">
4649 <context context-type="linenumber">1</context>
4650 </context-group>
4651 </trans-unit>
4652 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4653 <source>Go to my videos</source>
4654 <target>Aller voir mes vidéos.</target>
4655 <context-group name="null">
4656 <context context-type="linenumber">1</context>
4657 </context-group>
4658 </trans-unit>
4659 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4660 <source>Go to my imports</source>
4661 <target>Aller voir mes importations de vidéos.</target>
4662 <context-group name="null">
4663 <context context-type="linenumber">1</context>
4664 </context-group>
4665 </trans-unit>
4666 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4667 <source>Go to my channels</source>
4668 <target>Aller voir mes chaînes.</target>
4669 <context-group name="null">
4670 <context context-type="linenumber">1</context>
4671 </context-group>
4672 </trans-unit>
3911 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4673 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3912 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4674 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3913</source> 4675</source>
@@ -3924,6 +4686,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3924 <context context-type="linenumber">1</context> 4686 <context context-type="linenumber">1</context>
3925 </context-group> 4687 </context-group>
3926 </trans-unit> 4688 </trans-unit>
4689 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4690 <source>Error</source>
4691 <target>Erreur</target>
4692 <context-group name="null">
4693 <context context-type="linenumber">1</context>
4694 </context-group>
4695 </trans-unit>
3927 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4696 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3928 <source>You need to reconnect.</source> 4697 <source>You need to reconnect.</source>
3929 <target>Vous devez vous reconnecter.</target> 4698 <target>Vous devez vous reconnecter.</target>
@@ -3945,6 +4714,20 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3945 <context context-type="linenumber">1</context> 4714 <context context-type="linenumber">1</context>
3946 </context-group> 4715 </context-group>
3947 </trans-unit> 4716 </trans-unit>
4717 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4718 <source>Info</source>
4719 <target>Info</target>
4720 <context-group name="null">
4721 <context context-type="linenumber">1</context>
4722 </context-group>
4723 </trans-unit>
4724 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4725 <source>Success</source>
4726 <target>Réussite</target>
4727 <context-group name="null">
4728 <context context-type="linenumber">1</context>
4729 </context-group>
4730 </trans-unit>
3948 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4731 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3949 <source>Incorrect username or password.</source> 4732 <source>Incorrect username or password.</source>
3950 <target>Nom d'utilisateur ou mot de passe incorrects.</target> 4733 <target>Nom d'utilisateur ou mot de passe incorrects.</target>
@@ -3961,7 +4744,7 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3961 </trans-unit> 4744 </trans-unit>
3962 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1"> 4745 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
3963 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source> 4746 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
3964 <target>Un email avec les instructions de changement de mot de passe à été envoyé à <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target> 4747 <target>Un email avec les instructions de changement de mot de passe a été envoyé à <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
3965 <context-group name="null"> 4748 <context-group name="null">
3966 <context context-type="linenumber">1</context> 4749 <context context-type="linenumber">1</context>
3967 </context-group> 4750 </context-group>
@@ -4162,58 +4945,100 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4162 <context context-type="linenumber">1</context> 4945 <context context-type="linenumber">1</context>
4163 </context-group> 4946 </context-group>
4164 </trans-unit> 4947 </trans-unit>
4165 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4948 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4166 <source>Username is required.</source> 4949 <source>Email is required.</source>
4167 <target>Le nom d'utilisateur est requis.</target> 4950 <target>Le courriel est requis.</target>
4168 <context-group name="null"> 4951 <context-group name="null">
4169 <context context-type="linenumber">1</context> 4952 <context context-type="linenumber">1</context>
4170 </context-group> 4953 </context-group>
4171 </trans-unit> 4954 </trans-unit>
4172 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5"> 4955 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4173 <source>Password is required.</source> 4956 <source>Email must be valid.</source>
4174 <target>Le mot de passe est requis.</target> 4957 <target>Le courriel doit être valide.</target>
4175 <context-group name="null"> 4958 <context-group name="null">
4176 <context context-type="linenumber">1</context> 4959 <context context-type="linenumber">1</context>
4177 </context-group> 4960 </context-group>
4178 </trans-unit> 4961 </trans-unit>
4179 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154"> 4962 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
4180 <source>Confirmation of the password is required.</source> 4963 <source>Your name is required.</source>
4181 <target>La confirmation du mot de passe est requis.</target> 4964 <target>Votre nom doit être rempli.</target>
4182 <context-group name="null"> 4965 <context-group name="null">
4183 <context context-type="linenumber">1</context> 4966 <context context-type="linenumber">1</context>
4184 </context-group> 4967 </context-group>
4185 </trans-unit> 4968 </trans-unit>
4186 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 4969 <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
4187 <source>Username must be at least 3 characters long.</source> 4970 <source>Your name must be at least 1 character long.</source>
4188 <target>Le nom d'utilisateur doit être composé d'au moins 3 caractères.</target> 4971 <target>Votre nom doit contenir au moins un caractère.</target>
4189 <context-group name="null"> 4972 <context-group name="null">
4190 <context context-type="linenumber">1</context> 4973 <context context-type="linenumber">1</context>
4191 </context-group> 4974 </context-group>
4192 </trans-unit> 4975 </trans-unit>
4193 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef"> 4976 <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
4194 <source>Username cannot be more than 20 characters long.</source> 4977 <source>Your name cannot be more than 120 characters long.</source>
4195 <target>Le nom d'utilisateur ne peut pas faire plus de 20 caractères.</target> 4978 <target>Votre nom ne peut pas contenir plus de 120 caractères.</target>
4196 <context-group name="null"> 4979 <context-group name="null">
4197 <context context-type="linenumber">1</context> 4980 <context context-type="linenumber">1</context>
4198 </context-group> 4981 </context-group>
4199 </trans-unit> 4982 </trans-unit>
4200 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9"> 4983 <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
4201 <source>Username should be only lowercase alphanumeric characters.</source> 4984 <source>A message is required.</source>
4202 <target>Le nom d'utilisateur ne doit être composé que de caractères alphanumériques en minuscule.</target> 4985 <target>Votre message doit être rempli.</target>
4203 <context-group name="null"> 4986 <context-group name="null">
4204 <context context-type="linenumber">1</context> 4987 <context context-type="linenumber">1</context>
4205 </context-group> 4988 </context-group>
4206 </trans-unit> 4989 </trans-unit>
4207 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 4990 <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
4208 <source>Email is required.</source> 4991 <source>The message must be at least 3 characters long.</source>
4209 <target>Le courriel est requis.</target> 4992 <target>Votre message doit contenir au moins 3 caractères.</target>
4210 <context-group name="null"> 4993 <context-group name="null">
4211 <context context-type="linenumber">1</context> 4994 <context context-type="linenumber">1</context>
4212 </context-group> 4995 </context-group>
4213 </trans-unit> 4996 </trans-unit>
4214 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1"> 4997 <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
4215 <source>Email must be valid.</source> 4998 <source>The message cannot be more than 5000 characters long.</source>
4216 <target>Le courriel doit être valide.</target> 4999 <target>Le message ne peut pas contenir plus de 5000 caractères.</target>
5000 <context-group name="null">
5001 <context context-type="linenumber">1</context>
5002 </context-group>
5003 </trans-unit>
5004 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
5005 <source>Username is required.</source>
5006 <target>Le nom d'utilisateur est requis.</target>
5007 <context-group name="null">
5008 <context context-type="linenumber">1</context>
5009 </context-group>
5010 </trans-unit>
5011 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
5012 <source>Password is required.</source>
5013 <target>Le mot de passe est requis.</target>
5014 <context-group name="null">
5015 <context context-type="linenumber">1</context>
5016 </context-group>
5017 </trans-unit>
5018 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
5019 <source>Confirmation of the password is required.</source>
5020 <target>La confirmation du mot de passe est requise.</target>
5021 <context-group name="null">
5022 <context context-type="linenumber">1</context>
5023 </context-group>
5024 </trans-unit>
5025 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
5026 <source>Username must be at least 1 character long.</source>
5027 <target>Votre nom d'utilisateur doit contenir au moins un caractère.</target>
5028 <context-group name="null">
5029 <context context-type="linenumber">1</context>
5030 </context-group>
5031 </trans-unit>
5032 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
5033 <source>Username cannot be more than 50 characters long.</source>
5034 <target>Votre nom d'utilisateur ne peut pas contenir plus de 50 caractères.</target>
5035 <context-group name="null">
5036 <context context-type="linenumber">1</context>
5037 </context-group>
5038 </trans-unit>
5039 <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
5040 <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
5041 <target>Le nom d'utilisateur peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
4217 <context-group name="null"> 5042 <context-group name="null">
4218 <context context-type="linenumber">1</context> 5043 <context context-type="linenumber">1</context>
4219 </context-group> 5044 </context-group>
@@ -4281,16 +5106,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4281 <context context-type="linenumber">1</context> 5106 <context context-type="linenumber">1</context>
4282 </context-group> 5107 </context-group>
4283 </trans-unit> 5108 </trans-unit>
4284 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5109 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
4285 <source>Display name must be at least 3 characters long.</source> 5110 <source>Display name must be at least 1 character long.</source>
4286 <target>Le nom d'affichage doit être composé d'au moins 3 caractères.</target> 5111 <target>Votre nom affiché doit contenir au moins un caractère.</target>
4287 <context-group name="null"> 5112 <context-group name="null">
4288 <context context-type="linenumber">1</context> 5113 <context context-type="linenumber">1</context>
4289 </context-group> 5114 </context-group>
4290 </trans-unit> 5115 </trans-unit>
4291 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5116 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
4292 <source>Display name cannot be more than 120 characters long.</source> 5117 <source>Display name cannot be more than 50 characters long.</source>
4293 <target>Le nom d'affichage ne peut pas faire plus de 120 caractères.</target> 5118 <target>Votre nom affiché ne peut pas contenir plus de 50 caractères.</target>
4294 <context-group name="null"> 5119 <context-group name="null">
4295 <context context-type="linenumber">1</context> 5120 <context context-type="linenumber">1</context>
4296 </context-group> 5121 </context-group>
@@ -4302,9 +5127,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4302 <context context-type="linenumber">1</context> 5127 <context context-type="linenumber">1</context>
4303 </context-group> 5128 </context-group>
4304 </trans-unit> 5129 </trans-unit>
4305 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 5130 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4306 <source>Description cannot be more than 250 characters long.</source> 5131 <source>Description cannot be more than 1000 characters long.</source>
4307 <target>La description ne peut pas faire plus de 250 caractères.</target> 5132 <target>La description ne peut pas faire plus de 1000 caractères de long.</target>
4308 <context-group name="null"> 5133 <context-group name="null">
4309 <context context-type="linenumber">1</context> 5134 <context context-type="linenumber">1</context>
4310 </context-group> 5135 </context-group>
@@ -4344,13 +5169,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4344 <context context-type="linenumber">1</context> 5169 <context context-type="linenumber">1</context>
4345 </context-group> 5170 </context-group>
4346 </trans-unit> 5171 </trans-unit>
4347 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4348 <source>Report reason cannot be more than 300 characters long.</source>
4349 <target>La raison du signalement ne peut pas dépasser 300 caractères.</target>
4350 <context-group name="null">
4351 <context context-type="linenumber">1</context>
4352 </context-group>
4353 </trans-unit>
4354 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 5172 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4355 <source>Moderation comment is required.</source> 5173 <source>Moderation comment is required.</source>
4356 <target>Un commentaire de modération est requis.</target> 5174 <target>Un commentaire de modération est requis.</target>
@@ -4365,13 +5183,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4365 <context context-type="linenumber">1</context> 5183 <context context-type="linenumber">1</context>
4366 </context-group> 5184 </context-group>
4367 </trans-unit> 5185 </trans-unit>
4368 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4369 <source>Moderation comment cannot be more than 300 characters long.</source>
4370 <target>Le commentaire de modération doit faire au plus 300 caractères.</target>
4371 <context-group name="null">
4372 <context context-type="linenumber">1</context>
4373 </context-group>
4374 </trans-unit>
4375 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 5186 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4376 <source>The channel is required.</source> 5187 <source>The channel is required.</source>
4377 <target>La chaîne est requise.</target> 5188 <target>La chaîne est requise.</target>
@@ -4414,37 +5225,37 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4414 <context context-type="linenumber">1</context> 5225 <context context-type="linenumber">1</context>
4415 </context-group> 5226 </context-group>
4416 </trans-unit> 5227 </trans-unit>
4417 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 5228 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4418 <source>Name is required.</source> 5229 <source>You can only transfer ownership to a local account</source>
4419 <target>Le nom est requis.</target> 5230 <target>Vous ne pouvez transférer la propriété que sur un compte local.</target>
4420 <context-group name="null"> 5231 <context-group name="null">
4421 <context context-type="linenumber">1</context> 5232 <context context-type="linenumber">1</context>
4422 </context-group> 5233 </context-group>
4423 </trans-unit> 5234 </trans-unit>
4424 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069"> 5235 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4425 <source>Name must be at least 3 characters long.</source> 5236 <source>Name is required.</source>
4426 <target>Le nom doit faire au moins 3 caractères.</target> 5237 <target>Le nom est requis.</target>
4427 <context-group name="null"> 5238 <context-group name="null">
4428 <context context-type="linenumber">1</context> 5239 <context context-type="linenumber">1</context>
4429 </context-group> 5240 </context-group>
4430 </trans-unit> 5241 </trans-unit>
4431 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 5242 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
4432 <source>Name cannot be more than 20 characters long.</source> 5243 <source>Name must be at least 1 character long.</source>
4433 <target>Le nom doit faire au plus 20 caractères.</target> 5244 <target>Le nom doit contenir au moins un caractère.</target>
4434 <context-group name="null"> 5245 <context-group name="null">
4435 <context context-type="linenumber">1</context> 5246 <context context-type="linenumber">1</context>
4436 </context-group> 5247 </context-group>
4437 </trans-unit> 5248 </trans-unit>
4438 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9"> 5249 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
4439 <source>Name should be only lowercase alphanumeric characters.</source> 5250 <source>Name cannot be more than 50 characters long.</source>
4440 <target>Le nom doit contenir seulement des caractères alphanumériques minuscules.</target> 5251 <target>Le nom ne peut pas contenir plus de 50 caractères.</target>
4441 <context-group name="null"> 5252 <context-group name="null">
4442 <context context-type="linenumber">1</context> 5253 <context context-type="linenumber">1</context>
4443 </context-group> 5254 </context-group>
4444 </trans-unit> 5255 </trans-unit>
4445 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 5256 <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
4446 <source>Description cannot be more than 500 characters long.</source> 5257 <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
4447 <target>La description ne peut pas dépasser 500 caractères.</target> 5258 <target>Le nom peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
4448 <context-group name="null"> 5259 <context-group name="null">
4449 <context context-type="linenumber">1</context> 5260 <context context-type="linenumber">1</context>
4450 </context-group> 5261 </context-group>
@@ -4456,9 +5267,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4456 <context context-type="linenumber">1</context> 5267 <context context-type="linenumber">1</context>
4457 </context-group> 5268 </context-group>
4458 </trans-unit> 5269 </trans-unit>
4459 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 5270 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4460 <source>Support text cannot be more than 500 characters long.</source> 5271 <source>Support text cannot be more than 1000 characters long.</source>
4461 <target>Le texte de soutien ne peut pas dépasser 500 caractères.</target> 5272 <target>Ce texte de support ne peut pas faire plus de 1000 caractères de long.</target>
4462 <context-group name="null"> 5273 <context-group name="null">
4463 <context context-type="linenumber">1</context> 5274 <context context-type="linenumber">1</context>
4464 </context-group> 5275 </context-group>
@@ -4554,9 +5365,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4554 <context context-type="linenumber">1</context> 5365 <context context-type="linenumber">1</context>
4555 </context-group> 5366 </context-group>
4556 </trans-unit> 5367 </trans-unit>
4557 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 5368 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4558 <source>Video support cannot be more than 500 characters long.</source> 5369 <source>Video support cannot be more than 1000 characters long.</source>
4559 <target>Le texte de soutien de la vidéo ne peut pas dépasser 500 caractères.</target> 5370 <target> Le texte de soutien de la vidéo ne peut pas dépasser 1000 caractères. </target>
4560 <context-group name="null"> 5371 <context-group name="null">
4561 <context context-type="linenumber">1</context> 5372 <context context-type="linenumber">1</context>
4562 </context-group> 5373 </context-group>
@@ -5086,6 +5897,153 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5086 <context context-type="linenumber">1</context> 5897 <context context-type="linenumber">1</context>
5087 </context-group> 5898 </context-group>
5088 </trans-unit> 5899 </trans-unit>
5900 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5901 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5902 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilisateur·ices banni·e·s.</target>
5903 <context-group name="null">
5904 <context context-type="linenumber">1</context>
5905 </context-group>
5906 </trans-unit>
5907 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5908 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5909 <target>Utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> banni.</target>
5910 <context-group name="null">
5911 <context context-type="linenumber">1</context>
5912 </context-group>
5913 </trans-unit>
5914 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5915 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5916 <target>Voulez-vous réellement rétablir <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
5917 <context-group name="null">
5918 <context context-type="linenumber">1</context>
5919 </context-group>
5920 </trans-unit>
5921 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5922 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5923 <target>L'utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> est rétabli.</target>
5924 <context-group name="null">
5925 <context context-type="linenumber">1</context>
5926 </context-group>
5927 </trans-unit>
5928 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5929 <source>If you remove this user, you will not be able to create another with the same username!</source>
5930 <target>Si vous supprimez ce compte, vous ne pourrez plus en créer de nouveau avec le même nom !</target>
5931 <context-group name="null">
5932 <context context-type="linenumber">1</context>
5933 </context-group>
5934 </trans-unit>
5935 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5936 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5937 <target>Utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> supprimé.</target>
5938 <context-group name="null">
5939 <context context-type="linenumber">1</context>
5940 </context-group>
5941 </trans-unit>
5942 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5943 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5944 <target>L'adresse mail de l'utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> a été vérifiée</target>
5945 <context-group name="null">
5946 <context context-type="linenumber">1</context>
5947 </context-group>
5948 </trans-unit>
5949 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5950 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5951 <target>Comptes <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muets.</target>
5952 <context-group name="null">
5953 <context context-type="linenumber">1</context>
5954 </context-group>
5955 </trans-unit>
5956 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5957 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5958 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muette.</target>
5959 <context-group name="null">
5960 <context context-type="linenumber">1</context>
5961 </context-group>
5962 </trans-unit>
5963 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5964 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5965 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> rendue muet par votre instance.</target>
5966 <context-group name="null">
5967 <context context-type="linenumber">1</context>
5968 </context-group>
5969 </trans-unit>
5970 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5971 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5972 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé par votre instance.</target>
5973 <context-group name="null">
5974 <context context-type="linenumber">1</context>
5975 </context-group>
5976 </trans-unit>
5977 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5978 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5979 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> rendue muette par votre instance.</target>
5980 <context-group name="null">
5981 <context context-type="linenumber">1</context>
5982 </context-group>
5983 </trans-unit>
5984 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5985 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5986 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> réactivée par votre instance.</target>
5987 <context-group name="null">
5988 <context context-type="linenumber">1</context>
5989 </context-group>
5990 </trans-unit>
5991 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5992 <source>Mute this account</source>
5993 <target>Rend muet ce compte.</target>
5994 <context-group name="null">
5995 <context context-type="linenumber">1</context>
5996 </context-group>
5997 </trans-unit>
5998 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5999 <source>Unmute this account</source>
6000 <target>Réactive ce compte.</target>
6001 <context-group name="null">
6002 <context context-type="linenumber">1</context>
6003 </context-group>
6004 </trans-unit>
6005 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
6006 <source>Mute the instance</source>
6007 <target>Rend muet cette instance</target>
6008 <context-group name="null">
6009 <context context-type="linenumber">1</context>
6010 </context-group>
6011 </trans-unit>
6012 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
6013 <source>Unmute the instance</source>
6014 <target>Réactive cette instance.</target>
6015 <context-group name="null">
6016 <context context-type="linenumber">1</context>
6017 </context-group>
6018 </trans-unit>
6019 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
6020 <source>Mute this account by your instance</source>
6021 <target>Rendre muet ce compte pour votre instance.</target>
6022 <context-group name="null">
6023 <context context-type="linenumber">1</context>
6024 </context-group>
6025 </trans-unit>
6026 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
6027 <source>Unmute this account by your instance</source>
6028 <target>Réactiver ce compte pour votre instance.</target>
6029 <context-group name="null">
6030 <context context-type="linenumber">1</context>
6031 </context-group>
6032 </trans-unit>
6033 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
6034 <source>Mute the instance by your instance</source>
6035 <target>Rendre muette cette instance pour votre instance.</target>
6036 <context-group name="null">
6037 <context context-type="linenumber">1</context>
6038 </context-group>
6039 </trans-unit>
6040 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
6041 <source>Unmute the instance by your instance</source>
6042 <target>Réactiver cette instance pour votre instance.</target>
6043 <context-group name="null">
6044 <context context-type="linenumber">1</context>
6045 </context-group>
6046 </trans-unit>
5089 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 6047 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5090 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 6048 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5091 <target>La requête est trop volumineuse pour le serveur. Merci de contacter un administrateur afin d'augmenter la taille limite acceptée par celui-ci.</target> 6049 <target>La requête est trop volumineuse pour le serveur. Merci de contacter un administrateur afin d'augmenter la taille limite acceptée par celui-ci.</target>
@@ -5114,6 +6072,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5114 <context context-type="linenumber">1</context> 6072 <context context-type="linenumber">1</context>
5115 </context-group> 6073 </context-group>
5116 </trans-unit> 6074 </trans-unit>
6075 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
6076 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
6077 <target>Abonné à <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
6078 <context-group name="null">
6079 <context context-type="linenumber">1</context>
6080 </context-group>
6081 </trans-unit>
5117 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 6082 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5118 <source>Subscribed</source> 6083 <source>Subscribed</source>
5119 <target>Abonné</target> 6084 <target>Abonné</target>
@@ -5121,9 +6086,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5121 <context context-type="linenumber">1</context> 6086 <context context-type="linenumber">1</context>
5122 </context-group> 6087 </context-group>
5123 </trans-unit> 6088 </trans-unit>
5124 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 6089 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
5125 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 6090 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5126 <target>Abonné à <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 6091 <target>Désabonné de <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5127 <context-group name="null"> 6092 <context-group name="null">
5128 <context context-type="linenumber">1</context> 6093 <context context-type="linenumber">1</context>
5129 </context-group> 6094 </context-group>
@@ -5135,9 +6100,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5135 <context context-type="linenumber">1</context> 6100 <context context-type="linenumber">1</context>
5136 </context-group> 6101 </context-group>
5137 </trans-unit> 6102 </trans-unit>
5138 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 6103 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5139 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 6104 <source>Moderator</source>
5140 <target>Désabonné de <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 6105 <target>Modérateur</target>
5141 <context-group name="null"> 6106 <context-group name="null">
5142 <context context-type="linenumber">1</context> 6107 <context context-type="linenumber">1</context>
5143 </context-group> 6108 </context-group>
@@ -5163,23 +6128,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5163 <context context-type="linenumber">1</context> 6128 <context context-type="linenumber">1</context>
5164 </context-group> 6129 </context-group>
5165 </trans-unit> 6130 </trans-unit>
5166 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 6131 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
5167 <source>Welcome</source> 6132 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5168 <target>Bienvenue</target> 6133 <target>Bienvenue ! Veuillez maintenant consulter vos mails afin de vérifier votre compte et compéter l'inscription. </target>
5169 <context-group name="null"> 6134 <context-group name="null">
5170 <context context-type="linenumber">1</context> 6135 <context context-type="linenumber">1</context>
5171 </context-group> 6136 </context-group>
5172 </trans-unit> 6137 </trans-unit>
5173 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c"> 6138 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
5174 <source>Please check your email to verify your account and complete signup.</source> 6139 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
5175 <target>Merci de relever votre courriel afin de vérifier votre compte et compléter votre inscription.</target> 6140 <target>Vous êtes maintenant connecté en tant que <x id="INTERPOLATION" equiv-text="{{username}}"/> !</target>
5176 <context-group name="null">
5177 <context context-type="linenumber">1</context>
5178 </context-group>
5179 </trans-unit>
5180 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
5181 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
5182 <target>Enregistrement pour <x id="INTERPOLATION" equiv-text="{{username}}"/> complété.</target>
5183 <context-group name="null"> 6141 <context-group name="null">
5184 <context context-type="linenumber">1</context> 6142 <context context-type="linenumber">1</context>
5185 </context-group> 6143 </context-group>
@@ -5212,13 +6170,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5212 <context context-type="linenumber">1</context> 6170 <context context-type="linenumber">1</context>
5213 </context-group> 6171 </context-group>
5214 </trans-unit> 6172 </trans-unit>
5215 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5216 <source>Info</source>
5217 <target>Info</target>
5218 <context-group name="null">
5219 <context context-type="linenumber">1</context>
5220 </context-group>
5221 </trans-unit>
5222 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 6173 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5223 <source>Upload cancelled</source> 6174 <source>Upload cancelled</source>
5224 <target>Mise en ligne annulée</target> 6175 <target>Mise en ligne annulée</target>
@@ -5226,13 +6177,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5226 <context context-type="linenumber">1</context> 6177 <context context-type="linenumber">1</context>
5227 </context-group> 6178 </context-group>
5228 </trans-unit> 6179 </trans-unit>
5229 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5230 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5231 <target>Désolé, mais PeerTube ne gère pas les vidéos d'une taille &gt; 8 Go</target>
5232 <context-group name="null">
5233 <context context-type="linenumber">1</context>
5234 </context-group>
5235 </trans-unit>
5236 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 6180 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5237 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 6181 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
5238 <target>Votre quota est dépassé avec cette vidéo (taille de la vidéo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 6182 <target>Votre quota est dépassé avec cette vidéo (taille de la vidéo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -5296,6 +6240,20 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5296 <context context-type="linenumber">1</context> 6240 <context context-type="linenumber">1</context>
5297 </context-group> 6241 </context-group>
5298 </trans-unit> 6242 </trans-unit>
6243 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
6244 <source>Like the video</source>
6245 <target>J'aime cette vidéo.</target>
6246 <context-group name="null">
6247 <context context-type="linenumber">1</context>
6248 </context-group>
6249 </trans-unit>
6250 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
6251 <source>Dislike the video</source>
6252 <target>Je n'aime pas cette vidéo.</target>
6253 <context-group name="null">
6254 <context context-type="linenumber">1</context>
6255 </context-group>
6256 </trans-unit>
5299 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 6257 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5300 <source>Do you really want to delete this video?</source> 6258 <source>Do you really want to delete this video?</source>
5301 <target>Êtes-vous bien sûr·e de vouloir supprimer cette vidéo ?</target> 6259 <target>Êtes-vous bien sûr·e de vouloir supprimer cette vidéo ?</target>
diff --git a/client/src/locale/target/angular_gl_ES.xml b/client/src/locale/target/angular_gl_ES.xml
index 17586924b..ab07180b2 100644
--- a/client/src/locale/target/angular_gl_ES.xml
+++ b/client/src/locale/target/angular_gl_ES.xml
@@ -14,14 +14,14 @@
14 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 14 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
15 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visionados</target> 15 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visionados</target>
16 <context-group name="null"> 16 <context-group name="null">
17 <context context-type="linenumber">13</context> 17 <context context-type="linenumber">16</context>
18 </context-group> 18 </context-group>
19 </trans-unit> 19 </trans-unit>
20 <trans-unit id="28f86ffd419b869711aa13f5e5ff54be6d70731c"> 20 <trans-unit id="28f86ffd419b869711aa13f5e5ff54be6d70731c">
21 <source>Edit</source> 21 <source>Edit</source>
22 <target>Editar</target> 22 <target>Editar</target>
23 <context-group name="null"> 23 <context-group name="null">
24 <context context-type="linenumber">5</context> 24 <context context-type="linenumber">1</context>
25 </context-group> 25 </context-group>
26 </trans-unit> 26 </trans-unit>
27 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 27 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -103,7 +103,7 @@
103 <source>Password</source> 103 <source>Password</source>
104 <target>Contrasinal</target> 104 <target>Contrasinal</target>
105 <context-group name="null"> 105 <context-group name="null">
106 <context context-type="linenumber">12</context> 106 <context context-type="linenumber">13</context>
107 </context-group> 107 </context-group>
108 </trans-unit> 108 </trans-unit>
109 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 109 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -117,7 +117,7 @@
117 <source>Login</source> 117 <source>Login</source>
118 <target>Conectar</target> 118 <target>Conectar</target>
119 <context-group name="null"> 119 <context-group name="null">
120 <context context-type="linenumber">38</context> 120 <context context-type="linenumber">36</context>
121 </context-group> 121 </context-group>
122 </trans-unit> 122 </trans-unit>
123 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 123 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -145,7 +145,7 @@
145 <source>Send me an email to reset my password</source> 145 <source>Send me an email to reset my password</source>
146 <target>Envíenme un correo para restablecer o contrasinal</target> 146 <target>Envíenme un correo para restablecer o contrasinal</target>
147 <context-group name="null"> 147 <context-group name="null">
148 <context context-type="linenumber">75</context> 148 <context context-type="linenumber">80</context>
149 </context-group> 149 </context-group>
150 </trans-unit> 150 </trans-unit>
151 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 151 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -198,18 +198,11 @@
198 <context context-type="linenumber">8</context> 198 <context context-type="linenumber">8</context>
199 </context-group> 199 </context-group>
200 </trans-unit> 200 </trans-unit>
201 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
202 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
203 <target>Lin e acepto os &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Termos&lt;/a&gt; de esta instancia</target>
204 <context-group name="null">
205 <context context-type="linenumber">54</context>
206 </context-group>
207 </trans-unit>
208 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 201 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
209 <source>Signup</source> 202 <source>Signup</source>
210 <target>Abrir conta</target> 203 <target>Abrir conta</target>
211 <context-group name="null"> 204 <context-group name="null">
212 <context context-type="linenumber">88</context> 205 <context context-type="linenumber">78</context>
213 </context-group> 206 </context-group>
214 </trans-unit> 207 </trans-unit>
215 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 208 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -230,13 +223,6 @@
230 <context context-type="linenumber">6</context> 223 <context context-type="linenumber">6</context>
231 </context-group> 224 </context-group>
232 </trans-unit> 225 </trans-unit>
233 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
234 <source>Filters</source>
235 <target>Filtros</target>
236 <context-group name="null">
237 <context context-type="linenumber">16</context>
238 </context-group>
239 </trans-unit>
240 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 226 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
241 <source> 227 <source>
242 No results found 228 No results found
@@ -245,21 +231,21 @@
245 Non se atoparon resultados 231 Non se atoparon resultados
246 </target> 232 </target>
247 <context-group name="null"> 233 <context-group name="null">
248 <context context-type="linenumber">25</context> 234 <context context-type="linenumber">28</context>
249 </context-group> 235 </context-group>
250 </trans-unit> 236 </trans-unit>
251 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 237 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
252 <source>Change the language</source> 238 <source>Change the language</source>
253 <target>Cambiar o idioma</target> 239 <target>Cambiar o idioma</target>
254 <context-group name="null"> 240 <context-group name="null">
255 <context context-type="linenumber">88</context> 241 <context context-type="linenumber">86</context>
256 </context-group> 242 </context-group>
257 </trans-unit> 243 </trans-unit>
258 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 244 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
259 <source>Create an account</source> 245 <source>Create an account</source>
260 <target>Crear unha conta</target> 246 <target>Crear unha conta</target>
261 <context-group name="null"> 247 <context-group name="null">
262 <context context-type="linenumber">39</context> 248 <context context-type="linenumber">37</context>
263 </context-group> 249 </context-group>
264 </trans-unit> 250 </trans-unit>
265 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 251 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -273,35 +259,35 @@
273 <source>Trending</source> 259 <source>Trending</source>
274 <target>En voga</target> 260 <target>En voga</target>
275 <context-group name="null"> 261 <context-group name="null">
276 <context context-type="linenumber">57</context> 262 <context context-type="linenumber">55</context>
277 </context-group> 263 </context-group>
278 </trans-unit> 264 </trans-unit>
279 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 265 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
280 <source>Recently added</source> 266 <source>Recently added</source>
281 <target>Últimos engadidos</target> 267 <target>Últimos engadidos</target>
282 <context-group name="null"> 268 <context-group name="null">
283 <context context-type="linenumber">62</context> 269 <context context-type="linenumber">60</context>
284 </context-group> 270 </context-group>
285 </trans-unit> 271 </trans-unit>
286 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 272 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
287 <source>Local</source> 273 <source>Local</source>
288 <target>Local</target> 274 <target>Local</target>
289 <context-group name="null"> 275 <context-group name="null">
290 <context context-type="linenumber">67</context> 276 <context context-type="linenumber">65</context>
291 </context-group> 277 </context-group>
292 </trans-unit> 278 </trans-unit>
293 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 279 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
294 <source>More</source> 280 <source>More</source>
295 <target>Máis</target> 281 <target>Máis</target>
296 <context-group name="null"> 282 <context-group name="null">
297 <context context-type="linenumber">72</context> 283 <context context-type="linenumber">70</context>
298 </context-group> 284 </context-group>
299 </trans-unit> 285 </trans-unit>
300 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 286 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
301 <source>Administration</source> 287 <source>Administration</source>
302 <target>Administración</target> 288 <target>Administración</target>
303 <context-group name="null"> 289 <context-group name="null">
304 <context context-type="linenumber">76</context> 290 <context context-type="linenumber">74</context>
305 </context-group> 291 </context-group>
306 </trans-unit> 292 </trans-unit>
307 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 293 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -413,14 +399,14 @@
413 <source>No results.</source> 399 <source>No results.</source>
414 <target>Sin resultados.</target> 400 <target>Sin resultados.</target>
415 <context-group name="null"> 401 <context-group name="null">
416 <context context-type="linenumber">7</context> 402 <context context-type="linenumber">20</context>
417 </context-group> 403 </context-group>
418 </trans-unit> 404 </trans-unit>
419 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 405 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
420 <source>Instance</source> 406 <source>Instance</source>
421 <target>Instancia</target> 407 <target>Instancia</target>
422 <context-group name="null"> 408 <context-group name="null">
423 <context context-type="linenumber">8</context> 409 <context context-type="linenumber">12</context>
424 </context-group> 410 </context-group>
425 </trans-unit> 411 </trans-unit>
426 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 412 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -430,17 +416,6 @@
430 <context context-type="linenumber">7</context> 416 <context context-type="linenumber">7</context>
431 </context-group> 417 </context-group>
432 </trans-unit> 418 </trans-unit>
433 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
434 <source>
435 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
436</source>
437 <target>
438 Acerca da instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
439</target>
440 <context-group name="null">
441 <context context-type="linenumber">1</context>
442 </context-group>
443 </trans-unit>
444 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 419 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
445 <source>Description</source> 420 <source>Description</source>
446 <target>Descrición</target> 421 <target>Descrición</target>
@@ -452,47 +427,14 @@
452 <source>Terms</source> 427 <source>Terms</source>
453 <target>Termos</target> 428 <target>Termos</target>
454 <context-group name="null"> 429 <context-group name="null">
455 <context context-type="linenumber">44</context> 430 <context context-type="linenumber">39</context>
456 </context-group> 431 </context-group>
457 </trans-unit> 432 </trans-unit>
458 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 433 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
459 <source>User registration is allowed and</source> 434 <source>User registration is allowed and</source>
460 <target>O rexistro está aberto e</target> 435 <target>O rexistro está aberto e</target>
461 <context-group name="null"> 436 <context-group name="null">
462 <context context-type="linenumber">25</context> 437 <context context-type="linenumber">29</context>
463 </context-group>
464 </trans-unit>
465 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
466 <source>
467 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
468 </source>
469 <target>
470 esta instancia proporciona unha cota inicial de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para os vídeos das súas usuarias.
471 </target>
472 <context-group name="null">
473 <context context-type="linenumber">27</context>
474 </context-group>
475 </trans-unit>
476 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
477 <source>
478 this instance provides unlimited space for the videos of its users.
479 </source>
480 <target>
481 esta instancia non limita o espazo para os videos das súas usuarias.
482 </target>
483 <context-group name="null">
484 <context context-type="linenumber">31</context>
485 </context-group>
486 </trans-unit>
487 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
488 <source>
489 User registration is currently not allowed.
490 </source>
491 <target>
492 En este momento non está aberto o rexistro de novas usuarias.
493 </target>
494 <context-group name="null">
495 <context context-type="linenumber">36</context>
496 </context-group> 438 </context-group>
497 </trans-unit> 439 </trans-unit>
498 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 440 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -670,19 +612,6 @@
670 <context context-type="linenumber">83</context> 612 <context context-type="linenumber">83</context>
671 </context-group> 613 </context-group>
672 </trans-unit> 614 </trans-unit>
673 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
674 <source>
675 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
676 In the meantime, we want to test different ideas related to this issue:
677 </source>
678 <target>
679 PeerTube só está en fase beta, e quere proporcionar as mellores contramedidas posibles para cando a versión estable sexa publicada.
680 Por agora, queremos probar diferentes ideas en relación a este asunto:
681 </target>
682 <context-group name="null">
683 <context context-type="linenumber">85</context>
684 </context-group>
685 </trans-unit>
686 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 615 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
687 <source>Set a limit to the number of peers sent by the tracker</source> 616 <source>Set a limit to the number of peers sent by the tracker</source>
688 <target>Establecer un límite ao número de pares enviados polo rastrexador</target> 617 <target>Establecer un límite ao número de pares enviados polo rastrexador</target>
@@ -722,14 +651,14 @@
722 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 651 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
723 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> suscritoras</target> 652 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> suscritoras</target>
724 <context-group name="null"> 653 <context-group name="null">
725 <context context-type="linenumber">12</context> 654 <context context-type="linenumber">24</context>
726 </context-group> 655 </context-group>
727 </trans-unit> 656 </trans-unit>
728 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 657 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
729 <source>Video channels</source> 658 <source>Video channels</source>
730 <target>Canles de vídeo</target> 659 <target>Canles de vídeo</target>
731 <context-group name="null"> 660 <context-group name="null">
732 <context context-type="linenumber">19</context> 661 <context context-type="linenumber">31</context>
733 </context-group> 662 </context-group>
734 </trans-unit> 663 </trans-unit>
735 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 664 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -771,42 +700,42 @@
771 <source>Short description</source> 700 <source>Short description</source>
772 <target>Descrición curta</target> 701 <target>Descrición curta</target>
773 <context-group name="null"> 702 <context-group name="null">
774 <context context-type="linenumber">22</context> 703 <context context-type="linenumber">21</context>
775 </context-group> 704 </context-group>
776 </trans-unit> 705 </trans-unit>
777 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 706 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
778 <source>Default client route</source> 707 <source>Default client route</source>
779 <target>Ruta ao cliente por omisión</target> 708 <target>Ruta ao cliente por omisión</target>
780 <context-group name="null"> 709 <context-group name="null">
781 <context context-type="linenumber">55</context> 710 <context context-type="linenumber">48</context>
782 </context-group> 711 </context-group>
783 </trans-unit> 712 </trans-unit>
784 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 713 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
785 <source>Videos Trending</source> 714 <source>Videos Trending</source>
786 <target>Vídeos de moda</target> 715 <target>Vídeos de moda</target>
787 <context-group name="null"> 716 <context-group name="null">
788 <context context-type="linenumber">59</context> 717 <context context-type="linenumber">52</context>
789 </context-group> 718 </context-group>
790 </trans-unit> 719 </trans-unit>
791 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 720 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
792 <source>Videos Recently Added</source> 721 <source>Videos Recently Added</source>
793 <target>Vídeos engadidos recentemente</target> 722 <target>Vídeos engadidos recentemente</target>
794 <context-group name="null"> 723 <context-group name="null">
795 <context context-type="linenumber">60</context> 724 <context context-type="linenumber">53</context>
796 </context-group> 725 </context-group>
797 </trans-unit> 726 </trans-unit>
798 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 727 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
799 <source>Local videos</source> 728 <source>Local videos</source>
800 <target>Vídeos en local</target> 729 <target>Vídeos en local</target>
801 <context-group name="null"> 730 <context-group name="null">
802 <context context-type="linenumber">61</context> 731 <context context-type="linenumber">54</context>
803 </context-group> 732 </context-group>
804 </trans-unit> 733 </trans-unit>
805 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 734 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
806 <source>Policy on videos containing sensitive content</source> 735 <source>Policy on videos containing sensitive content</source>
807 <target>Política para os vídeos con contido sensible</target> 736 <target>Política para os vídeos con contido sensible</target>
808 <context-group name="null"> 737 <context-group name="null">
809 <context context-type="linenumber">70</context> 738 <context context-type="linenumber">61</context>
810 </context-group> 739 </context-group>
811 </trans-unit> 740 </trans-unit>
812 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 741 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -841,14 +770,28 @@
841 <source>Signup enabled</source> 770 <source>Signup enabled</source>
842 <target>Rexistro activado</target> 771 <target>Rexistro activado</target>
843 <context-group name="null"> 772 <context-group name="null">
844 <context context-type="linenumber">92</context> 773 <context context-type="linenumber">84</context>
845 </context-group> 774 </context-group>
846 </trans-unit> 775 </trans-unit>
847 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 776 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
848 <source>Signup limit</source> 777 <source>Signup limit</source>
849 <target>Rexistro limitado</target> 778 <target>Rexistro limitado</target>
850 <context-group name="null"> 779 <context-group name="null">
851 <context context-type="linenumber">101</context> 780 <context context-type="linenumber">96</context>
781 </context-group>
782 </trans-unit>
783 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
784 <source>Users</source>
785 <target>Usuarias</target>
786 <context-group name="null">
787 <context context-type="linenumber">105</context>
788 </context-group>
789 </trans-unit>
790 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
791 <source>User default video quota</source>
792 <target>Cota de vídeo por omisión para a usuaria</target>
793 <context-group name="null">
794 <context context-type="linenumber">109</context>
852 </context-group> 795 </context-group>
853 </trans-unit> 796 </trans-unit>
854 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 797 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -858,46 +801,25 @@
858 <context context-type="linenumber">42</context> 801 <context context-type="linenumber">42</context>
859 </context-group> 802 </context-group>
860 </trans-unit> 803 </trans-unit>
861 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce">
862 <source>Video import with HTTP enabled</source>
863 <target>Importación de vídeos por HTTP activada</target>
864 <context-group name="null">
865 <context context-type="linenumber">115</context>
866 </context-group>
867 </trans-unit>
868 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 804 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
869 <source>Video import with a torrent file or a magnet URI enabled</source> 805 <source>Video import with a torrent file or a magnet URI enabled</source>
870 <target>Importación de vídeo con un ficheiro torrent ou URI magnet activada</target> 806 <target>Importación de vídeo con un ficheiro torrent ou URI magnet activada</target>
871 <context-group name="null"> 807 <context-group name="null">
872 <context context-type="linenumber">120</context> 808 <context context-type="linenumber">148</context>
873 </context-group> 809 </context-group>
874 </trans-unit> 810 </trans-unit>
875 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 811 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
876 <source>Administrator</source> 812 <source>Administrator</source>
877 <target>Administración</target> 813 <target>Administración</target>
878 <context-group name="null"> 814 <context-group name="null">
879 <context context-type="linenumber">123</context> 815 <context context-type="linenumber">155</context>
880 </context-group> 816 </context-group>
881 </trans-unit> 817 </trans-unit>
882 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 818 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
883 <source>Admin email</source> 819 <source>Admin email</source>
884 <target>Correo-e da Admin</target> 820 <target>Correo-e da Admin</target>
885 <context-group name="null"> 821 <context-group name="null">
886 <context context-type="linenumber">126</context> 822 <context context-type="linenumber">158</context>
887 </context-group>
888 </trans-unit>
889 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
890 <source>Users</source>
891 <target>Usuarias</target>
892 <context-group name="null">
893 <context context-type="linenumber">136</context>
894 </context-group>
895 </trans-unit>
896 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
897 <source>User default video quota</source>
898 <target>Cota de vídeo por omisión para a usuaria</target>
899 <context-group name="null">
900 <context context-type="linenumber">139</context>
901 </context-group> 823 </context-group>
902 </trans-unit> 824 </trans-unit>
903 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 825 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -911,133 +833,133 @@
911 <source>Twitter</source> 833 <source>Twitter</source>
912 <target>Twitter</target> 834 <target>Twitter</target>
913 <context-group name="null"> 835 <context-group name="null">
914 <context context-type="linenumber">170</context> 836 <context context-type="linenumber">178</context>
915 </context-group> 837 </context-group>
916 </trans-unit> 838 </trans-unit>
917 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 839 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
918 <source>Your Twitter username</source> 840 <source>Your Twitter username</source>
919 <target>O seu alcume na Twitter</target> 841 <target>O seu alcume na Twitter</target>
920 <context-group name="null"> 842 <context-group name="null">
921 <context context-type="linenumber">173</context> 843 <context context-type="linenumber">184</context>
922 </context-group> 844 </context-group>
923 </trans-unit> 845 </trans-unit>
924 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 846 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
925 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 847 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
926 <target>Indica a conta na Twitter para o sitio web ou plataforma para a cal o contido foi publicado.</target> 848 <target>Indica a conta na Twitter para o sitio web ou plataforma para a cal o contido foi publicado.</target>
927 <context-group name="null"> 849 <context-group name="null">
928 <context context-type="linenumber">176</context> 850 <context context-type="linenumber">187</context>
929 </context-group> 851 </context-group>
930 </trans-unit> 852 </trans-unit>
931 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 853 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
932 <source>Instance whitelisted by Twitter</source> 854 <source>Instance whitelisted by Twitter</source>
933 <target>Instancia na lista blanca por Twitter</target> 855 <target>Instancia na lista blanca por Twitter</target>
934 <context-group name="null"> 856 <context-group name="null">
935 <context context-type="linenumber">189</context> 857 <context context-type="linenumber">199</context>
936 </context-group> 858 </context-group>
937 </trans-unit> 859 </trans-unit>
938 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 860 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
939 <source>Services</source> 861 <source>Services</source>
940 <target>Servizos</target> 862 <target>Servizos</target>
941 <context-group name="null"> 863 <context-group name="null">
942 <context context-type="linenumber">168</context> 864 <context context-type="linenumber">176</context>
943 </context-group> 865 </context-group>
944 </trans-unit> 866 </trans-unit>
945 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 867 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
946 <source>Transcoding</source> 868 <source>Transcoding</source>
947 <target>Recodificando</target> 869 <target>Recodificando</target>
948 <context-group name="null"> 870 <context-group name="null">
949 <context context-type="linenumber">200</context> 871 <context context-type="linenumber">215</context>
950 </context-group> 872 </context-group>
951 </trans-unit> 873 </trans-unit>
952 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 874 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
953 <source>Transcoding enabled</source> 875 <source>Transcoding enabled</source>
954 <target>Recodificación activada</target> 876 <target>Recodificación activada</target>
955 <context-group name="null"> 877 <context-group name="null">
956 <context context-type="linenumber">204</context> 878 <context context-type="linenumber">221</context>
957 </context-group> 879 </context-group>
958 </trans-unit> 880 </trans-unit>
959 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 881 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
960 <source>If you disable transcoding, many videos from your users will not work!</source> 882 <source>If you disable transcoding, many videos from your users will not work!</source>
961 <target>Si desactiva a recodificación moitos vídeos das súas usuarias non funcionarán!</target> 883 <target>Si desactiva a recodificación moitos vídeos das súas usuarias non funcionarán!</target>
962 <context-group name="null"> 884 <context-group name="null">
963 <context context-type="linenumber">205</context> 885 <context context-type="linenumber">222</context>
964 </context-group> 886 </context-group>
965 </trans-unit> 887 </trans-unit>
966 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 888 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
967 <source>Transcoding threads</source> 889 <source>Transcoding threads</source>
968 <target>Fíos de recodificación</target> 890 <target>Fíos de recodificación</target>
969 <context-group name="null"> 891 <context-group name="null">
970 <context context-type="linenumber">211</context> 892 <context context-type="linenumber">237</context>
971 </context-group> 893 </context-group>
972 </trans-unit> 894 </trans-unit>
973 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 895 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
974 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 896 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
975 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 897 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
976 <context-group name="null"> 898 <context-group name="null">
977 <context context-type="linenumber">227</context> 899 <context context-type="linenumber">252</context>
978 </context-group> 900 </context-group>
979 </trans-unit> 901 </trans-unit>
980 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 902 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
981 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 903 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
982 <target>Algúns ficheiros non se federan (vista previa, comentarios). Recollémolos directamente desde a instancia de orixe e almacenámolos.</target> 904 <target>Algúns ficheiros non se federan (vista previa, comentarios). Recollémolos directamente desde a instancia de orixe e almacenámolos.</target>
983 <context-group name="null"> 905 <context-group name="null">
984 <context context-type="linenumber">238</context> 906 <context context-type="linenumber">265</context>
985 </context-group> 907 </context-group>
986 </trans-unit> 908 </trans-unit>
987 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 909 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
988 <source>Previews cache size</source> 910 <source>Previews cache size</source>
989 <target>Tamaño da caché de vista previa</target> 911 <target>Tamaño da caché de vista previa</target>
990 <context-group name="null"> 912 <context-group name="null">
991 <context context-type="linenumber">243</context> 913 <context context-type="linenumber">271</context>
992 </context-group> 914 </context-group>
993 </trans-unit> 915 </trans-unit>
994 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 916 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
995 <source>Video captions cache size</source> 917 <source>Video captions cache size</source>
996 <target>Tamaño da caché de comentarios no vídeo</target> 918 <target>Tamaño da caché de comentarios no vídeo</target>
997 <context-group name="null"> 919 <context-group name="null">
998 <context context-type="linenumber">254</context> 920 <context context-type="linenumber">280</context>
999 </context-group> 921 </context-group>
1000 </trans-unit> 922 </trans-unit>
1001 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 923 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1002 <source>Customizations</source> 924 <source>Customizations</source>
1003 <target>Personalizacións</target> 925 <target>Personalizacións</target>
1004 <context-group name="null"> 926 <context-group name="null">
1005 <context context-type="linenumber">264</context> 927 <context context-type="linenumber">289</context>
1006 </context-group> 928 </context-group>
1007 </trans-unit> 929 </trans-unit>
1008 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 930 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1009 <source>JavaScript</source> 931 <source>JavaScript</source>
1010 <target>JavaScript</target> 932 <target>JavaScript</target>
1011 <context-group name="null"> 933 <context-group name="null">
1012 <context context-type="linenumber">267</context> 934 <context context-type="linenumber">294</context>
1013 </context-group> 935 </context-group>
1014 </trans-unit> 936 </trans-unit>
1015 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 937 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1016 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 938 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1017 <target>Escribir código JavaScript directamente.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('a miña instancia é tremenda');&lt;/pre&gt;</target> 939 <target>Escribir código JavaScript directamente.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('a miña instancia é tremenda');&lt;/pre&gt;</target>
1018 <context-group name="null"> 940 <context-group name="null">
1019 <context context-type="linenumber">270</context> 941 <context context-type="linenumber">297</context>
1020 </context-group> 942 </context-group>
1021 </trans-unit> 943 </trans-unit>
1022 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 944 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1023 <source>Advanced configuration</source> 945 <source>Advanced configuration</source>
1024 <target>Configuración avanzada</target> 946 <target>Configuración avanzada</target>
1025 <context-group name="null"> 947 <context-group name="null">
1026 <context context-type="linenumber">197</context> 948 <context context-type="linenumber">212</context>
1027 </context-group> 949 </context-group>
1028 </trans-unit> 950 </trans-unit>
1029 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 951 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1030 <source>Update configuration</source> 952 <source>Update configuration</source>
1031 <target>Actualizar configuración</target> 953 <target>Actualizar configuración</target>
1032 <context-group name="null"> 954 <context-group name="null">
1033 <context context-type="linenumber">314</context> 955 <context context-type="linenumber">340</context>
1034 </context-group> 956 </context-group>
1035 </trans-unit> 957 </trans-unit>
1036 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 958 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1037 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 959 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1038 <target>Semella que a configuración non é válida. Por favor busque os erros potenciais nas diferentes pestanas.</target> 960 <target>Semella que a configuración non é válida. Por favor busque os erros potenciais nas diferentes pestanas.</target>
1039 <context-group name="null"> 961 <context-group name="null">
1040 <context context-type="linenumber">315</context> 962 <context context-type="linenumber">341</context>
1041 </context-group> 963 </context-group>
1042 </trans-unit> 964 </trans-unit>
1043 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 965 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
diff --git a/client/src/locale/target/angular_it_IT.xml b/client/src/locale/target/angular_it_IT.xml
index 56649f505..c3bcc704c 100644
--- a/client/src/locale/target/angular_it_IT.xml
+++ b/client/src/locale/target/angular_it_IT.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Seleziona mese</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Seleziona anno</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -213,11 +227,25 @@
213 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
214 </context-group> 228 </context-group>
215 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Non elencato</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Privato</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
216 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
218 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target>
219 <context-group name="null"> 247 <context-group name="null">
220 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
221 </context-group> 249 </context-group>
222 </trans-unit> 250 </trans-unit>
223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -231,11 +259,12 @@
231 <source>Edit</source> 259 <source>Edit</source>
232 <target>Modifica</target> 260 <target>Modifica</target>
233 <context-group name="null"> 261 <context-group name="null">
234 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
235 </context-group> 263 </context-group>
236 </trans-unit> 264 </trans-unit>
237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
238 <source>Truncated preview</source> 266 <source>Truncated preview</source>
267 <target>Anteprima parziale</target>
239 <context-group name="null"> 268 <context-group name="null">
240 <context context-type="linenumber">9</context> 269 <context context-type="linenumber">9</context>
241 </context-group> 270 </context-group>
@@ -254,11 +283,92 @@
254 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
255 </context-group> 284 </context-group>
256 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Subscribe
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 Unsubscribe
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>Utilizzando un account ActivityPub</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>Iscriviti con un account su <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>Iscriviti con il tuo account locale</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>Iscriviti con un account Mastodon:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>Usando una syndication feed</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
354 <source>Subscribe via RSS</source>
355 <target>Iscriviti usando RSS</target>
356 <context-group name="null">
357 <context context-type="linenumber">49</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
361 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
362 <target>Puoi iscriverti al canale attraverso una qualunque ActivityPub istanza del fediverso. Con istanze con Mastodon o Pleroma puoi digitare la URL del canale nel campo di ricerca e iscriverti là.</target>
363 <context-group name="null">
364 <context context-type="linenumber">17</context>
365 </context-group>
366 </trans-unit>
257 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 367 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
258 <source>Video quota</source> 368 <source>Video quota</source>
259 <target>Quota video</target> 369 <target>Quota video</target>
260 <context-group name="null"> 370 <context-group name="null">
261 <context context-type="linenumber">19</context> 371 <context context-type="linenumber">42</context>
262 </context-group> 372 </context-group>
263 </trans-unit> 373 </trans-unit>
264 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 374 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -272,6 +382,38 @@
272 <context context-type="linenumber">14</context> 382 <context context-type="linenumber">14</context>
273 </context-group> 383 </context-group>
274 </trans-unit> 384 </trans-unit>
385 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
386 <source>Ban</source>
387 <target>Ban (espelli)</target>
388 <context-group name="null">
389 <context context-type="linenumber">3</context>
390 </context-group>
391 </trans-unit>
392 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
393 <source>Reason...</source>
394 <target>Motivo...</target>
395 <context-group name="null">
396 <context context-type="linenumber">11</context>
397 </context-group>
398 </trans-unit>
399 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
400 <source>
401 A banned user will no longer be able to login.
402 </source>
403 <target>
404 Un utente bannato non sara piu in grado di accedere.
405 </target>
406 <context-group name="null">
407 <context context-type="linenumber">17</context>
408 </context-group>
409 </trans-unit>
410 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
411 <source>Ban this user</source>
412 <target>Banna questo utente</target>
413 <context-group name="null">
414 <context context-type="linenumber">25</context>
415 </context-group>
416 </trans-unit>
275 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 417 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
276 <source> 418 <source>
277 Login 419 Login
@@ -337,7 +479,7 @@
337 <source>Password</source> 479 <source>Password</source>
338 <target>Password</target> 480 <target>Password</target>
339 <context-group name="null"> 481 <context-group name="null">
340 <context context-type="linenumber">12</context> 482 <context context-type="linenumber">13</context>
341 </context-group> 483 </context-group>
342 </trans-unit> 484 </trans-unit>
343 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 485 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -351,7 +493,7 @@
351 <source>Login</source> 493 <source>Login</source>
352 <target>Accedi</target> 494 <target>Accedi</target>
353 <context-group name="null"> 495 <context-group name="null">
354 <context context-type="linenumber">38</context> 496 <context context-type="linenumber">36</context>
355 </context-group> 497 </context-group>
356 </trans-unit> 498 </trans-unit>
357 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 499 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -379,7 +521,7 @@
379 <source>Send me an email to reset my password</source> 521 <source>Send me an email to reset my password</source>
380 <target>Inviami un email per resettare la password</target> 522 <target>Inviami un email per resettare la password</target>
381 <context-group name="null"> 523 <context-group name="null">
382 <context context-type="linenumber">75</context> 524 <context context-type="linenumber">80</context>
383 </context-group> 525 </context-group>
384 </trans-unit> 526 </trans-unit>
385 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 527 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -434,29 +576,23 @@
434 </trans-unit> 576 </trans-unit>
435 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3"> 577 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
436 <source>Example: jane_doe</source> 578 <source>Example: jane_doe</source>
579 <target>Esempio: jane_doe</target>
437 <context-group name="null"> 580 <context-group name="null">
438 <context context-type="linenumber">16</context> 581 <context context-type="linenumber">17</context>
439 </context-group>
440 </trans-unit>
441 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
442 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
443 <target>Ho letto e accetto i &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Termini&lt;/a&gt; di questa istanza</target>
444 <context-group name="null">
445 <context context-type="linenumber">54</context>
446 </context-group> 582 </context-group>
447 </trans-unit> 583 </trans-unit>
448 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 584 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
449 <source>Signup</source> 585 <source>Signup</source>
450 <target>Registrati</target> 586 <target>Registrati</target>
451 <context-group name="null"> 587 <context-group name="null">
452 <context context-type="linenumber">88</context> 588 <context context-type="linenumber">78</context>
453 </context-group> 589 </context-group>
454 </trans-unit> 590 </trans-unit>
455 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 591 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
456 <source>Features found on this instance</source> 592 <source>Features found on this instance</source>
457 <target>Funzionalità in questa istanza</target> 593 <target>Funzionalità in questa istanza</target>
458 <context-group name="null"> 594 <context-group name="null">
459 <context context-type="linenumber">66</context> 595 <context context-type="linenumber">67</context>
460 </context-group> 596 </context-group>
461 </trans-unit> 597 </trans-unit>
462 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 598 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -477,9 +613,15 @@
477 <context context-type="linenumber">6</context> 613 <context context-type="linenumber">6</context>
478 </context-group> 614 </context-group>
479 </trans-unit> 615 </trans-unit>
480 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 616 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
481 <source>Filters</source> 617 <source>
482 <target>Filtri</target> 618 Filters
619 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
620 </source>
621 <target>
622 Filtri
623 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
624 </target>
483 <context-group name="null"> 625 <context-group name="null">
484 <context context-type="linenumber">16</context> 626 <context context-type="linenumber">16</context>
485 </context-group> 627 </context-group>
@@ -492,28 +634,28 @@
492 Nessun risultato trovato 634 Nessun risultato trovato
493 </target> 635 </target>
494 <context-group name="null"> 636 <context-group name="null">
495 <context context-type="linenumber">25</context> 637 <context context-type="linenumber">28</context>
496 </context-group> 638 </context-group>
497 </trans-unit> 639 </trans-unit>
498 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 640 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
499 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 641 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
500 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> iscritti</target> 642 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> iscritti</target>
501 <context-group name="null"> 643 <context-group name="null">
502 <context context-type="linenumber">41</context> 644 <context context-type="linenumber">44</context>
503 </context-group> 645 </context-group>
504 </trans-unit> 646 </trans-unit>
505 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 647 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
506 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 648 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
507 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizzazioni</target> 649 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizzazioni</target>
508 <context-group name="null"> 650 <context-group name="null">
509 <context context-type="linenumber">52</context> 651 <context context-type="linenumber">55</context>
510 </context-group> 652 </context-group>
511 </trans-unit> 653 </trans-unit>
512 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 654 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
513 <source>Change the language</source> 655 <source>Change the language</source>
514 <target>Cambia lingua</target> 656 <target>Cambia lingua</target>
515 <context-group name="null"> 657 <context-group name="null">
516 <context context-type="linenumber">88</context> 658 <context context-type="linenumber">86</context>
517 </context-group> 659 </context-group>
518 </trans-unit> 660 </trans-unit>
519 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 661 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -524,7 +666,7 @@
524 Il mio profilo pubblico 666 Il mio profilo pubblico
525 </target> 667 </target>
526 <context-group name="null"> 668 <context-group name="null">
527 <context context-type="linenumber">18</context> 669 <context context-type="linenumber">16</context>
528 </context-group> 670 </context-group>
529 </trans-unit> 671 </trans-unit>
530 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 672 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -535,7 +677,7 @@
535 Il mio account 677 Il mio account
536 </target> 678 </target>
537 <context-group name="null"> 679 <context-group name="null">
538 <context context-type="linenumber">22</context> 680 <context context-type="linenumber">20</context>
539 </context-group> 681 </context-group>
540 </trans-unit> 682 </trans-unit>
541 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 683 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -546,7 +688,7 @@
546 I miei video 688 I miei video
547 </target> 689 </target>
548 <context-group name="null"> 690 <context-group name="null">
549 <context context-type="linenumber">26</context> 691 <context context-type="linenumber">24</context>
550 </context-group> 692 </context-group>
551 </trans-unit> 693 </trans-unit>
552 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 694 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -557,14 +699,14 @@
557 Esci 699 Esci
558 </target> 700 </target>
559 <context-group name="null"> 701 <context-group name="null">
560 <context context-type="linenumber">30</context> 702 <context context-type="linenumber">28</context>
561 </context-group> 703 </context-group>
562 </trans-unit> 704 </trans-unit>
563 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 705 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
564 <source>Create an account</source> 706 <source>Create an account</source>
565 <target>Crea un account</target> 707 <target>Crea un account</target>
566 <context-group name="null"> 708 <context-group name="null">
567 <context context-type="linenumber">39</context> 709 <context context-type="linenumber">37</context>
568 </context-group> 710 </context-group>
569 </trans-unit> 711 </trans-unit>
570 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 712 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -578,42 +720,49 @@
578 <source>Subscriptions</source> 720 <source>Subscriptions</source>
579 <target>Iscrizioni</target> 721 <target>Iscrizioni</target>
580 <context-group name="null"> 722 <context-group name="null">
581 <context context-type="linenumber">47</context> 723 <context context-type="linenumber">45</context>
724 </context-group>
725 </trans-unit>
726 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
727 <source>Overview</source>
728 <target>Panoramica</target>
729 <context-group name="null">
730 <context context-type="linenumber">50</context>
582 </context-group> 731 </context-group>
583 </trans-unit> 732 </trans-unit>
584 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 733 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
585 <source>Trending</source> 734 <source>Trending</source>
586 <target>Popolari</target> 735 <target>Popolari</target>
587 <context-group name="null"> 736 <context-group name="null">
588 <context context-type="linenumber">57</context> 737 <context context-type="linenumber">55</context>
589 </context-group> 738 </context-group>
590 </trans-unit> 739 </trans-unit>
591 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 740 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
592 <source>Recently added</source> 741 <source>Recently added</source>
593 <target>Aggiunti di recente</target> 742 <target>Aggiunti di recente</target>
594 <context-group name="null"> 743 <context-group name="null">
595 <context context-type="linenumber">62</context> 744 <context context-type="linenumber">60</context>
596 </context-group> 745 </context-group>
597 </trans-unit> 746 </trans-unit>
598 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 747 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
599 <source>Local</source> 748 <source>Local</source>
600 <target>Locali</target> 749 <target>Locali</target>
601 <context-group name="null"> 750 <context-group name="null">
602 <context context-type="linenumber">67</context> 751 <context context-type="linenumber">65</context>
603 </context-group> 752 </context-group>
604 </trans-unit> 753 </trans-unit>
605 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 754 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
606 <source>More</source> 755 <source>More</source>
607 <target>Altro</target> 756 <target>Altro</target>
608 <context-group name="null"> 757 <context-group name="null">
609 <context context-type="linenumber">72</context> 758 <context context-type="linenumber">70</context>
610 </context-group> 759 </context-group>
611 </trans-unit> 760 </trans-unit>
612 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 761 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
613 <source>Administration</source> 762 <source>Administration</source>
614 <target>Amministrazione</target> 763 <target>Amministrazione</target>
615 <context-group name="null"> 764 <context-group name="null">
616 <context context-type="linenumber">76</context> 765 <context context-type="linenumber">74</context>
617 </context-group> 766 </context-group>
618 </trans-unit> 767 </trans-unit>
619 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 768 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -623,11 +772,18 @@
623 <context context-type="linenumber">25</context> 772 <context context-type="linenumber">25</context>
624 </context-group> 773 </context-group>
625 </trans-unit> 774 </trans-unit>
775 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
776 <source>Show keyboard shortcuts</source>
777 <target>Mostra scorciatoie della tastiera</target>
778 <context-group name="null">
779 <context context-type="linenumber">89</context>
780 </context-group>
781 </trans-unit>
626 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 782 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
627 <source>Toggle dark interface</source> 783 <source>Toggle dark interface</source>
628 <target>(Dis)attiva l'interfaccia sicura</target> 784 <target>(Dis)attiva l'interfaccia sicura</target>
629 <context-group name="null"> 785 <context-group name="null">
630 <context context-type="linenumber">94</context> 786 <context context-type="linenumber">92</context>
631 </context-group> 787 </context-group>
632 </trans-unit> 788 </trans-unit>
633 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 789 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -728,11 +884,18 @@
728 <context context-type="linenumber">94</context> 884 <context context-type="linenumber">94</context>
729 </context-group> 885 </context-group>
730 </trans-unit> 886 </trans-unit>
887 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
888 <source>Display unlisted and private videos</source>
889 <target>Mostra video privati e non elencati</target>
890 <context-group name="null">
891 <context context-type="linenumber">14</context>
892 </context-group>
893 </trans-unit>
731 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 894 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
732 <source>No results.</source> 895 <source>No results.</source>
733 <target>Nessun risultato.</target> 896 <target>Nessun risultato.</target>
734 <context-group name="null"> 897 <context-group name="null">
735 <context context-type="linenumber">7</context> 898 <context context-type="linenumber">20</context>
736 </context-group> 899 </context-group>
737 </trans-unit> 900 </trans-unit>
738 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 901 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -746,6 +909,17 @@
746 <context context-type="linenumber">6</context> 909 <context context-type="linenumber">6</context>
747 </context-group> 910 </context-group>
748 </trans-unit> 911 </trans-unit>
912 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
913 <source>
914 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
915 </source>
916 <target>
917 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
918 </target>
919 <context-group name="null">
920 <context context-type="linenumber">14</context>
921 </context-group>
922 </trans-unit>
749 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 923 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
750 <source> 924 <source>
751 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 925 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -769,7 +943,7 @@
769 <source>Instance</source> 943 <source>Instance</source>
770 <target>Istanza</target> 944 <target>Istanza</target>
771 <context-group name="null"> 945 <context-group name="null">
772 <context context-type="linenumber">8</context> 946 <context context-type="linenumber">12</context>
773 </context-group> 947 </context-group>
774 </trans-unit> 948 </trans-unit>
775 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 949 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -779,15 +953,22 @@
779 <context context-type="linenumber">7</context> 953 <context context-type="linenumber">7</context>
780 </context-group> 954 </context-group>
781 </trans-unit> 955 </trans-unit>
782 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 956 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
783 <source> 957 <source>
784 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 958 Cancel
785</source> 959 </source>
786 <target> 960 <target>
787 Riguardo all'istanza <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 961 Annulla
788</target> 962 </target>
789 <context-group name="null"> 963 <context-group name="null">
790 <context context-type="linenumber">1</context> 964 <context context-type="linenumber">26</context>
965 </context-group>
966 </trans-unit>
967 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
968 <source>Submit</source>
969 <target>Invia</target>
970 <context-group name="null">
971 <context context-type="linenumber">31</context>
791 </context-group> 972 </context-group>
792 </trans-unit> 973 </trans-unit>
793 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 974 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -801,47 +982,14 @@
801 <source>Terms</source> 982 <source>Terms</source>
802 <target>Termini</target> 983 <target>Termini</target>
803 <context-group name="null"> 984 <context-group name="null">
804 <context context-type="linenumber">44</context> 985 <context context-type="linenumber">39</context>
805 </context-group> 986 </context-group>
806 </trans-unit> 987 </trans-unit>
807 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 988 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
808 <source>User registration is allowed and</source> 989 <source>User registration is allowed and</source>
809 <target>È permessa la registrazione di nuovi utenti e</target> 990 <target>È permessa la registrazione di nuovi utenti e</target>
810 <context-group name="null"> 991 <context-group name="null">
811 <context context-type="linenumber">25</context> 992 <context context-type="linenumber">29</context>
812 </context-group>
813 </trans-unit>
814 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
815 <source>
816 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
817 </source>
818 <target>
819 questa istanza fornisce una quota base di <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> per i video dei suoi utenti.
820 </target>
821 <context-group name="null">
822 <context context-type="linenumber">27</context>
823 </context-group>
824 </trans-unit>
825 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
826 <source>
827 this instance provides unlimited space for the videos of its users.
828 </source>
829 <target>
830 questa istanza fornisce spazio illimitato per i video dei suoi utenti.
831 </target>
832 <context-group name="null">
833 <context context-type="linenumber">31</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
837 <source>
838 User registration is currently not allowed.
839 </source>
840 <target>
841 La registrazione di nuovi utenti al momento non è permessa.
842 </target>
843 <context-group name="null">
844 <context context-type="linenumber">36</context>
845 </context-group> 993 </context-group>
846 </trans-unit> 994 </trans-unit>
847 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 995 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -929,6 +1077,10 @@
929 An HTTP request has to be sent on each tracker for each video to spy. 1077 An HTTP request has to be sent on each tracker for each video to spy.
930 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot) 1078 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
931 </source> 1079 </source>
1080 <target>
1081 È necessario inviare una richiesta HTTP ad ogni tracker per ogni video da spiare.
1082 Per spiare ogni video su PeerTube si devono inviare tante richieste quanti video sono presenti sulla piattaforma (potenzialmente molti)
1083 </target>
932 <context-group name="null"> 1084 <context-group name="null">
933 <context context-type="linenumber">33</context> 1085 <context context-type="linenumber">33</context>
934 </context-group> 1086 </context-group>
@@ -938,6 +1090,10 @@
938 For each request sent, the tracker returns random peers at a limited number. 1090 For each request sent, the tracker returns random peers at a limited number.
939 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm 1091 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm
940 </source> 1092 </source>
1093 <target>
1094 Ad ogni richiesta inviata, il tracker risponde con un numero limitato di nodi casuali.
1095 Per esempio, se 1000 nodi appartengono allo swarm (sciame) e il tracker restituisce solo 20 nodi a ogni richiesta, sono necessarie almeno 50 richieste per conoscere tutti i nodi dello swarm
1096 </target>
941 <context-group name="null"> 1097 <context-group name="null">
942 <context context-type="linenumber">38</context> 1098 <context context-type="linenumber">38</context>
943 </context-group> 1099 </context-group>
@@ -981,6 +1137,11 @@
981 When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to. 1137 When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
982 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information 1138 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information
983 </source> 1139 </source>
1140 <target>
1141 I nodi non sono accessibili pubblicamente: in quanto usiamo WebRTC nel browser(<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>tramite la libreria WebTorrent <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), il protocollo è diverso dal BitTorrent classico.
1142 Quando usi un browser web, mandi un segnale contenente il tuo indirizzo IP al tracker, il quale selezionerà casualmente altri nodi a cui inoltrare questa informazione.
1143 Per ulteriori informazioni, vedi <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>questo documento<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1144 </target>
984 <context-group name="null"> 1145 <context-group name="null">
985 <context context-type="linenumber">55</context> 1146 <context context-type="linenumber">55</context>
986 </context-group> 1147 </context-group>
@@ -990,12 +1151,17 @@
990 The worst-case scenario of an average person spying on their friends is quite unlikely. 1151 The worst-case scenario of an average person spying on their friends is quite unlikely.
991 There are much more effective ways to get that kind of information. 1152 There are much more effective ways to get that kind of information.
992 </source> 1153 </source>
1154 <target>
1155 La peggiore delle ipotesi, in cui una persona qualunque spia un amico, è molto improbabile.
1156 Ci sono modi molto più efficaci di ottenere questo genere di informazioni.
1157 </target>
993 <context-group name="null"> 1158 <context-group name="null">
994 <context context-type="linenumber">62</context> 1159 <context context-type="linenumber">62</context>
995 </context-group> 1160 </context-group>
996 </trans-unit> 1161 </trans-unit>
997 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf"> 1162 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
998 <source>How does PeerTube compare with YouTube?</source> 1163 <source>How does PeerTube compare with YouTube?</source>
1164 <target>Come si può paragonare PeerTube con YouTube?</target>
999 <context-group name="null"> 1165 <context-group name="null">
1000 <context context-type="linenumber">67</context> 1166 <context context-type="linenumber">67</context>
1001 </context-group> 1167 </context-group>
@@ -1028,25 +1194,22 @@
1028 PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser. 1194 PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser.
1029 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense. 1195 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense.
1030 </source> 1196 </source>
1197 <target>
1198 Il tuo indirizzo IP è pubblico quindi, ogni volta che visiti un sito web, una moltitudine di attori (oltre al sito web finale) vedono il tuo IP nei propri registri: ISP/routers/trackers/CDN e altri.
1199 PeerTube è trasparente al riguardo: ti avvisiamo che, se vuoi mantenere il tuo indirizzo IP privato, devi usare un VPN o il browser Tor.
1200 Pensare che rimuovere la componente P2P da PeerTube ti possa restituire l'anonimato non ha senso.
1201 </target>
1031 <context-group name="null"> 1202 <context-group name="null">
1032 <context context-type="linenumber">77</context> 1203 <context context-type="linenumber">77</context>
1033 </context-group> 1204 </context-group>
1034 </trans-unit> 1205 </trans-unit>
1035 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41"> 1206 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
1036 <source>What will be done to mitigate this problem?</source> 1207 <source>What will be done to mitigate this problem?</source>
1208 <target>Che azioni verranno intraprese per limitare questo problema?</target>
1037 <context-group name="null"> 1209 <context-group name="null">
1038 <context context-type="linenumber">83</context> 1210 <context context-type="linenumber">83</context>
1039 </context-group> 1211 </context-group>
1040 </trans-unit> 1212 </trans-unit>
1041 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
1042 <source>
1043 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
1044 In the meantime, we want to test different ideas related to this issue:
1045 </source>
1046 <context-group name="null">
1047 <context context-type="linenumber">85</context>
1048 </context-group>
1049 </trans-unit>
1050 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1213 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1051 <source>Set a limit to the number of peers sent by the tracker</source> 1214 <source>Set a limit to the number of peers sent by the tracker</source>
1052 <target>Imporre un limite al numero di nodi inviati dal tracker</target> 1215 <target>Imporre un limite al numero di nodi inviati dal tracker</target>
@@ -1077,21 +1240,58 @@
1077 </trans-unit> 1240 </trans-unit>
1078 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6"> 1241 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6">
1079 <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source> 1242 <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source>
1243 <target>Un programma automatico per incrementare la ridondanza dei video: non potremmo sapere se l'indirizzo IP abbia scaricato il video volontariamente o per via del programma automatico</target>
1080 <context-group name="null"> 1244 <context-group name="null">
1081 <context context-type="linenumber">95</context> 1245 <context context-type="linenumber">95</context>
1082 </context-group> 1246 </context-group>
1083 </trans-unit> 1247 </trans-unit>
1248 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1249 <source>Banned</source>
1250 <target>Bannato</target>
1251 <context-group name="null">
1252 <context context-type="linenumber">12</context>
1253 </context-group>
1254 </trans-unit>
1255 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1256 <source>Muted</source>
1257 <target>Silenziato</target>
1258 <context-group name="null">
1259 <context context-type="linenumber">13</context>
1260 </context-group>
1261 </trans-unit>
1262 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1263 <source>Muted by your instance</source>
1264 <target>Silenziato dalla tua istanza</target>
1265 <context-group name="null">
1266 <context context-type="linenumber">14</context>
1267 </context-group>
1268 </trans-unit>
1269 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1270 <source>Instance muted</source>
1271 <target>Istanza silenziata</target>
1272 <context-group name="null">
1273 <context context-type="linenumber">15</context>
1274 </context-group>
1275 </trans-unit>
1276 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1277 <source>Instance muted by your instance</source>
1278 <target>Istanza silenziata dalla tua istanza</target>
1279 <context-group name="null">
1280 <context context-type="linenumber">16</context>
1281 </context-group>
1282 </trans-unit>
1084 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1283 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1085 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1284 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1086 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> iscritti</target> 1285 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> iscritti</target>
1087 <context-group name="null"> 1286 <context-group name="null">
1088 <context context-type="linenumber">12</context> 1287 <context context-type="linenumber">24</context>
1089 </context-group> 1288 </context-group>
1090 </trans-unit> 1289 </trans-unit>
1091 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1290 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1092 <source>Video channels</source> 1291 <source>Video channels</source>
1292 <target>Canali video</target>
1093 <context-group name="null"> 1293 <context-group name="null">
1094 <context context-type="linenumber">19</context> 1294 <context context-type="linenumber">31</context>
1095 </context-group> 1295 </context-group>
1096 </trans-unit> 1296 </trans-unit>
1097 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1297 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1133,41 +1333,49 @@
1133 <source>Short description</source> 1333 <source>Short description</source>
1134 <target>Breve descrizione</target> 1334 <target>Breve descrizione</target>
1135 <context-group name="null"> 1335 <context-group name="null">
1136 <context context-type="linenumber">22</context> 1336 <context context-type="linenumber">21</context>
1337 </context-group>
1338 </trans-unit>
1339 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1340 <source>Default client route</source>
1341 <target>Percorso predefinito del client</target>
1342 <context-group name="null">
1343 <context context-type="linenumber">48</context>
1137 </context-group> 1344 </context-group>
1138 </trans-unit> 1345 </trans-unit>
1139 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1346 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1140 <source>Videos Overview</source> 1347 <source>Videos Overview</source>
1348 <target>Panoramica dei video</target>
1141 <context-group name="null"> 1349 <context-group name="null">
1142 <context context-type="linenumber">58</context> 1350 <context context-type="linenumber">51</context>
1143 </context-group> 1351 </context-group>
1144 </trans-unit> 1352 </trans-unit>
1145 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1353 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1146 <source>Videos Trending</source> 1354 <source>Videos Trending</source>
1147 <target>Video popolari</target> 1355 <target>Video popolari</target>
1148 <context-group name="null"> 1356 <context-group name="null">
1149 <context context-type="linenumber">59</context> 1357 <context context-type="linenumber">52</context>
1150 </context-group> 1358 </context-group>
1151 </trans-unit> 1359 </trans-unit>
1152 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1360 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1153 <source>Videos Recently Added</source> 1361 <source>Videos Recently Added</source>
1154 <target>Video aggiunti di recente</target> 1362 <target>Video aggiunti di recente</target>
1155 <context-group name="null"> 1363 <context-group name="null">
1156 <context context-type="linenumber">60</context> 1364 <context context-type="linenumber">53</context>
1157 </context-group> 1365 </context-group>
1158 </trans-unit> 1366 </trans-unit>
1159 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1367 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1160 <source>Local videos</source> 1368 <source>Local videos</source>
1161 <target>Video locali</target> 1369 <target>Video locali</target>
1162 <context-group name="null"> 1370 <context-group name="null">
1163 <context context-type="linenumber">61</context> 1371 <context context-type="linenumber">54</context>
1164 </context-group> 1372 </context-group>
1165 </trans-unit> 1373 </trans-unit>
1166 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1374 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1167 <source>Policy on videos containing sensitive content</source> 1375 <source>Policy on videos containing sensitive content</source>
1168 <target>Policy su video che contengono contenuti sensibili</target> 1376 <target>Policy su video che contengono contenuti sensibili</target>
1169 <context-group name="null"> 1377 <context-group name="null">
1170 <context context-type="linenumber">70</context> 1378 <context context-type="linenumber">61</context>
1171 </context-group> 1379 </context-group>
1172 </trans-unit> 1380 </trans-unit>
1173 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1381 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1186,29 +1394,58 @@
1186 </trans-unit> 1394 </trans-unit>
1187 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2"> 1395 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2">
1188 <source>Blur thumbnails</source> 1396 <source>Blur thumbnails</source>
1397 <target>Miniature offuscate.</target>
1189 <context-group name="null"> 1398 <context-group name="null">
1190 <context context-type="linenumber">12</context> 1399 <context context-type="linenumber">12</context>
1191 </context-group> 1400 </context-group>
1192 </trans-unit> 1401 </trans-unit>
1402 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e">
1403 <source>Display</source>
1404 <target>Mostra</target>
1405 <context-group name="null">
1406 <context context-type="linenumber">13</context>
1407 </context-group>
1408 </trans-unit>
1193 <trans-unit id="ca53e66e68986546b7ef820c934145fd7c9c4247"> 1409 <trans-unit id="ca53e66e68986546b7ef820c934145fd7c9c4247">
1194 <source>Signup enabled</source> 1410 <source>Signup enabled</source>
1195 <target>Registrazione abilitata</target> 1411 <target>Registrazione abilitata</target>
1196 <context-group name="null"> 1412 <context-group name="null">
1197 <context context-type="linenumber">92</context> 1413 <context context-type="linenumber">84</context>
1198 </context-group> 1414 </context-group>
1199 </trans-unit> 1415 </trans-unit>
1200 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1416 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1201 <source>Signup requires email verification</source> 1417 <source>Signup requires email verification</source>
1202 <target>La registrazione richiede una verifica via email</target> 1418 <target>La registrazione richiede una verifica via email</target>
1203 <context-group name="null"> 1419 <context-group name="null">
1204 <context context-type="linenumber">97</context> 1420 <context context-type="linenumber">91</context>
1205 </context-group> 1421 </context-group>
1206 </trans-unit> 1422 </trans-unit>
1207 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1423 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1208 <source>Signup limit</source> 1424 <source>Signup limit</source>
1209 <target>Limite registrazioni</target> 1425 <target>Limite registrazioni</target>
1210 <context-group name="null"> 1426 <context-group name="null">
1211 <context context-type="linenumber">101</context> 1427 <context context-type="linenumber">96</context>
1428 </context-group>
1429 </trans-unit>
1430 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1431 <source>Users</source>
1432 <target>Utenti</target>
1433 <context-group name="null">
1434 <context context-type="linenumber">105</context>
1435 </context-group>
1436 </trans-unit>
1437 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1438 <source>User default video quota</source>
1439 <target>Quota standard per i video dell'utente</target>
1440 <context-group name="null">
1441 <context context-type="linenumber">109</context>
1442 </context-group>
1443 </trans-unit>
1444 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1445 <source>User default daily upload limit</source>
1446 <target>Limite giornaliero per il caricamento</target>
1447 <context-group name="null">
1448 <context context-type="linenumber">121</context>
1212 </context-group> 1449 </context-group>
1213 </trans-unit> 1450 </trans-unit>
1214 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1451 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1218,51 +1455,32 @@
1218 <context context-type="linenumber">42</context> 1455 <context context-type="linenumber">42</context>
1219 </context-group> 1456 </context-group>
1220 </trans-unit> 1457 </trans-unit>
1221 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1458 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1222 <source>Video import with HTTP enabled</source> 1459 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1223 <target>Carica video con HTTP attivato</target> 1460 <target>Importazione video con indirizzo HTTP (es. YouTube) abilitata</target>
1224 <context-group name="null"> 1461 <context-group name="null">
1225 <context context-type="linenumber">115</context> 1462 <context context-type="linenumber">141</context>
1226 </context-group> 1463 </context-group>
1227 </trans-unit> 1464 </trans-unit>
1228 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1465 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1229 <source>Video import with a torrent file or a magnet URI enabled</source> 1466 <source>Video import with a torrent file or a magnet URI enabled</source>
1230 <target>Carica video con un file torrent o un URI magnete attivo</target> 1467 <target>Carica video con un file torrent o un URI magnete attivo</target>
1231 <context-group name="null"> 1468 <context-group name="null">
1232 <context context-type="linenumber">120</context> 1469 <context context-type="linenumber">148</context>
1233 </context-group> 1470 </context-group>
1234 </trans-unit> 1471 </trans-unit>
1235 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1472 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1236 <source>Administrator</source> 1473 <source>Administrator</source>
1237 <target>Amministratore</target> 1474 <target>Amministratore</target>
1238 <context-group name="null"> 1475 <context-group name="null">
1239 <context context-type="linenumber">123</context> 1476 <context context-type="linenumber">155</context>
1240 </context-group> 1477 </context-group>
1241 </trans-unit> 1478 </trans-unit>
1242 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1479 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1243 <source>Admin email</source> 1480 <source>Admin email</source>
1244 <target>Email Amministratore</target> 1481 <target>Email Amministratore</target>
1245 <context-group name="null"> 1482 <context-group name="null">
1246 <context context-type="linenumber">126</context> 1483 <context context-type="linenumber">158</context>
1247 </context-group>
1248 </trans-unit>
1249 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1250 <source>Users</source>
1251 <target>Utenti</target>
1252 <context-group name="null">
1253 <context context-type="linenumber">136</context>
1254 </context-group>
1255 </trans-unit>
1256 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1257 <source>User default video quota</source>
1258 <context-group name="null">
1259 <context context-type="linenumber">139</context>
1260 </context-group>
1261 </trans-unit>
1262 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1263 <source>User default daily upload limit</source>
1264 <context-group name="null">
1265 <context context-type="linenumber">153</context>
1266 </context-group> 1484 </context-group>
1267 </trans-unit> 1485 </trans-unit>
1268 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1486 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1276,76 +1494,70 @@
1276 <source>Twitter</source> 1494 <source>Twitter</source>
1277 <target>Twitter</target> 1495 <target>Twitter</target>
1278 <context-group name="null"> 1496 <context-group name="null">
1279 <context context-type="linenumber">170</context> 1497 <context context-type="linenumber">178</context>
1280 </context-group> 1498 </context-group>
1281 </trans-unit> 1499 </trans-unit>
1282 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1500 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1283 <source>Your Twitter username</source> 1501 <source>Your Twitter username</source>
1284 <target>Il tuo username Twitter</target> 1502 <target>Il tuo username Twitter</target>
1285 <context-group name="null"> 1503 <context-group name="null">
1286 <context context-type="linenumber">173</context> 1504 <context context-type="linenumber">184</context>
1287 </context-group> 1505 </context-group>
1288 </trans-unit> 1506 </trans-unit>
1289 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1507 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1290 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1508 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1291 <target>Indica l'account Twitter per il sito web o la piattaforma in cui il contenuto e' stato pubblicato.</target> 1509 <target>Indica l'account Twitter per il sito web o la piattaforma in cui il contenuto e' stato pubblicato.</target>
1292 <context-group name="null"> 1510 <context-group name="null">
1293 <context context-type="linenumber">176</context> 1511 <context context-type="linenumber">187</context>
1294 </context-group> 1512 </context-group>
1295 </trans-unit> 1513 </trans-unit>
1296 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1514 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1297 <source>Instance whitelisted by Twitter</source> 1515 <source>Instance whitelisted by Twitter</source>
1516 <target>Istanza inserita in white list da Twitter</target>
1298 <context-group name="null"> 1517 <context-group name="null">
1299 <context context-type="linenumber">189</context> 1518 <context context-type="linenumber">199</context>
1300 </context-group>
1301 </trans-unit>
1302 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1303 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1304 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1305 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1306 <context-group name="null">
1307 <context context-type="linenumber">190</context>
1308 </context-group> 1519 </context-group>
1309 </trans-unit> 1520 </trans-unit>
1310 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1521 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1311 <source>Services</source> 1522 <source>Services</source>
1312 <target>Servizi</target> 1523 <target>Servizi</target>
1313 <context-group name="null"> 1524 <context-group name="null">
1314 <context context-type="linenumber">168</context> 1525 <context context-type="linenumber">176</context>
1315 </context-group> 1526 </context-group>
1316 </trans-unit> 1527 </trans-unit>
1317 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1528 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1318 <source>Transcoding</source> 1529 <source>Transcoding</source>
1319 <target>Trascrizione</target> 1530 <target>Trascrizione</target>
1320 <context-group name="null"> 1531 <context-group name="null">
1321 <context context-type="linenumber">200</context> 1532 <context context-type="linenumber">215</context>
1322 </context-group> 1533 </context-group>
1323 </trans-unit> 1534 </trans-unit>
1324 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1535 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1325 <source>Transcoding enabled</source> 1536 <source>Transcoding enabled</source>
1326 <target>Trascrizione attivata</target> 1537 <target>Trascrizione attivata</target>
1327 <context-group name="null"> 1538 <context-group name="null">
1328 <context context-type="linenumber">204</context> 1539 <context context-type="linenumber">221</context>
1329 </context-group> 1540 </context-group>
1330 </trans-unit> 1541 </trans-unit>
1331 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1542 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1332 <source>If you disable transcoding, many videos from your users will not work!</source> 1543 <source>If you disable transcoding, many videos from your users will not work!</source>
1333 <target>Se disatitvi la trascrizione, molti video dai tuoi utenti non funzioneranno.</target> 1544 <target>Se disatitvi la trascrizione, molti video dai tuoi utenti non funzioneranno.</target>
1334 <context-group name="null"> 1545 <context-group name="null">
1335 <context context-type="linenumber">205</context> 1546 <context context-type="linenumber">222</context>
1336 </context-group> 1547 </context-group>
1337 </trans-unit> 1548 </trans-unit>
1338 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1549 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1339 <source>Transcoding threads</source> 1550 <source>Transcoding threads</source>
1340 <target>Trascrizione thread</target> 1551 <target>Trascrizione thread</target>
1341 <context-group name="null"> 1552 <context-group name="null">
1342 <context context-type="linenumber">211</context> 1553 <context context-type="linenumber">237</context>
1343 </context-group> 1554 </context-group>
1344 </trans-unit> 1555 </trans-unit>
1345 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1556 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1346 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1557 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1558 <target>Risoluzione <x id="INTERPOLATION" equiv-text="{{resolution}}"/> abilitata</target>
1347 <context-group name="null"> 1559 <context-group name="null">
1348 <context context-type="linenumber">227</context> 1560 <context context-type="linenumber">252</context>
1349 </context-group> 1561 </context-group>
1350 </trans-unit> 1562 </trans-unit>
1351 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1563 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1360,89 +1572,70 @@
1360 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1572 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1361 </target> 1573 </target>
1362 <context-group name="null"> 1574 <context-group name="null">
1363 <context context-type="linenumber">233</context> 1575 <context context-type="linenumber">260</context>
1364 </context-group> 1576 </context-group>
1365 </trans-unit> 1577 </trans-unit>
1366 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1578 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1367 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1579 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1580 <target>Alcuni file non sono federati (anteprime, sottotitoli). Li recuperiamo direttamente dall'istanza di origine e li mettiamo in cache.</target>
1368 <context-group name="null"> 1581 <context-group name="null">
1369 <context context-type="linenumber">238</context> 1582 <context context-type="linenumber">265</context>
1370 </context-group> 1583 </context-group>
1371 </trans-unit> 1584 </trans-unit>
1372 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1585 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1373 <source>Previews cache size</source> 1586 <source>Previews cache size</source>
1374 <target>Dimensione del cache per la previsualizzazione</target> 1587 <target>Dimensione del cache per la previsualizzazione</target>
1375 <context-group name="null"> 1588 <context-group name="null">
1376 <context context-type="linenumber">243</context> 1589 <context context-type="linenumber">271</context>
1377 </context-group> 1590 </context-group>
1378 </trans-unit> 1591 </trans-unit>
1379 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1592 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1380 <source>Video captions cache size</source> 1593 <source>Video captions cache size</source>
1381 <target>Dimensione </target> 1594 <target>Dimensione </target>
1382 <context-group name="null"> 1595 <context-group name="null">
1383 <context context-type="linenumber">254</context> 1596 <context context-type="linenumber">280</context>
1384 </context-group> 1597 </context-group>
1385 </trans-unit> 1598 </trans-unit>
1386 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1599 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1387 <source>Customizations</source> 1600 <source>Customizations</source>
1388 <target>Personalizzazioni</target> 1601 <target>Personalizzazioni</target>
1389 <context-group name="null"> 1602 <context-group name="null">
1390 <context context-type="linenumber">264</context> 1603 <context context-type="linenumber">289</context>
1391 </context-group> 1604 </context-group>
1392 </trans-unit> 1605 </trans-unit>
1393 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1606 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1394 <source>JavaScript</source> 1607 <source>JavaScript</source>
1395 <target>JavaScript</target> 1608 <target>JavaScript</target>
1396 <context-group name="null"> 1609 <context-group name="null">
1397 <context context-type="linenumber">267</context> 1610 <context context-type="linenumber">294</context>
1398 </context-group> 1611 </context-group>
1399 </trans-unit> 1612 </trans-unit>
1400 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1613 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1401 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1614 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1402 <target>Scrivi direttamente codice JavaScript .&lt;br /&gt;Esempio: &lt;pre&gt;console.log('La mia istanza spacca!');&lt;/pre&gt;</target> 1615 <target>Scrivi direttamente codice JavaScript .&lt;br /&gt;Esempio: &lt;pre&gt;console.log('La mia istanza spacca!');&lt;/pre&gt;</target>
1403 <context-group name="null"> 1616 <context-group name="null">
1404 <context context-type="linenumber">270</context> 1617 <context context-type="linenumber">297</context>
1405 </context-group>
1406 </trans-unit>
1407 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1408 <source>
1409 Write directly CSS code. Example:&lt;br /&gt;
1410 &lt;pre&gt;
1411 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1412 background-color: red;
1413 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1414 &lt;/pre&gt;
1415
1416 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1417 &lt;pre&gt;
1418 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1419 color: red;
1420 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1421 &lt;/pre&gt;
1422 </source>
1423 <context-group name="null">
1424 <context context-type="linenumber">286</context>
1425 </context-group> 1618 </context-group>
1426 </trans-unit> 1619 </trans-unit>
1427 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1620 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1428 <source>Advanced configuration</source> 1621 <source>Advanced configuration</source>
1429 <target>Configurazione avanzata</target> 1622 <target>Configurazione avanzata</target>
1430 <context-group name="null"> 1623 <context-group name="null">
1431 <context context-type="linenumber">197</context> 1624 <context context-type="linenumber">212</context>
1432 </context-group> 1625 </context-group>
1433 </trans-unit> 1626 </trans-unit>
1434 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1627 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1435 <source>Update configuration</source> 1628 <source>Update configuration</source>
1436 <target>Aggiorna configurazione</target> 1629 <target>Aggiorna configurazione</target>
1437 <context-group name="null"> 1630 <context-group name="null">
1438 <context context-type="linenumber">314</context> 1631 <context context-type="linenumber">340</context>
1439 </context-group> 1632 </context-group>
1440 </trans-unit> 1633 </trans-unit>
1441 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1634 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1442 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1635 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1443 <target>Sembra che la configurazione sia valida. Per favore cerca potenziali errori nelle altre tab</target> 1636 <target>Sembra che la configurazione sia valida. Per favore cerca potenziali errori nelle altre tab</target>
1444 <context-group name="null"> 1637 <context-group name="null">
1445 <context context-type="linenumber">315</context> 1638 <context context-type="linenumber">341</context>
1446 </context-group> 1639 </context-group>
1447 </trans-unit> 1640 </trans-unit>
1448 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1641 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1460,6 +1653,9 @@
1460 <source> 1653 <source>
1461 Manage follows 1654 Manage follows
1462 </source> 1655 </source>
1656 <target>
1657 Gestisci le richieste di seguirti
1658 </target>
1463 <context-group name="null"> 1659 <context-group name="null">
1464 <context context-type="linenumber">7</context> 1660 <context context-type="linenumber">7</context>
1465 </context-group> 1661 </context-group>
@@ -1508,10 +1704,20 @@
1508 <source> 1704 <source>
1509 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers. 1705 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers.
1510 </source> 1706 </source>
1707 <target>
1708 Sembra che tu non sia su un server HTTPS. Il tuo web server ha bisogno di avere TLS attivato per poter seguire altri servers.
1709 </target>
1511 <context-group name="null"> 1710 <context-group name="null">
1512 <context context-type="linenumber">17</context> 1711 <context context-type="linenumber">17</context>
1513 </context-group> 1712 </context-group>
1514 </trans-unit> 1713 </trans-unit>
1714 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1715 <source>Filter...</source>
1716 <target>Filtra...</target>
1717 <context-group name="null">
1718 <context context-type="linenumber">27</context>
1719 </context-group>
1720 </trans-unit>
1515 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1721 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1516 <source>ID</source> 1722 <source>ID</source>
1517 <target>ID</target> 1723 <target>ID</target>
@@ -1523,18 +1729,19 @@
1523 <source>Score</source> 1729 <source>Score</source>
1524 <target>Punteggio</target> 1730 <target>Punteggio</target>
1525 <context-group name="null"> 1731 <context-group name="null">
1526 <context context-type="linenumber">8</context> 1732 <context context-type="linenumber">17</context>
1527 </context-group> 1733 </context-group>
1528 </trans-unit> 1734 </trans-unit>
1529 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1735 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1530 <source>Host</source> 1736 <source>Host</source>
1531 <target>Host</target> 1737 <target>Host</target>
1532 <context-group name="null"> 1738 <context-group name="null">
1533 <context context-type="linenumber">8</context> 1739 <context context-type="linenumber">19</context>
1534 </context-group> 1740 </context-group>
1535 </trans-unit> 1741 </trans-unit>
1536 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1742 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
1537 <source>State</source> 1743 <source>State</source>
1744 <target>Stato</target>
1538 <context-group name="null"> 1745 <context-group name="null">
1539 <context context-type="linenumber">10</context> 1746 <context context-type="linenumber">10</context>
1540 </context-group> 1747 </context-group>
@@ -1546,6 +1753,27 @@
1546 <context context-type="linenumber">11</context> 1753 <context context-type="linenumber">11</context>
1547 </context-group> 1754 </context-group>
1548 </trans-unit> 1755 </trans-unit>
1756 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1757 <source>Accepted</source>
1758 <target>Accettato</target>
1759 <context-group name="null">
1760 <context context-type="linenumber">32</context>
1761 </context-group>
1762 </trans-unit>
1763 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1764 <source>Pending</source>
1765 <target>In attesa</target>
1766 <context-group name="null">
1767 <context context-type="linenumber">33</context>
1768 </context-group>
1769 </trans-unit>
1770 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1771 <source>Redundancy allowed</source>
1772 <target>Ridondanza permessa</target>
1773 <context-group name="null">
1774 <context context-type="linenumber">22</context>
1775 </context-group>
1776 </trans-unit>
1549 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1777 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1550 <source>Manage follows</source> 1778 <source>Manage follows</source>
1551 <target>Gestisci chi segui</target> 1779 <target>Gestisci chi segui</target>
@@ -1569,6 +1797,7 @@
1569 </trans-unit> 1797 </trans-unit>
1570 <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e"> 1798 <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e">
1571 <source>Followers</source> 1799 <source>Followers</source>
1800 <target>Chi ti segue</target>
1572 <context-group name="null"> 1801 <context-group name="null">
1573 <context context-type="linenumber">9</context> 1802 <context context-type="linenumber">9</context>
1574 </context-group> 1803 </context-group>
@@ -1595,8 +1824,7 @@
1595 </context-group> 1824 </context-group>
1596 </trans-unit> 1825 </trans-unit>
1597 <trans-unit id="4fa08915c99629d38c9da8a08b1985a7f4e38e40"> 1826 <trans-unit id="4fa08915c99629d38c9da8a08b1985a7f4e38e40">
1598 <source>Finished on</source> 1827 <source>Finished on</source><target>Finished on</target><context-group name="null">
1599 <context-group name="null">
1600 <context context-type="linenumber">23</context> 1828 <context context-type="linenumber">23</context>
1601 </context-group> 1829 </context-group>
1602 </trans-unit> 1830 </trans-unit>
@@ -1632,7 +1860,7 @@
1632 <source>Role</source> 1860 <source>Role</source>
1633 <target>Ruolo</target> 1861 <target>Ruolo</target>
1634 <context-group name="null"> 1862 <context-group name="null">
1635 <context context-type="linenumber">20</context> 1863 <context context-type="linenumber">43</context>
1636 </context-group> 1864 </context-group>
1637 </trans-unit> 1865 </trans-unit>
1638 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1866 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1640,6 +1868,10 @@
1640 Transcoding is enabled on server. The video quota only take in account <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>original<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> 1868 Transcoding is enabled on server. The video quota only take in account <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>original<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/>
1641 At most, this user could use ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>. 1869 At most, this user could use ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>.
1642 </source> 1870 </source>
1871 <target>
1872 Il Transcoding e abilitato sul server. La quota video considera solo <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>originale<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/>
1873 In totale, questo utente potrebbe usare ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>.
1874 </target>
1643 <context-group name="null"> 1875 <context-group name="null">
1644 <context context-type="linenumber">65</context> 1876 <context context-type="linenumber">65</context>
1645 </context-group> 1877 </context-group>
@@ -1651,34 +1883,6 @@
1651 <context context-type="linenumber">72</context> 1883 <context context-type="linenumber">72</context>
1652 </context-group> 1884 </context-group>
1653 </trans-unit> 1885 </trans-unit>
1654 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33">
1655 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source>
1656 <context-group name="null">
1657 <context context-type="linenumber">3</context>
1658 </context-group>
1659 </trans-unit>
1660 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1661 <source>Reason...</source>
1662 <target>Motivo...</target>
1663 <context-group name="null">
1664 <context context-type="linenumber">11</context>
1665 </context-group>
1666 </trans-unit>
1667 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
1668 <source>
1669 A banned user will no longer be able to login.
1670 </source>
1671 <context-group name="null">
1672 <context context-type="linenumber">17</context>
1673 </context-group>
1674 </trans-unit>
1675 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
1676 <source>Ban this user</source>
1677 <target>Banna questo utente</target>
1678 <context-group name="null">
1679 <context context-type="linenumber">25</context>
1680 </context-group>
1681 </trans-unit>
1682 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1886 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1683 <source>Users list</source> 1887 <source>Users list</source>
1684 <target>Lista utenti</target> 1888 <target>Lista utenti</target>
@@ -1686,24 +1890,35 @@
1686 <context context-type="linenumber">2</context> 1890 <context context-type="linenumber">2</context>
1687 </context-group> 1891 </context-group>
1688 </trans-unit> 1892 </trans-unit>
1893 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1894 <source>Batch actions</source><target>Batch actions</target><context-group name="null">
1895 <context context-type="linenumber">19</context>
1896 </context-group>
1897 </trans-unit>
1689 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1898 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1690 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1899 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source><target>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target><context-group name="null">
1900 <context context-type="linenumber">40</context>
1901 </context-group>
1902 </trans-unit>
1903 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1904 <source>(banned)</source>
1905 <target>(bannato)</target>
1691 <context-group name="null"> 1906 <context-group name="null">
1692 <context context-type="linenumber">17</context> 1907 <context context-type="linenumber">65</context>
1693 </context-group> 1908 </context-group>
1694 </trans-unit> 1909 </trans-unit>
1695 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1910 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1696 <source>Actions</source> 1911 <source>Go to the account page</source>
1697 <target>Azioni</target> 1912 <target>Vai alla pagina dell'account</target>
1698 <context-group name="null"> 1913 <context-group name="null">
1699 <context context-type="linenumber">33</context> 1914 <context context-type="linenumber">133</context>
1700 </context-group> 1915 </context-group>
1701 </trans-unit> 1916 </trans-unit>
1702 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1917 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1703 <source>Ban reason:</source> 1918 <source>Ban reason:</source>
1704 <target>Motivo ban:</target> 1919 <target>Motivo ban:</target>
1705 <context-group name="null"> 1920 <context-group name="null">
1706 <context context-type="linenumber">51</context> 1921 <context context-type="linenumber">95</context>
1707 </context-group> 1922 </context-group>
1708 </trans-unit> 1923 </trans-unit>
1709 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1924 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1731,6 +1946,11 @@
1731 <context context-type="linenumber">25</context> 1946 <context context-type="linenumber">25</context>
1732 </context-group> 1947 </context-group>
1733 </trans-unit> 1948 </trans-unit>
1949 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
1950 <source>Reporter</source><target>Reporter</target><context-group name="null">
1951 <context context-type="linenumber">8</context>
1952 </context-group>
1953 </trans-unit>
1734 <trans-unit id="2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4"> 1954 <trans-unit id="2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4">
1735 <source>Video</source> 1955 <source>Video</source>
1736 <target>Video</target> 1956 <target>Video</target>
@@ -1747,6 +1967,7 @@
1747 </trans-unit> 1967 </trans-unit>
1748 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7"> 1968 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
1749 <source>Go to the account</source> 1969 <source>Go to the account</source>
1970 <target>Vai all'account</target>
1750 <context-group name="null"> 1971 <context-group name="null">
1751 <context context-type="linenumber">27</context> 1972 <context context-type="linenumber">27</context>
1752 </context-group> 1973 </context-group>
@@ -1758,6 +1979,13 @@
1758 <context context-type="linenumber">33</context> 1979 <context context-type="linenumber">33</context>
1759 </context-group> 1980 </context-group>
1760 </trans-unit> 1981 </trans-unit>
1982 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1983 <source>Actions</source>
1984 <target>Azioni</target>
1985 <context-group name="null">
1986 <context context-type="linenumber">35</context>
1987 </context-group>
1988 </trans-unit>
1761 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1989 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1762 <source>Reason:</source> 1990 <source>Reason:</source>
1763 <target>Motivo:</target> 1991 <target>Motivo:</target>
@@ -1781,6 +2009,7 @@
1781 </trans-unit> 2009 </trans-unit>
1782 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a"> 2010 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
1783 <source>Sensitive</source> 2011 <source>Sensitive</source>
2012 <target>Sensibile</target>
1784 <context-group name="null"> 2013 <context-group name="null">
1785 <context context-type="linenumber">9</context> 2014 <context context-type="linenumber">9</context>
1786 </context-group> 2015 </context-group>
@@ -1789,13 +2018,14 @@
1789 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2018 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1790 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2019 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1791 <context-group name="null"> 2020 <context-group name="null">
1792 <context context-type="linenumber">10</context> 2021 <context context-type="linenumber">11</context>
1793 </context-group> 2022 </context-group>
1794 </trans-unit> 2023 </trans-unit>
1795 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2024 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1796 <source>Blacklist reason:</source> 2025 <source>Blacklist reason:</source>
2026 <target>motivo per essere in Blacklist:</target>
1797 <context-group name="null"> 2027 <context-group name="null">
1798 <context context-type="linenumber">41</context> 2028 <context context-type="linenumber">43</context>
1799 </context-group> 2029 </context-group>
1800 </trans-unit> 2030 </trans-unit>
1801 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2031 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1805,50 +2035,46 @@
1805 <context context-type="linenumber">2</context> 2035 <context context-type="linenumber">2</context>
1806 </context-group> 2036 </context-group>
1807 </trans-unit> 2037 </trans-unit>
1808 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2038 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
1809 <source>Blacklisted videos</source> 2039 <source>Video abuses</source>
1810 <context-group name="null"> 2040 <target>Abusi video</target>
1811 <context context-type="linenumber">7</context>
1812 </context-group>
1813 </trans-unit>
1814 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1815 <source>My settings</source>
1816 <context-group name="null"> 2041 <context-group name="null">
1817 <context context-type="linenumber">3</context> 2042 <context context-type="linenumber">5</context>
1818 </context-group> 2043 </context-group>
1819 </trans-unit> 2044 </trans-unit>
1820 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2045 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1821 <source>My channels</source> 2046 <source>Blacklisted videos</source>
1822 <target>I miei canali</target> 2047 <target>Video in blacklist</target>
1823 <context-group name="null"> 2048 <context-group name="null">
1824 <context context-type="linenumber">12</context> 2049 <context context-type="linenumber">7</context>
1825 </context-group> 2050 </context-group>
1826 </trans-unit> 2051 </trans-unit>
1827 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2052 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1828 <source>My videos</source> 2053 <source>Muted accounts</source>
1829 <target>I miei video</target> 2054 <target>Account silenziati</target>
1830 <context-group name="null"> 2055 <context-group name="null">
1831 <context context-type="linenumber">14</context> 2056 <context context-type="linenumber">2</context>
1832 </context-group> 2057 </context-group>
1833 </trans-unit> 2058 </trans-unit>
1834 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9"> 2059 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1835 <source>My subscriptions</source> 2060 <source>Muted servers</source>
1836 <target>Le mie sottoscrizioni</target> 2061 <target>Server silenziati</target>
1837 <context-group name="null"> 2062 <context-group name="null">
1838 <context context-type="linenumber">16</context> 2063 <context context-type="linenumber">11</context>
1839 </context-group> 2064 </context-group>
1840 </trans-unit> 2065 </trans-unit>
1841 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed"> 2066 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1842 <source>My imports</source> 2067 <source>Account</source>
2068 <target>Account</target>
1843 <context-group name="null"> 2069 <context-group name="null">
1844 <context context-type="linenumber">18</context> 2070 <context context-type="linenumber">12</context>
1845 </context-group> 2071 </context-group>
1846 </trans-unit> 2072 </trans-unit>
1847 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7"> 2073 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1848 <source>Ownership changes</source> 2074 <source>Unmute</source>
1849 <target>Cambi di proprietario</target> 2075 <target>Non silenziare più</target>
1850 <context-group name="null"> 2076 <context-group name="null">
1851 <context context-type="linenumber">22</context> 2077 <context context-type="linenumber">23</context>
1852 </context-group> 2078 </context-group>
1853 </trans-unit> 2079 </trans-unit>
1854 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2080 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1862,24 +2088,26 @@
1862 <source>Profile</source> 2088 <source>Profile</source>
1863 <target>Profilo</target> 2089 <target>Profilo</target>
1864 <context-group name="null"> 2090 <context-group name="null">
1865 <context context-type="linenumber">8</context> 2091 <context context-type="linenumber">7</context>
1866 </context-group> 2092 </context-group>
1867 </trans-unit> 2093 </trans-unit>
1868 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2094 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1869 <source>Video settings</source> 2095 <source>Video settings</source>
1870 <target>Impostazione video</target> 2096 <target>Impostazione video</target>
1871 <context-group name="null"> 2097 <context-group name="null">
1872 <context context-type="linenumber">15</context> 2098 <context context-type="linenumber">16</context>
1873 </context-group> 2099 </context-group>
1874 </trans-unit> 2100 </trans-unit>
1875 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2101 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1876 <source>Danger zone</source> 2102 <source>Danger zone</source>
2103 <target>Zona pericolosa</target>
1877 <context-group name="null"> 2104 <context-group name="null">
1878 <context context-type="linenumber">18</context> 2105 <context context-type="linenumber">19</context>
1879 </context-group> 2106 </context-group>
1880 </trans-unit> 2107 </trans-unit>
1881 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2108 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
1882 <source>Change ownership</source> 2109 <source>Change ownership</source>
2110 <target>Cambia proprietà</target>
1883 <context-group name="null"> 2111 <context-group name="null">
1884 <context context-type="linenumber">46</context> 2112 <context context-type="linenumber">46</context>
1885 </context-group> 2113 </context-group>
@@ -1902,13 +2130,6 @@
1902 <context context-type="linenumber">35</context> 2130 <context context-type="linenumber">35</context>
1903 </context-group> 2131 </context-group>
1904 </trans-unit> 2132 </trans-unit>
1905 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1906 <source>Submit</source>
1907 <target>Invia</target>
1908 <context-group name="null">
1909 <context context-type="linenumber">24</context>
1910 </context-group>
1911 </trans-unit>
1912 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2133 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1913 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2134 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1914 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target> 2135 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target>
@@ -1918,6 +2139,7 @@
1918 </trans-unit> 2139 </trans-unit>
1919 <trans-unit id="4a806761798181e907e28ed1af053d466526800d"> 2140 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
1920 <source>Blacklisted</source> 2141 <source>Blacklisted</source>
2142 <target>In blacklist</target>
1921 <context-group name="null"> 2143 <context-group name="null">
1922 <context context-type="linenumber">22</context> 2144 <context context-type="linenumber">22</context>
1923 </context-group> 2145 </context-group>
@@ -1963,6 +2185,7 @@
1963 </trans-unit> 2185 </trans-unit>
1964 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9"> 2186 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
1965 <source>Display name</source> 2187 <source>Display name</source>
2188 <target>Nome visualizzato</target>
1966 <context-group name="null"> 2189 <context-group name="null">
1967 <context context-type="linenumber">6</context> 2190 <context context-type="linenumber">6</context>
1968 </context-group> 2191 </context-group>
@@ -1970,10 +2193,26 @@
1970 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a"> 2193 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a">
1971 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt; 2194 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt;
1972When you will upload a video in this channel, the video support field will be automatically filled by this text.</source> 2195When you will upload a video in this channel, the video support field will be automatically filled by this text.</source>
2196 <target>Breve testo per dire alla gente come possono supportare il tuo canale (iscrizione piattaforma...).&lt;br /&gt;&lt;br /&gt;
2197Quando tu carichi un video su questo canale. il campo di supporto per il video verra riempito con questo testo.</target>
1973 <context-group name="null"> 2198 <context-group name="null">
1974 <context context-type="linenumber">52</context> 2199 <context context-type="linenumber">52</context>
1975 </context-group> 2200 </context-group>
1976 </trans-unit> 2201 </trans-unit>
2202 <trans-unit id="38baeb215c17af9d9e295e371a57f4a48ab4c191">
2203 <source>Target</source>
2204 <target>Obiettivo</target>
2205 <context-group name="null">
2206 <context context-type="linenumber">8</context>
2207 </context-group>
2208 </trans-unit>
2209 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2210 <source>You don't have any subscriptions yet.</source>
2211 <target>Non hai ancora nessun iscritto.</target>
2212 <context-group name="null">
2213 <context context-type="linenumber">1</context>
2214 </context-group>
2215 </trans-unit>
1977 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2216 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
1978 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2217 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
1979 <target>Creato da <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2218 <target>Creato da <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -2002,6 +2241,13 @@ When you will upload a video in this channel, the video support field will be au
2002 <context context-type="linenumber">9</context> 2241 <context context-type="linenumber">9</context>
2003 </context-group> 2242 </context-group>
2004 </trans-unit> 2243 </trans-unit>
2244 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2245 <source>Initiator</source>
2246 <target>Iniziato da</target>
2247 <context-group name="null">
2248 <context context-type="linenumber">13</context>
2249 </context-group>
2250 </trans-unit>
2005 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02"> 2251 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2006 <source> 2252 <source>
2007 Created 2253 Created
@@ -2038,10 +2284,18 @@ When you will upload a video in this channel, the video support field will be au
2038 </trans-unit> 2284 </trans-unit>
2039 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2"> 2285 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2040 <source>Refuse</source> 2286 <source>Refuse</source>
2287 <target>Rifiuta</target>
2041 <context-group name="null"> 2288 <context-group name="null">
2042 <context context-type="linenumber">47</context> 2289 <context context-type="linenumber">47</context>
2043 </context-group> 2290 </context-group>
2044 </trans-unit> 2291 </trans-unit>
2292 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2293 <source>Muted instances</source>
2294 <target>Istanze silenziate</target>
2295 <context-group name="null">
2296 <context context-type="linenumber">2</context>
2297 </context-group>
2298 </trans-unit>
2045 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2299 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2046 <source>Change password</source> 2300 <source>Change password</source>
2047 <target>Cambia password</target> 2301 <target>Cambia password</target>
@@ -2049,6 +2303,13 @@ When you will upload a video in this channel, the video support field will be au
2049 <context context-type="linenumber">30</context> 2303 <context context-type="linenumber">30</context>
2050 </context-group> 2304 </context-group>
2051 </trans-unit> 2305 </trans-unit>
2306 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2307 <source>Current password</source>
2308 <target>Password attuale</target>
2309 <context-group name="null">
2310 <context context-type="linenumber">7</context>
2311 </context-group>
2312 </trans-unit>
2052 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2313 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2053 <source>New password</source> 2314 <source>New password</source>
2054 <target>Nuova password</target> 2315 <target>Nuova password</target>
@@ -2065,22 +2326,30 @@ When you will upload a video in this channel, the video support field will be au
2065 </trans-unit> 2326 </trans-unit>
2066 <trans-unit id="20f62f24170d57b1efeb2387a0949f482cd4d129"> 2327 <trans-unit id="20f62f24170d57b1efeb2387a0949f482cd4d129">
2067 <source>Default policy on videos containing sensitive content</source> 2328 <source>Default policy on videos containing sensitive content</source>
2329 <target>Regole predefinite su video con contenuti sensibili</target>
2068 <context-group name="null"> 2330 <context-group name="null">
2069 <context context-type="linenumber">3</context> 2331 <context context-type="linenumber">3</context>
2070 </context-group> 2332 </context-group>
2071 </trans-unit> 2333 </trans-unit>
2334 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2335 <source>Use WebTorrent to exchange parts of the video with others</source>
2336 <target>Usa WebTorrent per scambiare parti di video con gli altri</target>
2337 <context-group name="null">
2338 <context context-type="linenumber">21</context>
2339 </context-group>
2340 </trans-unit>
2072 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2341 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2073 <source>Automatically plays video</source> 2342 <source>Automatically plays video</source>
2074 <target>Riproduci automaticamente video</target> 2343 <target>Riproduci automaticamente video</target>
2075 <context-group name="null"> 2344 <context-group name="null">
2076 <context context-type="linenumber">20</context> 2345 <context context-type="linenumber">28</context>
2077 </context-group> 2346 </context-group>
2078 </trans-unit> 2347 </trans-unit>
2079 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2348 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2080 <source>Save</source> 2349 <source>Save</source>
2081 <target>Salva</target> 2350 <target>Salva</target>
2082 <context-group name="null"> 2351 <context-group name="null">
2083 <context context-type="linenumber">23</context> 2352 <context context-type="linenumber">32</context>
2084 </context-group> 2353 </context-group>
2085 </trans-unit> 2354 </trans-unit>
2086 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2355 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2090,6 +2359,13 @@ When you will upload a video in this channel, the video support field will be au
2090 <context context-type="linenumber">27</context> 2359 <context context-type="linenumber">27</context>
2091 </context-group> 2360 </context-group>
2092 </trans-unit> 2361 </trans-unit>
2362 <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
2363 <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
2364 <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> iscritti</target>
2365 <context-group name="null">
2366 <context context-type="linenumber">10</context>
2367 </context-group>
2368 </trans-unit>
2093 <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5"> 2369 <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5">
2094 <source>Change the avatar</source> 2370 <source>Change the avatar</source>
2095 <target>Cambia avatar</target> 2371 <target>Cambia avatar</target>
@@ -2104,6 +2380,13 @@ When you will upload a video in this channel, the video support field will be au
2104 <context context-type="linenumber">18</context> 2380 <context context-type="linenumber">18</context>
2105 </context-group> 2381 </context-group>
2106 </trans-unit> 2382 </trans-unit>
2383 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2384 <source>Once you delete your account, there is no going back. Please be certain.</source>
2385 <target>Una volta eliminato il tuo account, non puoi più tornare indietro. Per favore sii certo di questo.</target>
2386 <context-group name="null">
2387 <context context-type="linenumber">2</context>
2388 </context-group>
2389 </trans-unit>
2107 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2390 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2108 <source>Delete your account</source> 2391 <source>Delete your account</source>
2109 <target>Elimina il tuo account</target> 2392 <target>Elimina il tuo account</target>
@@ -2144,12 +2427,16 @@ When you will upload a video in this channel, the video support field will be au
2144 <source> 2427 <source>
2145 Request email for account verification 2428 Request email for account verification
2146 </source> 2429 </source>
2430 <target>
2431 Richiedi email per verificare l'account
2432 </target>
2147 <context-group name="null"> 2433 <context-group name="null">
2148 <context context-type="linenumber">2</context> 2434 <context context-type="linenumber">2</context>
2149 </context-group> 2435 </context-group>
2150 </trans-unit> 2436 </trans-unit>
2151 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af"> 2437 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
2152 <source>Send verification email</source> 2438 <source>Send verification email</source>
2439 <target>Spedisci email di verifica</target>
2153 <context-group name="null"> 2440 <context-group name="null">
2154 <context context-type="linenumber">17</context> 2441 <context context-type="linenumber">17</context>
2155 </context-group> 2442 </context-group>
@@ -2207,8 +2494,18 @@ When you will upload a video in this channel, the video support field will be au
2207 <source> 2494 <source>
2208 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2495 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
2209</source> 2496</source>
2497 <target>
2498 Congratulazioni, il video presente all'indirizzo <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> sarà importato! Puoi già aggiungere informazioni relative a questo video.
2499</target>
2210 <context-group name="null"> 2500 <context-group name="null">
2211 <context context-type="linenumber">40</context> 2501 <context context-type="linenumber">46</context>
2502 </context-group>
2503 </trans-unit>
2504 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
2505 <source>Update</source>
2506 <target>Aggiorna</target>
2507 <context-group name="null">
2508 <context context-type="linenumber">92</context>
2212 </context-group> 2509 </context-group>
2213 </trans-unit> 2510 </trans-unit>
2214 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9"> 2511 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9">
@@ -2218,17 +2515,25 @@ When you will upload a video in this channel, the video support field will be au
2218 <context context-type="linenumber">6</context> 2515 <context context-type="linenumber">6</context>
2219 </context-group> 2516 </context-group>
2220 </trans-unit> 2517 </trans-unit>
2518 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2519 <source>Scheduled</source>
2520 <target>Programmato</target>
2521 <context-group name="null">
2522 <context context-type="linenumber">25</context>
2523 </context-group>
2524 </trans-unit>
2221 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2525 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
2222 <source>Publish will be available when upload is finished</source> 2526 <source>Publish will be available when upload is finished</source>
2527 <target>La pubblicazione sarà disponibile quando il caricamento sarà completato</target>
2223 <context-group name="null"> 2528 <context-group name="null">
2224 <context context-type="linenumber">48</context> 2529 <context context-type="linenumber">58</context>
2225 </context-group> 2530 </context-group>
2226 </trans-unit> 2531 </trans-unit>
2227 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2532 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2228 <source>Publish</source> 2533 <source>Publish</source>
2229 <target>Pubblica</target> 2534 <target>Pubblica</target>
2230 <context-group name="null"> 2535 <context-group name="null">
2231 <context context-type="linenumber">55</context> 2536 <context context-type="linenumber">65</context>
2232 </context-group> 2537 </context-group>
2233 </trans-unit> 2538 </trans-unit>
2234 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2539 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2238,8 +2543,16 @@ When you will upload a video in this channel, the video support field will be au
2238 <context context-type="linenumber">6</context> 2543 <context context-type="linenumber">6</context>
2239 </context-group> 2544 </context-group>
2240 </trans-unit> 2545 </trans-unit>
2546 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2547 <source>Or</source>
2548 <target>O</target>
2549 <context-group name="null">
2550 <context context-type="linenumber">11</context>
2551 </context-group>
2552 </trans-unit>
2241 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2553 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2242 <source>Paste magnet URI</source> 2554 <source>Paste magnet URI</source>
2555 <target>Incolla un magnet URI</target>
2243 <context-group name="null"> 2556 <context-group name="null">
2244 <context context-type="linenumber">14</context> 2557 <context context-type="linenumber">14</context>
2245 </context-group> 2558 </context-group>
@@ -2259,7 +2572,7 @@ When you will upload a video in this channel, the video support field will be au
2259 Congratulazioni, il video verrá importato con BitTorrent! Puoi già aggiungere informazioni relative a questo video. 2572 Congratulazioni, il video verrá importato con BitTorrent! Puoi già aggiungere informazioni relative a questo video.
2260</target> 2573</target>
2261 <context-group name="null"> 2574 <context-group name="null">
2262 <context context-type="linenumber">48</context> 2575 <context context-type="linenumber">53</context>
2263 </context-group> 2576 </context-group>
2264 </trans-unit> 2577 </trans-unit>
2265 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2578 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2305,8 +2618,7 @@ When you will upload a video in this channel, the video support field will be au
2305 </context-group> 2618 </context-group>
2306 </trans-unit> 2619 </trans-unit>
2307 <trans-unit id="6bad752cfcac8f3572bdf2c619daec683d56d1a8"> 2620 <trans-unit id="6bad752cfcac8f3572bdf2c619daec683d56d1a8">
2308 <source>Select the caption file</source> 2621 <source>Select the caption file</source><target>Select the caption file</target><context-group name="null">
2309 <context-group name="null">
2310 <context context-type="linenumber">24</context> 2622 <context context-type="linenumber">24</context>
2311 </context-group> 2623 </context-group>
2312 </trans-unit> 2624 </trans-unit>
@@ -2349,6 +2661,20 @@ When you will upload a video in this channel, the video support field will be au
2349 <context context-type="linenumber">18</context> 2661 <context context-type="linenumber">18</context>
2350 </context-group> 2662 </context-group>
2351 </trans-unit> 2663 </trans-unit>
2664 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2665 <source>+ Tag</source>
2666 <target>+ Etichetta</target>
2667 <context-group name="null">
2668 <context context-type="linenumber">21</context>
2669 </context-group>
2670 </trans-unit>
2671 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2672 <source>Enter a new tag</source>
2673 <target>Inserisci una nuova etichetta</target>
2674 <context-group name="null">
2675 <context context-type="linenumber">21</context>
2676 </context-group>
2677 </trans-unit>
2352 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2678 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2353 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2679 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2354 <target>Le descrizioni dei video sono troncate di default e richiedono una azione manuale per espanderle.</target> 2680 <target>Le descrizioni dei video sono troncate di default e richiedono una azione manuale per espanderle.</target>
@@ -2385,15 +2711,13 @@ When you will upload a video in this channel, the video support field will be au
2385 </context-group> 2711 </context-group>
2386 </trans-unit> 2712 </trans-unit>
2387 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0"> 2713 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
2388 <source>Wait transcoding before publishing the video</source> 2714 <source>Wait transcoding before publishing the video</source><target>Wait transcoding before publishing the video</target><context-group name="null">
2389 <context-group name="null"> 2715 <context context-type="linenumber">131</context>
2390 <context context-type="linenumber">130</context>
2391 </context-group> 2716 </context-group>
2392 </trans-unit> 2717 </trans-unit>
2393 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2718 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2394 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2719 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source><target>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</target><context-group name="null">
2395 <context-group name="null"> 2720 <context context-type="linenumber">132</context>
2396 <context context-type="linenumber">131</context>
2397 </context-group> 2721 </context-group>
2398 </trans-unit> 2722 </trans-unit>
2399 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2723 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2407,47 +2731,45 @@ When you will upload a video in this channel, the video support field will be au
2407 <source>Add another caption</source> 2731 <source>Add another caption</source>
2408 <target>Aggiungi un'altra descrizione</target> 2732 <target>Aggiungi un'altra descrizione</target>
2409 <context-group name="null"> 2733 <context-group name="null">
2410 <context context-type="linenumber">146</context> 2734 <context context-type="linenumber">147</context>
2411 </context-group> 2735 </context-group>
2412 </trans-unit> 2736 </trans-unit>
2413 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2737 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2414 <source>See the subtitle file</source> 2738 <source>See the subtitle file</source>
2415 <target>Guarda il file dei sottotitoli</target> 2739 <target>Guarda il file dei sottotitoli</target>
2416 <context-group name="null"> 2740 <context-group name="null">
2417 <context context-type="linenumber">155</context> 2741 <context context-type="linenumber">156</context>
2418 </context-group> 2742 </context-group>
2419 </trans-unit> 2743 </trans-unit>
2420 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2744 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2421 <source>Cancel create</source> 2745 <source>Cancel create</source>
2422 <target>Annulla creazione</target> 2746 <target>Annulla creazione</target>
2423 <context-group name="null"> 2747 <context-group name="null">
2424 <context context-type="linenumber">169</context> 2748 <context context-type="linenumber">170</context>
2425 </context-group> 2749 </context-group>
2426 </trans-unit> 2750 </trans-unit>
2427 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2751 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2428 <source>Cancel deletion</source> 2752 <source>Cancel deletion</source>
2429 <target>Annulla creazione</target> 2753 <target>Annulla creazione</target>
2430 <context-group name="null"> 2754 <context-group name="null">
2431 <context context-type="linenumber">177</context> 2755 <context context-type="linenumber">178</context>
2432 </context-group> 2756 </context-group>
2433 </trans-unit> 2757 </trans-unit>
2434 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2758 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2435 <source>Captions</source> 2759 <source>Captions</source><target>Captions</target><context-group name="null">
2436 <context-group name="null"> 2760 <context context-type="linenumber">140</context>
2437 <context context-type="linenumber">139</context>
2438 </context-group> 2761 </context-group>
2439 </trans-unit> 2762 </trans-unit>
2440 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2763 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2441 <source>Upload thumbnail</source> 2764 <source>Upload thumbnail</source>
2442 <target>Carica miniatura</target> 2765 <target>Carica miniatura</target>
2443 <context-group name="null"> 2766 <context-group name="null">
2444 <context context-type="linenumber">195</context> 2767 <context context-type="linenumber">196</context>
2445 </context-group> 2768 </context-group>
2446 </trans-unit> 2769 </trans-unit>
2447 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2770 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2448 <source>Upload preview</source> 2771 <source>Upload preview</source><target>Upload preview</target><context-group name="null">
2449 <context-group name="null"> 2772 <context context-type="linenumber">203</context>
2450 <context context-type="linenumber">202</context>
2451 </context-group> 2773 </context-group>
2452 </trans-unit> 2774 </trans-unit>
2453 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2775 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2458,16 +2780,15 @@ When you will upload a video in this channel, the video support field will be au
2458 </context-group> 2780 </context-group>
2459 </trans-unit> 2781 </trans-unit>
2460 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0"> 2782 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
2461 <source>Short text to tell people how they can support you (membership platform...).</source> 2783 <source>Short text to tell people how they can support you (membership platform...).</source><target>Short text to tell people how they can support you (membership platform...).</target><context-group name="null">
2462 <context-group name="null"> 2784 <context context-type="linenumber">210</context>
2463 <context context-type="linenumber">209</context>
2464 </context-group> 2785 </context-group>
2465 </trans-unit> 2786 </trans-unit>
2466 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2787 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2467 <source>Advanced settings</source> 2788 <source>Advanced settings</source>
2468 <target>Impostazioni avanzate</target> 2789 <target>Impostazioni avanzate</target>
2469 <context-group name="null"> 2790 <context-group name="null">
2470 <context context-type="linenumber">190</context> 2791 <context context-type="linenumber">191</context>
2471 </context-group> 2792 </context-group>
2472 </trans-unit> 2793 </trans-unit>
2473 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2794 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2527,17 +2848,6 @@ When you will upload a video in this channel, the video support field will be au
2527 <context context-type="linenumber">3</context> 2848 <context context-type="linenumber">3</context>
2528 </context-group> 2849 </context-group>
2529 </trans-unit> 2850 </trans-unit>
2530 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2531 <source>
2532 Cancel
2533 </source>
2534 <target>
2535 Annulla
2536 </target>
2537 <context-group name="null">
2538 <context context-type="linenumber">19</context>
2539 </context-group>
2540 </trans-unit>
2541 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2851 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2542 <source>Share</source> 2852 <source>Share</source>
2543 <target>Condividi</target> 2853 <target>Condividi</target>
@@ -2546,14 +2856,12 @@ When you will upload a video in this channel, the video support field will be au
2546 </context-group> 2856 </context-group>
2547 </trans-unit> 2857 </trans-unit>
2548 <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f"> 2858 <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f">
2549 <source>QR-Code</source> 2859 <source>QR-Code</source><target>QR-Code</target><context-group name="null">
2550 <context-group name="null">
2551 <context context-type="linenumber">29</context> 2860 <context context-type="linenumber">29</context>
2552 </context-group> 2861 </context-group>
2553 </trans-unit> 2862 </trans-unit>
2554 <trans-unit id="d3b15c3bf4a7ea38d6002d2d2c4781642d30e79c"> 2863 <trans-unit id="d3b15c3bf4a7ea38d6002d2d2c4781642d30e79c">
2555 <source>Embed</source> 2864 <source>Embed</source><target>Embed</target><context-group name="null">
2556 <context-group name="null">
2557 <context context-type="linenumber">34</context> 2865 <context context-type="linenumber">34</context>
2558 </context-group> 2866 </context-group>
2559 </trans-unit> 2867 </trans-unit>
@@ -2561,6 +2869,9 @@ When you will upload a video in this channel, the video support field will be au
2561 <source> 2869 <source>
2562 The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites). 2870 The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
2563 </source> 2871 </source>
2872 <target>
2873 L'url non è sicuro (no HTTPS), quindi il video "incluso" non funzionerà su siti HTTPS (il browser blocca richieste verso siti HTTP su siti in cui HTTPS è abilitato).
2874 </target>
2564 <context-group name="null"> 2875 <context-group name="null">
2565 <context context-type="linenumber">45</context> 2876 <context context-type="linenumber">45</context>
2566 </context-group> 2877 </context-group>
@@ -2583,6 +2894,9 @@ When you will upload a video in this channel, the video support field will be au
2583 <source> 2894 <source>
2584 The video is being imported, it will be available when the import is finished. 2895 The video is being imported, it will be available when the import is finished.
2585 </source> 2896 </source>
2897 <target>
2898 Il video è nella fase di import, sarà disponibile quando l'import sarà completato.
2899 </target>
2586 <context-group name="null"> 2900 <context-group name="null">
2587 <context context-type="linenumber">11</context> 2901 <context context-type="linenumber">11</context>
2588 </context-group> 2902 </context-group>
@@ -2619,6 +2933,9 @@ When you will upload a video in this channel, the video support field will be au
2619 <source> 2933 <source>
2620 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views 2934 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
2621 </source> 2935 </source>
2936 <target>
2937 Pubblicato <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visioni
2938 </target>
2622 <context-group name="null"> 2939 <context-group name="null">
2623 <context context-type="linenumber">37</context> 2940 <context context-type="linenumber">37</context>
2624 </context-group> 2941 </context-group>
@@ -2725,12 +3042,6 @@ When you will upload a video in this channel, the video support field will be au
2725 <context context-type="linenumber">134</context> 3042 <context context-type="linenumber">134</context>
2726 </context-group> 3043 </context-group>
2727 </trans-unit> 3044 </trans-unit>
2728 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2729 <source>Go to the account page</source>
2730 <context-group name="null">
2731 <context context-type="linenumber">133</context>
2732 </context-group>
2733 </trans-unit>
2734 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3045 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2735 <source>Show more</source> 3046 <source>Show more</source>
2736 <target>Mostra di piú</target> 3047 <target>Mostra di piú</target>
@@ -2806,14 +3117,14 @@ Altri video</target>
2806 <source>No comments.</source> 3117 <source>No comments.</source>
2807 <target>Nessun commento.</target> 3118 <target>Nessun commento.</target>
2808 <context-group name="null"> 3119 <context-group name="null">
2809 <context context-type="linenumber">18</context> 3120 <context context-type="linenumber">17</context>
2810 </context-group> 3121 </context-group>
2811 </trans-unit> 3122 </trans-unit>
2812 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3123 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2813 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3124 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2814 <target>Visualizza tutte le <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> risposte</target> 3125 <target>Visualizza tutte le <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> risposte</target>
2815 <context-group name="null"> 3126 <context-group name="null">
2816 <context context-type="linenumber">55</context> 3127 <context context-type="linenumber">54</context>
2817 </context-group> 3128 </context-group>
2818 </trans-unit> 3129 </trans-unit>
2819 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3130 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2824,7 +3135,7 @@ Altri video</target>
2824 I commenti sono disabilitati. 3135 I commenti sono disabilitati.
2825 </target> 3136 </target>
2826 <context-group name="null"> 3137 <context-group name="null">
2827 <context context-type="linenumber">64</context> 3138 <context context-type="linenumber">63</context>
2828 </context-group> 3139 </context-group>
2829 </trans-unit> 3140 </trans-unit>
2830 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3141 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -2859,13 +3170,6 @@ Altri video</target>
2859 <context context-type="linenumber">14</context> 3170 <context context-type="linenumber">14</context>
2860 </context-group> 3171 </context-group>
2861 </trans-unit> 3172 </trans-unit>
2862 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2863 <source>Error getting about from server</source>
2864 <target>Errore durante la comunicazione con il server</target>
2865 <context-group name="null">
2866 <context context-type="linenumber">1</context>
2867 </context-group>
2868 </trans-unit>
2869 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3173 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2870 <source>No description</source> 3174 <source>No description</source>
2871 <target>Nessuna descrizione</target> 3175 <target>Nessuna descrizione</target>
@@ -2887,64 +3191,93 @@ Altri video</target>
2887 <context context-type="linenumber">1</context> 3191 <context context-type="linenumber">1</context>
2888 </context-group> 3192 </context-group>
2889 </trans-unit> 3193 </trans-unit>
2890 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3194 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2891 <source>Error</source> 3195 <source>240p</source>
2892 <target>Errore</target> 3196 <target>240p</target>
2893 <context-group name="null"> 3197 <context-group name="null">
2894 <context context-type="linenumber">1</context> 3198 <context context-type="linenumber">1</context>
2895 </context-group> 3199 </context-group>
2896 </trans-unit> 3200 </trans-unit>
2897 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed"> 3201 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
2898 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source> 3202 <source>360p</source>
2899 <target>Hai inserito un testo personalizzato <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target> 3203 <target>360p</target>
2900 <context-group name="null"> 3204 <context-group name="null">
2901 <context context-type="linenumber">1</context> 3205 <context context-type="linenumber">1</context>
2902 </context-group> 3206 </context-group>
2903 </trans-unit> 3207 </trans-unit>
2904 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3208 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2905 <source>This could lead to security issues or bugs if you do not understand it. </source> 3209 <source>Configuration updated.</source>
2906 <target>Questo potrebbe portare a problemi di sicurreza o errori nel programma se tu non capisci cosa fai. </target> 3210 <target>Configurazione aggiornata.</target>
2907 <context-group name="null"> 3211 <context-group name="null">
2908 <context context-type="linenumber">1</context> 3212 <context context-type="linenumber">1</context>
2909 </context-group> 3213 </context-group>
2910 </trans-unit> 3214 </trans-unit>
2911 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3215 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf">
2912 <source>Are you sure you want to update the configuration?</source> 3216 <source>Unlimited</source>
2913 <target>Sei sicuro di volere un aggiornamento della configurazione?</target> 3217 <target>Illimitato/ti</target>
2914 <context-group name="null"> 3218 <context-group name="null">
2915 <context context-type="linenumber">1</context> 3219 <context context-type="linenumber">1</context>
2916 </context-group> 3220 </context-group>
2917 </trans-unit> 3221 </trans-unit>
2918 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3222 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
2919 <source>Please type</source> 3223 <source>100MB</source>
2920 <target>Per favore digita</target> 3224 <target>100MB</target>
2921 <context-group name="null"> 3225 <context-group name="null">
2922 <context context-type="linenumber">1</context> 3226 <context context-type="linenumber">1</context>
2923 </context-group> 3227 </context-group>
2924 </trans-unit> 3228 </trans-unit>
2925 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3229 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
2926 <source>to confirm.</source> 3230 <source>500MB</source>
2927 <target>per confermare.</target> 3231 <target>500MB</target>
2928 <context-group name="null"> 3232 <context-group name="null">
2929 <context context-type="linenumber">1</context> 3233 <context context-type="linenumber">1</context>
2930 </context-group> 3234 </context-group>
2931 </trans-unit> 3235 </trans-unit>
2932 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 3236 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
2933 <source>Success</source> 3237 <source>1GB</source>
3238 <target>1GB</target>
2934 <context-group name="null"> 3239 <context-group name="null">
2935 <context context-type="linenumber">1</context> 3240 <context context-type="linenumber">1</context>
2936 </context-group> 3241 </context-group>
2937 </trans-unit> 3242 </trans-unit>
2938 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3243 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
2939 <source>Configuration updated.</source> 3244 <source>5GB</source>
2940 <target>Configurazione aggiornata.</target> 3245 <target>5GB</target>
2941 <context-group name="null"> 3246 <context-group name="null">
2942 <context context-type="linenumber">1</context> 3247 <context context-type="linenumber">1</context>
2943 </context-group> 3248 </context-group>
2944 </trans-unit> 3249 </trans-unit>
2945 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf"> 3250 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
2946 <source>Unlimited</source> 3251 <source>20GB</source>
2947 <target>Illimitato/ti</target> 3252 <target>20GB</target>
3253 <context-group name="null">
3254 <context context-type="linenumber">1</context>
3255 </context-group>
3256 </trans-unit>
3257 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3258 <source>50GB</source>
3259 <target>50GB</target>
3260 <context-group name="null">
3261 <context context-type="linenumber">1</context>
3262 </context-group>
3263 </trans-unit>
3264 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3265 <source>10MB</source>
3266 <target>10MB</target>
3267 <context-group name="null">
3268 <context context-type="linenumber">1</context>
3269 </context-group>
3270 </trans-unit>
3271 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3272 <source>50MB</source>
3273 <target>50MB</target>
3274 <context-group name="null">
3275 <context context-type="linenumber">1</context>
3276 </context-group>
3277 </trans-unit>
3278 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3279 <source>2GB</source>
3280 <target>2GB</target>
2948 <context-group name="null"> 3281 <context-group name="null">
2949 <context context-type="linenumber">1</context> 3282 <context context-type="linenumber">1</context>
2950 </context-group> 3283 </context-group>
@@ -2958,7 +3291,7 @@ Altri video</target>
2958 </trans-unit> 3291 </trans-unit>
2959 <trans-unit id="e02f50674f1d96966384dc096beb42d4973997df"> 3292 <trans-unit id="e02f50674f1d96966384dc096beb42d4973997df">
2960 <source>You need to specify hosts to follow.</source> 3293 <source>You need to specify hosts to follow.</source>
2961 <target>Devi specificare gli host per seguire.</target> 3294 <target>Devi specificare gli host da seguire.</target>
2962 <context-group name="null"> 3295 <context-group name="null">
2963 <context context-type="linenumber">1</context> 3296 <context context-type="linenumber">1</context>
2964 </context-group> 3297 </context-group>
@@ -3012,6 +3345,27 @@ Altri video</target>
3012 <context context-type="linenumber">1</context> 3345 <context context-type="linenumber">1</context>
3013 </context-group> 3346 </context-group>
3014 </trans-unit> 3347 </trans-unit>
3348 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
3349 <source>enabled</source>
3350 <target>attivato</target>
3351 <context-group name="null">
3352 <context context-type="linenumber">1</context>
3353 </context-group>
3354 </trans-unit>
3355 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
3356 <source>disabled</source>
3357 <target>disabilitato</target>
3358 <context-group name="null">
3359 <context context-type="linenumber">1</context>
3360 </context-group>
3361 </trans-unit>
3362 <trans-unit id="1123807fc813c816404598147173403d00117557">
3363 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
3364 <target>La ridondanza per <x id="INTERPOLATION" equiv-text="{{host}}"/> è <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
3365 <context-group name="null">
3366 <context context-type="linenumber">1</context>
3367 </context-group>
3368 </trans-unit>
3015 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3369 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3016 <source>Comment updated.</source> 3370 <source>Comment updated.</source>
3017 <target>Commento modificato.</target> 3371 <target>Commento modificato.</target>
@@ -3019,6 +3373,13 @@ Altri video</target>
3019 <context context-type="linenumber">1</context> 3373 <context context-type="linenumber">1</context>
3020 </context-group> 3374 </context-group>
3021 </trans-unit> 3375 </trans-unit>
3376 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3377 <source>Delete this report</source>
3378 <target>Elimina questa segnalazione</target>
3379 <context-group name="null">
3380 <context context-type="linenumber">1</context>
3381 </context-group>
3382 </trans-unit>
3022 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3383 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3023 <source>Update moderation comment</source> 3384 <source>Update moderation comment</source>
3024 <target>Modifica commento di moderazione</target> 3385 <target>Modifica commento di moderazione</target>
@@ -3040,16 +3401,15 @@ Altri video</target>
3040 <context context-type="linenumber">1</context> 3401 <context context-type="linenumber">1</context>
3041 </context-group> 3402 </context-group>
3042 </trans-unit> 3403 </trans-unit>
3043 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3404 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3044 <source>Do you really want to delete this abuse?</source> 3405 <source>Do you really want to delete this abuse report?</source>
3045 <target>Vuoi veramente eliminare questo/a abuso/molestia?</target> 3406 <target>Vuoi veramente eliminare questa segnalazione di abuso?</target>
3046 <context-group name="null"> 3407 <context-group name="null">
3047 <context context-type="linenumber">1</context> 3408 <context context-type="linenumber">1</context>
3048 </context-group> 3409 </context-group>
3049 </trans-unit> 3410 </trans-unit>
3050 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9"> 3411 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
3051 <source>Abuse deleted.</source> 3412 <source>Abuse deleted.</source><target>Abuse deleted.</target><context-group name="null">
3052 <context-group name="null">
3053 <context context-type="linenumber">1</context> 3413 <context context-type="linenumber">1</context>
3054 </context-group> 3414 </context-group>
3055 </trans-unit> 3415 </trans-unit>
@@ -3088,20 +3448,6 @@ Altri video</target>
3088 <context context-type="linenumber">1</context> 3448 <context context-type="linenumber">1</context>
3089 </context-group> 3449 </context-group>
3090 </trans-unit> 3450 </trans-unit>
3091 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
3092 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
3093 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato espulso (banned).</target>
3094 <context-group name="null">
3095 <context context-type="linenumber">1</context>
3096 </context-group>
3097 </trans-unit>
3098 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3099 <source>Ban</source>
3100 <target>Ban (espelli)</target>
3101 <context-group name="null">
3102 <context context-type="linenumber">1</context>
3103 </context-group>
3104 </trans-unit>
3105 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3451 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3106 <source>Unban</source> 3452 <source>Unban</source>
3107 <target>Rimuovi ban</target> 3453 <target>Rimuovi ban</target>
@@ -3110,21 +3456,7 @@ Altri video</target>
3110 </context-group> 3456 </context-group>
3111 </trans-unit> 3457 </trans-unit>
3112 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf"> 3458 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3113 <source>You cannot ban root.</source> 3459 <source>You cannot ban root.</source><target>You cannot ban root.</target><context-group name="null">
3114 <context-group name="null">
3115 <context context-type="linenumber">1</context>
3116 </context-group>
3117 </trans-unit>
3118 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
3119 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
3120 <context-group name="null">
3121 <context context-type="linenumber">1</context>
3122 </context-group>
3123 </trans-unit>
3124 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
3125 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
3126 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato riammesso.</target>
3127 <context-group name="null">
3128 <context context-type="linenumber">1</context> 3460 <context context-type="linenumber">1</context>
3129 </context-group> 3461 </context-group>
3130 </trans-unit> 3462 </trans-unit>
@@ -3135,16 +3467,15 @@ Altri video</target>
3135 <context context-type="linenumber">1</context> 3467 <context context-type="linenumber">1</context>
3136 </context-group> 3468 </context-group>
3137 </trans-unit> 3469 </trans-unit>
3138 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3470 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3139 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3471 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3140 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato rimosso.</target> 3472 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utenti eliminati.</target>
3141 <context-group name="null"> 3473 <context-group name="null">
3142 <context context-type="linenumber">1</context> 3474 <context context-type="linenumber">1</context>
3143 </context-group> 3475 </context-group>
3144 </trans-unit> 3476 </trans-unit>
3145 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e"> 3477 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3146 <source>Ownership accepted</source> 3478 <source>Ownership accepted</source><target>Ownership accepted</target><context-group name="null">
3147 <context-group name="null">
3148 <context context-type="linenumber">1</context> 3479 <context context-type="linenumber">1</context>
3149 </context-group> 3480 </context-group>
3150 </trans-unit> 3481 </trans-unit>
@@ -3155,6 +3486,13 @@ Altri video</target>
3155 <context context-type="linenumber">1</context> 3486 <context context-type="linenumber">1</context>
3156 </context-group> 3487 </context-group>
3157 </trans-unit> 3488 </trans-unit>
3489 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3490 <source>You current password is invalid.</source>
3491 <target>La tua attuale password non è valida.</target>
3492 <context-group name="null">
3493 <context context-type="linenumber">1</context>
3494 </context-group>
3495 </trans-unit>
3158 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3496 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3159 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3497 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3160 <target>Sei sicuro di volere eliminare il tuo account? Questa azione eliminerá tutti it tuoi dati compresi canali, video etc.</target> 3498 <target>Sei sicuro di volere eliminare il tuo account? Questa azione eliminerá tutti it tuoi dati compresi canali, video etc.</target>
@@ -3211,6 +3549,13 @@ Altri video</target>
3211 <context context-type="linenumber">1</context> 3549 <context context-type="linenumber">1</context>
3212 </context-group> 3550 </context-group>
3213 </trans-unit> 3551 </trans-unit>
3552 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3553 <source>This name already exists on this instance.</source>
3554 <target>Questo nome esiste già nell'istanza.</target>
3555 <context-group name="null">
3556 <context context-type="linenumber">1</context>
3557 </context-group>
3558 </trans-unit>
3214 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3559 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3215 <source>Create</source> 3560 <source>Create</source>
3216 <target>Crea</target> 3561 <target>Crea</target>
@@ -3225,23 +3570,16 @@ Altri video</target>
3225 <context context-type="linenumber">1</context> 3570 <context context-type="linenumber">1</context>
3226 </context-group> 3571 </context-group>
3227 </trans-unit> 3572 </trans-unit>
3228 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3573 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3229 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3574 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3230 <target>Vuoi veramente eliminare <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Questo eliminerá anche tutti i video caricati su questo canale.</target> 3575 <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target>
3231 <context-group name="null">
3232 <context context-type="linenumber">1</context>
3233 </context-group>
3234 </trans-unit>
3235 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3236 <source>Please type the name of the video channel to confirm</source>
3237 <target>Per favore digita il nome del canale video per confermare</target>
3238 <context-group name="null"> 3576 <context-group name="null">
3239 <context context-type="linenumber">1</context> 3577 <context context-type="linenumber">1</context>
3240 </context-group> 3578 </context-group>
3241 </trans-unit> 3579 </trans-unit>
3242 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3580 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3243 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3581 <source>My videos</source>
3244 <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target> 3582 <target>I miei video</target>
3245 <context-group name="null"> 3583 <context-group name="null">
3246 <context context-type="linenumber">1</context> 3584 <context context-type="linenumber">1</context>
3247 </context-group> 3585 </context-group>
@@ -3283,6 +3621,7 @@ Altri video</target>
3283 </trans-unit> 3621 </trans-unit>
3284 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2"> 3622 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2">
3285 <source>Publication scheduled on </source> 3623 <source>Publication scheduled on </source>
3624 <target>Pubblicazione programmata per il</target>
3286 <context-group name="null"> 3625 <context-group name="null">
3287 <context context-type="linenumber">1</context> 3626 <context context-type="linenumber">1</context>
3288 </context-group> 3627 </context-group>
@@ -3295,14 +3634,12 @@ Altri video</target>
3295 </context-group> 3634 </context-group>
3296 </trans-unit> 3635 </trans-unit>
3297 <trans-unit id="21f1c9d5c67346c830aced4f670045fcf0aeb83a"> 3636 <trans-unit id="21f1c9d5c67346c830aced4f670045fcf0aeb83a">
3298 <source>To transcode</source> 3637 <source>To transcode</source><target>To transcode</target><context-group name="null">
3299 <context-group name="null">
3300 <context context-type="linenumber">1</context> 3638 <context context-type="linenumber">1</context>
3301 </context-group> 3639 </context-group>
3302 </trans-unit> 3640 </trans-unit>
3303 <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392"> 3641 <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392">
3304 <source>To import</source> 3642 <source>To import</source><target>To import</target><context-group name="null">
3305 <context-group name="null">
3306 <context context-type="linenumber">1</context> 3643 <context context-type="linenumber">1</context>
3307 </context-group> 3644 </context-group>
3308 </trans-unit> 3645 </trans-unit>
@@ -3313,16 +3650,44 @@ Altri video</target>
3313 <context context-type="linenumber">1</context> 3650 <context context-type="linenumber">1</context>
3314 </context-group> 3651 </context-group>
3315 </trans-unit> 3652 </trans-unit>
3316 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3653 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3317 <source>Channels</source> 3654 <source>My library</source>
3318 <target>Canali</target> 3655 <target>La mia libreria</target>
3656 <context-group name="null">
3657 <context context-type="linenumber">1</context>
3658 </context-group>
3659 </trans-unit>
3660 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3661 <source>My channels</source>
3662 <target>I miei canali</target>
3663 <context-group name="null">
3664 <context context-type="linenumber">1</context>
3665 </context-group>
3666 </trans-unit>
3667 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3668 <source>My subscriptions</source>
3669 <target>Le mie sottoscrizioni</target>
3319 <context-group name="null"> 3670 <context-group name="null">
3320 <context context-type="linenumber">1</context> 3671 <context context-type="linenumber">1</context>
3321 </context-group> 3672 </context-group>
3322 </trans-unit> 3673 </trans-unit>
3323 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3674 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3324 <source>Video imports</source> 3675 <source>Misc</source>
3325 <target>Caricamenti video</target> 3676 <target>Altro</target>
3677 <context-group name="null">
3678 <context context-type="linenumber">1</context>
3679 </context-group>
3680 </trans-unit>
3681 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3682 <source>Ownership changes</source>
3683 <target>Cambi di proprietario</target>
3684 <context-group name="null">
3685 <context context-type="linenumber">1</context>
3686 </context-group>
3687 </trans-unit>
3688 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3689 <source>My settings</source>
3690 <target>Le mie impostazioni</target>
3326 <context-group name="null"> 3691 <context-group name="null">
3327 <context context-type="linenumber">1</context> 3692 <context context-type="linenumber">1</context>
3328 </context-group> 3693 </context-group>
@@ -3341,6 +3706,13 @@ Altri video</target>
3341 <context context-type="linenumber">1</context> 3706 <context context-type="linenumber">1</context>
3342 </context-group> 3707 </context-group>
3343 </trans-unit> 3708 </trans-unit>
3709 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
3710 <source>Go to the videos overview page</source>
3711 <target>Vai alla pagina di anteprima dei video</target>
3712 <context-group name="null">
3713 <context context-type="linenumber">1</context>
3714 </context-group>
3715 </trans-unit>
3344 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 3716 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3345 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 3717 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3346</source> 3718</source>
@@ -3357,6 +3729,13 @@ Altri video</target>
3357 <context context-type="linenumber">1</context> 3729 <context context-type="linenumber">1</context>
3358 </context-group> 3730 </context-group>
3359 </trans-unit> 3731 </trans-unit>
3732 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3733 <source>Error</source>
3734 <target>Errore</target>
3735 <context-group name="null">
3736 <context context-type="linenumber">1</context>
3737 </context-group>
3738 </trans-unit>
3360 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 3739 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3361 <source>You need to reconnect.</source> 3740 <source>You need to reconnect.</source>
3362 <target>Devi riconnetterti.</target> 3741 <target>Devi riconnetterti.</target>
@@ -3371,6 +3750,25 @@ Altri video</target>
3371 <context context-type="linenumber">1</context> 3750 <context context-type="linenumber">1</context>
3372 </context-group> 3751 </context-group>
3373 </trans-unit> 3752 </trans-unit>
3753 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
3754 <source>Keyboard Shortcuts:</source>
3755 <target>Scorciatoie per la tastiera:</target>
3756 <context-group name="null">
3757 <context context-type="linenumber">1</context>
3758 </context-group>
3759 </trans-unit>
3760 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3761 <source>Info</source>
3762 <target>Informazioni</target>
3763 <context-group name="null">
3764 <context context-type="linenumber">1</context>
3765 </context-group>
3766 </trans-unit>
3767 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3768 <source>Success</source><target>Success</target><context-group name="null">
3769 <context context-type="linenumber">1</context>
3770 </context-group>
3771 </trans-unit>
3374 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 3772 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3375 <source>Incorrect username or password.</source> 3773 <source>Incorrect username or password.</source>
3376 <target>Username or password non corretti</target> 3774 <target>Username or password non corretti</target>
@@ -3518,16 +3916,170 @@ Altri video</target>
3518 <context context-type="linenumber">1</context> 3916 <context context-type="linenumber">1</context>
3519 </context-group> 3917 </context-group>
3520 </trans-unit> 3918 </trans-unit>
3919 <trans-unit id="545f5dea553b2d7c4a65920ccdcb1e9dbdc7f4d8">
3920 <source>Captions cache size is required.</source>
3921 <target>La dimensione della cache delle descrizioni è richiesta.</target>
3922 <context-group name="null">
3923 <context context-type="linenumber">1</context>
3924 </context-group>
3925 </trans-unit>
3926 <trans-unit id="a8d7131c0ca1eefe7b058e6081236ca1be364e2c">
3927 <source>Captions cache size must be greater than 1.</source>
3928 <target>La dimensione della cache delle descrizioni deve essere piú grande di 1.</target>
3929 <context-group name="null">
3930 <context context-type="linenumber">1</context>
3931 </context-group>
3932 </trans-unit>
3933 <trans-unit id="c3decd47b03cf542df091c1a2fb25b756e59074e">
3934 <source>Captions cache size must be a number.</source>
3935 <target>La dimensione della cache delle descrizioni deve essere un numero.</target>
3936 <context-group name="null">
3937 <context context-type="linenumber">1</context>
3938 </context-group>
3939 </trans-unit>
3940 <trans-unit id="2cdd5a8c604ef16c2f9a17ed81d73f4f9509e828">
3941 <source>Signup limit is required.</source>
3942 <target>Il limite per le sottoscrizioni è un campo richiesto.</target>
3943 <context-group name="null">
3944 <context context-type="linenumber">1</context>
3945 </context-group>
3946 </trans-unit>
3947 <trans-unit id="0ca9f7ec55c9896add6e82d2b52e9217e1140cf7">
3948 <source>Signup limit must be greater than 1.</source>
3949 <target>Il limite per le sottoscrizioni deve essere piú grande di 1.</target>
3950 <context-group name="null">
3951 <context context-type="linenumber">1</context>
3952 </context-group>
3953 </trans-unit>
3954 <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
3955 <source>Signup limit must be a number.</source>
3956 <target>Il limite per le sottoscrizioni deve essere un numero.</target>
3957 <context-group name="null">
3958 <context context-type="linenumber">1</context>
3959 </context-group>
3960 </trans-unit>
3521 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021"> 3961 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
3522 <source>Admin email is required.</source> 3962 <source>Admin email is required.</source>
3523 <target>Ci vuole l'email del amministratore.</target> 3963 <target>Ci vuole l'email dell'amministratore.</target>
3964 <context-group name="null">
3965 <context context-type="linenumber">1</context>
3966 </context-group>
3967 </trans-unit>
3968 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
3969 <source>Admin email must be valid.</source>
3970 <target>L'email dell'amministratore deve essere valida.</target>
3971 <context-group name="null">
3972 <context context-type="linenumber">1</context>
3973 </context-group>
3974 </trans-unit>
3975 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
3976 <source>Transcoding threads is required.</source>
3977 <target>Il numero di thread di transcodifica è richiesto.</target>
3978 <context-group name="null">
3979 <context context-type="linenumber">1</context>
3980 </context-group>
3981 </trans-unit>
3982 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
3983 <source>Transcoding threads must be greater or equal to 0.</source>
3984 <target>Il numero di thread di transcodifica deve essere più grande o uguale a 0.</target>
3985 <context-group name="null">
3986 <context context-type="linenumber">1</context>
3987 </context-group>
3988 </trans-unit>
3989 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3990 <source>Email is required.</source>
3991 <target>L'email è richiesta.</target>
3992 <context-group name="null">
3993 <context context-type="linenumber">1</context>
3994 </context-group>
3995 </trans-unit>
3996 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3997 <source>Email must be valid.</source>
3998 <target>L'email deve essere valida.</target>
3999 <context-group name="null">
4000 <context context-type="linenumber">1</context>
4001 </context-group>
4002 </trans-unit>
4003 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4004 <source>Username is required.</source>
4005 <target>L'username è necessario.</target>
4006 <context-group name="null">
4007 <context context-type="linenumber">1</context>
4008 </context-group>
4009 </trans-unit>
4010 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
4011 <source>Password is required.</source>
4012 <target>La password è necessaria.</target>
4013 <context-group name="null">
4014 <context context-type="linenumber">1</context>
4015 </context-group>
4016 </trans-unit>
4017 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
4018 <source>Confirmation of the password is required.</source>
4019 <target>La conferma della password è necessaria.</target>
4020 <context-group name="null">
4021 <context context-type="linenumber">1</context>
4022 </context-group>
4023 </trans-unit>
4024 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4025 <source>Password must be at least 6 characters long.</source>
4026 <target>La password deve essere lunga almeno 6 caratteri.</target>
4027 <context-group name="null">
4028 <context context-type="linenumber">1</context>
4029 </context-group>
4030 </trans-unit>
4031 <trans-unit id="0a154031f3e66985af96d5f903441cf84f0dc75e">
4032 <source>Password cannot be more than 255 characters long.</source>
4033 <target>La password non può essere più lunga di 255 caratteri.</target>
4034 <context-group name="null">
4035 <context context-type="linenumber">1</context>
4036 </context-group>
4037 </trans-unit>
4038 <trans-unit id="2db8f1f93a5485c32267762a3bf4da499832e732">
4039 <source>The new password and the confirmed password do not correspond.</source>
4040 <target>La nuova password e quella di conferma non coincidono.</target>
4041 <context-group name="null">
4042 <context context-type="linenumber">1</context>
4043 </context-group>
4044 </trans-unit>
4045 <trans-unit id="abede840116d58f04a55d99a6cbd68da8a3e1bbf">
4046 <source>Video quota is required.</source>
4047 <target>La quota per il video è richiesta.</target>
4048 <context-group name="null">
4049 <context context-type="linenumber">1</context>
4050 </context-group>
4051 </trans-unit>
4052 <trans-unit id="93a6dc1d3aa0d3201c86ef1ec8adf5cf0ada3c80">
4053 <source>Quota must be greater than -1.</source>
4054 <target>La quota deve essere più grande di -1.</target>
4055 <context-group name="null">
4056 <context context-type="linenumber">1</context>
4057 </context-group>
4058 </trans-unit>
4059 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
4060 <source>Daily upload limit is required.</source>
4061 <target>Il limite di caricamento giornaliero è necessario.</target>
3524 <context-group name="null"> 4062 <context-group name="null">
3525 <context context-type="linenumber">1</context> 4063 <context context-type="linenumber">1</context>
3526 </context-group> 4064 </context-group>
3527 </trans-unit> 4065 </trans-unit>
3528 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 4066 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
3529 <source>Display name cannot be more than 120 characters long.</source> 4067 <source>Daily upload limit must be greater than -1.</source>
3530 <target>Il nome mostrato non deve superare i 120 caratteri.</target> 4068 <target>Il limite di caricamento giornaliero deve essere più grande di -1.</target>
4069 <context-group name="null">
4070 <context context-type="linenumber">1</context>
4071 </context-group>
4072 </trans-unit>
4073 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
4074 <source>User role is required.</source>
4075 <target>Il ruolo dell'utente è necessario.</target>
4076 <context-group name="null">
4077 <context context-type="linenumber">1</context>
4078 </context-group>
4079 </trans-unit>
4080 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
4081 <source>Display name is required.</source>
4082 <target>Il nome visualizzato è necessario.</target>
3531 <context-group name="null"> 4083 <context-group name="null">
3532 <context context-type="linenumber">1</context> 4084 <context context-type="linenumber">1</context>
3533 </context-group> 4085 </context-group>
@@ -3539,16 +4091,58 @@ Altri video</target>
3539 <context context-type="linenumber">1</context> 4091 <context context-type="linenumber">1</context>
3540 </context-group> 4092 </context-group>
3541 </trans-unit> 4093 </trans-unit>
3542 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4094 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
3543 <source>Description cannot be more than 250 characters long.</source> 4095 <source>You must to agree with the instance terms in order to registering on it.</source>
3544 <target>La descrizione non deve superare 250 caratteri.</target> 4096 <target>Devi accettare le regole dell'istanza per registrarti.</target>
3545 <context-group name="null"> 4097 <context-group name="null">
3546 <context context-type="linenumber">1</context> 4098 <context context-type="linenumber">1</context>
3547 </context-group> 4099 </context-group>
3548 </trans-unit> 4100 </trans-unit>
3549 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561"> 4101 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
3550 <source>You must to agree with the instance terms in order to registering on it.</source> 4102 <source>Ban reason must be at least 3 characters long.</source>
3551 <target>Devi accetare le regole del server per registrarti sopra</target> 4103 <target>Il motivo dell'espulsione (ban) deve essere lungo almeno 3 caratteri.</target>
4104 <context-group name="null">
4105 <context context-type="linenumber">1</context>
4106 </context-group>
4107 </trans-unit>
4108 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
4109 <source>Ban reason cannot be more than 250 characters long.</source>
4110 <target>Il motivo dell'espulsione non deve essere più lungo di 250 caratteri.</target>
4111 <context-group name="null">
4112 <context context-type="linenumber">1</context>
4113 </context-group>
4114 </trans-unit>
4115 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
4116 <source>Report reason is required.</source>
4117 <target>Il motivo per la segnalazione è richiesto.</target>
4118 <context-group name="null">
4119 <context context-type="linenumber">1</context>
4120 </context-group>
4121 </trans-unit>
4122 <trans-unit id="993f9f5703d449a1d467243db75253d288a2947e">
4123 <source>Report reason must be at least 2 characters long.</source>
4124 <target>Il motivo per la segnalazione deve essere lungo almeno 2 caratteri.</target>
4125 <context-group name="null">
4126 <context context-type="linenumber">1</context>
4127 </context-group>
4128 </trans-unit>
4129 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4130 <source>Moderation comment is required.</source>
4131 <target>Il commento di moderazione è richiesto.</target>
4132 <context-group name="null">
4133 <context context-type="linenumber">1</context>
4134 </context-group>
4135 </trans-unit>
4136 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
4137 <source>Moderation comment must be at least 2 characters long.</source>
4138 <target>Il commento di moderazione deve essere lungo almeno 2 caratteri.</target>
4139 <context-group name="null">
4140 <context context-type="linenumber">1</context>
4141 </context-group>
4142 </trans-unit>
4143 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4144 <source>The channel is required.</source>
4145 <target>Il canale è richiesto.</target>
3552 <context-group name="null"> 4146 <context-group name="null">
3553 <context context-type="linenumber">1</context> 4147 <context context-type="linenumber">1</context>
3554 </context-group> 4148 </context-group>
@@ -3567,30 +4161,23 @@ Altri video</target>
3567 <context context-type="linenumber">1</context> 4161 <context context-type="linenumber">1</context>
3568 </context-group> 4162 </context-group>
3569 </trans-unit> 4163 </trans-unit>
3570 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069"> 4164 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
3571 <source>Name must be at least 3 characters long.</source> 4165 <source>Comment is required.</source>
3572 <target>Il nome deve essere al minimo lunguo di tre caratteri.</target> 4166 <target>Un commento è necessario.</target>
3573 <context-group name="null">
3574 <context context-type="linenumber">1</context>
3575 </context-group>
3576 </trans-unit>
3577 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
3578 <source>Name cannot be more than 20 characters long.</source>
3579 <target>Il nome non deve superare i 20 caratteri.</target>
3580 <context-group name="null"> 4167 <context-group name="null">
3581 <context context-type="linenumber">1</context> 4168 <context context-type="linenumber">1</context>
3582 </context-group> 4169 </context-group>
3583 </trans-unit> 4170 </trans-unit>
3584 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9"> 4171 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
3585 <source>Name should be only lowercase alphanumeric characters.</source> 4172 <source>Comment must be at least 2 characters long.</source>
3586 <target>Il nome deve contenire solo caratteri minuscoli ed alfanumerichi;</target> 4173 <target>Il commento deve essere lungo almeno 2 caratteri.</target>
3587 <context-group name="null"> 4174 <context-group name="null">
3588 <context context-type="linenumber">1</context> 4175 <context context-type="linenumber">1</context>
3589 </context-group> 4176 </context-group>
3590 </trans-unit> 4177 </trans-unit>
3591 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 4178 <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123">
3592 <source>Description cannot be more than 500 characters long.</source> 4179 <source>Comment cannot be more than 3000 characters long.</source>
3593 <target>La descrizione non deve superare 500 caratteri.</target> 4180 <target>Il commento non può essere più lungo di 3000 caratteri</target>
3594 <context-group name="null"> 4181 <context-group name="null">
3595 <context context-type="linenumber">1</context> 4182 <context context-type="linenumber">1</context>
3596 </context-group> 4183 </context-group>
@@ -3604,7 +4191,7 @@ Altri video</target>
3604 </trans-unit> 4191 </trans-unit>
3605 <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c"> 4192 <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c">
3606 <source>Video name must be at least 3 characters long.</source> 4193 <source>Video name must be at least 3 characters long.</source>
3607 <target>Il nome video deve essere al minimo lunguo di tre caratteri.</target> 4194 <target>Il nome video deve essere minimo di tre caratteri.</target>
3608 <context-group name="null"> 4195 <context-group name="null">
3609 <context context-type="linenumber">1</context> 4196 <context context-type="linenumber">1</context>
3610 </context-group> 4197 </context-group>
@@ -3616,9 +4203,30 @@ Altri video</target>
3616 <context context-type="linenumber">1</context> 4203 <context context-type="linenumber">1</context>
3617 </context-group> 4204 </context-group>
3618 </trans-unit> 4205 </trans-unit>
4206 <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
4207 <source>Video channel is required.</source>
4208 <target>Il canale del video è necessario.</target>
4209 <context-group name="null">
4210 <context context-type="linenumber">1</context>
4211 </context-group>
4212 </trans-unit>
4213 <trans-unit id="af5e2d5f3ac817c735fb7ff9ca16322789f66fef">
4214 <source>Video description must be at least 3 characters long.</source>
4215 <target>La descrizione del video deve essere lunga almeno 3 caratteri.</target>
4216 <context-group name="null">
4217 <context context-type="linenumber">1</context>
4218 </context-group>
4219 </trans-unit>
4220 <trans-unit id="ce28a9403c2d7e5da2e59af27118f8b6d109e906">
4221 <source>Video description cannot be more than 10000 characters long.</source>
4222 <target>La descrizione del video non può essere più lunga di 10000 caratteri.</target>
4223 <context-group name="null">
4224 <context context-type="linenumber">1</context>
4225 </context-group>
4226 </trans-unit>
3619 <trans-unit id="f1cffdc2e156716cd9880201d65ba457d11464f8"> 4227 <trans-unit id="f1cffdc2e156716cd9880201d65ba457d11464f8">
3620 <source>A tag should be more than 2 characters long.</source> 4228 <source>A tag should be more than 2 characters long.</source>
3621 <target>Un tag deve contenire al minimo 2 caratteri.</target> 4229 <target>Un tag deve contenere minimo 2 caratteri.</target>
3622 <context-group name="null"> 4230 <context-group name="null">
3623 <context context-type="linenumber">1</context> 4231 <context context-type="linenumber">1</context>
3624 </context-group> 4232 </context-group>
@@ -3630,23 +4238,30 @@ Altri video</target>
3630 <context context-type="linenumber">1</context> 4238 <context context-type="linenumber">1</context>
3631 </context-group> 4239 </context-group>
3632 </trans-unit> 4240 </trans-unit>
4241 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
4242 <source>Video support must be at least 3 characters long.</source>
4243 <target>Supporto video deve essere almeno di 3 caratteri</target>
4244 <context-group name="null">
4245 <context context-type="linenumber">1</context>
4246 </context-group>
4247 </trans-unit>
3633 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 4248 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
3634 <source>A date is required to schedule video update.</source> 4249 <source>A date is required to schedule video update.</source>
3635 <target>Ci vuole una data per programmare l'aggiornamento della video.</target> 4250 <target>La data è necessaria per programmare l'aggiornamento del video.</target>
3636 <context-group name="null"> 4251 <context-group name="null">
3637 <context context-type="linenumber">1</context> 4252 <context context-type="linenumber">1</context>
3638 </context-group> 4253 </context-group>
3639 </trans-unit> 4254 </trans-unit>
3640 <trans-unit id="3b7ed22d0730d03b38c254332829d855ee7256c4"> 4255 <trans-unit id="3b7ed22d0730d03b38c254332829d855ee7256c4">
3641 <source>This file is too large.</source> 4256 <source>This file is too large.</source>
3642 <target>Il file e troppo grande.</target> 4257 <target>Il file è troppo grande.</target>
3643 <context-group name="null"> 4258 <context-group name="null">
3644 <context context-type="linenumber">1</context> 4259 <context context-type="linenumber">1</context>
3645 </context-group> 4260 </context-group>
3646 </trans-unit> 4261 </trans-unit>
3647 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4"> 4262 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4">
3648 <source>All unsaved data will be lost, are you sure you want to leave this page?</source> 4263 <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
3649 <target>I dati non salvati saranno persi. Sei sicuro di volere chiudere questa pagina ?</target> 4264 <target>I dati non salvati saranno persi. Sei sicuro di volere chiudere questa pagina?</target>
3650 <context-group name="null"> 4265 <context-group name="null">
3651 <context context-type="linenumber">1</context> 4266 <context context-type="linenumber">1</context>
3652 </context-group> 4267 </context-group>
@@ -3966,13 +4581,72 @@ Altri video</target>
3966 <context context-type="linenumber">1</context> 4581 <context context-type="linenumber">1</context>
3967 </context-group> 4582 </context-group>
3968 </trans-unit> 4583 </trans-unit>
4584 <trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
4585 <source>Clear</source>
4586 <target>Resetta</target>
4587 <context-group name="null">
4588 <context context-type="linenumber">1</context>
4589 </context-group>
4590 </trans-unit>
4591 <trans-unit id="8fb519ba47ea7806beeacdcd44829d85a2aa0cc5">
4592 <source>yy-mm-dd </source>
4593 <target>yy-mm-dd </target>
4594 <context-group name="null">
4595 <context context-type="linenumber">1</context>
4596 </context-group>
4597 </trans-unit>
3969 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411"> 4598 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
3970 <source>Transcode your videos in multiple resolutions</source> 4599 <source>Transcode your videos in multiple resolutions</source>
3971 <target>Transcodi le tue video in multiple risoluzioni</target> 4600 <target>Transcodifica i tuoi video in multiple risoluzioni</target>
3972 <context-group name="null"> 4601 <context-group name="null">
3973 <context context-type="linenumber">1</context> 4602 <context context-type="linenumber">1</context>
3974 </context-group> 4603 </context-group>
3975 </trans-unit> 4604 </trans-unit>
4605 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
4606 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
4607 <target>HTTP import (YouTube, Vimeo, direct URL...)</target>
4608 <context-group name="null">
4609 <context context-type="linenumber">1</context>
4610 </context-group>
4611 </trans-unit>
4612 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
4613 <source>Torrent import</source>
4614 <target>Torrent import</target>
4615 <context-group name="null">
4616 <context context-type="linenumber">1</context>
4617 </context-group>
4618 </trans-unit>
4619 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
4620 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
4621 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
4622 <context-group name="null">
4623 <context context-type="linenumber">1</context>
4624 </context-group>
4625 </trans-unit>
4626 <trans-unit id="cf9ddbb55b25178660e09346209aedc10108aa24">
4627 <source>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</source>
4628 <target>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</target>
4629 <context-group name="null">
4630 <context context-type="linenumber">1</context>
4631 </context-group>
4632 </trans-unit>
4633 <trans-unit id="10ffa5c3dbcee491d66f80d8d4dce3e119a6ec86">
4634 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of full HD videos</source>
4635 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> di video HD interi</target>
4636 <context-group name="null">
4637 <context context-type="linenumber">1</context>
4638 </context-group>
4639 </trans-unit>
4640 <trans-unit id="344ddae9f45b344e98e7b28cd5e33243982700f8">
4641 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of HD videos</source><target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of HD videos</target><context-group name="null">
4642 <context context-type="linenumber">1</context>
4643 </context-group>
4644 </trans-unit>
4645 <trans-unit id="435c012df6dd990a1ccb7ee73dd79c488bde28b5">
4646 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of average quality videos</source><target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of average quality videos</target><context-group name="null">
4647 <context context-type="linenumber">1</context>
4648 </context-group>
4649 </trans-unit>
3976 <trans-unit id="0b2054a863319d2cf59867addd125b6717cae41d"> 4650 <trans-unit id="0b2054a863319d2cf59867addd125b6717cae41d">
3977 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> years ago</source> 4651 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> years ago</source>
3978 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> anni fa</target> 4652 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> anni fa</target>
@@ -4085,6 +4759,39 @@ Altri video</target>
4085 <context context-type="linenumber">1</context> 4759 <context context-type="linenumber">1</context>
4086 </context-group> 4760 </context-group>
4087 </trans-unit> 4761 </trans-unit>
4762 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
4763 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
4764 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato espulso (banned).</target>
4765 <context-group name="null">
4766 <context context-type="linenumber">1</context>
4767 </context-group>
4768 </trans-unit>
4769 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
4770 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source><target>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target><context-group name="null">
4771 <context context-type="linenumber">1</context>
4772 </context-group>
4773 </trans-unit>
4774 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
4775 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
4776 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato riammesso.</target>
4777 <context-group name="null">
4778 <context context-type="linenumber">1</context>
4779 </context-group>
4780 </trans-unit>
4781 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
4782 <source>If you remove this user, you will not be able to create another with the same username!</source>
4783 <target>Se elimini questo utente, non sarai in grado di crearne un altro con lo stesso username!</target>
4784 <context-group name="null">
4785 <context context-type="linenumber">1</context>
4786 </context-group>
4787 </trans-unit>
4788 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
4789 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
4790 <target>L`utente <x id="INTERPOLATION" equiv-text="{{username}}"/> è stato rimosso.</target>
4791 <context-group name="null">
4792 <context context-type="linenumber">1</context>
4793 </context-group>
4794 </trans-unit>
4088 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 4795 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4089 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 4796 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4090 <target>La riquiesta è troppo grande per il server. Per favore contatta il tuo amministratore se vuoi aumentare il limite di dimensione.</target> 4797 <target>La riquiesta è troppo grande per il server. Per favore contatta il tuo amministratore se vuoi aumentare il limite di dimensione.</target>
@@ -4113,6 +4820,13 @@ Altri video</target>
4113 <context context-type="linenumber">1</context> 4820 <context context-type="linenumber">1</context>
4114 </context-group> 4821 </context-group>
4115 </trans-unit> 4822 </trans-unit>
4823 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
4824 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4825 <target>Iscritto a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
4826 <context-group name="null">
4827 <context context-type="linenumber">1</context>
4828 </context-group>
4829 </trans-unit>
4116 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 4830 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4117 <source>Subscribed</source> 4831 <source>Subscribed</source>
4118 <target>Iscritto</target> 4832 <target>Iscritto</target>
@@ -4120,9 +4834,9 @@ Altri video</target>
4120 <context context-type="linenumber">1</context> 4834 <context context-type="linenumber">1</context>
4121 </context-group> 4835 </context-group>
4122 </trans-unit> 4836 </trans-unit>
4123 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 4837 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
4124 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 4838 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4125 <target>Iscritto a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 4839 <target>Discritto da <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
4126 <context-group name="null"> 4840 <context-group name="null">
4127 <context context-type="linenumber">1</context> 4841 <context context-type="linenumber">1</context>
4128 </context-group> 4842 </context-group>
@@ -4134,9 +4848,9 @@ Altri video</target>
4134 <context context-type="linenumber">1</context> 4848 <context context-type="linenumber">1</context>
4135 </context-group> 4849 </context-group>
4136 </trans-unit> 4850 </trans-unit>
4137 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 4851 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
4138 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 4852 <source>Moderator</source>
4139 <target>Discritto da <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 4853 <target>Moderatore</target>
4140 <context-group name="null"> 4854 <context-group name="null">
4141 <context context-type="linenumber">1</context> 4855 <context context-type="linenumber">1</context>
4142 </context-group> 4856 </context-group>
@@ -4157,28 +4871,7 @@ Altri video</target>
4157 </trans-unit> 4871 </trans-unit>
4158 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b"> 4872 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
4159 <source>Anyone can see this video</source> 4873 <source>Anyone can see this video</source>
4160 <target>Tutti quanti possono vedere questo video</target> 4874 <target>Tutti possono vedere questo video</target>
4161 <context-group name="null">
4162 <context context-type="linenumber">1</context>
4163 </context-group>
4164 </trans-unit>
4165 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2">
4166 <source>Welcome</source>
4167 <target>Benvenuto</target>
4168 <context-group name="null">
4169 <context context-type="linenumber">1</context>
4170 </context-group>
4171 </trans-unit>
4172 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
4173 <source>Please check your email to verify your account and complete signup.</source>
4174 <target>Per favore leggi i tuoi email per verificare il tuo account e finire la registrazione.</target>
4175 <context-group name="null">
4176 <context context-type="linenumber">1</context>
4177 </context-group>
4178 </trans-unit>
4179 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
4180 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
4181 <target>Registrazione per <x id="INTERPOLATION" equiv-text="{{username}}"/> finita.</target>
4182 <context-group name="null"> 4875 <context-group name="null">
4183 <context context-type="linenumber">1</context> 4876 <context context-type="linenumber">1</context>
4184 </context-group> 4877 </context-group>
@@ -4192,7 +4885,7 @@ Altri video</target>
4192 </trans-unit> 4885 </trans-unit>
4193 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c"> 4886 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c">
4194 <source>Your video was uploaded to your account and is private.</source> 4887 <source>Your video was uploaded to your account and is private.</source>
4195 <target>Il tuo video e stata caricato sul tuo account ed è privato. </target> 4888 <target>Il tuo video è stato caricato sul tuo account ed è privato.</target>
4196 <context-group name="null"> 4889 <context-group name="null">
4197 <context context-type="linenumber">1</context> 4890 <context context-type="linenumber">1</context>
4198 </context-group> 4891 </context-group>
@@ -4211,37 +4904,23 @@ Altri video</target>
4211 <context context-type="linenumber">1</context> 4904 <context context-type="linenumber">1</context>
4212 </context-group> 4905 </context-group>
4213 </trans-unit> 4906 </trans-unit>
4214 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4215 <source>Info</source>
4216 <target>Informazioni</target>
4217 <context-group name="null">
4218 <context context-type="linenumber">1</context>
4219 </context-group>
4220 </trans-unit>
4221 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 4907 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4222 <source>Upload cancelled</source> 4908 <source>Upload cancelled</source>
4223 <target>Carica cancellata</target> 4909 <target>Caricamento annullato.</target>
4224 <context-group name="null">
4225 <context context-type="linenumber">1</context>
4226 </context-group>
4227 </trans-unit>
4228 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4229 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4230 <target>Ci dispiace ma PeerTube non può gestire video &gt; 8GB</target>
4231 <context-group name="null"> 4910 <context-group name="null">
4232 <context context-type="linenumber">1</context> 4911 <context context-type="linenumber">1</context>
4233 </context-group> 4912 </context-group>
4234 </trans-unit> 4913 </trans-unit>
4235 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 4914 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4236 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 4915 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4237 <target>La tua quota e superata con questo video (dimensione del video: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizzato: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 4916 <target>La tua quota è stata superata con questo video (dimensione del video: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, stai utilizzando: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
4238 <context-group name="null"> 4917 <context-group name="null">
4239 <context context-type="linenumber">1</context> 4918 <context context-type="linenumber">1</context>
4240 </context-group> 4919 </context-group>
4241 </trans-unit> 4920 </trans-unit>
4242 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd"> 4921 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
4243 <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source> 4922 <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
4244 <target>La tua quota giornaliera e superata con questo video (dimensione del video: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizzato: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target> 4923 <target>La tua quota giornaliera è stata superata con questo video (dimensione del video: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, stai utilizzando: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
4245 <context-group name="null"> 4924 <context-group name="null">
4246 <context context-type="linenumber">1</context> 4925 <context context-type="linenumber">1</context>
4247 </context-group> 4926 </context-group>
@@ -4262,7 +4941,7 @@ Altri video</target>
4262 </trans-unit> 4941 </trans-unit>
4263 <trans-unit id="aeb61b334cac080733c3e03766165a346bbf42fd"> 4942 <trans-unit id="aeb61b334cac080733c3e03766165a346bbf42fd">
4264 <source> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> replies will be deleted too.</source> 4943 <source> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> replies will be deleted too.</source>
4265 <target> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> rispote saranno cancellate.</target> 4944 <target> Saranno eliminate <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> risposte.</target>
4266 <context-group name="null"> 4945 <context-group name="null">
4267 <context context-type="linenumber">1</context> 4946 <context context-type="linenumber">1</context>
4268 </context-group> 4947 </context-group>
@@ -4295,30 +4974,51 @@ Altri video</target>
4295 <context context-type="linenumber">1</context> 4974 <context context-type="linenumber">1</context>
4296 </context-group> 4975 </context-group>
4297 </trans-unit> 4976 </trans-unit>
4977 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
4978 <source>Like the video</source>
4979 <target>Mi piace</target>
4980 <context-group name="null">
4981 <context context-type="linenumber">1</context>
4982 </context-group>
4983 </trans-unit>
4984 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
4985 <source>Dislike the video</source>
4986 <target>Non mi piace</target>
4987 <context-group name="null">
4988 <context context-type="linenumber">1</context>
4989 </context-group>
4990 </trans-unit>
4298 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 4991 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
4299 <source>Do you really want to delete this video?</source> 4992 <source>Do you really want to delete this video?</source>
4300 <target>Sei sicuro di volere cancellare questo video ?</target> 4993 <target>Sei sicuro di volere eliminare questo video ?</target>
4301 <context-group name="null"> 4994 <context-group name="null">
4302 <context context-type="linenumber">1</context> 4995 <context context-type="linenumber">1</context>
4303 </context-group> 4996 </context-group>
4304 </trans-unit> 4997 </trans-unit>
4305 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e"> 4998 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
4306 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source> 4999 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
4307 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> amo / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> non amo</target> 5000 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> mi piace / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> non mi piace</target>
4308 <context-group name="null"> 5001 <context-group name="null">
4309 <context context-type="linenumber">1</context> 5002 <context context-type="linenumber">1</context>
4310 </context-group> 5003 </context-group>
4311 </trans-unit> 5004 </trans-unit>
4312 <trans-unit id="ed013c2c29216501c688e9cb5f3a1c9fd9147b71"> 5005 <trans-unit id="ed013c2c29216501c688e9cb5f3a1c9fd9147b71">
4313 <source>This video contains mature or explicit content. Are you sure you want to watch it?</source> 5006 <source>This video contains mature or explicit content. Are you sure you want to watch it?</source>
4314 <target>Questo video contiene del contenuto sensibile. Sei sicuro di volere guardalo ?</target> 5007 <target>Questo video contiene del contenuto sensibile. Sei sicuro di volerlo guardare?</target>
5008 <context-group name="null">
5009 <context context-type="linenumber">1</context>
5010 </context-group>
5011 </trans-unit>
5012 <trans-unit id="5ba3d522e4146eefcbd5c222247c1e2423d27cd8">
5013 <source>Mature or explicit content</source>
5014 <target>Contenuto per adulti o esplicito.</target>
4315 <context-group name="null"> 5015 <context-group name="null">
4316 <context context-type="linenumber">1</context> 5016 <context context-type="linenumber">1</context>
4317 </context-group> 5017 </context-group>
4318 </trans-unit> 5018 </trans-unit>
4319 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165"> 5019 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
4320 <source>Videos from your subscriptions</source> 5020 <source>Videos from your subscriptions</source>
4321 <target>Video delle tue iscrizioni</target> 5021 <target>Video dalle tue iscrizioni</target>
4322 <context-group name="null"> 5022 <context-group name="null">
4323 <context context-type="linenumber">1</context> 5023 <context context-type="linenumber">1</context>
4324 </context-group> 5024 </context-group>
diff --git a/client/src/locale/target/angular_ja_JP.xml b/client/src/locale/target/angular_ja_JP.xml
index 742eaea34..04bd5089a 100644
--- a/client/src/locale/target/angular_ja_JP.xml
+++ b/client/src/locale/target/angular_ja_JP.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>月をé¸æŠž</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>å¹´ã‚’é¸æŠž</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -95,9 +109,7 @@
95 </context-group> 109 </context-group>
96 </trans-unit> 110 </trans-unit>
97 <trans-unit id="ngb.progressbar.value"> 111 <trans-unit id="ngb.progressbar.value">
98 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source> 112 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source><target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target><context-group name="null">
99 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
100 <context-group name="null">
101 <context context-type="linenumber">6</context> 113 <context context-type="linenumber">6</context>
102 </context-group> 114 </context-group>
103 </trans-unit> 115 </trans-unit>
@@ -207,9 +219,7 @@
207 </context-group> 219 </context-group>
208 </trans-unit> 220 </trans-unit>
209 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46"> 221 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
210 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source> 222 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source><target>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target><context-group name="null">
211 <target>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, 最大サイズ: &lt;/x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/&gt;)</target>
212 <context-group name="null">
213 <context context-type="linenumber">11</context> 223 <context context-type="linenumber">11</context>
214 </context-group> 224 </context-group>
215 </trans-unit> 225 </trans-unit>
@@ -217,7 +227,7 @@
217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 227 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
218 <target> <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 回å†ç”Ÿ</target> 228 <target> <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 回å†ç”Ÿ</target>
219 <context-group name="null"> 229 <context-group name="null">
220 <context context-type="linenumber">13</context> 230 <context context-type="linenumber">16</context>
221 </context-group> 231 </context-group>
222 </trans-unit> 232 </trans-unit>
223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 233 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -231,7 +241,7 @@
231 <source>Edit</source> 241 <source>Edit</source>
232 <target>編集</target> 242 <target>編集</target>
233 <context-group name="null"> 243 <context-group name="null">
234 <context context-type="linenumber">5</context> 244 <context context-type="linenumber">1</context>
235 </context-group> 245 </context-group>
236 </trans-unit> 246 </trans-unit>
237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 247 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -255,6 +265,27 @@
255 <context context-type="linenumber">19</context> 265 <context context-type="linenumber">19</context>
256 </context-group> 266 </context-group>
257 </trans-unit> 267 </trans-unit>
268 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
269 <source>Ban</source>
270 <target>ç¦æ­¢</target>
271 <context-group name="null">
272 <context context-type="linenumber">3</context>
273 </context-group>
274 </trans-unit>
275 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
276 <source>Reason...</source>
277 <target>ç†ç”±â€¦</target>
278 <context-group name="null">
279 <context context-type="linenumber">11</context>
280 </context-group>
281 </trans-unit>
282 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
283 <source>Ban this user</source>
284 <target>ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ç¦æ­¢ã™ã‚‹</target>
285 <context-group name="null">
286 <context context-type="linenumber">25</context>
287 </context-group>
288 </trans-unit>
258 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 289 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
259 <source> 290 <source>
260 Login 291 Login
@@ -311,7 +342,7 @@
311 <source>Password</source> 342 <source>Password</source>
312 <target>パスワード</target> 343 <target>パスワード</target>
313 <context-group name="null"> 344 <context-group name="null">
314 <context context-type="linenumber">12</context> 345 <context context-type="linenumber">13</context>
315 </context-group> 346 </context-group>
316 </trans-unit> 347 </trans-unit>
317 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -325,12 +356,11 @@
325 <source>Login</source> 356 <source>Login</source>
326 <target>ログイン</target> 357 <target>ログイン</target>
327 <context-group name="null"> 358 <context-group name="null">
328 <context context-type="linenumber">38</context> 359 <context context-type="linenumber">36</context>
329 </context-group> 360 </context-group>
330 </trans-unit> 361 </trans-unit>
331 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
332 <source>Forgot your password</source> 363 <source>Forgot your password</source><target>Forgot your password</target><context-group name="null">
333 <context-group name="null">
334 <context context-type="linenumber">57</context> 364 <context context-type="linenumber">57</context>
335 </context-group> 365 </context-group>
336 </trans-unit> 366 </trans-unit>
@@ -352,7 +382,7 @@
352 <source>Send me an email to reset my password</source> 382 <source>Send me an email to reset my password</source>
353 <target>æ–°ã—ã„パスワードをメールã§é€ã‚‹</target> 383 <target>æ–°ã—ã„パスワードをメールã§é€ã‚‹</target>
354 <context-group name="null"> 384 <context-group name="null">
355 <context context-type="linenumber">75</context> 385 <context context-type="linenumber">80</context>
356 </context-group> 386 </context-group>
357 </trans-unit> 387 </trans-unit>
358 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 388 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -367,8 +397,7 @@
367 </context-group> 397 </context-group>
368 </trans-unit> 398 </trans-unit>
369 <trans-unit id="7f3bdcce4b2e8c37cd7f0f6c92ef8cff34b039b8"> 399 <trans-unit id="7f3bdcce4b2e8c37cd7f0f6c92ef8cff34b039b8">
370 <source>Confirm password</source> 400 <source>Confirm password</source><target>Confirm password</target><context-group name="null">
371 <context-group name="null">
372 <context context-type="linenumber">19</context> 401 <context context-type="linenumber">19</context>
373 </context-group> 402 </context-group>
374 </trans-unit> 403 </trans-unit>
@@ -408,21 +437,14 @@
408 <source>Example: jane_doe</source> 437 <source>Example: jane_doe</source>
409 <target>例 jane_doe</target> 438 <target>例 jane_doe</target>
410 <context-group name="null"> 439 <context-group name="null">
411 <context context-type="linenumber">16</context> 440 <context context-type="linenumber">17</context>
412 </context-group>
413 </trans-unit>
414 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
415 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
416 <target>ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã® &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;利用è¦ç´„&lt;/a&gt; ã«åŒæ„ã™ã‚‹</target>
417 <context-group name="null">
418 <context context-type="linenumber">54</context>
419 </context-group> 441 </context-group>
420 </trans-unit> 442 </trans-unit>
421 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 443 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
422 <source>Signup</source> 444 <source>Signup</source>
423 <target>サインアップ</target> 445 <target>サインアップ</target>
424 <context-group name="null"> 446 <context-group name="null">
425 <context context-type="linenumber">88</context> 447 <context context-type="linenumber">78</context>
426 </context-group> 448 </context-group>
427 </trans-unit> 449 </trans-unit>
428 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 450 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -432,17 +454,9 @@
432 <context context-type="linenumber">5</context> 454 <context context-type="linenumber">5</context>
433 </context-group> 455 </context-group>
434 </trans-unit> 456 </trans-unit>
435 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
436 <source>Filters</source>
437 <target>フィルタ</target>
438 <context-group name="null">
439 <context context-type="linenumber">16</context>
440 </context-group>
441 </trans-unit>
442 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 457 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
443 <source>Change the language</source> 458 <source>Change the language</source><target>Change the language</target><context-group name="null">
444 <context-group name="null"> 459 <context context-type="linenumber">86</context>
445 <context context-type="linenumber">88</context>
446 </context-group> 460 </context-group>
447 </trans-unit> 461 </trans-unit>
448 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 462 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -451,7 +465,7 @@
451 </source> 465 </source>
452 <target>マイアカウント</target> 466 <target>マイアカウント</target>
453 <context-group name="null"> 467 <context-group name="null">
454 <context context-type="linenumber">22</context> 468 <context context-type="linenumber">20</context>
455 </context-group> 469 </context-group>
456 </trans-unit> 470 </trans-unit>
457 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 471 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -460,7 +474,7 @@
460 </source> 474 </source>
461 <target>マイビデオ</target> 475 <target>マイビデオ</target>
462 <context-group name="null"> 476 <context-group name="null">
463 <context context-type="linenumber">26</context> 477 <context context-type="linenumber">24</context>
464 </context-group> 478 </context-group>
465 </trans-unit> 479 </trans-unit>
466 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 480 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -469,14 +483,14 @@
469 </source> 483 </source>
470 <target>ログアウト</target> 484 <target>ログアウト</target>
471 <context-group name="null"> 485 <context-group name="null">
472 <context context-type="linenumber">30</context> 486 <context context-type="linenumber">28</context>
473 </context-group> 487 </context-group>
474 </trans-unit> 488 </trans-unit>
475 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 489 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
476 <source>Create an account</source> 490 <source>Create an account</source>
477 <target>アカウントを作æˆã™ã‚‹</target> 491 <target>アカウントを作æˆã™ã‚‹</target>
478 <context-group name="null"> 492 <context-group name="null">
479 <context context-type="linenumber">39</context> 493 <context context-type="linenumber">37</context>
480 </context-group> 494 </context-group>
481 </trans-unit> 495 </trans-unit>
482 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 496 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -490,48 +504,47 @@
490 <source>Subscriptions</source> 504 <source>Subscriptions</source>
491 <target>サブスクリプション</target> 505 <target>サブスクリプション</target>
492 <context-group name="null"> 506 <context-group name="null">
493 <context context-type="linenumber">47</context> 507 <context context-type="linenumber">45</context>
494 </context-group> 508 </context-group>
495 </trans-unit> 509 </trans-unit>
496 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 510 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
497 <source>Overview</source> 511 <source>Overview</source>
498 <target>調査</target> 512 <target>調査</target>
499 <context-group name="null"> 513 <context-group name="null">
500 <context context-type="linenumber">52</context> 514 <context context-type="linenumber">50</context>
501 </context-group> 515 </context-group>
502 </trans-unit> 516 </trans-unit>
503 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 517 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
504 <source>Trending</source> 518 <source>Trending</source><target>Trending</target><context-group name="null">
505 <context-group name="null"> 519 <context context-type="linenumber">55</context>
506 <context context-type="linenumber">57</context>
507 </context-group> 520 </context-group>
508 </trans-unit> 521 </trans-unit>
509 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 522 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
510 <source>Recently added</source> 523 <source>Recently added</source>
511 <target>最近追加ã•ã‚ŒãŸ</target> 524 <target>最近追加ã•ã‚ŒãŸ</target>
512 <context-group name="null"> 525 <context-group name="null">
513 <context context-type="linenumber">62</context> 526 <context context-type="linenumber">60</context>
514 </context-group> 527 </context-group>
515 </trans-unit> 528 </trans-unit>
516 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 529 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
517 <source>Local</source> 530 <source>Local</source>
518 <target>地元</target> 531 <target>地元</target>
519 <context-group name="null"> 532 <context-group name="null">
520 <context context-type="linenumber">67</context> 533 <context context-type="linenumber">65</context>
521 </context-group> 534 </context-group>
522 </trans-unit> 535 </trans-unit>
523 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 536 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
524 <source>More</source> 537 <source>More</source>
525 <target>多ãã®</target> 538 <target>多ãã®</target>
526 <context-group name="null"> 539 <context-group name="null">
527 <context context-type="linenumber">72</context> 540 <context context-type="linenumber">70</context>
528 </context-group> 541 </context-group>
529 </trans-unit> 542 </trans-unit>
530 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 543 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
531 <source>Administration</source> 544 <source>Administration</source>
532 <target>é‹å–¶</target> 545 <target>é‹å–¶</target>
533 <context-group name="null"> 546 <context-group name="null">
534 <context context-type="linenumber">76</context> 547 <context context-type="linenumber">74</context>
535 </context-group> 548 </context-group>
536 </trans-unit> 549 </trans-unit>
537 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 550 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -622,7 +635,7 @@
622 <source>No results.</source> 635 <source>No results.</source>
623 <target>çµæžœãŒã‚ã‚Šã¾ã›ã‚“。</target> 636 <target>çµæžœãŒã‚ã‚Šã¾ã›ã‚“。</target>
624 <context-group name="null"> 637 <context-group name="null">
625 <context context-type="linenumber">7</context> 638 <context context-type="linenumber">20</context>
626 </context-group> 639 </context-group>
627 </trans-unit> 640 </trans-unit>
628 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 641 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -659,7 +672,7 @@
659 <source>Instance</source> 672 <source>Instance</source>
660 <target>インスタンス</target> 673 <target>インスタンス</target>
661 <context-group name="null"> 674 <context-group name="null">
662 <context context-type="linenumber">8</context> 675 <context context-type="linenumber">12</context>
663 </context-group> 676 </context-group>
664 </trans-unit> 677 </trans-unit>
665 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 678 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -669,6 +682,24 @@
669 <context context-type="linenumber">7</context> 682 <context context-type="linenumber">7</context>
670 </context-group> 683 </context-group>
671 </trans-unit> 684 </trans-unit>
685 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
686 <source>
687 Cancel
688 </source>
689 <target>
690 キャンセル
691 </target>
692 <context-group name="null">
693 <context context-type="linenumber">26</context>
694 </context-group>
695 </trans-unit>
696 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
697 <source>Submit</source>
698 <target>å·®ã—出ã™</target>
699 <context-group name="null">
700 <context context-type="linenumber">31</context>
701 </context-group>
702 </trans-unit>
672 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 703 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
673 <source>Description</source> 704 <source>Description</source>
674 <target>説明</target> 705 <target>説明</target>
@@ -680,23 +711,14 @@
680 <source>Terms</source> 711 <source>Terms</source>
681 <target>æ¡é …</target> 712 <target>æ¡é …</target>
682 <context-group name="null"> 713 <context-group name="null">
683 <context context-type="linenumber">44</context> 714 <context context-type="linenumber">39</context>
684 </context-group> 715 </context-group>
685 </trans-unit> 716 </trans-unit>
686 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 717 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
687 <source>User registration is allowed and</source> 718 <source>User registration is allowed and</source>
688 <target>ユーザー登録ãŒå¯èƒ½ã§ã™</target> 719 <target>ユーザー登録ãŒå¯èƒ½ã§ã™</target>
689 <context-group name="null"> 720 <context-group name="null">
690 <context context-type="linenumber">25</context> 721 <context context-type="linenumber">29</context>
691 </context-group>
692 </trans-unit>
693 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
694 <source>
695 User registration is currently not allowed.
696 </source>
697 <target>ユーザー登録ã¯ç¾åœ¨å—ã‘付ã‘ã¦ãŠã‚Šã¾ã›ã‚“</target>
698 <context-group name="null">
699 <context context-type="linenumber">36</context>
700 </context-group> 722 </context-group>
701 </trans-unit> 723 </trans-unit>
702 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 724 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -749,14 +771,14 @@
749 <source>Short description</source> 771 <source>Short description</source>
750 <target>ç°¡å˜ãªèª¬æ˜Ž</target> 772 <target>ç°¡å˜ãªèª¬æ˜Ž</target>
751 <context-group name="null"> 773 <context-group name="null">
752 <context context-type="linenumber">22</context> 774 <context context-type="linenumber">21</context>
753 </context-group> 775 </context-group>
754 </trans-unit> 776 </trans-unit>
755 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 777 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
756 <source>Videos Overview</source> 778 <source>Videos Overview</source>
757 <target>ビデオã®æ¦‚è¦</target> 779 <target>ビデオã®æ¦‚è¦</target>
758 <context-group name="null"> 780 <context-group name="null">
759 <context context-type="linenumber">58</context> 781 <context context-type="linenumber">51</context>
760 </context-group> 782 </context-group>
761 </trans-unit> 783 </trans-unit>
762 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2"> 784 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2">
@@ -777,21 +799,28 @@
777 <source>Signup enabled</source> 799 <source>Signup enabled</source>
778 <target>サインアップãŒæœ‰åŠ¹</target> 800 <target>サインアップãŒæœ‰åŠ¹</target>
779 <context-group name="null"> 801 <context-group name="null">
780 <context context-type="linenumber">92</context> 802 <context context-type="linenumber">84</context>
781 </context-group> 803 </context-group>
782 </trans-unit> 804 </trans-unit>
783 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 805 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
784 <source>Signup requires email verification</source> 806 <source>Signup requires email verification</source>
785 <target>サインアップã«ã¯é›»å­ãƒ¡ãƒ¼ãƒ«ã®ç¢ºèªãŒå¿…è¦ã§ã™</target> 807 <target>サインアップã«ã¯é›»å­ãƒ¡ãƒ¼ãƒ«ã®ç¢ºèªãŒå¿…è¦ã§ã™</target>
786 <context-group name="null"> 808 <context-group name="null">
787 <context context-type="linenumber">97</context> 809 <context context-type="linenumber">91</context>
788 </context-group> 810 </context-group>
789 </trans-unit> 811 </trans-unit>
790 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 812 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
791 <source>Signup limit</source> 813 <source>Signup limit</source>
792 <target>サインアップã®åˆ¶é™</target> 814 <target>サインアップã®åˆ¶é™</target>
793 <context-group name="null"> 815 <context-group name="null">
794 <context context-type="linenumber">101</context> 816 <context context-type="linenumber">96</context>
817 </context-group>
818 </trans-unit>
819 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
820 <source>Users</source>
821 <target>ユーザー</target>
822 <context-group name="null">
823 <context context-type="linenumber">105</context>
795 </context-group> 824 </context-group>
796 </trans-unit> 825 </trans-unit>
797 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 826 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -805,28 +834,21 @@
805 <source>Video import with a torrent file or a magnet URI enabled</source> 834 <source>Video import with a torrent file or a magnet URI enabled</source>
806 <target>Torrent ファイル ã¾ãŸã¯ magnet リンクを使用ã—ã¦å‹•ç”»ã‚’インãƒãƒ¼ãƒˆã™ã‚‹</target> 835 <target>Torrent ファイル ã¾ãŸã¯ magnet リンクを使用ã—ã¦å‹•ç”»ã‚’インãƒãƒ¼ãƒˆã™ã‚‹</target>
807 <context-group name="null"> 836 <context-group name="null">
808 <context context-type="linenumber">120</context> 837 <context context-type="linenumber">148</context>
809 </context-group> 838 </context-group>
810 </trans-unit> 839 </trans-unit>
811 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 840 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
812 <source>Administrator</source> 841 <source>Administrator</source>
813 <target>管ç†è€…</target> 842 <target>管ç†è€…</target>
814 <context-group name="null"> 843 <context-group name="null">
815 <context context-type="linenumber">123</context> 844 <context context-type="linenumber">155</context>
816 </context-group> 845 </context-group>
817 </trans-unit> 846 </trans-unit>
818 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 847 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
819 <source>Admin email</source> 848 <source>Admin email</source>
820 <target>管ç†è€…ã®é›»å­ãƒ¡ãƒ¼ãƒ«</target> 849 <target>管ç†è€…ã®é›»å­ãƒ¡ãƒ¼ãƒ«</target>
821 <context-group name="null"> 850 <context-group name="null">
822 <context context-type="linenumber">126</context> 851 <context context-type="linenumber">158</context>
823 </context-group>
824 </trans-unit>
825 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
826 <source>Users</source>
827 <target>ユーザー</target>
828 <context-group name="null">
829 <context context-type="linenumber">136</context>
830 </context-group> 852 </context-group>
831 </trans-unit> 853 </trans-unit>
832 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 854 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -840,69 +862,68 @@
840 <source>Twitter</source> 862 <source>Twitter</source>
841 <target>Twitter</target> 863 <target>Twitter</target>
842 <context-group name="null"> 864 <context-group name="null">
843 <context context-type="linenumber">170</context> 865 <context context-type="linenumber">178</context>
844 </context-group> 866 </context-group>
845 </trans-unit> 867 </trans-unit>
846 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 868 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
847 <source>Your Twitter username</source> 869 <source>Your Twitter username</source>
848 <target>ã‚ãªãŸã®Twitterユーザーå</target> 870 <target>ã‚ãªãŸã®Twitterユーザーå</target>
849 <context-group name="null"> 871 <context-group name="null">
850 <context context-type="linenumber">173</context> 872 <context context-type="linenumber">184</context>
851 </context-group> 873 </context-group>
852 </trans-unit> 874 </trans-unit>
853 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 875 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
854 <source>Services</source> 876 <source>Services</source>
855 <target>サービス</target> 877 <target>サービス</target>
856 <context-group name="null"> 878 <context-group name="null">
857 <context context-type="linenumber">168</context> 879 <context context-type="linenumber">176</context>
858 </context-group> 880 </context-group>
859 </trans-unit> 881 </trans-unit>
860 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 882 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
861 <source>Transcoding</source> 883 <source>Transcoding</source>
862 <target>トランスコード</target> 884 <target>トランスコード</target>
863 <context-group name="null"> 885 <context-group name="null">
864 <context context-type="linenumber">200</context> 886 <context context-type="linenumber">215</context>
865 </context-group> 887 </context-group>
866 </trans-unit> 888 </trans-unit>
867 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 889 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
868 <source>Transcoding enabled</source> 890 <source>Transcoding enabled</source>
869 <target>トランスコードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™</target> 891 <target>トランスコードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™</target>
870 <context-group name="null"> 892 <context-group name="null">
871 <context context-type="linenumber">204</context> 893 <context context-type="linenumber">221</context>
872 </context-group> 894 </context-group>
873 </trans-unit> 895 </trans-unit>
874 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 896 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
875 <source>Transcoding threads</source> 897 <source>Transcoding threads</source><target>Transcoding threads</target><context-group name="null">
876 <context-group name="null"> 898 <context context-type="linenumber">237</context>
877 <context context-type="linenumber">211</context>
878 </context-group> 899 </context-group>
879 </trans-unit> 900 </trans-unit>
880 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 901 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
881 <source>Customizations</source> 902 <source>Customizations</source>
882 <target>カスタマイズ</target> 903 <target>カスタマイズ</target>
883 <context-group name="null"> 904 <context-group name="null">
884 <context context-type="linenumber">264</context> 905 <context context-type="linenumber">289</context>
885 </context-group> 906 </context-group>
886 </trans-unit> 907 </trans-unit>
887 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 908 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
888 <source>JavaScript</source> 909 <source>JavaScript</source>
889 <target>JavaScript</target> 910 <target>JavaScript</target>
890 <context-group name="null"> 911 <context-group name="null">
891 <context context-type="linenumber">267</context> 912 <context context-type="linenumber">294</context>
892 </context-group> 913 </context-group>
893 </trans-unit> 914 </trans-unit>
894 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 915 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
895 <source>Advanced configuration</source> 916 <source>Advanced configuration</source>
896 <target>高度ãªæ§‹æˆ</target> 917 <target>高度ãªæ§‹æˆ</target>
897 <context-group name="null"> 918 <context-group name="null">
898 <context context-type="linenumber">197</context> 919 <context context-type="linenumber">212</context>
899 </context-group> 920 </context-group>
900 </trans-unit> 921 </trans-unit>
901 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 922 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
902 <source>Update configuration</source> 923 <source>Update configuration</source>
903 <target>設定を更新ã™ã‚‹</target> 924 <target>設定を更新ã™ã‚‹</target>
904 <context-group name="null"> 925 <context-group name="null">
905 <context context-type="linenumber">314</context> 926 <context context-type="linenumber">340</context>
906 </context-group> 927 </context-group>
907 </trans-unit> 928 </trans-unit>
908 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 929 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -934,14 +955,14 @@
934 <source>Score</source> 955 <source>Score</source>
935 <target>スコア</target> 956 <target>スコア</target>
936 <context-group name="null"> 957 <context-group name="null">
937 <context context-type="linenumber">8</context> 958 <context context-type="linenumber">17</context>
938 </context-group> 959 </context-group>
939 </trans-unit> 960 </trans-unit>
940 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 961 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
941 <source>Host</source> 962 <source>Host</source>
942 <target>ホスト</target> 963 <target>ホスト</target>
943 <context-group name="null"> 964 <context-group name="null">
944 <context context-type="linenumber">8</context> 965 <context context-type="linenumber">19</context>
945 </context-group> 966 </context-group>
946 </trans-unit> 967 </trans-unit>
947 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 968 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1004,21 +1025,7 @@
1004 <source>Role</source> 1025 <source>Role</source>
1005 <target>役割</target> 1026 <target>役割</target>
1006 <context-group name="null"> 1027 <context-group name="null">
1007 <context context-type="linenumber">20</context> 1028 <context context-type="linenumber">43</context>
1008 </context-group>
1009 </trans-unit>
1010 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1011 <source>Reason...</source>
1012 <target>ç†ç”±â€¦</target>
1013 <context-group name="null">
1014 <context context-type="linenumber">11</context>
1015 </context-group>
1016 </trans-unit>
1017 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
1018 <source>Ban this user</source>
1019 <target>ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ç¦æ­¢ã™ã‚‹</target>
1020 <context-group name="null">
1021 <context context-type="linenumber">25</context>
1022 </context-group> 1029 </context-group>
1023 </trans-unit> 1030 </trans-unit>
1024 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1031 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
@@ -1028,18 +1035,18 @@
1028 <context context-type="linenumber">2</context> 1035 <context context-type="linenumber">2</context>
1029 </context-group> 1036 </context-group>
1030 </trans-unit> 1037 </trans-unit>
1031 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1038 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1032 <source>Actions</source> 1039 <source>Go to the account page</source>
1033 <target>行動</target> 1040 <target>アカウントページã«ç§»å‹•</target>
1034 <context-group name="null"> 1041 <context-group name="null">
1035 <context context-type="linenumber">33</context> 1042 <context context-type="linenumber">133</context>
1036 </context-group> 1043 </context-group>
1037 </trans-unit> 1044 </trans-unit>
1038 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1045 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1039 <source>Ban reason:</source> 1046 <source>Ban reason:</source>
1040 <target>ç¦æ­¢ç†ç”±ï¼š</target> 1047 <target>ç¦æ­¢ç†ç”±ï¼š</target>
1041 <context-group name="null"> 1048 <context-group name="null">
1042 <context context-type="linenumber">51</context> 1049 <context context-type="linenumber">95</context>
1043 </context-group> 1050 </context-group>
1044 </trans-unit> 1051 </trans-unit>
1045 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1052 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1084,6 +1091,13 @@
1084 <context context-type="linenumber">33</context> 1091 <context context-type="linenumber">33</context>
1085 </context-group> 1092 </context-group>
1086 </trans-unit> 1093 </trans-unit>
1094 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1095 <source>Actions</source>
1096 <target>行動</target>
1097 <context-group name="null">
1098 <context context-type="linenumber">35</context>
1099 </context-group>
1100 </trans-unit>
1087 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1101 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1088 <source>Reason:</source> 1102 <source>Reason:</source>
1089 <target>ç†ç”±ï¼š</target> 1103 <target>ç†ç”±ï¼š</target>
@@ -1105,46 +1119,25 @@
1105 <context context-type="linenumber">2</context> 1119 <context context-type="linenumber">2</context>
1106 </context-group> 1120 </context-group>
1107 </trans-unit> 1121 </trans-unit>
1108 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1109 <source>My subscriptions</source>
1110 <target>ç§ã®è¼¸å…¥å“</target>
1111 <context-group name="null">
1112 <context context-type="linenumber">16</context>
1113 </context-group>
1114 </trans-unit>
1115 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1116 <source>My imports</source>
1117 <target>ç§ã®è³¼èª­</target>
1118 <context-group name="null">
1119 <context context-type="linenumber">18</context>
1120 </context-group>
1121 </trans-unit>
1122 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1123 <source>Ownership changes</source>
1124 <target>所有権ã®å¤‰æ›´</target>
1125 <context-group name="null">
1126 <context context-type="linenumber">22</context>
1127 </context-group>
1128 </trans-unit>
1129 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8"> 1122 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
1130 <source>Profile</source> 1123 <source>Profile</source>
1131 <target>プロフィール</target> 1124 <target>プロフィール</target>
1132 <context-group name="null"> 1125 <context-group name="null">
1133 <context context-type="linenumber">8</context> 1126 <context context-type="linenumber">7</context>
1134 </context-group> 1127 </context-group>
1135 </trans-unit> 1128 </trans-unit>
1136 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1129 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1137 <source>Video settings</source> 1130 <source>Video settings</source>
1138 <target>ビデオ設定</target> 1131 <target>ビデオ設定</target>
1139 <context-group name="null"> 1132 <context-group name="null">
1140 <context context-type="linenumber">15</context> 1133 <context context-type="linenumber">16</context>
1141 </context-group> 1134 </context-group>
1142 </trans-unit> 1135 </trans-unit>
1143 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1136 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1144 <source>Danger zone</source> 1137 <source>Danger zone</source>
1145 <target>å±é™ºåŒºåŸŸ</target> 1138 <target>å±é™ºåŒºåŸŸ</target>
1146 <context-group name="null"> 1139 <context-group name="null">
1147 <context context-type="linenumber">18</context> 1140 <context context-type="linenumber">19</context>
1148 </context-group> 1141 </context-group>
1149 </trans-unit> 1142 </trans-unit>
1150 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1143 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1154,13 +1147,6 @@
1154 <context context-type="linenumber">46</context> 1147 <context context-type="linenumber">46</context>
1155 </context-group> 1148 </context-group>
1156 </trans-unit> 1149 </trans-unit>
1157 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1158 <source>Submit</source>
1159 <target>å·®ã—出ã™</target>
1160 <context-group name="null">
1161 <context context-type="linenumber">24</context>
1162 </context-group>
1163 </trans-unit>
1164 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 1150 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
1165 <source> 1151 <source>
1166 Cancel 1152 Cancel
@@ -1246,7 +1232,7 @@
1246 <source>Save</source> 1232 <source>Save</source>
1247 <target>貯ã‚ã‚‹</target> 1233 <target>貯ã‚ã‚‹</target>
1248 <context-group name="null"> 1234 <context-group name="null">
1249 <context context-type="linenumber">23</context> 1235 <context context-type="linenumber">32</context>
1250 </context-group> 1236 </context-group>
1251 </trans-unit> 1237 </trans-unit>
1252 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9"> 1238 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
@@ -1302,7 +1288,7 @@
1302 <source>Publish</source> 1288 <source>Publish</source>
1303 <target>出ã™</target> 1289 <target>出ã™</target>
1304 <context-group name="null"> 1290 <context-group name="null">
1305 <context context-type="linenumber">55</context> 1291 <context context-type="linenumber">65</context>
1306 </context-group> 1292 </context-group>
1307 </trans-unit> 1293 </trans-unit>
1308 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 1294 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
@@ -1379,17 +1365,6 @@
1379 <context context-type="linenumber">3</context> 1365 <context context-type="linenumber">3</context>
1380 </context-group> 1366 </context-group>
1381 </trans-unit> 1367 </trans-unit>
1382 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
1383 <source>
1384 Cancel
1385 </source>
1386 <target>
1387 キャンセル
1388 </target>
1389 <context-group name="null">
1390 <context context-type="linenumber">19</context>
1391 </context-group>
1392 </trans-unit>
1393 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 1368 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
1394 <source>Share</source> 1369 <source>Share</source>
1395 <target>シェア</target> 1370 <target>シェア</target>
@@ -1457,13 +1432,6 @@
1457 <context context-type="linenumber">134</context> 1432 <context context-type="linenumber">134</context>
1458 </context-group> 1433 </context-group>
1459 </trans-unit> 1434 </trans-unit>
1460 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1461 <source>Go to the account page</source>
1462 <target>アカウントページã«ç§»å‹•</target>
1463 <context-group name="null">
1464 <context context-type="linenumber">133</context>
1465 </context-group>
1466 </trans-unit>
1467 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 1435 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
1468 <source>Show more</source> 1436 <source>Show more</source>
1469 <target>ã‚‚ã£ã¨è¦‹ã›ã‚‹</target> 1437 <target>ã‚‚ã£ã¨è¦‹ã›ã‚‹</target>
@@ -1525,18 +1493,11 @@
1525 <context context-type="linenumber">3</context> 1493 <context context-type="linenumber">3</context>
1526 </context-group> 1494 </context-group>
1527 </trans-unit> 1495 </trans-unit>
1528 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
1529 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
1530 <target>ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã€ActivityPub 対応㮠Fediverse を使用ã—ã¦è³¼èª­å‡ºæ¥ã¾ã™ã€‚例ãˆã°ã€Mastodon ã‚„ Pleroma ã®å ´åˆã€æ¤œç´¢ãƒœãƒƒã‚¯ã‚¹ã«å…¥åŠ›ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚&lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&amp;&lt;strong&gt; ã«ç™»éŒ²ã—ã¦ä¸‹ã•ã„。 PeerTubeユーザーã¨ã—ã¦ã®è³¼èª­ã¯ã€&lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt; ã‚’å‚照下ã•ã„。</target>
1531 <context-group name="null">
1532 <context context-type="linenumber">8</context>
1533 </context-group>
1534 </trans-unit>
1535 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 1496 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
1536 <source>No comments.</source> 1497 <source>No comments.</source>
1537 <target>コメントã¯ã¾ã ã‚ã‚Šã¾ã›ã‚“。</target> 1498 <target>コメントã¯ã¾ã ã‚ã‚Šã¾ã›ã‚“。</target>
1538 <context-group name="null"> 1499 <context-group name="null">
1539 <context context-type="linenumber">18</context> 1500 <context context-type="linenumber">17</context>
1540 </context-group> 1501 </context-group>
1541 </trans-unit> 1502 </trans-unit>
1542 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 1503 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -1547,7 +1508,7 @@
1547 ã“ã®å‹•ç”»ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ç„¡åŠ¹ã§ã™ã€‚ 1508 ã“ã®å‹•ç”»ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ç„¡åŠ¹ã§ã™ã€‚
1548 </target> 1509 </target>
1549 <context-group name="null"> 1510 <context-group name="null">
1550 <context context-type="linenumber">64</context> 1511 <context context-type="linenumber">63</context>
1551 </context-group> 1512 </context-group>
1552 </trans-unit> 1513 </trans-unit>
1553 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 1514 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -1582,13 +1543,6 @@
1582 <context context-type="linenumber">14</context> 1543 <context context-type="linenumber">14</context>
1583 </context-group> 1544 </context-group>
1584 </trans-unit> 1545 </trans-unit>
1585 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
1586 <source>Error getting about from server</source>
1587 <target>サーãƒãƒ¼ã‹ã‚‰ã®ã‚¨ãƒ©ãƒ¼</target>
1588 <context-group name="null">
1589 <context context-type="linenumber">1</context>
1590 </context-group>
1591 </trans-unit>
1592 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 1546 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
1593 <source>No description</source> 1547 <source>No description</source>
1594 <target>説明ã¯ã‚ã‚Šã¾ã›ã‚“</target> 1548 <target>説明ã¯ã‚ã‚Šã¾ã›ã‚“</target>
@@ -1603,20 +1557,6 @@
1603 <context context-type="linenumber">1</context> 1557 <context context-type="linenumber">1</context>
1604 </context-group> 1558 </context-group>
1605 </trans-unit> 1559 </trans-unit>
1606 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1607 <source>Error</source>
1608 <target>エラー</target>
1609 <context-group name="null">
1610 <context context-type="linenumber">1</context>
1611 </context-group>
1612 </trans-unit>
1613 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1614 <source>Success</source>
1615 <target>æˆåŠŸ</target>
1616 <context-group name="null">
1617 <context context-type="linenumber">1</context>
1618 </context-group>
1619 </trans-unit>
1620 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 1560 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
1621 <source>Configuration updated.</source> 1561 <source>Configuration updated.</source>
1622 <target>構æˆãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚</target> 1562 <target>構æˆãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚</target>
@@ -1652,13 +1592,6 @@
1652 <context context-type="linenumber">1</context> 1592 <context context-type="linenumber">1</context>
1653 </context-group> 1593 </context-group>
1654 </trans-unit> 1594 </trans-unit>
1655 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
1656 <source>Ban</source>
1657 <target>ç¦æ­¢</target>
1658 <context-group name="null">
1659 <context context-type="linenumber">1</context>
1660 </context-group>
1661 </trans-unit>
1662 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 1595 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
1663 <source>Unban</source> 1596 <source>Unban</source>
1664 <target>抑止ã—ãªã„</target> 1597 <target>抑止ã—ãªã„</target>
@@ -1667,8 +1600,7 @@
1667 </context-group> 1600 </context-group>
1668 </trans-unit> 1601 </trans-unit>
1669 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf"> 1602 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
1670 <source>You cannot ban root.</source> 1603 <source>You cannot ban root.</source><target>You cannot ban root.</target><context-group name="null">
1671 <context-group name="null">
1672 <context context-type="linenumber">1</context> 1604 <context context-type="linenumber">1</context>
1673 </context-group> 1605 </context-group>
1674 </trans-unit> 1606 </trans-unit>
@@ -1707,9 +1639,16 @@
1707 <context context-type="linenumber">1</context> 1639 <context context-type="linenumber">1</context>
1708 </context-group> 1640 </context-group>
1709 </trans-unit> 1641 </trans-unit>
1710 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 1642 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1711 <source>Channels</source> 1643 <source>My subscriptions</source>
1712 <target>ãƒãƒ£ãƒ³ãƒãƒ«</target> 1644 <target>ç§ã®è¼¸å…¥å“</target>
1645 <context-group name="null">
1646 <context context-type="linenumber">1</context>
1647 </context-group>
1648 </trans-unit>
1649 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1650 <source>Ownership changes</source>
1651 <target>所有権ã®å¤‰æ›´</target>
1713 <context-group name="null"> 1652 <context-group name="null">
1714 <context context-type="linenumber">1</context> 1653 <context context-type="linenumber">1</context>
1715 </context-group> 1654 </context-group>
@@ -1729,6 +1668,13 @@
1729 <context context-type="linenumber">1</context> 1668 <context context-type="linenumber">1</context>
1730 </context-group> 1669 </context-group>
1731 </trans-unit> 1670 </trans-unit>
1671 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1672 <source>Error</source>
1673 <target>エラー</target>
1674 <context-group name="null">
1675 <context context-type="linenumber">1</context>
1676 </context-group>
1677 </trans-unit>
1732 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 1678 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
1733 <source>You need to reconnect.</source> 1679 <source>You need to reconnect.</source>
1734 <target>å†æŽ¥ç¶šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target> 1680 <target>å†æŽ¥ç¶šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
@@ -1743,6 +1689,20 @@
1743 <context context-type="linenumber">1</context> 1689 <context context-type="linenumber">1</context>
1744 </context-group> 1690 </context-group>
1745 </trans-unit> 1691 </trans-unit>
1692 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
1693 <source>Info</source>
1694 <target>情報</target>
1695 <context-group name="null">
1696 <context context-type="linenumber">1</context>
1697 </context-group>
1698 </trans-unit>
1699 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1700 <source>Success</source>
1701 <target>æˆåŠŸ</target>
1702 <context-group name="null">
1703 <context context-type="linenumber">1</context>
1704 </context-group>
1705 </trans-unit>
1746 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 1706 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
1747 <source>Incorrect username or password.</source> 1707 <source>Incorrect username or password.</source>
1748 <target>ユーザーãƒãƒ¼ãƒ ã¾ãŸã¯ãƒ‘スワードãŒé•ã„ã¾ã™ã€‚</target> 1708 <target>ユーザーãƒãƒ¼ãƒ ã¾ãŸã¯ãƒ‘スワードãŒé•ã„ã¾ã™ã€‚</target>
@@ -1813,6 +1773,20 @@
1813 <context context-type="linenumber">1</context> 1773 <context context-type="linenumber">1</context>
1814 </context-group> 1774 </context-group>
1815 </trans-unit> 1775 </trans-unit>
1776 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
1777 <source>Email is required.</source>
1778 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚</target>
1779 <context-group name="null">
1780 <context context-type="linenumber">1</context>
1781 </context-group>
1782 </trans-unit>
1783 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
1784 <source>Email must be valid.</source>
1785 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
1786 <context-group name="null">
1787 <context context-type="linenumber">1</context>
1788 </context-group>
1789 </trans-unit>
1816 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 1790 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
1817 <source>Username is required.</source> 1791 <source>Username is required.</source>
1818 <target>ユーザーåã¯å¿…é ˆã§ã™ã€‚</target> 1792 <target>ユーザーåã¯å¿…é ˆã§ã™ã€‚</target>
@@ -1834,41 +1808,6 @@
1834 <context context-type="linenumber">1</context> 1808 <context context-type="linenumber">1</context>
1835 </context-group> 1809 </context-group>
1836 </trans-unit> 1810 </trans-unit>
1837 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
1838 <source>Username must be at least 3 characters long.</source>
1839 <target>ユーザーåã¯3文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
1840 <context-group name="null">
1841 <context context-type="linenumber">1</context>
1842 </context-group>
1843 </trans-unit>
1844 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
1845 <source>Username cannot be more than 20 characters long.</source>
1846 <target>ユーザーåã®é•·ã•ã¯20文字を超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</target>
1847 <context-group name="null">
1848 <context context-type="linenumber">1</context>
1849 </context-group>
1850 </trans-unit>
1851 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
1852 <source>Username should be only lowercase alphanumeric characters.</source>
1853 <target>ユーザーåã¯å°æ–‡å­—ã®è‹±æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
1854 <context-group name="null">
1855 <context context-type="linenumber">1</context>
1856 </context-group>
1857 </trans-unit>
1858 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
1859 <source>Email is required.</source>
1860 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚</target>
1861 <context-group name="null">
1862 <context context-type="linenumber">1</context>
1863 </context-group>
1864 </trans-unit>
1865 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
1866 <source>Email must be valid.</source>
1867 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
1868 <context-group name="null">
1869 <context context-type="linenumber">1</context>
1870 </context-group>
1871 </trans-unit>
1872 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 1811 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
1873 <source>Password must be at least 6 characters long.</source> 1812 <source>Password must be at least 6 characters long.</source>
1874 <target>パスワードã¯6文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target> 1813 <target>パスワードã¯6文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
@@ -1897,13 +1836,6 @@
1897 <context context-type="linenumber">1</context> 1836 <context context-type="linenumber">1</context>
1898 </context-group> 1837 </context-group>
1899 </trans-unit> 1838 </trans-unit>
1900 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
1901 <source>Description cannot be more than 250 characters long.</source>
1902 <target>説明ã®é•·ã•ã¯250文字を超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</target>
1903 <context-group name="null">
1904 <context context-type="linenumber">1</context>
1905 </context-group>
1906 </trans-unit>
1907 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 1839 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
1908 <source>Report reason is required.</source> 1840 <source>Report reason is required.</source>
1909 <target>報告ç†ç”±ãŒå¿…è¦ã§ã™ã€‚</target> 1841 <target>報告ç†ç”±ãŒå¿…è¦ã§ã™ã€‚</target>
@@ -1953,13 +1885,6 @@
1953 <context context-type="linenumber">1</context> 1885 <context context-type="linenumber">1</context>
1954 </context-group> 1886 </context-group>
1955 </trans-unit> 1887 </trans-unit>
1956 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
1957 <source>Description cannot be more than 500 characters long.</source>
1958 <target>説明ã®é•·ã•ã¯500文字を超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</target>
1959 <context-group name="null">
1960 <context context-type="linenumber">1</context>
1961 </context-group>
1962 </trans-unit>
1963 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 1888 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
1964 <source>Comment is required.</source> 1889 <source>Comment is required.</source>
1965 <target>コメントã¯å¿…é ˆã§ã™ã€‚</target> 1890 <target>コメントã¯å¿…é ˆã§ã™ã€‚</target>
@@ -2093,6 +2018,104 @@
2093 <context context-type="linenumber">1</context> 2018 <context context-type="linenumber">1</context>
2094 </context-group> 2019 </context-group>
2095 </trans-unit> 2020 </trans-unit>
2021 <trans-unit id="6549890cd0d6b59fb0e1aa383b00483a68a55eef">
2022 <source>Sun</source>
2023 <target>日曜日</target>
2024 <context-group name="null">
2025 <context context-type="linenumber">1</context>
2026 </context-group>
2027 </trans-unit>
2028 <trans-unit id="3382aa5d7f520e197fb59a4995fe1beffca2d0ff">
2029 <source>Mon</source>
2030 <target>月曜日</target>
2031 <context-group name="null">
2032 <context context-type="linenumber">1</context>
2033 </context-group>
2034 </trans-unit>
2035 <trans-unit id="f883ec926274974df0fc46c037cbffd6a863ebc9">
2036 <source>Tue</source>
2037 <target>ç«æ›œæ—¥</target>
2038 <context-group name="null">
2039 <context context-type="linenumber">1</context>
2040 </context-group>
2041 </trans-unit>
2042 <trans-unit id="242b4f4b5651e24f9a9007ef153a57981e4b989d">
2043 <source>Wed</source>
2044 <target>水曜日</target>
2045 <context-group name="null">
2046 <context context-type="linenumber">1</context>
2047 </context-group>
2048 </trans-unit>
2049 <trans-unit id="5a2c39d56b8f00a6a4670a63b53caacbda953be6">
2050 <source>Thu</source>
2051 <target>木曜日</target>
2052 <context-group name="null">
2053 <context context-type="linenumber">1</context>
2054 </context-group>
2055 </trans-unit>
2056 <trans-unit id="4cdf23d523a0e52e0dec9cd650ffd9bd6952792c">
2057 <source>Fri</source>
2058 <target>金曜日</target>
2059 <context-group name="null">
2060 <context context-type="linenumber">1</context>
2061 </context-group>
2062 </trans-unit>
2063 <trans-unit id="1283d165a942d7f4c469ba34f99dbb9e927d0261">
2064 <source>Sat</source>
2065 <target>土曜日</target>
2066 <context-group name="null">
2067 <context context-type="linenumber">1</context>
2068 </context-group>
2069 </trans-unit>
2070 <trans-unit id="2fba8448ff13105c57665a9a6ffcfe9615d855dd">
2071 <source>Su</source>
2072 <target>æ—¥.</target>
2073 <context-group name="null">
2074 <context context-type="linenumber">1</context>
2075 </context-group>
2076 </trans-unit>
2077 <trans-unit id="388144af7ac7651d2615b9be0e84f43ae71d9fb3">
2078 <source>Mo</source>
2079 <target>月.</target>
2080 <context-group name="null">
2081 <context context-type="linenumber">1</context>
2082 </context-group>
2083 </trans-unit>
2084 <trans-unit id="d96313e42b5f0751ce2676a31d309b4d322ab462">
2085 <source>Tu</source>
2086 <target>ç«.</target>
2087 <context-group name="null">
2088 <context context-type="linenumber">1</context>
2089 </context-group>
2090 </trans-unit>
2091 <trans-unit id="06cc3d39f78c0615b707cef39cd4875599611fef">
2092 <source>We</source>
2093 <target>æ°´.</target>
2094 <context-group name="null">
2095 <context context-type="linenumber">1</context>
2096 </context-group>
2097 </trans-unit>
2098 <trans-unit id="790894436cca9d675d59be9a8aafd58acccde2cd">
2099 <source>Th</source>
2100 <target>木.</target>
2101 <context-group name="null">
2102 <context context-type="linenumber">1</context>
2103 </context-group>
2104 </trans-unit>
2105 <trans-unit id="42dfe37169f8471367c31489155229bbe1747ea5">
2106 <source>Fr</source>
2107 <target>金.</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">1</context>
2110 </context-group>
2111 </trans-unit>
2112 <trans-unit id="1b64ea3e04ceeb512e8974eb0019dee4f211c7a0">
2113 <source>Sa</source>
2114 <target>土.</target>
2115 <context-group name="null">
2116 <context context-type="linenumber">1</context>
2117 </context-group>
2118 </trans-unit>
2096 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0"> 2119 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
2097 <source>January</source> 2120 <source>January</source>
2098 <target>1月</target> 2121 <target>1月</target>
@@ -2352,6 +2375,13 @@
2352 <context context-type="linenumber">1</context> 2375 <context context-type="linenumber">1</context>
2353 </context-group> 2376 </context-group>
2354 </trans-unit> 2377 </trans-unit>
2378 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
2379 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
2380 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ã®ç™»éŒ²ãŒå®Œäº†ã—ã¾ã—ãŸã€‚</target>
2381 <context-group name="null">
2382 <context context-type="linenumber">1</context>
2383 </context-group>
2384 </trans-unit>
2355 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 2385 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
2356 <source>Subscribed</source> 2386 <source>Subscribed</source>
2357 <target>購読ã™ã‚‹</target> 2387 <target>購読ã™ã‚‹</target>
@@ -2359,30 +2389,30 @@
2359 <context context-type="linenumber">1</context> 2389 <context context-type="linenumber">1</context>
2360 </context-group> 2390 </context-group>
2361 </trans-unit> 2391 </trans-unit>
2362 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 2392 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
2363 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 2393 <source>Unsubscribed</source>
2364 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ã®ç™»éŒ²ãŒå®Œäº†ãã¾ã—ãŸã€‚</target> 2394 <target>退会ãã‚</target>
2365 <context-group name="null"> 2395 <context-group name="null">
2366 <context context-type="linenumber">1</context> 2396 <context context-type="linenumber">1</context>
2367 </context-group> 2397 </context-group>
2368 </trans-unit> 2398 </trans-unit>
2369 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 2399 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
2370 <source>Welcome</source> 2400 <source>Only I can see this video</source>
2371 <target>よãã“ã</target> 2401 <target>ç§ã ãã¯ã“ã®ãƒ“デオを見ãˆã¾ã™</target>
2372 <context-group name="null"> 2402 <context-group name="null">
2373 <context context-type="linenumber">1</context> 2403 <context context-type="linenumber">1</context>
2374 </context-group> 2404 </context-group>
2375 </trans-unit> 2405 </trans-unit>
2376 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c"> 2406 <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
2377 <source>Please check your email to verify your account and complete signup.</source> 2407 <source>Only people with the private link can see this video</source>
2378 <target>ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’確èªã—ã¦ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’確èªã—ã€ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—を完了ã—ã¦ãã ã•ã„。</target> 2408 <target>プライベートリンクをæŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ãŒã“ã®ãƒ“デオを見ãˆã¾ã™</target>
2379 <context-group name="null"> 2409 <context-group name="null">
2380 <context context-type="linenumber">1</context> 2410 <context context-type="linenumber">1</context>
2381 </context-group> 2411 </context-group>
2382 </trans-unit> 2412 </trans-unit>
2383 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5"> 2413 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
2384 <source>Info</source> 2414 <source>Anyone can see this video</source>
2385 <target>情報</target> 2415 <target>ã“ã®ãƒ“デオã«ã¯ã€èª°ã§ã‚‚見ãˆã¾ã™</target>
2386 <context-group name="null"> 2416 <context-group name="null">
2387 <context context-type="linenumber">1</context> 2417 <context context-type="linenumber">1</context>
2388 </context-group> 2418 </context-group>
@@ -2394,13 +2424,6 @@
2394 <context context-type="linenumber">1</context> 2424 <context context-type="linenumber">1</context>
2395 </context-group> 2425 </context-group>
2396 </trans-unit> 2426 </trans-unit>
2397 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
2398 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
2399 <target>申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€PeerTube ã¯å‹•ç”»ã‚’処ç†å‡ºæ¥ã¾ã›ã‚“。 &gt; 8GB</target>
2400 <context-group name="null">
2401 <context context-type="linenumber">1</context>
2402 </context-group>
2403 </trans-unit>
2404 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce"> 2427 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
2405 <source>Video published.</source> 2428 <source>Video published.</source>
2406 <target>ビデオãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚</target> 2429 <target>ビデオãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚</target>
diff --git a/client/src/locale/target/angular_jbo.xml b/client/src/locale/target/angular_jbo.xml
new file mode 100644
index 000000000..6478b002c
--- /dev/null
+++ b/client/src/locale/target/angular_jbo.xml
@@ -0,0 +1,1388 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--XLIFF document generated by Zanata. Visit http://zanata.org for more infomation.-->
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="jbo">
5 <body>
6 <trans-unit id="ngb.alert.close">
7 <source>Close</source>
8 <target>mipri</target>
9 <context-group name="null">
10 <context context-type="linenumber">2</context>
11 </context-group>
12 </trans-unit>
13 <trans-unit id="ngb.carousel.previous">
14 <source>Previous</source>
15 <target>lo prula'i</target>
16 <context-group name="null">
17 <context context-type="linenumber">13</context>
18 </context-group>
19 </trans-unit>
20 <trans-unit id="ngb.carousel.next">
21 <source>Next</source>
22 <target>lo bavla'i</target>
23 <context-group name="null">
24 <context context-type="linenumber">17</context>
25 </context-group>
26 </trans-unit>
27 <trans-unit id="ngb.datepicker.previous-month">
28 <source>Previous month</source>
29 <target>lo prula'ima'i</target>
30 <context-group name="null">
31 <context context-type="linenumber">5</context>
32 </context-group>
33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source>
36 <target>lo bavla'ima'i</target>
37 <context-group name="null">
38 <context context-type="linenumber">27</context>
39 </context-group>
40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>cuxna lo masti</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>cuxna lo nanca</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source><target>««</target><context-group name="null">
57 <context context-type="linenumber">7</context>
58 </context-group>
59 </trans-unit>
60 <trans-unit id="ngb.pagination.first-aria">
61 <source>First</source>
62 <target>lo pa moi</target>
63 <context-group name="null">
64 <context context-type="linenumber">5</context>
65 </context-group>
66 </trans-unit>
67 <trans-unit id="ngb.pagination.previous">
68 <source>«</source><target>«</target><context-group name="null">
69 <context context-type="linenumber">15</context>
70 </context-group>
71 </trans-unit>
72 <trans-unit id="ngb.pagination.previous-aria">
73 <source>Previous</source>
74 <target>lo prula'i</target>
75 <context-group name="null">
76 <context context-type="linenumber">13</context>
77 </context-group>
78 </trans-unit>
79 <trans-unit id="ngb.pagination.next">
80 <source>»</source><target>»</target><context-group name="null">
81 <context context-type="linenumber">29</context>
82 </context-group>
83 </trans-unit>
84 <trans-unit id="ngb.pagination.next-aria">
85 <source>Next</source>
86 <target>lo bavla'i</target>
87 <context-group name="null">
88 <context context-type="linenumber">27</context>
89 </context-group>
90 </trans-unit>
91 <trans-unit id="ngb.pagination.last">
92 <source>»»</source><target>»»</target><context-group name="null">
93 <context context-type="linenumber">36</context>
94 </context-group>
95 </trans-unit>
96 <trans-unit id="ngb.pagination.last-aria">
97 <source>Last</source>
98 <target>lo ro moi</target>
99 <context-group name="null">
100 <context context-type="linenumber">34</context>
101 </context-group>
102 </trans-unit>
103 <trans-unit id="ngb.progressbar.value">
104 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
105 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/> ce'i</target>
106 <context-group name="null">
107 <context context-type="linenumber">6</context>
108 </context-group>
109 </trans-unit>
110 <trans-unit id="ngb.timepicker.increment-hours">
111 <source>Increment hours</source>
112 <target>zenba lo se cacra</target>
113 <context-group name="null">
114 <context context-type="linenumber">9</context>
115 </context-group>
116 </trans-unit>
117 <trans-unit id="ngb.timepicker.hours">
118 <source>Hours</source>
119 <target>lo se cacra</target>
120 <context-group name="null">
121 <context context-type="linenumber">14</context>
122 </context-group>
123 </trans-unit>
124 <trans-unit id="ngb.timepicker.decrement-hours">
125 <source>Decrement hours</source>
126 <target>jdika lo se cacra</target>
127 <context-group name="null">
128 <context context-type="linenumber">19</context>
129 </context-group>
130 </trans-unit>
131 <trans-unit id="ngb.timepicker.increment-minutes">
132 <source>Increment minutes</source>
133 <target>zenba lo se mentu</target>
134 <context-group name="null">
135 <context context-type="linenumber">28</context>
136 </context-group>
137 </trans-unit>
138 <trans-unit id="ngb.timepicker.minutes">
139 <source>Minutes</source>
140 <target>lo se mentu</target>
141 <context-group name="null">
142 <context context-type="linenumber">33</context>
143 </context-group>
144 </trans-unit>
145 <trans-unit id="ngb.timepicker.decrement-minutes">
146 <source>Decrement minutes</source>
147 <target>jdika lo se mentu</target>
148 <context-group name="null">
149 <context context-type="linenumber">38</context>
150 </context-group>
151 </trans-unit>
152 <trans-unit id="ngb.timepicker.increment-seconds">
153 <source>Increment seconds</source>
154 <target>zenba lo se snidu</target>
155 <context-group name="null">
156 <context context-type="linenumber">47</context>
157 </context-group>
158 </trans-unit>
159 <trans-unit id="ngb.timepicker.seconds">
160 <source>Seconds</source>
161 <target>lo se snidu</target>
162 <context-group name="null">
163 <context context-type="linenumber">52</context>
164 </context-group>
165 </trans-unit>
166 <trans-unit id="ngb.timepicker.decrement-seconds">
167 <source>Decrement seconds</source>
168 <target>jdika lo se snidu</target>
169 <context-group name="null">
170 <context context-type="linenumber">57</context>
171 </context-group>
172 </trans-unit>
173 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
174 <source>Cancel</source>
175 <target>sisti</target>
176 <context-group name="null">
177 <context context-type="linenumber">10</context>
178 </context-group>
179 </trans-unit>
180 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
181 <source>Unlisted</source>
182 <target>lo na'e se liste</target>
183 <context-group name="null">
184 <context context-type="linenumber">10</context>
185 </context-group>
186 </trans-unit>
187 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
188 <source>Private</source>
189 <target>lo sivni</target>
190 <context-group name="null">
191 <context context-type="linenumber">11</context>
192 </context-group>
193 </trans-unit>
194 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
195 <source>Delete</source>
196 <target>vimcu</target>
197 <context-group name="null">
198 <context context-type="linenumber">15</context>
199 </context-group>
200 </trans-unit>
201 <trans-unit id="28f86ffd419b869711aa13f5e5ff54be6d70731c">
202 <source>Edit</source>
203 <target>galfi</target>
204 <context-group name="null">
205 <context context-type="linenumber">1</context>
206 </context-group>
207 </trans-unit>
208 <trans-unit id="9c71feb04c2beab559f79c41c6127815fb9c1a6f">
209 <source>Get help</source>
210 <target>sidju do</target>
211 <context-group name="null">
212 <context context-type="linenumber">19</context>
213 </context-group>
214 </trans-unit>
215 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
216 <source>
217 Unsubscribe
218 </source>
219 <target>
220sisti lo nu jersi pe'a</target>
221 <context-group name="null">
222 <context context-type="linenumber">18</context>
223 </context-group>
224 </trans-unit>
225 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
226 <source>User</source>
227 <target>lo pilno</target>
228 <context-group name="null">
229 <context context-type="linenumber">13</context>
230 </context-group>
231 </trans-unit>
232 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
233 <source>User registration is not allowed on this instance, but you can register on many others!</source>
234 <target>.i le samtcise'u cu curmi no nu cmiveigau .i ku'i do cmeveigau fo so'i drata ka'e</target>
235 <context-group name="null">
236 <context context-type="linenumber">28</context>
237 </context-group>
238 </trans-unit>
239 <trans-unit id="c32ef07f8803a223a83ed17024b38e8d82292407">
240 <source>Password</source>
241 <target>lo lerpoijaspu</target>
242 <context-group name="null">
243 <context context-type="linenumber">13</context>
244 </context-group>
245 </trans-unit>
246 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
247 <source>I forgot my password</source>
248 <target>.i mi nalmo'i le mi lerpoijaspu</target>
249 <context-group name="null">
250 <context context-type="linenumber">44</context>
251 </context-group>
252 </trans-unit>
253 <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
254 <source>Login</source>
255 <target>co'a cmisau</target>
256 <context-group name="null">
257 <context context-type="linenumber">36</context>
258 </context-group>
259 </trans-unit>
260 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
261 <source>Forgot your password</source>
262 <target>.i mi nalmo'i le mi lerpoijaspu</target>
263 <context-group name="null">
264 <context context-type="linenumber">57</context>
265 </context-group>
266 </trans-unit>
267 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
268 <source>Email</source>
269 <target>lo ve samymri</target>
270 <context-group name="null">
271 <context context-type="linenumber">8</context>
272 </context-group>
273 </trans-unit>
274 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
275 <source>Email address</source>
276 <target>lo ve samymri</target>
277 <context-group name="null">
278 <context context-type="linenumber">10</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55">
282 <source>Send me an email to reset my password</source>
283 <target>samymri fi mi te zu'e lo nu galfi le mi japyvla</target>
284 <context-group name="null">
285 <context context-type="linenumber">80</context>
286 </context-group>
287 </trans-unit>
288 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
289 <source>
290 Reset my password
291 </source>
292 <target>
293galfi le mi japyvla</target>
294 <context-group name="null">
295 <context context-type="linenumber">2</context>
296 </context-group>
297 </trans-unit>
298 <trans-unit id="8bdf8db5eeeaef83184b489b80c1557b516fb3c3">
299 <source>Reset my password</source>
300 <target>galfi le mi japyvla</target>
301 <context-group name="null">
302 <context context-type="linenumber">29</context>
303 </context-group>
304 </trans-unit>
305 <trans-unit id="4499806949402133d08a5029cb5462c5ea25336d">
306 <source>
307 Create an account
308 </source>
309 <target>
310zbasu lo pilno</target>
311 <context-group name="null">
312 <context context-type="linenumber">3</context>
313 </context-group>
314 </trans-unit>
315 <trans-unit id="08c74dc9762957593b91f6eb5d65efdfc975bf48">
316 <source>Username</source>
317 <target>lo plicme</target>
318 <context-group name="null">
319 <context context-type="linenumber">8</context>
320 </context-group>
321 </trans-unit>
322 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
323 <source>Example: jane_doe</source>
324 <target>.i zoi gy. jane_doe .gy. mupli</target>
325 <context-group name="null">
326 <context context-type="linenumber">17</context>
327 </context-group>
328 </trans-unit>
329 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
330 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
331 <target>.i li su'o pa xa jbetei mi .i ji'a mi tolpro fi &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;lo javni be fi le vi mupli&lt;/a&gt;</target>
332 <context-group name="null">
333 <context context-type="linenumber">55</context>
334 </context-group>
335 </trans-unit>
336 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
337 <source>Signup</source>
338 <target>cmiveigau</target>
339 <context-group name="null">
340 <context context-type="linenumber">78</context>
341 </context-group>
342 </trans-unit>
343 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
344 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
345 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> lo te facki</target>
346 <context-group name="null">
347 <context context-type="linenumber">5</context>
348 </context-group>
349 </trans-unit>
350 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
351 <source>
352 No results found
353 </source>
354 <target>
355.i facki fi no da</target>
356 <context-group name="null">
357 <context context-type="linenumber">28</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
361 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
362 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> lo jersi pe'a</target>
363 <context-group name="null">
364 <context context-type="linenumber">44</context>
365 </context-group>
366 </trans-unit>
367 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
368 <source>Change the language</source>
369 <target>galfi lo bangu</target>
370 <context-group name="null">
371 <context context-type="linenumber">86</context>
372 </context-group>
373 </trans-unit>
374 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
375 <source>
376 My public profile
377 </source>
378 <target>
379lo predatni be mi be'o poi gubni</target>
380 <context-group name="null">
381 <context context-type="linenumber">16</context>
382 </context-group>
383 </trans-unit>
384 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
385 <source>
386 My account
387 </source>
388 <target>
389lo mi pilno</target>
390 <context-group name="null">
391 <context context-type="linenumber">20</context>
392 </context-group>
393 </trans-unit>
394 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
395 <source>
396 My videos
397 </source>
398 <target>
399lo mi vidvi</target>
400 <context-group name="null">
401 <context context-type="linenumber">24</context>
402 </context-group>
403 </trans-unit>
404 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
405 <source>Create an account</source>
406 <target>zbasu lo pilno</target>
407 <context-group name="null">
408 <context context-type="linenumber">37</context>
409 </context-group>
410 </trans-unit>
411 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
412 <source>Videos</source>
413 <target>lo vidvi</target>
414 <context-group name="null">
415 <context context-type="linenumber">24</context>
416 </context-group>
417 </trans-unit>
418 <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
419 <source>Subscriptions</source>
420 <target>lo se jersi pe'a</target>
421 <context-group name="null">
422 <context context-type="linenumber">45</context>
423 </context-group>
424 </trans-unit>
425 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
426 <source>Trending</source>
427 <target>lo cabna misno</target>
428 <context-group name="null">
429 <context context-type="linenumber">55</context>
430 </context-group>
431 </trans-unit>
432 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
433 <source>Local</source>
434 <target>lo diklo</target>
435 <context-group name="null">
436 <context context-type="linenumber">65</context>
437 </context-group>
438 </trans-unit>
439 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
440 <source>More</source>
441 <target>lo drata</target>
442 <context-group name="null">
443 <context context-type="linenumber">70</context>
444 </context-group>
445 </trans-unit>
446 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
447 <source>About</source>
448 <target>lo datni</target>
449 <context-group name="null">
450 <context context-type="linenumber">25</context>
451 </context-group>
452 </trans-unit>
453 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
454 <source>Search...</source>
455 <target>sisku</target>
456 <context-group name="null">
457 <context context-type="linenumber">2</context>
458 </context-group>
459 </trans-unit>
460 <trans-unit id="4b3972c3e9485218508a95f7a4ce7758e3f09ced">
461 <source>Upload</source>
462 <target>kibdu'a</target>
463 <context-group name="null">
464 <context context-type="linenumber">9</context>
465 </context-group>
466 </trans-unit>
467 <trans-unit id="5d43539fc358c3a548b9d487be821db73e2702ff">
468 <source>Sort</source>
469 <target>porganzu</target>
470 <context-group name="null">
471 <context context-type="linenumber">6</context>
472 </context-group>
473 </trans-unit>
474 <trans-unit id="98acac685fc4b2d35e5d0cf3cd224d247a756c3e">
475 <source>Published date</source>
476 <target>lo detri be lo nu co'a gubni</target>
477 <context-group name="null">
478 <context context-type="linenumber">15</context>
479 </context-group>
480 </trans-unit>
481 <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
482 <source>Duration</source>
483 <target>lo temci</target>
484 <context-group name="null">
485 <context context-type="linenumber">24</context>
486 </context-group>
487 </trans-unit>
488 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
489 <source>Display sensitive content</source>
490 <target>viska lo ganvi poi te kajde</target>
491 <context-group name="null">
492 <context context-type="linenumber">33</context>
493 </context-group>
494 </trans-unit>
495 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
496 <source>Category</source>
497 <target>lo klesi</target>
498 <context-group name="null">
499 <context context-type="linenumber">164</context>
500 </context-group>
501 </trans-unit>
502 <trans-unit id="fe46ccaae902ce974e2441abe752399288298619">
503 <source>Language</source>
504 <target>lo bangu</target>
505 <context-group name="null">
506 <context context-type="linenumber">182</context>
507 </context-group>
508 </trans-unit>
509 <trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
510 <source>Filter</source>
511 <target>cuxselgre</target>
512 <context-group name="null">
513 <context context-type="linenumber">94</context>
514 </context-group>
515 </trans-unit>
516 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
517 <source>No results.</source>
518 <target>.i facki fi no da</target>
519 <context-group name="null">
520 <context context-type="linenumber">20</context>
521 </context-group>
522 </trans-unit>
523 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
524 <source>Instance</source><target>Instance</target><context-group name="null">
525 <context context-type="linenumber">12</context>
526 </context-group>
527 </trans-unit>
528 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
529 <source>PeerTube</source>
530 <target>la .pirtub.</target>
531 <context-group name="null">
532 <context context-type="linenumber">7</context>
533 </context-group>
534 </trans-unit>
535 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
536 <source>Description</source>
537 <target>lo ve skicu</target>
538 <context-group name="null">
539 <context context-type="linenumber">27</context>
540 </context-group>
541 </trans-unit>
542 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
543 <source>
544 About PeerTube
545</source>
546 <target>lo datni be la .pirtub.</target>
547 <context-group name="null">
548 <context context-type="linenumber">1</context>
549 </context-group>
550 </trans-unit>
551 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf">
552 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source>
553 <target>.i la .pirtub. simxu jorne to la .aktIvitipyb. toi ke vidvi tivni ciste gi'e se zbaske lo su'u simxu benji to la .uebytorent. toi fo lo kibyca'o</target>
554 <context-group name="null">
555 <context context-type="linenumber">6</context>
556 </context-group>
557 </trans-unit>
558 <trans-unit id="c02493cfa08b82c468233b83069b5baff23890e1">
559 <source>P2P &amp; Privacy</source>
560 <target>ni'o ni'o sau'e'u lo su'u simxu benji jo'u lo ka sivni</target>
561 <context-group name="null">
562 <context context-type="linenumber">18</context>
563 </context-group>
564 </trans-unit>
565 <trans-unit id="cd429d53cb8f4a87879301248e38cb85f07fa9d6">
566 <source>
567 PeerTube uses the BitTorrent protocol to share bandwidth between users.
568 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
569 </source>
570 <target>
571 .i la .pirtub. pilno la .bitorent. noi ciste ku'o lo nu lo benji nilsutra cu fatri loi pilno
572 .i di'u nibli lo du'u le ciste pe la .bitorent. ge'u pe le samtcise'u cu vreji le do kibro judri ca lo nu do pu mo'u kibycpa lo vidvi gi'a catlu ri</target>
573 <context-group name="null">
574 <context context-type="linenumber">20</context>
575 </context-group>
576 </trans-unit>
577 <trans-unit id="e4ce50f3019e3ebe9a479784c6cb68a31c7a8231">
578 <source>What are the consequences?</source>
579 <target>ni'o ma jalge</target>
580 <context-group name="null">
581 <context context-type="linenumber">25</context>
582 </context-group>
583 </trans-unit>
584 <trans-unit id="9a612748b059ad246935df17ef4ec4e6afb43a2a">
585 <source>
586 In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video.
587 In practice, this is much more difficult because:
588 </source>
589 <target>
590 .i da'i lo banzu certu be lo zbaske cu ka'e sampla fi lo pu'u gau vreji lo kibro judri ku lo vidvi poi se kibycpa ri
591 .i da'i nai la'e di'e rinka lo nu la'e di'u mutce nandu .i tu'e</target>
592 <context-group name="null">
593 <context context-type="linenumber">27</context>
594 </context-group>
595 </trans-unit>
596 <trans-unit id="64f96be62df4a95a0615b6f630ad25d6348a29d3">
597 <source>
598 An HTTP request has to be sent on each tracker for each video to spy.
599 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
600 </source>
601 <target>
602 .i nitcu lo nu ro lo mipyzga cu benji ro lo ve cpedu be lo nu mipyzga pa lo vidvi
603 .i na ga mi djica lo nu mi mipyzga ro lo vidvi pe la .pirtub. gi vei ny. vidvi zo'u mi benji vei ny. lo cpedu to so'i la'a toi</target>
604 <context-group name="null">
605 <context context-type="linenumber">33</context>
606 </context-group>
607 </trans-unit>
608 <trans-unit id="fec3239a860de66c718e3442df836b692b8568c3">
609 <source>
610 The IP address is a vague information : usually, it regularly changes and can represent many persons or entities
611 </source>
612 <target>
613 .i lo kibro judri cu smuvrici datni .i bo ri se galfi di'i gi'e ka'e judri so'i lo prenu ja zukyka'e</target>
614 <context-group name="null">
615 <context context-type="linenumber">51</context>
616 </context-group>
617 </trans-unit>
618 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
619 <source>
620 The worst-case scenario of an average person spying on their friends is quite unlikely.
621 There are much more effective ways to get that kind of information.
622 </source>
623 <target>
624 .i la'a nai sai lo fadni prenu cu mipyzga lo pendo be ri
625 .i da noi mutce xagmau cu drata tadji lo'e nu cpacu le datni</target>
626 <context-group name="null">
627 <context context-type="linenumber">62</context>
628 </context-group>
629 </trans-unit>
630 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
631 <source>How does PeerTube compare with YouTube?</source>
632 <target>ni'o karbi la .pirtub. la .iutub. fu ma</target>
633 <context-group name="null">
634 <context context-type="linenumber">67</context>
635 </context-group>
636 </trans-unit>
637 <trans-unit id="3c2990d5e452bdf2317ff23745db70705d848d99">
638 <source>What can I do to limit the exposure of my IP address?</source>
639 <target>ni'o mi ka'e zukte ma lo nu jimte le mi kibro judri</target>
640 <context-group name="null">
641 <context context-type="linenumber">75</context>
642 </context-group>
643 </trans-unit>
644 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
645 <source>What will be done to mitigate this problem?</source>
646 <target>ni'o ba zukte ma lo nu spuda le nabmi</target>
647 <context-group name="null">
648 <context context-type="linenumber">83</context>
649 </context-group>
650 </trans-unit>
651 <trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59">
652 <source>Name</source>
653 <target>lo cmene</target>
654 <context-group name="null">
655 <context context-type="linenumber">12</context>
656 </context-group>
657 </trans-unit>
658 <trans-unit id="512b045163a7187b2fc5d554e5f59fb3e49e174b">
659 <source>Short description</source>
660 <target>lo cmalu ve skicu</target>
661 <context-group name="null">
662 <context context-type="linenumber">21</context>
663 </context-group>
664 </trans-unit>
665 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
666 <source>Local videos</source>
667 <target>lo diklo vidvi</target>
668 <context-group name="null">
669 <context context-type="linenumber">54</context>
670 </context-group>
671 </trans-unit>
672 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
673 <source>Policy on videos containing sensitive content</source>
674 <target>loi javni be tu'a lo vidvi poi vasru lo ganvi poi te kajde</target>
675 <context-group name="null">
676 <context context-type="linenumber">61</context>
677 </context-group>
678 </trans-unit>
679 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
680 <source>JavaScript</source>
681 <target>la .djavascript.</target>
682 <context-group name="null">
683 <context context-type="linenumber">294</context>
684 </context-group>
685 </trans-unit>
686 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
687 <source>
688 Users
689 </source>
690 <target>
691lo pilno</target>
692 <context-group name="null">
693 <context context-type="linenumber">3</context>
694 </context-group>
695 </trans-unit>
696 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
697 <source>Sensitive</source>
698 <target>kajde fi lo ganvi</target>
699 <context-group name="null">
700 <context context-type="linenumber">9</context>
701 </context-group>
702 </trans-unit>
703 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
704 <source>Account</source>
705 <target>lo pilno</target>
706 <context-group name="null">
707 <context context-type="linenumber">12</context>
708 </context-group>
709 </trans-unit>
710 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
711 <source>Profile</source>
712 <target>lo predatni</target>
713 <context-group name="null">
714 <context context-type="linenumber">7</context>
715 </context-group>
716 </trans-unit>
717 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
718 <source>Video settings</source>
719 <target>lo se cuxna pe lo vidvi</target>
720 <context-group name="null">
721 <context context-type="linenumber">16</context>
722 </context-group>
723 </trans-unit>
724 <trans-unit id="73c1cefc348a6f361497210dea1ed79499fd1260">
725 <source>Create another video channel</source>
726 <target>zbasu lo drata ke vidvi te tivni</target>
727 <context-group name="null">
728 <context context-type="linenumber">4</context>
729 </context-group>
730 </trans-unit>
731 <trans-unit id="30fcac6c20aac1f24e000efc4a889cbb93d4baf2">
732 <source>Go to the channel</source>
733 <target>klama le te tivni</target>
734 <context-group name="null">
735 <context context-type="linenumber">10</context>
736 </context-group>
737 </trans-unit>
738 <trans-unit id="9dbe4718a5611fbc611fc6b5e0b27df813372c68">
739 <source>Create a video channel</source>
740 <target>zbasu lo vidvi te tivni</target>
741 <context-group name="null">
742 <context context-type="linenumber">6</context>
743 </context-group>
744 </trans-unit>
745 <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
746 <source>Example: my_channel</source>
747 <target>.i zoi gy. my_channel .gy. mupli</target>
748 <context-group name="null">
749 <context context-type="linenumber">15</context>
750 </context-group>
751 </trans-unit>
752 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
753 <source>Display name</source>
754 <target>lo cmene</target>
755 <context-group name="null">
756 <context context-type="linenumber">6</context>
757 </context-group>
758 </trans-unit>
759 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
760 <source>You don't have any subscriptions yet.</source>
761 <target>.i do ca jersi pe'a no da</target>
762 <context-group name="null">
763 <context context-type="linenumber">1</context>
764 </context-group>
765 </trans-unit>
766 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
767 <source>Change password</source>
768 <target>galfi lo japyvla</target>
769 <context-group name="null">
770 <context context-type="linenumber">30</context>
771 </context-group>
772 </trans-unit>
773 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
774 <source>Current password</source>
775 <target>le ca japyvla</target>
776 <context-group name="null">
777 <context context-type="linenumber">7</context>
778 </context-group>
779 </trans-unit>
780 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
781 <source>New password</source>
782 <target>le japyvla poi cnino</target>
783 <context-group name="null">
784 <context context-type="linenumber">15</context>
785 </context-group>
786 </trans-unit>
787 <trans-unit id="ede41f01c781b168a783cfcefc6fb67d48780d9b">
788 <source>Confirm new password</source>
789 <target>ke'u le japyvla poi cnino</target>
790 <context-group name="null">
791 <context context-type="linenumber">23</context>
792 </context-group>
793 </trans-unit>
794 <trans-unit id="20f62f24170d57b1efeb2387a0949f482cd4d129">
795 <source>Default policy on videos containing sensitive content</source>
796 <target>loi zmiselcu'a javni be tu'a lo vidvi poi vasru lo ganvi poi te kajde</target>
797 <context-group name="null">
798 <context context-type="linenumber">3</context>
799 </context-group>
800 </trans-unit>
801 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
802 <source>Use WebTorrent to exchange parts of the video with others</source>
803 <target>pilno la .uebytorent. lo nu lo pagbu be le vidvi cu fatri lo drata</target>
804 <context-group name="null">
805 <context context-type="linenumber">21</context>
806 </context-group>
807 </trans-unit>
808 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
809 <source>Save</source>
810 <target>vreji</target>
811 <context-group name="null">
812 <context context-type="linenumber">32</context>
813 </context-group>
814 </trans-unit>
815 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
816 <source>Update my profile</source>
817 <target>galfi le predatni be mi</target>
818 <context-group name="null">
819 <context context-type="linenumber">27</context>
820 </context-group>
821 </trans-unit>
822 <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5">
823 <source>Change the avatar</source>
824 <target>galfi le predatni pixra</target>
825 <context-group name="null">
826 <context context-type="linenumber">15</context>
827 </context-group>
828 </trans-unit>
829 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
830 <source>Once you delete your account, there is no going back. Please be certain.</source>
831 <target>.i ba lo nu do vimcu le do pilno kei do na kakne lo nu xruti .i .e'o do birti ju'i</target>
832 <context-group name="null">
833 <context context-type="linenumber">2</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
837 <source>Delete your account</source>
838 <target>vimcu le do pilno</target>
839 <context-group name="null">
840 <context context-type="linenumber">4</context>
841 </context-group>
842 </trans-unit>
843 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
844 <source>An error occurred. </source>
845 <target>.i pu srera</target>
846 <context-group name="null">
847 <context context-type="linenumber">11</context>
848 </context-group>
849 </trans-unit>
850 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
851 <source>Support this channel</source>
852 <target>rupsra le vi te tivni</target>
853 <context-group name="null">
854 <context context-type="linenumber">9</context>
855 </context-group>
856 </trans-unit>
857 <trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6">
858 <source>URL</source>
859 <target>lo urli</target>
860 <context-group name="null">
861 <context context-type="linenumber">17</context>
862 </context-group>
863 </trans-unit>
864 <trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071">
865 <source>Channel</source>
866 <target>lo te tivni</target>
867 <context-group name="null">
868 <context context-type="linenumber">39</context>
869 </context-group>
870 </trans-unit>
871 <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3">
872 <source>Upload a file</source>
873 <target>kibdu'a lo datnyvei</target>
874 <context-group name="null">
875 <context context-type="linenumber">10</context>
876 </context-group>
877 </trans-unit>
878 <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470">
879 <source>Import with URL</source>
880 <target>nerbei fo lo se urli</target>
881 <context-group name="null">
882 <context context-type="linenumber">17</context>
883 </context-group>
884 </trans-unit>
885 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
886 <source>Title</source>
887 <target>lo cmene</target>
888 <context-group name="null">
889 <context context-type="linenumber">9</context>
890 </context-group>
891 </trans-unit>
892 <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
893 <source>Tags</source>
894 <target>lo tcita</target>
895 <context-group name="null">
896 <context context-type="linenumber">191</context>
897 </context-group>
898 </trans-unit>
899 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
900 <source>+ Tag</source>
901 <target>jmina lo tcita</target>
902 <context-group name="null">
903 <context context-type="linenumber">21</context>
904 </context-group>
905 </trans-unit>
906 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
907 <source>Enter a new tag</source>
908 <target>ciska lo tcita poi cnino</target>
909 <context-group name="null">
910 <context context-type="linenumber">21</context>
911 </context-group>
912 </trans-unit>
913 <trans-unit id="5ef7108218e096d09f4ee8525a05a8c90d7b95ee">
914 <source>This video contains mature or explicit content</source>
915 <target>.i le vi vidvi cu vasru lo makcu ja cnixai ganvi</target>
916 <context-group name="null">
917 <context context-type="linenumber">119</context>
918 </context-group>
919 </trans-unit>
920 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
921 <source>Enable video comments</source>
922 <target>lo nu pinka le vidvi cu cumki</target>
923 <context-group name="null">
924 <context context-type="linenumber">125</context>
925 </context-group>
926 </trans-unit>
927 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
928 <source>Cancel create</source>
929 <target>co'u zbasu</target>
930 <context-group name="null">
931 <context context-type="linenumber">170</context>
932 </context-group>
933 </trans-unit>
934 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
935 <source>Cancel deletion</source>
936 <target>co'u vimcu</target>
937 <context-group name="null">
938 <context context-type="linenumber">178</context>
939 </context-group>
940 </trans-unit>
941 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
942 <source>Support</source>
943 <target>rupsra</target>
944 <context-group name="null">
945 <context context-type="linenumber">69</context>
946 </context-group>
947 </trans-unit>
948 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
949 <source>Advanced settings</source>
950 <target>lo certu se cuxna</target>
951 <context-group name="null">
952 <context context-type="linenumber">191</context>
953 </context-group>
954 </trans-unit>
955 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
956 <source>Download video</source>
957 <target>kibycpa le vidvi</target>
958 <context-group name="null">
959 <context context-type="linenumber">3</context>
960 </context-group>
961 </trans-unit>
962 <trans-unit id="8d6a41c2703bed3edfc76e1df0b1ca203404c17c">
963 <source>Direct download</source>
964 <target>sirji kibycpa</target>
965 <context-group name="null">
966 <context context-type="linenumber">27</context>
967 </context-group>
968 </trans-unit>
969 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
970 <source>Download</source>
971 <target>kibycpa</target>
972 <context-group name="null">
973 <context context-type="linenumber">84</context>
974 </context-group>
975 </trans-unit>
976 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
977 <source>Share</source>
978 <target>fatri</target>
979 <context-group name="null">
980 <context context-type="linenumber">74</context>
981 </context-group>
982 </trans-unit>
983 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
984 <source>Close</source>
985 <target>mipri</target>
986 <context-group name="null">
987 <context context-type="linenumber">51</context>
988 </context-group>
989 </trans-unit>
990 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
991 <source>Like this video</source>
992 <target>zanru le vi vidvi</target>
993 <context-group name="null">
994 <context context-type="linenumber">57</context>
995 </context-group>
996 </trans-unit>
997 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
998 <source>Dislike this video</source>
999 <target>to'e zanru le vi vidvi</target>
1000 <context-group name="null">
1001 <context context-type="linenumber">64</context>
1002 </context-group>
1003 </trans-unit>
1004 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
1005 <source>Download the video</source>
1006 <target>kibycpa le vidvi</target>
1007 <context-group name="null">
1008 <context context-type="linenumber">83</context>
1009 </context-group>
1010 </trans-unit>
1011 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
1012 <source>Delete this video</source>
1013 <target>vimcu le vi vidvi</target>
1014 <context-group name="null">
1015 <context context-type="linenumber">103</context>
1016 </context-group>
1017 </trans-unit>
1018 <trans-unit id="5cb397241041f7ad70997806227bafcdf7eb1b33">
1019 <source>Go the channel page</source>
1020 <target>klama le papri pe le te tivni</target>
1021 <context-group name="null">
1022 <context context-type="linenumber">123</context>
1023 </context-group>
1024 </trans-unit>
1025 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
1026 <source>Show more</source>
1027 <target>viska lo zmadu</target>
1028 <context-group name="null">
1029 <context context-type="linenumber">146</context>
1030 </context-group>
1031 </trans-unit>
1032 <trans-unit id="5403a767248e304199592271bba3366d2ca3f903">
1033 <source>Show less</source>
1034 <target>viska lo mleca</target>
1035 <context-group name="null">
1036 <context context-type="linenumber">152</context>
1037 </context-group>
1038 </trans-unit>
1039 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
1040 <source>
1041 Comments are disabled.
1042 </source>
1043 <target>
1044 lo nu pinka na cumki
1045 </target>
1046 <context-group name="null">
1047 <context context-type="linenumber">63</context>
1048 </context-group>
1049 </trans-unit>
1050 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
1051 <source>Add comment...</source>
1052 <target>jmina lo pinka</target>
1053 <context-group name="null">
1054 <context context-type="linenumber">6</context>
1055 </context-group>
1056 </trans-unit>
1057 <trans-unit id="26fa50ba8e69b53162b348d98e25f8b76c81343e">
1058 <source>
1059 Post comment
1060 </source>
1061 <target>
1062 mrilu lo pinka
1063 </target>
1064 <context-group name="null">
1065 <context context-type="linenumber">20</context>
1066 </context-group>
1067 </trans-unit>
1068 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
1069 <source>
1070 If you have an account on this instance, you can login:
1071 </source>
1072 <target>
1073 .i do ponse lo pilno poi zvati le vi samtcise'u .i na ja do co'a ka'e cmisau
1074 </target>
1075 <context-group name="null">
1076 <context context-type="linenumber">32</context>
1077 </context-group>
1078 </trans-unit>
1079 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
1080 <source>login to comment</source>
1081 <target>co'a cmisau te zu'e lo nu pinka</target>
1082 <context-group name="null">
1083 <context context-type="linenumber">35</context>
1084 </context-group>
1085 </trans-unit>
1086 <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6">
1087 <source>Reply</source>
1088 <target>spuda</target>
1089 <context-group name="null">
1090 <context context-type="linenumber">14</context>
1091 </context-group>
1092 </trans-unit>
1093 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
1094 <source>100MB</source>
1095 <target>pa no no lo megbivysamsle</target>
1096 <context-group name="null">
1097 <context context-type="linenumber">1</context>
1098 </context-group>
1099 </trans-unit>
1100 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
1101 <source>500MB</source>
1102 <target>mu no no lo megbivysamsle</target>
1103 <context-group name="null">
1104 <context context-type="linenumber">1</context>
1105 </context-group>
1106 </trans-unit>
1107 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
1108 <source>1GB</source>
1109 <target>pa lo gigbivysamsle</target>
1110 <context-group name="null">
1111 <context context-type="linenumber">1</context>
1112 </context-group>
1113 </trans-unit>
1114 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
1115 <source>5GB</source>
1116 <target>mu lo gigbivysamsle</target>
1117 <context-group name="null">
1118 <context context-type="linenumber">1</context>
1119 </context-group>
1120 </trans-unit>
1121 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
1122 <source>20GB</source>
1123 <target>re no lo gigbivysamsle</target>
1124 <context-group name="null">
1125 <context context-type="linenumber">1</context>
1126 </context-group>
1127 </trans-unit>
1128 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
1129 <source>50GB</source>
1130 <target>mu no lo gigbivysamsle</target>
1131 <context-group name="null">
1132 <context context-type="linenumber">1</context>
1133 </context-group>
1134 </trans-unit>
1135 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
1136 <source>10MB</source>
1137 <target>pa no lo megbivysamsle</target>
1138 <context-group name="null">
1139 <context context-type="linenumber">1</context>
1140 </context-group>
1141 </trans-unit>
1142 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
1143 <source>50MB</source>
1144 <target>mu no lo megbivysamsle</target>
1145 <context-group name="null">
1146 <context context-type="linenumber">1</context>
1147 </context-group>
1148 </trans-unit>
1149 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
1150 <source>2GB</source>
1151 <target>re lo gigbivysamsle</target>
1152 <context-group name="null">
1153 <context context-type="linenumber">1</context>
1154 </context-group>
1155 </trans-unit>
1156 <trans-unit id="1266acb081ef0324c4a38ae2d514dd75d8b38409">
1157 <source>Follow new server(s)</source>
1158 <target>jersi pe'a lo cnino samtcise'u</target>
1159 <context-group name="null">
1160 <context context-type="linenumber">1</context>
1161 </context-group>
1162 </trans-unit>
1163 <trans-unit id="950f5111d567e5c0e971f07c26e8c2be1d919a8e">
1164 <source>Follow request(s) sent!</source>
1165 <target>.i mo'u mrilu lo jersi pe'a ve cpedu</target>
1166 <context-group name="null">
1167 <context context-type="linenumber">1</context>
1168 </context-group>
1169 </trans-unit>
1170 <trans-unit id="a89875525c82ab81ffe32e481a5475b43d0c2902">
1171 <source>Unfollow</source>
1172 <target>co'u jersi pe'a</target>
1173 <context-group name="null">
1174 <context context-type="linenumber">1</context>
1175 </context-group>
1176 </trans-unit>
1177 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
1178 <source>Delete this report</source>
1179 <target>vimcu le notci</target>
1180 <context-group name="null">
1181 <context context-type="linenumber">1</context>
1182 </context-group>
1183 </trans-unit>
1184 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
1185 <source>Do you really want to delete this abuse report?</source>
1186 <target>.i .au ju'o pei vimcu le malpli notci</target>
1187 <context-group name="null">
1188 <context context-type="linenumber">1</context>
1189 </context-group>
1190 </trans-unit>
1191 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
1192 <source>Abuse deleted.</source>
1193 <target>.i mo'u vimcu le malpli notci</target>
1194 <context-group name="null">
1195 <context context-type="linenumber">1</context>
1196 </context-group>
1197 </trans-unit>
1198 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
1199 <source>Password updated.</source>
1200 <target>.i mo'u galfi lo japyvla</target>
1201 <context-group name="null">
1202 <context context-type="linenumber">1</context>
1203 </context-group>
1204 </trans-unit>
1205 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
1206 <source>You current password is invalid.</source>
1207 <target>le do ca japyvla cu to'e drani</target>
1208 <context-group name="null">
1209 <context context-type="linenumber">1</context>
1210 </context-group>
1211 </trans-unit>
1212 <trans-unit id="d8a8a7f7160939fb55e82bc01fe9f876f5f2e065">
1213 <source>Delete my account</source>
1214 <target>vimcu le mi pilno</target>
1215 <context-group name="null">
1216 <context context-type="linenumber">1</context>
1217 </context-group>
1218 </trans-unit>
1219 <trans-unit id="8eb8b1a728159f43c31abf76c28ef3ff6c230af7">
1220 <source>Your account is deleted.</source>
1221 <target>.i mo'u le do pilno</target>
1222 <context-group name="null">
1223 <context context-type="linenumber">1</context>
1224 </context-group>
1225 </trans-unit>
1226 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
1227 <source>Profile updated.</source>
1228 <target>.i mo'u galfi le predatni</target>
1229 <context-group name="null">
1230 <context context-type="linenumber">1</context>
1231 </context-group>
1232 </trans-unit>
1233 <trans-unit id="1e003ad599ef836949b9f4dad3037a58ef3ff8d1">
1234 <source>Avatar changed.</source>
1235 <target>.i mo'u galfi le predatni pixra</target>
1236 <context-group name="null">
1237 <context context-type="linenumber">1</context>
1238 </context-group>
1239 </trans-unit>
1240 <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
1241 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
1242 <target>.i mo'u zbasu la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
1243 <context-group name="null">
1244 <context context-type="linenumber">1</context>
1245 </context-group>
1246 </trans-unit>
1247 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
1248 <source>This name already exists on this instance.</source>
1249 <target>.i le cmene xa'o zasti ci'e le mupli</target>
1250 <context-group name="null">
1251 <context context-type="linenumber">1</context>
1252 </context-group>
1253 </trans-unit>
1254 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
1255 <source>Create</source>
1256 <target>zbasu</target>
1257 <context-group name="null">
1258 <context context-type="linenumber">1</context>
1259 </context-group>
1260 </trans-unit>
1261 <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
1262 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
1263 <target>.i mo'u galfi la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
1264 <context-group name="null">
1265 <context context-type="linenumber">1</context>
1266 </context-group>
1267 </trans-unit>
1268 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
1269 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
1270 <target>.i mo'u vimcu la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
1271 <context-group name="null">
1272 <context context-type="linenumber">1</context>
1273 </context-group>
1274 </trans-unit>
1275 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1276 <source>My videos</source>
1277 <target>lo mi vidvi</target>
1278 <context-group name="null">
1279 <context context-type="linenumber">1</context>
1280 </context-group>
1281 </trans-unit>
1282 <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
1283 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
1284 <target>.i .au ju'o pei do vimcu <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> lo vidvi</target>
1285 <context-group name="null">
1286 <context context-type="linenumber">1</context>
1287 </context-group>
1288 </trans-unit>
1289 <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83">
1290 <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source>
1291 <target>.i mo'u vimcu <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> lo vidvi</target>
1292 <context-group name="null">
1293 <context context-type="linenumber">1</context>
1294 </context-group>
1295 </trans-unit>
1296 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1297 <source>My channels</source>
1298 <target>lo mi te tivni</target>
1299 <context-group name="null">
1300 <context context-type="linenumber">1</context>
1301 </context-group>
1302 </trans-unit>
1303 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1304 <source>My subscriptions</source>
1305 <target>lo se jersi pe'a be mi</target>
1306 <context-group name="null">
1307 <context context-type="linenumber">1</context>
1308 </context-group>
1309 </trans-unit>
1310 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1311 <source>My settings</source>
1312 <target>lo mi se cuxna</target>
1313 <context-group name="null">
1314 <context context-type="linenumber">1</context>
1315 </context-group>
1316 </trans-unit>
1317 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
1318 <source>Subscribe to the account</source>
1319 <target>jersi pe'a le pilno</target>
1320 <context-group name="null">
1321 <context context-type="linenumber">1</context>
1322 </context-group>
1323 </trans-unit>
1324 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
1325 <source>Toggle Dark theme</source>
1326 <target>galfi lo ka lo jvina cu manku</target>
1327 <context-group name="null">
1328 <context context-type="linenumber">1</context>
1329 </context-group>
1330 </trans-unit>
1331 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
1332 <source>Go to my subscriptions</source>
1333 <target>klama lo se jersi pe'a be mi</target>
1334 <context-group name="null">
1335 <context context-type="linenumber">1</context>
1336 </context-group>
1337 </trans-unit>
1338 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
1339 <source>Go to my videos</source>
1340 <target>klama lo mi vidvi</target>
1341 <context-group name="null">
1342 <context context-type="linenumber">1</context>
1343 </context-group>
1344 </trans-unit>
1345 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
1346 <source>Go to my imports</source>
1347 <target>klama lo se nerbei be mi</target>
1348 <context-group name="null">
1349 <context context-type="linenumber">1</context>
1350 </context-group>
1351 </trans-unit>
1352 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
1353 <source>Go to my channels</source>
1354 <target>klama lo mi te tivni</target>
1355 <context-group name="null">
1356 <context context-type="linenumber">1</context>
1357 </context-group>
1358 </trans-unit>
1359 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1360 <source>Error</source>
1361 <target>.i srera</target>
1362 <context-group name="null">
1363 <context context-type="linenumber">1</context>
1364 </context-group>
1365 </trans-unit>
1366 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
1367 <source>Your password has been successfully reset!</source>
1368 <target>.i snada lo nu mo'u galfi le do japyvla</target>
1369 <context-group name="null">
1370 <context context-type="linenumber">1</context>
1371 </context-group>
1372 </trans-unit>
1373 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
1374 <source>The channel is required.</source>
1375 <target>.i le vidvi te tivni cu sarcu</target>
1376 <context-group name="null">
1377 <context context-type="linenumber">1</context>
1378 </context-group>
1379 </trans-unit>
1380 <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
1381 <source>Video channel is required.</source>
1382 <target>.i le vidvi te tivni cu sarcu</target>
1383 <context-group name="null">
1384 <context context-type="linenumber">1</context>
1385 </context-group>
1386 </trans-unit>
1387 </body>
1388 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_nl_NL.xml b/client/src/locale/target/angular_nl_NL.xml
index c34e6e24a..7e7a6abdd 100644
--- a/client/src/locale/target/angular_nl_NL.xml
+++ b/client/src/locale/target/angular_nl_NL.xml
@@ -3,11 +3,249 @@
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1"> 3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="nl-NL"> 4 <file source-language="en-US" datatype="plaintext" original="" target-language="nl-NL">
5 <body> 5 <body>
6 <trans-unit id="ngb.alert.close">
7 <source>Close</source>
8 <target>Sluiten</target>
9 <context-group name="null">
10 <context context-type="linenumber">2</context>
11 </context-group>
12 </trans-unit>
13 <trans-unit id="ngb.carousel.previous">
14 <source>Previous</source>
15 <target>Vorige</target>
16 <context-group name="null">
17 <context context-type="linenumber">13</context>
18 </context-group>
19 </trans-unit>
20 <trans-unit id="ngb.carousel.next">
21 <source>Next</source>
22 <target>Volgende</target>
23 <context-group name="null">
24 <context context-type="linenumber">17</context>
25 </context-group>
26 </trans-unit>
27 <trans-unit id="ngb.datepicker.previous-month">
28 <source>Previous month</source>
29 <target>Vorige maand</target>
30 <context-group name="null">
31 <context context-type="linenumber">5</context>
32 </context-group>
33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source>
36 <target>Volgende maand</target>
37 <context-group name="null">
38 <context context-type="linenumber">27</context>
39 </context-group>
40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Selecteer maand</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Selecteer jaar</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source>
57 <target>««</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context>
60 </context-group>
61 </trans-unit>
62 <trans-unit id="ngb.pagination.first-aria">
63 <source>First</source>
64 <target>Eerste</target>
65 <context-group name="null">
66 <context context-type="linenumber">5</context>
67 </context-group>
68 </trans-unit>
69 <trans-unit id="ngb.pagination.previous">
70 <source>«</source>
71 <target>«</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context>
74 </context-group>
75 </trans-unit>
76 <trans-unit id="ngb.pagination.previous-aria">
77 <source>Previous</source>
78 <target>Vorige</target>
79 <context-group name="null">
80 <context context-type="linenumber">13</context>
81 </context-group>
82 </trans-unit>
83 <trans-unit id="ngb.pagination.next">
84 <source>»</source>
85 <target>»</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context>
88 </context-group>
89 </trans-unit>
90 <trans-unit id="ngb.pagination.next-aria">
91 <source>Next</source>
92 <target>Volgende</target>
93 <context-group name="null">
94 <context context-type="linenumber">27</context>
95 </context-group>
96 </trans-unit>
97 <trans-unit id="ngb.pagination.last">
98 <source>»»</source>
99 <target>»»</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context>
102 </context-group>
103 </trans-unit>
104 <trans-unit id="ngb.pagination.last-aria">
105 <source>Last</source>
106 <target>Laatste</target>
107 <context-group name="null">
108 <context context-type="linenumber">34</context>
109 </context-group>
110 </trans-unit>
111 <trans-unit id="ngb.progressbar.value">
112 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
113 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
114 <context-group name="null">
115 <context context-type="linenumber">6</context>
116 </context-group>
117 </trans-unit>
118 <trans-unit id="ngb.timepicker.increment-hours">
119 <source>Increment hours</source>
120 <target>Verhoog uren</target>
121 <context-group name="null">
122 <context context-type="linenumber">9</context>
123 </context-group>
124 </trans-unit>
125 <trans-unit id="ngb.timepicker.HH">
126 <source>HH</source>
127 <target>HH</target>
128 <context-group name="null">
129 <context context-type="linenumber">12</context>
130 </context-group>
131 </trans-unit>
132 <trans-unit id="ngb.timepicker.hours">
133 <source>Hours</source>
134 <target>Uren</target>
135 <context-group name="null">
136 <context context-type="linenumber">14</context>
137 </context-group>
138 </trans-unit>
139 <trans-unit id="ngb.timepicker.decrement-hours">
140 <source>Decrement hours</source>
141 <target>Verlaag uren</target>
142 <context-group name="null">
143 <context context-type="linenumber">19</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="ngb.timepicker.increment-minutes">
147 <source>Increment minutes</source>
148 <target>Verhoog minuten</target>
149 <context-group name="null">
150 <context context-type="linenumber">28</context>
151 </context-group>
152 </trans-unit>
153 <trans-unit id="ngb.timepicker.MM">
154 <source>MM</source>
155 <target>MM</target>
156 <context-group name="null">
157 <context context-type="linenumber">31</context>
158 </context-group>
159 </trans-unit>
160 <trans-unit id="ngb.timepicker.minutes">
161 <source>Minutes</source>
162 <target>Minuten</target>
163 <context-group name="null">
164 <context context-type="linenumber">33</context>
165 </context-group>
166 </trans-unit>
167 <trans-unit id="ngb.timepicker.decrement-minutes">
168 <source>Decrement minutes</source>
169 <target>Verlaag minuten</target>
170 <context-group name="null">
171 <context context-type="linenumber">38</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="ngb.timepicker.increment-seconds">
175 <source>Increment seconds</source>
176 <target>Verhoog seconden</target>
177 <context-group name="null">
178 <context context-type="linenumber">47</context>
179 </context-group>
180 </trans-unit>
181 <trans-unit id="ngb.timepicker.SS">
182 <source>SS</source>
183 <target>SS</target>
184 <context-group name="null">
185 <context context-type="linenumber">50</context>
186 </context-group>
187 </trans-unit>
188 <trans-unit id="ngb.timepicker.seconds">
189 <source>Seconds</source>
190 <target>Seconden</target>
191 <context-group name="null">
192 <context context-type="linenumber">52</context>
193 </context-group>
194 </trans-unit>
195 <trans-unit id="ngb.timepicker.decrement-seconds">
196 <source>Decrement seconds</source>
197 <target>Verlaag seconden</target>
198 <context-group name="null">
199 <context context-type="linenumber">57</context>
200 </context-group>
201 </trans-unit>
202 <trans-unit id="ngb.timepicker.PM">
203 <source>PM</source>
204 <target>PM</target>
205 <context-group name="null">
206 <context context-type="linenumber">65</context>
207 </context-group>
208 </trans-unit>
209 <trans-unit id="ngb.timepicker.AM">
210 <source>AM</source>
211 <target>AM</target>
212 <context-group name="null">
213 <context context-type="linenumber">66</context>
214 </context-group>
215 </trans-unit>
216 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
217 <source>Cancel</source>
218 <target>Annuleren</target>
219 <context-group name="null">
220 <context context-type="linenumber">10</context>
221 </context-group>
222 </trans-unit>
223 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
224 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source>
225 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target>
226 <context-group name="null">
227 <context context-type="linenumber">11</context>
228 </context-group>
229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Onvermeld</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Privé</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
6 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
7 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
8 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> keer bekeken</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> keer bekeken</target>
9 <context-group name="null"> 247 <context-group name="null">
10 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
11 </context-group> 249 </context-group>
12 </trans-unit> 250 </trans-unit>
13 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -21,7 +259,7 @@
21 <source>Edit</source> 259 <source>Edit</source>
22 <target>Bewerken</target> 260 <target>Bewerken</target>
23 <context-group name="null"> 261 <context-group name="null">
24 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
25 </context-group> 263 </context-group>
26 </trans-unit> 264 </trans-unit>
27 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -45,22 +283,171 @@
45 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
46 </context-group> 284 </context-group>
47 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Abonneer
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
302 <context-group name="null">
303 <context context-type="linenumber">5</context>
304 </context-group>
305 </trans-unit>
306 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
307 <source>
308 Unsubscribe
309 </source>
310 <target>
311Abonnement opzeggen</target>
312 <context-group name="null">
313 <context context-type="linenumber">18</context>
314 </context-group>
315 </trans-unit>
316 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
317 <source>Using an ActivityPub account</source>
318 <target>Een ActivityPub-account gebruiken</target>
319 <context-group name="null">
320 <context context-type="linenumber">36</context>
321 </context-group>
322 </trans-unit>
323 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
324 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
325 <target>Abonneer met een account op <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
326 <context-group name="null">
327 <context context-type="linenumber">39</context>
328 </context-group>
329 </trans-unit>
330 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
331 <source>Subscribe with your local account</source>
332 <target>Abonneer met je lokale account</target>
333 <context-group name="null">
334 <context context-type="linenumber">40</context>
335 </context-group>
336 </trans-unit>
337 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
338 <source>Subscribe with a Mastodon account:</source>
339 <target>Abonneer met een Mastodon-account</target>
340 <context-group name="null">
341 <context context-type="linenumber">43</context>
342 </context-group>
343 </trans-unit>
344 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
345 <source>Using a syndication feed</source>
346 <target>Een syndicaatfeed gebruiken</target>
347 <context-group name="null">
348 <context context-type="linenumber">48</context>
349 </context-group>
350 </trans-unit>
351 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
352 <source>Subscribe via RSS</source>
353 <target>Abonneren met RSS</target>
354 <context-group name="null">
355 <context context-type="linenumber">49</context>
356 </context-group>
357 </trans-unit>
358 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
359 <source>
360 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
361 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
362 </source>
363 <target>
364<x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Extern abonneren<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
365 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Externe interactie<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
366 </target>
367 <context-group name="null">
368 <context context-type="linenumber">10</context>
369 </context-group>
370 </trans-unit>
371 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
372 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
373 <target>Je kan op het kanaal abonneren via elke ActivityPub-mogelijke fediverse instantie. Bijvoorbeeld met Mastodon of Pleroma kan je de URL van het kanaal in de zoekbalk invullen en daar abonneren.</target>
374 <context-group name="null">
375 <context context-type="linenumber">17</context>
376 </context-group>
377 </trans-unit>
378 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
379 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
380 <target>Je kan hiermee interactie hebben via elke ActivityPub-mogelijke fediverse instantie. Bijvoorbeeld met Mastodon of Pleroma kan je de huidige URL in de zoekbalk typen en er daar interactie mee hebben.</target>
381 <context-group name="null">
382 <context context-type="linenumber">22</context>
383 </context-group>
384 </trans-unit>
48 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 385 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
49 <source>Video quota</source> 386 <source>Video quota</source>
50 <target>Videoquotum</target> 387 <target>Videoquotum</target>
51 <context-group name="null"> 388 <context-group name="null">
52 <context context-type="linenumber">19</context> 389 <context context-type="linenumber">42</context>
390 </context-group>
391 </trans-unit>
392 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
393 <source>
394 Unlimited <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per day)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
395 </source>
396 <target>
397Oneindig <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per dag)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
398 </target>
399 <context-group name="null">
400 <context context-type="linenumber">14</context>
401 </context-group>
402 </trans-unit>
403 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
404 <source>Ban</source>
405 <target>Verbannen</target>
406 <context-group name="null">
407 <context context-type="linenumber">3</context>
408 </context-group>
409 </trans-unit>
410 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
411 <source>Reason...</source>
412 <target>Reden...</target>
413 <context-group name="null">
414 <context context-type="linenumber">11</context>
415 </context-group>
416 </trans-unit>
417 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
418 <source>
419 A banned user will no longer be able to login.
420 </source>
421 <target>
422Een verbannen gebruiker kan niet langer inloggen.</target>
423 <context-group name="null">
424 <context context-type="linenumber">17</context>
425 </context-group>
426 </trans-unit>
427 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
428 <source>Ban this user</source>
429 <target>Verban deze gebruiker</target>
430 <context-group name="null">
431 <context context-type="linenumber">25</context>
53 </context-group> 432 </context-group>
54 </trans-unit> 433 </trans-unit>
55 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 434 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
56 <source> 435 <source>
57 Login 436 Login
58 </source> 437 </source>
59 <target>Aanmelden</target> 438 <target>
439Aanmelden</target>
60 <context-group name="null"> 440 <context-group name="null">
61 <context context-type="linenumber">2</context> 441 <context context-type="linenumber">2</context>
62 </context-group> 442 </context-group>
63 </trans-unit> 443 </trans-unit>
444 <trans-unit id="ae3cb52bf2dee3101ee654812b5d16e8665a9453">
445 <source>Request new verification email.</source>
446 <target>Een nieuwe verificatie e-mail aanvragen.</target>
447 <context-group name="null">
448 <context context-type="linenumber">12</context>
449 </context-group>
450 </trans-unit>
64 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194"> 451 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
65 <source>User</source> 452 <source>User</source>
66 <target>Gebruiker</target> 453 <target>Gebruiker</target>
@@ -79,7 +466,8 @@
79 <source> 466 <source>
80 or create an account 467 or create an account
81 </source> 468 </source>
82 <target>of maak een account</target> 469 <target>
470of maak een account</target>
83 <context-group name="null"> 471 <context-group name="null">
84 <context context-type="linenumber">18</context> 472 <context context-type="linenumber">18</context>
85 </context-group> 473 </context-group>
@@ -88,14 +476,15 @@
88 <source> 476 <source>
89 or create an account on another instance 477 or create an account on another instance
90 </source> 478 </source>
91 <target>of maak een account aan op een andere server</target> 479 <target>
480of maak een account aan op een andere instantie</target>
92 <context-group name="null"> 481 <context-group name="null">
93 <context context-type="linenumber">22</context> 482 <context context-type="linenumber">22</context>
94 </context-group> 483 </context-group>
95 </trans-unit> 484 </trans-unit>
96 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3"> 485 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
97 <source>User registration is not allowed on this instance, but you can register on many others!</source> 486 <source>User registration is not allowed on this instance, but you can register on many others!</source>
98 <target>Registratie is niet mogelijk op deze instantie, maar je kan een account maken op een van de vele anderen!</target> 487 <target>Registratie is niet mogelijk op deze instantie, maar je kan wel registreren op een van de vele anderen!</target>
99 <context-group name="null"> 488 <context-group name="null">
100 <context context-type="linenumber">28</context> 489 <context context-type="linenumber">28</context>
101 </context-group> 490 </context-group>
@@ -104,12 +493,12 @@
104 <source>Password</source> 493 <source>Password</source>
105 <target>Wachtwoord</target> 494 <target>Wachtwoord</target>
106 <context-group name="null"> 495 <context-group name="null">
107 <context context-type="linenumber">12</context> 496 <context context-type="linenumber">13</context>
108 </context-group> 497 </context-group>
109 </trans-unit> 498 </trans-unit>
110 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 499 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
111 <source>I forgot my password</source> 500 <source>I forgot my password</source>
112 <target>Wachtwoord vergeten</target> 501 <target>Ik ben mijn wachtwoord vergeten</target>
113 <context-group name="null"> 502 <context-group name="null">
114 <context context-type="linenumber">44</context> 503 <context context-type="linenumber">44</context>
115 </context-group> 504 </context-group>
@@ -118,12 +507,12 @@
118 <source>Login</source> 507 <source>Login</source>
119 <target>Aanmelden</target> 508 <target>Aanmelden</target>
120 <context-group name="null"> 509 <context-group name="null">
121 <context context-type="linenumber">38</context> 510 <context context-type="linenumber">36</context>
122 </context-group> 511 </context-group>
123 </trans-unit> 512 </trans-unit>
124 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 513 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
125 <source>Forgot your password</source> 514 <source>Forgot your password</source>
126 <target>Wachtwoord vergeten</target> 515 <target>Jouw wachtwoord vergeten</target>
127 <context-group name="null"> 516 <context-group name="null">
128 <context context-type="linenumber">57</context> 517 <context context-type="linenumber">57</context>
129 </context-group> 518 </context-group>
@@ -146,14 +535,15 @@
146 <source>Send me an email to reset my password</source> 535 <source>Send me an email to reset my password</source>
147 <target>Zend me een e-mail om een nieuw wachtwoord in te stellen</target> 536 <target>Zend me een e-mail om een nieuw wachtwoord in te stellen</target>
148 <context-group name="null"> 537 <context-group name="null">
149 <context context-type="linenumber">75</context> 538 <context context-type="linenumber">80</context>
150 </context-group> 539 </context-group>
151 </trans-unit> 540 </trans-unit>
152 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 541 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
153 <source> 542 <source>
154 Reset my password 543 Reset my password
155 </source> 544 </source>
156 <target>Wachtwoord opnieuw instellen</target> 545 <target>
546Wachtwoord opnieuw instellen</target>
157 <context-group name="null"> 547 <context-group name="null">
158 <context context-type="linenumber">2</context> 548 <context context-type="linenumber">2</context>
159 </context-group> 549 </context-group>
@@ -183,7 +573,8 @@
183 <source> 573 <source>
184 Create an account 574 Create an account
185 </source> 575 </source>
186 <target>Account maken</target> 576 <target>
577Account aanmaken</target>
187 <context-group name="null"> 578 <context-group name="null">
188 <context context-type="linenumber">3</context> 579 <context context-type="linenumber">3</context>
189 </context-group> 580 </context-group>
@@ -195,25 +586,139 @@
195 <context context-type="linenumber">8</context> 586 <context context-type="linenumber">8</context>
196 </context-group> 587 </context-group>
197 </trans-unit> 588 </trans-unit>
589 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
590 <source>Example: jane_doe</source>
591 <target>Bijvoorbeeld: jane-doe</target>
592 <context-group name="null">
593 <context context-type="linenumber">17</context>
594 </context-group>
595 </trans-unit>
596 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
597 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
598 <target>Ik ben minstens 16 jaar oud en accepteer de &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Voorwaarden&lt;/a&gt; van deze instantie</target>
599 <context-group name="null">
600 <context context-type="linenumber">55</context>
601 </context-group>
602 </trans-unit>
198 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 603 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
199 <source>Signup</source> 604 <source>Signup</source>
200 <target>Registratie</target> 605 <target>Registratie</target>
201 <context-group name="null"> 606 <context-group name="null">
202 <context context-type="linenumber">88</context> 607 <context context-type="linenumber">78</context>
608 </context-group>
609 </trans-unit>
610 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
611 <source>Features found on this instance</source>
612 <target>Kenmerken van deze instantie</target>
613 <context-group name="null">
614 <context context-type="linenumber">67</context>
615 </context-group>
616 </trans-unit>
617 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
618 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
619 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> resultaten</target>
620 <context-group name="null">
621 <context context-type="linenumber">5</context>
622 </context-group>
623 </trans-unit>
624 <trans-unit id="4c3960fb1d9b07d1db3b5bda3ee40019211830dc">
625 <source>
626 for <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
627 </source>
628 <target>
629voor <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
630 <context-group name="null">
631 <context context-type="linenumber">6</context>
632 </context-group>
633 </trans-unit>
634 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
635 <source>
636 Filters
637 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
638 </source>
639 <target>
640 Filters
641 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
642 <context-group name="null">
643 <context context-type="linenumber">16</context>
644 </context-group>
645 </trans-unit>
646 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
647 <source>
648 No results found
649 </source>
650 <target>
651Geen resultaten gevonden</target>
652 <context-group name="null">
653 <context context-type="linenumber">28</context>
654 </context-group>
655 </trans-unit>
656 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
657 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
658 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonnees</target>
659 <context-group name="null">
660 <context context-type="linenumber">44</context>
661 </context-group>
662 </trans-unit>
663 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
664 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
665 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> weergaven</target>
666 <context-group name="null">
667 <context context-type="linenumber">55</context>
203 </context-group> 668 </context-group>
204 </trans-unit> 669 </trans-unit>
205 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 670 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
206 <source>Change the language</source> 671 <source>Change the language</source>
207 <target>Taal veranderen</target> 672 <target>Taal veranderen</target>
208 <context-group name="null"> 673 <context-group name="null">
209 <context context-type="linenumber">88</context> 674 <context context-type="linenumber">86</context>
675 </context-group>
676 </trans-unit>
677 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
678 <source>
679 My public profile
680 </source>
681 <target>
682Mijn openbare profiel</target>
683 <context-group name="null">
684 <context context-type="linenumber">16</context>
685 </context-group>
686 </trans-unit>
687 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
688 <source>
689 My account
690 </source>
691 <target>
692Mijn account</target>
693 <context-group name="null">
694 <context context-type="linenumber">20</context>
695 </context-group>
696 </trans-unit>
697 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
698 <source>
699 My videos
700 </source>
701 <target>
702Mijn video's</target>
703 <context-group name="null">
704 <context context-type="linenumber">24</context>
705 </context-group>
706 </trans-unit>
707 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
708 <source>
709 Log out
710 </source>
711 <target>
712Uitloggen</target>
713 <context-group name="null">
714 <context context-type="linenumber">28</context>
210 </context-group> 715 </context-group>
211 </trans-unit> 716 </trans-unit>
212 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 717 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
213 <source>Create an account</source> 718 <source>Create an account</source>
214 <target>Account maken</target> 719 <target>Account maken</target>
215 <context-group name="null"> 720 <context-group name="null">
216 <context context-type="linenumber">39</context> 721 <context context-type="linenumber">37</context>
217 </context-group> 722 </context-group>
218 </trans-unit> 723 </trans-unit>
219 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 724 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -223,32 +728,53 @@
223 <context context-type="linenumber">24</context> 728 <context context-type="linenumber">24</context>
224 </context-group> 729 </context-group>
225 </trans-unit> 730 </trans-unit>
731 <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
732 <source>Subscriptions</source>
733 <target>Abonnementen</target>
734 <context-group name="null">
735 <context context-type="linenumber">45</context>
736 </context-group>
737 </trans-unit>
738 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
739 <source>Overview</source>
740 <target>Overzicht</target>
741 <context-group name="null">
742 <context context-type="linenumber">50</context>
743 </context-group>
744 </trans-unit>
226 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 745 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
227 <source>Trending</source> 746 <source>Trending</source>
228 <target>Populair</target> 747 <target>Populair</target>
229 <context-group name="null"> 748 <context-group name="null">
230 <context context-type="linenumber">57</context> 749 <context context-type="linenumber">55</context>
231 </context-group> 750 </context-group>
232 </trans-unit> 751 </trans-unit>
233 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 752 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
234 <source>Recently added</source> 753 <source>Recently added</source>
235 <target>Recent toegevoegd</target> 754 <target>Recent toegevoegd</target>
236 <context-group name="null"> 755 <context-group name="null">
237 <context context-type="linenumber">62</context> 756 <context context-type="linenumber">60</context>
238 </context-group> 757 </context-group>
239 </trans-unit> 758 </trans-unit>
240 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 759 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
241 <source>Local</source> 760 <source>Local</source>
242 <target>Lokaal</target> 761 <target>Lokaal</target>
243 <context-group name="null"> 762 <context-group name="null">
244 <context context-type="linenumber">67</context> 763 <context context-type="linenumber">65</context>
764 </context-group>
765 </trans-unit>
766 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
767 <source>More</source>
768 <target>Meer</target>
769 <context-group name="null">
770 <context context-type="linenumber">70</context>
245 </context-group> 771 </context-group>
246 </trans-unit> 772 </trans-unit>
247 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 773 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
248 <source>Administration</source> 774 <source>Administration</source>
249 <target>Administratie</target> 775 <target>Administratie</target>
250 <context-group name="null"> 776 <context-group name="null">
251 <context context-type="linenumber">76</context> 777 <context context-type="linenumber">74</context>
252 </context-group> 778 </context-group>
253 </trans-unit> 779 </trans-unit>
254 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 780 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -258,6 +784,20 @@
258 <context context-type="linenumber">25</context> 784 <context context-type="linenumber">25</context>
259 </context-group> 785 </context-group>
260 </trans-unit> 786 </trans-unit>
787 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
788 <source>Show keyboard shortcuts</source>
789 <target>Laat keyboard shortcuts zien</target>
790 <context-group name="null">
791 <context context-type="linenumber">89</context>
792 </context-group>
793 </trans-unit>
794 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
795 <source>Toggle dark interface</source>
796 <target>Schakel donkere interface aan of uit</target>
797 <context-group name="null">
798 <context context-type="linenumber">92</context>
799 </context-group>
800 </trans-unit>
261 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 801 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
262 <source>Search...</source> 802 <source>Search...</source>
263 <target>Zoeken …</target> 803 <target>Zoeken …</target>
@@ -272,6 +812,48 @@
272 <context context-type="linenumber">9</context> 812 <context context-type="linenumber">9</context>
273 </context-group> 813 </context-group>
274 </trans-unit> 814 </trans-unit>
815 <trans-unit id="5d43539fc358c3a548b9d487be821db73e2702ff">
816 <source>Sort</source>
817 <target>Sorteren</target>
818 <context-group name="null">
819 <context context-type="linenumber">6</context>
820 </context-group>
821 </trans-unit>
822 <trans-unit id="98acac685fc4b2d35e5d0cf3cd224d247a756c3e">
823 <source>Published date</source>
824 <target>Datum van publicatie</target>
825 <context-group name="null">
826 <context context-type="linenumber">15</context>
827 </context-group>
828 </trans-unit>
829 <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
830 <source>Duration</source>
831 <target>Duratie</target>
832 <context-group name="null">
833 <context context-type="linenumber">24</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
837 <source>Display sensitive content</source>
838 <target>Laat gevoelige inhoud zien</target>
839 <context-group name="null">
840 <context context-type="linenumber">33</context>
841 </context-group>
842 </trans-unit>
843 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
844 <source>Yes</source>
845 <target>Ja</target>
846 <context-group name="null">
847 <context context-type="linenumber">37</context>
848 </context-group>
849 </trans-unit>
850 <trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd">
851 <source>No</source>
852 <target>Nee</target>
853 <context-group name="null">
854 <context context-type="linenumber">42</context>
855 </context-group>
856 </trans-unit>
275 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94"> 857 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
276 <source>Category</source> 858 <source>Category</source>
277 <target>Categorie</target> 859 <target>Categorie</target>
@@ -293,18 +875,84 @@
293 <context context-type="linenumber">182</context> 875 <context context-type="linenumber">182</context>
294 </context-group> 876 </context-group>
295 </trans-unit> 877 </trans-unit>
878 <trans-unit id="c8d58c4fbe23e51af3dc8f58cb4a81eac20739e8">
879 <source>All of these tags</source>
880 <target>Al deze tags</target>
881 <context-group name="null">
882 <context context-type="linenumber">82</context>
883 </context-group>
884 </trans-unit>
885 <trans-unit id="492d2bd18db0cba03f6d9e3b0c42b8639fbe51ab">
886 <source>One of these tags</source>
887 <target>Een van deze tags</target>
888 <context-group name="null">
889 <context context-type="linenumber">87</context>
890 </context-group>
891 </trans-unit>
892 <trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
893 <source>Filter</source>
894 <target>Filter</target>
895 <context-group name="null">
896 <context context-type="linenumber">94</context>
897 </context-group>
898 </trans-unit>
899 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
900 <source>Display unlisted and private videos</source>
901 <target>Laat onvermelde en privé-video's zien</target>
902 <context-group name="null">
903 <context context-type="linenumber">14</context>
904 </context-group>
905 </trans-unit>
296 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 906 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
297 <source>No results.</source> 907 <source>No results.</source>
298 <target>Geen resultaten.</target> 908 <target>Geen resultaten.</target>
299 <context-group name="null"> 909 <context-group name="null">
300 <context context-type="linenumber">7</context> 910 <context context-type="linenumber">20</context>
911 </context-group>
912 </trans-unit>
913 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
914 <source>
915 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
916 </source>
917 <target>
918<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
919 <context-group name="null">
920 <context context-type="linenumber">6</context>
921 </context-group>
922 </trans-unit>
923 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
924 <source>
925 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
926 </source>
927 <target>
928<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
929 <context-group name="null">
930 <context context-type="linenumber">14</context>
931 </context-group>
932 </trans-unit>
933 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
934 <source>
935 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
936 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
937
938 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
939 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
940 </source>
941 <target>
942<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
943 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
944
945 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
946 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
947 <context-group name="null">
948 <context context-type="linenumber">22</context>
301 </context-group> 949 </context-group>
302 </trans-unit> 950 </trans-unit>
303 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 951 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
304 <source>Instance</source> 952 <source>Instance</source>
305 <target>Instantie</target> 953 <target>Instantie</target>
306 <context-group name="null"> 954 <context-group name="null">
307 <context context-type="linenumber">8</context> 955 <context context-type="linenumber">12</context>
308 </context-group> 956 </context-group>
309 </trans-unit> 957 </trans-unit>
310 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 958 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -314,13 +962,21 @@
314 <context context-type="linenumber">7</context> 962 <context context-type="linenumber">7</context>
315 </context-group> 963 </context-group>
316 </trans-unit> 964 </trans-unit>
317 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 965 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
318 <source> 966 <source>
319 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 967 Cancel
320</source> 968 </source>
321 <target>Over de instantie <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target> 969 <target>
970Annuleer</target>
322 <context-group name="null"> 971 <context-group name="null">
323 <context context-type="linenumber">1</context> 972 <context context-type="linenumber">26</context>
973 </context-group>
974 </trans-unit>
975 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
976 <source>Submit</source>
977 <target>Voorleggen</target>
978 <context-group name="null">
979 <context context-type="linenumber">31</context>
324 </context-group> 980 </context-group>
325 </trans-unit> 981 </trans-unit>
326 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 982 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -334,48 +990,24 @@
334 <source>Terms</source> 990 <source>Terms</source>
335 <target>Voorwaarden</target> 991 <target>Voorwaarden</target>
336 <context-group name="null"> 992 <context-group name="null">
337 <context context-type="linenumber">44</context> 993 <context context-type="linenumber">39</context>
338 </context-group> 994 </context-group>
339 </trans-unit> 995 </trans-unit>
340 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 996 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
341 <source>User registration is allowed and</source> 997 <source>User registration is allowed and</source>
342 <target>Een account aanmaken is mogelijk en</target> 998 <target>Een account aanmaken is mogelijk en</target>
343 <context-group name="null"> 999 <context-group name="null">
344 <context context-type="linenumber">25</context> 1000 <context context-type="linenumber">29</context>
345 </context-group>
346 </trans-unit>
347 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
348 <source>
349 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
350 </source>
351 <target>deze instantie voorziet een basis-opslagquotum van <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> voor de video's van haar gebruikers.</target>
352 <context-group name="null">
353 <context context-type="linenumber">27</context>
354 </context-group>
355 </trans-unit>
356 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
357 <source>
358 this instance provides unlimited space for the videos of its users.
359 </source>
360 <target>deze instantie voorziet onbeperkte opslagruimte voor de video's van haar gebruikers.</target>
361 <context-group name="null">
362 <context context-type="linenumber">31</context>
363 </context-group>
364 </trans-unit>
365 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
366 <source>
367 User registration is currently not allowed.
368 </source>
369 <target>Een account maken is momenteel niet toegelaten op deze instantie.</target>
370 <context-group name="null">
371 <context context-type="linenumber">36</context>
372 </context-group> 1001 </context-group>
373 </trans-unit> 1002 </trans-unit>
374 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1003 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
375 <source> 1004 <source>
376 About PeerTube 1005 About PeerTube
377</source> 1006</source>
378 <target>Over PeerTube</target> 1007 <target>
1008Over PeerTube
1009
1010</target>
379 <context-group name="null"> 1011 <context-group name="null">
380 <context context-type="linenumber">1</context> 1012 <context context-type="linenumber">1</context>
381 </context-group> 1013 </context-group>
@@ -391,7 +1023,8 @@
391 <source> 1023 <source>
392 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1024 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
393 </source> 1025 </source>
394 <target>Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target> 1026 <target>
1027Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licentie<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
395 <context-group name="null"> 1028 <context-group name="null">
396 <context context-type="linenumber">8</context> 1029 <context context-type="linenumber">8</context>
397 </context-group> 1030 </context-group>
@@ -400,7 +1033,8 @@
400 <source> 1033 <source>
401 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1034 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
402 </source> 1035 </source>
403 <target>Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target> 1036 <target>
1037Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
404 <context-group name="null"> 1038 <context-group name="null">
405 <context context-type="linenumber">12</context> 1039 <context context-type="linenumber">12</context>
406 </context-group> 1040 </context-group>
@@ -417,7 +1051,8 @@
417 PeerTube uses the BitTorrent protocol to share bandwidth between users. 1051 PeerTube uses the BitTorrent protocol to share bandwidth between users.
418 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video. 1052 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
419 </source> 1053 </source>
420 <target>PeerTube gebruikt het BitTorrent-protocol om bandbreedte tussen gebruikers te delen. Dat betekent ook dat jouw IP-adres bijgehouden wordt in de BitTorrent-tracker van de PeerTube-instantie zolang je de video aan het bekijken bent.</target> 1054 <target>
1055PeerTube gebruikt het BitTorrent-protocol om bandbreedte tussen gebruikers te delen. Dat betekent ook dat jouw IP-adres bijgehouden wordt in de BitTorrent-tracker van de PeerTube-instantie zolang je de video aan het bekijken bent.</target>
421 <context-group name="null"> 1056 <context-group name="null">
422 <context context-type="linenumber">20</context> 1057 <context context-type="linenumber">20</context>
423 </context-group> 1058 </context-group>
@@ -434,7 +1069,8 @@
434 In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video. 1069 In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video.
435 In practice, this is much more difficult because: 1070 In practice, this is much more difficult because:
436 </source> 1071 </source>
437 <target>In theorie kan iemand met technische kennis een script maken dat bijhoudt welk IP-adres welke video aan het downloaden is. In de praktijk is dat wat moeilijker:</target> 1072 <target>
1073In theorie kan iemand met technische kennis een script maken dat bijhoudt welk IP-adres welke video aan het downloaden is. In de praktijk is dat wat moeilijker omdat:</target>
438 <context-group name="null"> 1074 <context-group name="null">
439 <context context-type="linenumber">27</context> 1075 <context context-type="linenumber">27</context>
440 </context-group> 1076 </context-group>
@@ -444,7 +1080,8 @@
444 An HTTP request has to be sent on each tracker for each video to spy. 1080 An HTTP request has to be sent on each tracker for each video to spy.
445 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot) 1081 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
446 </source> 1082 </source>
447 <target>Voor elke video waarvan hij de kijkers wil bespioneren, moet hij een apart HTTP-request sturen. Om dat voor alle PeerTube-videos te doen, moeten er dus evenveel HTTP-requests als video's gebruikt worden (dat kan hoog oplopen).</target> 1083 <target>
1084Voor elke video waarvan hij de kijkers wil bespioneren, moet hij een apart HTTP-request sturen. Om dat voor alle PeerTube-videos te doen, moeten er dus evenveel HTTP-requests als video's gebruikt worden (dat kan hoog oplopen).</target>
448 <context-group name="null"> 1085 <context-group name="null">
449 <context context-type="linenumber">33</context> 1086 <context context-type="linenumber">33</context>
450 </context-group> 1087 </context-group>
@@ -454,7 +1091,8 @@
454 For each request sent, the tracker returns random peers at a limited number. 1091 For each request sent, the tracker returns random peers at a limited number.
455 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm 1092 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm
456 </source> 1093 </source>
457 <target>Voor elk request geeft de tracker een beperkt aantal willekeurige peers terug. Als er bijvoorbeeld 1000 peers beschikbaar zijn en de tracker steeds 20 peers teruggeeft, moeten er op zijn minst 50 requests gestuurd worden om alle peers te weten te komen.</target> 1094 <target>
1095Voor elk request geeft de tracker een beperkt aantal willekeurige peers terug. Als er bijvoorbeeld 1000 peers beschikbaar zijn en de tracker steeds 20 peers teruggeeft, moeten er op zijn minst 50 requests gestuurd worden om alle peers te weten te komen.</target>
458 <context-group name="null"> 1096 <context-group name="null">
459 <context context-type="linenumber">38</context> 1097 <context context-type="linenumber">38</context>
460 </context-group> 1098 </context-group>
@@ -463,7 +1101,8 @@
463 <source> 1101 <source>
464 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour 1102 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
465 </source> 1103 </source>
466 <target>Die requests moeten regelmatig herhaald worden om te kunnen achterhalen wie begint of stopt met een video te bekijken. Het is gemakkelijk om zulk gedrag te detecteren.</target> 1104 <target>
1105Die requests moeten regelmatig herhaald worden om te kunnen achterhalen wie begint of stopt met een video te kijken. Het is gemakkelijk om zulk gedrag te detecteren.</target>
467 <context-group name="null"> 1106 <context-group name="null">
468 <context context-type="linenumber">43</context> 1107 <context context-type="linenumber">43</context>
469 </context-group> 1108 </context-group>
@@ -472,7 +1111,8 @@
472 <source> 1111 <source>
473 If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video 1112 If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video
474 </source> 1113 </source>
475 <target>Als een IP-adres opgeslagen is in de tracker, betekent dat niet dat de persoon achter dat adres (als die persoon bestaat) de video bekeken heeft</target> 1114 <target>
1115Als een IP-adres opgeslagen is in de tracker, betekent dat niet dat de persoon achter dat adres (als die persoon bestaat) de video bekeken heeft</target>
476 <context-group name="null"> 1116 <context-group name="null">
477 <context context-type="linenumber">47</context> 1117 <context context-type="linenumber">47</context>
478 </context-group> 1118 </context-group>
@@ -481,36 +1121,181 @@
481 <source> 1121 <source>
482 The IP address is a vague information : usually, it regularly changes and can represent many persons or entities 1122 The IP address is a vague information : usually, it regularly changes and can represent many persons or entities
483 </source> 1123 </source>
484 <target>Een IP-adres is vage </target> 1124 <target>
1125Een IP-adres is vage informatie: Meestal veranderd het regelmatig en kan het meerdere personen en identiteiten representeren</target>
485 <context-group name="null"> 1126 <context-group name="null">
486 <context context-type="linenumber">51</context> 1127 <context context-type="linenumber">51</context>
487 </context-group> 1128 </context-group>
488 </trans-unit> 1129 </trans-unit>
1130 <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
1131 <source>
1132 Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), the protocol is different from classic BitTorrent.
1133 When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
1134 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information
1135 </source>
1136 <target>
1137Web peers zijn niet openbaar bereikbaar: omdat we WebRTC in de webbrowser gebruiken (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>met de WebTorrent-bibliotheek<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), is het protocol anders dan in klassieke BitTorrent.
1138 Wanneer je in een webbrowser zit, verstuur je een signaal die je IP adres bevat naar de tracker die willekeurig andere peers kiest om de informatie heen te sturen.
1139 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>dit document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> voor meer informatie</target>
1140 <context-group name="null">
1141 <context context-type="linenumber">55</context>
1142 </context-group>
1143 </trans-unit>
1144 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
1145 <source>
1146 The worst-case scenario of an average person spying on their friends is quite unlikely.
1147 There are much more effective ways to get that kind of information.
1148 </source>
1149 <target>
1150Het worst-case scenario dat kan gebeuren van een gemiddeld persoon die hun vrienden bespioneert is erg onwaarschijnlijk.
1151Er zijn veel effectievere manieren om dat soort informatie te verkrijgen.</target>
1152 <context-group name="null">
1153 <context context-type="linenumber">62</context>
1154 </context-group>
1155 </trans-unit>
1156 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
1157 <source>How does PeerTube compare with YouTube?</source>
1158 <target>Hoe is PeerTube vergeleken met YouTube?</target>
1159 <context-group name="null">
1160 <context context-type="linenumber">67</context>
1161 </context-group>
1162 </trans-unit>
1163 <trans-unit id="2432705cbabcb92a8677338901dd5d655383ef4c">
1164 <source>
1165 The threats to privacy in YouTube are different from PeerTube's.
1166 In YouTube's case, the platform gathers a huge amount of your personal information (not only your IP) to analyze them and track you.
1167 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
1168 </source>
1169 <target>
1170De bedreigingen tegen privacy in YouTube zijn verschillend dan in PeerTube's geval.
1171In YouTube's geval, verzamelt het platform een gigantisch aantal persoonlijke informatie (niet alleen je IP) om te analyseren en om je te tracken.
1172Verder nog, YouTube is eigendom van Google/Alphabet, een bedrijf die je trackt over meerdere websites (via AdSense of Google Analytics).</target>
1173 <context-group name="null">
1174 <context context-type="linenumber">69</context>
1175 </context-group>
1176 </trans-unit>
1177 <trans-unit id="3c2990d5e452bdf2317ff23745db70705d848d99">
1178 <source>What can I do to limit the exposure of my IP address?</source>
1179 <target>Wat kan ik doen om de blootstelling van mijn IP adress te verminderen?</target>
1180 <context-group name="null">
1181 <context context-type="linenumber">75</context>
1182 </context-group>
1183 </trans-unit>
489 <trans-unit id="a545356de272b955258c2a2432b08ec637b65f7e"> 1184 <trans-unit id="a545356de272b955258c2a2432b08ec637b65f7e">
490 <source> 1185 <source>
491 Your IP address is public so every time you consult a website, there is a number of actors (in addition to the final website) seeing your IP in their connection logs: ISP/routers/trackers/CDN and more. 1186 Your IP address is public so every time you consult a website, there is a number of actors (in addition to the final website) seeing your IP in their connection logs: ISP/routers/trackers/CDN and more.
492 PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser. 1187 PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser.
493 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense. 1188 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense.
494 </source> 1189 </source>
495 <target>Je IP-adres is geen privé-gegeven. Elke keer je een website bezoekt, is er een aantal entiteiten (bovenop de website die je effectief bezoekt) die je IP zien in hun logs: ISP's, routers, trackers, CDN's en meer. 1190 <target>
496PeerTube is transparant: we waarschuwen je dat je, als je je IP-adres privé wil afschermen, je een VPN of de Tor-Browser moet gebruiken. 1191Je IP-adres is openbaar dus elke keer dat je een website bezoekt, zijn er een aantal actoren (bovenop de website die je effectief bezoekt) die je IP zien in hun logs: ISP/routers/trackers/CDN en meer.
497Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit geven.</target> 1192PeerTube is daarover transparant: we waarschuwen je dat je, als je je IP-adres wil afschermen, je een VPN of de Tor-Browser moet gebruiken.
1193Denken dat het P2P-mechanisme uit PeerTube halen je anonimiteit terug zou geven is onlogisch.</target>
498 <context-group name="null"> 1194 <context-group name="null">
499 <context context-type="linenumber">77</context> 1195 <context context-type="linenumber">77</context>
500 </context-group> 1196 </context-group>
501 </trans-unit> 1197 </trans-unit>
1198 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
1199 <source>What will be done to mitigate this problem?</source>
1200 <target>Wat zal worden gedaan om dit probleem te verminderen?</target>
1201 <context-group name="null">
1202 <context context-type="linenumber">83</context>
1203 </context-group>
1204 </trans-unit>
1205 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1206 <source>
1207 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1208 In the meantime, we want to test different ideas related to this issue:
1209 </source>
1210 <target>
1211PeerTube is in haar ontwikkelingsfasen, en wilt de beste tegenmaatregelen mogelijk geven tegen de tijd dat de stabiele versie is gereleased.
1212Ondertussen willen we verschillende ideeën testen die gerelateerd zijn aan dit probleem:</target>
1213 <context-group name="null">
1214 <context context-type="linenumber">85</context>
1215 </context-group>
1216 </trans-unit>
1217 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1218 <source>Set a limit to the number of peers sent by the tracker</source>
1219 <target>Zet een limiet op het aantal peers verzonden door de tracker</target>
1220 <context-group name="null">
1221 <context context-type="linenumber">91</context>
1222 </context-group>
1223 </trans-unit>
1224 <trans-unit id="a6d732b614143f862e69798046dc0868716547e5">
1225 <source>Set a limit on the request frequency received by the tracker (being tested)</source>
1226 <target>Zet een limiet op de verzoekfrequentie verkregen door de tracker (wordt getest)</target>
1227 <context-group name="null">
1228 <context context-type="linenumber">92</context>
1229 </context-group>
1230 </trans-unit>
1231 <trans-unit id="ba77e356eaa5c06caaf5c8734c361d1a5415fe1c">
1232 <source>Ring a bell if there are unusual requests (being tested)</source>
1233 <target>Laat iets horen als er ongebruikelijke requests zijn (wordt getest)</target>
1234 <context-group name="null">
1235 <context context-type="linenumber">93</context>
1236 </context-group>
1237 </trans-unit>
1238 <trans-unit id="81861ff8a71c8a5881cdf66417f3bddb753f0e18">
1239 <source>Disable P2P from the administration interface</source>
1240 <target>Schakel P2P uit vanuit het administratieinterface</target>
1241 <context-group name="null">
1242 <context context-type="linenumber">94</context>
1243 </context-group>
1244 </trans-unit>
1245 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6">
1246 <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source>
1247 <target>Een automatisch video-overbodigheidsprogramma: we zouden niet weten of het IP de video met opzet heeft gedownload, of als het een geautomatiseerd programma was.</target>
1248 <context-group name="null">
1249 <context context-type="linenumber">95</context>
1250 </context-group>
1251 </trans-unit>
1252 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1253 <source>Banned</source>
1254 <target>Verbannen</target>
1255 <context-group name="null">
1256 <context context-type="linenumber">12</context>
1257 </context-group>
1258 </trans-unit>
1259 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1260 <source>Muted</source>
1261 <target>Gedempt</target>
1262 <context-group name="null">
1263 <context context-type="linenumber">13</context>
1264 </context-group>
1265 </trans-unit>
1266 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1267 <source>Muted by your instance</source>
1268 <target>Gedempt door jouw instantie</target>
1269 <context-group name="null">
1270 <context context-type="linenumber">14</context>
1271 </context-group>
1272 </trans-unit>
1273 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1274 <source>Instance muted</source>
1275 <target>Instantie gedempt</target>
1276 <context-group name="null">
1277 <context context-type="linenumber">15</context>
1278 </context-group>
1279 </trans-unit>
1280 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1281 <source>Instance muted by your instance</source>
1282 <target>Instantie gedempt door jouw instantie</target>
1283 <context-group name="null">
1284 <context context-type="linenumber">16</context>
1285 </context-group>
1286 </trans-unit>
502 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1287 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
503 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1288 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
504 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target> 1289 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target>
505 <context-group name="null"> 1290 <context-group name="null">
506 <context context-type="linenumber">12</context> 1291 <context context-type="linenumber">24</context>
507 </context-group> 1292 </context-group>
508 </trans-unit> 1293 </trans-unit>
509 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1294 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
510 <source>Video channels</source> 1295 <source>Video channels</source>
511 <target>Videokanalen</target> 1296 <target>Videokanalen</target>
512 <context-group name="null"> 1297 <context-group name="null">
513 <context context-type="linenumber">19</context> 1298 <context context-type="linenumber">31</context>
514 </context-group> 1299 </context-group>
515 </trans-unit> 1300 </trans-unit>
516 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1301 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -552,42 +1337,49 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
552 <source>Short description</source> 1337 <source>Short description</source>
553 <target>Korte omschrijving</target> 1338 <target>Korte omschrijving</target>
554 <context-group name="null"> 1339 <context-group name="null">
555 <context context-type="linenumber">22</context> 1340 <context context-type="linenumber">21</context>
556 </context-group> 1341 </context-group>
557 </trans-unit> 1342 </trans-unit>
558 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1343 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
559 <source>Default client route</source> 1344 <source>Default client route</source>
560 <target>Startpagina</target> 1345 <target>Startpagina</target>
561 <context-group name="null"> 1346 <context-group name="null">
562 <context context-type="linenumber">55</context> 1347 <context context-type="linenumber">48</context>
1348 </context-group>
1349 </trans-unit>
1350 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1351 <source>Videos Overview</source>
1352 <target>Video-overzicht</target>
1353 <context-group name="null">
1354 <context context-type="linenumber">51</context>
563 </context-group> 1355 </context-group>
564 </trans-unit> 1356 </trans-unit>
565 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1357 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
566 <source>Videos Trending</source> 1358 <source>Videos Trending</source>
567 <target>Populaire video's</target> 1359 <target>Populaire video's</target>
568 <context-group name="null"> 1360 <context-group name="null">
569 <context context-type="linenumber">59</context> 1361 <context context-type="linenumber">52</context>
570 </context-group> 1362 </context-group>
571 </trans-unit> 1363 </trans-unit>
572 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1364 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
573 <source>Videos Recently Added</source> 1365 <source>Videos Recently Added</source>
574 <target>Recent toegevoegde video's</target> 1366 <target>Recent toegevoegde video's</target>
575 <context-group name="null"> 1367 <context-group name="null">
576 <context context-type="linenumber">60</context> 1368 <context context-type="linenumber">53</context>
577 </context-group> 1369 </context-group>
578 </trans-unit> 1370 </trans-unit>
579 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1371 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
580 <source>Local videos</source> 1372 <source>Local videos</source>
581 <target>Video's op deze instantie</target> 1373 <target>Video's op deze instantie</target>
582 <context-group name="null"> 1374 <context-group name="null">
583 <context context-type="linenumber">61</context> 1375 <context context-type="linenumber">54</context>
584 </context-group> 1376 </context-group>
585 </trans-unit> 1377 </trans-unit>
586 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1378 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
587 <source>Policy on videos containing sensitive content</source> 1379 <source>Policy on videos containing sensitive content</source>
588 <target>Beleid rond video's met gevoelige inhoud</target> 1380 <target>Beleid rond video's met gevoelige inhoud</target>
589 <context-group name="null"> 1381 <context-group name="null">
590 <context context-type="linenumber">70</context> 1382 <context context-type="linenumber">61</context>
591 </context-group> 1383 </context-group>
592 </trans-unit> 1384 </trans-unit>
593 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1385 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -622,42 +1414,77 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
622 <source>Signup enabled</source> 1414 <source>Signup enabled</source>
623 <target>Registratie mogelijk</target> 1415 <target>Registratie mogelijk</target>
624 <context-group name="null"> 1416 <context-group name="null">
625 <context context-type="linenumber">92</context> 1417 <context context-type="linenumber">84</context>
626 </context-group>
627 </trans-unit>
628 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
629 <source>Signup limit</source>
630 <target>Registratielimiet</target>
631 <context-group name="null">
632 <context context-type="linenumber">101</context>
633 </context-group> 1418 </context-group>
634 </trans-unit> 1419 </trans-unit>
635 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1420 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
636 <source>Administrator</source> 1421 <source>Signup requires email verification</source>
637 <target>Beheerder</target> 1422 <target>E-mailverificatie nodig bij registratie</target>
638 <context-group name="null"> 1423 <context-group name="null">
639 <context context-type="linenumber">123</context> 1424 <context context-type="linenumber">91</context>
640 </context-group> 1425 </context-group>
641 </trans-unit> 1426 </trans-unit>
642 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1427 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
643 <source>Admin email</source> 1428 <source>Signup limit</source>
644 <target>E-mail van beheerder</target> 1429 <target>Registratielimiet</target>
645 <context-group name="null"> 1430 <context-group name="null">
646 <context context-type="linenumber">126</context> 1431 <context context-type="linenumber">96</context>
647 </context-group> 1432 </context-group>
648 </trans-unit> 1433 </trans-unit>
649 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 1434 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
650 <source>Users</source> 1435 <source>Users</source>
651 <target>Gebruikers</target> 1436 <target>Gebruikers</target>
652 <context-group name="null"> 1437 <context-group name="null">
653 <context context-type="linenumber">136</context> 1438 <context context-type="linenumber">105</context>
654 </context-group> 1439 </context-group>
655 </trans-unit> 1440 </trans-unit>
656 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 1441 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
657 <source>User default video quota</source> 1442 <source>User default video quota</source>
658 <target>Standaard video-quotum voor gebruikers</target> 1443 <target>Standaard video-quotum voor gebruikers</target>
659 <context-group name="null"> 1444 <context-group name="null">
660 <context context-type="linenumber">139</context> 1445 <context context-type="linenumber">109</context>
1446 </context-group>
1447 </trans-unit>
1448 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1449 <source>User default daily upload limit</source>
1450 <target>Standaard dagelijks video-quotum voor gebruikers</target>
1451 <context-group name="null">
1452 <context context-type="linenumber">121</context>
1453 </context-group>
1454 </trans-unit>
1455 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1456 <source>Import</source>
1457 <target>Importeren</target>
1458 <context-group name="null">
1459 <context context-type="linenumber">42</context>
1460 </context-group>
1461 </trans-unit>
1462 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1463 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1464 <target>Video-import met HTTP URL (d.w.z. YouTube) ingeschakeld</target>
1465 <context-group name="null">
1466 <context context-type="linenumber">141</context>
1467 </context-group>
1468 </trans-unit>
1469 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1470 <source>Video import with a torrent file or a magnet URI enabled</source>
1471 <target>Video-import met een torrentbestand of een magnet URL ingeschakeld</target>
1472 <context-group name="null">
1473 <context context-type="linenumber">148</context>
1474 </context-group>
1475 </trans-unit>
1476 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1477 <source>Administrator</source>
1478 <target>Administrator</target>
1479 <context-group name="null">
1480 <context context-type="linenumber">155</context>
1481 </context-group>
1482 </trans-unit>
1483 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1484 <source>Admin email</source>
1485 <target>E-mail van administrator</target>
1486 <context-group name="null">
1487 <context context-type="linenumber">158</context>
661 </context-group> 1488 </context-group>
662 </trans-unit> 1489 </trans-unit>
663 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1490 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -671,112 +1498,155 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
671 <source>Twitter</source> 1498 <source>Twitter</source>
672 <target>Twitter</target> 1499 <target>Twitter</target>
673 <context-group name="null"> 1500 <context-group name="null">
674 <context context-type="linenumber">170</context> 1501 <context context-type="linenumber">178</context>
675 </context-group> 1502 </context-group>
676 </trans-unit> 1503 </trans-unit>
677 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1504 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
678 <source>Your Twitter username</source> 1505 <source>Your Twitter username</source>
679 <target>Je Twitter-gebruikersnaam</target> 1506 <target>Je Twitter-gebruikersnaam</target>
680 <context-group name="null"> 1507 <context-group name="null">
681 <context context-type="linenumber">173</context> 1508 <context context-type="linenumber">184</context>
682 </context-group> 1509 </context-group>
683 </trans-unit> 1510 </trans-unit>
684 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1511 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
685 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1512 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
686 <target>Geeft het Twitter-account aan voor de website of het platform waarop de inhoud gepubliceerd werd.</target> 1513 <target>Geeft het Twitter-account aan voor de website of het platform waarop de inhoud gepubliceerd werd.</target>
687 <context-group name="null"> 1514 <context-group name="null">
688 <context context-type="linenumber">176</context> 1515 <context context-type="linenumber">187</context>
689 </context-group> 1516 </context-group>
690 </trans-unit> 1517 </trans-unit>
691 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1518 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
692 <source>Instance whitelisted by Twitter</source> 1519 <source>Instance whitelisted by Twitter</source>
693 <target>Instantie ge-whitelist door Twitter</target> 1520 <target>Instantie gewhitelist door Twitter</target>
694 <context-group name="null"> 1521 <context-group name="null">
695 <context context-type="linenumber">189</context> 1522 <context context-type="linenumber">199</context>
696 </context-group> 1523 </context-group>
697 </trans-unit> 1524 </trans-unit>
698 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1525 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
699 <source>Services</source> 1526 <source>Services</source>
700 <target>Diensten</target> 1527 <target>Diensten</target>
701 <context-group name="null"> 1528 <context-group name="null">
702 <context context-type="linenumber">168</context> 1529 <context context-type="linenumber">176</context>
703 </context-group> 1530 </context-group>
704 </trans-unit> 1531 </trans-unit>
705 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1532 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
706 <source>Transcoding</source> 1533 <source>Transcoding</source>
707 <target>Transcoding</target> 1534 <target>Transcoding</target>
708 <context-group name="null"> 1535 <context-group name="null">
709 <context context-type="linenumber">200</context> 1536 <context context-type="linenumber">215</context>
710 </context-group> 1537 </context-group>
711 </trans-unit> 1538 </trans-unit>
712 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1539 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
713 <source>Transcoding enabled</source> 1540 <source>Transcoding enabled</source>
714 <target>Transcoding ingeschakeld</target> 1541 <target>Transcoding ingeschakeld</target>
715 <context-group name="null"> 1542 <context-group name="null">
716 <context context-type="linenumber">204</context> 1543 <context context-type="linenumber">221</context>
717 </context-group> 1544 </context-group>
718 </trans-unit> 1545 </trans-unit>
719 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1546 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
720 <source>If you disable transcoding, many videos from your users will not work!</source> 1547 <source>If you disable transcoding, many videos from your users will not work!</source>
721 <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet overal werken!</target> 1548 <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet werken!</target>
722 <context-group name="null"> 1549 <context-group name="null">
723 <context context-type="linenumber">205</context> 1550 <context context-type="linenumber">222</context>
724 </context-group> 1551 </context-group>
725 </trans-unit> 1552 </trans-unit>
726 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1553 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
727 <source>Transcoding threads</source> 1554 <source>Transcoding threads</source>
728 <target>Threads gebruikt voor transcoding</target> 1555 <target>Threads gebruikt voor transcoding</target>
729 <context-group name="null"> 1556 <context-group name="null">
730 <context context-type="linenumber">211</context> 1557 <context context-type="linenumber">237</context>
1558 </context-group>
1559 </trans-unit>
1560 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1561 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1562 <target>Resolutie <x id="INTERPOLATION" equiv-text="{{resolution}}"/> ingeschakeld</target>
1563 <context-group name="null">
1564 <context context-type="linenumber">252</context>
1565 </context-group>
1566 </trans-unit>
1567 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1568 <source>
1569 Cache
1570
1571 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1572 </source>
1573 <target>
1574Cache
1575
1576 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/></target>
1577 <context-group name="null">
1578 <context context-type="linenumber">260</context>
1579 </context-group>
1580 </trans-unit>
1581 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1582 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1583 <target>Sommige bestanden zijn niet federaal (voorbeelden, ondertitelingen). We verkrijgen ze direct van hun afkomstige instantie en cachen ze.</target>
1584 <context-group name="null">
1585 <context context-type="linenumber">265</context>
731 </context-group> 1586 </context-group>
732 </trans-unit> 1587 </trans-unit>
733 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1588 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
734 <source>Previews cache size</source> 1589 <source>Previews cache size</source>
735 <target>Cachegrootte voor previews</target> 1590 <target>Cachegrootte voor previews</target>
736 <context-group name="null"> 1591 <context-group name="null">
737 <context context-type="linenumber">243</context> 1592 <context context-type="linenumber">271</context>
1593 </context-group>
1594 </trans-unit>
1595 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1596 <source>Video captions cache size</source>
1597 <target>Cachegrootte van video-ondertiteling</target>
1598 <context-group name="null">
1599 <context context-type="linenumber">280</context>
738 </context-group> 1600 </context-group>
739 </trans-unit> 1601 </trans-unit>
740 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1602 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
741 <source>Customizations</source> 1603 <source>Customizations</source>
742 <target>Aanpassingen</target> 1604 <target>Aanpassingen</target>
743 <context-group name="null"> 1605 <context-group name="null">
744 <context context-type="linenumber">264</context> 1606 <context context-type="linenumber">289</context>
745 </context-group> 1607 </context-group>
746 </trans-unit> 1608 </trans-unit>
747 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1609 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
748 <source>JavaScript</source> 1610 <source>JavaScript</source>
749 <target>JavaScript</target> 1611 <target>JavaScript</target>
750 <context-group name="null"> 1612 <context-group name="null">
751 <context context-type="linenumber">267</context> 1613 <context context-type="linenumber">294</context>
752 </context-group> 1614 </context-group>
753 </trans-unit> 1615 </trans-unit>
754 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1616 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
755 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1617 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
756 <target>Schrijf JavaScriptcode.&lt;br /&gt;Voorbeeld: &lt;pre&gt;console.log('mijn instantie is fantastisch');&lt;/pre&gt;</target> 1618 <target>Schrijf direct JavaScriptcode.&lt;br /&gt;Bijvoorbeeld: &lt;pre&gt;console.log('mijn instantie is fantastisch');&lt;/pre&gt;</target>
757 <context-group name="null"> 1619 <context-group name="null">
758 <context context-type="linenumber">270</context> 1620 <context context-type="linenumber">297</context>
759 </context-group> 1621 </context-group>
760 </trans-unit> 1622 </trans-unit>
761 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1623 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
762 <source>Advanced configuration</source> 1624 <source>Advanced configuration</source>
763 <target>Geavanceerde configuratie</target> 1625 <target>Geavanceerde configuratie</target>
764 <context-group name="null"> 1626 <context-group name="null">
765 <context context-type="linenumber">197</context> 1627 <context context-type="linenumber">212</context>
766 </context-group> 1628 </context-group>
767 </trans-unit> 1629 </trans-unit>
768 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1630 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
769 <source>Update configuration</source> 1631 <source>Update configuration</source>
770 <target>Updateconfiguratie</target> 1632 <target>Bijwerkingsconfiguratie</target>
1633 <context-group name="null">
1634 <context context-type="linenumber">340</context>
1635 </context-group>
1636 </trans-unit>
1637 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1638 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1639 <target>Het lijkt erop dat de configuratie invalide is. Zoek alstublieft potentiële foutmeldingen op in andere tabbladen.</target>
771 <context-group name="null"> 1640 <context-group name="null">
772 <context context-type="linenumber">314</context> 1641 <context context-type="linenumber">341</context>
773 </context-group> 1642 </context-group>
774 </trans-unit> 1643 </trans-unit>
775 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1644 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
776 <source> 1645 <source>
777 Users 1646 Users
778 </source> 1647 </source>
779 <target>Gebruikers</target> 1648 <target>
1649Gebruikers</target>
780 <context-group name="null"> 1650 <context-group name="null">
781 <context context-type="linenumber">3</context> 1651 <context context-type="linenumber">3</context>
782 </context-group> 1652 </context-group>
@@ -785,16 +1655,28 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
785 <source> 1655 <source>
786 Manage follows 1656 Manage follows
787 </source> 1657 </source>
788 <target>Volgers beheren</target> 1658 <target>
1659Volgers beheren</target>
789 <context-group name="null"> 1660 <context-group name="null">
790 <context context-type="linenumber">7</context> 1661 <context context-type="linenumber">7</context>
791 </context-group> 1662 </context-group>
792 </trans-unit> 1663 </trans-unit>
1664 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
1665 <source>
1666 Moderation
1667 </source>
1668 <target>
1669Moderatie</target>
1670 <context-group name="null">
1671 <context context-type="linenumber">11</context>
1672 </context-group>
1673 </trans-unit>
793 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 1674 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
794 <source> 1675 <source>
795 Jobs 1676 Jobs
796 </source> 1677 </source>
797 <target>Jobs</target> 1678 <target>
1679Banen</target>
798 <context-group name="null"> 1680 <context-group name="null">
799 <context context-type="linenumber">15</context> 1681 <context context-type="linenumber">15</context>
800 </context-group> 1682 </context-group>
@@ -803,7 +1685,8 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
803 <source> 1685 <source>
804 Configuration 1686 Configuration
805 </source> 1687 </source>
806 <target>Configuratie</target> 1688 <target>
1689Configuratie</target>
807 <context-group name="null"> 1690 <context-group name="null">
808 <context context-type="linenumber">19</context> 1691 <context context-type="linenumber">19</context>
809 </context-group> 1692 </context-group>
@@ -819,18 +1702,26 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
819 <source> 1702 <source>
820 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers. 1703 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers.
821 </source> 1704 </source>
822 <target>Het ziet ernaar uit dat je op een server bent zonder HTTPS. Op je webserver moet TLS geactiveerd zijn om servers te kunnen volgen.</target> 1705 <target>
1706Het ziet ernaar uit dat je op een server bent zonder HTTPS. Op je webserver moet TLS geactiveerd zijn om servers te kunnen volgen.</target>
823 <context-group name="null"> 1707 <context-group name="null">
824 <context context-type="linenumber">17</context> 1708 <context context-type="linenumber">17</context>
825 </context-group> 1709 </context-group>
826 </trans-unit> 1710 </trans-unit>
827 <trans-unit id="456c6383d8e7cd15aadbcdc196d4ae7a70092437"> 1711 <trans-unit id="456c6383d8e7cd15aadbcdc196d4ae7a70092437">
828 <source>Add following</source> 1712 <source>Add following</source>
829 <target>Abonneren</target> 1713 <target>Voeg volgend toe</target>
830 <context-group name="null"> 1714 <context-group name="null">
831 <context context-type="linenumber">21</context> 1715 <context context-type="linenumber">21</context>
832 </context-group> 1716 </context-group>
833 </trans-unit> 1717 </trans-unit>
1718 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1719 <source>Filter...</source>
1720 <target>Filtreren...</target>
1721 <context-group name="null">
1722 <context context-type="linenumber">27</context>
1723 </context-group>
1724 </trans-unit>
834 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1725 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
835 <source>ID</source> 1726 <source>ID</source>
836 <target>ID</target> 1727 <target>ID</target>
@@ -842,14 +1733,14 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
842 <source>Score</source> 1733 <source>Score</source>
843 <target>Score</target> 1734 <target>Score</target>
844 <context-group name="null"> 1735 <context-group name="null">
845 <context context-type="linenumber">8</context> 1736 <context context-type="linenumber">17</context>
846 </context-group> 1737 </context-group>
847 </trans-unit> 1738 </trans-unit>
848 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1739 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
849 <source>Host</source> 1740 <source>Host</source>
850 <target>Host</target> 1741 <target>Host</target>
851 <context-group name="null"> 1742 <context-group name="null">
852 <context context-type="linenumber">8</context> 1743 <context context-type="linenumber">19</context>
853 </context-group> 1744 </context-group>
854 </trans-unit> 1745 </trans-unit>
855 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1746 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -866,6 +1757,27 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
866 <context context-type="linenumber">11</context> 1757 <context context-type="linenumber">11</context>
867 </context-group> 1758 </context-group>
868 </trans-unit> 1759 </trans-unit>
1760 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1761 <source>Accepted</source>
1762 <target>Geaccepteerd</target>
1763 <context-group name="null">
1764 <context context-type="linenumber">32</context>
1765 </context-group>
1766 </trans-unit>
1767 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1768 <source>Pending</source>
1769 <target>In behandeling</target>
1770 <context-group name="null">
1771 <context context-type="linenumber">33</context>
1772 </context-group>
1773 </trans-unit>
1774 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1775 <source>Redundancy allowed</source>
1776 <target>Overtolligheid toegelaten</target>
1777 <context-group name="null">
1778 <context context-type="linenumber">22</context>
1779 </context-group>
1780 </trans-unit>
869 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1781 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
870 <source>Manage follows</source> 1782 <source>Manage follows</source>
871 <target>Abonnementen beheren</target> 1783 <target>Abonnementen beheren</target>
@@ -873,9 +1785,30 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
873 <context context-type="linenumber">2</context> 1785 <context context-type="linenumber">2</context>
874 </context-group> 1786 </context-group>
875 </trans-unit> 1787 </trans-unit>
1788 <trans-unit id="f995df052a1dfc675c2a21926420a707d9601936">
1789 <source>Following</source>
1790 <target>Volgend</target>
1791 <context-group name="null">
1792 <context context-type="linenumber">5</context>
1793 </context-group>
1794 </trans-unit>
1795 <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246">
1796 <source>Follow</source>
1797 <target>Volg</target>
1798 <context-group name="null">
1799 <context context-type="linenumber">7</context>
1800 </context-group>
1801 </trans-unit>
1802 <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e">
1803 <source>Followers</source>
1804 <target>Volgers</target>
1805 <context-group name="null">
1806 <context context-type="linenumber">9</context>
1807 </context-group>
1808 </trans-unit>
876 <trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f"> 1809 <trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f">
877 <source>Jobs list</source> 1810 <source>Jobs list</source>
878 <target>Lijst van jobs</target> 1811 <target>Banenlijst</target>
879 <context-group name="null"> 1812 <context-group name="null">
880 <context context-type="linenumber">2</context> 1813 <context context-type="linenumber">2</context>
881 </context-group> 1814 </context-group>
@@ -887,6 +1820,20 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
887 <context context-type="linenumber">19</context> 1820 <context context-type="linenumber">19</context>
888 </context-group> 1821 </context-group>
889 </trans-unit> 1822 </trans-unit>
1823 <trans-unit id="74c8f69ec23f41a429e241126ab4d25b9d12348e">
1824 <source>Processed on</source>
1825 <target>Behandeld op</target>
1826 <context-group name="null">
1827 <context context-type="linenumber">22</context>
1828 </context-group>
1829 </trans-unit>
1830 <trans-unit id="4fa08915c99629d38c9da8a08b1985a7f4e38e40">
1831 <source>Finished on</source>
1832 <target>Voltooid op</target>
1833 <context-group name="null">
1834 <context context-type="linenumber">23</context>
1835 </context-group>
1836 </trans-unit>
890 <trans-unit id="31cf824034489eb42f6a388d5980b98b8e1de015"> 1837 <trans-unit id="31cf824034489eb42f6a388d5980b98b8e1de015">
891 <source>Create user</source> 1838 <source>Create user</source>
892 <target>Gebruiker aanmaken</target> 1839 <target>Gebruiker aanmaken</target>
@@ -910,7 +1857,7 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
910 </trans-unit> 1857 </trans-unit>
911 <trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05"> 1858 <trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05">
912 <source>mail@example.com</source> 1859 <source>mail@example.com</source>
913 <target>mail@example.org</target> 1860 <target>mail@voorbeeld.org</target>
914 <context-group name="null"> 1861 <context-group name="null">
915 <context context-type="linenumber">21</context> 1862 <context context-type="linenumber">21</context>
916 </context-group> 1863 </context-group>
@@ -919,7 +1866,7 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
919 <source>Role</source> 1866 <source>Role</source>
920 <target>Rol</target> 1867 <target>Rol</target>
921 <context-group name="null"> 1868 <context-group name="null">
922 <context context-type="linenumber">20</context> 1869 <context context-type="linenumber">43</context>
923 </context-group> 1870 </context-group>
924 </trans-unit> 1871 </trans-unit>
925 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1872 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -935,6 +1882,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
935 <context context-type="linenumber">65</context> 1882 <context context-type="linenumber">65</context>
936 </context-group> 1883 </context-group>
937 </trans-unit> 1884 </trans-unit>
1885 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
1886 <source>Daily video quota</source>
1887 <target>Dagelijks videoquotum</target>
1888 <context-group name="null">
1889 <context context-type="linenumber">72</context>
1890 </context-group>
1891 </trans-unit>
938 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1892 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
939 <source>Users list</source> 1893 <source>Users list</source>
940 <target>Gebruikerslijst</target> 1894 <target>Gebruikerslijst</target>
@@ -942,13 +1896,79 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
942 <context context-type="linenumber">2</context> 1896 <context context-type="linenumber">2</context>
943 </context-group> 1897 </context-group>
944 </trans-unit> 1898 </trans-unit>
1899 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1900 <source>Batch actions</source>
1901 <target>Batchacties</target>
1902 <context-group name="null">
1903 <context context-type="linenumber">19</context>
1904 </context-group>
1905 </trans-unit>
945 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1906 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
946 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1907 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
947 <target>Gebruikersnaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1908 <target>Gebruikersnaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
948 <context-group name="null"> 1909 <context-group name="null">
1910 <context context-type="linenumber">40</context>
1911 </context-group>
1912 </trans-unit>
1913 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1914 <source>(banned)</source>
1915 <target>(verbannen)</target>
1916 <context-group name="null">
1917 <context context-type="linenumber">65</context>
1918 </context-group>
1919 </trans-unit>
1920 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1921 <source>Go to the account page</source>
1922 <target>Ga naar accountpagina</target>
1923 <context-group name="null">
1924 <context context-type="linenumber">133</context>
1925 </context-group>
1926 </trans-unit>
1927 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1928 <source>User's email must be verified to login</source>
1929 <target>Gebruiker's e-mail moet geverifieerd zijn om in te loggen</target>
1930 <context-group name="null">
1931 <context context-type="linenumber">72</context>
1932 </context-group>
1933 </trans-unit>
1934 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1935 <source>User's email is verified / User can login without email verification</source>
1936 <target>Gebruiker's e-mail is geverifieerd / Gebruiker kan inloggen zonder e-mailverificatie</target>
1937 <context-group name="null">
1938 <context context-type="linenumber">76</context>
1939 </context-group>
1940 </trans-unit>
1941 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1942 <source>Ban reason:</source>
1943 <target>Reden van verbanning:</target>
1944 <context-group name="null">
1945 <context context-type="linenumber">95</context>
1946 </context-group>
1947 </trans-unit>
1948 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
1949 <source>Moderation comment</source>
1950 <target>Beheerdersopmerking</target>
1951 <context-group name="null">
1952 <context context-type="linenumber">3</context>
1953 </context-group>
1954 </trans-unit>
1955 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
1956 <source>
1957 This comment can only be seen by you or the other moderators.
1958 </source>
1959 <target>
1960Deze opmerking kan alleen door jou en andere beheerders gezien worden.</target>
1961 <context-group name="null">
949 <context context-type="linenumber">17</context> 1962 <context context-type="linenumber">17</context>
950 </context-group> 1963 </context-group>
951 </trans-unit> 1964 </trans-unit>
1965 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
1966 <source>Update this comment</source>
1967 <target>Werk deze comment bij</target>
1968 <context-group name="null">
1969 <context context-type="linenumber">25</context>
1970 </context-group>
1971 </trans-unit>
952 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1972 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
953 <source>Reporter</source> 1973 <source>Reporter</source>
954 <target>Melder</target> 1974 <target>Melder</target>
@@ -963,6 +1983,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
963 <context context-type="linenumber">14</context> 1983 <context context-type="linenumber">14</context>
964 </context-group> 1984 </context-group>
965 </trans-unit> 1985 </trans-unit>
1986 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
1987 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1988 <target>Status <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1989 <context-group name="null">
1990 <context context-type="linenumber">11</context>
1991 </context-group>
1992 </trans-unit>
966 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7"> 1993 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
967 <source>Go to the account</source> 1994 <source>Go to the account</source>
968 <target>Naar account gaan</target> 1995 <target>Naar account gaan</target>
@@ -977,6 +2004,69 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
977 <context context-type="linenumber">33</context> 2004 <context context-type="linenumber">33</context>
978 </context-group> 2005 </context-group>
979 </trans-unit> 2006 </trans-unit>
2007 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2008 <source>Actions</source>
2009 <target>Acties</target>
2010 <context-group name="null">
2011 <context context-type="linenumber">35</context>
2012 </context-group>
2013 </trans-unit>
2014 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
2015 <source>Reason:</source>
2016 <target>Reden:</target>
2017 <context-group name="null">
2018 <context context-type="linenumber">53</context>
2019 </context-group>
2020 </trans-unit>
2021 <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
2022 <source>Moderation comment:</source>
2023 <target>Beheerderopmerking:</target>
2024 <context-group name="null">
2025 <context context-type="linenumber">57</context>
2026 </context-group>
2027 </trans-unit>
2028 <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
2029 <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2030 <target>Videonaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2031 <context-group name="null">
2032 <context context-type="linenumber">8</context>
2033 </context-group>
2034 </trans-unit>
2035 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
2036 <source>Sensitive</source>
2037 <target>Gevoelig</target>
2038 <context-group name="null">
2039 <context context-type="linenumber">9</context>
2040 </context-group>
2041 </trans-unit>
2042 <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
2043 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2044 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2045 <context-group name="null">
2046 <context context-type="linenumber">11</context>
2047 </context-group>
2048 </trans-unit>
2049 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2050 <source>Blacklist reason:</source>
2051 <target>Reden voor de zwarte lijst:</target>
2052 <context-group name="null">
2053 <context context-type="linenumber">43</context>
2054 </context-group>
2055 </trans-unit>
2056 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
2057 <source>Moderation</source>
2058 <target>Beheer</target>
2059 <context-group name="null">
2060 <context context-type="linenumber">2</context>
2061 </context-group>
2062 </trans-unit>
2063 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
2064 <source>Video abuses</source>
2065 <target>Videomisbruik</target>
2066 <context-group name="null">
2067 <context context-type="linenumber">5</context>
2068 </context-group>
2069 </trans-unit>
980 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2070 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
981 <source>Blacklisted videos</source> 2071 <source>Blacklisted videos</source>
982 <target>Video's op zwarte lijst</target> 2072 <target>Video's op zwarte lijst</target>
@@ -984,18 +2074,39 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
984 <context context-type="linenumber">7</context> 2074 <context context-type="linenumber">7</context>
985 </context-group> 2075 </context-group>
986 </trans-unit> 2076 </trans-unit>
987 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2077 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
988 <source>My settings</source> 2078 <source>Muted accounts</source>
989 <target>Mijn instellingen</target> 2079 <target>Gedempte accounts</target>
990 <context-group name="null"> 2080 <context-group name="null">
991 <context context-type="linenumber">3</context> 2081 <context context-type="linenumber">2</context>
992 </context-group> 2082 </context-group>
993 </trans-unit> 2083 </trans-unit>
994 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2084 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
995 <source>My videos</source> 2085 <source>Muted servers</source>
996 <target>Mijn video's</target> 2086 <target>Gedempte servers</target>
997 <context-group name="null"> 2087 <context-group name="null">
998 <context context-type="linenumber">14</context> 2088 <context context-type="linenumber">11</context>
2089 </context-group>
2090 </trans-unit>
2091 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2092 <source>Account</source>
2093 <target>Account</target>
2094 <context-group name="null">
2095 <context context-type="linenumber">12</context>
2096 </context-group>
2097 </trans-unit>
2098 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2099 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2100 <target>Gedempt bij <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2101 <context-group name="null">
2102 <context context-type="linenumber">13</context>
2103 </context-group>
2104 </trans-unit>
2105 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2106 <source>Unmute</source>
2107 <target>Demping opheffen</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">23</context>
999 </context-group> 2110 </context-group>
1000 </trans-unit> 2111 </trans-unit>
1001 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2112 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1009,28 +2120,67 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1009 <source>Profile</source> 2120 <source>Profile</source>
1010 <target>Profiel</target> 2121 <target>Profiel</target>
1011 <context-group name="null"> 2122 <context-group name="null">
1012 <context context-type="linenumber">8</context> 2123 <context context-type="linenumber">7</context>
1013 </context-group> 2124 </context-group>
1014 </trans-unit> 2125 </trans-unit>
1015 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2126 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1016 <source>Video settings</source> 2127 <source>Video settings</source>
1017 <target>Video-instellingen</target> 2128 <target>Video-instellingen</target>
1018 <context-group name="null"> 2129 <context-group name="null">
1019 <context context-type="linenumber">15</context> 2130 <context context-type="linenumber">16</context>
2131 </context-group>
2132 </trans-unit>
2133 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2134 <source>Danger zone</source>
2135 <target>Gevarenzone</target>
2136 <context-group name="null">
2137 <context context-type="linenumber">19</context>
2138 </context-group>
2139 </trans-unit>
2140 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
2141 <source>Change ownership</source>
2142 <target>Verander eigenaar</target>
2143 <context-group name="null">
2144 <context context-type="linenumber">46</context>
2145 </context-group>
2146 </trans-unit>
2147 <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
2148 <source>Select the next owner</source>
2149 <target>Selecteer de volgende eigenaar</target>
2150 <context-group name="null">
2151 <context context-type="linenumber">9</context>
2152 </context-group>
2153 </trans-unit>
2154 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
2155 <source>
2156 Cancel
2157 </source>
2158 <target>
2159Annuleren</target>
2160 <context-group name="null">
2161 <context context-type="linenumber">35</context>
1020 </context-group> 2162 </context-group>
1021 </trans-unit> 2163 </trans-unit>
1022 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2164 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1023 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2165 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1024 <target>Video’s <x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> aantal keer bekeken</target> 2166 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
1025 <context-group name="null"> 2167 <context-group name="null">
1026 <context context-type="linenumber">19</context> 2168 <context context-type="linenumber">19</context>
1027 </context-group> 2169 </context-group>
1028 </trans-unit> 2170 </trans-unit>
2171 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
2172 <source>Blacklisted</source>
2173 <target>Op de zwarte lijst</target>
2174 <context-group name="null">
2175 <context context-type="linenumber">22</context>
2176 </context-group>
2177 </trans-unit>
1029 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 2178 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
1030 <source> 2179 <source>
1031 Cancel 2180 Cancel
1032 </source> 2181 </source>
1033 <target>Annuleren</target> 2182 <target>
2183Annuleren</target>
1034 <context-group name="null"> 2184 <context-group name="null">
1035 <context context-type="linenumber">30</context> 2185 <context context-type="linenumber">30</context>
1036 </context-group> 2186 </context-group>
@@ -1056,6 +2206,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1056 <context context-type="linenumber">6</context> 2206 <context context-type="linenumber">6</context>
1057 </context-group> 2207 </context-group>
1058 </trans-unit> 2208 </trans-unit>
2209 <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
2210 <source>Example: my_channel</source>
2211 <target>Bijvoorbeeld: mijn_kanaal</target>
2212 <context-group name="null">
2213 <context context-type="linenumber">15</context>
2214 </context-group>
2215 </trans-unit>
1059 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9"> 2216 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
1060 <source>Display name</source> 2217 <source>Display name</source>
1061 <target>Weergavenaam</target> 2218 <target>Weergavenaam</target>
@@ -1066,12 +2223,26 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1066 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a"> 2223 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a">
1067 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt; 2224 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt;
1068When you will upload a video in this channel, the video support field will be automatically filled by this text.</source> 2225When you will upload a video in this channel, the video support field will be automatically filled by this text.</source>
1069 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschap…).&lt;br/&gt;&lt;br/&gt; 2226 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatform…).&lt;br /&gt;&lt;br /&gt;
1070Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target> 2227Als je een video uploadt op dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target>
1071 <context-group name="null"> 2228 <context-group name="null">
1072 <context context-type="linenumber">52</context> 2229 <context context-type="linenumber">52</context>
1073 </context-group> 2230 </context-group>
1074 </trans-unit> 2231 </trans-unit>
2232 <trans-unit id="38baeb215c17af9d9e295e371a57f4a48ab4c191">
2233 <source>Target</source>
2234 <target>Doelwit</target>
2235 <context-group name="null">
2236 <context context-type="linenumber">8</context>
2237 </context-group>
2238 </trans-unit>
2239 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2240 <source>You don't have any subscriptions yet.</source>
2241 <target>Je hebt nog geen abonnementen.</target>
2242 <context-group name="null">
2243 <context context-type="linenumber">1</context>
2244 </context-group>
2245 </trans-unit>
1075 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2246 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
1076 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2247 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
1077 <target>Gemaakt door <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2248 <target>Gemaakt door <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -1086,6 +2257,75 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1086 <context context-type="linenumber">16</context> 2257 <context context-type="linenumber">16</context>
1087 </context-group> 2258 </context-group>
1088 </trans-unit> 2259 </trans-unit>
2260 <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
2261 <source>Accept ownership</source>
2262 <target>Accepteer eigenaar</target>
2263 <context-group name="null">
2264 <context context-type="linenumber">3</context>
2265 </context-group>
2266 </trans-unit>
2267 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
2268 <source>Select the target channel</source>
2269 <target>Selecteer het doelwitkanaal</target>
2270 <context-group name="null">
2271 <context context-type="linenumber">9</context>
2272 </context-group>
2273 </trans-unit>
2274 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2275 <source>Initiator</source>
2276 <target>Initiatiefnemer</target>
2277 <context-group name="null">
2278 <context context-type="linenumber">13</context>
2279 </context-group>
2280 </trans-unit>
2281 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2282 <source>
2283 Created
2284 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2285 </source>
2286 <target>
2287 Gecreëerd op
2288 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2289 </target>
2290 <context-group name="null">
2291 <context context-type="linenumber">15</context>
2292 </context-group>
2293 </trans-unit>
2294 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
2295 <source>Status</source>
2296 <target>Status</target>
2297 <context-group name="null">
2298 <context context-type="linenumber">19</context>
2299 </context-group>
2300 </trans-unit>
2301 <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
2302 <source>Action</source>
2303 <target>Actie</target>
2304 <context-group name="null">
2305 <context context-type="linenumber">20</context>
2306 </context-group>
2307 </trans-unit>
2308 <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
2309 <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
2310 <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
2311 <context-group name="null">
2312 <context context-type="linenumber">39</context>
2313 </context-group>
2314 </trans-unit>
2315 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2316 <source>Refuse</source>
2317 <target>Weigeren</target>
2318 <context-group name="null">
2319 <context context-type="linenumber">47</context>
2320 </context-group>
2321 </trans-unit>
2322 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2323 <source>Muted instances</source>
2324 <target>Gedempte instanties</target>
2325 <context-group name="null">
2326 <context context-type="linenumber">2</context>
2327 </context-group>
2328 </trans-unit>
1089 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2329 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
1090 <source>Change password</source> 2330 <source>Change password</source>
1091 <target>Wachtwoord veranderen</target> 2331 <target>Wachtwoord veranderen</target>
@@ -1093,6 +2333,13 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1093 <context context-type="linenumber">30</context> 2333 <context context-type="linenumber">30</context>
1094 </context-group> 2334 </context-group>
1095 </trans-unit> 2335 </trans-unit>
2336 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2337 <source>Current password</source>
2338 <target>Huidige wachtwoord</target>
2339 <context-group name="null">
2340 <context context-type="linenumber">7</context>
2341 </context-group>
2342 </trans-unit>
1096 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2343 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
1097 <source>New password</source> 2344 <source>New password</source>
1098 <target>Nieuw wachtwoord</target> 2345 <target>Nieuw wachtwoord</target>
@@ -1114,26 +2361,48 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1114 <context context-type="linenumber">3</context> 2361 <context context-type="linenumber">3</context>
1115 </context-group> 2362 </context-group>
1116 </trans-unit> 2363 </trans-unit>
2364 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2365 <source>Use WebTorrent to exchange parts of the video with others</source>
2366 <target>Gebruik WebTorrent om delen van de video over te maken naar anderen</target>
2367 <context-group name="null">
2368 <context context-type="linenumber">21</context>
2369 </context-group>
2370 </trans-unit>
1117 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2371 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
1118 <source>Automatically plays video</source> 2372 <source>Automatically plays video</source>
2373 <target>Video automatisch afspelen</target>
1119 <context-group name="null"> 2374 <context-group name="null">
1120 <context context-type="linenumber">20</context> 2375 <context context-type="linenumber">28</context>
1121 </context-group> 2376 </context-group>
1122 </trans-unit> 2377 </trans-unit>
1123 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2378 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1124 <source>Save</source> 2379 <source>Save</source>
1125 <target>Opslaan</target> 2380 <target>Opslaan</target>
1126 <context-group name="null"> 2381 <context-group name="null">
1127 <context context-type="linenumber">23</context> 2382 <context context-type="linenumber">32</context>
1128 </context-group> 2383 </context-group>
1129 </trans-unit> 2384 </trans-unit>
1130 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2385 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
1131 <source>Update my profile</source> 2386 <source>Update my profile</source>
1132 <target>Update mijn profiel</target> 2387 <target>Werk mijn profiel bij</target>
1133 <context-group name="null"> 2388 <context-group name="null">
1134 <context context-type="linenumber">27</context> 2389 <context context-type="linenumber">27</context>
1135 </context-group> 2390 </context-group>
1136 </trans-unit> 2391 </trans-unit>
2392 <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
2393 <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
2394 <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> abonnees</target>
2395 <context-group name="null">
2396 <context context-type="linenumber">10</context>
2397 </context-group>
2398 </trans-unit>
2399 <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5">
2400 <source>Change the avatar</source>
2401 <target>Verander de avatar</target>
2402 <context-group name="null">
2403 <context context-type="linenumber">15</context>
2404 </context-group>
2405 </trans-unit>
1137 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9"> 2406 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
1138 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source> 2407 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
1139 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximale grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target> 2408 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximale grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
@@ -1141,15 +2410,84 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1141 <context context-type="linenumber">18</context> 2410 <context context-type="linenumber">18</context>
1142 </context-group> 2411 </context-group>
1143 </trans-unit> 2412 </trans-unit>
2413 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2414 <source>Once you delete your account, there is no going back. Please be certain.</source>
2415 <target>Als je je account verwijdert, kan je niet meer terug.
2416Wees alstublieft zeker.</target>
2417 <context-group name="null">
2418 <context context-type="linenumber">2</context>
2419 </context-group>
2420 </trans-unit>
2421 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2422 <source>Delete your account</source>
2423 <target>Verwijder jouw account</target>
2424 <context-group name="null">
2425 <context context-type="linenumber">4</context>
2426 </context-group>
2427 </trans-unit>
1144 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2428 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
1145 <source> 2429 <source>
1146 Sorry, but we couldn't find the page you were looking for. 2430 Sorry, but we couldn't find the page you were looking for.
1147</source> 2431</source>
1148 <target>Sorry, maar die pagina kon niet gevonden worden.</target> 2432 <target>
2433Sorry, maar die pagina kon niet gevonden worden.
2434</target>
1149 <context-group name="null"> 2435 <context-group name="null">
1150 <context context-type="linenumber">1</context> 2436 <context context-type="linenumber">1</context>
1151 </context-group> 2437 </context-group>
1152 </trans-unit> 2438 </trans-unit>
2439 <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
2440 <source>
2441 Verify account email confirmation
2442 </source>
2443 <target>
2444Verifieer e-mailbevestiging van account</target>
2445 <context-group name="null">
2446 <context context-type="linenumber">2</context>
2447 </context-group>
2448 </trans-unit>
2449 <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
2450 <source>
2451 Your email has been verified and you may now login. Redirecting...
2452 </source>
2453 <target>
2454Jouw e-mail is geverifieerd en je mag nu inloggen.
2455Je wordt doorverwezen...</target>
2456 <context-group name="null">
2457 <context context-type="linenumber">6</context>
2458 </context-group>
2459 </trans-unit>
2460 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
2461 <source>An error occurred. </source>
2462 <target>Er is een probleem opgetreden.</target>
2463 <context-group name="null">
2464 <context context-type="linenumber">11</context>
2465 </context-group>
2466 </trans-unit>
2467 <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
2468 <source>
2469 Request email for account verification
2470 </source>
2471 <target>
2472Vraag e-mail voor accountverificatie aan</target>
2473 <context-group name="null">
2474 <context context-type="linenumber">2</context>
2475 </context-group>
2476 </trans-unit>
2477 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
2478 <source>Send verification email</source>
2479 <target>Verzend e-mail voor verificatie</target>
2480 <context-group name="null">
2481 <context context-type="linenumber">17</context>
2482 </context-group>
2483 </trans-unit>
2484 <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
2485 <source>This instance does not require email verification.</source>
2486 <target>Deze instantie heeft geen verificatie door e-mail nodig.</target>
2487 <context-group name="null">
2488 <context context-type="linenumber">20</context>
2489 </context-group>
2490 </trans-unit>
1153 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8"> 2491 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
1154 <source>Support this channel</source> 2492 <source>Support this channel</source>
1155 <target>Ondersteun dit kanaal</target> 2493 <target>Ondersteun dit kanaal</target>
@@ -1164,6 +2502,20 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1164 <context context-type="linenumber">17</context> 2502 <context context-type="linenumber">17</context>
1165 </context-group> 2503 </context-group>
1166 </trans-unit> 2504 </trans-unit>
2505 <trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6">
2506 <source>URL</source>
2507 <target>URL</target>
2508 <context-group name="null">
2509 <context context-type="linenumber">17</context>
2510 </context-group>
2511 </trans-unit>
2512 <trans-unit id="bfe7f34fbd4c3afa5f84a5580e0fae942cad2333">
2513 <source>You can import any URL &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;supported by youtube-dl&lt;/a&gt; or URL that points to a raw MP4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source>
2514 <target>Je kan elke URL importeren &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;ondersteunt door youtube-dl&lt;/a&gt; of elke URL die naar een rauw MP4 bestand wijst. Je moet zeker weten dat je de diffusierechten hebt over de inhoud waar het naar wijst, anders kan het wettelijke problemen aan jou of je instantie geven.</target>
2515 <context-group name="null">
2516 <context context-type="linenumber">9</context>
2517 </context-group>
2518 </trans-unit>
1167 <trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071"> 2519 <trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071">
1168 <source>Channel</source> 2520 <source>Channel</source>
1169 <target>Kanaal</target> 2521 <target>Kanaal</target>
@@ -1173,11 +2525,37 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1173 </trans-unit> 2525 </trans-unit>
1174 <trans-unit id="3c78b53bca33467190c0b7a01320bc093a2b1427"> 2526 <trans-unit id="3c78b53bca33467190c0b7a01320bc093a2b1427">
1175 <source>Privacy</source> 2527 <source>Privacy</source>
1176 <target>Zichtbaarheid</target> 2528 <target>Privacy</target>
1177 <context-group name="null"> 2529 <context-group name="null">
1178 <context context-type="linenumber">159</context> 2530 <context context-type="linenumber">159</context>
1179 </context-group> 2531 </context-group>
1180 </trans-unit> 2532 </trans-unit>
2533 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2534 <source>Sorry, but something went wrong</source>
2535 <target>Sorry, er is iets fout gegaan</target>
2536 <context-group name="null">
2537 <context context-type="linenumber">49</context>
2538 </context-group>
2539 </trans-unit>
2540 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2541 <source>
2542 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
2543</source>
2544 <target>
2545Gefeliciteerd, de video achter<x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> zal worden geimporteerd! Je kan nu al informatie over deze video toevoegen.
2546
2547</target>
2548 <context-group name="null">
2549 <context context-type="linenumber">46</context>
2550 </context-group>
2551 </trans-unit>
2552 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
2553 <source>Update</source>
2554 <target>Bijwerken</target>
2555 <context-group name="null">
2556 <context context-type="linenumber">92</context>
2557 </context-group>
2558 </trans-unit>
1181 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9"> 2559 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9">
1182 <source>Select the file to upload</source> 2560 <source>Select the file to upload</source>
1183 <target>Selecteer het bestand om te uploaden</target> 2561 <target>Selecteer het bestand om te uploaden</target>
@@ -1185,18 +2563,132 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1185 <context context-type="linenumber">6</context> 2563 <context context-type="linenumber">6</context>
1186 </context-group> 2564 </context-group>
1187 </trans-unit> 2565 </trans-unit>
2566 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2567 <source>Scheduled</source>
2568 <target>Ingeroosterd</target>
2569 <context-group name="null">
2570 <context context-type="linenumber">25</context>
2571 </context-group>
2572 </trans-unit>
1188 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2573 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
1189 <source>Publish will be available when upload is finished</source> 2574 <source>Publish will be available when upload is finished</source>
1190 <target>Publiceren is mogelijk wanneer de upload voltooid is</target> 2575 <target>Publiceren is mogelijk wanneer de upload voltooid is</target>
1191 <context-group name="null"> 2576 <context-group name="null">
1192 <context context-type="linenumber">48</context> 2577 <context context-type="linenumber">58</context>
1193 </context-group> 2578 </context-group>
1194 </trans-unit> 2579 </trans-unit>
1195 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2580 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1196 <source>Publish</source> 2581 <source>Publish</source>
1197 <target>Publiceren</target> 2582 <target>Publiceren</target>
1198 <context-group name="null"> 2583 <context-group name="null">
1199 <context context-type="linenumber">55</context> 2584 <context context-type="linenumber">65</context>
2585 </context-group>
2586 </trans-unit>
2587 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
2588 <source>Select the torrent to import</source>
2589 <target>Selecteer de torrent om te importeren</target>
2590 <context-group name="null">
2591 <context context-type="linenumber">6</context>
2592 </context-group>
2593 </trans-unit>
2594 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2595 <source>Or</source>
2596 <target>Of</target>
2597 <context-group name="null">
2598 <context context-type="linenumber">11</context>
2599 </context-group>
2600 </trans-unit>
2601 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2602 <source>Paste magnet URI</source>
2603 <target>Plak magnet URL</target>
2604 <context-group name="null">
2605 <context context-type="linenumber">14</context>
2606 </context-group>
2607 </trans-unit>
2608 <trans-unit id="1ce18c12c809a738f05f2290f46df0677f27ed70">
2609 <source>You can import any torrent file that points to a mp4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source>
2610 <target>Je kan elk torrentbestand importeren die wijst naar een mp4 bestand. Je moet zeker weten dat je de diffusierechten over de inhoud waar het naar wijst hebt, anders kan het wettelijke problemen aan jezelf en je instantie geven.</target>
2611 <context-group name="null">
2612 <context context-type="linenumber">17</context>
2613 </context-group>
2614 </trans-unit>
2615 <trans-unit id="7cb3731472edd9edf6a6d036498c2c8388157266">
2616 <source>
2617 Congratulations, the video will be imported with BitTorrent! You can already add information about this video.
2618</source>
2619 <target>
2620Gefeliciteerd, de video zal geimporteerd worden met BitTorrent!
2621Je kan nu al informatie toevoegen over deze video.
2622
2623</target>
2624 <context-group name="null">
2625 <context context-type="linenumber">53</context>
2626 </context-group>
2627 </trans-unit>
2628 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
2629 <source>Import <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
2630 <target>Importeer <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></target>
2631 <context-group name="null">
2632 <context context-type="linenumber">3</context>
2633 </context-group>
2634 </trans-unit>
2635 <trans-unit id="e9cfe8bd050660077212af5c02f5be24821f28d5">
2636 <source>Upload <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
2637 <target><x id="INTERPOLATION" equiv-text="{{ videoName }}"/> Uploaden</target>
2638 <context-group name="null">
2639 <context context-type="linenumber">4</context>
2640 </context-group>
2641 </trans-unit>
2642 <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3">
2643 <source>Upload a file</source>
2644 <target>Upload een bestand</target>
2645 <context-group name="null">
2646 <context context-type="linenumber">10</context>
2647 </context-group>
2648 </trans-unit>
2649 <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470">
2650 <source>Import with URL</source>
2651 <target>Importeer met URL</target>
2652 <context-group name="null">
2653 <context context-type="linenumber">17</context>
2654 </context-group>
2655 </trans-unit>
2656 <trans-unit id="752c401d7dcd708944eef60e411187f71d882340">
2657 <source>Import with torrent</source>
2658 <target>Importeer met torrent</target>
2659 <context-group name="null">
2660 <context context-type="linenumber">24</context>
2661 </context-group>
2662 </trans-unit>
2663 <trans-unit id="40fa23fe45af4ee2e72cdd3cc6bf6013f180aab0">
2664 <source>Add caption</source>
2665 <target>Voeg ondertiteling toe</target>
2666 <context-group name="null">
2667 <context context-type="linenumber">5</context>
2668 </context-group>
2669 </trans-unit>
2670 <trans-unit id="6bad752cfcac8f3572bdf2c619daec683d56d1a8">
2671 <source>Select the caption file</source>
2672 <target>Selecteer het ondertitelingsbestand</target>
2673 <context-group name="null">
2674 <context context-type="linenumber">24</context>
2675 </context-group>
2676 </trans-unit>
2677 <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
2678 <source>
2679 This will replace an existing caption!
2680 </source>
2681 <target>
2682Dit zal een bestaande ondertiteling vervangen!</target>
2683 <context-group name="null">
2684 <context context-type="linenumber">29</context>
2685 </context-group>
2686 </trans-unit>
2687 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
2688 <source>Add this caption</source>
2689 <target>Voeg deze ondertiteling toe</target>
2690 <context-group name="null">
2691 <context context-type="linenumber">40</context>
1200 </context-group> 2692 </context-group>
1201 </trans-unit> 2693 </trans-unit>
1202 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 2694 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -1213,16 +2705,37 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1213 <context context-type="linenumber">191</context> 2705 <context context-type="linenumber">191</context>
1214 </context-group> 2706 </context-group>
1215 </trans-unit> 2707 </trans-unit>
2708 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2709 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2710 <target>Tags kunnen gebruikt worden om relevante aanraders te suggesteren. &lt;/br&gt;Druk op Enter om een nieuwe tag toe te voegen.</target>
2711 <context-group name="null">
2712 <context context-type="linenumber">18</context>
2713 </context-group>
2714 </trans-unit>
2715 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2716 <source>+ Tag</source>
2717 <target>Tag</target>
2718 <context-group name="null">
2719 <context context-type="linenumber">21</context>
2720 </context-group>
2721 </trans-unit>
2722 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2723 <source>Enter a new tag</source>
2724 <target>Vul een nieuwe tag in</target>
2725 <context-group name="null">
2726 <context context-type="linenumber">21</context>
2727 </context-group>
2728 </trans-unit>
1216 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2729 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
1217 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2730 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
1218 <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven, de kijker kan ze handmatig openvouwen.</target> 2731 <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven en moeten handmatig opengevouwen worden.</target>
1219 <context-group name="null"> 2732 <context-group name="null">
1220 <context context-type="linenumber">28</context> 2733 <context context-type="linenumber">28</context>
1221 </context-group> 2734 </context-group>
1222 </trans-unit> 2735 </trans-unit>
1223 <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5"> 2736 <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5">
1224 <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source> 2737 <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source>
1225 <target>Publicatie uitstellen (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target> 2738 <target>Publicatie inroosteren op (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target>
1226 <context-group name="null"> 2739 <context-group name="null">
1227 <context context-type="linenumber">105</context> 2740 <context context-type="linenumber">105</context>
1228 </context-group> 2741 </context-group>
@@ -1243,7 +2756,7 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1243 </trans-unit> 2756 </trans-unit>
1244 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a"> 2757 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
1245 <source>Enable video comments</source> 2758 <source>Enable video comments</source>
1246 <target>Videoreacties toelaten</target> 2759 <target>Videoreacties inschakelen</target>
1247 <context-group name="null"> 2760 <context-group name="null">
1248 <context context-type="linenumber">125</context> 2761 <context context-type="linenumber">125</context>
1249 </context-group> 2762 </context-group>
@@ -1252,7 +2765,14 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1252 <source>Wait transcoding before publishing the video</source> 2765 <source>Wait transcoding before publishing the video</source>
1253 <target>Wacht tot het transcoderen voltooid is om de video te publiceren</target> 2766 <target>Wacht tot het transcoderen voltooid is om de video te publiceren</target>
1254 <context-group name="null"> 2767 <context-group name="null">
1255 <context context-type="linenumber">130</context> 2768 <context context-type="linenumber">131</context>
2769 </context-group>
2770 </trans-unit>
2771 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2772 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2773 <target>Als je beslist om niet te wachten totdat de transcoding compleet is voordat je de video publiceert, kan de video onspeelbaar zijn totdat de transcoding eindigt.</target>
2774 <context-group name="null">
2775 <context context-type="linenumber">132</context>
1256 </context-group> 2776 </context-group>
1257 </trans-unit> 2777 </trans-unit>
1258 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2778 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1262,18 +2782,84 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1262 <context context-type="linenumber">4</context> 2782 <context context-type="linenumber">4</context>
1263 </context-group> 2783 </context-group>
1264 </trans-unit> 2784 </trans-unit>
2785 <trans-unit id="92bcfd1d237a2bfe48dc9f46d074ed26abc8df22">
2786 <source>Add another caption</source>
2787 <target>Voeg nog een ondertiteling toe</target>
2788 <context-group name="null">
2789 <context context-type="linenumber">147</context>
2790 </context-group>
2791 </trans-unit>
2792 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2793 <source>See the subtitle file</source>
2794 <target>Zie het ondertitelingsbestand</target>
2795 <context-group name="null">
2796 <context context-type="linenumber">156</context>
2797 </context-group>
2798 </trans-unit>
2799 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2800 <source>Already uploaded ✔</source>
2801 <target>Al geupload ✔</target>
2802 <context-group name="null">
2803 <context context-type="linenumber">160</context>
2804 </context-group>
2805 </trans-unit>
2806 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2807 <source>Will be created on update</source>
2808 <target>Wordt gecreëerd bij bijwerking</target>
2809 <context-group name="null">
2810 <context context-type="linenumber">168</context>
2811 </context-group>
2812 </trans-unit>
2813 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2814 <source>Cancel create</source>
2815 <target>Annuleer creatie</target>
2816 <context-group name="null">
2817 <context context-type="linenumber">170</context>
2818 </context-group>
2819 </trans-unit>
2820 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2821 <source>Will be deleted on update</source>
2822 <target>Wordt verwijdert bij bijwerking</target>
2823 <context-group name="null">
2824 <context context-type="linenumber">176</context>
2825 </context-group>
2826 </trans-unit>
2827 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2828 <source>Cancel deletion</source>
2829 <target>Annuleer verwijdering</target>
2830 <context-group name="null">
2831 <context context-type="linenumber">178</context>
2832 </context-group>
2833 </trans-unit>
2834 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
2835 <source>
2836 No captions for now.
2837 </source>
2838 <target>
2839Geen ondertiteling voor nu.</target>
2840 <context-group name="null">
2841 <context context-type="linenumber">183</context>
2842 </context-group>
2843 </trans-unit>
2844 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2845 <source>Captions</source>
2846 <target>Ondertiteling</target>
2847 <context-group name="null">
2848 <context context-type="linenumber">140</context>
2849 </context-group>
2850 </trans-unit>
1265 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2851 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
1266 <source>Upload thumbnail</source> 2852 <source>Upload thumbnail</source>
1267 <target>Thumbnail uploaden</target> 2853 <target>Thumbnail uploaden</target>
1268 <context-group name="null"> 2854 <context-group name="null">
1269 <context context-type="linenumber">195</context> 2855 <context context-type="linenumber">196</context>
1270 </context-group> 2856 </context-group>
1271 </trans-unit> 2857 </trans-unit>
1272 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2858 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1273 <source>Upload preview</source> 2859 <source>Upload preview</source>
1274 <target>Voorvertoning uploaden</target> 2860 <target>Voorvertoning uploaden</target>
1275 <context-group name="null"> 2861 <context-group name="null">
1276 <context context-type="linenumber">202</context> 2862 <context context-type="linenumber">203</context>
1277 </context-group> 2863 </context-group>
1278 </trans-unit> 2864 </trans-unit>
1279 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2865 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1285,26 +2871,238 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1285 </trans-unit> 2871 </trans-unit>
1286 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0"> 2872 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
1287 <source>Short text to tell people how they can support you (membership platform...).</source> 2873 <source>Short text to tell people how they can support you (membership platform...).</source>
1288 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (bv. door gelddonaties).</target> 2874 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatforms...).</target>
1289 <context-group name="null"> 2875 <context-group name="null">
1290 <context context-type="linenumber">209</context> 2876 <context context-type="linenumber">210</context>
1291 </context-group> 2877 </context-group>
1292 </trans-unit> 2878 </trans-unit>
1293 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2879 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1294 <source>Advanced settings</source> 2880 <source>Advanced settings</source>
1295 <target>Geavanceerde instellingen</target> 2881 <target>Geavanceerde instellingen</target>
1296 <context-group name="null"> 2882 <context-group name="null">
1297 <context context-type="linenumber">190</context> 2883 <context context-type="linenumber">191</context>
1298 </context-group> 2884 </context-group>
1299 </trans-unit> 2885 </trans-unit>
1300 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2886 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
1301 <source> 2887 <source>
1302 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> 2888 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/>
1303 </source> 2889 </source>
2890 <target>
2891<x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> updaten</target>
1304 <context-group name="null"> 2892 <context-group name="null">
1305 <context context-type="linenumber">2</context> 2893 <context context-type="linenumber">2</context>
1306 </context-group> 2894 </context-group>
1307 </trans-unit> 2895 </trans-unit>
2896 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
2897 <source>Download video</source>
2898 <target>Download video</target>
2899 <context-group name="null">
2900 <context context-type="linenumber">3</context>
2901 </context-group>
2902 </trans-unit>
2903 <trans-unit id="8d6a41c2703bed3edfc76e1df0b1ca203404c17c">
2904 <source>Direct download</source>
2905 <target>Directe download</target>
2906 <context-group name="null">
2907 <context context-type="linenumber">27</context>
2908 </context-group>
2909 </trans-unit>
2910 <trans-unit id="ac3a02ecd20f41278f1ef7c03f45c1117b4b796d">
2911 <source>Torrent (.torrent file)</source>
2912 <target>Torrent (.torrent bestand)</target>
2913 <context-group name="null">
2914 <context context-type="linenumber">32</context>
2915 </context-group>
2916 </trans-unit>
2917 <trans-unit id="2db8d7cf6a3071f4c1519ef2b5e2713d9ff4e87f">
2918 <source>Torrent (magnet link)</source>
2919 <target>Torrent (magnet link)</target>
2920 <context-group name="null">
2921 <context context-type="linenumber">37</context>
2922 </context-group>
2923 </trans-unit>
2924 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
2925 <source>
2926 Cancel
2927 </source>
2928 <target>
2929Annuleren</target>
2930 <context-group name="null">
2931 <context context-type="linenumber">47</context>
2932 </context-group>
2933 </trans-unit>
2934 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
2935 <source>Download</source>
2936 <target>Downloaden</target>
2937 <context-group name="null">
2938 <context context-type="linenumber">84</context>
2939 </context-group>
2940 </trans-unit>
2941 <trans-unit id="11749f4fc0aa1b5e37f38575e4d4e3b1b7e0e96b">
2942 <source>Report video</source>
2943 <target>Rapporteer video</target>
2944 <context-group name="null">
2945 <context context-type="linenumber">3</context>
2946 </context-group>
2947 </trans-unit>
2948 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2949 <source>Share</source>
2950 <target>Deel</target>
2951 <context-group name="null">
2952 <context context-type="linenumber">74</context>
2953 </context-group>
2954 </trans-unit>
2955 <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f">
2956 <source>QR-Code</source>
2957 <target>QR-Code</target>
2958 <context-group name="null">
2959 <context context-type="linenumber">29</context>
2960 </context-group>
2961 </trans-unit>
2962 <trans-unit id="d3b15c3bf4a7ea38d6002d2d2c4781642d30e79c">
2963 <source>Embed</source>
2964 <target>Inbedden</target>
2965 <context-group name="null">
2966 <context context-type="linenumber">34</context>
2967 </context-group>
2968 </trans-unit>
2969 <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
2970 <source>
2971 The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
2972 </source>
2973 <target>
2974Deze url is niet beveiligd (geen HTTPS), dus de ingebedde video werkt niet op HTTPS websites (web browsers blokkeren onbeveiligde HTTP verzoeken op HTTPS websites).</target>
2975 <context-group name="null">
2976 <context context-type="linenumber">45</context>
2977 </context-group>
2978 </trans-unit>
2979 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
2980 <source>Close</source>
2981 <target>Sluiten</target>
2982 <context-group name="null">
2983 <context context-type="linenumber">51</context>
2984 </context-group>
2985 </trans-unit>
2986 <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
2987 <source>Blacklist video</source>
2988 <target>Video op de zwarte lijst zetten</target>
2989 <context-group name="null">
2990 <context context-type="linenumber">3</context>
2991 </context-group>
2992 </trans-unit>
2993 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
2994 <source>
2995 The video is being imported, it will be available when the import is finished.
2996 </source>
2997 <target>
2998De video wordt geimporteerd, hij zal beschikbaar worden wanneer de import klaar is.</target>
2999 <context-group name="null">
3000 <context context-type="linenumber">11</context>
3001 </context-group>
3002 </trans-unit>
3003 <trans-unit id="9ed65ae88f6c982bc44d6fed2796e55f47dbf304">
3004 <source>
3005 The video is being transcoded, it may not work properly.
3006 </source>
3007 <target>
3008De video wordt getranscode, hij kan misschien niet naar behoren werken.</target>
3009 <context-group name="null">
3010 <context context-type="linenumber">15</context>
3011 </context-group>
3012 </trans-unit>
3013 <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
3014 <source>
3015 This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3016 </source>
3017 <target>
3018Deze video wordt gepubliceerd op <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.</target>
3019 <context-group name="null">
3020 <context context-type="linenumber">19</context>
3021 </context-group>
3022 </trans-unit>
3023 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
3024 <source>This video is blacklisted.</source>
3025 <target>Deze video staat op de zwarte lijst.</target>
3026 <context-group name="null">
3027 <context context-type="linenumber">24</context>
3028 </context-group>
3029 </trans-unit>
3030 <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
3031 <source>
3032 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3033 </source>
3034 <target>
3035Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
3036 <context-group name="null">
3037 <context context-type="linenumber">37</context>
3038 </context-group>
3039 </trans-unit>
3040 <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
3041 <source>
3042 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3043 </source>
3044 <target>
3045Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
3046 <context-group name="null">
3047 <context context-type="linenumber">46</context>
3048 </context-group>
3049 </trans-unit>
3050 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
3051 <source>Like this video</source>
3052 <target>Like deze video</target>
3053 <context-group name="null">
3054 <context context-type="linenumber">57</context>
3055 </context-group>
3056 </trans-unit>
3057 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
3058 <source>Dislike this video</source>
3059 <target>Dislike deze video</target>
3060 <context-group name="null">
3061 <context context-type="linenumber">64</context>
3062 </context-group>
3063 </trans-unit>
3064 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
3065 <source>Download the video</source>
3066 <target>Download de video</target>
3067 <context-group name="null">
3068 <context context-type="linenumber">83</context>
3069 </context-group>
3070 </trans-unit>
3071 <trans-unit id="f72992030f134408b675152c397f9d0ec00f3b2a">
3072 <source>Report</source>
3073 <target>Rapporteer</target>
3074 <context-group name="null">
3075 <context context-type="linenumber">88</context>
3076 </context-group>
3077 </trans-unit>
3078 <trans-unit id="2f4894617d9c44010f87473e583bd4604b7d6ecf">
3079 <source>Report this video</source>
3080 <target>Rapporteer deze video</target>
3081 <context-group name="null">
3082 <context context-type="linenumber">87</context>
3083 </context-group>
3084 </trans-unit>
3085 <trans-unit id="cd27f761b923a5bdb16ba9844da632edd878f1b1">
3086 <source>Update this video</source>
3087 <target>Werk deze video bij</target>
3088 <context-group name="null">
3089 <context context-type="linenumber">91</context>
3090 </context-group>
3091 </trans-unit>
3092 <trans-unit id="007ab5fa2aae8a7372307d3fc45a2dbcb11ffd61">
3093 <source>Blacklist</source>
3094 <target>Zet op de zwarte lijst</target>
3095 <context-group name="null">
3096 <context context-type="linenumber">96</context>
3097 </context-group>
3098 </trans-unit>
3099 <trans-unit id="803c6317abd2dbafcc93226c4e273c62932e3037">
3100 <source>Blacklist this video</source>
3101 <target>Zet deze video op de zwarte lijst</target>
3102 <context-group name="null">
3103 <context context-type="linenumber">95</context>
3104 </context-group>
3105 </trans-unit>
1308 <trans-unit id="86f26b106c67be3c2e98b82766656e5d9da86dff"> 3106 <trans-unit id="86f26b106c67be3c2e98b82766656e5d9da86dff">
1309 <source>Unblacklist</source> 3107 <source>Unblacklist</source>
1310 <target>Van zwarte lijst halen</target> 3108 <target>Van zwarte lijst halen</target>
@@ -1312,6 +3110,764 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1312 <context context-type="linenumber">100</context> 3110 <context context-type="linenumber">100</context>
1313 </context-group> 3111 </context-group>
1314 </trans-unit> 3112 </trans-unit>
3113 <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
3114 <source>Unblacklist this video</source>
3115 <target>Haal deze video van de zwarte lijst</target>
3116 <context-group name="null">
3117 <context context-type="linenumber">99</context>
3118 </context-group>
3119 </trans-unit>
3120 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
3121 <source>Delete this video</source>
3122 <target>Verwijder deze video</target>
3123 <context-group name="null">
3124 <context context-type="linenumber">103</context>
3125 </context-group>
3126 </trans-unit>
3127 <trans-unit id="5cb397241041f7ad70997806227bafcdf7eb1b33">
3128 <source>Go the channel page</source>
3129 <target>Ga naar kanaalpagina</target>
3130 <context-group name="null">
3131 <context context-type="linenumber">123</context>
3132 </context-group>
3133 </trans-unit>
3134 <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
3135 <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
3136 <target>Door <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
3137 <context-group name="null">
3138 <context context-type="linenumber">134</context>
3139 </context-group>
3140 </trans-unit>
3141 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3142 <source>Show more</source>
3143 <target>Laat meer zien</target>
3144 <context-group name="null">
3145 <context context-type="linenumber">146</context>
3146 </context-group>
3147 </trans-unit>
3148 <trans-unit id="5403a767248e304199592271bba3366d2ca3f903">
3149 <source>Show less</source>
3150 <target>Laat minder zien</target>
3151 <context-group name="null">
3152 <context context-type="linenumber">152</context>
3153 </context-group>
3154 </trans-unit>
3155 <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
3156 <source>Friendly Reminder: </source>
3157 <target>Vriendelijke Herinnering:</target>
3158 <context-group name="null">
3159 <context context-type="linenumber">208</context>
3160 </context-group>
3161 </trans-unit>
3162 <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
3163 <source>
3164 the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
3165 </source>
3166 <target>
3167 Uit het deelsysteem gebruikt voor deze video blijkt het dat sommige technische informatie over jouw systeem (zoals een openbaar IP adres) verstuurd kan worden naar andere peers.
3168 </target>
3169 <context-group name="null">
3170 <context context-type="linenumber">209</context>
3171 </context-group>
3172 </trans-unit>
3173 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
3174 <source>More information</source>
3175 <target>Meer informatie</target>
3176 <context-group name="null">
3177 <context context-type="linenumber">212</context>
3178 </context-group>
3179 </trans-unit>
3180 <trans-unit id="bd499ca7913bb5408fd139a4cb4f863852d5f318">
3181 <source>Get more information</source>
3182 <target>Krijg meer informatie</target>
3183 <context-group name="null">
3184 <context context-type="linenumber">212</context>
3185 </context-group>
3186 </trans-unit>
3187 <trans-unit id="20fc98888baf65b5ba9fe9622dc036fa8dec6a5f">
3188 <source>
3189 OK
3190 </source>
3191 <target>
3192 OK
3193 </target>
3194 <context-group name="null">
3195 <context context-type="linenumber">215</context>
3196 </context-group>
3197 </trans-unit>
3198 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
3199 <source>
3200 Other videos
3201 </source>
3202 <target>
3203 Andere videos
3204 </target>
3205 <context-group name="null">
3206 <context context-type="linenumber">2</context>
3207 </context-group>
3208 </trans-unit>
3209 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
3210 <source>
3211 Comments
3212 </source>
3213 <target>
3214 Reacties
3215 </target>
3216 <context-group name="null">
3217 <context context-type="linenumber">3</context>
3218 </context-group>
3219 </trans-unit>
3220 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3221 <source>No comments.</source>
3222 <target>Geen reacties</target>
3223 <context-group name="null">
3224 <context context-type="linenumber">17</context>
3225 </context-group>
3226 </trans-unit>
3227 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3228 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3229 <target>Laat alle <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> antwoorden zien</target>
3230 <context-group name="null">
3231 <context context-type="linenumber">54</context>
3232 </context-group>
3233 </trans-unit>
3234 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
3235 <source>
3236 Comments are disabled.
3237 </source>
3238 <target>
3239 Reacties zijn uitgeschakeld.
3240 </target>
3241 <context-group name="null">
3242 <context context-type="linenumber">63</context>
3243 </context-group>
3244 </trans-unit>
3245 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
3246 <source>Add comment...</source>
3247 <target>Voeg reactie toe...</target>
3248 <context-group name="null">
3249 <context context-type="linenumber">6</context>
3250 </context-group>
3251 </trans-unit>
3252 <trans-unit id="26fa50ba8e69b53162b348d98e25f8b76c81343e">
3253 <source>
3254 Post comment
3255 </source>
3256 <target>
3257 Post reactie.
3258 </target>
3259 <context-group name="null">
3260 <context context-type="linenumber">20</context>
3261 </context-group>
3262 </trans-unit>
3263 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3264 <source>You are one step away from commenting</source>
3265 <target>Je bent een stap verwijderd van reageren</target>
3266 <context-group name="null">
3267 <context context-type="linenumber">28</context>
3268 </context-group>
3269 </trans-unit>
3270 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3271 <source>
3272 If you have an account on this instance, you can login:
3273 </source>
3274 <target>
3275 Als je een account hebt op deze instantie, kan je inloggen:
3276 </target>
3277 <context-group name="null">
3278 <context context-type="linenumber">32</context>
3279 </context-group>
3280 </trans-unit>
3281 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3282 <source>login to comment</source>
3283 <target>log in om te reageren</target>
3284 <context-group name="null">
3285 <context context-type="linenumber">35</context>
3286 </context-group>
3287 </trans-unit>
3288 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3289 <source>
3290 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3291 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3292 from within the software's interface.
3293 </source>
3294 <target>
3295 Anders kan je reageren door een account te gebruiken op welke ActivityPub-compatibele instatie dan ook.
3296 Op de meeste platforms kan je de video vinden door zijn URL in de zoekbalk te typen en vervolgens het vanuit binnenin de software's interface te reageren.</target>
3297 <context-group name="null">
3298 <context context-type="linenumber">36</context>
3299 </context-group>
3300 </trans-unit>
3301 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3302 <source>
3303 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3304 </source>
3305 <target>
3306Als je een account op Mastodon of Pleroma hebt, kan je het direct openen vanuit hun interface:</target>
3307 <context-group name="null">
3308 <context context-type="linenumber">41</context>
3309 </context-group>
3310 </trans-unit>
3311 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3312 <source>Highlighted comment</source>
3313 <target>Belichte reactie</target>
3314 <context-group name="null">
3315 <context context-type="linenumber">5</context>
3316 </context-group>
3317 </trans-unit>
3318 <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6">
3319 <source>Reply</source>
3320 <target>Antwoord</target>
3321 <context-group name="null">
3322 <context context-type="linenumber">14</context>
3323 </context-group>
3324 </trans-unit>
3325 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3326 <source>No description</source>
3327 <target>Geen beschrijving</target>
3328 <context-group name="null">
3329 <context context-type="linenumber">1</context>
3330 </context-group>
3331 </trans-unit>
3332 <trans-unit id="2f03e577e8f81a9f8be0095f93e1f9376c6eedc9">
3333 <source>Published videos</source>
3334 <target>Gepubliceerde videos</target>
3335 <context-group name="null">
3336 <context context-type="linenumber">1</context>
3337 </context-group>
3338 </trans-unit>
3339 <trans-unit id="369ef5e9c0dd1251abdbf699a5db408bca10777f">
3340 <source>Published <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videos</source>
3341 <target><x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> Videos gepubliceerd</target>
3342 <context-group name="null">
3343 <context context-type="linenumber">1</context>
3344 </context-group>
3345 </trans-unit>
3346 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3347 <source>240p</source>
3348 <target>240p</target>
3349 <context-group name="null">
3350 <context context-type="linenumber">1</context>
3351 </context-group>
3352 </trans-unit>
3353 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3354 <source>360p</source>
3355 <target>360p</target>
3356 <context-group name="null">
3357 <context context-type="linenumber">1</context>
3358 </context-group>
3359 </trans-unit>
3360 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3361 <source>480p</source>
3362 <target>480p</target>
3363 <context-group name="null">
3364 <context context-type="linenumber">1</context>
3365 </context-group>
3366 </trans-unit>
3367 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3368 <source>720p</source>
3369 <target>720p</target>
3370 <context-group name="null">
3371 <context context-type="linenumber">1</context>
3372 </context-group>
3373 </trans-unit>
3374 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3375 <source>1080p</source>
3376 <target>1080p</target>
3377 <context-group name="null">
3378 <context context-type="linenumber">1</context>
3379 </context-group>
3380 </trans-unit>
3381 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3382 <source>Auto (via ffmpeg)</source>
3383 <target>Auto (via ffmpeg)</target>
3384 <context-group name="null">
3385 <context context-type="linenumber">1</context>
3386 </context-group>
3387 </trans-unit>
3388 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3389 <source>Configuration updated.</source>
3390 <target>Configuratie bijgewerkt.</target>
3391 <context-group name="null">
3392 <context context-type="linenumber">1</context>
3393 </context-group>
3394 </trans-unit>
3395 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf">
3396 <source>Unlimited</source>
3397 <target>Oneindig</target>
3398 <context-group name="null">
3399 <context context-type="linenumber">1</context>
3400 </context-group>
3401 </trans-unit>
3402 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3403 <source>100MB</source>
3404 <target>100MB</target>
3405 <context-group name="null">
3406 <context context-type="linenumber">1</context>
3407 </context-group>
3408 </trans-unit>
3409 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3410 <source>500MB</source>
3411 <target>500MB</target>
3412 <context-group name="null">
3413 <context context-type="linenumber">1</context>
3414 </context-group>
3415 </trans-unit>
3416 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3417 <source>1GB</source>
3418 <target>1GB</target>
3419 <context-group name="null">
3420 <context context-type="linenumber">1</context>
3421 </context-group>
3422 </trans-unit>
3423 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3424 <source>5GB</source>
3425 <target>5GB</target>
3426 <context-group name="null">
3427 <context context-type="linenumber">1</context>
3428 </context-group>
3429 </trans-unit>
3430 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3431 <source>20GB</source>
3432 <target>20GB</target>
3433 <context-group name="null">
3434 <context context-type="linenumber">1</context>
3435 </context-group>
3436 </trans-unit>
3437 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3438 <source>50GB</source>
3439 <target>50GB</target>
3440 <context-group name="null">
3441 <context context-type="linenumber">1</context>
3442 </context-group>
3443 </trans-unit>
3444 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3445 <source>10MB</source>
3446 <target>10MB</target>
3447 <context-group name="null">
3448 <context context-type="linenumber">1</context>
3449 </context-group>
3450 </trans-unit>
3451 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3452 <source>50MB</source>
3453 <target>50MB</target>
3454 <context-group name="null">
3455 <context context-type="linenumber">1</context>
3456 </context-group>
3457 </trans-unit>
3458 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3459 <source>2GB</source>
3460 <target>2GB</target>
3461 <context-group name="null">
3462 <context context-type="linenumber">1</context>
3463 </context-group>
3464 </trans-unit>
3465 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3466 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3467 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> is niet valide</target>
3468 <context-group name="null">
3469 <context context-type="linenumber">1</context>
3470 </context-group>
3471 </trans-unit>
3472 <trans-unit id="e02f50674f1d96966384dc096beb42d4973997df">
3473 <source>You need to specify hosts to follow.</source>
3474 <target>Je moet de hosts specificeren om te volgen.</target>
3475 <context-group name="null">
3476 <context context-type="linenumber">1</context>
3477 </context-group>
3478 </trans-unit>
3479 <trans-unit id="c2a114eb000e7c38e8ad4b1768821bdf6e946d71">
3480 <source>Hosts need to be unique.</source>
3481 <target>Hosts moeten uniek zijn.</target>
3482 <context-group name="null">
3483 <context context-type="linenumber">1</context>
3484 </context-group>
3485 </trans-unit>
3486 <trans-unit id="a6718d6aaf5bcd1692eed48daa61d2bed62c1f50">
3487 <source>If you confirm, you will send a follow request to:<x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> - </source>
3488 <target>Als je bevestigd, verzend je een volgverzoek naar:<x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> - </target>
3489 <context-group name="null">
3490 <context context-type="linenumber">1</context>
3491 </context-group>
3492 </trans-unit>
3493 <trans-unit id="1266acb081ef0324c4a38ae2d514dd75d8b38409">
3494 <source>Follow new server(s)</source>
3495 <target>Volg nieuwe server(s)</target>
3496 <context-group name="null">
3497 <context context-type="linenumber">1</context>
3498 </context-group>
3499 </trans-unit>
3500 <trans-unit id="950f5111d567e5c0e971f07c26e8c2be1d919a8e">
3501 <source>Follow request(s) sent!</source>
3502 <target>Volgverzoek(en) verstuurd!</target>
3503 <context-group name="null">
3504 <context context-type="linenumber">1</context>
3505 </context-group>
3506 </trans-unit>
3507 <trans-unit id="5729c34a858c78daa1aa606f62a3665527cf97e6">
3508 <source>Do you really want to unfollow <x id="INTERPOLATION" equiv-text="{{host}}"/>?</source>
3509 <target>Wil je echt <x id="INTERPOLATION" equiv-text="{{host}}"/> onvolgen?</target>
3510 <context-group name="null">
3511 <context context-type="linenumber">1</context>
3512 </context-group>
3513 </trans-unit>
3514 <trans-unit id="a89875525c82ab81ffe32e481a5475b43d0c2902">
3515 <source>Unfollow</source>
3516 <target>Onvolgen</target>
3517 <context-group name="null">
3518 <context context-type="linenumber">1</context>
3519 </context-group>
3520 </trans-unit>
3521 <trans-unit id="fb4e35e2b0ea2abc1f71295a4b34830e57c07bd0">
3522 <source>You are not following <x id="INTERPOLATION" equiv-text="{{host}}"/> anymore.</source>
3523 <target>Je volgt <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer.</target>
3524 <context-group name="null">
3525 <context context-type="linenumber">1</context>
3526 </context-group>
3527 </trans-unit>
3528 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
3529 <source>enabled</source>
3530 <target>ingeschakeld</target>
3531 <context-group name="null">
3532 <context context-type="linenumber">1</context>
3533 </context-group>
3534 </trans-unit>
3535 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
3536 <source>disabled</source>
3537 <target>uitgeschakeld</target>
3538 <context-group name="null">
3539 <context context-type="linenumber">1</context>
3540 </context-group>
3541 </trans-unit>
3542 <trans-unit id="1123807fc813c816404598147173403d00117557">
3543 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
3544 <target>Overtolligheid voor<x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
3545 <context-group name="null">
3546 <context context-type="linenumber">1</context>
3547 </context-group>
3548 </trans-unit>
3549 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3550 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3551 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door jouw instantie.</target>
3552 <context-group name="null">
3553 <context context-type="linenumber">1</context>
3554 </context-group>
3555 </trans-unit>
3556 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3557 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3558 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door jouw instantie.</target>
3559 <context-group name="null">
3560 <context context-type="linenumber">1</context>
3561 </context-group>
3562 </trans-unit>
3563 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3564 <source>Comment updated.</source>
3565 <target>Reactie bijgewerkt.</target>
3566 <context-group name="null">
3567 <context context-type="linenumber">1</context>
3568 </context-group>
3569 </trans-unit>
3570 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3571 <source>Delete this report</source>
3572 <target>Verwijder deze rapportage</target>
3573 <context-group name="null">
3574 <context context-type="linenumber">1</context>
3575 </context-group>
3576 </trans-unit>
3577 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3578 <source>Update moderation comment</source>
3579 <target>Werk beheerder-reactie bij</target>
3580 <context-group name="null">
3581 <context context-type="linenumber">1</context>
3582 </context-group>
3583 </trans-unit>
3584 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
3585 <source>Mark as accepted</source>
3586 <target>Markeer als geaccepteerd</target>
3587 <context-group name="null">
3588 <context context-type="linenumber">1</context>
3589 </context-group>
3590 </trans-unit>
3591 <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
3592 <source>Mark as rejected</source>
3593 <target>Markeer als afgewezen</target>
3594 <context-group name="null">
3595 <context context-type="linenumber">1</context>
3596 </context-group>
3597 </trans-unit>
3598 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3599 <source>Do you really want to delete this abuse report?</source>
3600 <target>Wil je echt dit misbruiksrapportage verwijderen?</target>
3601 <context-group name="null">
3602 <context context-type="linenumber">1</context>
3603 </context-group>
3604 </trans-unit>
3605 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
3606 <source>Abuse deleted.</source>
3607 <target>Misbruik verwijdert.</target>
3608 <context-group name="null">
3609 <context context-type="linenumber">1</context>
3610 </context-group>
3611 </trans-unit>
3612 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
3613 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
3614 <target>Wil je deze video echt verwijderen van je zwarte lijst? Hij zal weer beschikbaar zijn in de videolijst.</target>
3615 <context-group name="null">
3616 <context context-type="linenumber">1</context>
3617 </context-group>
3618 </trans-unit>
3619 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
3620 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
3621 <target>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> verwijdert van de zwarte lijst.</target>
3622 <context-group name="null">
3623 <context context-type="linenumber">1</context>
3624 </context-group>
3625 </trans-unit>
3626 <trans-unit id="364463fab6c5714118d6449561a0f8de1cc10bfa">
3627 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> created.</source>
3628 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
3629 <context-group name="null">
3630 <context context-type="linenumber">1</context>
3631 </context-group>
3632 </trans-unit>
3633 <trans-unit id="964865a3cd90b4af99902f071644a4b2aede4c32">
3634 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> updated.</source>
3635 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> bijgewerkt.</target>
3636 <context-group name="null">
3637 <context context-type="linenumber">1</context>
3638 </context-group>
3639 </trans-unit>
3640 <trans-unit id="9910122dfedd2eaa544a990f1430e5b82a76d99f">
3641 <source>Update user</source>
3642 <target>Werk gebruiker bij</target>
3643 <context-group name="null">
3644 <context context-type="linenumber">1</context>
3645 </context-group>
3646 </trans-unit>
3647 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3648 <source>Unban</source>
3649 <target>Onverban</target>
3650 <context-group name="null">
3651 <context context-type="linenumber">1</context>
3652 </context-group>
3653 </trans-unit>
3654 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3655 <source>Set Email as Verified</source>
3656 <target>Zet E-mail als Geverifieerd</target>
3657 <context-group name="null">
3658 <context context-type="linenumber">1</context>
3659 </context-group>
3660 </trans-unit>
3661 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3662 <source>You cannot ban root.</source>
3663 <target>Je kan root niet verbannen.</target>
3664 <context-group name="null">
3665 <context context-type="linenumber">1</context>
3666 </context-group>
3667 </trans-unit>
3668 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3669 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3670 <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen?</target>
3671 <context-group name="null">
3672 <context context-type="linenumber">1</context>
3673 </context-group>
3674 </trans-unit>
3675 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3676 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3677 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen.</target>
3678 <context-group name="null">
3679 <context context-type="linenumber">1</context>
3680 </context-group>
3681 </trans-unit>
3682 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
3683 <source>You cannot delete root.</source>
3684 <target>Je kan root niet verwijderen.</target>
3685 <context-group name="null">
3686 <context context-type="linenumber">1</context>
3687 </context-group>
3688 </trans-unit>
3689 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3690 <source>If you remove these users, you will not be able to create others with the same username!</source>
3691 <target>Als jij deze gebruikers verwijdert, kan je niet meer anderen maken met dezelfde gebruikersnaam!</target>
3692 <context-group name="null">
3693 <context context-type="linenumber">1</context>
3694 </context-group>
3695 </trans-unit>
3696 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3697 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3698 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verwijdert.</target>
3699 <context-group name="null">
3700 <context context-type="linenumber">1</context>
3701 </context-group>
3702 </trans-unit>
3703 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3704 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3705 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers'' gezet als geverifieerd.</target>
3706 <context-group name="null">
3707 <context context-type="linenumber">1</context>
3708 </context-group>
3709 </trans-unit>
3710 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3711 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3712 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt.</target>
3713 <context-group name="null">
3714 <context context-type="linenumber">1</context>
3715 </context-group>
3716 </trans-unit>
3717 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3718 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3719 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt.</target>
3720 <context-group name="null">
3721 <context context-type="linenumber">1</context>
3722 </context-group>
3723 </trans-unit>
3724 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3725 <source>Ownership accepted</source>
3726 <target>Eigendom geaccepteerd</target>
3727 <context-group name="null">
3728 <context context-type="linenumber">1</context>
3729 </context-group>
3730 </trans-unit>
3731 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
3732 <source>Password updated.</source>
3733 <target>Wachtwoord bijgewerkt.</target>
3734 <context-group name="null">
3735 <context context-type="linenumber">1</context>
3736 </context-group>
3737 </trans-unit>
3738 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3739 <source>You current password is invalid.</source>
3740 <target>Jouw huide wachtwoord is invalide.</target>
3741 <context-group name="null">
3742 <context context-type="linenumber">1</context>
3743 </context-group>
3744 </trans-unit>
3745 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3746 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3747 <target>Weet je zeker dat je jouw account wil verwijderen? Dit verwijdert al jouw data, inclusief kanalen, videos etc.</target>
3748 <context-group name="null">
3749 <context context-type="linenumber">1</context>
3750 </context-group>
3751 </trans-unit>
3752 <trans-unit id="e7d5b2de566e4c807c285daf8d8a78b5f7f33311">
3753 <source>Type your username to confirm</source>
3754 <target>Typ je gebruikersnaam in om te bevestigen</target>
3755 <context-group name="null">
3756 <context context-type="linenumber">1</context>
3757 </context-group>
3758 </trans-unit>
3759 <trans-unit id="d8a8a7f7160939fb55e82bc01fe9f876f5f2e065">
3760 <source>Delete my account</source>
3761 <target>Verwijder mijn account</target>
3762 <context-group name="null">
3763 <context context-type="linenumber">1</context>
3764 </context-group>
3765 </trans-unit>
3766 <trans-unit id="8eb8b1a728159f43c31abf76c28ef3ff6c230af7">
3767 <source>Your account is deleted.</source>
3768 <target>Jouw account is verwijdert.</target>
3769 <context-group name="null">
3770 <context context-type="linenumber">1</context>
3771 </context-group>
3772 </trans-unit>
3773 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3774 <source>Profile updated.</source>
3775 <target>Profiel bijgewerkt.</target>
3776 <context-group name="null">
3777 <context context-type="linenumber">1</context>
3778 </context-group>
3779 </trans-unit>
3780 <trans-unit id="1e003ad599ef836949b9f4dad3037a58ef3ff8d1">
3781 <source>Avatar changed.</source>
3782 <target>Avatar verandert.</target>
3783 <context-group name="null">
3784 <context context-type="linenumber">1</context>
3785 </context-group>
3786 </trans-unit>
3787 <trans-unit id="214b802dfd6f544003147a7a68938ec1055c8f32">
3788 <source>Information updated.</source>
3789 <target>Informatie bijgewerkt.</target>
3790 <context-group name="null">
3791 <context context-type="linenumber">1</context>
3792 </context-group>
3793 </trans-unit>
3794 <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
3795 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
3796 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> gecreëerd.</target>
3797 <context-group name="null">
3798 <context context-type="linenumber">1</context>
3799 </context-group>
3800 </trans-unit>
3801 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3802 <source>This name already exists on this instance.</source>
3803 <target>Deze naam bestaat al op deze instantie.</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3808 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3809 <source>Create</source>
3810 <target>Creeër</target>
3811 <context-group name="null">
3812 <context context-type="linenumber">1</context>
3813 </context-group>
3814 </trans-unit>
3815 <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
3816 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
3817 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bijgewerkt.</target>
3818 <context-group name="null">
3819 <context context-type="linenumber">1</context>
3820 </context-group>
3821 </trans-unit>
3822 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3823 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3824 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> verwijdert.</target>
3825 <context-group name="null">
3826 <context context-type="linenumber">1</context>
3827 </context-group>
3828 </trans-unit>
3829 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3830 <source>My videos</source>
3831 <target>Mijn video's</target>
3832 <context-group name="null">
3833 <context context-type="linenumber">1</context>
3834 </context-group>
3835 </trans-unit>
3836 <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
3837 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
3838 <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijderen?</target>
3839 <context-group name="null">
3840 <context context-type="linenumber">1</context>
3841 </context-group>
3842 </trans-unit>
3843 <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83">
3844 <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source>
3845 <target><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijdert.</target>
3846 <context-group name="null">
3847 <context context-type="linenumber">1</context>
3848 </context-group>
3849 </trans-unit>
3850 <trans-unit id="4ec5852c869b2fb4ae0e564b51278d7be8013fc7">
3851 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoName}}"/>?</source>
3852 <target>Weet jij zeker dat je<x id="INTERPOLATION" equiv-text="{{videoName}}"/> wilt verwijderen?</target>
3853 <context-group name="null">
3854 <context context-type="linenumber">1</context>
3855 </context-group>
3856 </trans-unit>
3857 <trans-unit id="d39a0bfa616a9a8473b2e379eefe17d8ed1af118">
3858 <source>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> deleted.</source>
3859 <target>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> verwijdert.</target>
3860 <context-group name="null">
3861 <context context-type="linenumber">1</context>
3862 </context-group>
3863 </trans-unit>
3864 <trans-unit id="dd9f3264feed4935008861c15d81c947124e4ac3">
3865 <source>Published</source>
3866 <target>Gepubliceerd</target>
3867 <context-group name="null">
3868 <context context-type="linenumber">1</context>
3869 </context-group>
3870 </trans-unit>
1315 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2"> 3871 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2">
1316 <source>Publication scheduled on </source> 3872 <source>Publication scheduled on </source>
1317 <target>Publicatie uitgesteld tot</target> 3873 <target>Publicatie uitgesteld tot</target>
@@ -1319,23 +3875,1699 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1319 <context context-type="linenumber">1</context> 3875 <context context-type="linenumber">1</context>
1320 </context-group> 3876 </context-group>
1321 </trans-unit> 3877 </trans-unit>
3878 <trans-unit id="4a7e91ebe1cf184db5f2bfecf9c16ff81c9e2c02">
3879 <source>Waiting transcoding</source>
3880 <target>Wachten op transcoding</target>
3881 <context-group name="null">
3882 <context context-type="linenumber">1</context>
3883 </context-group>
3884 </trans-unit>
3885 <trans-unit id="21f1c9d5c67346c830aced4f670045fcf0aeb83a">
3886 <source>To transcode</source>
3887 <target>Om te transcoden</target>
3888 <context-group name="null">
3889 <context context-type="linenumber">1</context>
3890 </context-group>
3891 </trans-unit>
3892 <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392">
3893 <source>To import</source>
3894 <target>Om te importeren</target>
3895 <context-group name="null">
3896 <context context-type="linenumber">1</context>
3897 </context-group>
3898 </trans-unit>
3899 <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
3900 <source>Ownership change request sent.</source>
3901 <target>Eigenaarsveranderingsaanvrag gestuurd.</target>
3902 <context-group name="null">
3903 <context context-type="linenumber">1</context>
3904 </context-group>
3905 </trans-unit>
3906 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3907 <source>My library</source>
3908 <target>Mijn bibliotheek</target>
3909 <context-group name="null">
3910 <context context-type="linenumber">1</context>
3911 </context-group>
3912 </trans-unit>
3913 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3914 <source>My channels</source>
3915 <target>Mijn kanalen</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3921 <source>My subscriptions</source>
3922 <target>Mijn abonnementen</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3928 <source>Misc</source>
3929 <target>Varia</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3935 <source>Ownership changes</source>
3936 <target>Veranderingen van eigenaar</target>
3937 <context-group name="null">
3938 <context context-type="linenumber">1</context>
3939 </context-group>
3940 </trans-unit>
3941 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3942 <source>My settings</source>
3943 <target>Mijn instellingen</target>
3944 <context-group name="null">
3945 <context context-type="linenumber">1</context>
3946 </context-group>
3947 </trans-unit>
3948 <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
3949 <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
3950 <target>Een e-mail met verificatielink wordt verstuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
3951 <context-group name="null">
3952 <context context-type="linenumber">1</context>
3953 </context-group>
3954 </trans-unit>
3955 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
3956 <source>Unable to find user id or verification string.</source>
3957 <target>Niet in staat om gebruikersid of verificatiestring te vinden.</target>
3958 <context-group name="null">
3959 <context context-type="linenumber">1</context>
3960 </context-group>
3961 </trans-unit>
3962 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3963 <source>Subscribe to the account</source>
3964 <target>Abonneer op het account</target>
3965 <context-group name="null">
3966 <context context-type="linenumber">1</context>
3967 </context-group>
3968 </trans-unit>
3969 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
3970 <source>Focus the search bar</source>
3971 <target>Focus de zoekbalk</target>
3972 <context-group name="null">
3973 <context context-type="linenumber">1</context>
3974 </context-group>
3975 </trans-unit>
3976 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
3977 <source>Toggle the left menu</source>
3978 <target>Schakel het linker menu aan of uit</target>
3979 <context-group name="null">
3980 <context context-type="linenumber">1</context>
3981 </context-group>
3982 </trans-unit>
3983 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
3984 <source>Go to the videos overview page</source>
3985 <target>Ga naar de video-overzichtspagina</target>
3986 <context-group name="null">
3987 <context context-type="linenumber">1</context>
3988 </context-group>
3989 </trans-unit>
3990 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
3991 <source>Go to the trending videos page</source>
3992 <target>Ga naar de trending videos pagina</target>
3993 <context-group name="null">
3994 <context context-type="linenumber">1</context>
3995 </context-group>
3996 </trans-unit>
3997 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
3998 <source>Go to the recently added videos page</source>
3999 <target>Ga naar recent toegevoegde videos pagina</target>
4000 <context-group name="null">
4001 <context context-type="linenumber">1</context>
4002 </context-group>
4003 </trans-unit>
4004 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4005 <source>Go to the local videos page</source>
4006 <target>Ga naar de locale videos pagina</target>
4007 <context-group name="null">
4008 <context context-type="linenumber">1</context>
4009 </context-group>
4010 </trans-unit>
4011 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4012 <source>Go to the videos upload page</source>
4013 <target>Ga naar de videos uploadpagina</target>
4014 <context-group name="null">
4015 <context context-type="linenumber">1</context>
4016 </context-group>
4017 </trans-unit>
4018 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4019 <source>Toggle Dark theme</source>
4020 <target>Schakel donker thema aan of uit</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4026 <source>Go to my subscriptions</source>
4027 <target>Ga naar mijn abonnementen</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4033 <source>Go to my videos</source>
4034 <target>Ga naar mijn videos</target>
4035 <context-group name="null">
4036 <context context-type="linenumber">1</context>
4037 </context-group>
4038 </trans-unit>
4039 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4040 <source>Go to my imports</source>
4041 <target>Ga naar mijn imports</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4047 <source>Go to my channels</source>
4048 <target>Ga naar mijn kanalen</target>
4049 <context-group name="null">
4050 <context context-type="linenumber">1</context>
4051 </context-group>
4052 </trans-unit>
4053 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
4054 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
4055</source>
4056 <target>Kan niet credenties van OAuth Client verkrijgen: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
4057</target>
4058 <context-group name="null">
4059 <context context-type="linenumber">1</context>
4060 </context-group>
4061 </trans-unit>
4062 <trans-unit id="8d9b4f4b69108c3c9aa0f3b0dbde87786ba9b319">
4063 <source>Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.</source>
4064 <target>Weet zeker dat je correct PeerTube geconfigureerd hebt (config/directory), vooral de "webserver" sectie.</target>
4065 <context-group name="null">
4066 <context context-type="linenumber">1</context>
4067 </context-group>
4068 </trans-unit>
4069 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4070 <source>Error</source>
4071 <target>Fout</target>
4072 <context-group name="null">
4073 <context context-type="linenumber">1</context>
4074 </context-group>
4075 </trans-unit>
4076 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4077 <source>You need to reconnect.</source>
4078 <target>Je moet opnieuw verbinden.</target>
4079 <context-group name="null">
4080 <context context-type="linenumber">1</context>
4081 </context-group>
4082 </trans-unit>
4083 <trans-unit id="68e710782ccb5398b3acb8844caf0b199da2c3da">
4084 <source>Confirm</source>
4085 <target>Bevestigen</target>
4086 <context-group name="null">
4087 <context context-type="linenumber">1</context>
4088 </context-group>
4089 </trans-unit>
4090 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4091 <source>Keyboard Shortcuts:</source>
4092 <target>Keyboard Shortcuts:</target>
4093 <context-group name="null">
4094 <context context-type="linenumber">1</context>
4095 </context-group>
4096 </trans-unit>
4097 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4098 <source>Info</source>
4099 <target>Info</target>
4100 <context-group name="null">
4101 <context context-type="linenumber">1</context>
4102 </context-group>
4103 </trans-unit>
4104 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4105 <source>Success</source>
4106 <target>Success</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
4111 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4112 <source>Incorrect username or password.</source>
4113 <target>Incorrecte gebruikersnaam of wachtwoord.</target>
4114 <context-group name="null">
4115 <context context-type="linenumber">1</context>
4116 </context-group>
4117 </trans-unit>
4118 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
4119 <source>You account is blocked.</source>
4120 <target>Jouw account is geblokkeerd.</target>
4121 <context-group name="null">
4122 <context context-type="linenumber">1</context>
4123 </context-group>
4124 </trans-unit>
4125 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
4126 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
4127 <target>Een e-mail met de wachtwoord reset instructies wordt gestuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
4128 <context-group name="null">
4129 <context context-type="linenumber">1</context>
4130 </context-group>
4131 </trans-unit>
4132 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
4133 <source>Your password has been successfully reset!</source>
4134 <target>Jouw wachtwoord is succesvol gereset!</target>
4135 <context-group name="null">
4136 <context context-type="linenumber">1</context>
4137 </context-group>
4138 </trans-unit>
4139 <trans-unit id="7fb1099e29660162f9154d5b2feee7743a423df6">
4140 <source>Today</source>
4141 <target>Vandaag</target>
4142 <context-group name="null">
4143 <context context-type="linenumber">1</context>
4144 </context-group>
4145 </trans-unit>
4146 <trans-unit id="02e0243b60007368f87dc01e083f232dd025096d">
4147 <source>Last 7 days</source>
4148 <target>Laatste 7 dagen </target>
4149 <context-group name="null">
4150 <context context-type="linenumber">1</context>
4151 </context-group>
4152 </trans-unit>
4153 <trans-unit id="7668986b9f753fcd72ad4a00b1a0c4861d1f7fb8">
4154 <source>Last 30 days</source>
4155 <target>Laatste 30 dagen</target>
4156 <context-group name="null">
4157 <context context-type="linenumber">1</context>
4158 </context-group>
4159 </trans-unit>
4160 <trans-unit id="a77b663fd9b94c38bc9c6493a51b5f3acacb9bca">
4161 <source>Last 365 days</source>
4162 <target>Laatste 365 dagen</target>
4163 <context-group name="null">
4164 <context context-type="linenumber">1</context>
4165 </context-group>
4166 </trans-unit>
4167 <trans-unit id="d2f3bf121699ff08a25fa4859bfdf3996bf821cc">
4168 <source>Short (&lt; 4 min)</source>
4169 <target>Kort (&lt; 4 min)</target>
4170 <context-group name="null">
4171 <context context-type="linenumber">1</context>
4172 </context-group>
4173 </trans-unit>
4174 <trans-unit id="ac0fa1039f09ec0d917303658c5bb1ee813a4225">
4175 <source>Long (&gt; 10 min)</source>
4176 <target>Long (&gt; 10 min)</target>
4177 <context-group name="null">
4178 <context context-type="linenumber">1</context>
4179 </context-group>
4180 </trans-unit>
4181 <trans-unit id="f24d368d6be0fee70fb4503d2ad37a612e1b0889">
4182 <source>Medium (4-10 min)</source>
4183 <target>Middelmatig (4-10 min)</target>
4184 <context-group name="null">
4185 <context context-type="linenumber">1</context>
4186 </context-group>
4187 </trans-unit>
4188 <trans-unit id="ed073fec00d699b7a97bb65b4f3a722b203c5bca">
4189 <source>Relevance</source>
4190 <target>Relevantie</target>
4191 <context-group name="null">
4192 <context context-type="linenumber">1</context>
4193 </context-group>
4194 </trans-unit>
4195 <trans-unit id="1aee80ab35aa99508802cdec6306e110b2feaf9e">
4196 <source>Publish date</source>
4197 <target>Publicatiedatum</target>
4198 <context-group name="null">
4199 <context context-type="linenumber">1</context>
4200 </context-group>
4201 </trans-unit>
4202 <trans-unit id="b7641aed03492978b4ec6843b1e53f30464294d9">
4203 <source>Views</source>
4204 <target>Weergaven</target>
4205 <context-group name="null">
4206 <context context-type="linenumber">1</context>
4207 </context-group>
4208 </trans-unit>
4209 <trans-unit id="7e892ba15f2c6c17e83510e273b3e10fc32ea016">
4210 <source>Search</source>
4211 <target>Zoeken</target>
4212 <context-group name="null">
4213 <context context-type="linenumber">1</context>
4214 </context-group>
4215 </trans-unit>
4216 <trans-unit id="b67c8e57904c67c4566610363b7f82c748d04323">
4217 <source>Instance name is required.</source>
4218 <target>Instantienaam is vereist.</target>
4219 <context-group name="null">
4220 <context context-type="linenumber">1</context>
4221 </context-group>
4222 </trans-unit>
4223 <trans-unit id="10a248adb1ee12830355a04ac3cde2bad2d41d7d">
4224 <source>Short description should not be longer than 250 characters.</source>
4225 <target>Korte beschrijvingen moeten niet langer zijn dan 250 karakters.</target>
4226 <context-group name="null">
4227 <context context-type="linenumber">1</context>
4228 </context-group>
4229 </trans-unit>
4230 <trans-unit id="356e63270712273da168072ec0fc78a969919bf1">
4231 <source>Twitter username is required.</source>
4232 <target>Twitter gebruikersnaam is vereist.</target>
4233 <context-group name="null">
4234 <context context-type="linenumber">1</context>
4235 </context-group>
4236 </trans-unit>
4237 <trans-unit id="dbb2ef02020afc05e146855f2e1dd7c9522d49b6">
4238 <source>Previews cache size is required.</source>
4239 <target>Cachegrootte van voorvertoning is vereist.</target>
4240 <context-group name="null">
4241 <context context-type="linenumber">1</context>
4242 </context-group>
4243 </trans-unit>
4244 <trans-unit id="97836c6e698185b4ce357de9d4b2ab3e838f2459">
4245 <source>Previews cache size must be greater than 1.</source>
4246 <target>Cachegrootte van voorvertoning moet groter zijn dan 1.</target>
4247 <context-group name="null">
4248 <context context-type="linenumber">1</context>
4249 </context-group>
4250 </trans-unit>
4251 <trans-unit id="e7393dc4a4aa12d005582eb9e1ddc7e5ca5bebd3">
4252 <source>Previews cache size must be a number.</source>
4253 <target>Cachegrootte van voorvertoning moet een nummer zijn.</target>
4254 <context-group name="null">
4255 <context context-type="linenumber">1</context>
4256 </context-group>
4257 </trans-unit>
4258 <trans-unit id="545f5dea553b2d7c4a65920ccdcb1e9dbdc7f4d8">
4259 <source>Captions cache size is required.</source>
4260 <target>Cachegrootte van ondertiteling is vereist.</target>
4261 <context-group name="null">
4262 <context context-type="linenumber">1</context>
4263 </context-group>
4264 </trans-unit>
4265 <trans-unit id="a8d7131c0ca1eefe7b058e6081236ca1be364e2c">
4266 <source>Captions cache size must be greater than 1.</source>
4267 <target>Cachegrootte van ondertiteling moet groter zijn dan 1.</target>
4268 <context-group name="null">
4269 <context context-type="linenumber">1</context>
4270 </context-group>
4271 </trans-unit>
4272 <trans-unit id="c3decd47b03cf542df091c1a2fb25b756e59074e">
4273 <source>Captions cache size must be a number.</source>
4274 <target>Cachegrootte van ondertiteling moet een nummer zijn.</target>
4275 <context-group name="null">
4276 <context context-type="linenumber">1</context>
4277 </context-group>
4278 </trans-unit>
4279 <trans-unit id="2cdd5a8c604ef16c2f9a17ed81d73f4f9509e828">
4280 <source>Signup limit is required.</source>
4281 <target>Inschrijflimiet is vereist.</target>
4282 <context-group name="null">
4283 <context context-type="linenumber">1</context>
4284 </context-group>
4285 </trans-unit>
4286 <trans-unit id="0ca9f7ec55c9896add6e82d2b52e9217e1140cf7">
4287 <source>Signup limit must be greater than 1.</source>
4288 <target>Inschrijflimiet moet groter zijn dan 1.</target>
4289 <context-group name="null">
4290 <context context-type="linenumber">1</context>
4291 </context-group>
4292 </trans-unit>
4293 <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
4294 <source>Signup limit must be a number.</source>
4295 <target>Inschrijflimiet moet een nummer zijn.</target>
4296 <context-group name="null">
4297 <context context-type="linenumber">1</context>
4298 </context-group>
4299 </trans-unit>
4300 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
4301 <source>Admin email is required.</source>
4302 <target>Administrator e-mail is vereist.</target>
4303 <context-group name="null">
4304 <context context-type="linenumber">1</context>
4305 </context-group>
4306 </trans-unit>
4307 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
4308 <source>Admin email must be valid.</source>
4309 <target>Administrator e-mail moet valide zijn.</target>
4310 <context-group name="null">
4311 <context context-type="linenumber">1</context>
4312 </context-group>
4313 </trans-unit>
4314 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
4315 <source>Transcoding threads is required.</source>
4316 <target>Transcoding threads zijn vereist.</target>
4317 <context-group name="null">
4318 <context context-type="linenumber">1</context>
4319 </context-group>
4320 </trans-unit>
4321 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
4322 <source>Transcoding threads must be greater or equal to 0.</source>
4323 <target>Transcoding threads moeten groter of gelijk zijn aan 0.</target>
4324 <context-group name="null">
4325 <context context-type="linenumber">1</context>
4326 </context-group>
4327 </trans-unit>
4328 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4329 <source>Email is required.</source>
4330 <target>E-mail is vereist.</target>
4331 <context-group name="null">
4332 <context context-type="linenumber">1</context>
4333 </context-group>
4334 </trans-unit>
4335 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4336 <source>Email must be valid.</source>
4337 <target>E-mail moet valide zijn.</target>
4338 <context-group name="null">
4339 <context context-type="linenumber">1</context>
4340 </context-group>
4341 </trans-unit>
4342 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4343 <source>Username is required.</source>
4344 <target>Gebruikersnaam is vereist.</target>
4345 <context-group name="null">
4346 <context context-type="linenumber">1</context>
4347 </context-group>
4348 </trans-unit>
4349 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
4350 <source>Password is required.</source>
4351 <target>Wachtwoord is vereist.</target>
4352 <context-group name="null">
4353 <context context-type="linenumber">1</context>
4354 </context-group>
4355 </trans-unit>
4356 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
4357 <source>Confirmation of the password is required.</source>
4358 <target>Bevestiging van het wachtwoord is vereist.</target>
4359 <context-group name="null">
4360 <context context-type="linenumber">1</context>
4361 </context-group>
4362 </trans-unit>
4363 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4364 <source>Password must be at least 6 characters long.</source>
4365 <target>Wachtwoord moet minstens 6 karakters lang zijn.</target>
4366 <context-group name="null">
4367 <context context-type="linenumber">1</context>
4368 </context-group>
4369 </trans-unit>
4370 <trans-unit id="0a154031f3e66985af96d5f903441cf84f0dc75e">
4371 <source>Password cannot be more than 255 characters long.</source>
4372 <target>Wachtwoord kan niet langer zijn dan 255 karakters.</target>
4373 <context-group name="null">
4374 <context context-type="linenumber">1</context>
4375 </context-group>
4376 </trans-unit>
4377 <trans-unit id="2db8f1f93a5485c32267762a3bf4da499832e732">
4378 <source>The new password and the confirmed password do not correspond.</source>
4379 <target>Het nieuwe wachtwoord en het bevestigde wachtwoord zijn niet hetzelfde.</target>
4380 <context-group name="null">
4381 <context context-type="linenumber">1</context>
4382 </context-group>
4383 </trans-unit>
4384 <trans-unit id="abede840116d58f04a55d99a6cbd68da8a3e1bbf">
4385 <source>Video quota is required.</source>
4386 <target>Videoquotum is vereist.</target>
4387 <context-group name="null">
4388 <context context-type="linenumber">1</context>
4389 </context-group>
4390 </trans-unit>
4391 <trans-unit id="93a6dc1d3aa0d3201c86ef1ec8adf5cf0ada3c80">
4392 <source>Quota must be greater than -1.</source>
4393 <target>Quota moet groter zijn dan -1</target>
4394 <context-group name="null">
4395 <context context-type="linenumber">1</context>
4396 </context-group>
4397 </trans-unit>
4398 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
4399 <source>Daily upload limit is required.</source>
4400 <target>Dagelijks uploadlimiet is vereist.</target>
4401 <context-group name="null">
4402 <context context-type="linenumber">1</context>
4403 </context-group>
4404 </trans-unit>
4405 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
4406 <source>Daily upload limit must be greater than -1.</source>
4407 <target>Dagelijks uploadlimiet moet groter zijn dan -1.</target>
4408 <context-group name="null">
4409 <context context-type="linenumber">1</context>
4410 </context-group>
4411 </trans-unit>
4412 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
4413 <source>User role is required.</source>
4414 <target>Gebruikersrol is vereist.</target>
4415 <context-group name="null">
4416 <context context-type="linenumber">1</context>
4417 </context-group>
4418 </trans-unit>
1322 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4"> 4419 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
1323 <source>Display name is required.</source> 4420 <source>Display name is required.</source>
1324 <target>Een weergavenaam is verplicht</target> 4421 <target>Een weergavenaam is verplicht.</target>
4422 <context-group name="null">
4423 <context context-type="linenumber">1</context>
4424 </context-group>
4425 </trans-unit>
4426 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4427 <source>Description must be at least 3 characters long.</source>
4428 <target>Beschrijvingen moeten minstens 3 karakters lang zijn.</target>
4429 <context-group name="null">
4430 <context context-type="linenumber">1</context>
4431 </context-group>
4432 </trans-unit>
4433 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4434 <source>Description cannot be more than 1000 characters long.</source>
4435 <target>Beschrijvingen mogen niet langer dan 1000 karakters zijn.</target>
4436 <context-group name="null">
4437 <context context-type="linenumber">1</context>
4438 </context-group>
4439 </trans-unit>
4440 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
4441 <source>You must to agree with the instance terms in order to registering on it.</source>
4442 <target>Je moet akkoord gaan met de instantie's termijnen om erop te registreren.</target>
4443 <context-group name="null">
4444 <context context-type="linenumber">1</context>
4445 </context-group>
4446 </trans-unit>
4447 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
4448 <source>Ban reason must be at least 3 characters long.</source>
4449 <target>Verbanningsreden moet minstens 3 karakters zijn.</target>
4450 <context-group name="null">
4451 <context context-type="linenumber">1</context>
4452 </context-group>
4453 </trans-unit>
4454 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
4455 <source>Ban reason cannot be more than 250 characters long.</source>
4456 <target>Verbanningsreden kan niet langer dan 250 tekens zijn.</target>
4457 <context-group name="null">
4458 <context context-type="linenumber">1</context>
4459 </context-group>
4460 </trans-unit>
4461 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
4462 <source>Report reason is required.</source>
4463 <target>Rapportagereden is vereist.</target>
4464 <context-group name="null">
4465 <context context-type="linenumber">1</context>
4466 </context-group>
4467 </trans-unit>
4468 <trans-unit id="993f9f5703d449a1d467243db75253d288a2947e">
4469 <source>Report reason must be at least 2 characters long.</source>
4470 <target>Rapportagereden moet minstens 2 tekens zijn.</target>
4471 <context-group name="null">
4472 <context context-type="linenumber">1</context>
4473 </context-group>
4474 </trans-unit>
4475 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4476 <source>Moderation comment is required.</source>
4477 <target>Beheersreactie is vereist.</target>
4478 <context-group name="null">
4479 <context context-type="linenumber">1</context>
4480 </context-group>
4481 </trans-unit>
4482 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
4483 <source>Moderation comment must be at least 2 characters long.</source>
4484 <target>Beheersreactie moet minstens 2 karakters zijn.</target>
4485 <context-group name="null">
4486 <context context-type="linenumber">1</context>
4487 </context-group>
4488 </trans-unit>
4489 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4490 <source>The channel is required.</source>
4491 <target>Het kanaal is vereist.</target>
4492 <context-group name="null">
4493 <context context-type="linenumber">1</context>
4494 </context-group>
4495 </trans-unit>
4496 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
4497 <source>Blacklist reason must be at least 2 characters long.</source>
4498 <target>Zwartelijstreden moet minstens 2 karakters zijn.</target>
4499 <context-group name="null">
4500 <context context-type="linenumber">1</context>
4501 </context-group>
4502 </trans-unit>
4503 <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
4504 <source>Blacklist reason cannot be more than 300 characters long.</source>
4505 <target>Zwartelijstreden kan niet langer dan 300 karakters zijn.</target>
4506 <context-group name="null">
4507 <context context-type="linenumber">1</context>
4508 </context-group>
4509 </trans-unit>
4510 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
4511 <source>Video caption language is required.</source>
4512 <target>Video ondertitelingstaal is vereist.</target>
4513 <context-group name="null">
4514 <context context-type="linenumber">1</context>
4515 </context-group>
4516 </trans-unit>
4517 <trans-unit id="82083ae96724851ff37e1c7e4e9f907c25677963">
4518 <source>Video caption file is required.</source>
4519 <target>Video ondertitelingsbestand is vereist.</target>
4520 <context-group name="null">
4521 <context context-type="linenumber">1</context>
4522 </context-group>
4523 </trans-unit>
4524 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
4525 <source>The username is required.</source>
4526 <target>De gebruikersnaam is vereist.</target>
4527 <context-group name="null">
4528 <context context-type="linenumber">1</context>
4529 </context-group>
4530 </trans-unit>
4531 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4532 <source>You can only transfer ownership to a local account</source>
4533 <target>Je kan alleen je eigendom transporteren naar een lokaal account</target>
4534 <context-group name="null">
4535 <context context-type="linenumber">1</context>
4536 </context-group>
4537 </trans-unit>
4538 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4539 <source>Name is required.</source>
4540 <target>Naam is vereist.</target>
4541 <context-group name="null">
4542 <context context-type="linenumber">1</context>
4543 </context-group>
4544 </trans-unit>
4545 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4546 <source>Support text must be at least 3 characters long.</source>
4547 <target>Supporttekst moet minstens 3 karakters zijn.</target>
4548 <context-group name="null">
4549 <context context-type="linenumber">1</context>
4550 </context-group>
4551 </trans-unit>
4552 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4553 <source>Support text cannot be more than 1000 characters long.</source>
4554 <target>Supporttekst mag niet meer zijn dan 1000 karakters.</target>
4555 <context-group name="null">
4556 <context context-type="linenumber">1</context>
4557 </context-group>
4558 </trans-unit>
4559 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
4560 <source>Comment is required.</source>
4561 <target>Reactie is vereist.</target>
4562 <context-group name="null">
4563 <context context-type="linenumber">1</context>
4564 </context-group>
4565 </trans-unit>
4566 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
4567 <source>Comment must be at least 2 characters long.</source>
4568 <target>Reactie moet minstens 2 karakters zijn.</target>
4569 <context-group name="null">
4570 <context context-type="linenumber">1</context>
4571 </context-group>
4572 </trans-unit>
4573 <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123">
4574 <source>Comment cannot be more than 3000 characters long.</source>
4575 <target>Reactie kan niet meer dan 3000 karakters zijn.</target>
4576 <context-group name="null">
4577 <context context-type="linenumber">1</context>
4578 </context-group>
4579 </trans-unit>
4580 <trans-unit id="cdc51eaeab88683610a28af8645cf91d136b39e1">
4581 <source>Video name is required.</source>
4582 <target>Videonaam is vereist.</target>
4583 <context-group name="null">
4584 <context context-type="linenumber">1</context>
4585 </context-group>
4586 </trans-unit>
4587 <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c">
4588 <source>Video name must be at least 3 characters long.</source>
4589 <target>Videonaam moet minstens 3 karakters zijn.</target>
4590 <context-group name="null">
4591 <context context-type="linenumber">1</context>
4592 </context-group>
4593 </trans-unit>
4594 <trans-unit id="0320d0f7f8eec2341e27ca53d7875217a3d99695">
4595 <source>Video name cannot be more than 120 characters long.</source>
4596 <target>Videonaam kan niet meer dan 120 karakters zijn.</target>
4597 <context-group name="null">
4598 <context context-type="linenumber">1</context>
4599 </context-group>
4600 </trans-unit>
4601 <trans-unit id="a627c58cf1849d7d838696e7f36c1bae1a8b31a4">
4602 <source>Video privacy is required.</source>
4603 <target>Videoprivacy is vereist.</target>
4604 <context-group name="null">
4605 <context context-type="linenumber">1</context>
4606 </context-group>
4607 </trans-unit>
4608 <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
4609 <source>Video channel is required.</source>
4610 <target>Videokanaal is vereist.</target>
4611 <context-group name="null">
4612 <context context-type="linenumber">1</context>
4613 </context-group>
4614 </trans-unit>
4615 <trans-unit id="af5e2d5f3ac817c735fb7ff9ca16322789f66fef">
4616 <source>Video description must be at least 3 characters long.</source>
4617 <target>Videobeschrijving moet minstens 3 karakters zijn.</target>
4618 <context-group name="null">
4619 <context context-type="linenumber">1</context>
4620 </context-group>
4621 </trans-unit>
4622 <trans-unit id="ce28a9403c2d7e5da2e59af27118f8b6d109e906">
4623 <source>Video description cannot be more than 10000 characters long.</source>
4624 <target>Videobeschrijving kan niet meer dan 10000 karakters zijn.</target>
4625 <context-group name="null">
4626 <context context-type="linenumber">1</context>
4627 </context-group>
4628 </trans-unit>
4629 <trans-unit id="f1cffdc2e156716cd9880201d65ba457d11464f8">
4630 <source>A tag should be more than 2 characters long.</source>
4631 <target>Een tag moet minstens 2 karakters zijn.</target>
4632 <context-group name="null">
4633 <context context-type="linenumber">1</context>
4634 </context-group>
4635 </trans-unit>
4636 <trans-unit id="34a0811f9a2a7366cc9efcdad52ea59b105326ea">
4637 <source>A tag should be less than 30 characters long.</source>
4638 <target>Een tag moet minder dan 30 karakters zijn.</target>
4639 <context-group name="null">
4640 <context context-type="linenumber">1</context>
4641 </context-group>
4642 </trans-unit>
4643 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
4644 <source>Video support must be at least 3 characters long.</source>
4645 <target>Videosupport moet minstens 3 karakters zijn.</target>
4646 <context-group name="null">
4647 <context context-type="linenumber">1</context>
4648 </context-group>
4649 </trans-unit>
4650 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4651 <source>Video support cannot be more than 1000 characters long.</source>
4652 <target>Videosupport kan niet meer dan 1000 karakters zijn.</target>
4653 <context-group name="null">
4654 <context context-type="linenumber">1</context>
4655 </context-group>
4656 </trans-unit>
4657 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
4658 <source>A date is required to schedule video update.</source>
4659 <target>Een datum is vereist om videoupdates in te roosteren.</target>
4660 <context-group name="null">
4661 <context context-type="linenumber">1</context>
4662 </context-group>
4663 </trans-unit>
4664 <trans-unit id="3b7ed22d0730d03b38c254332829d855ee7256c4">
4665 <source>This file is too large.</source>
4666 <target>Dit bestand is te groot.</target>
4667 <context-group name="null">
4668 <context context-type="linenumber">1</context>
4669 </context-group>
4670 </trans-unit>
4671 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4">
4672 <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
4673 <target>Alle onopgeslagen data zal verloren worden, weet je zeker dat je deze pagina wil verlaten?</target>
4674 <context-group name="null">
4675 <context context-type="linenumber">1</context>
4676 </context-group>
4677 </trans-unit>
4678 <trans-unit id="a8059e31694578c1b0344a76a345357dd60e8f01">
4679 <source>Warning</source>
4680 <target>Waarschuwing</target>
4681 <context-group name="null">
4682 <context context-type="linenumber">1</context>
4683 </context-group>
4684 </trans-unit>
4685 <trans-unit id="8339364b054610983b7f2334bb807fff7613bddf">
4686 <source>Sunday</source>
4687 <target>Zondag</target>
4688 <context-group name="null">
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
4692 <trans-unit id="a43c57a7cbebf57eb33a2eae5e994c91d9887596">
4693 <source>Monday</source>
4694 <target>Maandag</target>
4695 <context-group name="null">
4696 <context context-type="linenumber">1</context>
4697 </context-group>
4698 </trans-unit>
4699 <trans-unit id="48a2a35957ce394eb2c59ae35c99642360af70ee">
4700 <source>Tuesday</source>
4701 <target>Dinsdag</target>
4702 <context-group name="null">
4703 <context context-type="linenumber">1</context>
4704 </context-group>
4705 </trans-unit>
4706 <trans-unit id="b0af441f9ba8b82952b9ec10fb8c62e8fec67df9">
4707 <source>Wednesday</source>
4708 <target>Woensdag</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="55c583b99c809818ec27df065ccf05357a6ac10b">
4714 <source>Thursday</source>
4715 <target>Donderdag</target>
4716 <context-group name="null">
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="e91b54925dc5f490753f60f53ef6f8b4609e6215">
4721 <source>Friday</source>
4722 <target>Vrijdag</target>
4723 <context-group name="null">
4724 <context context-type="linenumber">1</context>
4725 </context-group>
4726 </trans-unit>
4727 <trans-unit id="c0d2dd391a3eca8e841a5d0e035cd268280eb68e">
4728 <source>Saturday</source>
4729 <target>Zaterdag</target>
4730 <context-group name="null">
4731 <context context-type="linenumber">1</context>
4732 </context-group>
4733 </trans-unit>
4734 <trans-unit id="6549890cd0d6b59fb0e1aa383b00483a68a55eef">
4735 <source>Sun</source>
4736 <target>Zon</target>
4737 <context-group name="null">
4738 <context context-type="linenumber">1</context>
4739 </context-group>
4740 </trans-unit>
4741 <trans-unit id="3382aa5d7f520e197fb59a4995fe1beffca2d0ff">
4742 <source>Mon</source>
4743 <target>Maa</target>
4744 <context-group name="null">
4745 <context context-type="linenumber">1</context>
4746 </context-group>
4747 </trans-unit>
4748 <trans-unit id="f883ec926274974df0fc46c037cbffd6a863ebc9">
4749 <source>Tue</source>
4750 <target>Din</target>
4751 <context-group name="null">
4752 <context context-type="linenumber">1</context>
4753 </context-group>
4754 </trans-unit>
4755 <trans-unit id="242b4f4b5651e24f9a9007ef153a57981e4b989d">
4756 <source>Wed</source>
4757 <target>Woe</target>
4758 <context-group name="null">
4759 <context context-type="linenumber">1</context>
4760 </context-group>
4761 </trans-unit>
4762 <trans-unit id="5a2c39d56b8f00a6a4670a63b53caacbda953be6">
4763 <source>Thu</source>
4764 <target>Don</target>
4765 <context-group name="null">
4766 <context context-type="linenumber">1</context>
4767 </context-group>
4768 </trans-unit>
4769 <trans-unit id="4cdf23d523a0e52e0dec9cd650ffd9bd6952792c">
4770 <source>Fri</source>
4771 <target>Vri</target>
4772 <context-group name="null">
4773 <context context-type="linenumber">1</context>
4774 </context-group>
4775 </trans-unit>
4776 <trans-unit id="1283d165a942d7f4c469ba34f99dbb9e927d0261">
4777 <source>Sat</source>
4778 <target>Zat</target>
4779 <context-group name="null">
4780 <context context-type="linenumber">1</context>
4781 </context-group>
4782 </trans-unit>
4783 <trans-unit id="2fba8448ff13105c57665a9a6ffcfe9615d855dd">
4784 <source>Su</source>
4785 <target>Zon</target>
4786 <context-group name="null">
4787 <context context-type="linenumber">1</context>
4788 </context-group>
4789 </trans-unit>
4790 <trans-unit id="388144af7ac7651d2615b9be0e84f43ae71d9fb3">
4791 <source>Mo</source>
4792 <target>Ma</target>
4793 <context-group name="null">
4794 <context context-type="linenumber">1</context>
4795 </context-group>
4796 </trans-unit>
4797 <trans-unit id="d96313e42b5f0751ce2676a31d309b4d322ab462">
4798 <source>Tu</source>
4799 <target>Di</target>
4800 <context-group name="null">
4801 <context context-type="linenumber">1</context>
4802 </context-group>
4803 </trans-unit>
4804 <trans-unit id="06cc3d39f78c0615b707cef39cd4875599611fef">
4805 <source>We</source>
4806 <target>Wo</target>
4807 <context-group name="null">
4808 <context context-type="linenumber">1</context>
4809 </context-group>
4810 </trans-unit>
4811 <trans-unit id="790894436cca9d675d59be9a8aafd58acccde2cd">
4812 <source>Th</source>
4813 <target>Do</target>
4814 <context-group name="null">
4815 <context context-type="linenumber">1</context>
4816 </context-group>
4817 </trans-unit>
4818 <trans-unit id="42dfe37169f8471367c31489155229bbe1747ea5">
4819 <source>Fr</source>
4820 <target>Vr</target>
4821 <context-group name="null">
4822 <context context-type="linenumber">1</context>
4823 </context-group>
4824 </trans-unit>
4825 <trans-unit id="1b64ea3e04ceeb512e8974eb0019dee4f211c7a0">
4826 <source>Sa</source>
4827 <target>Za</target>
4828 <context-group name="null">
4829 <context context-type="linenumber">1</context>
4830 </context-group>
4831 </trans-unit>
4832 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
4833 <source>January</source>
4834 <target>Januari</target>
4835 <context-group name="null">
4836 <context context-type="linenumber">1</context>
4837 </context-group>
4838 </trans-unit>
4839 <trans-unit id="0393a96b58df82af39a2ec83deec624749e42036">
4840 <source>February</source>
4841 <target>Februari</target>
4842 <context-group name="null">
4843 <context context-type="linenumber">1</context>
4844 </context-group>
4845 </trans-unit>
4846 <trans-unit id="ea41ee3743ec5bdbbf863ab793bbdd6e6d9af96e">
4847 <source>March</source>
4848 <target>Maart</target>
4849 <context-group name="null">
4850 <context context-type="linenumber">1</context>
4851 </context-group>
4852 </trans-unit>
4853 <trans-unit id="b87ee784d9e93b5557aca9bdc9464dbd4328920a">
4854 <source>April</source>
4855 <target>April</target>
4856 <context-group name="null">
4857 <context context-type="linenumber">1</context>
4858 </context-group>
4859 </trans-unit>
4860 <trans-unit id="862da1034ac2707cc44123ed963b2f42109b6b3e">
4861 <source>May</source>
4862 <target>Mei</target>
4863 <context-group name="null">
4864 <context context-type="linenumber">1</context>
4865 </context-group>
4866 </trans-unit>
4867 <trans-unit id="2f234249d4c3c39e27c0f05d4a6b73a7959caeb2">
4868 <source>June</source>
4869 <target>Juni</target>
4870 <context-group name="null">
4871 <context context-type="linenumber">1</context>
4872 </context-group>
4873 </trans-unit>
4874 <trans-unit id="11447f95e83c8de675ab6c492150f88e4d9bd15e">
4875 <source>July</source>
4876 <target>July</target>
4877 <context-group name="null">
4878 <context context-type="linenumber">1</context>
4879 </context-group>
4880 </trans-unit>
4881 <trans-unit id="ddd9a3d59a8db4e822e54e9473c05b571aca9829">
4882 <source>August</source>
4883 <target>Augustus</target>
4884 <context-group name="null">
4885 <context context-type="linenumber">1</context>
4886 </context-group>
4887 </trans-unit>
4888 <trans-unit id="e21dc41f9b3fdaf35ab6b2d9e2e5e8a926fb1938">
4889 <source>September</source>
4890 <target>September</target>
4891 <context-group name="null">
4892 <context context-type="linenumber">1</context>
4893 </context-group>
4894 </trans-unit>
4895 <trans-unit id="71f49c502d13e22079a958a5532afa28dbe98b3b">
4896 <source>October</source>
4897 <target>Oktober</target>
4898 <context-group name="null">
4899 <context context-type="linenumber">1</context>
4900 </context-group>
4901 </trans-unit>
4902 <trans-unit id="64b5ce921faa5e3d277d6d528ddcfc8c2bfe9f52">
4903 <source>November</source>
4904 <target>November</target>
4905 <context-group name="null">
4906 <context context-type="linenumber">1</context>
4907 </context-group>
4908 </trans-unit>
4909 <trans-unit id="2006e2aabb31714ebc684dc382539649f690ed5c">
4910 <source>December</source>
4911 <target>December</target>
4912 <context-group name="null">
4913 <context context-type="linenumber">1</context>
4914 </context-group>
4915 </trans-unit>
4916 <trans-unit id="8270e687cfb5624b3f6fbb7991a2e916c96464b7">
4917 <source>Jan</source>
4918 <target>Jan</target>
4919 <context-group name="null">
4920 <context context-type="linenumber">1</context>
4921 </context-group>
4922 </trans-unit>
4923 <trans-unit id="23544170afbb981dd52750b641576841cf5dcf60">
4924 <source>Feb</source>
4925 <target>Feb</target>
4926 <context-group name="null">
4927 <context context-type="linenumber">1</context>
4928 </context-group>
4929 </trans-unit>
4930 <trans-unit id="1f14355742459b7d6a0126a1564e1c18f39f86e7">
4931 <source>Mar</source>
4932 <target>Mar</target>
4933 <context-group name="null">
4934 <context context-type="linenumber">1</context>
4935 </context-group>
4936 </trans-unit>
4937 <trans-unit id="964a5f032bc846d32806a4838580a4f81cf14463">
4938 <source>Apr</source>
4939 <target>Apr</target>
4940 <context-group name="null">
4941 <context context-type="linenumber">1</context>
4942 </context-group>
4943 </trans-unit>
4944 <trans-unit id="8f7274f606f71d9290ed01c5683092d701632d7f">
4945 <source>Jun</source>
4946 <target>Jun</target>
4947 <context-group name="null">
4948 <context context-type="linenumber">1</context>
4949 </context-group>
4950 </trans-unit>
4951 <trans-unit id="7c3d8318d6d8d9920ae0a80350616732c33a3211">
4952 <source>Jul</source>
4953 <target>Jul</target>
4954 <context-group name="null">
4955 <context context-type="linenumber">1</context>
4956 </context-group>
4957 </trans-unit>
4958 <trans-unit id="be1335ffd1c606321e2c020b638dd3c84b434212">
4959 <source>Aug</source>
4960 <target>Aug</target>
4961 <context-group name="null">
4962 <context context-type="linenumber">1</context>
4963 </context-group>
4964 </trans-unit>
4965 <trans-unit id="4f739d03be1c936c58978739c317d91566348204">
4966 <source>Sep</source>
4967 <target>Sep</target>
4968 <context-group name="null">
4969 <context context-type="linenumber">1</context>
4970 </context-group>
4971 </trans-unit>
4972 <trans-unit id="6607cacb987a588530a13de7018d959240d19153">
4973 <source>Oct</source>
4974 <target>Oct</target>
4975 <context-group name="null">
4976 <context context-type="linenumber">1</context>
4977 </context-group>
4978 </trans-unit>
4979 <trans-unit id="e597400ded12a366855615e18fcc8f9ac05b72e0">
4980 <source>Nov</source>
4981 <target>Nov</target>
4982 <context-group name="null">
4983 <context context-type="linenumber">1</context>
4984 </context-group>
4985 </trans-unit>
4986 <trans-unit id="adf2dfa2a9cb490d6a4a74510b7b0846b62d429e">
4987 <source>Dec</source>
4988 <target>Dec</target>
4989 <context-group name="null">
4990 <context context-type="linenumber">1</context>
4991 </context-group>
4992 </trans-unit>
4993 <trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
4994 <source>Clear</source>
4995 <target>Wissen</target>
4996 <context-group name="null">
4997 <context context-type="linenumber">1</context>
4998 </context-group>
4999 </trans-unit>
5000 <trans-unit id="8fb519ba47ea7806beeacdcd44829d85a2aa0cc5">
5001 <source>yy-mm-dd </source>
5002 <target>jj-mm-dd</target>
5003 <context-group name="null">
5004 <context context-type="linenumber">1</context>
5005 </context-group>
5006 </trans-unit>
5007 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
5008 <source>Transcode your videos in multiple resolutions</source>
5009 <target>Transcodeer je videos in meerdere resoluties</target>
5010 <context-group name="null">
5011 <context context-type="linenumber">1</context>
5012 </context-group>
5013 </trans-unit>
5014 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
5015 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
5016 <target>HTTP import(Youtube, Vimeo, directe URL...)</target>
5017 <context-group name="null">
5018 <context context-type="linenumber">1</context>
5019 </context-group>
5020 </trans-unit>
5021 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
5022 <source>Torrent import</source>
5023 <target>Torrentimport</target>
5024 <context-group name="null">
5025 <context context-type="linenumber">1</context>
5026 </context-group>
5027 </trans-unit>
5028 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
5029 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
5030 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
5031 <context-group name="null">
5032 <context context-type="linenumber">1</context>
5033 </context-group>
5034 </trans-unit>
5035 <trans-unit id="cf9ddbb55b25178660e09346209aedc10108aa24">
5036 <source>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</source>
5037 <target>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</target>
5038 <context-group name="null">
5039 <context context-type="linenumber">1</context>
5040 </context-group>
5041 </trans-unit>
5042 <trans-unit id="10ffa5c3dbcee491d66f80d8d4dce3e119a6ec86">
5043 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of full HD videos</source>
5044 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan full HD videos</target>
5045 <context-group name="null">
5046 <context context-type="linenumber">1</context>
5047 </context-group>
5048 </trans-unit>
5049 <trans-unit id="344ddae9f45b344e98e7b28cd5e33243982700f8">
5050 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of HD videos</source>
5051 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan HD videos</target>
5052 <context-group name="null">
5053 <context context-type="linenumber">1</context>
5054 </context-group>
5055 </trans-unit>
5056 <trans-unit id="435c012df6dd990a1ccb7ee73dd79c488bde28b5">
5057 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of average quality videos</source>
5058 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan gemiddelde kwaliteit videos</target>
5059 <context-group name="null">
5060 <context context-type="linenumber">1</context>
5061 </context-group>
5062 </trans-unit>
5063 <trans-unit id="0b2054a863319d2cf59867addd125b6717cae41d">
5064 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> years ago</source>
5065 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> jaar geleden</target>
5066 <context-group name="null">
5067 <context context-type="linenumber">1</context>
5068 </context-group>
5069 </trans-unit>
5070 <trans-unit id="e622d3813449fe36371ea258281059306819199d">
5071 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> months ago</source>
5072 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maanden geleden</target>
5073 <context-group name="null">
5074 <context context-type="linenumber">1</context>
5075 </context-group>
5076 </trans-unit>
5077 <trans-unit id="2f8a5a5f7efb521d7d89dc659ff65dd13cb7b17b">
5078 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> month ago</source>
5079 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maand geleden</target>
5080 <context-group name="null">
5081 <context context-type="linenumber">1</context>
5082 </context-group>
5083 </trans-unit>
5084 <trans-unit id="1d1a46543a29096d3c6676be2d561380a0bc94e1">
5085 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> weeks ago</source>
5086 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> weken geleden</target>
5087 <context-group name="null">
5088 <context context-type="linenumber">1</context>
5089 </context-group>
5090 </trans-unit>
5091 <trans-unit id="e1db0b98b6cdf817508195f3649c48475c32ae7e">
5092 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> week ago</source>
5093 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> week geleden</target>
5094 <context-group name="null">
5095 <context context-type="linenumber">1</context>
5096 </context-group>
5097 </trans-unit>
5098 <trans-unit id="a7654c3ece96e777527606f1c2870d6ee0b180f7">
5099 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> days ago</source>
5100 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dagen geleden</target>
5101 <context-group name="null">
5102 <context context-type="linenumber">1</context>
5103 </context-group>
5104 </trans-unit>
5105 <trans-unit id="5b465235ae55091d32535e23dd180c407f1352d1">
5106 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> day ago</source>
5107 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dag geleden</target>
5108 <context-group name="null">
5109 <context context-type="linenumber">1</context>
5110 </context-group>
5111 </trans-unit>
5112 <trans-unit id="dc7addf53bd6405a9c746db6dfca665c33679a84">
5113 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hours ago</source>
5114 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uren geleden</target>
5115 <context-group name="null">
5116 <context context-type="linenumber">1</context>
5117 </context-group>
5118 </trans-unit>
5119 <trans-unit id="d54a610250ed38efccf0e3afdd0004f6ad83ea8d">
5120 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hour ago</source>
5121 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uur geleden</target>
5122 <context-group name="null">
5123 <context context-type="linenumber">1</context>
5124 </context-group>
5125 </trans-unit>
5126 <trans-unit id="9704e5e3adce178c127ead05f7057d3fb827308a">
5127 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> min ago</source>
5128 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> min geleden</target>
5129 <context-group name="null">
5130 <context context-type="linenumber">1</context>
5131 </context-group>
5132 </trans-unit>
5133 <trans-unit id="7a158a7555a44ea7eff9fa4988df9aa24d262ceb">
5134 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec ago</source>
5135 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec geleden</target>
5136 <context-group name="null">
5137 <context context-type="linenumber">1</context>
5138 </context-group>
5139 </trans-unit>
5140 <trans-unit id="457f161d3ca706b8de263b0cd58e493d54e7d4c5">
5141 <source><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatible that supports:</source>
5142 <target><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markeer<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatibele dat support:</target>
5143 <context-group name="null">
5144 <context context-type="linenumber">1</context>
5145 </context-group>
5146 </trans-unit>
5147 <trans-unit id="ab4426b60f13c00b61d6b714d390dc629f314980">
5148 <source>Emphasis</source>
5149 <target>Nadruk</target>
5150 <context-group name="null">
5151 <context context-type="linenumber">1</context>
5152 </context-group>
5153 </trans-unit>
5154 <trans-unit id="dc60677d5a906e69f38a5cf9da7f2eb03931bea0">
5155 <source>Links</source>
5156 <target>Links</target>
5157 <context-group name="null">
5158 <context context-type="linenumber">1</context>
5159 </context-group>
5160 </trans-unit>
5161 <trans-unit id="80220239e07f36ea8d5f10118dc52ce4b13bc15a">
5162 <source>New lines</source>
5163 <target>Nieuwe lijnen</target>
5164 <context-group name="null">
5165 <context context-type="linenumber">1</context>
5166 </context-group>
5167 </trans-unit>
5168 <trans-unit id="b15e7bec5c7833d2d9634946ccbed68967b1bee1">
5169 <source>Lists</source>
5170 <target>Lijsten</target>
5171 <context-group name="null">
5172 <context context-type="linenumber">1</context>
5173 </context-group>
5174 </trans-unit>
5175 <trans-unit id="b73f7f5060fb22a1e9ec462b1bb02493fa3ab866">
5176 <source>Images</source>
5177 <target>Afbeeldingen</target>
5178 <context-group name="null">
5179 <context context-type="linenumber">1</context>
5180 </context-group>
5181 </trans-unit>
5182 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5183 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5184 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verbannen.</target>
5185 <context-group name="null">
5186 <context context-type="linenumber">1</context>
5187 </context-group>
5188 </trans-unit>
5189 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5190 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5191 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verbannen.</target>
5192 <context-group name="null">
5193 <context context-type="linenumber">1</context>
5194 </context-group>
5195 </trans-unit>
5196 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5197 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5198 <target>Weet je zeker dat je <x id="INTERPOLATION" equiv-text="{{username}}"/> wilt onverbannen?</target>
5199 <context-group name="null">
5200 <context context-type="linenumber">1</context>
5201 </context-group>
5202 </trans-unit>
5203 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5204 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5205 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> onverbannen.</target>
5206 <context-group name="null">
5207 <context context-type="linenumber">1</context>
5208 </context-group>
5209 </trans-unit>
5210 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5211 <source>If you remove this user, you will not be able to create another with the same username!</source>
5212 <target>Als je deze gebruiker verwijdert, is het niet meer mogelijk om een andere te maken met dezelfde gebruikersnaam!</target>
5213 <context-group name="null">
5214 <context context-type="linenumber">1</context>
5215 </context-group>
5216 </trans-unit>
5217 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5218 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5219 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
5220 <context-group name="null">
5221 <context context-type="linenumber">1</context>
5222 </context-group>
5223 </trans-unit>
5224 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5225 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5226 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> e-mail gezet als geverifieerd</target>
5227 <context-group name="null">
5228 <context context-type="linenumber">1</context>
5229 </context-group>
5230 </trans-unit>
5231 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5232 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5233 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt.</target>
5234 <context-group name="null">
5235 <context context-type="linenumber">1</context>
5236 </context-group>
5237 </trans-unit>
5238 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5239 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5240 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt.</target>
5241 <context-group name="null">
5242 <context context-type="linenumber">1</context>
5243 </context-group>
5244 </trans-unit>
5245 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5246 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5247 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt door de instantie.</target>
5248 <context-group name="null">
5249 <context context-type="linenumber">1</context>
5250 </context-group>
5251 </trans-unit>
5252 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5253 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5254 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door de instantie.</target>
5255 <context-group name="null">
5256 <context context-type="linenumber">1</context>
5257 </context-group>
5258 </trans-unit>
5259 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5260 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5261 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt door de instantie.</target>
5262 <context-group name="null">
5263 <context context-type="linenumber">1</context>
5264 </context-group>
5265 </trans-unit>
5266 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5267 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5268 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door de instantie.</target>
5269 <context-group name="null">
5270 <context context-type="linenumber">1</context>
5271 </context-group>
5272 </trans-unit>
5273 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5274 <source>Mute this account</source>
5275 <target>Demp dit account</target>
5276 <context-group name="null">
5277 <context context-type="linenumber">1</context>
5278 </context-group>
5279 </trans-unit>
5280 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5281 <source>Unmute this account</source>
5282 <target>Dempt dit account niet meer</target>
5283 <context-group name="null">
5284 <context context-type="linenumber">1</context>
5285 </context-group>
5286 </trans-unit>
5287 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5288 <source>Mute the instance</source>
5289 <target>Demp de instantie</target>
5290 <context-group name="null">
5291 <context context-type="linenumber">1</context>
5292 </context-group>
5293 </trans-unit>
5294 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5295 <source>Unmute the instance</source>
5296 <target>Demp de instantie niet meer</target>
5297 <context-group name="null">
5298 <context context-type="linenumber">1</context>
5299 </context-group>
5300 </trans-unit>
5301 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5302 <source>Mute this account by your instance</source>
5303 <target>Demp dit account door jouw instantie</target>
5304 <context-group name="null">
5305 <context context-type="linenumber">1</context>
5306 </context-group>
5307 </trans-unit>
5308 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5309 <source>Unmute this account by your instance</source>
5310 <target>Demp dit account niet meer door jouw instantie</target>
5311 <context-group name="null">
5312 <context context-type="linenumber">1</context>
5313 </context-group>
5314 </trans-unit>
5315 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5316 <source>Mute the instance by your instance</source>
5317 <target>Demp de instantie door jouw instantie</target>
5318 <context-group name="null">
5319 <context context-type="linenumber">1</context>
5320 </context-group>
5321 </trans-unit>
5322 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5323 <source>Unmute the instance by your instance</source>
5324 <target>Demp de instantie niet meer door jouw instantie</target>
5325 <context-group name="null">
5326 <context context-type="linenumber">1</context>
5327 </context-group>
5328 </trans-unit>
5329 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5330 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5331 <target>Verzoek te groot voor de server. Alstublieft bereikt de administrator als je de limietgrote wilt vergroten.</target>
5332 <context-group name="null">
5333 <context context-type="linenumber">1</context>
5334 </context-group>
5335 </trans-unit>
5336 <trans-unit id="58546fd4d14b2d9635ce3d28c216ac68587bb25b">
5337 <source>Too many attempts, please try again after <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minutes.</source>
5338 <target>Te vaak geprobeerd, probeer alstublieft weer na <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minuten.</target>
5339 <context-group name="null">
5340 <context context-type="linenumber">1</context>
5341 </context-group>
5342 </trans-unit>
5343 <trans-unit id="ab783a52f2df9ff7a20139cab0da6d0764f3cc5d">
5344 <source>Too many attempts, please try again later.</source>
5345 <target>Te vaak geprobeerd, probeer alstublieft later.</target>
5346 <context-group name="null">
5347 <context context-type="linenumber">1</context>
5348 </context-group>
5349 </trans-unit>
5350 <trans-unit id="0f286a597f0053c3578a52e044769c204ee516fc">
5351 <source>Server error. Please retry later.</source>
5352 <target>Serverfout. Probeer later alstublieft weer.</target>
5353 <context-group name="null">
5354 <context context-type="linenumber">1</context>
5355 </context-group>
5356 </trans-unit>
5357 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5358 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5359 <target>Abonneer op <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5360 <context-group name="null">
5361 <context context-type="linenumber">1</context>
5362 </context-group>
5363 </trans-unit>
5364 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5365 <source>Subscribed</source>
5366 <target>Geabonneert</target>
5367 <context-group name="null">
5368 <context context-type="linenumber">1</context>
5369 </context-group>
5370 </trans-unit>
5371 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
5372 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5373 <target>Ongeabonneert van <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5374 <context-group name="null">
5375 <context context-type="linenumber">1</context>
5376 </context-group>
5377 </trans-unit>
5378 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5379 <source>Unsubscribed</source>
5380 <target>Ongeabonneert</target>
5381 <context-group name="null">
5382 <context context-type="linenumber">1</context>
5383 </context-group>
5384 </trans-unit>
5385 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5386 <source>Moderator</source>
5387 <target>Beheerder</target>
5388 <context-group name="null">
5389 <context context-type="linenumber">1</context>
5390 </context-group>
5391 </trans-unit>
5392 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
5393 <source>Only I can see this video</source>
5394 <target>Ik kan deze video alleen zien</target>
5395 <context-group name="null">
5396 <context context-type="linenumber">1</context>
5397 </context-group>
5398 </trans-unit>
5399 <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
5400 <source>Only people with the private link can see this video</source>
5401 <target>Alleen mensen met de privélink kunnen deze video zien</target>
5402 <context-group name="null">
5403 <context context-type="linenumber">1</context>
5404 </context-group>
5405 </trans-unit>
5406 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
5407 <source>Anyone can see this video</source>
5408 <target>Iedereen kan deze video zien</target>
5409 <context-group name="null">
5410 <context context-type="linenumber">1</context>
5411 </context-group>
5412 </trans-unit>
5413 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
5414 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5415 <target>Welkom! Check alstublieft nu jouw e-mails om jouw accont te verifieren en de inschrijving te voltooien</target>
5416 <context-group name="null">
5417 <context context-type="linenumber">1</context>
5418 </context-group>
5419 </trans-unit>
5420 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
5421 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
5422 <target>Je bent nu ingelogd als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
5423 <context-group name="null">
5424 <context context-type="linenumber">1</context>
5425 </context-group>
5426 </trans-unit>
5427 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
5428 <source>Video to import updated.</source>
5429 <target>Video naar import bijgewerkt.</target>
5430 <context-group name="null">
5431 <context context-type="linenumber">1</context>
5432 </context-group>
5433 </trans-unit>
5434 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c">
5435 <source>Your video was uploaded to your account and is private.</source>
5436 <target>Jouw video is geupload naar jouw account en is privé.
5437 </target>
5438 <context-group name="null">
5439 <context context-type="linenumber">1</context>
5440 </context-group>
5441 </trans-unit>
5442 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
5443 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
5444 <target>Maar geassocieerde data(tags, beschrijving...) zullen verloren raken, weet je zeker dat je deze pagina wilt verlaten?</target>
5445 <context-group name="null">
5446 <context context-type="linenumber">1</context>
5447 </context-group>
5448 </trans-unit>
5449 <trans-unit id="5af84926d631326e548573ebf0f6dff07845aeb4">
5450 <source>Your video is not uploaded yet, are you sure you want to leave this page?</source>
5451 <target>Jouw video is nog niet geupload, weet je zeker dat je deze pagina wilt verlaten?</target>
5452 <context-group name="null">
5453 <context context-type="linenumber">1</context>
5454 </context-group>
5455 </trans-unit>
5456 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5457 <source>Upload cancelled</source>
5458 <target>Upload geannuleerd</target>
5459 <context-group name="null">
5460 <context context-type="linenumber">1</context>
5461 </context-group>
5462 </trans-unit>
5463 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5464 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
5465 <target>Jouw videoquotum is overschreden met deze video (videogrootte: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, gebruikt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quotum: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
5466 <context-group name="null">
5467 <context context-type="linenumber">1</context>
5468 </context-group>
5469 </trans-unit>
5470 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
5471 <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
5472 <target>Jouw dagelijkse videoquotum is overschreden met deze video (videogrootte: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, gebruikt: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quotum: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
5473 <context-group name="null">
5474 <context context-type="linenumber">1</context>
5475 </context-group>
5476 </trans-unit>
5477 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
5478 <source>Video published.</source>
5479 <target>Video gepubliceerd.</target>
5480 <context-group name="null">
5481 <context context-type="linenumber">1</context>
5482 </context-group>
5483 </trans-unit>
5484 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187">
5485 <source>Video updated.</source>
5486 <target>Video geupdate.</target>
5487 <context-group name="null">
5488 <context context-type="linenumber">1</context>
5489 </context-group>
5490 </trans-unit>
5491 <trans-unit id="aeb61b334cac080733c3e03766165a346bbf42fd">
5492 <source> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> replies will be deleted too.</source>
5493 <target> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> reacties zullen ook worden verwijdert.</target>
5494 <context-group name="null">
5495 <context context-type="linenumber">1</context>
5496 </context-group>
5497 </trans-unit>
5498 <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
5499 <source>Video blacklisted.</source>
5500 <target>Video op de zwarte lijst.</target>
5501 <context-group name="null">
5502 <context context-type="linenumber">1</context>
5503 </context-group>
5504 </trans-unit>
5505 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
5506 <source>Copied</source>
5507 <target>Gekopieerd</target>
5508 <context-group name="null">
5509 <context context-type="linenumber">1</context>
5510 </context-group>
5511 </trans-unit>
5512 <trans-unit id="fa2601e52cbf5725a13d33fe14458823b882ea50">
5513 <source>Video reported.</source>
5514 <target>Video gerapporteerd.</target>
5515 <context-group name="null">
5516 <context context-type="linenumber">1</context>
5517 </context-group>
5518 </trans-unit>
5519 <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
5520 <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
5521 <target>Start op <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
5522 <context-group name="null">
5523 <context context-type="linenumber">1</context>
5524 </context-group>
5525 </trans-unit>
5526 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5527 <source>Like the video</source>
5528 <target>Like de video</target>
5529 <context-group name="null">
5530 <context context-type="linenumber">1</context>
5531 </context-group>
5532 </trans-unit>
5533 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5534 <source>Dislike the video</source>
5535 <target>Dislike de video</target>
5536 <context-group name="null">
5537 <context context-type="linenumber">1</context>
5538 </context-group>
5539 </trans-unit>
5540 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5541 <source>Do you really want to delete this video?</source>
5542 <target>Weet je zeker dat je de video wil verwijderen?</target>
5543 <context-group name="null">
5544 <context context-type="linenumber">1</context>
5545 </context-group>
5546 </trans-unit>
5547 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
5548 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
5549 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</target>
5550 <context-group name="null">
5551 <context context-type="linenumber">1</context>
5552 </context-group>
5553 </trans-unit>
5554 <trans-unit id="ed013c2c29216501c688e9cb5f3a1c9fd9147b71">
5555 <source>This video contains mature or explicit content. Are you sure you want to watch it?</source>
5556 <target>Deze video bevat volwassen of expliciete inhoud. Weet je zeker dat je hem wilt kijken?</target>
1325 <context-group name="null"> 5557 <context-group name="null">
1326 <context context-type="linenumber">1</context> 5558 <context context-type="linenumber">1</context>
1327 </context-group> 5559 </context-group>
1328 </trans-unit> 5560 </trans-unit>
1329 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5561 <trans-unit id="5ba3d522e4146eefcbd5c222247c1e2423d27cd8">
1330 <source>Display name must be at least 3 characters long.</source> 5562 <source>Mature or explicit content</source>
1331 <target>Je weergavenaam moet minstens 3 tekens lang zijn.</target> 5563 <target>Volwassen of expliciete content</target>
1332 <context-group name="null"> 5564 <context-group name="null">
1333 <context context-type="linenumber">1</context> 5565 <context context-type="linenumber">1</context>
1334 </context-group> 5566 </context-group>
1335 </trans-unit> 5567 </trans-unit>
1336 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5568 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
1337 <source>Display name cannot be more than 120 characters long.</source> 5569 <source>Videos from your subscriptions</source>
1338 <target>Je weergavenaam kan niet langer dan 120 tekens zijn.</target> 5570 <target>Videos van jou abonnementen</target>
1339 <context-group name="null"> 5571 <context-group name="null">
1340 <context context-type="linenumber">1</context> 5572 <context context-type="linenumber">1</context>
1341 </context-group> 5573 </context-group>
diff --git a/client/src/locale/target/angular_oc.xml b/client/src/locale/target/angular_oc.xml
index 5cfebd4e3..106de7d5e 100644
--- a/client/src/locale/target/angular_oc.xml
+++ b/client/src/locale/target/angular_oc.xml
@@ -227,11 +227,76 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>Avètz pas cap de notificacion.</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publicat una <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nòva vidèo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
249 <source>
250 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
251 </source>
252 <target>
253 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a comentat vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">23</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
262 </source>
263 <target>
264 Vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> es publicada
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">27</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
271 <source>
272 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
273 </source>
274 <target>
275 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">57</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
282 <source>Unlisted</source>
283 <target>Pas listada</target>
284 <context-group name="null">
285 <context context-type="linenumber">10</context>
286 </context-group>
287 </trans-unit>
288 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
289 <source>Private</source>
290 <target>Privada</target>
291 <context-group name="null">
292 <context context-type="linenumber">11</context>
293 </context-group>
294 </trans-unit>
230 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 295 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
231 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 296 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
232 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizacions</target> 297 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizacions</target>
233 <context-group name="null"> 298 <context-group name="null">
234 <context context-type="linenumber">13</context> 299 <context context-type="linenumber">16</context>
235 </context-group> 300 </context-group>
236 </trans-unit> 301 </trans-unit>
237 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 302 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -245,7 +310,7 @@
245 <source>Edit</source> 310 <source>Edit</source>
246 <target>Modificar</target> 311 <target>Modificar</target>
247 <context-group name="null"> 312 <context-group name="null">
248 <context context-type="linenumber">5</context> 313 <context context-type="linenumber">1</context>
249 </context-group> 314 </context-group>
250 </trans-unit> 315 </trans-unit>
251 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 316 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -269,6 +334,27 @@
269 <context context-type="linenumber">19</context> 334 <context context-type="linenumber">19</context>
270 </context-group> 335 </context-group>
271 </trans-unit> 336 </trans-unit>
337 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
338 <source>
339 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
340 Subscribe
341 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
342 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
343 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
344 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
345 </source>
346 <target>
347 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
348 S’abonar
349 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
350 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
351 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
352 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
353 </target>
354 <context-group name="null">
355 <context context-type="linenumber">5</context>
356 </context-group>
357 </trans-unit>
272 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8"> 358 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
273 <source> 359 <source>
274 Unsubscribe 360 Unsubscribe
@@ -280,6 +366,20 @@
280 <context context-type="linenumber">18</context> 366 <context context-type="linenumber">18</context>
281 </context-group> 367 </context-group>
282 </trans-unit> 368 </trans-unit>
369 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
370 <source>Using an ActivityPub account</source>
371 <target>En utilizant un compte ActivityPub</target>
372 <context-group name="null">
373 <context context-type="linenumber">36</context>
374 </context-group>
375 </trans-unit>
376 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
377 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
378 <target>S’abonar amb un compte sus <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
379 <context-group name="null">
380 <context context-type="linenumber">39</context>
381 </context-group>
382 </trans-unit>
283 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0"> 383 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
284 <source>Subscribe with your local account</source> 384 <source>Subscribe with your local account</source>
285 <target>S’abonar amb lo compte local</target> 385 <target>S’abonar amb lo compte local</target>
@@ -287,6 +387,13 @@
287 <context context-type="linenumber">40</context> 387 <context context-type="linenumber">40</context>
288 </context-group> 388 </context-group>
289 </trans-unit> 389 </trans-unit>
390 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
391 <source>Subscribe with a Mastodon account:</source>
392 <target>S’abonar amb un compte Mastodon :</target>
393 <context-group name="null">
394 <context context-type="linenumber">43</context>
395 </context-group>
396 </trans-unit>
290 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1"> 397 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
291 <source>Using a syndication feed</source> 398 <source>Using a syndication feed</source>
292 <target>En utilizant un fil sindicat</target> 399 <target>En utilizant un fil sindicat</target>
@@ -301,11 +408,38 @@
301 <context context-type="linenumber">49</context> 408 <context context-type="linenumber">49</context>
302 </context-group> 409 </context-group>
303 </trans-unit> 410 </trans-unit>
411 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
412 <source>
413 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
414 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
415 </source>
416 <target>
417 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>S’abonar a distància<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
418 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Interaccion a distància<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
419 </target>
420 <context-group name="null">
421 <context context-type="linenumber">10</context>
422 </context-group>
423 </trans-unit>
424 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
425 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
426 <target>Podètz vos abonar a aquesta cadena via qualque siá instància compatibla amb ActivityPub. Per las instàncias Mastodon o Pleroma podètz picar l’URL de la cadena dins la barra de recèrca e vos i abonar enlà.</target>
427 <context-group name="null">
428 <context context-type="linenumber">17</context>
429 </context-group>
430 </trans-unit>
431 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
432 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
433 <target>Podètz interagir amb aquò via qualque siá instància compatibla ActivityPub. Per las instàncias Mastodon o Pleroma podètz picar l’URL de la cadena dins la barra de recèrca e podètz interagir enlà.</target>
434 <context-group name="null">
435 <context context-type="linenumber">22</context>
436 </context-group>
437 </trans-unit>
304 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 438 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
305 <source>Video quota</source> 439 <source>Video quota</source>
306 <target>Quòta vidèo</target> 440 <target>Quòta vidèo</target>
307 <context-group name="null"> 441 <context-group name="null">
308 <context context-type="linenumber">19</context> 442 <context context-type="linenumber">42</context>
309 </context-group> 443 </context-group>
310 </trans-unit> 444 </trans-unit>
311 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 445 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -319,6 +453,45 @@
319 <context context-type="linenumber">14</context> 453 <context context-type="linenumber">14</context>
320 </context-group> 454 </context-group>
321 </trans-unit> 455 </trans-unit>
456 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
457 <source>Ban</source>
458 <target>Fòrabandir</target>
459 <context-group name="null">
460 <context context-type="linenumber">3</context>
461 </context-group>
462 </trans-unit>
463 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
464 <source>Reason...</source>
465 <target>Rason...</target>
466 <context-group name="null">
467 <context context-type="linenumber">11</context>
468 </context-group>
469 </trans-unit>
470 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
471 <source>
472 A banned user will no longer be able to login.
473 </source>
474 <target>
475 Un utilizaire fòrabandit poirà pas mai se connectar.
476 </target>
477 <context-group name="null">
478 <context context-type="linenumber">17</context>
479 </context-group>
480 </trans-unit>
481 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
482 <source>Ban this user</source>
483 <target>Fòrabandir aqueste utilizaire</target>
484 <context-group name="null">
485 <context context-type="linenumber">25</context>
486 </context-group>
487 </trans-unit>
488 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
489 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
490 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
491 <context-group name="null">
492 <context context-type="linenumber">11</context>
493 </context-group>
494 </trans-unit>
322 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 495 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
323 <source> 496 <source>
324 Login 497 Login
@@ -384,7 +557,7 @@
384 <source>Password</source> 557 <source>Password</source>
385 <target>Senhal</target> 558 <target>Senhal</target>
386 <context-group name="null"> 559 <context-group name="null">
387 <context context-type="linenumber">12</context> 560 <context context-type="linenumber">13</context>
388 </context-group> 561 </context-group>
389 </trans-unit> 562 </trans-unit>
390 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 563 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -398,7 +571,7 @@
398 <source>Login</source> 571 <source>Login</source>
399 <target>Connexion</target> 572 <target>Connexion</target>
400 <context-group name="null"> 573 <context-group name="null">
401 <context context-type="linenumber">38</context> 574 <context context-type="linenumber">36</context>
402 </context-group> 575 </context-group>
403 </trans-unit> 576 </trans-unit>
404 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 577 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -426,7 +599,7 @@
426 <source>Send me an email to reset my password</source> 599 <source>Send me an email to reset my password</source>
427 <target>Me mandar un corrièl per reïnicializar lo senhal</target> 600 <target>Me mandar un corrièl per reïnicializar lo senhal</target>
428 <context-group name="null"> 601 <context-group name="null">
429 <context context-type="linenumber">75</context> 602 <context context-type="linenumber">80</context>
430 </context-group> 603 </context-group>
431 </trans-unit> 604 </trans-unit>
432 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 605 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -481,28 +654,28 @@
481 <source>Example: jane_doe</source> 654 <source>Example: jane_doe</source>
482 <target>Exemple : joan_do</target> 655 <target>Exemple : joan_do</target>
483 <context-group name="null"> 656 <context-group name="null">
484 <context context-type="linenumber">16</context> 657 <context context-type="linenumber">17</context>
485 </context-group> 658 </context-group>
486 </trans-unit> 659 </trans-unit>
487 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 660 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
488 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 661 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
489 <target>Ai legit e soi d’acòrdi amb los &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Tèrmes&lt;/a&gt; d’aquesta instància</target> 662 <target>Ai almens 16 ans e accepti las &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Conditions&lt;/a&gt; d’aquesta instància</target>
490 <context-group name="null"> 663 <context-group name="null">
491 <context context-type="linenumber">54</context> 664 <context context-type="linenumber">55</context>
492 </context-group> 665 </context-group>
493 </trans-unit> 666 </trans-unit>
494 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 667 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
495 <source>Signup</source> 668 <source>Signup</source>
496 <target>Inscripcion</target> 669 <target>Inscripcion</target>
497 <context-group name="null"> 670 <context-group name="null">
498 <context context-type="linenumber">88</context> 671 <context context-type="linenumber">78</context>
499 </context-group> 672 </context-group>
500 </trans-unit> 673 </trans-unit>
501 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 674 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
502 <source>Features found on this instance</source> 675 <source>Features found on this instance</source>
503 <target>Foncionalitats trobadas dins aquesta instància</target> 676 <target>Foncionalitats trobadas dins aquesta instància</target>
504 <context-group name="null"> 677 <context-group name="null">
505 <context context-type="linenumber">66</context> 678 <context context-type="linenumber">67</context>
506 </context-group> 679 </context-group>
507 </trans-unit> 680 </trans-unit>
508 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 681 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -523,9 +696,15 @@
523 <context context-type="linenumber">6</context> 696 <context context-type="linenumber">6</context>
524 </context-group> 697 </context-group>
525 </trans-unit> 698 </trans-unit>
526 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 699 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
527 <source>Filters</source> 700 <source>
528 <target>Filtres</target> 701 Filters
702 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
703 </source>
704 <target>
705 Filtres
706 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
707 </target>
529 <context-group name="null"> 708 <context-group name="null">
530 <context context-type="linenumber">16</context> 709 <context context-type="linenumber">16</context>
531 </context-group> 710 </context-group>
@@ -538,28 +717,39 @@
538 Cap de resultats 717 Cap de resultats
539 </target> 718 </target>
540 <context-group name="null"> 719 <context-group name="null">
541 <context context-type="linenumber">25</context> 720 <context context-type="linenumber">28</context>
542 </context-group> 721 </context-group>
543 </trans-unit> 722 </trans-unit>
544 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 723 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
545 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 724 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
546 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonats</target> 725 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonats</target>
547 <context-group name="null"> 726 <context-group name="null">
548 <context context-type="linenumber">41</context> 727 <context context-type="linenumber">44</context>
549 </context-group> 728 </context-group>
550 </trans-unit> 729 </trans-unit>
551 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 730 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
552 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 731 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
553 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizacions</target> 732 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizacions</target>
554 <context-group name="null"> 733 <context-group name="null">
555 <context context-type="linenumber">52</context> 734 <context context-type="linenumber">55</context>
556 </context-group> 735 </context-group>
557 </trans-unit> 736 </trans-unit>
558 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 737 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
559 <source>Change the language</source> 738 <source>Change the language</source>
560 <target>Cambiar la lenga</target> 739 <target>Cambiar la lenga</target>
561 <context-group name="null"> 740 <context-group name="null">
562 <context context-type="linenumber">88</context> 741 <context context-type="linenumber">86</context>
742 </context-group>
743 </trans-unit>
744 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
745 <source>
746 Help to translate PeerTube!
747 </source>
748 <target>
749 Ajudatz a traduire PeerTube !
750 </target>
751 <context-group name="null">
752 <context context-type="linenumber">8</context>
563 </context-group> 753 </context-group>
564 </trans-unit> 754 </trans-unit>
565 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 755 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -570,7 +760,7 @@
570 Mon perfil public 760 Mon perfil public
571 </target> 761 </target>
572 <context-group name="null"> 762 <context-group name="null">
573 <context context-type="linenumber">18</context> 763 <context context-type="linenumber">16</context>
574 </context-group> 764 </context-group>
575 </trans-unit> 765 </trans-unit>
576 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 766 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -581,7 +771,7 @@
581 Mon compte 771 Mon compte
582 </target> 772 </target>
583 <context-group name="null"> 773 <context-group name="null">
584 <context context-type="linenumber">22</context> 774 <context context-type="linenumber">20</context>
585 </context-group> 775 </context-group>
586 </trans-unit> 776 </trans-unit>
587 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 777 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -592,7 +782,7 @@
592 Mas vidèos 782 Mas vidèos
593 </target> 783 </target>
594 <context-group name="null"> 784 <context-group name="null">
595 <context context-type="linenumber">26</context> 785 <context context-type="linenumber">24</context>
596 </context-group> 786 </context-group>
597 </trans-unit> 787 </trans-unit>
598 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 788 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -603,14 +793,14 @@
603 Desconnexion 793 Desconnexion
604 </target> 794 </target>
605 <context-group name="null"> 795 <context-group name="null">
606 <context context-type="linenumber">30</context> 796 <context context-type="linenumber">28</context>
607 </context-group> 797 </context-group>
608 </trans-unit> 798 </trans-unit>
609 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 799 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
610 <source>Create an account</source> 800 <source>Create an account</source>
611 <target>Crear un compte</target> 801 <target>Crear un compte</target>
612 <context-group name="null"> 802 <context-group name="null">
613 <context context-type="linenumber">39</context> 803 <context context-type="linenumber">37</context>
614 </context-group> 804 </context-group>
615 </trans-unit> 805 </trans-unit>
616 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 806 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -624,49 +814,49 @@
624 <source>Subscriptions</source> 814 <source>Subscriptions</source>
625 <target>Abonaments</target> 815 <target>Abonaments</target>
626 <context-group name="null"> 816 <context-group name="null">
627 <context context-type="linenumber">47</context> 817 <context context-type="linenumber">45</context>
628 </context-group> 818 </context-group>
629 </trans-unit> 819 </trans-unit>
630 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 820 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
631 <source>Overview</source> 821 <source>Overview</source>
632 <target>Apercebut</target> 822 <target>Apercebut</target>
633 <context-group name="null"> 823 <context-group name="null">
634 <context context-type="linenumber">52</context> 824 <context context-type="linenumber">50</context>
635 </context-group> 825 </context-group>
636 </trans-unit> 826 </trans-unit>
637 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 827 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
638 <source>Trending</source> 828 <source>Trending</source>
639 <target>Tendéncias</target> 829 <target>Tendéncias</target>
640 <context-group name="null"> 830 <context-group name="null">
641 <context context-type="linenumber">57</context> 831 <context context-type="linenumber">55</context>
642 </context-group> 832 </context-group>
643 </trans-unit> 833 </trans-unit>
644 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 834 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
645 <source>Recently added</source> 835 <source>Recently added</source>
646 <target>Apondons recents</target> 836 <target>Apondons recents</target>
647 <context-group name="null"> 837 <context-group name="null">
648 <context context-type="linenumber">62</context> 838 <context context-type="linenumber">60</context>
649 </context-group> 839 </context-group>
650 </trans-unit> 840 </trans-unit>
651 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 841 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
652 <source>Local</source> 842 <source>Local</source>
653 <target>Localas</target> 843 <target>Localas</target>
654 <context-group name="null"> 844 <context-group name="null">
655 <context context-type="linenumber">67</context> 845 <context context-type="linenumber">65</context>
656 </context-group> 846 </context-group>
657 </trans-unit> 847 </trans-unit>
658 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 848 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
659 <source>More</source> 849 <source>More</source>
660 <target>Mai</target> 850 <target>Mai</target>
661 <context-group name="null"> 851 <context-group name="null">
662 <context context-type="linenumber">72</context> 852 <context context-type="linenumber">70</context>
663 </context-group> 853 </context-group>
664 </trans-unit> 854 </trans-unit>
665 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 855 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
666 <source>Administration</source> 856 <source>Administration</source>
667 <target>Administracion</target> 857 <target>Administracion</target>
668 <context-group name="null"> 858 <context-group name="null">
669 <context context-type="linenumber">76</context> 859 <context context-type="linenumber">74</context>
670 </context-group> 860 </context-group>
671 </trans-unit> 861 </trans-unit>
672 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 862 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -680,14 +870,42 @@
680 <source>Show keyboard shortcuts</source> 870 <source>Show keyboard shortcuts</source>
681 <target>Mostrar los acorchis clavièr</target> 871 <target>Mostrar los acorchis clavièr</target>
682 <context-group name="null"> 872 <context-group name="null">
683 <context context-type="linenumber">91</context> 873 <context context-type="linenumber">89</context>
684 </context-group> 874 </context-group>
685 </trans-unit> 875 </trans-unit>
686 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 876 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
687 <source>Toggle dark interface</source> 877 <source>Toggle dark interface</source>
688 <target>Passar a l’interfàcia escura</target> 878 <target>Passar a l’interfàcia escura</target>
689 <context-group name="null"> 879 <context-group name="null">
690 <context context-type="linenumber">94</context> 880 <context context-type="linenumber">92</context>
881 </context-group>
882 </trans-unit>
883 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
884 <source>View your notifications</source>
885 <target>Veire vòstras notificacions</target>
886 <context-group name="null">
887 <context context-type="linenumber">3</context>
888 </context-group>
889 </trans-unit>
890 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
891 <source>Notifications</source>
892 <target>Notificacions</target>
893 <context-group name="null">
894 <context context-type="linenumber">10</context>
895 </context-group>
896 </trans-unit>
897 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
898 <source>Update your notification preferences</source>
899 <target>Actualizar vòstras preferéncias de notificacion</target>
900 <context-group name="null">
901 <context context-type="linenumber">15</context>
902 </context-group>
903 </trans-unit>
904 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
905 <source>See all your notifications</source>
906 <target>Veire totas vòstras notificacions</target>
907 <context-group name="null">
908 <context context-type="linenumber">22</context>
691 </context-group> 909 </context-group>
692 </trans-unit> 910 </trans-unit>
693 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 911 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -788,11 +1006,18 @@
788 <context context-type="linenumber">94</context> 1006 <context context-type="linenumber">94</context>
789 </context-group> 1007 </context-group>
790 </trans-unit> 1008 </trans-unit>
1009 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
1010 <source>Display unlisted and private videos</source>
1011 <target>Mostrar las vidèos pas listadas e las privadas</target>
1012 <context-group name="null">
1013 <context context-type="linenumber">14</context>
1014 </context-group>
1015 </trans-unit>
791 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1016 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
792 <source>No results.</source> 1017 <source>No results.</source>
793 <target>Cap de resultat</target> 1018 <target>Cap de resultat</target>
794 <context-group name="null"> 1019 <context-group name="null">
795 <context context-type="linenumber">7</context> 1020 <context context-type="linenumber">20</context>
796 </context-group> 1021 </context-group>
797 </trans-unit> 1022 </trans-unit>
798 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 1023 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -806,6 +1031,17 @@
806 <context context-type="linenumber">6</context> 1031 <context context-type="linenumber">6</context>
807 </context-group> 1032 </context-group>
808 </trans-unit> 1033 </trans-unit>
1034 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
1035 <source>
1036 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1037 </source>
1038 <target>
1039 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1040 </target>
1041 <context-group name="null">
1042 <context context-type="linenumber">14</context>
1043 </context-group>
1044 </trans-unit>
809 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 1045 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
810 <source> 1046 <source>
811 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 1047 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -829,7 +1065,7 @@
829 <source>Instance</source> 1065 <source>Instance</source>
830 <target>Instància</target> 1066 <target>Instància</target>
831 <context-group name="null"> 1067 <context-group name="null">
832 <context context-type="linenumber">8</context> 1068 <context context-type="linenumber">12</context>
833 </context-group> 1069 </context-group>
834 </trans-unit> 1070 </trans-unit>
835 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 1071 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -839,67 +1075,78 @@
839 <context context-type="linenumber">7</context> 1075 <context context-type="linenumber">7</context>
840 </context-group> 1076 </context-group>
841 </trans-unit> 1077 </trans-unit>
842 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1078 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
843 <source> 1079 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
844 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1080 <target>Contactar l’administrator de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
845</source>
846 <target>
847 A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
848</target>
849 <context-group name="null"> 1081 <context-group name="null">
850 <context context-type="linenumber">1</context> 1082 <context context-type="linenumber">3</context>
851 </context-group> 1083 </context-group>
852 </trans-unit> 1084 </trans-unit>
853 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1085 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
854 <source>Description</source> 1086 <source>Your name</source>
855 <target>Descripcion</target> 1087 <target>Vòstre nom</target>
856 <context-group name="null"> 1088 <context-group name="null">
857 <context context-type="linenumber">27</context> 1089 <context context-type="linenumber">11</context>
858 </context-group> 1090 </context-group>
859 </trans-unit> 1091 </trans-unit>
860 <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774"> 1092 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
861 <source>Terms</source> 1093 <source>Your email</source>
862 <target>Tèrmes</target> 1094 <target>Vòstra adreça</target>
863 <context-group name="null"> 1095 <context-group name="null">
864 <context context-type="linenumber">44</context> 1096 <context context-type="linenumber">20</context>
865 </context-group> 1097 </context-group>
866 </trans-unit> 1098 </trans-unit>
867 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1099 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
868 <source>User registration is allowed and</source> 1100 <source>Your message</source>
869 <target>Las inscripcions son autorizadas e</target> 1101 <target>Vòstre messatge</target>
870 <context-group name="null"> 1102 <context-group name="null">
871 <context context-type="linenumber">25</context> 1103 <context context-type="linenumber">29</context>
872 </context-group> 1104 </context-group>
873 </trans-unit> 1105 </trans-unit>
874 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1106 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
875 <source> 1107 <source>
876 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1108 Cancel
877 </source> 1109 </source>
878 <target> 1110 <target>
879 aquesta instància provesís un quòta de basa de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> d’espaci per las vidèos de sos utilizaires. 1111 Anullar
880 </target> 1112 </target>
881 <context-group name="null"> 1113 <context-group name="null">
882 <context context-type="linenumber">27</context> 1114 <context context-type="linenumber">26</context>
883 </context-group> 1115 </context-group>
884 </trans-unit> 1116 </trans-unit>
885 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1117 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
886 <source> 1118 <source>Submit</source>
887 this instance provides unlimited space for the videos of its users. 1119 <target>Mandar</target>
888 </source>
889 <target>
890 aquesta instància fornís un espaci sens limit per las vidèos de sos utilizaires.
891 </target>
892 <context-group name="null"> 1120 <context-group name="null">
893 <context context-type="linenumber">31</context> 1121 <context context-type="linenumber">31</context>
894 </context-group> 1122 </context-group>
895 </trans-unit> 1123 </trans-unit>
896 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1124 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
897 <source> 1125 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
898 User registration is currently not allowed. 1126 <target>A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
899 </source>
900 <target>Las inscriptions son pas pel moment possiblas</target>
901 <context-group name="null"> 1127 <context-group name="null">
902 <context context-type="linenumber">36</context> 1128 <context context-type="linenumber">4</context>
1129 </context-group>
1130 </trans-unit>
1131 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
1132 <source>Description</source>
1133 <target>Descripcion</target>
1134 <context-group name="null">
1135 <context context-type="linenumber">27</context>
1136 </context-group>
1137 </trans-unit>
1138 <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774">
1139 <source>Terms</source>
1140 <target>Tèrmes</target>
1141 <context-group name="null">
1142 <context context-type="linenumber">39</context>
1143 </context-group>
1144 </trans-unit>
1145 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1146 <source>User registration is allowed and</source>
1147 <target>Las inscripcions son autorizadas e</target>
1148 <context-group name="null">
1149 <context context-type="linenumber">29</context>
903 </context-group> 1150 </context-group>
904 </trans-unit> 1151 </trans-unit>
905 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1152 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -988,7 +1235,7 @@
988 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot) 1235 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
989 </source> 1236 </source>
990 <target> 1237 <target>
991 Una requèsta HTTP deu èsser enviada a cada traçadors per cada vidèo d’espiar. 1238 Cada traçador deu recebre una requèsta HTTP per cada vidèo d’espiar.
992 Se volèm espiar totas las vidèo de PeerTube, avèm d’enviar tantas requèstas qu’i a de vidèos (doncas potencialament un molon) 1239 Se volèm espiar totas las vidèo de PeerTube, avèm d’enviar tantas requèstas qu’i a de vidèos (doncas potencialament un molon)
993 </target> 1240 </target>
994 <context-group name="null"> 1241 <context-group name="null">
@@ -1001,7 +1248,7 @@
1001 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm 1248 For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm
1002 </source> 1249 </source>
1003 <target>Per cada requèsta enviada, lo traçador tòrna un nombre limitat de pars a l’azard. 1250 <target>Per cada requèsta enviada, lo traçador tòrna un nombre limitat de pars a l’azard.
1004 Per cada instància s’i a 1000 pars per l’eissam e lo traçador envia pas que 20 pars per requèsta, cal almens 50 requèstas per conéisser totes los pars del eissam</target> 1251 Per cada instància s’i a 1000 pars per l’eissam e lo traçador envia pas que 20 pars per requèsta, cal almens 50 requèstas per conéisser totes los pars de l’eissam</target>
1005 <context-group name="null"> 1252 <context-group name="null">
1006 <context context-type="linenumber">38</context> 1253 <context context-type="linenumber">38</context>
1007 </context-group> 1254 </context-group>
@@ -1011,7 +1258,7 @@
1011 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour 1258 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
1012 </source> 1259 </source>
1013 <target> 1260 <target>
1014 Aquelas requèstas an d’èsser enviadas regularament per saber qual commença/arrèstar d’agachar una vidèo. Es aisit de detectar aquel tipe de compòrtament 1261 Aquelas requèstas an d’èsser enviadas regularament per saber qual commença/arrèsta d’agachar una vidèo. Es aisit de detectar aquel tipe de compòrtament
1015 </target> 1262 </target>
1016 <context-group name="null"> 1263 <context-group name="null">
1017 <context context-type="linenumber">43</context> 1264 <context context-type="linenumber">43</context>
@@ -1118,15 +1365,15 @@
1118 <context context-type="linenumber">83</context> 1365 <context context-type="linenumber">83</context>
1119 </context-group> 1366 </context-group>
1120 </trans-unit> 1367 </trans-unit>
1121 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1368 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1122 <source> 1369 <source>
1123 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1370 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1124 In the meantime, we want to test different ideas related to this issue: 1371 In the meantime, we want to test different ideas related to this issue:
1125 </source> 1372 </source>
1126 <target> 1373 <target>
1127 PeerTube es pas qu’en beta e vòl donar las melhoras contra-mesuras possiblas d’aquí a la sortida de la version establa. 1374 PeerTube es a son començament e vòl fornir las melhoras responsas d’aquí la sortida de la version establa.
1128 D’aquel temps, volèm ensajar diferentas idèas tocant aqueste problèma : 1375 D’aquel temps, volèm ensajar diferentas idèas ligadas a aqueste problèma :
1129 </target> 1376 </target>
1130 <context-group name="null"> 1377 <context-group name="null">
1131 <context context-type="linenumber">85</context> 1378 <context context-type="linenumber">85</context>
1132 </context-group> 1379 </context-group>
@@ -1166,18 +1413,53 @@
1166 <context context-type="linenumber">95</context> 1413 <context context-type="linenumber">95</context>
1167 </context-group> 1414 </context-group>
1168 </trans-unit> 1415 </trans-unit>
1416 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1417 <source>Banned</source>
1418 <target>Fòrabandit</target>
1419 <context-group name="null">
1420 <context context-type="linenumber">12</context>
1421 </context-group>
1422 </trans-unit>
1423 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1424 <source>Muted</source>
1425 <target>Muda</target>
1426 <context-group name="null">
1427 <context context-type="linenumber">13</context>
1428 </context-group>
1429 </trans-unit>
1430 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1431 <source>Muted by your instance</source>
1432 <target>Muda per vòstra instància</target>
1433 <context-group name="null">
1434 <context context-type="linenumber">14</context>
1435 </context-group>
1436 </trans-unit>
1437 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1438 <source>Instance muted</source>
1439 <target>Instància mudas</target>
1440 <context-group name="null">
1441 <context context-type="linenumber">15</context>
1442 </context-group>
1443 </trans-unit>
1444 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1445 <source>Instance muted by your instance</source>
1446 <target>Instàncias mudas per vòstra instància</target>
1447 <context-group name="null">
1448 <context context-type="linenumber">16</context>
1449 </context-group>
1450 </trans-unit>
1169 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1451 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1170 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1452 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1171 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonats</target> 1453 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonats</target>
1172 <context-group name="null"> 1454 <context-group name="null">
1173 <context context-type="linenumber">12</context> 1455 <context context-type="linenumber">24</context>
1174 </context-group> 1456 </context-group>
1175 </trans-unit> 1457 </trans-unit>
1176 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1458 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1177 <source>Video channels</source> 1459 <source>Video channels</source>
1178 <target>Canals vidèo</target> 1460 <target>Canals vidèo</target>
1179 <context-group name="null"> 1461 <context-group name="null">
1180 <context context-type="linenumber">19</context> 1462 <context context-type="linenumber">31</context>
1181 </context-group> 1463 </context-group>
1182 </trans-unit> 1464 </trans-unit>
1183 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1465 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1219,49 +1501,49 @@
1219 <source>Short description</source> 1501 <source>Short description</source>
1220 <target>Descripcion corta</target> 1502 <target>Descripcion corta</target>
1221 <context-group name="null"> 1503 <context-group name="null">
1222 <context context-type="linenumber">22</context> 1504 <context context-type="linenumber">21</context>
1223 </context-group> 1505 </context-group>
1224 </trans-unit> 1506 </trans-unit>
1225 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1507 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1226 <source>Default client route</source> 1508 <source>Default client route</source>
1227 <target>Rota del client per defaut</target> 1509 <target>Rota del client per defaut</target>
1228 <context-group name="null"> 1510 <context-group name="null">
1229 <context context-type="linenumber">55</context> 1511 <context context-type="linenumber">48</context>
1230 </context-group> 1512 </context-group>
1231 </trans-unit> 1513 </trans-unit>
1232 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1514 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1233 <source>Videos Overview</source> 1515 <source>Videos Overview</source>
1234 <target>Apercebuts de las vidèos</target> 1516 <target>Apercebuts de las vidèos</target>
1235 <context-group name="null"> 1517 <context-group name="null">
1236 <context context-type="linenumber">58</context> 1518 <context context-type="linenumber">51</context>
1237 </context-group> 1519 </context-group>
1238 </trans-unit> 1520 </trans-unit>
1239 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1521 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1240 <source>Videos Trending</source> 1522 <source>Videos Trending</source>
1241 <target>Vidèos a la mòda </target> 1523 <target>Vidèos a la mòda </target>
1242 <context-group name="null"> 1524 <context-group name="null">
1243 <context context-type="linenumber">59</context> 1525 <context context-type="linenumber">52</context>
1244 </context-group> 1526 </context-group>
1245 </trans-unit> 1527 </trans-unit>
1246 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1528 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1247 <source>Videos Recently Added</source> 1529 <source>Videos Recently Added</source>
1248 <target>Vidèos ajustadas recentament</target> 1530 <target>Vidèos ajustadas recentament</target>
1249 <context-group name="null"> 1531 <context-group name="null">
1250 <context context-type="linenumber">60</context> 1532 <context context-type="linenumber">53</context>
1251 </context-group> 1533 </context-group>
1252 </trans-unit> 1534 </trans-unit>
1253 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1535 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1254 <source>Local videos</source> 1536 <source>Local videos</source>
1255 <target>Vidèos localas</target> 1537 <target>Vidèos localas</target>
1256 <context-group name="null"> 1538 <context-group name="null">
1257 <context context-type="linenumber">61</context> 1539 <context context-type="linenumber">54</context>
1258 </context-group> 1540 </context-group>
1259 </trans-unit> 1541 </trans-unit>
1260 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1542 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1261 <source>Policy on videos containing sensitive content</source> 1543 <source>Policy on videos containing sensitive content</source>
1262 <target>Politica tocant las vidèos amb de contengut sensible</target> 1544 <target>Politica tocant las vidèos amb de contengut sensible</target>
1263 <context-group name="null"> 1545 <context-group name="null">
1264 <context context-type="linenumber">70</context> 1546 <context context-type="linenumber">61</context>
1265 </context-group> 1547 </context-group>
1266 </trans-unit> 1548 </trans-unit>
1267 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1549 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1296,21 +1578,42 @@
1296 <source>Signup enabled</source> 1578 <source>Signup enabled</source>
1297 <target>Inscripcions activadas</target> 1579 <target>Inscripcions activadas</target>
1298 <context-group name="null"> 1580 <context-group name="null">
1299 <context context-type="linenumber">92</context> 1581 <context context-type="linenumber">84</context>
1300 </context-group> 1582 </context-group>
1301 </trans-unit> 1583 </trans-unit>
1302 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1584 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1303 <source>Signup requires email verification</source> 1585 <source>Signup requires email verification</source>
1304 <target>L’inscripcion demanda una verificacion d’adreça electronica</target> 1586 <target>L’inscripcion demanda una verificacion d’adreça electronica</target>
1305 <context-group name="null"> 1587 <context-group name="null">
1306 <context context-type="linenumber">97</context> 1588 <context context-type="linenumber">91</context>
1307 </context-group> 1589 </context-group>
1308 </trans-unit> 1590 </trans-unit>
1309 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1591 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1310 <source>Signup limit</source> 1592 <source>Signup limit</source>
1311 <target>Limit d’inscripcions</target> 1593 <target>Limit d’inscripcions</target>
1312 <context-group name="null"> 1594 <context-group name="null">
1313 <context context-type="linenumber">101</context> 1595 <context context-type="linenumber">96</context>
1596 </context-group>
1597 </trans-unit>
1598 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1599 <source>Users</source>
1600 <target>Utilizaires</target>
1601 <context-group name="null">
1602 <context context-type="linenumber">105</context>
1603 </context-group>
1604 </trans-unit>
1605 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1606 <source>User default video quota</source>
1607 <target>Quòta per defaut per utilizaire</target>
1608 <context-group name="null">
1609 <context context-type="linenumber">109</context>
1610 </context-group>
1611 </trans-unit>
1612 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1613 <source>User default daily upload limit</source>
1614 <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
1615 <context-group name="null">
1616 <context context-type="linenumber">121</context>
1314 </context-group> 1617 </context-group>
1315 </trans-unit> 1618 </trans-unit>
1316 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1619 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1320,53 +1623,32 @@
1320 <context context-type="linenumber">42</context> 1623 <context context-type="linenumber">42</context>
1321 </context-group> 1624 </context-group>
1322 </trans-unit> 1625 </trans-unit>
1323 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1626 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1324 <source>Video import with HTTP enabled</source> 1627 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1325 <target>Import vidèo amb HTTP activat</target> 1628 <target>Import vidèo amb URL HTTP (per exemple YouTube) activat</target>
1326 <context-group name="null"> 1629 <context-group name="null">
1327 <context context-type="linenumber">115</context> 1630 <context context-type="linenumber">141</context>
1328 </context-group> 1631 </context-group>
1329 </trans-unit> 1632 </trans-unit>
1330 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1633 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1331 <source>Video import with a torrent file or a magnet URI enabled</source> 1634 <source>Video import with a torrent file or a magnet URI enabled</source>
1332 <target>Import de vidèos via un fichièr torretn o un magnet URI activat</target> 1635 <target>Import de vidèos via un fichièr torretn o un magnet URI activat</target>
1333 <context-group name="null"> 1636 <context-group name="null">
1334 <context context-type="linenumber">120</context> 1637 <context context-type="linenumber">148</context>
1335 </context-group> 1638 </context-group>
1336 </trans-unit> 1639 </trans-unit>
1337 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1640 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1338 <source>Administrator</source> 1641 <source>Administrator</source>
1339 <target>Administrator</target> 1642 <target>Administrator</target>
1340 <context-group name="null"> 1643 <context-group name="null">
1341 <context context-type="linenumber">123</context> 1644 <context context-type="linenumber">155</context>
1342 </context-group> 1645 </context-group>
1343 </trans-unit> 1646 </trans-unit>
1344 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1647 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1345 <source>Admin email</source> 1648 <source>Admin email</source>
1346 <target>Adreça de l’admin</target> 1649 <target>Adreça de l’admin</target>
1347 <context-group name="null"> 1650 <context-group name="null">
1348 <context context-type="linenumber">126</context> 1651 <context context-type="linenumber">158</context>
1349 </context-group>
1350 </trans-unit>
1351 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1352 <source>Users</source>
1353 <target>Utilizaires</target>
1354 <context-group name="null">
1355 <context context-type="linenumber">136</context>
1356 </context-group>
1357 </trans-unit>
1358 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1359 <source>User default video quota</source>
1360 <target>Quòta per defaut per utilizaire</target>
1361 <context-group name="null">
1362 <context context-type="linenumber">139</context>
1363 </context-group>
1364 </trans-unit>
1365 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1366 <source>User default daily upload limit</source>
1367 <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
1368 <context-group name="null">
1369 <context context-type="linenumber">153</context>
1370 </context-group> 1652 </context-group>
1371 </trans-unit> 1653 </trans-unit>
1372 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1654 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1380,70 +1662,70 @@
1380 <source>Twitter</source> 1662 <source>Twitter</source>
1381 <target>Twitter</target> 1663 <target>Twitter</target>
1382 <context-group name="null"> 1664 <context-group name="null">
1383 <context context-type="linenumber">170</context> 1665 <context context-type="linenumber">178</context>
1384 </context-group> 1666 </context-group>
1385 </trans-unit> 1667 </trans-unit>
1386 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1668 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1387 <source>Your Twitter username</source> 1669 <source>Your Twitter username</source>
1388 <target>Vòstre nom d’utilizaire Twitter</target> 1670 <target>Vòstre nom d’utilizaire Twitter</target>
1389 <context-group name="null"> 1671 <context-group name="null">
1390 <context context-type="linenumber">173</context> 1672 <context context-type="linenumber">184</context>
1391 </context-group> 1673 </context-group>
1392 </trans-unit> 1674 </trans-unit>
1393 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1675 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1394 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1676 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1395 <target>Indica lo compte Twitter del site o de la plataforma ont lo contengut foguèt publicat.</target> 1677 <target>Indica lo compte Twitter del site o de la plataforma ont lo contengut foguèt publicat.</target>
1396 <context-group name="null"> 1678 <context-group name="null">
1397 <context context-type="linenumber">176</context> 1679 <context context-type="linenumber">187</context>
1398 </context-group> 1680 </context-group>
1399 </trans-unit> 1681 </trans-unit>
1400 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1682 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1401 <source>Instance whitelisted by Twitter</source> 1683 <source>Instance whitelisted by Twitter</source>
1402 <target>Instàncias en lista blanca per Twitter</target> 1684 <target>Instàncias en lista blanca per Twitter</target>
1403 <context-group name="null"> 1685 <context-group name="null">
1404 <context context-type="linenumber">189</context> 1686 <context context-type="linenumber">199</context>
1405 </context-group> 1687 </context-group>
1406 </trans-unit> 1688 </trans-unit>
1407 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1689 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1408 <source>Services</source> 1690 <source>Services</source>
1409 <target>Servicis</target> 1691 <target>Servicis</target>
1410 <context-group name="null"> 1692 <context-group name="null">
1411 <context context-type="linenumber">168</context> 1693 <context context-type="linenumber">176</context>
1412 </context-group> 1694 </context-group>
1413 </trans-unit> 1695 </trans-unit>
1414 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1696 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1415 <source>Transcoding</source> 1697 <source>Transcoding</source>
1416 <target>Transcodatge</target> 1698 <target>Transcodatge</target>
1417 <context-group name="null"> 1699 <context-group name="null">
1418 <context context-type="linenumber">200</context> 1700 <context context-type="linenumber">215</context>
1419 </context-group> 1701 </context-group>
1420 </trans-unit> 1702 </trans-unit>
1421 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1703 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1422 <source>Transcoding enabled</source> 1704 <source>Transcoding enabled</source>
1423 <target>Transcodatge activat</target> 1705 <target>Transcodatge activat</target>
1424 <context-group name="null"> 1706 <context-group name="null">
1425 <context context-type="linenumber">204</context> 1707 <context context-type="linenumber">221</context>
1426 </context-group> 1708 </context-group>
1427 </trans-unit> 1709 </trans-unit>
1428 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1710 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1429 <source>If you disable transcoding, many videos from your users will not work!</source> 1711 <source>If you disable transcoding, many videos from your users will not work!</source>
1430 <target>Se desactivatz lo transcodatge, un fum de vidèos de vòstres utilizaires foncionaràn pas !</target> 1712 <target>Se desactivatz lo transcodatge, un fum de vidèos de vòstres utilizaires foncionaràn pas !</target>
1431 <context-group name="null"> 1713 <context-group name="null">
1432 <context context-type="linenumber">205</context> 1714 <context context-type="linenumber">222</context>
1433 </context-group> 1715 </context-group>
1434 </trans-unit> 1716 </trans-unit>
1435 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1717 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1436 <source>Transcoding threads</source> 1718 <source>Transcoding threads</source>
1437 <target>Transcodatge dels threads</target> 1719 <target>Transcodatge dels threads</target>
1438 <context-group name="null"> 1720 <context-group name="null">
1439 <context context-type="linenumber">211</context> 1721 <context context-type="linenumber">237</context>
1440 </context-group> 1722 </context-group>
1441 </trans-unit> 1723 </trans-unit>
1442 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1724 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1443 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1725 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1444 <target>Resolucion <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 1726 <target>Resolucion <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
1445 <context-group name="null"> 1727 <context-group name="null">
1446 <context context-type="linenumber">227</context> 1728 <context context-type="linenumber">252</context>
1447 </context-group> 1729 </context-group>
1448 </trans-unit> 1730 </trans-unit>
1449 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1731 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1458,105 +1740,70 @@
1458 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1740 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1459 </target> 1741 </target>
1460 <context-group name="null"> 1742 <context-group name="null">
1461 <context context-type="linenumber">233</context> 1743 <context context-type="linenumber">260</context>
1462 </context-group> 1744 </context-group>
1463 </trans-unit> 1745 </trans-unit>
1464 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1746 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1465 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1747 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1466 <target>Qualques fichièrs son pas federats (apercebuts, legendas). Los recuperam de l’instància d’origina estant e los metèm en cache.</target> 1748 <target>Qualques fichièrs son pas federats (apercebuts, legendas). Los recuperam de l’instància d’origina estant e los metèm en cache.</target>
1467 <context-group name="null"> 1749 <context-group name="null">
1468 <context context-type="linenumber">238</context> 1750 <context context-type="linenumber">265</context>
1469 </context-group> 1751 </context-group>
1470 </trans-unit> 1752 </trans-unit>
1471 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1753 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1472 <source>Previews cache size</source> 1754 <source>Previews cache size</source>
1473 <target>Talha del cache d’apercebut</target> 1755 <target>Talha del cache d’apercebut</target>
1474 <context-group name="null"> 1756 <context-group name="null">
1475 <context context-type="linenumber">243</context> 1757 <context context-type="linenumber">271</context>
1476 </context-group> 1758 </context-group>
1477 </trans-unit> 1759 </trans-unit>
1478 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1760 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1479 <source>Video captions cache size</source> 1761 <source>Video captions cache size</source>
1480 <target>Talha del cache per las legendas de las vidèos</target> 1762 <target>Talha del cache per las legendas de las vidèos</target>
1481 <context-group name="null"> 1763 <context-group name="null">
1482 <context context-type="linenumber">254</context> 1764 <context context-type="linenumber">280</context>
1483 </context-group> 1765 </context-group>
1484 </trans-unit> 1766 </trans-unit>
1485 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1767 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1486 <source>Customizations</source> 1768 <source>Customizations</source>
1487 <target>Personalizacions</target> 1769 <target>Personalizacions</target>
1488 <context-group name="null"> 1770 <context-group name="null">
1489 <context context-type="linenumber">264</context> 1771 <context context-type="linenumber">289</context>
1490 </context-group> 1772 </context-group>
1491 </trans-unit> 1773 </trans-unit>
1492 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1774 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1493 <source>JavaScript</source> 1775 <source>JavaScript</source>
1494 <target>JavaScript</target> 1776 <target>JavaScript</target>
1495 <context-group name="null"> 1777 <context-group name="null">
1496 <context context-type="linenumber">267</context> 1778 <context context-type="linenumber">294</context>
1497 </context-group> 1779 </context-group>
1498 </trans-unit> 1780 </trans-unit>
1499 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1781 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1500 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1782 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1501 <target>Escrivètz dirèctament de JavaScript còdi.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instància es tròp crana');&lt;/pre&gt;</target> 1783 <target>Escrivètz dirèctament de JavaScript còdi.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instància es tròp crana');&lt;/pre&gt;</target>
1502 <context-group name="null"> 1784 <context-group name="null">
1503 <context context-type="linenumber">270</context> 1785 <context context-type="linenumber">297</context>
1504 </context-group>
1505 </trans-unit>
1506 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1507 <source>
1508 Write directly CSS code. Example:&lt;br /&gt;
1509 &lt;pre&gt;
1510 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1511 background-color: red;
1512 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1513 &lt;/pre&gt;
1514
1515 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1516 &lt;pre&gt;
1517 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1518 color: red;
1519 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1520 &lt;/pre&gt;
1521 </source>
1522 <target>
1523 Escrivètz dirèctament lo còdi CSS. Exemple :&lt;br /&gt;
1524 &lt;pre&gt;
1525 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1526 background-color: red;
1527 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1528 &lt;/pre&gt;
1529
1530 Prefixatz amb &lt;em&gt;#custom-css&lt;/em&gt; per subrecargar los estiles. Exemple :
1531 &lt;pre&gt;
1532 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1533 color: red;
1534 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1535 &lt;/pre&gt;
1536 </target>
1537 <context-group name="null">
1538 <context context-type="linenumber">286</context>
1539 </context-group> 1786 </context-group>
1540 </trans-unit> 1787 </trans-unit>
1541 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1788 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1542 <source>Advanced configuration</source> 1789 <source>Advanced configuration</source>
1543 <target>Configuracion avançada</target> 1790 <target>Configuracion avançada</target>
1544 <context-group name="null"> 1791 <context-group name="null">
1545 <context context-type="linenumber">197</context> 1792 <context context-type="linenumber">212</context>
1546 </context-group> 1793 </context-group>
1547 </trans-unit> 1794 </trans-unit>
1548 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1795 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1549 <source>Update configuration</source> 1796 <source>Update configuration</source>
1550 <target>Actualizar la configuracion</target> 1797 <target>Actualizar la configuracion</target>
1551 <context-group name="null"> 1798 <context-group name="null">
1552 <context context-type="linenumber">314</context> 1799 <context context-type="linenumber">340</context>
1553 </context-group> 1800 </context-group>
1554 </trans-unit> 1801 </trans-unit>
1555 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1802 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1556 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1803 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1557 <target>Sembla que la configuracion es invalida. Mercés de cercar d’errors possiblas pels diferents onglets.</target> 1804 <target>Sembla que la configuracion es invalida. Mercés de cercar d’errors possiblas pels diferents onglets.</target>
1558 <context-group name="null"> 1805 <context-group name="null">
1559 <context context-type="linenumber">315</context> 1806 <context context-type="linenumber">341</context>
1560 </context-group> 1807 </context-group>
1561 </trans-unit> 1808 </trans-unit>
1562 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1809 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1639,6 +1886,13 @@
1639 <context context-type="linenumber">21</context> 1886 <context context-type="linenumber">21</context>
1640 </context-group> 1887 </context-group>
1641 </trans-unit> 1888 </trans-unit>
1889 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1890 <source>Filter...</source>
1891 <target>Filtre....</target>
1892 <context-group name="null">
1893 <context context-type="linenumber">27</context>
1894 </context-group>
1895 </trans-unit>
1642 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1896 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1643 <source>ID</source> 1897 <source>ID</source>
1644 <target>ID</target> 1898 <target>ID</target>
@@ -1650,14 +1904,14 @@
1650 <source>Score</source> 1904 <source>Score</source>
1651 <target>Marca</target> 1905 <target>Marca</target>
1652 <context-group name="null"> 1906 <context-group name="null">
1653 <context context-type="linenumber">8</context> 1907 <context context-type="linenumber">17</context>
1654 </context-group> 1908 </context-group>
1655 </trans-unit> 1909 </trans-unit>
1656 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1910 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1657 <source>Host</source> 1911 <source>Host</source>
1658 <target>Ã’st</target> 1912 <target>Ã’st</target>
1659 <context-group name="null"> 1913 <context-group name="null">
1660 <context context-type="linenumber">8</context> 1914 <context context-type="linenumber">19</context>
1661 </context-group> 1915 </context-group>
1662 </trans-unit> 1916 </trans-unit>
1663 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1917 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1674,11 +1928,25 @@
1674 <context context-type="linenumber">11</context> 1928 <context context-type="linenumber">11</context>
1675 </context-group> 1929 </context-group>
1676 </trans-unit> 1930 </trans-unit>
1931 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1932 <source>Accepted</source>
1933 <target>Acceptat</target>
1934 <context-group name="null">
1935 <context context-type="linenumber">32</context>
1936 </context-group>
1937 </trans-unit>
1938 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1939 <source>Pending</source>
1940 <target>En espèra</target>
1941 <context-group name="null">
1942 <context context-type="linenumber">33</context>
1943 </context-group>
1944 </trans-unit>
1677 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8"> 1945 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1678 <source>Redundancy allowed</source> 1946 <source>Redundancy allowed</source>
1679 <target>Redondància autorizada</target> 1947 <target>Redondància autorizada</target>
1680 <context-group name="null"> 1948 <context-group name="null">
1681 <context context-type="linenumber">11</context> 1949 <context context-type="linenumber">22</context>
1682 </context-group> 1950 </context-group>
1683 </trans-unit> 1951 </trans-unit>
1684 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1952 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
@@ -1769,7 +2037,7 @@
1769 <source>Role</source> 2037 <source>Role</source>
1770 <target>Ròtle</target> 2038 <target>Ròtle</target>
1771 <context-group name="null"> 2039 <context-group name="null">
1772 <context context-type="linenumber">20</context> 2040 <context context-type="linenumber">43</context>
1773 </context-group> 2041 </context-group>
1774 </trans-unit> 2042 </trans-unit>
1775 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 2043 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1792,53 +2060,60 @@
1792 <context context-type="linenumber">72</context> 2060 <context context-type="linenumber">72</context>
1793 </context-group> 2061 </context-group>
1794 </trans-unit> 2062 </trans-unit>
1795 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 2063 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1796 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 2064 <source>Users list</source>
1797 <target>Fòrabandir <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target> 2065 <target>Lista d’utilizaires</target>
1798 <context-group name="null"> 2066 <context-group name="null">
1799 <context context-type="linenumber">3</context> 2067 <context context-type="linenumber">2</context>
1800 </context-group> 2068 </context-group>
1801 </trans-unit> 2069 </trans-unit>
1802 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125"> 2070 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1803 <source>Reason...</source> 2071 <source>Batch actions</source>
1804 <target>Rason...</target> 2072 <target>Accions Batch</target>
1805 <context-group name="null"> 2073 <context-group name="null">
1806 <context context-type="linenumber">11</context> 2074 <context context-type="linenumber">19</context>
1807 </context-group> 2075 </context-group>
1808 </trans-unit> 2076 </trans-unit>
1809 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 2077 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1810 <source>Ban this user</source> 2078 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1811 <target>Fòrabandir aqueste utilizaire</target> 2079 <target>Nom d’utilizaire <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1812 <context-group name="null"> 2080 <context-group name="null">
1813 <context context-type="linenumber">25</context> 2081 <context context-type="linenumber">40</context>
1814 </context-group> 2082 </context-group>
1815 </trans-unit> 2083 </trans-unit>
1816 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 2084 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1817 <source>Users list</source> 2085 <source>(banned)</source>
1818 <target>Lista d’utilizaires</target> 2086 <target>(fòrabandit)</target>
1819 <context-group name="null"> 2087 <context-group name="null">
1820 <context context-type="linenumber">2</context> 2088 <context context-type="linenumber">65</context>
1821 </context-group> 2089 </context-group>
1822 </trans-unit> 2090 </trans-unit>
1823 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 2091 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1824 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2092 <source>Go to the account page</source>
1825 <target>Nom d’utilizaire <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2093 <target>Anar a la pagina del compte</target>
1826 <context-group name="null"> 2094 <context-group name="null">
1827 <context context-type="linenumber">17</context> 2095 <context context-type="linenumber">133</context>
1828 </context-group> 2096 </context-group>
1829 </trans-unit> 2097 </trans-unit>
1830 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 2098 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1831 <source>Actions</source> 2099 <source>User's email must be verified to login</source>
1832 <target>Accions</target> 2100 <target>Lo corrièl de l’utilizaire deu èsser verificat abans la connexion</target>
1833 <context-group name="null"> 2101 <context-group name="null">
1834 <context context-type="linenumber">33</context> 2102 <context context-type="linenumber">72</context>
2103 </context-group>
2104 </trans-unit>
2105 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2106 <source>User's email is verified / User can login without email verification</source>
2107 <target>Lo corrièl de l’utilizaire es verificat / Pòt se connectar sens verificacion de l’adreça</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">76</context>
1835 </context-group> 2110 </context-group>
1836 </trans-unit> 2111 </trans-unit>
1837 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 2112 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1838 <source>Ban reason:</source> 2113 <source>Ban reason:</source>
1839 <target>Rason del bandiment :</target> 2114 <target>Rason del bandiment :</target>
1840 <context-group name="null"> 2115 <context-group name="null">
1841 <context context-type="linenumber">51</context> 2116 <context context-type="linenumber">95</context>
1842 </context-group> 2117 </context-group>
1843 </trans-unit> 2118 </trans-unit>
1844 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 2119 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1901,6 +2176,13 @@
1901 <context context-type="linenumber">33</context> 2176 <context context-type="linenumber">33</context>
1902 </context-group> 2177 </context-group>
1903 </trans-unit> 2178 </trans-unit>
2179 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2180 <source>Actions</source>
2181 <target>Accions</target>
2182 <context-group name="null">
2183 <context context-type="linenumber">35</context>
2184 </context-group>
2185 </trans-unit>
1904 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2186 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1905 <source>Reason:</source> 2187 <source>Reason:</source>
1906 <target>Rason :</target> 2188 <target>Rason :</target>
@@ -1933,7 +2215,14 @@
1933 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2215 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1934 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2216 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1935 <context-group name="null"> 2217 <context-group name="null">
1936 <context context-type="linenumber">10</context> 2218 <context context-type="linenumber">11</context>
2219 </context-group>
2220 </trans-unit>
2221 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2222 <source>Blacklist reason:</source>
2223 <target>Rason de la mesa en lista negra :</target>
2224 <context-group name="null">
2225 <context context-type="linenumber">43</context>
1937 </context-group> 2226 </context-group>
1938 </trans-unit> 2227 </trans-unit>
1939 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2228 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1943,6 +2232,13 @@
1943 <context context-type="linenumber">2</context> 2232 <context context-type="linenumber">2</context>
1944 </context-group> 2233 </context-group>
1945 </trans-unit> 2234 </trans-unit>
2235 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
2236 <source>Video abuses</source>
2237 <target>Senhalaments de vidèos</target>
2238 <context-group name="null">
2239 <context context-type="linenumber">5</context>
2240 </context-group>
2241 </trans-unit>
1946 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2242 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1947 <source>Blacklisted videos</source> 2243 <source>Blacklisted videos</source>
1948 <target>Vidèos en lista nègra</target> 2244 <target>Vidèos en lista nègra</target>
@@ -1950,46 +2246,39 @@
1950 <context context-type="linenumber">7</context> 2246 <context context-type="linenumber">7</context>
1951 </context-group> 2247 </context-group>
1952 </trans-unit> 2248 </trans-unit>
1953 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2249 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1954 <source>My settings</source> 2250 <source>Muted accounts</source>
1955 <target>Mos paramètres</target> 2251 <target>Comptes muts</target>
1956 <context-group name="null"> 2252 <context-group name="null">
1957 <context context-type="linenumber">3</context> 2253 <context context-type="linenumber">2</context>
1958 </context-group> 2254 </context-group>
1959 </trans-unit> 2255 </trans-unit>
1960 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2256 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1961 <source>My library</source> 2257 <source>Muted servers</source>
1962 <target>Ma bibliotèca</target> 2258 <target>Servidors muts</target>
1963 <context-group name="null"> 2259 <context-group name="null">
1964 <context context-type="linenumber">7</context> 2260 <context context-type="linenumber">11</context>
1965 </context-group> 2261 </context-group>
1966 </trans-unit> 2262 </trans-unit>
1967 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2263 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1968 <source>My channels</source> 2264 <source>Account</source>
1969 <target>Mas cadenas</target> 2265 <target>Compte</target>
1970 <context-group name="null"> 2266 <context-group name="null">
1971 <context context-type="linenumber">12</context> 2267 <context context-type="linenumber">12</context>
1972 </context-group> 2268 </context-group>
1973 </trans-unit> 2269 </trans-unit>
1974 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2270 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
1975 <source>My videos</source> 2271 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1976 <target>Mas vidèos</target> 2272 <target>Mut lo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1977 <context-group name="null">
1978 <context context-type="linenumber">14</context>
1979 </context-group>
1980 </trans-unit>
1981 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1982 <source>My subscriptions</source>
1983 <target>Mos abonaments</target>
1984 <context-group name="null"> 2273 <context-group name="null">
1985 <context context-type="linenumber">16</context> 2274 <context context-type="linenumber">13</context>
1986 </context-group> 2275 </context-group>
1987 </trans-unit> 2276 </trans-unit>
1988 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed"> 2277 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1989 <source>My imports</source> 2278 <source>Unmute</source>
1990 <target>Mas importacions</target> 2279 <target>Restablir</target>
1991 <context-group name="null"> 2280 <context-group name="null">
1992 <context context-type="linenumber">18</context> 2281 <context context-type="linenumber">23</context>
1993 </context-group> 2282 </context-group>
1994 </trans-unit> 2283 </trans-unit>
1995 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2284 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2003,21 +2292,35 @@
2003 <source>Profile</source> 2292 <source>Profile</source>
2004 <target>Perfil</target> 2293 <target>Perfil</target>
2005 <context-group name="null"> 2294 <context-group name="null">
2006 <context context-type="linenumber">8</context> 2295 <context context-type="linenumber">7</context>
2007 </context-group> 2296 </context-group>
2008 </trans-unit> 2297 </trans-unit>
2009 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2298 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2010 <source>Video settings</source> 2299 <source>Video settings</source>
2011 <target>Paramètres vidèo</target> 2300 <target>Paramètres vidèo</target>
2012 <context-group name="null"> 2301 <context-group name="null">
2013 <context context-type="linenumber">15</context> 2302 <context context-type="linenumber">16</context>
2014 </context-group> 2303 </context-group>
2015 </trans-unit> 2304 </trans-unit>
2016 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2305 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2017 <source>Danger zone</source> 2306 <source>Danger zone</source>
2018 <target>Zòna perilhosa</target> 2307 <target>Zòna perilhosa</target>
2019 <context-group name="null"> 2308 <context-group name="null">
2020 <context context-type="linenumber">18</context> 2309 <context context-type="linenumber">19</context>
2310 </context-group>
2311 </trans-unit>
2312 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
2313 <source>Change ownership</source>
2314 <target>Cambiar la proprietat</target>
2315 <context-group name="null">
2316 <context context-type="linenumber">46</context>
2317 </context-group>
2318 </trans-unit>
2319 <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
2320 <source>Select the next owner</source>
2321 <target>Seleccionatz lo novèl proprietari</target>
2322 <context-group name="null">
2323 <context context-type="linenumber">9</context>
2021 </context-group> 2324 </context-group>
2022 </trans-unit> 2325 </trans-unit>
2023 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8"> 2326 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
@@ -2031,13 +2334,6 @@
2031 <context context-type="linenumber">35</context> 2334 <context context-type="linenumber">35</context>
2032 </context-group> 2335 </context-group>
2033 </trans-unit> 2336 </trans-unit>
2034 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2035 <source>Submit</source>
2036 <target>Mandar</target>
2037 <context-group name="null">
2038 <context context-type="linenumber">24</context>
2039 </context-group>
2040 </trans-unit>
2041 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2337 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2042 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2338 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2043 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target> 2339 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
@@ -2045,6 +2341,13 @@
2045 <context context-type="linenumber">19</context> 2341 <context context-type="linenumber">19</context>
2046 </context-group> 2342 </context-group>
2047 </trans-unit> 2343 </trans-unit>
2344 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
2345 <source>Blacklisted</source>
2346 <target>En lista negra</target>
2347 <context-group name="null">
2348 <context context-type="linenumber">22</context>
2349 </context-group>
2350 </trans-unit>
2048 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 2351 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
2049 <source> 2352 <source>
2050 Cancel 2353 Cancel
@@ -2106,6 +2409,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2106 <context context-type="linenumber">8</context> 2409 <context context-type="linenumber">8</context>
2107 </context-group> 2410 </context-group>
2108 </trans-unit> 2411 </trans-unit>
2412 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2413 <source>You don't have any subscriptions yet.</source>
2414 <target>Encara avètz pas cap d’abonament.</target>
2415 <context-group name="null">
2416 <context context-type="linenumber">1</context>
2417 </context-group>
2418 </trans-unit>
2109 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2419 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
2110 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2420 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
2111 <target>Creat per <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2421 <target>Creat per <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -2120,6 +2430,27 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2120 <context context-type="linenumber">16</context> 2430 <context context-type="linenumber">16</context>
2121 </context-group> 2431 </context-group>
2122 </trans-unit> 2432 </trans-unit>
2433 <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
2434 <source>Accept ownership</source>
2435 <target>Acceptar la proprietat</target>
2436 <context-group name="null">
2437 <context context-type="linenumber">3</context>
2438 </context-group>
2439 </trans-unit>
2440 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
2441 <source>Select the target channel</source>
2442 <target>Seleccionatz la cadena cibla</target>
2443 <context-group name="null">
2444 <context context-type="linenumber">9</context>
2445 </context-group>
2446 </trans-unit>
2447 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2448 <source>Initiator</source>
2449 <target>Iniciator</target>
2450 <context-group name="null">
2451 <context context-type="linenumber">13</context>
2452 </context-group>
2453 </trans-unit>
2123 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02"> 2454 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2124 <source> 2455 <source>
2125 Created 2456 Created
@@ -2154,6 +2485,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2154 <context context-type="linenumber">39</context> 2485 <context context-type="linenumber">39</context>
2155 </context-group> 2486 </context-group>
2156 </trans-unit> 2487 </trans-unit>
2488 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2489 <source>Refuse</source>
2490 <target>Refusar</target>
2491 <context-group name="null">
2492 <context context-type="linenumber">47</context>
2493 </context-group>
2494 </trans-unit>
2495 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2496 <source>Muted instances</source>
2497 <target>Instàncias mudas</target>
2498 <context-group name="null">
2499 <context context-type="linenumber">2</context>
2500 </context-group>
2501 </trans-unit>
2157 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2502 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2158 <source>Change password</source> 2503 <source>Change password</source>
2159 <target>Cambiar lo senhal</target> 2504 <target>Cambiar lo senhal</target>
@@ -2161,6 +2506,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2161 <context context-type="linenumber">30</context> 2506 <context context-type="linenumber">30</context>
2162 </context-group> 2507 </context-group>
2163 </trans-unit> 2508 </trans-unit>
2509 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2510 <source>Current password</source>
2511 <target>Senhal actual</target>
2512 <context-group name="null">
2513 <context context-type="linenumber">7</context>
2514 </context-group>
2515 </trans-unit>
2164 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2516 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2165 <source>New password</source> 2517 <source>New password</source>
2166 <target>Nòu senhal</target> 2518 <target>Nòu senhal</target>
@@ -2182,18 +2534,25 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2182 <context context-type="linenumber">3</context> 2534 <context context-type="linenumber">3</context>
2183 </context-group> 2535 </context-group>
2184 </trans-unit> 2536 </trans-unit>
2537 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2538 <source>Use WebTorrent to exchange parts of the video with others</source>
2539 <target>Utilizar WebTorrent per escambiar de tròces de la vidèo amb d’autres</target>
2540 <context-group name="null">
2541 <context context-type="linenumber">21</context>
2542 </context-group>
2543 </trans-unit>
2185 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2544 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2186 <source>Automatically plays video</source> 2545 <source>Automatically plays video</source>
2187 <target>Legir automaticament las vidèos</target> 2546 <target>Legir automaticament las vidèos</target>
2188 <context-group name="null"> 2547 <context-group name="null">
2189 <context context-type="linenumber">20</context> 2548 <context context-type="linenumber">28</context>
2190 </context-group> 2549 </context-group>
2191 </trans-unit> 2550 </trans-unit>
2192 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2551 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2193 <source>Save</source> 2552 <source>Save</source>
2194 <target>Salvagardar</target> 2553 <target>Salvagardar</target>
2195 <context-group name="null"> 2554 <context-group name="null">
2196 <context context-type="linenumber">23</context> 2555 <context context-type="linenumber">32</context>
2197 </context-group> 2556 </context-group>
2198 </trans-unit> 2557 </trans-unit>
2199 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2558 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2224,6 +2583,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2224 <context context-type="linenumber">18</context> 2583 <context context-type="linenumber">18</context>
2225 </context-group> 2584 </context-group>
2226 </trans-unit> 2585 </trans-unit>
2586 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2587 <source>Once you delete your account, there is no going back. Please be certain.</source>
2588 <target>Un còp qu’escafatz lo compte, podètz pas anullar aquò. Siatz-ne segur.</target>
2589 <context-group name="null">
2590 <context context-type="linenumber">2</context>
2591 </context-group>
2592 </trans-unit>
2227 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2593 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2228 <source>Delete your account</source> 2594 <source>Delete your account</source>
2229 <target>Suprimir vòstre compte</target> 2595 <target>Suprimir vòstre compte</target>
@@ -2231,6 +2597,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2231 <context context-type="linenumber">4</context> 2597 <context context-type="linenumber">4</context>
2232 </context-group> 2598 </context-group>
2233 </trans-unit> 2599 </trans-unit>
2600 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2601 <source>Web</source>
2602 <target>Site web</target>
2603 <context-group name="null">
2604 <context context-type="linenumber">3</context>
2605 </context-group>
2606 </trans-unit>
2234 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2607 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
2235 <source> 2608 <source>
2236 Sorry, but we couldn't find the page you were looking for. 2609 Sorry, but we couldn't find the page you were looking for.
@@ -2242,6 +2615,28 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2242 <context context-type="linenumber">1</context> 2615 <context context-type="linenumber">1</context>
2243 </context-group> 2616 </context-group>
2244 </trans-unit> 2617 </trans-unit>
2618 <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
2619 <source>
2620 Verify account email confirmation
2621 </source>
2622 <target>
2623 Verificar l’adreça del compte
2624 </target>
2625 <context-group name="null">
2626 <context context-type="linenumber">2</context>
2627 </context-group>
2628 </trans-unit>
2629 <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
2630 <source>
2631 Your email has been verified and you may now login. Redirecting...
2632 </source>
2633 <target>
2634 Vòstre corrièl es estat verificat, podètz ara vos connectar. Redireccion...
2635 </target>
2636 <context-group name="null">
2637 <context context-type="linenumber">6</context>
2638 </context-group>
2639 </trans-unit>
2245 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48"> 2640 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
2246 <source>An error occurred. </source> 2641 <source>An error occurred. </source>
2247 <target>Una error s’es producha.</target> 2642 <target>Una error s’es producha.</target>
@@ -2316,6 +2711,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2316 <context context-type="linenumber">159</context> 2711 <context context-type="linenumber">159</context>
2317 </context-group> 2712 </context-group>
2318 </trans-unit> 2713 </trans-unit>
2714 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2715 <source>Sorry, but something went wrong</source>
2716 <target>O planhèm, quicòm a trucat</target>
2717 <context-group name="null">
2718 <context context-type="linenumber">49</context>
2719 </context-group>
2720 </trans-unit>
2319 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2721 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2320 <source> 2722 <source>
2321 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2723 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2324,12 +2726,12 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2324 Felicitacions, la vidèo darrièr <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> serà importada ! Podètz ja ajustar las informacions tocant aquesta vidèo. 2726 Felicitacions, la vidèo darrièr <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> serà importada ! Podètz ja ajustar las informacions tocant aquesta vidèo.
2325</target> 2727</target>
2326 <context-group name="null"> 2728 <context-group name="null">
2327 <context context-type="linenumber">40</context> 2729 <context context-type="linenumber">46</context>
2328 </context-group> 2730 </context-group>
2329 </trans-unit> 2731 </trans-unit>
2330 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2732 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
2331 <source>Update</source> 2733 <source>Update</source>
2332 <target>Actualizar</target> 2734 <target>Mandadís</target>
2333 <context-group name="null"> 2735 <context-group name="null">
2334 <context context-type="linenumber">92</context> 2736 <context context-type="linenumber">92</context>
2335 </context-group> 2737 </context-group>
@@ -2341,18 +2743,25 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2341 <context context-type="linenumber">6</context> 2743 <context context-type="linenumber">6</context>
2342 </context-group> 2744 </context-group>
2343 </trans-unit> 2745 </trans-unit>
2746 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2747 <source>Scheduled</source>
2748 <target>Programada</target>
2749 <context-group name="null">
2750 <context context-type="linenumber">25</context>
2751 </context-group>
2752 </trans-unit>
2344 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2753 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
2345 <source>Publish will be available when upload is finished</source> 2754 <source>Publish will be available when upload is finished</source>
2346 <target>La publicacion serà possibla un còp lo mandadís acabat</target> 2755 <target>La publicacion serà possibla un còp lo mandadís acabat</target>
2347 <context-group name="null"> 2756 <context-group name="null">
2348 <context context-type="linenumber">48</context> 2757 <context context-type="linenumber">58</context>
2349 </context-group> 2758 </context-group>
2350 </trans-unit> 2759 </trans-unit>
2351 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2760 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2352 <source>Publish</source> 2761 <source>Publish</source>
2353 <target>Publicar</target> 2762 <target>Publicar</target>
2354 <context-group name="null"> 2763 <context-group name="null">
2355 <context context-type="linenumber">55</context> 2764 <context context-type="linenumber">65</context>
2356 </context-group> 2765 </context-group>
2357 </trans-unit> 2766 </trans-unit>
2358 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2767 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2362,6 +2771,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2362 <context context-type="linenumber">6</context> 2771 <context context-type="linenumber">6</context>
2363 </context-group> 2772 </context-group>
2364 </trans-unit> 2773 </trans-unit>
2774 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2775 <source>Or</source>
2776 <target>O</target>
2777 <context-group name="null">
2778 <context context-type="linenumber">11</context>
2779 </context-group>
2780 </trans-unit>
2365 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2781 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2366 <source>Paste magnet URI</source> 2782 <source>Paste magnet URI</source>
2367 <target>Pegar lo magnet URI</target> 2783 <target>Pegar lo magnet URI</target>
@@ -2384,7 +2800,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2384 Felicitacions, la vidèo serà importada via BitTorrent ! Podètz ja ajustar las informacions tocant aquesta vidèo. 2800 Felicitacions, la vidèo serà importada via BitTorrent ! Podètz ja ajustar las informacions tocant aquesta vidèo.
2385</target> 2801</target>
2386 <context-group name="null"> 2802 <context-group name="null">
2387 <context context-type="linenumber">48</context> 2803 <context context-type="linenumber">53</context>
2388 </context-group> 2804 </context-group>
2389 </trans-unit> 2805 </trans-unit>
2390 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2806 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2396,7 +2812,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2396 </trans-unit> 2812 </trans-unit>
2397 <trans-unit id="e9cfe8bd050660077212af5c02f5be24821f28d5"> 2813 <trans-unit id="e9cfe8bd050660077212af5c02f5be24821f28d5">
2398 <source>Upload <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source> 2814 <source>Upload <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
2399 <target>Actualizar <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></target> 2815 <target>Mandadís <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></target>
2400 <context-group name="null"> 2816 <context-group name="null">
2401 <context context-type="linenumber">4</context> 2817 <context context-type="linenumber">4</context>
2402 </context-group> 2818 </context-group>
@@ -2436,6 +2852,17 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2436 <context context-type="linenumber">24</context> 2852 <context context-type="linenumber">24</context>
2437 </context-group> 2853 </context-group>
2438 </trans-unit> 2854 </trans-unit>
2855 <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
2856 <source>
2857 This will replace an existing caption!
2858 </source>
2859 <target>
2860 Aquò remplaçarà la legenda existenta !
2861 </target>
2862 <context-group name="null">
2863 <context context-type="linenumber">29</context>
2864 </context-group>
2865 </trans-unit>
2439 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c"> 2866 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
2440 <source>Add this caption</source> 2867 <source>Add this caption</source>
2441 <target>Ajustar aquesta legenda</target> 2868 <target>Ajustar aquesta legenda</target>
@@ -2457,6 +2884,27 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2457 <context context-type="linenumber">191</context> 2884 <context context-type="linenumber">191</context>
2458 </context-group> 2885 </context-group>
2459 </trans-unit> 2886 </trans-unit>
2887 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2888 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2889 <target>Per suggerir de recomandacions pertinentas òm pòt utilizar las etiquetas.&lt;/br&gt;Picatz Entrada per ajustar una nòva etiqueta.</target>
2890 <context-group name="null">
2891 <context context-type="linenumber">18</context>
2892 </context-group>
2893 </trans-unit>
2894 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2895 <source>+ Tag</source>
2896 <target>+ Etiqueta</target>
2897 <context-group name="null">
2898 <context context-type="linenumber">21</context>
2899 </context-group>
2900 </trans-unit>
2901 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2902 <source>Enter a new tag</source>
2903 <target>Picatz una nòva etiqueta</target>
2904 <context-group name="null">
2905 <context context-type="linenumber">21</context>
2906 </context-group>
2907 </trans-unit>
2460 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2908 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2461 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2909 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2462 <target>Las descripcions de las vidèos son troncadas per defaut e demandan una accion manuala per qu’òm las alongue.</target> 2910 <target>Las descripcions de las vidèos son troncadas per defaut e demandan una accion manuala per qu’òm las alongue.</target>
@@ -2494,16 +2942,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2494 </trans-unit> 2942 </trans-unit>
2495 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0"> 2943 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
2496 <source>Wait transcoding before publishing the video</source> 2944 <source>Wait transcoding before publishing the video</source>
2497 <target>Esperatz lo transcodatge abans de publicar la vidèo</target> 2945 <target>Esperar lo transcodatge abans de publicar la vidèo</target>
2498 <context-group name="null"> 2946 <context-group name="null">
2499 <context context-type="linenumber">130</context> 2947 <context context-type="linenumber">131</context>
2500 </context-group> 2948 </context-group>
2501 </trans-unit> 2949 </trans-unit>
2502 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2950 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2503 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2951 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2504 <target>Se decidissètz d’esperar pas lo transcodatge abans de publicar la vidèo, serà pas legibla fins a la fin del transcodatge.</target> 2952 <target>Se decidissètz d’esperar pas lo transcodatge abans de publicar la vidèo, serà pas legibla fins a la fin del transcodatge.</target>
2505 <context-group name="null"> 2953 <context-group name="null">
2506 <context context-type="linenumber">131</context> 2954 <context context-type="linenumber">132</context>
2507 </context-group> 2955 </context-group>
2508 </trans-unit> 2956 </trans-unit>
2509 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2957 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2517,49 +2965,49 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2517 <source>Add another caption</source> 2965 <source>Add another caption</source>
2518 <target>Ajustar una legenda mai</target> 2966 <target>Ajustar una legenda mai</target>
2519 <context-group name="null"> 2967 <context-group name="null">
2520 <context context-type="linenumber">146</context> 2968 <context context-type="linenumber">147</context>
2521 </context-group> 2969 </context-group>
2522 </trans-unit> 2970 </trans-unit>
2523 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2971 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2524 <source>See the subtitle file</source> 2972 <source>See the subtitle file</source>
2525 <target>Veire lo fichièr de sostítols</target> 2973 <target>Veire lo fichièr de sostítols</target>
2526 <context-group name="null"> 2974 <context-group name="null">
2527 <context context-type="linenumber">155</context> 2975 <context context-type="linenumber">156</context>
2528 </context-group> 2976 </context-group>
2529 </trans-unit> 2977 </trans-unit>
2530 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2978 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2531 <source>Already uploaded ✔</source> 2979 <source>Already uploaded ✔</source>
2532 <target>Ja enviada ✔</target> 2980 <target>Ja enviada ✔</target>
2533 <context-group name="null"> 2981 <context-group name="null">
2534 <context context-type="linenumber">159</context> 2982 <context context-type="linenumber">160</context>
2535 </context-group> 2983 </context-group>
2536 </trans-unit> 2984 </trans-unit>
2537 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2985 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2538 <source>Will be created on update</source> 2986 <source>Will be created on update</source>
2539 <target>Serà creada en actualizar</target> 2987 <target>Serà creada en actualizar</target>
2540 <context-group name="null"> 2988 <context-group name="null">
2541 <context context-type="linenumber">167</context> 2989 <context context-type="linenumber">168</context>
2542 </context-group> 2990 </context-group>
2543 </trans-unit> 2991 </trans-unit>
2544 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2992 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2545 <source>Cancel create</source> 2993 <source>Cancel create</source>
2546 <target>Anullar la creacion</target> 2994 <target>Anullar la creacion</target>
2547 <context-group name="null"> 2995 <context-group name="null">
2548 <context context-type="linenumber">169</context> 2996 <context context-type="linenumber">170</context>
2549 </context-group> 2997 </context-group>
2550 </trans-unit> 2998 </trans-unit>
2551 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2999 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2552 <source>Will be deleted on update</source> 3000 <source>Will be deleted on update</source>
2553 <target>Serà suprimida en actualizar</target> 3001 <target>Serà suprimida en actualizar</target>
2554 <context-group name="null"> 3002 <context-group name="null">
2555 <context context-type="linenumber">175</context> 3003 <context context-type="linenumber">176</context>
2556 </context-group> 3004 </context-group>
2557 </trans-unit> 3005 </trans-unit>
2558 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3006 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2559 <source>Cancel deletion</source> 3007 <source>Cancel deletion</source>
2560 <target>Anullar la supression</target> 3008 <target>Anullar la supression</target>
2561 <context-group name="null"> 3009 <context-group name="null">
2562 <context context-type="linenumber">177</context> 3010 <context context-type="linenumber">178</context>
2563 </context-group> 3011 </context-group>
2564 </trans-unit> 3012 </trans-unit>
2565 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 3013 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2570,33 +3018,33 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2570 Encara cap de legendas. 3018 Encara cap de legendas.
2571 </target> 3019 </target>
2572 <context-group name="null"> 3020 <context-group name="null">
2573 <context context-type="linenumber">182</context> 3021 <context context-type="linenumber">183</context>
2574 </context-group> 3022 </context-group>
2575 </trans-unit> 3023 </trans-unit>
2576 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3024 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2577 <source>Captions</source> 3025 <source>Captions</source>
2578 <target>Legendas</target> 3026 <target>Legendas</target>
2579 <context-group name="null"> 3027 <context-group name="null">
2580 <context context-type="linenumber">139</context> 3028 <context context-type="linenumber">140</context>
2581 </context-group> 3029 </context-group>
2582 </trans-unit> 3030 </trans-unit>
2583 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3031 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2584 <source>Upload thumbnail</source> 3032 <source>Upload thumbnail</source>
2585 <target>Enviar una vinheta d’apercebut</target> 3033 <target>Enviar una vinheta d’apercebut</target>
2586 <context-group name="null"> 3034 <context-group name="null">
2587 <context context-type="linenumber">195</context> 3035 <context context-type="linenumber">196</context>
2588 </context-group> 3036 </context-group>
2589 </trans-unit> 3037 </trans-unit>
2590 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3038 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2591 <source>Upload preview</source> 3039 <source>Upload preview</source>
2592 <target>Enviar un apercebut</target> 3040 <target>Enviar un apercebut</target>
2593 <context-group name="null"> 3041 <context-group name="null">
2594 <context context-type="linenumber">202</context> 3042 <context context-type="linenumber">203</context>
2595 </context-group> 3043 </context-group>
2596 </trans-unit> 3044 </trans-unit>
2597 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3045 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
2598 <source>Support</source> 3046 <source>Support</source>
2599 <target>Sosténer</target> 3047 <target>Sosten</target>
2600 <context-group name="null"> 3048 <context-group name="null">
2601 <context context-type="linenumber">69</context> 3049 <context context-type="linenumber">69</context>
2602 </context-group> 3050 </context-group>
@@ -2605,14 +3053,14 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2605 <source>Short text to tell people how they can support you (membership platform...).</source> 3053 <source>Short text to tell people how they can support you (membership platform...).</source>
2606 <target>Pichon tèxte per explicar al monde cossí pòdon vos sosténer (plataforma pels sòcis...).</target> 3054 <target>Pichon tèxte per explicar al monde cossí pòdon vos sosténer (plataforma pels sòcis...).</target>
2607 <context-group name="null"> 3055 <context-group name="null">
2608 <context context-type="linenumber">209</context> 3056 <context context-type="linenumber">210</context>
2609 </context-group> 3057 </context-group>
2610 </trans-unit> 3058 </trans-unit>
2611 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3059 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2612 <source>Advanced settings</source> 3060 <source>Advanced settings</source>
2613 <target>Paramètres avançats</target> 3061 <target>Paramètres avançats</target>
2614 <context-group name="null"> 3062 <context-group name="null">
2615 <context context-type="linenumber">190</context> 3063 <context context-type="linenumber">191</context>
2616 </context-group> 3064 </context-group>
2617 </trans-unit> 3065 </trans-unit>
2618 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3066 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2620,7 +3068,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2620 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> 3068 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/>
2621 </source> 3069 </source>
2622 <target> 3070 <target>
2623 Actualizar <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> 3071 Modificar <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/>
2624 </target> 3072 </target>
2625 <context-group name="null"> 3073 <context-group name="null">
2626 <context context-type="linenumber">2</context> 3074 <context context-type="linenumber">2</context>
@@ -2679,17 +3127,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2679 <context context-type="linenumber">3</context> 3127 <context context-type="linenumber">3</context>
2680 </context-group> 3128 </context-group>
2681 </trans-unit> 3129 </trans-unit>
2682 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2683 <source>
2684 Cancel
2685 </source>
2686 <target>
2687 Anullar
2688 </target>
2689 <context-group name="null">
2690 <context context-type="linenumber">19</context>
2691 </context-group>
2692 </trans-unit>
2693 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3130 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2694 <source>Share</source> 3131 <source>Share</source>
2695 <target>Partejar</target> 3132 <target>Partejar</target>
@@ -2711,6 +3148,17 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2711 <context context-type="linenumber">34</context> 3148 <context context-type="linenumber">34</context>
2712 </context-group> 3149 </context-group>
2713 </trans-unit> 3150 </trans-unit>
3151 <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
3152 <source>
3153 The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
3154 </source>
3155 <target>
3156 L’URL es pas segura (cap d’HTTPS), la vidèo embarcada foncionarà pas suls sites HTTPS alara (los navigadors web blocan las requèstas HTTP suls sites HTTPS).
3157 </target>
3158 <context-group name="null">
3159 <context context-type="linenumber">45</context>
3160 </context-group>
3161 </trans-unit>
2714 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8"> 3162 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
2715 <source>Close</source> 3163 <source>Close</source>
2716 <target>Tampar</target> 3164 <target>Tampar</target>
@@ -2747,6 +3195,17 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2747 <context context-type="linenumber">15</context> 3195 <context context-type="linenumber">15</context>
2748 </context-group> 3196 </context-group>
2749 </trans-unit> 3197 </trans-unit>
3198 <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
3199 <source>
3200 This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3201 </source>
3202 <target>
3203 Aquesta vidèo serà publicada lo <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3204 </target>
3205 <context-group name="null">
3206 <context context-type="linenumber">19</context>
3207 </context-group>
3208 </trans-unit>
2750 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710"> 3209 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
2751 <source>This video is blacklisted.</source> 3210 <source>This video is blacklisted.</source>
2752 <target>Aquesta vidèo es en lista negra.</target> 3211 <target>Aquesta vidèo es en lista negra.</target>
@@ -2754,6 +3213,28 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2754 <context context-type="linenumber">24</context> 3213 <context context-type="linenumber">24</context>
2755 </context-group> 3214 </context-group>
2756 </trans-unit> 3215 </trans-unit>
3216 <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
3217 <source>
3218 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3219 </source>
3220 <target>
3221 Publicada <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizacions
3222 </target>
3223 <context-group name="null">
3224 <context context-type="linenumber">37</context>
3225 </context-group>
3226 </trans-unit>
3227 <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
3228 <source>
3229 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3230 </source>
3231 <target>
3232 Publicada <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizacions
3233 </target>
3234 <context-group name="null">
3235 <context context-type="linenumber">46</context>
3236 </context-group>
3237 </trans-unit>
2757 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced"> 3238 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
2758 <source>Like this video</source> 3239 <source>Like this video</source>
2759 <target>Aimar la vidèo</target> 3240 <target>Aimar la vidèo</target>
@@ -2770,7 +3251,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2770 </trans-unit> 3251 </trans-unit>
2771 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2"> 3252 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
2772 <source>Download the video</source> 3253 <source>Download the video</source>
2773 <target>Telecargar la vidèo</target> 3254 <target>Telecargar aquesta vidèo</target>
2774 <context-group name="null"> 3255 <context-group name="null">
2775 <context context-type="linenumber">83</context> 3256 <context context-type="linenumber">83</context>
2776 </context-group> 3257 </context-group>
@@ -2791,7 +3272,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2791 </trans-unit> 3272 </trans-unit>
2792 <trans-unit id="cd27f761b923a5bdb16ba9844da632edd878f1b1"> 3273 <trans-unit id="cd27f761b923a5bdb16ba9844da632edd878f1b1">
2793 <source>Update this video</source> 3274 <source>Update this video</source>
2794 <target>Enviar aquesta vidèo</target> 3275 <target>Modificar aquesta vidèo</target>
2795 <context-group name="null"> 3276 <context-group name="null">
2796 <context context-type="linenumber">91</context> 3277 <context context-type="linenumber">91</context>
2797 </context-group> 3278 </context-group>
@@ -2817,6 +3298,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2817 <context context-type="linenumber">100</context> 3298 <context context-type="linenumber">100</context>
2818 </context-group> 3299 </context-group>
2819 </trans-unit> 3300 </trans-unit>
3301 <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
3302 <source>Unblacklist this video</source>
3303 <target>Tirar de la lista negra aquesta vidèo</target>
3304 <context-group name="null">
3305 <context context-type="linenumber">99</context>
3306 </context-group>
3307 </trans-unit>
2820 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5"> 3308 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
2821 <source>Delete this video</source> 3309 <source>Delete this video</source>
2822 <target>Suprimir aquesta vidèo</target> 3310 <target>Suprimir aquesta vidèo</target>
@@ -2838,13 +3326,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2838 <context context-type="linenumber">134</context> 3326 <context context-type="linenumber">134</context>
2839 </context-group> 3327 </context-group>
2840 </trans-unit> 3328 </trans-unit>
2841 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2842 <source>Go to the account page</source>
2843 <target>Anar a la pagina del compte</target>
2844 <context-group name="null">
2845 <context context-type="linenumber">133</context>
2846 </context-group>
2847 </trans-unit>
2848 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3329 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2849 <source>Show more</source> 3330 <source>Show more</source>
2850 <target>Ne veire mai</target> 3331 <target>Ne veire mai</target>
@@ -2866,6 +3347,17 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2866 <context context-type="linenumber">208</context> 3347 <context context-type="linenumber">208</context>
2867 </context-group> 3348 </context-group>
2868 </trans-unit> 3349 </trans-unit>
3350 <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
3351 <source>
3352 the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
3353 </source>
3354 <target>
3355 Lo sistèma de partatge utilizat per aquesta vidèo implica que d’informacions tocant vòstre sistèma (tal coma vòstra adreça IP publica) sián enviadas als autres pars.
3356 </target>
3357 <context-group name="null">
3358 <context context-type="linenumber">209</context>
3359 </context-group>
3360 </trans-unit>
2869 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e"> 3361 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
2870 <source>More information</source> 3362 <source>More information</source>
2871 <target>Mai d’informacions</target> 3363 <target>Mai d’informacions</target>
@@ -2913,25 +3405,18 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2913 <context context-type="linenumber">3</context> 3405 <context context-type="linenumber">3</context>
2914 </context-group> 3406 </context-group>
2915 </trans-unit> 3407 </trans-unit>
2916 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
2917 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
2918 <target>Podètz siá comentar de la pagina de vòstra instància ont aquesta vidèo es federada amb vòstre compte PeerTube, o via qualque que siá instància del fediverse compatibla ActivityPub. Per exemple amb Mastodon o Pleroma podètz picar dins la barra de recèrca &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; e retrobar aquesta vidèo. Las foncionalitats de comentari dirècte son en òbra a &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
2919 <context-group name="null">
2920 <context context-type="linenumber">8</context>
2921 </context-group>
2922 </trans-unit>
2923 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3408 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
2924 <source>No comments.</source> 3409 <source>No comments.</source>
2925 <target>Cap de comentari.</target> 3410 <target>Cap de comentari.</target>
2926 <context-group name="null"> 3411 <context-group name="null">
2927 <context context-type="linenumber">18</context> 3412 <context context-type="linenumber">17</context>
2928 </context-group> 3413 </context-group>
2929 </trans-unit> 3414 </trans-unit>
2930 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3415 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2931 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3416 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2932 <target>Veire las <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> autras responsas</target> 3417 <target>Veire las <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> autras responsas</target>
2933 <context-group name="null"> 3418 <context-group name="null">
2934 <context context-type="linenumber">55</context> 3419 <context context-type="linenumber">54</context>
2935 </context-group> 3420 </context-group>
2936 </trans-unit> 3421 </trans-unit>
2937 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3422 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2942,7 +3427,7 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2942 Los comentaris son desactivats. 3427 Los comentaris son desactivats.
2943 </target> 3428 </target>
2944 <context-group name="null"> 3429 <context-group name="null">
2945 <context context-type="linenumber">64</context> 3430 <context context-type="linenumber">63</context>
2946 </context-group> 3431 </context-group>
2947 </trans-unit> 3432 </trans-unit>
2948 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3433 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -2963,6 +3448,57 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2963 <context context-type="linenumber">20</context> 3448 <context context-type="linenumber">20</context>
2964 </context-group> 3449 </context-group>
2965 </trans-unit> 3450 </trans-unit>
3451 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3452 <source>You are one step away from commenting</source>
3453 <target>Sètz a una etapa abans de comentar</target>
3454 <context-group name="null">
3455 <context context-type="linenumber">28</context>
3456 </context-group>
3457 </trans-unit>
3458 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3459 <source>
3460 If you have an account on this instance, you can login:
3461 </source>
3462 <target>
3463 S’avètz un compte sus aquesta instància, podètz vos connectar :
3464 </target>
3465 <context-group name="null">
3466 <context context-type="linenumber">32</context>
3467 </context-group>
3468 </trans-unit>
3469 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3470 <source>login to comment</source>
3471 <target>se connectar per comentar</target>
3472 <context-group name="null">
3473 <context context-type="linenumber">35</context>
3474 </context-group>
3475 </trans-unit>
3476 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3477 <source>
3478 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3479 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3480 from within the software's interface.
3481 </source>
3482 <target>
3483 Autrament podètz comentar n’utilizant un compte amb una instància compatibla ActivityPub.
3484 Sovent podètz trobar la vidèo en picant son URL dins la barra de recèrca puèi la comentar
3485 a partir de l’interfàcia del logicial.
3486 </target>
3487 <context-group name="null">
3488 <context context-type="linenumber">36</context>
3489 </context-group>
3490 </trans-unit>
3491 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3492 <source>
3493 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3494 </source>
3495 <target>
3496 S’avètz un compte sus Mastodon o Pleroma, podètz la dobrir dirèctament dins lor interfàcia :
3497 </target>
3498 <context-group name="null">
3499 <context context-type="linenumber">41</context>
3500 </context-group>
3501 </trans-unit>
2966 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3502 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
2967 <source>Highlighted comment</source> 3503 <source>Highlighted comment</source>
2968 <target>Comentari notable</target> 3504 <target>Comentari notable</target>
@@ -2977,13 +3513,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2977 <context context-type="linenumber">14</context> 3513 <context context-type="linenumber">14</context>
2978 </context-group> 3514 </context-group>
2979 </trans-unit> 3515 </trans-unit>
2980 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2981 <source>Error getting about from server</source>
2982 <target>Error en recuperar las informacions de la seccion «A prepaus» del servidor</target>
2983 <context-group name="null">
2984 <context context-type="linenumber">1</context>
2985 </context-group>
2986 </trans-unit>
2987 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3516 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2988 <source>No description</source> 3517 <source>No description</source>
2989 <target>Cap de descripcion</target> 3518 <target>Cap de descripcion</target>
@@ -3005,51 +3534,44 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3005 <context context-type="linenumber">1</context> 3534 <context context-type="linenumber">1</context>
3006 </context-group> 3535 </context-group>
3007 </trans-unit> 3536 </trans-unit>
3008 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3537 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3009 <source>Error</source> 3538 <source>240p</source>
3010 <target>Error</target> 3539 <target>240p</target>
3011 <context-group name="null">
3012 <context context-type="linenumber">1</context>
3013 </context-group>
3014 </trans-unit>
3015 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3016 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3017 <target>Avètz definit de <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
3018 <context-group name="null"> 3540 <context-group name="null">
3019 <context context-type="linenumber">1</context> 3541 <context context-type="linenumber">1</context>
3020 </context-group> 3542 </context-group>
3021 </trans-unit> 3543 </trans-unit>
3022 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3544 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3023 <source>This could lead to security issues or bugs if you do not understand it. </source> 3545 <source>360p</source>
3024 <target>Aquò pòt menar a de problèmas de seguretat o de bugs s’o comprenètz pas.</target> 3546 <target>360p</target>
3025 <context-group name="null"> 3547 <context-group name="null">
3026 <context context-type="linenumber">1</context> 3548 <context context-type="linenumber">1</context>
3027 </context-group> 3549 </context-group>
3028 </trans-unit> 3550 </trans-unit>
3029 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3551 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3030 <source>Are you sure you want to update the configuration?</source> 3552 <source>480p</source>
3031 <target>Volètz vertadièrament actualizar la configuracion ?</target> 3553 <target>480p</target>
3032 <context-group name="null"> 3554 <context-group name="null">
3033 <context context-type="linenumber">1</context> 3555 <context context-type="linenumber">1</context>
3034 </context-group> 3556 </context-group>
3035 </trans-unit> 3557 </trans-unit>
3036 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3558 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3037 <source>Please type</source> 3559 <source>720p</source>
3038 <target>Mercés de picar</target> 3560 <target>720p</target>
3039 <context-group name="null"> 3561 <context-group name="null">
3040 <context context-type="linenumber">1</context> 3562 <context context-type="linenumber">1</context>
3041 </context-group> 3563 </context-group>
3042 </trans-unit> 3564 </trans-unit>
3043 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3565 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3044 <source>to confirm.</source> 3566 <source>1080p</source>
3045 <target>per confirmar.</target> 3567 <target>1080p</target>
3046 <context-group name="null"> 3568 <context-group name="null">
3047 <context context-type="linenumber">1</context> 3569 <context context-type="linenumber">1</context>
3048 </context-group> 3570 </context-group>
3049 </trans-unit> 3571 </trans-unit>
3050 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 3572 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3051 <source>Success</source> 3573 <source>Auto (via ffmpeg)</source>
3052 <target>Succès</target> 3574 <target>Auto (via ffmpeg)</target>
3053 <context-group name="null"> 3575 <context-group name="null">
3054 <context context-type="linenumber">1</context> 3576 <context context-type="linenumber">1</context>
3055 </context-group> 3577 </context-group>
@@ -3068,6 +3590,69 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3068 <context context-type="linenumber">1</context> 3590 <context context-type="linenumber">1</context>
3069 </context-group> 3591 </context-group>
3070 </trans-unit> 3592 </trans-unit>
3593 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3594 <source>100MB</source>
3595 <target>100 Mo</target>
3596 <context-group name="null">
3597 <context context-type="linenumber">1</context>
3598 </context-group>
3599 </trans-unit>
3600 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3601 <source>500MB</source>
3602 <target>500 Mo</target>
3603 <context-group name="null">
3604 <context context-type="linenumber">1</context>
3605 </context-group>
3606 </trans-unit>
3607 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3608 <source>1GB</source>
3609 <target>1 Go</target>
3610 <context-group name="null">
3611 <context context-type="linenumber">1</context>
3612 </context-group>
3613 </trans-unit>
3614 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3615 <source>5GB</source>
3616 <target>5 Go</target>
3617 <context-group name="null">
3618 <context context-type="linenumber">1</context>
3619 </context-group>
3620 </trans-unit>
3621 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3622 <source>20GB</source>
3623 <target>20 Go</target>
3624 <context-group name="null">
3625 <context context-type="linenumber">1</context>
3626 </context-group>
3627 </trans-unit>
3628 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3629 <source>50GB</source>
3630 <target>50 Go</target>
3631 <context-group name="null">
3632 <context context-type="linenumber">1</context>
3633 </context-group>
3634 </trans-unit>
3635 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3636 <source>10MB</source>
3637 <target>10 Mo</target>
3638 <context-group name="null">
3639 <context context-type="linenumber">1</context>
3640 </context-group>
3641 </trans-unit>
3642 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3643 <source>50MB</source>
3644 <target>50 Mo</target>
3645 <context-group name="null">
3646 <context context-type="linenumber">1</context>
3647 </context-group>
3648 </trans-unit>
3649 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3650 <source>2GB</source>
3651 <target>2 Go</target>
3652 <context-group name="null">
3653 <context context-type="linenumber">1</context>
3654 </context-group>
3655 </trans-unit>
3071 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3656 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3072 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3657 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3073 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> es pas valid</target> 3658 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> es pas valid</target>
@@ -3152,6 +3737,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3152 <context context-type="linenumber">1</context> 3737 <context context-type="linenumber">1</context>
3153 </context-group> 3738 </context-group>
3154 </trans-unit> 3739 </trans-unit>
3740 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3741 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3742 <target>Lo compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> es pas mai mut per vòstra instància.</target>
3743 <context-group name="null">
3744 <context context-type="linenumber">1</context>
3745 </context-group>
3746 </trans-unit>
3747 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3748 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3749 <target>L’instància <x id="INTERPOLATION" equiv-text="{{host}}"/> es pas mai muda per vòstra instància.</target>
3750 <context-group name="null">
3751 <context context-type="linenumber">1</context>
3752 </context-group>
3753 </trans-unit>
3155 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3754 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3156 <source>Comment updated.</source> 3755 <source>Comment updated.</source>
3157 <target>Comentari actualizat.</target> 3756 <target>Comentari actualizat.</target>
@@ -3159,6 +3758,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3159 <context context-type="linenumber">1</context> 3758 <context context-type="linenumber">1</context>
3160 </context-group> 3759 </context-group>
3161 </trans-unit> 3760 </trans-unit>
3761 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3762 <source>Delete this report</source>
3763 <target>Suprimir aqueste senhalament</target>
3764 <context-group name="null">
3765 <context context-type="linenumber">1</context>
3766 </context-group>
3767 </trans-unit>
3768 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3769 <source>Update moderation comment</source>
3770 <target>Actualizar lo comentari de moderacion</target>
3771 <context-group name="null">
3772 <context context-type="linenumber">1</context>
3773 </context-group>
3774 </trans-unit>
3162 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3"> 3775 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
3163 <source>Mark as accepted</source> 3776 <source>Mark as accepted</source>
3164 <target>Marcar coma acceptat</target> 3777 <target>Marcar coma acceptat</target>
@@ -3173,8 +3786,8 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3173 <context context-type="linenumber">1</context> 3786 <context context-type="linenumber">1</context>
3174 </context-group> 3787 </context-group>
3175 </trans-unit> 3788 </trans-unit>
3176 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3789 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3177 <source>Do you really want to delete this abuse?</source> 3790 <source>Do you really want to delete this abuse report?</source>
3178 <target>Volètz vertadièrament suprimir aqueste senhalament ?</target> 3791 <target>Volètz vertadièrament suprimir aqueste senhalament ?</target>
3179 <context-group name="null"> 3792 <context-group name="null">
3180 <context context-type="linenumber">1</context> 3793 <context context-type="linenumber">1</context>
@@ -3187,6 +3800,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3187 <context context-type="linenumber">1</context> 3800 <context context-type="linenumber">1</context>
3188 </context-group> 3801 </context-group>
3189 </trans-unit> 3802 </trans-unit>
3803 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
3804 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
3805 <target>Volètz vertadièrament levar aquesta vidèo de la lista negra ? Serà disponibla tornamai dins la lista de las vidèo.</target>
3806 <context-group name="null">
3807 <context context-type="linenumber">1</context>
3808 </context-group>
3809 </trans-unit>
3190 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f"> 3810 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
3191 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source> 3811 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
3192 <target>Vidèo <x id="INTERPOLATION" equiv-text="{{name}}"/> tirada de la lista negra.</target> 3812 <target>Vidèo <x id="INTERPOLATION" equiv-text="{{name}}"/> tirada de la lista negra.</target>
@@ -3215,16 +3835,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3215 <context context-type="linenumber">1</context> 3835 <context context-type="linenumber">1</context>
3216 </context-group> 3836 </context-group>
3217 </trans-unit> 3837 </trans-unit>
3218 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 3838 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3219 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 3839 <source>Unban</source>
3220 <target>Utilizaire <x id="INTERPOLATION" equiv-text="{{username}}"/> fòrabandit.</target> 3840 <target>Reabilitar</target>
3221 <context-group name="null"> 3841 <context-group name="null">
3222 <context context-type="linenumber">1</context> 3842 <context context-type="linenumber">1</context>
3223 </context-group> 3843 </context-group>
3224 </trans-unit> 3844 </trans-unit>
3225 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0"> 3845 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3226 <source>Ban</source> 3846 <source>Set Email as Verified</source>
3227 <target>Fòrabandir</target> 3847 <target>Passar l’adreça coma verificada</target>
3228 <context-group name="null"> 3848 <context-group name="null">
3229 <context context-type="linenumber">1</context> 3849 <context context-type="linenumber">1</context>
3230 </context-group> 3850 </context-group>
@@ -3236,6 +3856,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3236 <context context-type="linenumber">1</context> 3856 <context context-type="linenumber">1</context>
3237 </context-group> 3857 </context-group>
3238 </trans-unit> 3858 </trans-unit>
3859 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3860 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3861 <target>Volètz vertadièrament reabilitar los <x id="INTERPOLATION" equiv-text="{{num}}"/> utilizaires ?</target>
3862 <context-group name="null">
3863 <context context-type="linenumber">1</context>
3864 </context-group>
3865 </trans-unit>
3866 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3867 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3868 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilizaires reabilitats.</target>
3869 <context-group name="null">
3870 <context context-type="linenumber">1</context>
3871 </context-group>
3872 </trans-unit>
3239 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 3873 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
3240 <source>You cannot delete root.</source> 3874 <source>You cannot delete root.</source>
3241 <target>Podètz suprimir l’utilizaire root</target> 3875 <target>Podètz suprimir l’utilizaire root</target>
@@ -3243,9 +3877,44 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3243 <context context-type="linenumber">1</context> 3877 <context context-type="linenumber">1</context>
3244 </context-group> 3878 </context-group>
3245 </trans-unit> 3879 </trans-unit>
3246 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3880 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3247 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3881 <source>If you remove these users, you will not be able to create others with the same username!</source>
3248 <target>Utilizaire <x id="INTERPOLATION" equiv-text="{{username}}"/> suprimit.</target> 3882 <target>Se levatz aquestes utilizaires, poiretz pas ne crear d’autres amb lo meteis nom.</target>
3883 <context-group name="null">
3884 <context context-type="linenumber">1</context>
3885 </context-group>
3886 </trans-unit>
3887 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3888 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3889 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilizaires suprimits.</target>
3890 <context-group name="null">
3891 <context context-type="linenumber">1</context>
3892 </context-group>
3893 </trans-unit>
3894 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3895 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3896 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> adreças d’utilizaires passadas coma verificadas.</target>
3897 <context-group name="null">
3898 <context context-type="linenumber">1</context>
3899 </context-group>
3900 </trans-unit>
3901 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3902 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3903 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> pas mai mut.</target>
3904 <context-group name="null">
3905 <context context-type="linenumber">1</context>
3906 </context-group>
3907 </trans-unit>
3908 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3909 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3910 <target>L’instància <x id="INTERPOLATION" equiv-text="{{host}}"/> es pas mai muda.</target>
3911 <context-group name="null">
3912 <context context-type="linenumber">1</context>
3913 </context-group>
3914 </trans-unit>
3915 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3916 <source>Ownership accepted</source>
3917 <target>Proprietat acceptada</target>
3249 <context-group name="null"> 3918 <context-group name="null">
3250 <context context-type="linenumber">1</context> 3919 <context context-type="linenumber">1</context>
3251 </context-group> 3920 </context-group>
@@ -3257,6 +3926,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3257 <context context-type="linenumber">1</context> 3926 <context context-type="linenumber">1</context>
3258 </context-group> 3927 </context-group>
3259 </trans-unit> 3928 </trans-unit>
3929 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3930 <source>You current password is invalid.</source>
3931 <target>Lo senhal acual es invalid.</target>
3932 <context-group name="null">
3933 <context context-type="linenumber">1</context>
3934 </context-group>
3935 </trans-unit>
3260 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3936 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3261 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3937 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3262 <target>Volètz vertadièrament suprimir lo compte ? Aquò suprimirà totas las donadas, e tanben las cadenas, vidèos, etc.</target> 3938 <target>Volètz vertadièrament suprimir lo compte ? Aquò suprimirà totas las donadas, e tanben las cadenas, vidèos, etc.</target>
@@ -3285,6 +3961,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3285 <context context-type="linenumber">1</context> 3961 <context context-type="linenumber">1</context>
3286 </context-group> 3962 </context-group>
3287 </trans-unit> 3963 </trans-unit>
3964 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
3965 <source>Preferences saved</source>
3966 <target>Preferéncias salvagardadas</target>
3967 <context-group name="null">
3968 <context context-type="linenumber">1</context>
3969 </context-group>
3970 </trans-unit>
3288 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 3971 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3289 <source>Profile updated.</source> 3972 <source>Profile updated.</source>
3290 <target>Perfil actualizat</target> 3973 <target>Perfil actualizat</target>
@@ -3313,6 +3996,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3313 <context context-type="linenumber">1</context> 3996 <context context-type="linenumber">1</context>
3314 </context-group> 3997 </context-group>
3315 </trans-unit> 3998 </trans-unit>
3999 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
4000 <source>This name already exists on this instance.</source>
4001 <target>Aqueste nom existís ja sus aquesta instància.</target>
4002 <context-group name="null">
4003 <context context-type="linenumber">1</context>
4004 </context-group>
4005 </trans-unit>
3316 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 4006 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3317 <source>Create</source> 4007 <source>Create</source>
3318 <target>Crear</target> 4008 <target>Crear</target>
@@ -3327,23 +4017,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3327 <context context-type="linenumber">1</context> 4017 <context context-type="linenumber">1</context>
3328 </context-group> 4018 </context-group>
3329 </trans-unit> 4019 </trans-unit>
3330 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4020 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3331 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4021 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3332 <target>Volètz vertadièrament suprimir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ? Aquò suprimarà tanben totas las vidèos enviadas a la cadena.</target> 4022 <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target>
3333 <context-group name="null">
3334 <context context-type="linenumber">1</context>
3335 </context-group>
3336 </trans-unit>
3337 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3338 <source>Please type the name of the video channel to confirm</source>
3339 <target>Tornatz picar lo nom de la cadena per confirmar</target>
3340 <context-group name="null"> 4023 <context-group name="null">
3341 <context context-type="linenumber">1</context> 4024 <context context-type="linenumber">1</context>
3342 </context-group> 4025 </context-group>
3343 </trans-unit> 4026 </trans-unit>
3344 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4027 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3345 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4028 <source>My videos</source>
3346 <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target> 4029 <target>Mas vidèos</target>
3347 <context-group name="null"> 4030 <context-group name="null">
3348 <context context-type="linenumber">1</context> 4031 <context context-type="linenumber">1</context>
3349 </context-group> 4032 </context-group>
@@ -3411,16 +4094,65 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3411 <context context-type="linenumber">1</context> 4094 <context context-type="linenumber">1</context>
3412 </context-group> 4095 </context-group>
3413 </trans-unit> 4096 </trans-unit>
3414 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 4097 <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
3415 <source>Channels</source> 4098 <source>Ownership change request sent.</source>
3416 <target>Cadenas</target> 4099 <target>Demanda de cambiament de proprietat enviada.</target>
4100 <context-group name="null">
4101 <context context-type="linenumber">1</context>
4102 </context-group>
4103 </trans-unit>
4104 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4105 <source>My library</source>
4106 <target>Ma bibliotèca</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
4111 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4112 <source>My channels</source>
4113 <target>Mas cadenas</target>
4114 <context-group name="null">
4115 <context context-type="linenumber">1</context>
4116 </context-group>
4117 </trans-unit>
4118 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4119 <source>My subscriptions</source>
4120 <target>Mos abonaments</target>
4121 <context-group name="null">
4122 <context context-type="linenumber">1</context>
4123 </context-group>
4124 </trans-unit>
4125 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4126 <source>My history</source>
4127 <target>Mon istoric</target>
4128 <context-group name="null">
4129 <context context-type="linenumber">1</context>
4130 </context-group>
4131 </trans-unit>
4132 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4133 <source>Misc</source>
4134 <target>Divèrs</target>
4135 <context-group name="null">
4136 <context context-type="linenumber">1</context>
4137 </context-group>
4138 </trans-unit>
4139 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4140 <source>Ownership changes</source>
4141 <target>Cambiaments de proprietats</target>
4142 <context-group name="null">
4143 <context context-type="linenumber">1</context>
4144 </context-group>
4145 </trans-unit>
4146 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
4147 <source>My settings</source>
4148 <target>Mos paramètres</target>
3417 <context-group name="null"> 4149 <context-group name="null">
3418 <context context-type="linenumber">1</context> 4150 <context context-type="linenumber">1</context>
3419 </context-group> 4151 </context-group>
3420 </trans-unit> 4152 </trans-unit>
3421 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 4153 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
3422 <source>Video imports</source> 4154 <source>My notifications</source>
3423 <target>Imports vidèo</target> 4155 <target>Mas notificacions</target>
3424 <context-group name="null"> 4156 <context-group name="null">
3425 <context context-type="linenumber">1</context> 4157 <context context-type="linenumber">1</context>
3426 </context-group> 4158 </context-group>
@@ -3439,6 +4171,97 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3439 <context context-type="linenumber">1</context> 4171 <context context-type="linenumber">1</context>
3440 </context-group> 4172 </context-group>
3441 </trans-unit> 4173 </trans-unit>
4174 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4175 <source>Subscribe to the account</source>
4176 <target>S’abonar al compte</target>
4177 <context-group name="null">
4178 <context context-type="linenumber">1</context>
4179 </context-group>
4180 </trans-unit>
4181 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4182 <source>Focus the search bar</source>
4183 <target>Centrar sus la barra de recèrca</target>
4184 <context-group name="null">
4185 <context context-type="linenumber">1</context>
4186 </context-group>
4187 </trans-unit>
4188 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4189 <source>Toggle the left menu</source>
4190 <target>Plegar/Desplegar lo menú d’esquèrra</target>
4191 <context-group name="null">
4192 <context context-type="linenumber">1</context>
4193 </context-group>
4194 </trans-unit>
4195 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4196 <source>Go to the videos overview page</source>
4197 <target>Anar a la pagina d’apercebut</target>
4198 <context-group name="null">
4199 <context context-type="linenumber">1</context>
4200 </context-group>
4201 </trans-unit>
4202 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4203 <source>Go to the trending videos page</source>
4204 <target>Anar a la pagina de las vidèos tendéncia</target>
4205 <context-group name="null">
4206 <context context-type="linenumber">1</context>
4207 </context-group>
4208 </trans-unit>
4209 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4210 <source>Go to the recently added videos page</source>
4211 <target>Anar als apondons recents</target>
4212 <context-group name="null">
4213 <context context-type="linenumber">1</context>
4214 </context-group>
4215 </trans-unit>
4216 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4217 <source>Go to the local videos page</source>
4218 <target>Anar a la pagina de vidèos localas</target>
4219 <context-group name="null">
4220 <context context-type="linenumber">1</context>
4221 </context-group>
4222 </trans-unit>
4223 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4224 <source>Go to the videos upload page</source>
4225 <target>Anar a la pagina per enviar de vidèos</target>
4226 <context-group name="null">
4227 <context context-type="linenumber">1</context>
4228 </context-group>
4229 </trans-unit>
4230 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4231 <source>Toggle Dark theme</source>
4232 <target>Passar al tèma escur</target>
4233 <context-group name="null">
4234 <context context-type="linenumber">1</context>
4235 </context-group>
4236 </trans-unit>
4237 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4238 <source>Go to my subscriptions</source>
4239 <target>Anar a mos abonaments</target>
4240 <context-group name="null">
4241 <context context-type="linenumber">1</context>
4242 </context-group>
4243 </trans-unit>
4244 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4245 <source>Go to my videos</source>
4246 <target>Anar a mas vidèos</target>
4247 <context-group name="null">
4248 <context context-type="linenumber">1</context>
4249 </context-group>
4250 </trans-unit>
4251 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4252 <source>Go to my imports</source>
4253 <target>Anar a mos imports</target>
4254 <context-group name="null">
4255 <context context-type="linenumber">1</context>
4256 </context-group>
4257 </trans-unit>
4258 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4259 <source>Go to my channels</source>
4260 <target>Anar a ma cadena</target>
4261 <context-group name="null">
4262 <context context-type="linenumber">1</context>
4263 </context-group>
4264 </trans-unit>
3442 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4265 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3443 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4266 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3444</source> 4267</source>
@@ -3455,6 +4278,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3455 <context context-type="linenumber">1</context> 4278 <context context-type="linenumber">1</context>
3456 </context-group> 4279 </context-group>
3457 </trans-unit> 4280 </trans-unit>
4281 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4282 <source>Error</source>
4283 <target>Error</target>
4284 <context-group name="null">
4285 <context context-type="linenumber">1</context>
4286 </context-group>
4287 </trans-unit>
3458 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4288 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3459 <source>You need to reconnect.</source> 4289 <source>You need to reconnect.</source>
3460 <target>Vos cal vos reconnectar.</target> 4290 <target>Vos cal vos reconnectar.</target>
@@ -3476,6 +4306,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3476 <context context-type="linenumber">1</context> 4306 <context context-type="linenumber">1</context>
3477 </context-group> 4307 </context-group>
3478 </trans-unit> 4308 </trans-unit>
4309 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4310 <source>Info</source>
4311 <target>Info</target>
4312 <context-group name="null">
4313 <context context-type="linenumber">1</context>
4314 </context-group>
4315 </trans-unit>
4316 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4317 <source>Success</source>
4318 <target>Succès</target>
4319 <context-group name="null">
4320 <context context-type="linenumber">1</context>
4321 </context-group>
4322 </trans-unit>
3479 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4323 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3480 <source>Incorrect username or password.</source> 4324 <source>Incorrect username or password.</source>
3481 <target>Nom d’utilizaire o senhal incorrècte.</target> 4325 <target>Nom d’utilizaire o senhal incorrècte.</target>
@@ -3534,21 +4378,21 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3534 </trans-unit> 4378 </trans-unit>
3535 <trans-unit id="d2f3bf121699ff08a25fa4859bfdf3996bf821cc"> 4379 <trans-unit id="d2f3bf121699ff08a25fa4859bfdf3996bf821cc">
3536 <source>Short (&lt; 4 min)</source> 4380 <source>Short (&lt; 4 min)</source>
3537 <target>Cort (&lt; 4 min)</target> 4381 <target>Corta (&lt; 4 min)</target>
3538 <context-group name="null"> 4382 <context-group name="null">
3539 <context context-type="linenumber">1</context> 4383 <context context-type="linenumber">1</context>
3540 </context-group> 4384 </context-group>
3541 </trans-unit> 4385 </trans-unit>
3542 <trans-unit id="ac0fa1039f09ec0d917303658c5bb1ee813a4225"> 4386 <trans-unit id="ac0fa1039f09ec0d917303658c5bb1ee813a4225">
3543 <source>Long (&gt; 10 min)</source> 4387 <source>Long (&gt; 10 min)</source>
3544 <target>Long (&gt; 10 min)</target> 4388 <target>Longa (&gt; 10 min)</target>
3545 <context-group name="null"> 4389 <context-group name="null">
3546 <context context-type="linenumber">1</context> 4390 <context context-type="linenumber">1</context>
3547 </context-group> 4391 </context-group>
3548 </trans-unit> 4392 </trans-unit>
3549 <trans-unit id="f24d368d6be0fee70fb4503d2ad37a612e1b0889"> 4393 <trans-unit id="f24d368d6be0fee70fb4503d2ad37a612e1b0889">
3550 <source>Medium (4-10 min)</source> 4394 <source>Medium (4-10 min)</source>
3551 <target>Mejan (4-10 min)</target> 4395 <target>Mejana (4-10 min)</target>
3552 <context-group name="null"> 4396 <context-group name="null">
3553 <context context-type="linenumber">1</context> 4397 <context context-type="linenumber">1</context>
3554 </context-group> 4398 </context-group>
@@ -3686,58 +4530,65 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3686 <context context-type="linenumber">1</context> 4530 <context context-type="linenumber">1</context>
3687 </context-group> 4531 </context-group>
3688 </trans-unit> 4532 </trans-unit>
3689 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4533 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
3690 <source>Username is required.</source> 4534 <source>Transcoding threads must be greater or equal to 0.</source>
3691 <target>Lo nom d’utilizaire es requesit.</target> 4535 <target>Los fils de transcodatge devon èsser superiors o egals a 1.</target>
3692 <context-group name="null"> 4536 <context-group name="null">
3693 <context context-type="linenumber">1</context> 4537 <context context-type="linenumber">1</context>
3694 </context-group> 4538 </context-group>
3695 </trans-unit> 4539 </trans-unit>
3696 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5"> 4540 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3697 <source>Password is required.</source> 4541 <source>Email is required.</source>
3698 <target>Lo senhal es requesit.</target> 4542 <target>L’adreça electronica es requesida.</target>
3699 <context-group name="null"> 4543 <context-group name="null">
3700 <context context-type="linenumber">1</context> 4544 <context context-type="linenumber">1</context>
3701 </context-group> 4545 </context-group>
3702 </trans-unit> 4546 </trans-unit>
3703 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154"> 4547 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3704 <source>Confirmation of the password is required.</source> 4548 <source>Email must be valid.</source>
3705 <target>La confirmacion del senhal es requesida.</target> 4549 <target>L’adreça electronica deu èsser valida.</target>
3706 <context-group name="null"> 4550 <context-group name="null">
3707 <context context-type="linenumber">1</context> 4551 <context context-type="linenumber">1</context>
3708 </context-group> 4552 </context-group>
3709 </trans-unit> 4553 </trans-unit>
3710 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 4554 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
3711 <source>Username must be at least 3 characters long.</source> 4555 <source>Your name is required.</source>
3712 <target>Lo nom d’utilizaire deu conténer almens 3 caractèrs.</target> 4556 <target>Vòstre nom es requesit</target>
3713 <context-group name="null"> 4557 <context-group name="null">
3714 <context context-type="linenumber">1</context> 4558 <context context-type="linenumber">1</context>
3715 </context-group> 4559 </context-group>
3716 </trans-unit> 4560 </trans-unit>
3717 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef"> 4561 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3718 <source>Username cannot be more than 20 characters long.</source> 4562 <source>Username is required.</source>
3719 <target>Lo nom d’utilizaire pòt pas conténer mai de 20 caractèrs.</target> 4563 <target>Lo nom d’utilizaire es requesit.</target>
3720 <context-group name="null"> 4564 <context-group name="null">
3721 <context context-type="linenumber">1</context> 4565 <context context-type="linenumber">1</context>
3722 </context-group> 4566 </context-group>
3723 </trans-unit> 4567 </trans-unit>
3724 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9"> 4568 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
3725 <source>Username should be only lowercase alphanumeric characters.</source> 4569 <source>Password is required.</source>
3726 <target>Lo nom d’utilizaire deu èsser alfanumeric e un minuscula. </target> 4570 <target>Lo senhal es requesit.</target>
3727 <context-group name="null"> 4571 <context-group name="null">
3728 <context context-type="linenumber">1</context> 4572 <context context-type="linenumber">1</context>
3729 </context-group> 4573 </context-group>
3730 </trans-unit> 4574 </trans-unit>
3731 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 4575 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
3732 <source>Email is required.</source> 4576 <source>Confirmation of the password is required.</source>
3733 <target>L’adreça electronica es requesida.</target> 4577 <target>La confirmacion del senhal es requesida.</target>
3734 <context-group name="null"> 4578 <context-group name="null">
3735 <context context-type="linenumber">1</context> 4579 <context context-type="linenumber">1</context>
3736 </context-group> 4580 </context-group>
3737 </trans-unit> 4581 </trans-unit>
3738 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1"> 4582 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
3739 <source>Email must be valid.</source> 4583 <source>Username must be at least 1 character long.</source>
3740 <target>L’adreça electronica deu èsser valida.</target> 4584 <target>Lo nom d’utilizaire deu almens conténer 1 caractèr.</target>
4585 <context-group name="null">
4586 <context context-type="linenumber">1</context>
4587 </context-group>
4588 </trans-unit>
4589 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
4590 <source>Username cannot be more than 50 characters long.</source>
4591 <target>Lo nom d’utilizaire pòt pas conténer mai de 50 caractèrs.</target>
3741 <context-group name="null"> 4592 <context-group name="null">
3742 <context context-type="linenumber">1</context> 4593 <context context-type="linenumber">1</context>
3743 </context-group> 4594 </context-group>
@@ -3777,6 +4628,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3777 <context context-type="linenumber">1</context> 4628 <context context-type="linenumber">1</context>
3778 </context-group> 4629 </context-group>
3779 </trans-unit> 4630 </trans-unit>
4631 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
4632 <source>Daily upload limit is required.</source>
4633 <target>Lo quòta jornalièr de mandadís es requesit.</target>
4634 <context-group name="null">
4635 <context context-type="linenumber">1</context>
4636 </context-group>
4637 </trans-unit>
4638 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
4639 <source>Daily upload limit must be greater than -1.</source>
4640 <target>Lo quòta jornalièr deu èsser superior a -1.</target>
4641 <context-group name="null">
4642 <context context-type="linenumber">1</context>
4643 </context-group>
4644 </trans-unit>
3780 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85"> 4645 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
3781 <source>User role is required.</source> 4646 <source>User role is required.</source>
3782 <target>Lo ròtle del l’utilizaire es requesit.</target> 4647 <target>Lo ròtle del l’utilizaire es requesit.</target>
@@ -3791,16 +4656,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3791 <context context-type="linenumber">1</context> 4656 <context context-type="linenumber">1</context>
3792 </context-group> 4657 </context-group>
3793 </trans-unit> 4658 </trans-unit>
3794 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 4659 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
3795 <source>Display name must be at least 3 characters long.</source> 4660 <source>Display name must be at least 1 character long.</source>
3796 <target>L’escais-nom deu almens conténer 3 caractèrs.</target> 4661 <target>Lo nom public deu almens conténer 1 caractèr.</target>
3797 <context-group name="null"> 4662 <context-group name="null">
3798 <context context-type="linenumber">1</context> 4663 <context context-type="linenumber">1</context>
3799 </context-group> 4664 </context-group>
3800 </trans-unit> 4665 </trans-unit>
3801 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 4666 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
3802 <source>Display name cannot be more than 120 characters long.</source> 4667 <source>Display name cannot be more than 50 characters long.</source>
3803 <target>L’escais-nom pòt pas conténer mai de 120 caractèrs.</target> 4668 <target>Lo nom public pòt pas conténer mai de 50 caractèrs.</target>
3804 <context-group name="null"> 4669 <context-group name="null">
3805 <context context-type="linenumber">1</context> 4670 <context context-type="linenumber">1</context>
3806 </context-group> 4671 </context-group>
@@ -3812,9 +4677,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3812 <context context-type="linenumber">1</context> 4677 <context context-type="linenumber">1</context>
3813 </context-group> 4678 </context-group>
3814 </trans-unit> 4679 </trans-unit>
3815 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4680 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
3816 <source>Description cannot be more than 250 characters long.</source> 4681 <source>Description cannot be more than 1000 characters long.</source>
3817 <target>La descripcion pòt pas conténer mai de 250 caractèrs.</target> 4682 <target>La descripcion pòt pas conténer mai de 1000 caractèrs.</target>
3818 <context-group name="null"> 4683 <context-group name="null">
3819 <context context-type="linenumber">1</context> 4684 <context context-type="linenumber">1</context>
3820 </context-group> 4685 </context-group>
@@ -3826,6 +4691,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3826 <context context-type="linenumber">1</context> 4691 <context context-type="linenumber">1</context>
3827 </context-group> 4692 </context-group>
3828 </trans-unit> 4693 </trans-unit>
4694 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
4695 <source>Ban reason must be at least 3 characters long.</source>
4696 <target>La rason del bandiment deu conténer almens 3 caractèrs.</target>
4697 <context-group name="null">
4698 <context context-type="linenumber">1</context>
4699 </context-group>
4700 </trans-unit>
4701 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
4702 <source>Ban reason cannot be more than 250 characters long.</source>
4703 <target>La rason del bandiment pòt pas conténer mai de 250 caractèrs.</target>
4704 <context-group name="null">
4705 <context context-type="linenumber">1</context>
4706 </context-group>
4707 </trans-unit>
3829 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 4708 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
3830 <source>Report reason is required.</source> 4709 <source>Report reason is required.</source>
3831 <target>La rason del senha es requesida.</target> 4710 <target>La rason del senha es requesida.</target>
@@ -3840,9 +4719,37 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3840 <context context-type="linenumber">1</context> 4719 <context context-type="linenumber">1</context>
3841 </context-group> 4720 </context-group>
3842 </trans-unit> 4721 </trans-unit>
3843 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9"> 4722 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
3844 <source>Report reason cannot be more than 300 characters long.</source> 4723 <source>Moderation comment is required.</source>
3845 <target>La rason del senhalament pòt pas conténer mai de 300 caractèrs.</target> 4724 <target>Lo comentari de moderacion es requesit.</target>
4725 <context-group name="null">
4726 <context context-type="linenumber">1</context>
4727 </context-group>
4728 </trans-unit>
4729 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
4730 <source>Moderation comment must be at least 2 characters long.</source>
4731 <target>Lo comentari de moderacon deu conténer almens 2 caractèrs.</target>
4732 <context-group name="null">
4733 <context context-type="linenumber">1</context>
4734 </context-group>
4735 </trans-unit>
4736 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4737 <source>The channel is required.</source>
4738 <target>La cadena es requesida.</target>
4739 <context-group name="null">
4740 <context context-type="linenumber">1</context>
4741 </context-group>
4742 </trans-unit>
4743 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
4744 <source>Blacklist reason must be at least 2 characters long.</source>
4745 <target>La rason de la mesa en lista negra deu conténer almens 2 caractèrs.</target>
4746 <context-group name="null">
4747 <context context-type="linenumber">1</context>
4748 </context-group>
4749 </trans-unit>
4750 <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
4751 <source>Blacklist reason cannot be more than 300 characters long.</source>
4752 <target>La rason de la mesa en lista negra pòt pas conténer mai de 300 caractèrs.</target>
3846 <context-group name="null"> 4753 <context-group name="null">
3847 <context context-type="linenumber">1</context> 4754 <context context-type="linenumber">1</context>
3848 </context-group> 4755 </context-group>
@@ -3861,9 +4768,37 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3861 <context context-type="linenumber">1</context> 4768 <context context-type="linenumber">1</context>
3862 </context-group> 4769 </context-group>
3863 </trans-unit> 4770 </trans-unit>
3864 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 4771 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
3865 <source>Description cannot be more than 500 characters long.</source> 4772 <source>The username is required.</source>
3866 <target>La descripcion pòt pas conténer mai de 500 caractèrs.</target> 4773 <target>Lo nom d’utilizaire es requesit.</target>
4774 <context-group name="null">
4775 <context context-type="linenumber">1</context>
4776 </context-group>
4777 </trans-unit>
4778 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4779 <source>You can only transfer ownership to a local account</source>
4780 <target>Podètz pas que transferir la proprietat a un compte compte local</target>
4781 <context-group name="null">
4782 <context context-type="linenumber">1</context>
4783 </context-group>
4784 </trans-unit>
4785 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4786 <source>Name is required.</source>
4787 <target>Lo nom es requesit.</target>
4788 <context-group name="null">
4789 <context context-type="linenumber">1</context>
4790 </context-group>
4791 </trans-unit>
4792 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
4793 <source>Name must be at least 1 character long.</source>
4794 <target>Lo nom deu almens conténer 1 caractèr.</target>
4795 <context-group name="null">
4796 <context context-type="linenumber">1</context>
4797 </context-group>
4798 </trans-unit>
4799 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
4800 <source>Name cannot be more than 50 characters long.</source>
4801 <target>Lo nom pòt pas conténer mai de 50 caractèrs.</target>
3867 <context-group name="null"> 4802 <context-group name="null">
3868 <context context-type="linenumber">1</context> 4803 <context context-type="linenumber">1</context>
3869 </context-group> 4804 </context-group>
@@ -3875,9 +4810,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3875 <context context-type="linenumber">1</context> 4810 <context context-type="linenumber">1</context>
3876 </context-group> 4811 </context-group>
3877 </trans-unit> 4812 </trans-unit>
3878 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4813 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
3879 <source>Support text cannot be more than 500 characters long.</source> 4814 <source>Support text cannot be more than 1000 characters long.</source>
3880 <target>Lo tèxte de sosten pòt pas conténer mai de 500 caractèrs.</target> 4815 <target>Lo tèxte de sosten pòt pas conténer mai de 1000 caractèrs.</target>
3881 <context-group name="null"> 4816 <context-group name="null">
3882 <context context-type="linenumber">1</context> 4817 <context context-type="linenumber">1</context>
3883 </context-group> 4818 </context-group>
@@ -3973,9 +4908,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3973 <context context-type="linenumber">1</context> 4908 <context context-type="linenumber">1</context>
3974 </context-group> 4909 </context-group>
3975 </trans-unit> 4910 </trans-unit>
3976 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4911 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
3977 <source>Video support cannot be more than 500 characters long.</source> 4912 <source>Video support cannot be more than 1000 characters long.</source>
3978 <target>Lo tèxte de sosten pòt pas conténer mai de 500 caractèrs.</target> 4913 <target>Lo tèxte de sosten pòt pas conténer mai de 1000 caractèrs.</target>
3979 <context-group name="null"> 4914 <context-group name="null">
3980 <context context-type="linenumber">1</context> 4915 <context context-type="linenumber">1</context>
3981 </context-group> 4916 </context-group>
@@ -4330,6 +5265,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4330 <context context-type="linenumber">1</context> 5265 <context context-type="linenumber">1</context>
4331 </context-group> 5266 </context-group>
4332 </trans-unit> 5267 </trans-unit>
5268 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
5269 <source>Transcode your videos in multiple resolutions</source>
5270 <target>Convertir las vidèos en mantunas resolucions</target>
5271 <context-group name="null">
5272 <context context-type="linenumber">1</context>
5273 </context-group>
5274 </trans-unit>
4333 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1"> 5275 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
4334 <source>HTTP import (YouTube, Vimeo, direct URL...)</source> 5276 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
4335 <target>Importacion HTTP (YouTube, Vimeo, URL dirècta...)</target> 5277 <target>Importacion HTTP (YouTube, Vimeo, URL dirècta...)</target>
@@ -4416,14 +5358,14 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4416 </trans-unit> 5358 </trans-unit>
4417 <trans-unit id="a7654c3ece96e777527606f1c2870d6ee0b180f7"> 5359 <trans-unit id="a7654c3ece96e777527606f1c2870d6ee0b180f7">
4418 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> days ago</source> 5360 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> days ago</source>
4419 <target>Fa<x id="INTERPOLATION" equiv-text="{{interval}}"/> jorns</target> 5361 <target>fa <x id="INTERPOLATION" equiv-text="{{interval}}"/> jorns</target>
4420 <context-group name="null"> 5362 <context-group name="null">
4421 <context context-type="linenumber">1</context> 5363 <context context-type="linenumber">1</context>
4422 </context-group> 5364 </context-group>
4423 </trans-unit> 5365 </trans-unit>
4424 <trans-unit id="5b465235ae55091d32535e23dd180c407f1352d1"> 5366 <trans-unit id="5b465235ae55091d32535e23dd180c407f1352d1">
4425 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> day ago</source> 5367 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> day ago</source>
4426 <target>Fa <x id="INTERPOLATION" equiv-text="{{interval}}"/> jorn</target> 5368 <target>fa <x id="INTERPOLATION" equiv-text="{{interval}}"/> jorn</target>
4427 <context-group name="null"> 5369 <context-group name="null">
4428 <context context-type="linenumber">1</context> 5370 <context context-type="linenumber">1</context>
4429 </context-group> 5371 </context-group>
@@ -4498,6 +5440,153 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4498 <context context-type="linenumber">1</context> 5440 <context context-type="linenumber">1</context>
4499 </context-group> 5441 </context-group>
4500 </trans-unit> 5442 </trans-unit>
5443 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5444 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5445 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> utilizaires fòrabandits.</target>
5446 <context-group name="null">
5447 <context context-type="linenumber">1</context>
5448 </context-group>
5449 </trans-unit>
5450 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5451 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5452 <target>Utilizaire <x id="INTERPOLATION" equiv-text="{{username}}"/> fòrabandit.</target>
5453 <context-group name="null">
5454 <context context-type="linenumber">1</context>
5455 </context-group>
5456 </trans-unit>
5457 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5458 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5459 <target>Volètz vertadièrament reabilitar <x id="INTERPOLATION" equiv-text="{{username}}"/> ?</target>
5460 <context-group name="null">
5461 <context context-type="linenumber">1</context>
5462 </context-group>
5463 </trans-unit>
5464 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5465 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5466 <target>L’utilizaire <x id="INTERPOLATION" equiv-text="{{username}}"/> es reabilitat.</target>
5467 <context-group name="null">
5468 <context context-type="linenumber">1</context>
5469 </context-group>
5470 </trans-unit>
5471 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5472 <source>If you remove this user, you will not be able to create another with the same username!</source>
5473 <target>Se levatz aqueste utilizaire, poiretz pas ne crear un autre amb lo meteis nom d’utilizaire !</target>
5474 <context-group name="null">
5475 <context context-type="linenumber">1</context>
5476 </context-group>
5477 </trans-unit>
5478 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5479 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5480 <target>Utilizaire <x id="INTERPOLATION" equiv-text="{{username}}"/> suprimit.</target>
5481 <context-group name="null">
5482 <context context-type="linenumber">1</context>
5483 </context-group>
5484 </trans-unit>
5485 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5486 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5487 <target>L’adreça a <x id="INTERPOLATION" equiv-text="{{username}}"/> es passada coma verificada</target>
5488 <context-group name="null">
5489 <context context-type="linenumber">1</context>
5490 </context-group>
5491 </trans-unit>
5492 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5493 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5494 <target>Lo compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> es mut.</target>
5495 <context-group name="null">
5496 <context context-type="linenumber">1</context>
5497 </context-group>
5498 </trans-unit>
5499 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5500 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5501 <target>L’instància <x id="INTERPOLATION" equiv-text="{{host}}"/> es muda.</target>
5502 <context-group name="null">
5503 <context context-type="linenumber">1</context>
5504 </context-group>
5505 </trans-unit>
5506 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5507 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5508 <target>Lo compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> es ut per l’instància.</target>
5509 <context-group name="null">
5510 <context context-type="linenumber">1</context>
5511 </context-group>
5512 </trans-unit>
5513 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5514 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5515 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> pas mai mut per l’instància.</target>
5516 <context-group name="null">
5517 <context context-type="linenumber">1</context>
5518 </context-group>
5519 </trans-unit>
5520 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5521 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5522 <target>L’instància <x id="INTERPOLATION" equiv-text="{{host}}"/> es muda per l’instància.</target>
5523 <context-group name="null">
5524 <context context-type="linenumber">1</context>
5525 </context-group>
5526 </trans-unit>
5527 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5528 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5529 <target>L’instància <x id="INTERPOLATION" equiv-text="{{host}}"/> es pas mai muda per l’instància.</target>
5530 <context-group name="null">
5531 <context context-type="linenumber">1</context>
5532 </context-group>
5533 </trans-unit>
5534 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5535 <source>Mute this account</source>
5536 <target>Silenciar aqueste compte</target>
5537 <context-group name="null">
5538 <context context-type="linenumber">1</context>
5539 </context-group>
5540 </trans-unit>
5541 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5542 <source>Unmute this account</source>
5543 <target>Restablir aqueste compte</target>
5544 <context-group name="null">
5545 <context context-type="linenumber">1</context>
5546 </context-group>
5547 </trans-unit>
5548 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5549 <source>Mute the instance</source>
5550 <target>Silenciar l’instància</target>
5551 <context-group name="null">
5552 <context context-type="linenumber">1</context>
5553 </context-group>
5554 </trans-unit>
5555 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5556 <source>Unmute the instance</source>
5557 <target>Restablir l’instància</target>
5558 <context-group name="null">
5559 <context context-type="linenumber">1</context>
5560 </context-group>
5561 </trans-unit>
5562 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5563 <source>Mute this account by your instance</source>
5564 <target>Silenciar aqueste compte per vòstra instància</target>
5565 <context-group name="null">
5566 <context context-type="linenumber">1</context>
5567 </context-group>
5568 </trans-unit>
5569 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5570 <source>Unmute this account by your instance</source>
5571 <target>Restablir aqueste compte per vòstra instància</target>
5572 <context-group name="null">
5573 <context context-type="linenumber">1</context>
5574 </context-group>
5575 </trans-unit>
5576 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5577 <source>Mute the instance by your instance</source>
5578 <target>Silenciar aquesta instància per la vòstra.</target>
5579 <context-group name="null">
5580 <context context-type="linenumber">1</context>
5581 </context-group>
5582 </trans-unit>
5583 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5584 <source>Unmute the instance by your instance</source>
5585 <target>Restablir aquesta instància per la vòstra.</target>
5586 <context-group name="null">
5587 <context context-type="linenumber">1</context>
5588 </context-group>
5589 </trans-unit>
4501 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5590 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4502 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5591 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4503 <target>La requèsta es tròp granda pel servidor. Mercés de contactar l’administrator se volètz aumentar la talha limita.</target> 5592 <target>La requèsta es tròp granda pel servidor. Mercés de contactar l’administrator se volètz aumentar la talha limita.</target>
@@ -4526,6 +5615,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4526 <context context-type="linenumber">1</context> 5615 <context context-type="linenumber">1</context>
4527 </context-group> 5616 </context-group>
4528 </trans-unit> 5617 </trans-unit>
5618 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5619 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5620 <target>S’abonèt a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5621 <context-group name="null">
5622 <context context-type="linenumber">1</context>
5623 </context-group>
5624 </trans-unit>
4529 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5625 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4530 <source>Subscribed</source> 5626 <source>Subscribed</source>
4531 <target>Abonat</target> 5627 <target>Abonat</target>
@@ -4533,9 +5629,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4533 <context context-type="linenumber">1</context> 5629 <context context-type="linenumber">1</context>
4534 </context-group> 5630 </context-group>
4535 </trans-unit> 5631 </trans-unit>
4536 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5632 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
4537 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5633 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4538 <target>S’abonèt a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5634 <target>Quitèt de seguir <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
4539 <context-group name="null"> 5635 <context-group name="null">
4540 <context context-type="linenumber">1</context> 5636 <context context-type="linenumber">1</context>
4541 </context-group> 5637 </context-group>
@@ -4547,9 +5643,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4547 <context context-type="linenumber">1</context> 5643 <context context-type="linenumber">1</context>
4548 </context-group> 5644 </context-group>
4549 </trans-unit> 5645 </trans-unit>
4550 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5646 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
4551 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5647 <source>Moderator</source>
4552 <target>Quitèt de seguir <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5648 <target>Moderator</target>
4553 <context-group name="null"> 5649 <context-group name="null">
4554 <context context-type="linenumber">1</context> 5650 <context context-type="linenumber">1</context>
4555 </context-group> 5651 </context-group>
@@ -4575,23 +5671,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4575 <context context-type="linenumber">1</context> 5671 <context context-type="linenumber">1</context>
4576 </context-group> 5672 </context-group>
4577 </trans-unit> 5673 </trans-unit>
4578 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 5674 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
4579 <source>Welcome</source> 5675 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
4580 <target>Benvengut</target> 5676 <target>La benvenguda ! Ara volgatz ben verificar vòstres corrièls per confirmar vòstre compte e acabar l’inscripcion.</target>
4581 <context-group name="null"> 5677 <context-group name="null">
4582 <context context-type="linenumber">1</context> 5678 <context context-type="linenumber">1</context>
4583 </context-group> 5679 </context-group>
4584 </trans-unit> 5680 </trans-unit>
4585 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c"> 5681 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
4586 <source>Please check your email to verify your account and complete signup.</source> 5682 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
4587 <target>Mercés de verificar vòstres messatges per verificar lo compte e completar l’inscripcion.</target> 5683 <target>Sètz ara connectat coma <x id="INTERPOLATION" equiv-text="{{username}}"/> !</target>
4588 <context-group name="null">
4589 <context context-type="linenumber">1</context>
4590 </context-group>
4591 </trans-unit>
4592 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
4593 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
4594 <target>Inscripcions per <x id="INTERPOLATION" equiv-text="{{username}}"/> acabadas.</target>
4595 <context-group name="null"> 5684 <context-group name="null">
4596 <context context-type="linenumber">1</context> 5685 <context context-type="linenumber">1</context>
4597 </context-group> 5686 </context-group>
@@ -4624,13 +5713,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4624 <context context-type="linenumber">1</context> 5713 <context context-type="linenumber">1</context>
4625 </context-group> 5714 </context-group>
4626 </trans-unit> 5715 </trans-unit>
4627 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4628 <source>Info</source>
4629 <target>Info</target>
4630 <context-group name="null">
4631 <context context-type="linenumber">1</context>
4632 </context-group>
4633 </trans-unit>
4634 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5716 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4635 <source>Upload cancelled</source> 5717 <source>Upload cancelled</source>
4636 <target>Mandadís anullat</target> 5718 <target>Mandadís anullat</target>
@@ -4638,13 +5720,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4638 <context context-type="linenumber">1</context> 5720 <context context-type="linenumber">1</context>
4639 </context-group> 5721 </context-group>
4640 </trans-unit> 5722 </trans-unit>
4641 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4642 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4643 <target>O planhèm mas PeerTube pòt pas gerir de vidèos de mai de 8 Go</target>
4644 <context-group name="null">
4645 <context context-type="linenumber">1</context>
4646 </context-group>
4647 </trans-unit>
4648 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5723 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4649 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 5724 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4650 <target>Vòstre quòta de vidèo es excedit amb aquesta vidèo (talha vidèo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizat : <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quòta : <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5725 <target>Vòstre quòta de vidèo es excedit amb aquesta vidèo (talha vidèo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizat : <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quòta : <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -4708,6 +5783,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4708 <context context-type="linenumber">1</context> 5783 <context context-type="linenumber">1</context>
4709 </context-group> 5784 </context-group>
4710 </trans-unit> 5785 </trans-unit>
5786 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5787 <source>Like the video</source>
5788 <target>Aimar la vidèo</target>
5789 <context-group name="null">
5790 <context context-type="linenumber">1</context>
5791 </context-group>
5792 </trans-unit>
5793 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5794 <source>Dislike the video</source>
5795 <target>Detestar la vidèo</target>
5796 <context-group name="null">
5797 <context context-type="linenumber">1</context>
5798 </context-group>
5799 </trans-unit>
4711 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5800 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
4712 <source>Do you really want to delete this video?</source> 5801 <source>Do you really want to delete this video?</source>
4713 <target>Volètz vertadièrament suprimir aquesta vidèo ?</target> 5802 <target>Volètz vertadièrament suprimir aquesta vidèo ?</target>
diff --git a/client/src/locale/target/angular_pl_PL.xml b/client/src/locale/target/angular_pl_PL.xml
index 0d25a6ed4..6d5a06e53 100644
--- a/client/src/locale/target/angular_pl_PL.xml
+++ b/client/src/locale/target/angular_pl_PL.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Wybierz miesiÄ…c</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Wybierz rok</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -168,7 +182,7 @@
168 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 182 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
169 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetleń</target> 183 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetleń</target>
170 <context-group name="null"> 184 <context-group name="null">
171 <context context-type="linenumber">13</context> 185 <context context-type="linenumber">16</context>
172 </context-group> 186 </context-group>
173 </trans-unit> 187 </trans-unit>
174 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 188 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -182,7 +196,7 @@
182 <source>Edit</source> 196 <source>Edit</source>
183 <target>Edytuj</target> 197 <target>Edytuj</target>
184 <context-group name="null"> 198 <context-group name="null">
185 <context context-type="linenumber">5</context> 199 <context context-type="linenumber">1</context>
186 </context-group> 200 </context-group>
187 </trans-unit> 201 </trans-unit>
188 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 202 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -206,11 +220,50 @@
206 <context context-type="linenumber">19</context> 220 <context context-type="linenumber">19</context>
207 </context-group> 221 </context-group>
208 </trans-unit> 222 </trans-unit>
223 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
224 <source>
225 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
226 Subscribe
227 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
228 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
229 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
230 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
231 </source>
232 <target>
233 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
234 Subskrybuj
235 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
236 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
237 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
238 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
239 </target>
240 <context-group name="null">
241 <context context-type="linenumber">5</context>
242 </context-group>
243 </trans-unit>
244 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
245 <source>
246 Unsubscribe
247 </source>
248 <target>
249 Odsubskrybuj
250 </target>
251 <context-group name="null">
252 <context context-type="linenumber">18</context>
253 </context-group>
254 </trans-unit>
255 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
256 <source>Subscribe via RSS</source>
257 <target>Subskrybuj przez RSS</target>
258 <context-group name="null">
259 <context context-type="linenumber">49</context>
260 </context-group>
261 </trans-unit>
209 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 262 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
210 <source>Video quota</source> 263 <source>Video quota</source>
211 <target>Powierzchnia na filmy</target> 264 <target>Powierzchnia na filmy</target>
212 <context-group name="null"> 265 <context-group name="null">
213 <context context-type="linenumber">19</context> 266 <context context-type="linenumber">42</context>
214 </context-group> 267 </context-group>
215 </trans-unit> 268 </trans-unit>
216 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 269 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -224,6 +277,13 @@
224 <context context-type="linenumber">14</context> 277 <context context-type="linenumber">14</context>
225 </context-group> 278 </context-group>
226 </trans-unit> 279 </trans-unit>
280 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
281 <source>Reason...</source>
282 <target>Przyczyna…</target>
283 <context-group name="null">
284 <context context-type="linenumber">11</context>
285 </context-group>
286 </trans-unit>
227 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 287 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
228 <source> 288 <source>
229 Login 289 Login
@@ -282,7 +342,7 @@
282 <source>Password</source> 342 <source>Password</source>
283 <target>Hasło</target> 343 <target>Hasło</target>
284 <context-group name="null"> 344 <context-group name="null">
285 <context context-type="linenumber">12</context> 345 <context context-type="linenumber">13</context>
286 </context-group> 346 </context-group>
287 </trans-unit> 347 </trans-unit>
288 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -296,7 +356,7 @@
296 <source>Login</source> 356 <source>Login</source>
297 <target>Zaloguj siÄ™</target> 357 <target>Zaloguj siÄ™</target>
298 <context-group name="null"> 358 <context-group name="null">
299 <context context-type="linenumber">38</context> 359 <context context-type="linenumber">36</context>
300 </context-group> 360 </context-group>
301 </trans-unit> 361 </trans-unit>
302 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -324,7 +384,7 @@
324 <source>Send me an email to reset my password</source> 384 <source>Send me an email to reset my password</source>
325 <target>Wyślij mi wiadomość e-mail przywracającą hasło</target> 385 <target>Wyślij mi wiadomość e-mail przywracającą hasło</target>
326 <context-group name="null"> 386 <context-group name="null">
327 <context context-type="linenumber">75</context> 387 <context context-type="linenumber">80</context>
328 </context-group> 388 </context-group>
329 </trans-unit> 389 </trans-unit>
330 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 390 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -381,21 +441,14 @@
381 <source>Example: jane_doe</source> 441 <source>Example: jane_doe</source>
382 <target>Przykład: jane_doe</target> 442 <target>Przykład: jane_doe</target>
383 <context-group name="null"> 443 <context-group name="null">
384 <context context-type="linenumber">16</context> 444 <context context-type="linenumber">17</context>
385 </context-group>
386 </trans-unit>
387 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
388 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
389 <target>Przeczytałem i zgadzam się z &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Regulaminem&lt;/a&gt; tej instancji</target>
390 <context-group name="null">
391 <context context-type="linenumber">54</context>
392 </context-group> 445 </context-group>
393 </trans-unit> 446 </trans-unit>
394 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 447 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
395 <source>Signup</source> 448 <source>Signup</source>
396 <target>Zarejestruj siÄ™</target> 449 <target>Zarejestruj siÄ™</target>
397 <context-group name="null"> 450 <context-group name="null">
398 <context context-type="linenumber">88</context> 451 <context context-type="linenumber">78</context>
399 </context-group> 452 </context-group>
400 </trans-unit> 453 </trans-unit>
401 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 454 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -416,13 +469,6 @@
416 <context context-type="linenumber">6</context> 469 <context context-type="linenumber">6</context>
417 </context-group> 470 </context-group>
418 </trans-unit> 471 </trans-unit>
419 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
420 <source>Filters</source>
421 <target>Filtry</target>
422 <context-group name="null">
423 <context context-type="linenumber">16</context>
424 </context-group>
425 </trans-unit>
426 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 472 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
427 <source> 473 <source>
428 No results found 474 No results found
@@ -431,28 +477,28 @@
431 Nie znaleziono wyników 477 Nie znaleziono wyników
432 </target> 478 </target>
433 <context-group name="null"> 479 <context-group name="null">
434 <context context-type="linenumber">25</context> 480 <context context-type="linenumber">28</context>
435 </context-group> 481 </context-group>
436 </trans-unit> 482 </trans-unit>
437 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 483 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
438 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 484 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
439 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subskrybentów</target> 485 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subskrybentów</target>
440 <context-group name="null"> 486 <context-group name="null">
441 <context context-type="linenumber">41</context> 487 <context context-type="linenumber">44</context>
442 </context-group> 488 </context-group>
443 </trans-unit> 489 </trans-unit>
444 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 490 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
445 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 491 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
446 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> wyświetleń</target> 492 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> wyświetleń</target>
447 <context-group name="null"> 493 <context-group name="null">
448 <context context-type="linenumber">52</context> 494 <context context-type="linenumber">55</context>
449 </context-group> 495 </context-group>
450 </trans-unit> 496 </trans-unit>
451 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 497 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
452 <source>Change the language</source> 498 <source>Change the language</source>
453 <target>Zmień język</target> 499 <target>Zmień język</target>
454 <context-group name="null"> 500 <context-group name="null">
455 <context context-type="linenumber">88</context> 501 <context context-type="linenumber">86</context>
456 </context-group> 502 </context-group>
457 </trans-unit> 503 </trans-unit>
458 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 504 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -463,7 +509,7 @@
463 Mój profil publiczny 509 Mój profil publiczny
464 </target> 510 </target>
465 <context-group name="null"> 511 <context-group name="null">
466 <context context-type="linenumber">18</context> 512 <context context-type="linenumber">16</context>
467 </context-group> 513 </context-group>
468 </trans-unit> 514 </trans-unit>
469 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 515 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -474,7 +520,7 @@
474 Moje konto 520 Moje konto
475 </target> 521 </target>
476 <context-group name="null"> 522 <context-group name="null">
477 <context context-type="linenumber">22</context> 523 <context context-type="linenumber">20</context>
478 </context-group> 524 </context-group>
479 </trans-unit> 525 </trans-unit>
480 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 526 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -485,7 +531,7 @@
485 Moje filmy 531 Moje filmy
486 </target> 532 </target>
487 <context-group name="null"> 533 <context-group name="null">
488 <context context-type="linenumber">26</context> 534 <context context-type="linenumber">24</context>
489 </context-group> 535 </context-group>
490 </trans-unit> 536 </trans-unit>
491 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 537 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -496,14 +542,14 @@
496 Wyloguj siÄ™ 542 Wyloguj siÄ™
497 </target> 543 </target>
498 <context-group name="null"> 544 <context-group name="null">
499 <context context-type="linenumber">30</context> 545 <context context-type="linenumber">28</context>
500 </context-group> 546 </context-group>
501 </trans-unit> 547 </trans-unit>
502 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 548 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
503 <source>Create an account</source> 549 <source>Create an account</source>
504 <target>Utwórz konto</target> 550 <target>Utwórz konto</target>
505 <context-group name="null"> 551 <context-group name="null">
506 <context context-type="linenumber">39</context> 552 <context context-type="linenumber">37</context>
507 </context-group> 553 </context-group>
508 </trans-unit> 554 </trans-unit>
509 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 555 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -517,49 +563,49 @@
517 <source>Subscriptions</source> 563 <source>Subscriptions</source>
518 <target>Subskrybcje</target> 564 <target>Subskrybcje</target>
519 <context-group name="null"> 565 <context-group name="null">
520 <context context-type="linenumber">47</context> 566 <context context-type="linenumber">45</context>
521 </context-group> 567 </context-group>
522 </trans-unit> 568 </trans-unit>
523 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 569 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
524 <source>Overview</source> 570 <source>Overview</source>
525 <target>PrzeglÄ…d</target> 571 <target>PrzeglÄ…d</target>
526 <context-group name="null"> 572 <context-group name="null">
527 <context context-type="linenumber">52</context> 573 <context context-type="linenumber">50</context>
528 </context-group> 574 </context-group>
529 </trans-unit> 575 </trans-unit>
530 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 576 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
531 <source>Trending</source> 577 <source>Trending</source>
532 <target>Na czasie</target> 578 <target>Na czasie</target>
533 <context-group name="null"> 579 <context-group name="null">
534 <context context-type="linenumber">57</context> 580 <context context-type="linenumber">55</context>
535 </context-group> 581 </context-group>
536 </trans-unit> 582 </trans-unit>
537 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 583 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
538 <source>Recently added</source> 584 <source>Recently added</source>
539 <target>Ostatnio dodane</target> 585 <target>Ostatnio dodane</target>
540 <context-group name="null"> 586 <context-group name="null">
541 <context context-type="linenumber">62</context> 587 <context context-type="linenumber">60</context>
542 </context-group> 588 </context-group>
543 </trans-unit> 589 </trans-unit>
544 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 590 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
545 <source>Local</source> 591 <source>Local</source>
546 <target>Lokalne</target> 592 <target>Lokalne</target>
547 <context-group name="null"> 593 <context-group name="null">
548 <context context-type="linenumber">67</context> 594 <context context-type="linenumber">65</context>
549 </context-group> 595 </context-group>
550 </trans-unit> 596 </trans-unit>
551 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 597 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
552 <source>More</source> 598 <source>More</source>
553 <target>Więcej</target> 599 <target>Więcej</target>
554 <context-group name="null"> 600 <context-group name="null">
555 <context context-type="linenumber">72</context> 601 <context context-type="linenumber">70</context>
556 </context-group> 602 </context-group>
557 </trans-unit> 603 </trans-unit>
558 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 604 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
559 <source>Administration</source> 605 <source>Administration</source>
560 <target>Administracja</target> 606 <target>Administracja</target>
561 <context-group name="null"> 607 <context-group name="null">
562 <context context-type="linenumber">76</context> 608 <context context-type="linenumber">74</context>
563 </context-group> 609 </context-group>
564 </trans-unit> 610 </trans-unit>
565 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 611 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -573,7 +619,7 @@
573 <source>Toggle dark interface</source> 619 <source>Toggle dark interface</source>
574 <target>Przełącz ciemny interfejs</target> 620 <target>Przełącz ciemny interfejs</target>
575 <context-group name="null"> 621 <context-group name="null">
576 <context context-type="linenumber">94</context> 622 <context context-type="linenumber">92</context>
577 </context-group> 623 </context-group>
578 </trans-unit> 624 </trans-unit>
579 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 625 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -678,7 +724,7 @@
678 <source>No results.</source> 724 <source>No results.</source>
679 <target>Brak wyników.</target> 725 <target>Brak wyników.</target>
680 <context-group name="null"> 726 <context-group name="null">
681 <context context-type="linenumber">7</context> 727 <context context-type="linenumber">20</context>
682 </context-group> 728 </context-group>
683 </trans-unit> 729 </trans-unit>
684 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 730 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -715,7 +761,7 @@
715 <source>Instance</source> 761 <source>Instance</source>
716 <target>Instancja</target> 762 <target>Instancja</target>
717 <context-group name="null"> 763 <context-group name="null">
718 <context context-type="linenumber">8</context> 764 <context context-type="linenumber">12</context>
719 </context-group> 765 </context-group>
720 </trans-unit> 766 </trans-unit>
721 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 767 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -725,15 +771,22 @@
725 <context context-type="linenumber">7</context> 771 <context context-type="linenumber">7</context>
726 </context-group> 772 </context-group>
727 </trans-unit> 773 </trans-unit>
728 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 774 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
729 <source> 775 <source>
730 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 776 Cancel
731</source> 777 </source>
732 <target> 778 <target>
733 O instancji <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 779 Anuluj
734</target> 780 </target>
735 <context-group name="null"> 781 <context-group name="null">
736 <context context-type="linenumber">1</context> 782 <context context-type="linenumber">26</context>
783 </context-group>
784 </trans-unit>
785 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
786 <source>Submit</source>
787 <target>Wyślij</target>
788 <context-group name="null">
789 <context context-type="linenumber">31</context>
737 </context-group> 790 </context-group>
738 </trans-unit> 791 </trans-unit>
739 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 792 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -747,47 +800,14 @@
747 <source>Terms</source> 800 <source>Terms</source>
748 <target>Zasady</target> 801 <target>Zasady</target>
749 <context-group name="null"> 802 <context-group name="null">
750 <context context-type="linenumber">44</context> 803 <context context-type="linenumber">39</context>
751 </context-group> 804 </context-group>
752 </trans-unit> 805 </trans-unit>
753 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 806 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
754 <source>User registration is allowed and</source> 807 <source>User registration is allowed and</source>
755 <target>Rejestracja użytkowników jest dozwolona i</target> 808 <target>Rejestracja użytkowników jest dozwolona i</target>
756 <context-group name="null"> 809 <context-group name="null">
757 <context context-type="linenumber">25</context> 810 <context context-type="linenumber">29</context>
758 </context-group>
759 </trans-unit>
760 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
761 <source>
762 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
763 </source>
764 <target>
765 ta instancja oferuje podstawową powierzchnię <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> na filmy swoich użytkowników.
766 </target>
767 <context-group name="null">
768 <context context-type="linenumber">27</context>
769 </context-group>
770 </trans-unit>
771 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
772 <source>
773 this instance provides unlimited space for the videos of its users.
774 </source>
775 <target>
776 ta instancja oferuje nieograniczoną powierzchnię na filmy dla swoich użytkowników.
777 </target>
778 <context-group name="null">
779 <context context-type="linenumber">31</context>
780 </context-group>
781 </trans-unit>
782 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
783 <source>
784 User registration is currently not allowed.
785 </source>
786 <target>
787 Rejestracja użytkowników nie jest obecnie dozwolona.
788 </target>
789 <context-group name="null">
790 <context context-type="linenumber">36</context>
791 </context-group> 811 </context-group>
792 </trans-unit> 812 </trans-unit>
793 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 813 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -986,19 +1006,6 @@
986 <context context-type="linenumber">83</context> 1006 <context context-type="linenumber">83</context>
987 </context-group> 1007 </context-group>
988 </trans-unit> 1008 </trans-unit>
989 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
990 <source>
991 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
992 In the meantime, we want to test different ideas related to this issue:
993 </source>
994 <target>
995 PeerTube jest dopiero w fazie beta, zamierzamy dostarczyć najlepsze możliwe środki zaradcze wraz z wersją stabilną.
996 W międzyczasie, zamierzamy przetestować różne pomysły związane z tym problemem:
997 </target>
998 <context-group name="null">
999 <context context-type="linenumber">85</context>
1000 </context-group>
1001 </trans-unit>
1002 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1009 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1003 <source>Set a limit to the number of peers sent by the tracker</source> 1010 <source>Set a limit to the number of peers sent by the tracker</source>
1004 <target>Ustawienie maksymalnej liczby peerów wysłanych przez tracker</target> 1011 <target>Ustawienie maksymalnej liczby peerów wysłanych przez tracker</target>
@@ -1028,8 +1035,7 @@
1028 </context-group> 1035 </context-group>
1029 </trans-unit> 1036 </trans-unit>
1030 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6"> 1037 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6">
1031 <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source> 1038 <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source><target>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</target><context-group name="null">
1032 <context-group name="null">
1033 <context context-type="linenumber">95</context> 1039 <context context-type="linenumber">95</context>
1034 </context-group> 1040 </context-group>
1035 </trans-unit> 1041 </trans-unit>
@@ -1037,14 +1043,14 @@
1037 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1043 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1038 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subskrybentów</target> 1044 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subskrybentów</target>
1039 <context-group name="null"> 1045 <context-group name="null">
1040 <context context-type="linenumber">12</context> 1046 <context context-type="linenumber">24</context>
1041 </context-group> 1047 </context-group>
1042 </trans-unit> 1048 </trans-unit>
1043 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1049 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1044 <source>Video channels</source> 1050 <source>Video channels</source>
1045 <target>Kanały wideo</target> 1051 <target>Kanały wideo</target>
1046 <context-group name="null"> 1052 <context-group name="null">
1047 <context context-type="linenumber">19</context> 1053 <context context-type="linenumber">31</context>
1048 </context-group> 1054 </context-group>
1049 </trans-unit> 1055 </trans-unit>
1050 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1056 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1086,48 +1092,47 @@
1086 <source>Short description</source> 1092 <source>Short description</source>
1087 <target>Krótki opis</target> 1093 <target>Krótki opis</target>
1088 <context-group name="null"> 1094 <context-group name="null">
1089 <context context-type="linenumber">22</context> 1095 <context context-type="linenumber">21</context>
1090 </context-group> 1096 </context-group>
1091 </trans-unit> 1097 </trans-unit>
1092 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1098 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1093 <source>Default client route</source> 1099 <source>Default client route</source><target>Default client route</target><context-group name="null">
1094 <context-group name="null"> 1100 <context context-type="linenumber">48</context>
1095 <context context-type="linenumber">55</context>
1096 </context-group> 1101 </context-group>
1097 </trans-unit> 1102 </trans-unit>
1098 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1103 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1099 <source>Videos Overview</source> 1104 <source>Videos Overview</source>
1100 <target>Przegląd Filmów</target> 1105 <target>Przegląd Filmów</target>
1101 <context-group name="null"> 1106 <context-group name="null">
1102 <context context-type="linenumber">58</context> 1107 <context context-type="linenumber">51</context>
1103 </context-group> 1108 </context-group>
1104 </trans-unit> 1109 </trans-unit>
1105 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1110 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1106 <source>Videos Trending</source> 1111 <source>Videos Trending</source>
1107 <target>Filmy na czasie</target> 1112 <target>Filmy na czasie</target>
1108 <context-group name="null"> 1113 <context-group name="null">
1109 <context context-type="linenumber">59</context> 1114 <context context-type="linenumber">52</context>
1110 </context-group> 1115 </context-group>
1111 </trans-unit> 1116 </trans-unit>
1112 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1117 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1113 <source>Videos Recently Added</source> 1118 <source>Videos Recently Added</source>
1114 <target>Ostatnio dodane filmy</target> 1119 <target>Ostatnio dodane filmy</target>
1115 <context-group name="null"> 1120 <context-group name="null">
1116 <context context-type="linenumber">60</context> 1121 <context context-type="linenumber">53</context>
1117 </context-group> 1122 </context-group>
1118 </trans-unit> 1123 </trans-unit>
1119 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1124 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1120 <source>Local videos</source> 1125 <source>Local videos</source>
1121 <target>Lokalne filmy</target> 1126 <target>Lokalne filmy</target>
1122 <context-group name="null"> 1127 <context-group name="null">
1123 <context context-type="linenumber">61</context> 1128 <context context-type="linenumber">54</context>
1124 </context-group> 1129 </context-group>
1125 </trans-unit> 1130 </trans-unit>
1126 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1131 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1127 <source>Policy on videos containing sensitive content</source> 1132 <source>Policy on videos containing sensitive content</source>
1128 <target>Polityka dotycząca filmów zawierających wrażliwą zawartość</target> 1133 <target>Polityka dotycząca filmów zawierających wrażliwą zawartość</target>
1129 <context-group name="null"> 1134 <context-group name="null">
1130 <context context-type="linenumber">70</context> 1135 <context context-type="linenumber">61</context>
1131 </context-group> 1136 </context-group>
1132 </trans-unit> 1137 </trans-unit>
1133 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1138 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1162,21 +1167,42 @@
1162 <source>Signup enabled</source> 1167 <source>Signup enabled</source>
1163 <target>Wymagana rejestracja</target> 1168 <target>Wymagana rejestracja</target>
1164 <context-group name="null"> 1169 <context-group name="null">
1165 <context context-type="linenumber">92</context> 1170 <context context-type="linenumber">84</context>
1166 </context-group> 1171 </context-group>
1167 </trans-unit> 1172 </trans-unit>
1168 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1173 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1169 <source>Signup requires email verification</source> 1174 <source>Signup requires email verification</source>
1170 <target>Rejestracja wymaga weryfikacji emaila</target> 1175 <target>Rejestracja wymaga weryfikacji emaila</target>
1171 <context-group name="null"> 1176 <context-group name="null">
1172 <context context-type="linenumber">97</context> 1177 <context context-type="linenumber">91</context>
1173 </context-group> 1178 </context-group>
1174 </trans-unit> 1179 </trans-unit>
1175 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1180 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1176 <source>Signup limit</source> 1181 <source>Signup limit</source>
1177 <target>Limit rejestracji</target> 1182 <target>Limit rejestracji</target>
1178 <context-group name="null"> 1183 <context-group name="null">
1179 <context context-type="linenumber">101</context> 1184 <context context-type="linenumber">96</context>
1185 </context-group>
1186 </trans-unit>
1187 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1188 <source>Users</source>
1189 <target>Użytkownicy</target>
1190 <context-group name="null">
1191 <context context-type="linenumber">105</context>
1192 </context-group>
1193 </trans-unit>
1194 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1195 <source>User default video quota</source>
1196 <target>Domyślna powierzchnia na filmy dla użytkownika</target>
1197 <context-group name="null">
1198 <context context-type="linenumber">109</context>
1199 </context-group>
1200 </trans-unit>
1201 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1202 <source>User default daily upload limit</source>
1203 <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
1204 <context-group name="null">
1205 <context context-type="linenumber">121</context>
1180 </context-group> 1206 </context-group>
1181 </trans-unit> 1207 </trans-unit>
1182 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1208 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1190,35 +1216,14 @@
1190 <source>Administrator</source> 1216 <source>Administrator</source>
1191 <target>Administrator</target> 1217 <target>Administrator</target>
1192 <context-group name="null"> 1218 <context-group name="null">
1193 <context context-type="linenumber">123</context> 1219 <context context-type="linenumber">155</context>
1194 </context-group> 1220 </context-group>
1195 </trans-unit> 1221 </trans-unit>
1196 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1222 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1197 <source>Admin email</source> 1223 <source>Admin email</source>
1198 <target>E-mail administratora</target> 1224 <target>E-mail administratora</target>
1199 <context-group name="null"> 1225 <context-group name="null">
1200 <context context-type="linenumber">126</context> 1226 <context context-type="linenumber">158</context>
1201 </context-group>
1202 </trans-unit>
1203 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1204 <source>Users</source>
1205 <target>Użytkownicy</target>
1206 <context-group name="null">
1207 <context context-type="linenumber">136</context>
1208 </context-group>
1209 </trans-unit>
1210 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1211 <source>User default video quota</source>
1212 <target>Domyślna powierzchnia na filmy dla użytkownika</target>
1213 <context-group name="null">
1214 <context context-type="linenumber">139</context>
1215 </context-group>
1216 </trans-unit>
1217 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1218 <source>User default daily upload limit</source>
1219 <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
1220 <context-group name="null">
1221 <context context-type="linenumber">153</context>
1222 </context-group> 1227 </context-group>
1223 </trans-unit> 1228 </trans-unit>
1224 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1229 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1232,70 +1237,70 @@
1232 <source>Twitter</source> 1237 <source>Twitter</source>
1233 <target>Twitter</target> 1238 <target>Twitter</target>
1234 <context-group name="null"> 1239 <context-group name="null">
1235 <context context-type="linenumber">170</context> 1240 <context context-type="linenumber">178</context>
1236 </context-group> 1241 </context-group>
1237 </trans-unit> 1242 </trans-unit>
1238 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1243 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1239 <source>Your Twitter username</source> 1244 <source>Your Twitter username</source>
1240 <target>Twoja nazwa użytkownika na Twitterze</target> 1245 <target>Twoja nazwa użytkownika na Twitterze</target>
1241 <context-group name="null"> 1246 <context-group name="null">
1242 <context context-type="linenumber">173</context> 1247 <context context-type="linenumber">184</context>
1243 </context-group> 1248 </context-group>
1244 </trans-unit> 1249 </trans-unit>
1245 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1250 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1246 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1251 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1247 <target>Oznacza konto Twittera dla strony lub platformy na której została opublikowana zawartość.</target> 1252 <target>Oznacza konto Twittera dla strony lub platformy na której została opublikowana zawartość.</target>
1248 <context-group name="null"> 1253 <context-group name="null">
1249 <context context-type="linenumber">176</context> 1254 <context context-type="linenumber">187</context>
1250 </context-group> 1255 </context-group>
1251 </trans-unit> 1256 </trans-unit>
1252 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1257 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1253 <source>Instance whitelisted by Twitter</source> 1258 <source>Instance whitelisted by Twitter</source>
1254 <target>Instancja jest na białej liście Twittera</target> 1259 <target>Instancja jest na białej liście Twittera</target>
1255 <context-group name="null"> 1260 <context-group name="null">
1256 <context context-type="linenumber">189</context> 1261 <context context-type="linenumber">199</context>
1257 </context-group> 1262 </context-group>
1258 </trans-unit> 1263 </trans-unit>
1259 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1264 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1260 <source>Services</source> 1265 <source>Services</source>
1261 <target>Usługi</target> 1266 <target>Usługi</target>
1262 <context-group name="null"> 1267 <context-group name="null">
1263 <context context-type="linenumber">168</context> 1268 <context context-type="linenumber">176</context>
1264 </context-group> 1269 </context-group>
1265 </trans-unit> 1270 </trans-unit>
1266 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1271 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1267 <source>Transcoding</source> 1272 <source>Transcoding</source>
1268 <target>Transkodowanie</target> 1273 <target>Transkodowanie</target>
1269 <context-group name="null"> 1274 <context-group name="null">
1270 <context context-type="linenumber">200</context> 1275 <context context-type="linenumber">215</context>
1271 </context-group> 1276 </context-group>
1272 </trans-unit> 1277 </trans-unit>
1273 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1278 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1274 <source>Transcoding enabled</source> 1279 <source>Transcoding enabled</source>
1275 <target>Transkodowanie jest włączone</target> 1280 <target>Transkodowanie jest włączone</target>
1276 <context-group name="null"> 1281 <context-group name="null">
1277 <context context-type="linenumber">204</context> 1282 <context context-type="linenumber">221</context>
1278 </context-group> 1283 </context-group>
1279 </trans-unit> 1284 </trans-unit>
1280 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1285 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1281 <source>If you disable transcoding, many videos from your users will not work!</source> 1286 <source>If you disable transcoding, many videos from your users will not work!</source>
1282 <target>Jeżeli wyłączysz transkodowanie, wiele filmów od użytkowników może nie działać!</target> 1287 <target>Jeżeli wyłączysz transkodowanie, wiele filmów od użytkowników może nie działać!</target>
1283 <context-group name="null"> 1288 <context-group name="null">
1284 <context context-type="linenumber">205</context> 1289 <context context-type="linenumber">222</context>
1285 </context-group> 1290 </context-group>
1286 </trans-unit> 1291 </trans-unit>
1287 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1292 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1288 <source>Transcoding threads</source> 1293 <source>Transcoding threads</source>
1289 <target>WÄ…tki transkodowania</target> 1294 <target>WÄ…tki transkodowania</target>
1290 <context-group name="null"> 1295 <context-group name="null">
1291 <context context-type="linenumber">211</context> 1296 <context context-type="linenumber">237</context>
1292 </context-group> 1297 </context-group>
1293 </trans-unit> 1298 </trans-unit>
1294 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1299 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1295 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1300 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1296 <target>Włączono rozdzielczość <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target> 1301 <target>Włączono rozdzielczość <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
1297 <context-group name="null"> 1302 <context-group name="null">
1298 <context context-type="linenumber">227</context> 1303 <context context-type="linenumber">252</context>
1299 </context-group> 1304 </context-group>
1300 </trans-unit> 1305 </trans-unit>
1301 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1306 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1310,56 +1315,56 @@
1310 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1315 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1311 </target> 1316 </target>
1312 <context-group name="null"> 1317 <context-group name="null">
1313 <context context-type="linenumber">233</context> 1318 <context context-type="linenumber">260</context>
1314 </context-group> 1319 </context-group>
1315 </trans-unit> 1320 </trans-unit>
1316 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1321 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1317 <source>Previews cache size</source> 1322 <source>Previews cache size</source>
1318 <target>Rozmiar pamięci podręcznej podglądu</target> 1323 <target>Rozmiar pamięci podręcznej podglądu</target>
1319 <context-group name="null"> 1324 <context-group name="null">
1320 <context context-type="linenumber">243</context> 1325 <context context-type="linenumber">271</context>
1321 </context-group> 1326 </context-group>
1322 </trans-unit> 1327 </trans-unit>
1323 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1328 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1324 <source>Customizations</source> 1329 <source>Customizations</source>
1325 <target>Dostosowywanie</target> 1330 <target>Dostosowywanie</target>
1326 <context-group name="null"> 1331 <context-group name="null">
1327 <context context-type="linenumber">264</context> 1332 <context context-type="linenumber">289</context>
1328 </context-group> 1333 </context-group>
1329 </trans-unit> 1334 </trans-unit>
1330 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1335 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1331 <source>JavaScript</source> 1336 <source>JavaScript</source>
1332 <target>JavaScript</target> 1337 <target>JavaScript</target>
1333 <context-group name="null"> 1338 <context-group name="null">
1334 <context context-type="linenumber">267</context> 1339 <context context-type="linenumber">294</context>
1335 </context-group> 1340 </context-group>
1336 </trans-unit> 1341 </trans-unit>
1337 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1342 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1338 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1343 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1339 <target>Wprowadź kod JavaScript.&lt;br /&gt;Przykład: &lt;pre&gt;console.log('moja instancja jest świetna');&lt;/pre&gt;</target> 1344 <target>Wprowadź kod JavaScript.&lt;br /&gt;Przykład: &lt;pre&gt;console.log('moja instancja jest świetna');&lt;/pre&gt;</target>
1340 <context-group name="null"> 1345 <context-group name="null">
1341 <context context-type="linenumber">270</context> 1346 <context context-type="linenumber">297</context>
1342 </context-group> 1347 </context-group>
1343 </trans-unit> 1348 </trans-unit>
1344 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1349 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1345 <source>Advanced configuration</source> 1350 <source>Advanced configuration</source>
1346 <target>Zaawansowana konfiguracja</target> 1351 <target>Zaawansowana konfiguracja</target>
1347 <context-group name="null"> 1352 <context-group name="null">
1348 <context context-type="linenumber">197</context> 1353 <context context-type="linenumber">212</context>
1349 </context-group> 1354 </context-group>
1350 </trans-unit> 1355 </trans-unit>
1351 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1356 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1352 <source>Update configuration</source> 1357 <source>Update configuration</source>
1353 <target>Aktualizuj konfiguracjÄ™</target> 1358 <target>Aktualizuj konfiguracjÄ™</target>
1354 <context-group name="null"> 1359 <context-group name="null">
1355 <context context-type="linenumber">314</context> 1360 <context context-type="linenumber">340</context>
1356 </context-group> 1361 </context-group>
1357 </trans-unit> 1362 </trans-unit>
1358 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1363 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1359 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1364 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1360 <target>Wygląda na to, że konfiguracja jest nieprawidłowa. Poszukaj możliwych błędów w innych kartach.</target> 1365 <target>Wygląda na to, że konfiguracja jest nieprawidłowa. Poszukaj możliwych błędów w innych kartach.</target>
1361 <context-group name="null"> 1366 <context-group name="null">
1362 <context context-type="linenumber">315</context> 1367 <context context-type="linenumber">341</context>
1363 </context-group> 1368 </context-group>
1364 </trans-unit> 1369 </trans-unit>
1365 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1370 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1384,6 +1389,16 @@
1384 <context context-type="linenumber">7</context> 1389 <context context-type="linenumber">7</context>
1385 </context-group> 1390 </context-group>
1386 </trans-unit> 1391 </trans-unit>
1392 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
1393 <source>
1394 Moderation
1395 </source>
1396 <target>
1397 Moderacja </target>
1398 <context-group name="null">
1399 <context context-type="linenumber">11</context>
1400 </context-group>
1401 </trans-unit>
1387 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 1402 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1388 <source> 1403 <source>
1389 Jobs 1404 Jobs
@@ -1442,19 +1457,18 @@
1442 <source>Score</source> 1457 <source>Score</source>
1443 <target>Wynik</target> 1458 <target>Wynik</target>
1444 <context-group name="null"> 1459 <context-group name="null">
1445 <context context-type="linenumber">8</context> 1460 <context context-type="linenumber">17</context>
1446 </context-group> 1461 </context-group>
1447 </trans-unit> 1462 </trans-unit>
1448 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1463 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1449 <source>Host</source> 1464 <source>Host</source>
1450 <target>Host</target> 1465 <target>Host</target>
1451 <context-group name="null"> 1466 <context-group name="null">
1452 <context context-type="linenumber">8</context> 1467 <context context-type="linenumber">19</context>
1453 </context-group> 1468 </context-group>
1454 </trans-unit> 1469 </trans-unit>
1455 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1470 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
1456 <source>State</source> 1471 <source>State</source><target>State</target><context-group name="null">
1457 <context-group name="null">
1458 <context context-type="linenumber">10</context> 1472 <context context-type="linenumber">10</context>
1459 </context-group> 1473 </context-group>
1460 </trans-unit> 1474 </trans-unit>
@@ -1465,6 +1479,20 @@
1465 <context context-type="linenumber">11</context> 1479 <context context-type="linenumber">11</context>
1466 </context-group> 1480 </context-group>
1467 </trans-unit> 1481 </trans-unit>
1482 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1483 <source>Accepted</source>
1484 <target>Zaakceptowane</target>
1485 <context-group name="null">
1486 <context context-type="linenumber">32</context>
1487 </context-group>
1488 </trans-unit>
1489 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1490 <source>Pending</source>
1491 <target>Oczekiwane</target>
1492 <context-group name="null">
1493 <context context-type="linenumber">33</context>
1494 </context-group>
1495 </trans-unit>
1468 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1496 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1469 <source>Manage follows</source> 1497 <source>Manage follows</source>
1470 <target>Zarządzaj śledzeniem</target> 1498 <target>Zarządzaj śledzeniem</target>
@@ -1539,7 +1567,7 @@
1539 <source>Role</source> 1567 <source>Role</source>
1540 <target>Rola</target> 1568 <target>Rola</target>
1541 <context-group name="null"> 1569 <context-group name="null">
1542 <context context-type="linenumber">20</context> 1570 <context context-type="linenumber">43</context>
1543 </context-group> 1571 </context-group>
1544 </trans-unit> 1572 </trans-unit>
1545 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1573 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1547,17 +1575,14 @@
1547 Transcoding is enabled on server. The video quota only take in account <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>original<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> 1575 Transcoding is enabled on server. The video quota only take in account <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>original<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/>
1548 At most, this user could use ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>. 1576 At most, this user could use ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>.
1549 </source> 1577 </source>
1578 <target>
1579 Transcoding is enabled on server. The video quota only take in account <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>original<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> video. <x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/>
1580 At most, this user could use ~ <x id="INTERPOLATION" equiv-text="{{ computeQuotaWithTranscoding() | bytes: 0 }}"/>.
1581 </target>
1550 <context-group name="null"> 1582 <context-group name="null">
1551 <context context-type="linenumber">65</context> 1583 <context context-type="linenumber">65</context>
1552 </context-group> 1584 </context-group>
1553 </trans-unit> 1585 </trans-unit>
1554 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1555 <source>Reason...</source>
1556 <target>Przyczyna…</target>
1557 <context-group name="null">
1558 <context context-type="linenumber">11</context>
1559 </context-group>
1560 </trans-unit>
1561 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1586 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1562 <source>Users list</source> 1587 <source>Users list</source>
1563 <target>Lista użytkowników</target> 1588 <target>Lista użytkowników</target>
@@ -1569,14 +1594,14 @@
1569 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1594 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1570 <target>Nazwa użytkownika <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1595 <target>Nazwa użytkownika <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1571 <context-group name="null"> 1596 <context-group name="null">
1572 <context context-type="linenumber">17</context> 1597 <context context-type="linenumber">40</context>
1573 </context-group> 1598 </context-group>
1574 </trans-unit> 1599 </trans-unit>
1575 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1600 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1576 <source>Actions</source> 1601 <source>Go to the account page</source>
1577 <target>Akcje</target> 1602 <target>Przejdź na stronę konta</target>
1578 <context-group name="null"> 1603 <context-group name="null">
1579 <context context-type="linenumber">33</context> 1604 <context context-type="linenumber">133</context>
1580 </context-group> 1605 </context-group>
1581 </trans-unit> 1606 </trans-unit>
1582 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2"> 1607 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
@@ -1614,6 +1639,13 @@
1614 <context context-type="linenumber">33</context> 1639 <context context-type="linenumber">33</context>
1615 </context-group> 1640 </context-group>
1616 </trans-unit> 1641 </trans-unit>
1642 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1643 <source>Actions</source>
1644 <target>Akcje</target>
1645 <context-group name="null">
1646 <context context-type="linenumber">35</context>
1647 </context-group>
1648 </trans-unit>
1617 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1649 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1618 <source>Reason:</source> 1650 <source>Reason:</source>
1619 <target>Powód:</target> 1651 <target>Powód:</target>
@@ -1625,58 +1657,23 @@
1625 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1657 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1626 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1658 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1627 <context-group name="null"> 1659 <context-group name="null">
1628 <context context-type="linenumber">10</context> 1660 <context context-type="linenumber">11</context>
1629 </context-group>
1630 </trans-unit>
1631 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1632 <source>Blacklisted videos</source>
1633 <target>Filmy na czarnej liście</target>
1634 <context-group name="null">
1635 <context context-type="linenumber">7</context>
1636 </context-group> 1661 </context-group>
1637 </trans-unit> 1662 </trans-unit>
1638 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 1663 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
1639 <source>My settings</source> 1664 <source>Moderation</source>
1640 <target>Moje ustawienia</target> 1665 <target>Moderacja</target>
1641 <context-group name="null"> 1666 <context-group name="null">
1642 <context context-type="linenumber">3</context> 1667 <context context-type="linenumber">2</context>
1643 </context-group> 1668 </context-group>
1644 </trans-unit> 1669 </trans-unit>
1645 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 1670 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1646 <source>My library</source> 1671 <source>Blacklisted videos</source>
1647 <target>Moja biblioteka</target> 1672 <target>Filmy na czarnej liście</target>
1648 <context-group name="null"> 1673 <context-group name="null">
1649 <context context-type="linenumber">7</context> 1674 <context context-type="linenumber">7</context>
1650 </context-group> 1675 </context-group>
1651 </trans-unit> 1676 </trans-unit>
1652 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1653 <source>My channels</source>
1654 <target>Moje kanały</target>
1655 <context-group name="null">
1656 <context context-type="linenumber">12</context>
1657 </context-group>
1658 </trans-unit>
1659 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1660 <source>My videos</source>
1661 <target>Moje filmy</target>
1662 <context-group name="null">
1663 <context context-type="linenumber">14</context>
1664 </context-group>
1665 </trans-unit>
1666 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1667 <source>My subscriptions</source>
1668 <target>Moje subskrybcje</target>
1669 <context-group name="null">
1670 <context context-type="linenumber">16</context>
1671 </context-group>
1672 </trans-unit>
1673 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1674 <source>My imports</source>
1675 <target>Moje importy</target>
1676 <context-group name="null">
1677 <context context-type="linenumber">18</context>
1678 </context-group>
1679 </trans-unit>
1680 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1677 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1681 <source>Video quota:</source> 1678 <source>Video quota:</source>
1682 <target>Powierzchnia na filmy:</target> 1679 <target>Powierzchnia na filmy:</target>
@@ -1688,14 +1685,14 @@
1688 <source>Profile</source> 1685 <source>Profile</source>
1689 <target>Profil</target> 1686 <target>Profil</target>
1690 <context-group name="null"> 1687 <context-group name="null">
1691 <context context-type="linenumber">8</context> 1688 <context context-type="linenumber">7</context>
1692 </context-group> 1689 </context-group>
1693 </trans-unit> 1690 </trans-unit>
1694 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1691 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1695 <source>Video settings</source> 1692 <source>Video settings</source>
1696 <target>Ustawienia wideo</target> 1693 <target>Ustawienia wideo</target>
1697 <context-group name="null"> 1694 <context-group name="null">
1698 <context context-type="linenumber">15</context> 1695 <context context-type="linenumber">16</context>
1699 </context-group> 1696 </context-group>
1700 </trans-unit> 1697 </trans-unit>
1701 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8"> 1698 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
@@ -1709,13 +1706,6 @@
1709 <context context-type="linenumber">35</context> 1706 <context context-type="linenumber">35</context>
1710 </context-group> 1707 </context-group>
1711 </trans-unit> 1708 </trans-unit>
1712 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1713 <source>Submit</source>
1714 <target>Wyślij</target>
1715 <context-group name="null">
1716 <context context-type="linenumber">24</context>
1717 </context-group>
1718 </trans-unit>
1719 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1709 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1720 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1710 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1721 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetlenia</target> 1711 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetlenia</target>
@@ -1806,6 +1796,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
1806 <context context-type="linenumber">30</context> 1796 <context context-type="linenumber">30</context>
1807 </context-group> 1797 </context-group>
1808 </trans-unit> 1798 </trans-unit>
1799 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
1800 <source>Current password</source>
1801 <target>Obecne hasło</target>
1802 <context-group name="null">
1803 <context context-type="linenumber">7</context>
1804 </context-group>
1805 </trans-unit>
1809 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 1806 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
1810 <source>New password</source> 1807 <source>New password</source>
1811 <target>Nowe hasło</target> 1808 <target>Nowe hasło</target>
@@ -1831,14 +1828,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
1831 <source>Automatically plays video</source> 1828 <source>Automatically plays video</source>
1832 <target>Automatycznie odtwarzaj filmy</target> 1829 <target>Automatycznie odtwarzaj filmy</target>
1833 <context-group name="null"> 1830 <context-group name="null">
1834 <context context-type="linenumber">20</context> 1831 <context context-type="linenumber">28</context>
1835 </context-group> 1832 </context-group>
1836 </trans-unit> 1833 </trans-unit>
1837 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 1834 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
1838 <source>Save</source> 1835 <source>Save</source>
1839 <target>Zapisz</target> 1836 <target>Zapisz</target>
1840 <context-group name="null"> 1837 <context-group name="null">
1841 <context context-type="linenumber">23</context> 1838 <context context-type="linenumber">32</context>
1842 </context-group> 1839 </context-group>
1843 </trans-unit> 1840 </trans-unit>
1844 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 1841 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -1940,14 +1937,21 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
1940 <source>Publish will be available when upload is finished</source> 1937 <source>Publish will be available when upload is finished</source>
1941 <target>Opublikuj automatycznie po ukończeniu wysyłania</target> 1938 <target>Opublikuj automatycznie po ukończeniu wysyłania</target>
1942 <context-group name="null"> 1939 <context-group name="null">
1943 <context context-type="linenumber">48</context> 1940 <context context-type="linenumber">58</context>
1944 </context-group> 1941 </context-group>
1945 </trans-unit> 1942 </trans-unit>
1946 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1943 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1947 <source>Publish</source> 1944 <source>Publish</source>
1948 <target>Opublikuj</target> 1945 <target>Opublikuj</target>
1949 <context-group name="null"> 1946 <context-group name="null">
1950 <context context-type="linenumber">55</context> 1947 <context context-type="linenumber">65</context>
1948 </context-group>
1949 </trans-unit>
1950 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
1951 <source>Or</source>
1952 <target>Lub</target>
1953 <context-group name="null">
1954 <context context-type="linenumber">11</context>
1951 </context-group> 1955 </context-group>
1952 </trans-unit> 1956 </trans-unit>
1953 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 1957 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2006,6 +2010,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2006 <context context-type="linenumber">191</context> 2010 <context context-type="linenumber">191</context>
2007 </context-group> 2011 </context-group>
2008 </trans-unit> 2012 </trans-unit>
2013 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2014 <source>+ Tag</source>
2015 <target>+ Tag</target>
2016 <context-group name="null">
2017 <context context-type="linenumber">21</context>
2018 </context-group>
2019 </trans-unit>
2009 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2020 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2010 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2021 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2011 <target>Opisy filmów są automatycznie skracane i wymagają ręcznego działania, aby je rozwinąć.</target> 2022 <target>Opisy filmów są automatycznie skracane i wymagają ręcznego działania, aby je rozwinąć.</target>
@@ -2045,7 +2056,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2045 <source>Wait transcoding before publishing the video</source> 2056 <source>Wait transcoding before publishing the video</source>
2046 <target>Poczekaj na transkodowanie przed opublikowaniem filmu</target> 2057 <target>Poczekaj na transkodowanie przed opublikowaniem filmu</target>
2047 <context-group name="null"> 2058 <context-group name="null">
2048 <context context-type="linenumber">130</context> 2059 <context context-type="linenumber">131</context>
2049 </context-group> 2060 </context-group>
2050 </trans-unit> 2061 </trans-unit>
2051 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2062 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2059,14 +2070,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2059 <source>Upload thumbnail</source> 2070 <source>Upload thumbnail</source>
2060 <target>Wyślij miniaturę</target> 2071 <target>Wyślij miniaturę</target>
2061 <context-group name="null"> 2072 <context-group name="null">
2062 <context context-type="linenumber">195</context> 2073 <context context-type="linenumber">196</context>
2063 </context-group> 2074 </context-group>
2064 </trans-unit> 2075 </trans-unit>
2065 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2076 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2066 <source>Upload preview</source> 2077 <source>Upload preview</source>
2067 <target>Podgląd wysyłania</target> 2078 <target>Podgląd wysyłania</target>
2068 <context-group name="null"> 2079 <context-group name="null">
2069 <context context-type="linenumber">202</context> 2080 <context context-type="linenumber">203</context>
2070 </context-group> 2081 </context-group>
2071 </trans-unit> 2082 </trans-unit>
2072 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2083 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2080,14 +2091,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2080 <source>Short text to tell people how they can support you (membership platform...).</source> 2091 <source>Short text to tell people how they can support you (membership platform...).</source>
2081 <target>Krótki tekst informujący innych, jak mogą Cię wesprzeć (platforma członkowska…).</target> 2092 <target>Krótki tekst informujący innych, jak mogą Cię wesprzeć (platforma członkowska…).</target>
2082 <context-group name="null"> 2093 <context-group name="null">
2083 <context context-type="linenumber">209</context> 2094 <context context-type="linenumber">210</context>
2084 </context-group> 2095 </context-group>
2085 </trans-unit> 2096 </trans-unit>
2086 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2097 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2087 <source>Advanced settings</source> 2098 <source>Advanced settings</source>
2088 <target>Ustawienia zaawansowane</target> 2099 <target>Ustawienia zaawansowane</target>
2089 <context-group name="null"> 2100 <context-group name="null">
2090 <context context-type="linenumber">190</context> 2101 <context context-type="linenumber">191</context>
2091 </context-group> 2102 </context-group>
2092 </trans-unit> 2103 </trans-unit>
2093 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2104 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2115,6 +2126,20 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2115 <context context-type="linenumber">27</context> 2126 <context context-type="linenumber">27</context>
2116 </context-group> 2127 </context-group>
2117 </trans-unit> 2128 </trans-unit>
2129 <trans-unit id="ac3a02ecd20f41278f1ef7c03f45c1117b4b796d">
2130 <source>Torrent (.torrent file)</source>
2131 <target>Torrent (plik .torrent)</target>
2132 <context-group name="null">
2133 <context context-type="linenumber">32</context>
2134 </context-group>
2135 </trans-unit>
2136 <trans-unit id="2db8d7cf6a3071f4c1519ef2b5e2713d9ff4e87f">
2137 <source>Torrent (magnet link)</source>
2138 <target>Torrent (link magnet)</target>
2139 <context-group name="null">
2140 <context context-type="linenumber">37</context>
2141 </context-group>
2142 </trans-unit>
2118 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c"> 2143 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
2119 <source> 2144 <source>
2120 Cancel 2145 Cancel
@@ -2140,17 +2165,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2140 <context context-type="linenumber">3</context> 2165 <context context-type="linenumber">3</context>
2141 </context-group> 2166 </context-group>
2142 </trans-unit> 2167 </trans-unit>
2143 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2144 <source>
2145 Cancel
2146 </source>
2147 <target>
2148 Anuluj
2149 </target>
2150 <context-group name="null">
2151 <context context-type="linenumber">19</context>
2152 </context-group>
2153 </trans-unit>
2154 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2168 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2155 <source>Share</source> 2169 <source>Share</source>
2156 <target>Udostępnij</target> 2170 <target>Udostępnij</target>
@@ -2179,6 +2193,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2179 <context context-type="linenumber">51</context> 2193 <context context-type="linenumber">51</context>
2180 </context-group> 2194 </context-group>
2181 </trans-unit> 2195 </trans-unit>
2196 <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
2197 <source>Blacklist video</source>
2198 <target>Dodaj film na czarnÄ… listÄ™</target>
2199 <context-group name="null">
2200 <context context-type="linenumber">3</context>
2201 </context-group>
2202 </trans-unit>
2182 <trans-unit id="9ed65ae88f6c982bc44d6fed2796e55f47dbf304"> 2203 <trans-unit id="9ed65ae88f6c982bc44d6fed2796e55f47dbf304">
2183 <source> 2204 <source>
2184 The video is being transcoded, it may not work properly. 2205 The video is being transcoded, it may not work properly.
@@ -2220,8 +2241,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2220 </context-group> 2241 </context-group>
2221 </trans-unit> 2242 </trans-unit>
2222 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509"> 2243 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
2223 <source>Dislike this video</source> 2244 <source>Dislike this video</source><target>Dislike this video</target><context-group name="null">
2224 <context-group name="null">
2225 <context context-type="linenumber">64</context> 2245 <context context-type="linenumber">64</context>
2226 </context-group> 2246 </context-group>
2227 </trans-unit> 2247 </trans-unit>
@@ -2295,13 +2315,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2295 <context context-type="linenumber">134</context> 2315 <context context-type="linenumber">134</context>
2296 </context-group> 2316 </context-group>
2297 </trans-unit> 2317 </trans-unit>
2298 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2299 <source>Go to the account page</source>
2300 <target>Przejdź na stronę konta</target>
2301 <context-group name="null">
2302 <context context-type="linenumber">133</context>
2303 </context-group>
2304 </trans-unit>
2305 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 2318 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2306 <source>Show more</source> 2319 <source>Show more</source>
2307 <target>Pokaż więcej</target> 2320 <target>Pokaż więcej</target>
@@ -2370,24 +2383,18 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2370 <context context-type="linenumber">3</context> 2383 <context context-type="linenumber">3</context>
2371 </context-group> 2384 </context-group>
2372 </trans-unit> 2385 </trans-unit>
2373 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
2374 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
2375 <context-group name="null">
2376 <context context-type="linenumber">8</context>
2377 </context-group>
2378 </trans-unit>
2379 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 2386 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
2380 <source>No comments.</source> 2387 <source>No comments.</source>
2381 <target>Brak komentarzy.</target> 2388 <target>Brak komentarzy.</target>
2382 <context-group name="null"> 2389 <context-group name="null">
2383 <context context-type="linenumber">18</context> 2390 <context context-type="linenumber">17</context>
2384 </context-group> 2391 </context-group>
2385 </trans-unit> 2392 </trans-unit>
2386 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 2393 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2387 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 2394 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2388 <target>Zobacz wszystkie <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> odpowiedzi</target> 2395 <target>Zobacz wszystkie <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> odpowiedzi</target>
2389 <context-group name="null"> 2396 <context-group name="null">
2390 <context context-type="linenumber">55</context> 2397 <context context-type="linenumber">54</context>
2391 </context-group> 2398 </context-group>
2392 </trans-unit> 2399 </trans-unit>
2393 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 2400 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2398,7 +2405,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2398 Komentarze są wyłączone. 2405 Komentarze są wyłączone.
2399 </target> 2406 </target>
2400 <context-group name="null"> 2407 <context-group name="null">
2401 <context context-type="linenumber">64</context> 2408 <context context-type="linenumber">63</context>
2402 </context-group> 2409 </context-group>
2403 </trans-unit> 2410 </trans-unit>
2404 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 2411 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -2433,13 +2440,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2433 <context context-type="linenumber">14</context> 2440 <context context-type="linenumber">14</context>
2434 </context-group> 2441 </context-group>
2435 </trans-unit> 2442 </trans-unit>
2436 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2437 <source>Error getting about from server</source>
2438 <target>BÅ‚Ä…d podczas uzyskiwania informacji z serwera</target>
2439 <context-group name="null">
2440 <context context-type="linenumber">1</context>
2441 </context-group>
2442 </trans-unit>
2443 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2443 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2444 <source>No description</source> 2444 <source>No description</source>
2445 <target>Brak opisu</target> 2445 <target>Brak opisu</target>
@@ -2461,65 +2461,114 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2461 <context context-type="linenumber">1</context> 2461 <context context-type="linenumber">1</context>
2462 </context-group> 2462 </context-group>
2463 </trans-unit> 2463 </trans-unit>
2464 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 2464 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2465 <source>Error</source> 2465 <source>240p</source>
2466 <target>BÅ‚Ä…d</target> 2466 <target>240p</target>
2467 <context-group name="null"> 2467 <context-group name="null">
2468 <context context-type="linenumber">1</context> 2468 <context context-type="linenumber">1</context>
2469 </context-group> 2469 </context-group>
2470 </trans-unit> 2470 </trans-unit>
2471 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed"> 2471 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
2472 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source> 2472 <source>360p</source>
2473 <target>Możesz ustawić niestandardowe <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target> 2473 <target>360p</target>
2474 <context-group name="null"> 2474 <context-group name="null">
2475 <context context-type="linenumber">1</context> 2475 <context context-type="linenumber">1</context>
2476 </context-group> 2476 </context-group>
2477 </trans-unit> 2477 </trans-unit>
2478 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 2478 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
2479 <source>This could lead to security issues or bugs if you do not understand it. </source> 2479 <source>480p</source>
2480 <target>Może to spowodować błędy lub problemy z bezpieczeństwem, jeżeli tego nie rozumiesz. </target> 2480 <target>480p</target>
2481 <context-group name="null"> 2481 <context-group name="null">
2482 <context context-type="linenumber">1</context> 2482 <context context-type="linenumber">1</context>
2483 </context-group> 2483 </context-group>
2484 </trans-unit> 2484 </trans-unit>
2485 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 2485 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
2486 <source>Are you sure you want to update the configuration?</source> 2486 <source>720p</source>
2487 <target>Czy na pewno chcesz zaktualizować konfigurację?</target> 2487 <target>720p</target>
2488 <context-group name="null"> 2488 <context-group name="null">
2489 <context context-type="linenumber">1</context> 2489 <context context-type="linenumber">1</context>
2490 </context-group> 2490 </context-group>
2491 </trans-unit> 2491 </trans-unit>
2492 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 2492 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
2493 <source>Please type</source> 2493 <source>1080p</source>
2494 <target>Wprowadź</target> 2494 <target>1080p</target>
2495 <context-group name="null"> 2495 <context-group name="null">
2496 <context context-type="linenumber">1</context> 2496 <context context-type="linenumber">1</context>
2497 </context-group> 2497 </context-group>
2498 </trans-unit> 2498 </trans-unit>
2499 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 2499 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2500 <source>to confirm.</source> 2500 <source>Configuration updated.</source>
2501 <target>aby potwierdziÄ.</target> 2501 <target>Zaktualizowano konfiguracjÄ.</target>
2502 <context-group name="null"> 2502 <context-group name="null">
2503 <context context-type="linenumber">1</context> 2503 <context context-type="linenumber">1</context>
2504 </context-group> 2504 </context-group>
2505 </trans-unit> 2505 </trans-unit>
2506 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 2506 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf">
2507 <source>Success</source> 2507 <source>Unlimited</source>
2508 <target>Pomyślnie</target> 2508 <target>Nieograniczona</target>
2509 <context-group name="null"> 2509 <context-group name="null">
2510 <context context-type="linenumber">1</context> 2510 <context context-type="linenumber">1</context>
2511 </context-group> 2511 </context-group>
2512 </trans-unit> 2512 </trans-unit>
2513 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2513 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
2514 <source>Configuration updated.</source> 2514 <source>100MB</source>
2515 <target>Zaktualizowano konfiguracjÄ™.</target> 2515 <target>100MB</target>
2516 <context-group name="null"> 2516 <context-group name="null">
2517 <context context-type="linenumber">1</context> 2517 <context context-type="linenumber">1</context>
2518 </context-group> 2518 </context-group>
2519 </trans-unit> 2519 </trans-unit>
2520 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf"> 2520 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
2521 <source>Unlimited</source> 2521 <source>500MB</source>
2522 <target>Nieograniczona</target> 2522 <target>500MB</target>
2523 <context-group name="null">
2524 <context context-type="linenumber">1</context>
2525 </context-group>
2526 </trans-unit>
2527 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
2528 <source>1GB</source>
2529 <target>1GB</target>
2530 <context-group name="null">
2531 <context context-type="linenumber">1</context>
2532 </context-group>
2533 </trans-unit>
2534 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
2535 <source>5GB</source>
2536 <target>5GB</target>
2537 <context-group name="null">
2538 <context context-type="linenumber">1</context>
2539 </context-group>
2540 </trans-unit>
2541 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
2542 <source>20GB</source>
2543 <target>20GB</target>
2544 <context-group name="null">
2545 <context context-type="linenumber">1</context>
2546 </context-group>
2547 </trans-unit>
2548 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
2549 <source>50GB</source>
2550 <target>50GB</target>
2551 <context-group name="null">
2552 <context context-type="linenumber">1</context>
2553 </context-group>
2554 </trans-unit>
2555 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
2556 <source>10MB</source>
2557 <target>10MB</target>
2558 <context-group name="null">
2559 <context context-type="linenumber">1</context>
2560 </context-group>
2561 </trans-unit>
2562 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
2563 <source>50MB</source>
2564 <target>50MB</target>
2565 <context-group name="null">
2566 <context context-type="linenumber">1</context>
2567 </context-group>
2568 </trans-unit>
2569 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
2570 <source>2GB</source>
2571 <target>2GB</target>
2523 <context-group name="null"> 2572 <context-group name="null">
2524 <context context-type="linenumber">1</context> 2573 <context context-type="linenumber">1</context>
2525 </context-group> 2574 </context-group>
@@ -2629,13 +2678,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2629 <context context-type="linenumber">1</context> 2678 <context context-type="linenumber">1</context>
2630 </context-group> 2679 </context-group>
2631 </trans-unit> 2680 </trans-unit>
2632 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
2633 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
2634 <target>Usunięto użytkownika <x id="INTERPOLATION" equiv-text="{{username}}"/>.</target>
2635 <context-group name="null">
2636 <context context-type="linenumber">1</context>
2637 </context-group>
2638 </trans-unit>
2639 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc"> 2681 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
2640 <source>Password updated.</source> 2682 <source>Password updated.</source>
2641 <target>Zmieniono hasło.</target> 2683 <target>Zmieniono hasło.</target>
@@ -2699,23 +2741,16 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2699 <context context-type="linenumber">1</context> 2741 <context context-type="linenumber">1</context>
2700 </context-group> 2742 </context-group>
2701 </trans-unit> 2743 </trans-unit>
2702 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2744 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2703 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2745 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2704 <target>Czy na pewno chcesz usunąć <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Skutkuje to usunięciem wszystkich filmów wysłanych na ten kanał.</target> 2746 <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target>
2705 <context-group name="null">
2706 <context context-type="linenumber">1</context>
2707 </context-group>
2708 </trans-unit>
2709 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2710 <source>Please type the name of the video channel to confirm</source>
2711 <target>Wprowadź nazwę kanału wideo, aby potwierdzić</target>
2712 <context-group name="null"> 2747 <context-group name="null">
2713 <context context-type="linenumber">1</context> 2748 <context context-type="linenumber">1</context>
2714 </context-group> 2749 </context-group>
2715 </trans-unit> 2750 </trans-unit>
2716 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2751 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2717 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2752 <source>My videos</source>
2718 <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target> 2753 <target>Moje filmy</target>
2719 <context-group name="null"> 2754 <context-group name="null">
2720 <context context-type="linenumber">1</context> 2755 <context context-type="linenumber">1</context>
2721 </context-group> 2756 </context-group>
@@ -2776,9 +2811,30 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2776 <context context-type="linenumber">1</context> 2811 <context context-type="linenumber">1</context>
2777 </context-group> 2812 </context-group>
2778 </trans-unit> 2813 </trans-unit>
2779 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 2814 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2780 <source>Channels</source> 2815 <source>My library</source>
2781 <target>Kanały</target> 2816 <target>Moja biblioteka</target>
2817 <context-group name="null">
2818 <context context-type="linenumber">1</context>
2819 </context-group>
2820 </trans-unit>
2821 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2822 <source>My channels</source>
2823 <target>Moje kanały</target>
2824 <context-group name="null">
2825 <context context-type="linenumber">1</context>
2826 </context-group>
2827 </trans-unit>
2828 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2829 <source>My subscriptions</source>
2830 <target>Moje subskrybcje</target>
2831 <context-group name="null">
2832 <context context-type="linenumber">1</context>
2833 </context-group>
2834 </trans-unit>
2835 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2836 <source>My settings</source>
2837 <target>Moje ustawienia</target>
2782 <context-group name="null"> 2838 <context-group name="null">
2783 <context context-type="linenumber">1</context> 2839 <context context-type="linenumber">1</context>
2784 </context-group> 2840 </context-group>
@@ -2806,6 +2862,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2806 <context context-type="linenumber">1</context> 2862 <context context-type="linenumber">1</context>
2807 </context-group> 2863 </context-group>
2808 </trans-unit> 2864 </trans-unit>
2865 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2866 <source>Error</source>
2867 <target>BÅ‚Ä…d</target>
2868 <context-group name="null">
2869 <context context-type="linenumber">1</context>
2870 </context-group>
2871 </trans-unit>
2809 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2872 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2810 <source>You need to reconnect.</source> 2873 <source>You need to reconnect.</source>
2811 <target>Musisz połączyć się ponownie.</target> 2874 <target>Musisz połączyć się ponownie.</target>
@@ -2820,6 +2883,20 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2820 <context context-type="linenumber">1</context> 2883 <context context-type="linenumber">1</context>
2821 </context-group> 2884 </context-group>
2822 </trans-unit> 2885 </trans-unit>
2886 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2887 <source>Info</source>
2888 <target>Informacja</target>
2889 <context-group name="null">
2890 <context context-type="linenumber">1</context>
2891 </context-group>
2892 </trans-unit>
2893 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2894 <source>Success</source>
2895 <target>Pomyślnie</target>
2896 <context-group name="null">
2897 <context context-type="linenumber">1</context>
2898 </context-group>
2899 </trans-unit>
2823 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2900 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2824 <source>Your password has been successfully reset!</source> 2901 <source>Your password has been successfully reset!</source>
2825 <target>Pomyślnie zresetowano hasło!</target> 2902 <target>Pomyślnie zresetowano hasło!</target>
@@ -2981,6 +3058,20 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2981 <context context-type="linenumber">1</context> 3058 <context context-type="linenumber">1</context>
2982 </context-group> 3059 </context-group>
2983 </trans-unit> 3060 </trans-unit>
3061 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3062 <source>Email is required.</source>
3063 <target>Adres e-mail jest wymagany.</target>
3064 <context-group name="null">
3065 <context context-type="linenumber">1</context>
3066 </context-group>
3067 </trans-unit>
3068 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3069 <source>Email must be valid.</source>
3070 <target>Adres e-mail musi być prawidłowy.</target>
3071 <context-group name="null">
3072 <context context-type="linenumber">1</context>
3073 </context-group>
3074 </trans-unit>
2984 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 3075 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2985 <source>Username is required.</source> 3076 <source>Username is required.</source>
2986 <target>Nazwa użytkownika jest wymagana.</target> 3077 <target>Nazwa użytkownika jest wymagana.</target>
@@ -3002,41 +3093,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3002 <context context-type="linenumber">1</context> 3093 <context context-type="linenumber">1</context>
3003 </context-group> 3094 </context-group>
3004 </trans-unit> 3095 </trans-unit>
3005 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3006 <source>Username must be at least 3 characters long.</source>
3007 <target>Nazwa użytkownika musi zawierać przynajmniej 3 znaki.</target>
3008 <context-group name="null">
3009 <context context-type="linenumber">1</context>
3010 </context-group>
3011 </trans-unit>
3012 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3013 <source>Username cannot be more than 20 characters long.</source>
3014 <target>Nazwa użytkownika nie może być dłuższa niż 20 znaków.</target>
3015 <context-group name="null">
3016 <context context-type="linenumber">1</context>
3017 </context-group>
3018 </trans-unit>
3019 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3020 <source>Username should be only lowercase alphanumeric characters.</source>
3021 <target>Nazwa użytkownika może zawierać tylko małe znaki alfanumeryczne.</target>
3022 <context-group name="null">
3023 <context context-type="linenumber">1</context>
3024 </context-group>
3025 </trans-unit>
3026 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3027 <source>Email is required.</source>
3028 <target>Adres e-mail jest wymagany.</target>
3029 <context-group name="null">
3030 <context context-type="linenumber">1</context>
3031 </context-group>
3032 </trans-unit>
3033 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3034 <source>Email must be valid.</source>
3035 <target>Adres e-mail musi być prawidłowy.</target>
3036 <context-group name="null">
3037 <context context-type="linenumber">1</context>
3038 </context-group>
3039 </trans-unit>
3040 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 3096 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3041 <source>Password must be at least 6 characters long.</source> 3097 <source>Password must be at least 6 characters long.</source>
3042 <target>Hasło musi składać się z przynajmniej 6 znaków.</target> 3098 <target>Hasło musi składać się z przynajmniej 6 znaków.</target>
@@ -3086,20 +3142,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3086 <context context-type="linenumber">1</context> 3142 <context context-type="linenumber">1</context>
3087 </context-group> 3143 </context-group>
3088 </trans-unit> 3144 </trans-unit>
3089 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3090 <source>Display name must be at least 3 characters long.</source>
3091 <target>Nazwa wyświetlana musi zawierać przynajmniej 3 znaki.</target>
3092 <context-group name="null">
3093 <context context-type="linenumber">1</context>
3094 </context-group>
3095 </trans-unit>
3096 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3097 <source>Display name cannot be more than 120 characters long.</source>
3098 <target>Nazwa wyświetlana nie może zawierać więcej niż 120 znaków.</target>
3099 <context-group name="null">
3100 <context context-type="linenumber">1</context>
3101 </context-group>
3102 </trans-unit>
3103 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3145 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3104 <source>Description must be at least 3 characters long.</source> 3146 <source>Description must be at least 3 characters long.</source>
3105 <target>Opis musi zawierać przynajmniej 3 znaki.</target> 3147 <target>Opis musi zawierać przynajmniej 3 znaki.</target>
@@ -3107,13 +3149,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3107 <context context-type="linenumber">1</context> 3149 <context context-type="linenumber">1</context>
3108 </context-group> 3150 </context-group>
3109 </trans-unit> 3151 </trans-unit>
3110 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
3111 <source>Description cannot be more than 250 characters long.</source>
3112 <target>Opis nie może zawierać więcej niż 250 znaków.</target>
3113 <context-group name="null">
3114 <context context-type="linenumber">1</context>
3115 </context-group>
3116 </trans-unit>
3117 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 3152 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
3118 <source>Report reason is required.</source> 3153 <source>Report reason is required.</source>
3119 <target>Przyczyna zgłoszenia jest wymagana.</target> 3154 <target>Przyczyna zgłoszenia jest wymagana.</target>
@@ -3128,13 +3163,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3128 <context context-type="linenumber">1</context> 3163 <context context-type="linenumber">1</context>
3129 </context-group> 3164 </context-group>
3130 </trans-unit> 3165 </trans-unit>
3131 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3132 <source>Report reason cannot be more than 300 characters long.</source>
3133 <target>Przyczyna zgłoszenia nie może zawierać więcej niż 300 znaków.</target>
3134 <context-group name="null">
3135 <context context-type="linenumber">1</context>
3136 </context-group>
3137 </trans-unit>
3138 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294"> 3166 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
3139 <source>The username is required.</source> 3167 <source>The username is required.</source>
3140 <target>Nazwa użytkownika jest wymagana.</target> 3168 <target>Nazwa użytkownika jest wymagana.</target>
@@ -3149,34 +3177,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3149 <context context-type="linenumber">1</context> 3177 <context context-type="linenumber">1</context>
3150 </context-group> 3178 </context-group>
3151 </trans-unit> 3179 </trans-unit>
3152 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
3153 <source>Name must be at least 3 characters long.</source>
3154 <target>Nazwa musi zawierać przynajmniej 3 znaki.</target>
3155 <context-group name="null">
3156 <context context-type="linenumber">1</context>
3157 </context-group>
3158 </trans-unit>
3159 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
3160 <source>Name cannot be more than 20 characters long.</source>
3161 <target>Nazwa nie może być dłuższa niż 20 znaków.</target>
3162 <context-group name="null">
3163 <context context-type="linenumber">1</context>
3164 </context-group>
3165 </trans-unit>
3166 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
3167 <source>Name should be only lowercase alphanumeric characters.</source>
3168 <target>Nazwa może zawierać tylko małe znaki alfanumeryczne.</target>
3169 <context-group name="null">
3170 <context context-type="linenumber">1</context>
3171 </context-group>
3172 </trans-unit>
3173 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
3174 <source>Description cannot be more than 500 characters long.</source>
3175 <target>Opis nie może być dłuższy niż 500 znaków.</target>
3176 <context-group name="null">
3177 <context context-type="linenumber">1</context>
3178 </context-group>
3179 </trans-unit>
3180 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3180 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
3181 <source>Support text must be at least 3 characters long.</source> 3181 <source>Support text must be at least 3 characters long.</source>
3182 <target>Tekst o wsparciu musi zawierać przynajmniej 3 znaki.</target> 3182 <target>Tekst o wsparciu musi zawierać przynajmniej 3 znaki.</target>
@@ -3184,13 +3184,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3184 <context context-type="linenumber">1</context> 3184 <context context-type="linenumber">1</context>
3185 </context-group> 3185 </context-group>
3186 </trans-unit> 3186 </trans-unit>
3187 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813">
3188 <source>Support text cannot be more than 500 characters long.</source>
3189 <target>Tekst o wsparciu nie może być dłuższy niż 500 znaków.</target>
3190 <context-group name="null">
3191 <context context-type="linenumber">1</context>
3192 </context-group>
3193 </trans-unit>
3194 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 3187 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
3195 <source>Comment is required.</source> 3188 <source>Comment is required.</source>
3196 <target>Komentarz jest wymagany.</target> 3189 <target>Komentarz jest wymagany.</target>
@@ -3276,14 +3269,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3276 </context-group> 3269 </context-group>
3277 </trans-unit> 3270 </trans-unit>
3278 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6"> 3271 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
3279 <source>Video support must be at least 3 characters long.</source> 3272 <source>Video support must be at least 3 characters long.</source><target>Video support must be at least 3 characters long.</target><context-group name="null">
3280 <context-group name="null">
3281 <context context-type="linenumber">1</context>
3282 </context-group>
3283 </trans-unit>
3284 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b">
3285 <source>Video support cannot be more than 500 characters long.</source>
3286 <context-group name="null">
3287 <context context-type="linenumber">1</context> 3273 <context context-type="linenumber">1</context>
3288 </context-group> 3274 </context-group>
3289 </trans-unit> 3275 </trans-unit>
@@ -3798,6 +3784,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3798 <context context-type="linenumber">1</context> 3784 <context context-type="linenumber">1</context>
3799 </context-group> 3785 </context-group>
3800 </trans-unit> 3786 </trans-unit>
3787 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
3788 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
3789 <target>Usunięto użytkownika <x id="INTERPOLATION" equiv-text="{{username}}"/>.</target>
3790 <context-group name="null">
3791 <context context-type="linenumber">1</context>
3792 </context-group>
3793 </trans-unit>
3801 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 3794 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
3802 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 3795 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
3803 <target>Zbyt duże żądanie na ten serwer. Skontaktuj się z administratorem, jeżeli chcesz zwiększyć ten limit.</target> 3796 <target>Zbyt duże żądanie na ten serwer. Skontaktuj się z administratorem, jeżeli chcesz zwiększyć ten limit.</target>
@@ -3861,20 +3854,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3861 <context context-type="linenumber">1</context> 3854 <context context-type="linenumber">1</context>
3862 </context-group> 3855 </context-group>
3863 </trans-unit> 3856 </trans-unit>
3864 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2">
3865 <source>Welcome</source>
3866 <target>Witamy</target>
3867 <context-group name="null">
3868 <context context-type="linenumber">1</context>
3869 </context-group>
3870 </trans-unit>
3871 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
3872 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
3873 <target>Pomyślnie zarejestrowano <x id="INTERPOLATION" equiv-text="{{username}}"/>.</target>
3874 <context-group name="null">
3875 <context context-type="linenumber">1</context>
3876 </context-group>
3877 </trans-unit>
3878 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264"> 3857 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
3879 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source> 3858 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
3880 <target>Powiązane dane (tagi, opis…) zostaną utracone, czy na pewno chcesz opuścić tą stronę?</target> 3859 <target>Powiązane dane (tagi, opis…) zostaną utracone, czy na pewno chcesz opuścić tą stronę?</target>
@@ -3889,13 +3868,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3889 <context context-type="linenumber">1</context> 3868 <context context-type="linenumber">1</context>
3890 </context-group> 3869 </context-group>
3891 </trans-unit> 3870 </trans-unit>
3892 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3893 <source>Info</source>
3894 <target>Informacja</target>
3895 <context-group name="null">
3896 <context context-type="linenumber">1</context>
3897 </context-group>
3898 </trans-unit>
3899 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3871 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3900 <source>Upload cancelled</source> 3872 <source>Upload cancelled</source>
3901 <target>Anulowano wysyłanie</target> 3873 <target>Anulowano wysyłanie</target>
@@ -3953,8 +3925,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3953 </context-group> 3925 </context-group>
3954 </trans-unit> 3926 </trans-unit>
3955 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e"> 3927 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
3956 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source> 3928 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source><target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</target><context-group name="null">
3957 <context-group name="null">
3958 <context context-type="linenumber">1</context> 3929 <context context-type="linenumber">1</context>
3959 </context-group> 3930 </context-group>
3960 </trans-unit> 3931 </trans-unit>
@@ -3974,6 +3945,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3974 </trans-unit> 3945 </trans-unit>
3975 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165"> 3946 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
3976 <source>Videos from your subscriptions</source> 3947 <source>Videos from your subscriptions</source>
3948 <target>Filmy z twoich subskrypcji</target>
3977 <context-group name="null"> 3949 <context-group name="null">
3978 <context context-type="linenumber">1</context> 3950 <context context-type="linenumber">1</context>
3979 </context-group> 3951 </context-group>
diff --git a/client/src/locale/target/angular_pt_BR.xml b/client/src/locale/target/angular_pt_BR.xml
index b62cbe7a4..0227115e3 100644
--- a/client/src/locale/target/angular_pt_BR.xml
+++ b/client/src/locale/target/angular_pt_BR.xml
@@ -217,7 +217,7 @@
217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
218 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target> 218 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target>
219 <context-group name="null"> 219 <context-group name="null">
220 <context context-type="linenumber">13</context> 220 <context context-type="linenumber">16</context>
221 </context-group> 221 </context-group>
222 </trans-unit> 222 </trans-unit>
223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -231,7 +231,7 @@
231 <source>Edit</source> 231 <source>Edit</source>
232 <target>Editar</target> 232 <target>Editar</target>
233 <context-group name="null"> 233 <context-group name="null">
234 <context context-type="linenumber">5</context> 234 <context context-type="linenumber">1</context>
235 </context-group> 235 </context-group>
236 </trans-unit> 236 </trans-unit>
237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -259,7 +259,7 @@
259 <source>Video quota</source> 259 <source>Video quota</source>
260 <target>Cota de vídeo</target> 260 <target>Cota de vídeo</target>
261 <context-group name="null"> 261 <context-group name="null">
262 <context context-type="linenumber">19</context> 262 <context context-type="linenumber">42</context>
263 </context-group> 263 </context-group>
264 </trans-unit> 264 </trans-unit>
265 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 265 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -273,6 +273,38 @@
273 <context context-type="linenumber">14</context> 273 <context context-type="linenumber">14</context>
274 </context-group> 274 </context-group>
275 </trans-unit> 275 </trans-unit>
276 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
277 <source>Ban</source>
278 <target>Banir</target>
279 <context-group name="null">
280 <context context-type="linenumber">3</context>
281 </context-group>
282 </trans-unit>
283 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
284 <source>Reason...</source>
285 <target>Motivo...</target>
286 <context-group name="null">
287 <context context-type="linenumber">11</context>
288 </context-group>
289 </trans-unit>
290 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
291 <source>
292 A banned user will no longer be able to login.
293 </source>
294 <target>
295 Um usuário banido não conseguirá mais fazer login.
296 </target>
297 <context-group name="null">
298 <context context-type="linenumber">17</context>
299 </context-group>
300 </trans-unit>
301 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
302 <source>Ban this user</source>
303 <target>Banir este usuário</target>
304 <context-group name="null">
305 <context context-type="linenumber">25</context>
306 </context-group>
307 </trans-unit>
276 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 308 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
277 <source> 309 <source>
278 Login 310 Login
@@ -338,7 +370,7 @@
338 <source>Password</source> 370 <source>Password</source>
339 <target>Senha</target> 371 <target>Senha</target>
340 <context-group name="null"> 372 <context-group name="null">
341 <context context-type="linenumber">12</context> 373 <context context-type="linenumber">13</context>
342 </context-group> 374 </context-group>
343 </trans-unit> 375 </trans-unit>
344 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 376 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -352,7 +384,7 @@
352 <source>Login</source> 384 <source>Login</source>
353 <target>Entrar</target> 385 <target>Entrar</target>
354 <context-group name="null"> 386 <context-group name="null">
355 <context context-type="linenumber">38</context> 387 <context context-type="linenumber">36</context>
356 </context-group> 388 </context-group>
357 </trans-unit> 389 </trans-unit>
358 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 390 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -380,7 +412,7 @@
380 <source>Send me an email to reset my password</source> 412 <source>Send me an email to reset my password</source>
381 <target>Me envie um e-mail para redefinir minha senha</target> 413 <target>Me envie um e-mail para redefinir minha senha</target>
382 <context-group name="null"> 414 <context-group name="null">
383 <context context-type="linenumber">75</context> 415 <context context-type="linenumber">80</context>
384 </context-group> 416 </context-group>
385 </trans-unit> 417 </trans-unit>
386 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 418 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -437,28 +469,21 @@
437 <source>Example: jane_doe</source> 469 <source>Example: jane_doe</source>
438 <target>Exemplo: jane_doe</target> 470 <target>Exemplo: jane_doe</target>
439 <context-group name="null"> 471 <context-group name="null">
440 <context context-type="linenumber">16</context> 472 <context context-type="linenumber">17</context>
441 </context-group>
442 </trans-unit>
443 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
444 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
445 <target>Eu li e concordo com os &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Termos&lt;/a&gt; desta instância</target>
446 <context-group name="null">
447 <context context-type="linenumber">54</context>
448 </context-group> 473 </context-group>
449 </trans-unit> 474 </trans-unit>
450 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 475 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
451 <source>Signup</source> 476 <source>Signup</source>
452 <target>Inscrever-se</target> 477 <target>Inscrever-se</target>
453 <context-group name="null"> 478 <context-group name="null">
454 <context context-type="linenumber">88</context> 479 <context context-type="linenumber">78</context>
455 </context-group> 480 </context-group>
456 </trans-unit> 481 </trans-unit>
457 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 482 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
458 <source>Features found on this instance</source> 483 <source>Features found on this instance</source>
459 <target>Recursos disponíveis nesta instância</target> 484 <target>Recursos disponíveis nesta instância</target>
460 <context-group name="null"> 485 <context-group name="null">
461 <context context-type="linenumber">66</context> 486 <context context-type="linenumber">67</context>
462 </context-group> 487 </context-group>
463 </trans-unit> 488 </trans-unit>
464 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 489 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -479,13 +504,6 @@
479 <context context-type="linenumber">6</context> 504 <context context-type="linenumber">6</context>
480 </context-group> 505 </context-group>
481 </trans-unit> 506 </trans-unit>
482 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
483 <source>Filters</source>
484 <target>Filtros</target>
485 <context-group name="null">
486 <context context-type="linenumber">16</context>
487 </context-group>
488 </trans-unit>
489 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 507 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
490 <source> 508 <source>
491 No results found 509 No results found
@@ -494,28 +512,28 @@
494 Nenhum resultado encontrado 512 Nenhum resultado encontrado
495 </target> 513 </target>
496 <context-group name="null"> 514 <context-group name="null">
497 <context context-type="linenumber">25</context> 515 <context context-type="linenumber">28</context>
498 </context-group> 516 </context-group>
499 </trans-unit> 517 </trans-unit>
500 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 518 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
501 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 519 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
502 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> inscritos</target> 520 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> inscritos</target>
503 <context-group name="null"> 521 <context-group name="null">
504 <context context-type="linenumber">41</context> 522 <context context-type="linenumber">44</context>
505 </context-group> 523 </context-group>
506 </trans-unit> 524 </trans-unit>
507 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 525 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
508 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 526 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
509 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizações</target> 527 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visualizações</target>
510 <context-group name="null"> 528 <context-group name="null">
511 <context context-type="linenumber">52</context> 529 <context context-type="linenumber">55</context>
512 </context-group> 530 </context-group>
513 </trans-unit> 531 </trans-unit>
514 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 532 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
515 <source>Change the language</source> 533 <source>Change the language</source>
516 <target>Alterar o idioma</target> 534 <target>Alterar o idioma</target>
517 <context-group name="null"> 535 <context-group name="null">
518 <context context-type="linenumber">88</context> 536 <context context-type="linenumber">86</context>
519 </context-group> 537 </context-group>
520 </trans-unit> 538 </trans-unit>
521 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 539 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -526,7 +544,7 @@
526 Meu perfil público 544 Meu perfil público
527 </target> 545 </target>
528 <context-group name="null"> 546 <context-group name="null">
529 <context context-type="linenumber">18</context> 547 <context context-type="linenumber">16</context>
530 </context-group> 548 </context-group>
531 </trans-unit> 549 </trans-unit>
532 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 550 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -537,7 +555,7 @@
537 Minha conta 555 Minha conta
538 </target> 556 </target>
539 <context-group name="null"> 557 <context-group name="null">
540 <context context-type="linenumber">22</context> 558 <context context-type="linenumber">20</context>
541 </context-group> 559 </context-group>
542 </trans-unit> 560 </trans-unit>
543 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 561 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -548,7 +566,7 @@
548 Meus vídeos 566 Meus vídeos
549 </target> 567 </target>
550 <context-group name="null"> 568 <context-group name="null">
551 <context context-type="linenumber">26</context> 569 <context context-type="linenumber">24</context>
552 </context-group> 570 </context-group>
553 </trans-unit> 571 </trans-unit>
554 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 572 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -559,14 +577,14 @@
559 Sair 577 Sair
560 </target> 578 </target>
561 <context-group name="null"> 579 <context-group name="null">
562 <context context-type="linenumber">30</context> 580 <context context-type="linenumber">28</context>
563 </context-group> 581 </context-group>
564 </trans-unit> 582 </trans-unit>
565 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 583 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
566 <source>Create an account</source> 584 <source>Create an account</source>
567 <target>Criar uma conta</target> 585 <target>Criar uma conta</target>
568 <context-group name="null"> 586 <context-group name="null">
569 <context context-type="linenumber">39</context> 587 <context context-type="linenumber">37</context>
570 </context-group> 588 </context-group>
571 </trans-unit> 589 </trans-unit>
572 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 590 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -580,49 +598,49 @@
580 <source>Subscriptions</source> 598 <source>Subscriptions</source>
581 <target>Inscrições</target> 599 <target>Inscrições</target>
582 <context-group name="null"> 600 <context-group name="null">
583 <context context-type="linenumber">47</context> 601 <context context-type="linenumber">45</context>
584 </context-group> 602 </context-group>
585 </trans-unit> 603 </trans-unit>
586 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 604 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
587 <source>Overview</source> 605 <source>Overview</source>
588 <target>Visão geral</target> 606 <target>Visão geral</target>
589 <context-group name="null"> 607 <context-group name="null">
590 <context context-type="linenumber">52</context> 608 <context context-type="linenumber">50</context>
591 </context-group> 609 </context-group>
592 </trans-unit> 610 </trans-unit>
593 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 611 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
594 <source>Trending</source> 612 <source>Trending</source>
595 <target>Tendências</target> 613 <target>Tendências</target>
596 <context-group name="null"> 614 <context-group name="null">
597 <context context-type="linenumber">57</context> 615 <context context-type="linenumber">55</context>
598 </context-group> 616 </context-group>
599 </trans-unit> 617 </trans-unit>
600 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 618 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
601 <source>Recently added</source> 619 <source>Recently added</source>
602 <target>Adicionado recentemente</target> 620 <target>Adicionado recentemente</target>
603 <context-group name="null"> 621 <context-group name="null">
604 <context context-type="linenumber">62</context> 622 <context context-type="linenumber">60</context>
605 </context-group> 623 </context-group>
606 </trans-unit> 624 </trans-unit>
607 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 625 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
608 <source>Local</source> 626 <source>Local</source>
609 <target>Local</target> 627 <target>Local</target>
610 <context-group name="null"> 628 <context-group name="null">
611 <context context-type="linenumber">67</context> 629 <context context-type="linenumber">65</context>
612 </context-group> 630 </context-group>
613 </trans-unit> 631 </trans-unit>
614 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 632 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
615 <source>More</source> 633 <source>More</source>
616 <target>Mais</target> 634 <target>Mais</target>
617 <context-group name="null"> 635 <context-group name="null">
618 <context context-type="linenumber">72</context> 636 <context context-type="linenumber">70</context>
619 </context-group> 637 </context-group>
620 </trans-unit> 638 </trans-unit>
621 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 639 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
622 <source>Administration</source> 640 <source>Administration</source>
623 <target>Administração</target> 641 <target>Administração</target>
624 <context-group name="null"> 642 <context-group name="null">
625 <context context-type="linenumber">76</context> 643 <context context-type="linenumber">74</context>
626 </context-group> 644 </context-group>
627 </trans-unit> 645 </trans-unit>
628 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 646 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -636,7 +654,7 @@
636 <source>Toggle dark interface</source> 654 <source>Toggle dark interface</source>
637 <target>Alternar interface escura</target> 655 <target>Alternar interface escura</target>
638 <context-group name="null"> 656 <context-group name="null">
639 <context context-type="linenumber">94</context> 657 <context context-type="linenumber">92</context>
640 </context-group> 658 </context-group>
641 </trans-unit> 659 </trans-unit>
642 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 660 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -741,7 +759,7 @@
741 <source>No results.</source> 759 <source>No results.</source>
742 <target>Nenhum resultado.</target> 760 <target>Nenhum resultado.</target>
743 <context-group name="null"> 761 <context-group name="null">
744 <context context-type="linenumber">7</context> 762 <context context-type="linenumber">20</context>
745 </context-group> 763 </context-group>
746 </trans-unit> 764 </trans-unit>
747 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 765 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -778,7 +796,7 @@
778 <source>Instance</source> 796 <source>Instance</source>
779 <target>Instância</target> 797 <target>Instância</target>
780 <context-group name="null"> 798 <context-group name="null">
781 <context context-type="linenumber">8</context> 799 <context context-type="linenumber">12</context>
782 </context-group> 800 </context-group>
783 </trans-unit> 801 </trans-unit>
784 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 802 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -788,15 +806,22 @@
788 <context context-type="linenumber">7</context> 806 <context context-type="linenumber">7</context>
789 </context-group> 807 </context-group>
790 </trans-unit> 808 </trans-unit>
791 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 809 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
792 <source> 810 <source>
793 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 811 Cancel
794</source> 812 </source>
795 <target> 813 <target>
796 Sobre a instância <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 814 Cancelar
797</target> 815 </target>
798 <context-group name="null"> 816 <context-group name="null">
799 <context context-type="linenumber">1</context> 817 <context context-type="linenumber">26</context>
818 </context-group>
819 </trans-unit>
820 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
821 <source>Submit</source>
822 <target>Enviar</target>
823 <context-group name="null">
824 <context context-type="linenumber">31</context>
800 </context-group> 825 </context-group>
801 </trans-unit> 826 </trans-unit>
802 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 827 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -810,47 +835,14 @@
810 <source>Terms</source> 835 <source>Terms</source>
811 <target>Termos</target> 836 <target>Termos</target>
812 <context-group name="null"> 837 <context-group name="null">
813 <context context-type="linenumber">44</context> 838 <context context-type="linenumber">39</context>
814 </context-group> 839 </context-group>
815 </trans-unit> 840 </trans-unit>
816 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 841 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
817 <source>User registration is allowed and</source> 842 <source>User registration is allowed and</source>
818 <target>Registro de usuários não está permitida e</target> 843 <target>Registro de usuários não está permitida e</target>
819 <context-group name="null"> 844 <context-group name="null">
820 <context context-type="linenumber">25</context> 845 <context context-type="linenumber">29</context>
821 </context-group>
822 </trans-unit>
823 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
824 <source>
825 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
826 </source>
827 <target>
828 esta instância fornece uma cota base de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> espaço para os vídeos de seus usuários.
829 </target>
830 <context-group name="null">
831 <context context-type="linenumber">27</context>
832 </context-group>
833 </trans-unit>
834 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
835 <source>
836 this instance provides unlimited space for the videos of its users.
837 </source>
838 <target>
839 esta instância fornece espaço ilimitado para os vídeos de seus usuários.
840 </target>
841 <context-group name="null">
842 <context context-type="linenumber">31</context>
843 </context-group>
844 </trans-unit>
845 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
846 <source>
847 User registration is currently not allowed.
848 </source>
849 <target>
850 Registro de usuários atualmente não está permitido.
851 </target>
852 <context-group name="null">
853 <context context-type="linenumber">36</context>
854 </context-group> 846 </context-group>
855 </trans-unit> 847 </trans-unit>
856 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 848 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1071,19 +1063,6 @@
1071 <context context-type="linenumber">83</context> 1063 <context context-type="linenumber">83</context>
1072 </context-group> 1064 </context-group>
1073 </trans-unit> 1065 </trans-unit>
1074 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
1075 <source>
1076 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
1077 In the meantime, we want to test different ideas related to this issue:
1078 </source>
1079 <target>
1080 PeerTube está apenas em versão beta, e deseja entregar as melhores contramedidas possíveis enquanto a versão estável é disponibilizada.
1081 Enquanto isso, queremos testar diferentes ideias relacionadas a essa questão:
1082 </target>
1083 <context-group name="null">
1084 <context context-type="linenumber">85</context>
1085 </context-group>
1086 </trans-unit>
1087 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1066 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1088 <source>Set a limit to the number of peers sent by the tracker</source> 1067 <source>Set a limit to the number of peers sent by the tracker</source>
1089 <target>Defina um limite para o número de pares enviados pelo rastreador</target> 1068 <target>Defina um limite para o número de pares enviados pelo rastreador</target>
@@ -1123,14 +1102,14 @@
1123 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1102 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1124 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> inscritos</target> 1103 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> inscritos</target>
1125 <context-group name="null"> 1104 <context-group name="null">
1126 <context context-type="linenumber">12</context> 1105 <context context-type="linenumber">24</context>
1127 </context-group> 1106 </context-group>
1128 </trans-unit> 1107 </trans-unit>
1129 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1108 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1130 <source>Video channels</source> 1109 <source>Video channels</source>
1131 <target>Canais de vídeo</target> 1110 <target>Canais de vídeo</target>
1132 <context-group name="null"> 1111 <context-group name="null">
1133 <context context-type="linenumber">19</context> 1112 <context context-type="linenumber">31</context>
1134 </context-group> 1113 </context-group>
1135 </trans-unit> 1114 </trans-unit>
1136 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1115 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1172,49 +1151,49 @@
1172 <source>Short description</source> 1151 <source>Short description</source>
1173 <target>Descrição curta</target> 1152 <target>Descrição curta</target>
1174 <context-group name="null"> 1153 <context-group name="null">
1175 <context context-type="linenumber">22</context> 1154 <context context-type="linenumber">21</context>
1176 </context-group> 1155 </context-group>
1177 </trans-unit> 1156 </trans-unit>
1178 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1157 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1179 <source>Default client route</source> 1158 <source>Default client route</source>
1180 <target>Rota padrão do cliente</target> 1159 <target>Rota padrão do cliente</target>
1181 <context-group name="null"> 1160 <context-group name="null">
1182 <context context-type="linenumber">55</context> 1161 <context context-type="linenumber">48</context>
1183 </context-group> 1162 </context-group>
1184 </trans-unit> 1163 </trans-unit>
1185 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1164 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1186 <source>Videos Overview</source> 1165 <source>Videos Overview</source>
1187 <target>Visão geral dos vídeos</target> 1166 <target>Visão geral dos vídeos</target>
1188 <context-group name="null"> 1167 <context-group name="null">
1189 <context context-type="linenumber">58</context> 1168 <context context-type="linenumber">51</context>
1190 </context-group> 1169 </context-group>
1191 </trans-unit> 1170 </trans-unit>
1192 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1171 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1193 <source>Videos Trending</source> 1172 <source>Videos Trending</source>
1194 <target>Vídeos em Tendência</target> 1173 <target>Vídeos em Tendência</target>
1195 <context-group name="null"> 1174 <context-group name="null">
1196 <context context-type="linenumber">59</context> 1175 <context context-type="linenumber">52</context>
1197 </context-group> 1176 </context-group>
1198 </trans-unit> 1177 </trans-unit>
1199 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1178 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1200 <source>Videos Recently Added</source> 1179 <source>Videos Recently Added</source>
1201 <target>Vídeos Adicionados Recentemente</target> 1180 <target>Vídeos Adicionados Recentemente</target>
1202 <context-group name="null"> 1181 <context-group name="null">
1203 <context context-type="linenumber">60</context> 1182 <context context-type="linenumber">53</context>
1204 </context-group> 1183 </context-group>
1205 </trans-unit> 1184 </trans-unit>
1206 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1185 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1207 <source>Local videos</source> 1186 <source>Local videos</source>
1208 <target>Vídeos locais</target> 1187 <target>Vídeos locais</target>
1209 <context-group name="null"> 1188 <context-group name="null">
1210 <context context-type="linenumber">61</context> 1189 <context context-type="linenumber">54</context>
1211 </context-group> 1190 </context-group>
1212 </trans-unit> 1191 </trans-unit>
1213 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1192 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1214 <source>Policy on videos containing sensitive content</source> 1193 <source>Policy on videos containing sensitive content</source>
1215 <target>Política sobre vídeos que possuem conteúdo sensível</target> 1194 <target>Política sobre vídeos que possuem conteúdo sensível</target>
1216 <context-group name="null"> 1195 <context-group name="null">
1217 <context context-type="linenumber">70</context> 1196 <context context-type="linenumber">61</context>
1218 </context-group> 1197 </context-group>
1219 </trans-unit> 1198 </trans-unit>
1220 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1199 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1249,21 +1228,42 @@
1249 <source>Signup enabled</source> 1228 <source>Signup enabled</source>
1250 <target>Inscrição permitida</target> 1229 <target>Inscrição permitida</target>
1251 <context-group name="null"> 1230 <context-group name="null">
1252 <context context-type="linenumber">92</context> 1231 <context context-type="linenumber">84</context>
1253 </context-group> 1232 </context-group>
1254 </trans-unit> 1233 </trans-unit>
1255 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1234 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1256 <source>Signup requires email verification</source> 1235 <source>Signup requires email verification</source>
1257 <target>Inscrição requer verificação de email</target> 1236 <target>Inscrição requer verificação de email</target>
1258 <context-group name="null"> 1237 <context-group name="null">
1259 <context context-type="linenumber">97</context> 1238 <context context-type="linenumber">91</context>
1260 </context-group> 1239 </context-group>
1261 </trans-unit> 1240 </trans-unit>
1262 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1241 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1263 <source>Signup limit</source> 1242 <source>Signup limit</source>
1264 <target>Limite de inscrições</target> 1243 <target>Limite de inscrições</target>
1265 <context-group name="null"> 1244 <context-group name="null">
1266 <context context-type="linenumber">101</context> 1245 <context context-type="linenumber">96</context>
1246 </context-group>
1247 </trans-unit>
1248 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1249 <source>Users</source>
1250 <target>Usuários</target>
1251 <context-group name="null">
1252 <context context-type="linenumber">105</context>
1253 </context-group>
1254 </trans-unit>
1255 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1256 <source>User default video quota</source>
1257 <target>Cota padrão de vídeos do usuário</target>
1258 <context-group name="null">
1259 <context context-type="linenumber">109</context>
1260 </context-group>
1261 </trans-unit>
1262 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1263 <source>User default daily upload limit</source>
1264 <target>Padrão de limite diário de upload</target>
1265 <context-group name="null">
1266 <context context-type="linenumber">121</context>
1267 </context-group> 1267 </context-group>
1268 </trans-unit> 1268 </trans-unit>
1269 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1269 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1273,53 +1273,25 @@
1273 <context context-type="linenumber">42</context> 1273 <context context-type="linenumber">42</context>
1274 </context-group> 1274 </context-group>
1275 </trans-unit> 1275 </trans-unit>
1276 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce">
1277 <source>Video import with HTTP enabled</source>
1278 <target>Importação de vídeo com HTTP habilitada</target>
1279 <context-group name="null">
1280 <context context-type="linenumber">115</context>
1281 </context-group>
1282 </trans-unit>
1283 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1276 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1284 <source>Video import with a torrent file or a magnet URI enabled</source> 1277 <source>Video import with a torrent file or a magnet URI enabled</source>
1285 <target>Importação de vídeo com um arquivo torrent ou URI magnética habilitada</target> 1278 <target>Importação de vídeo com um arquivo torrent ou URI magnética habilitada</target>
1286 <context-group name="null"> 1279 <context-group name="null">
1287 <context context-type="linenumber">120</context> 1280 <context context-type="linenumber">148</context>
1288 </context-group> 1281 </context-group>
1289 </trans-unit> 1282 </trans-unit>
1290 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1283 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1291 <source>Administrator</source> 1284 <source>Administrator</source>
1292 <target>Administrador</target> 1285 <target>Administrador</target>
1293 <context-group name="null"> 1286 <context-group name="null">
1294 <context context-type="linenumber">123</context> 1287 <context context-type="linenumber">155</context>
1295 </context-group> 1288 </context-group>
1296 </trans-unit> 1289 </trans-unit>
1297 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1290 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1298 <source>Admin email</source> 1291 <source>Admin email</source>
1299 <target>Email de administrador</target> 1292 <target>Email de administrador</target>
1300 <context-group name="null"> 1293 <context-group name="null">
1301 <context context-type="linenumber">126</context> 1294 <context context-type="linenumber">158</context>
1302 </context-group>
1303 </trans-unit>
1304 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1305 <source>Users</source>
1306 <target>Usuários</target>
1307 <context-group name="null">
1308 <context context-type="linenumber">136</context>
1309 </context-group>
1310 </trans-unit>
1311 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1312 <source>User default video quota</source>
1313 <target>Cota padrão de vídeos do usuário</target>
1314 <context-group name="null">
1315 <context context-type="linenumber">139</context>
1316 </context-group>
1317 </trans-unit>
1318 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1319 <source>User default daily upload limit</source>
1320 <target>Padrão de limite diário de upload</target>
1321 <context-group name="null">
1322 <context context-type="linenumber">153</context>
1323 </context-group> 1295 </context-group>
1324 </trans-unit> 1296 </trans-unit>
1325 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1297 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1333,81 +1305,70 @@
1333 <source>Twitter</source> 1305 <source>Twitter</source>
1334 <target>Twitter</target> 1306 <target>Twitter</target>
1335 <context-group name="null"> 1307 <context-group name="null">
1336 <context context-type="linenumber">170</context> 1308 <context context-type="linenumber">178</context>
1337 </context-group> 1309 </context-group>
1338 </trans-unit> 1310 </trans-unit>
1339 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1311 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1340 <source>Your Twitter username</source> 1312 <source>Your Twitter username</source>
1341 <target>Seu nome de usuário no Twitter</target> 1313 <target>Seu nome de usuário no Twitter</target>
1342 <context-group name="null"> 1314 <context-group name="null">
1343 <context context-type="linenumber">173</context> 1315 <context context-type="linenumber">184</context>
1344 </context-group> 1316 </context-group>
1345 </trans-unit> 1317 </trans-unit>
1346 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1318 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1347 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1319 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1348 <target>Indica a conta Twitter do sítio web ou plataforma em que o conteúdo foi publicado.</target> 1320 <target>Indica a conta Twitter do sítio web ou plataforma em que o conteúdo foi publicado.</target>
1349 <context-group name="null"> 1321 <context-group name="null">
1350 <context context-type="linenumber">176</context> 1322 <context context-type="linenumber">187</context>
1351 </context-group> 1323 </context-group>
1352 </trans-unit> 1324 </trans-unit>
1353 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1325 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1354 <source>Instance whitelisted by Twitter</source> 1326 <source>Instance whitelisted by Twitter</source>
1355 <target>Instância listada como permitida pelo Twitter</target> 1327 <target>Instância listada como permitida pelo Twitter</target>
1356 <context-group name="null"> 1328 <context-group name="null">
1357 <context context-type="linenumber">189</context> 1329 <context context-type="linenumber">199</context>
1358 </context-group>
1359 </trans-unit>
1360 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1361 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1362 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1363 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1364 <target>Se a sua instância estiver na lista branca do Twitter, um player de vídeo será adicionado ao feed do Twitter ao compartilhar um vídeo do PeerTube.&lt;br /&gt;
1365 Se a instância não estiver na lista branca, nós utilizado um card com uma imagem de link que irá redirecionar para sua instância de PeerTube.&lt;br /&gt;&lt;br /&gt;
1366 Selecione este checkbox, salve a configuração e teste com uma URL de vídeo de sua instância (https://example.com/videos/watch/blabla) em &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; para ver se sua instância está na lista branca.</target>
1367 <context-group name="null">
1368 <context context-type="linenumber">190</context>
1369 </context-group> 1330 </context-group>
1370 </trans-unit> 1331 </trans-unit>
1371 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1332 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1372 <source>Services</source> 1333 <source>Services</source>
1373 <target>Serviços</target> 1334 <target>Serviços</target>
1374 <context-group name="null"> 1335 <context-group name="null">
1375 <context context-type="linenumber">168</context> 1336 <context context-type="linenumber">176</context>
1376 </context-group> 1337 </context-group>
1377 </trans-unit> 1338 </trans-unit>
1378 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1339 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1379 <source>Transcoding</source> 1340 <source>Transcoding</source>
1380 <target>Transcodificação</target> 1341 <target>Transcodificação</target>
1381 <context-group name="null"> 1342 <context-group name="null">
1382 <context context-type="linenumber">200</context> 1343 <context context-type="linenumber">215</context>
1383 </context-group> 1344 </context-group>
1384 </trans-unit> 1345 </trans-unit>
1385 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1346 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1386 <source>Transcoding enabled</source> 1347 <source>Transcoding enabled</source>
1387 <target>Transcodificação ativada</target> 1348 <target>Transcodificação ativada</target>
1388 <context-group name="null"> 1349 <context-group name="null">
1389 <context context-type="linenumber">204</context> 1350 <context context-type="linenumber">221</context>
1390 </context-group> 1351 </context-group>
1391 </trans-unit> 1352 </trans-unit>
1392 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1353 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1393 <source>If you disable transcoding, many videos from your users will not work!</source> 1354 <source>If you disable transcoding, many videos from your users will not work!</source>
1394 <target>Se você desativar a transcodificação, muitos vídeos dos seus usuários não funcionarão!</target> 1355 <target>Se você desativar a transcodificação, muitos vídeos dos seus usuários não funcionarão!</target>
1395 <context-group name="null"> 1356 <context-group name="null">
1396 <context context-type="linenumber">205</context> 1357 <context context-type="linenumber">222</context>
1397 </context-group> 1358 </context-group>
1398 </trans-unit> 1359 </trans-unit>
1399 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1360 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1400 <source>Transcoding threads</source> 1361 <source>Transcoding threads</source>
1401 <target>Threads de transcodificação</target> 1362 <target>Threads de transcodificação</target>
1402 <context-group name="null"> 1363 <context-group name="null">
1403 <context context-type="linenumber">211</context> 1364 <context context-type="linenumber">237</context>
1404 </context-group> 1365 </context-group>
1405 </trans-unit> 1366 </trans-unit>
1406 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1367 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1407 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1368 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1408 <target>Resolução <x id="INTERPOLATION" equiv-text="{{resolution}}"/> habilitada</target> 1369 <target>Resolução <x id="INTERPOLATION" equiv-text="{{resolution}}"/> habilitada</target>
1409 <context-group name="null"> 1370 <context-group name="null">
1410 <context context-type="linenumber">227</context> 1371 <context context-type="linenumber">252</context>
1411 </context-group> 1372 </context-group>
1412 </trans-unit> 1373 </trans-unit>
1413 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1374 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1422,105 +1383,70 @@
1422 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1383 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1423 </target> 1384 </target>
1424 <context-group name="null"> 1385 <context-group name="null">
1425 <context context-type="linenumber">233</context> 1386 <context context-type="linenumber">260</context>
1426 </context-group> 1387 </context-group>
1427 </trans-unit> 1388 </trans-unit>
1428 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1389 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1429 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1390 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1430 <target>Alguns arquivos não são federados (pré-visualizações, legendas ocultas). Nós as obtivemos diretamente da instância de origem e a colocamos em cache.</target> 1391 <target>Alguns arquivos não são federados (pré-visualizações, legendas ocultas). Nós as obtivemos diretamente da instância de origem e a colocamos em cache.</target>
1431 <context-group name="null"> 1392 <context-group name="null">
1432 <context context-type="linenumber">238</context> 1393 <context context-type="linenumber">265</context>
1433 </context-group> 1394 </context-group>
1434 </trans-unit> 1395 </trans-unit>
1435 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1396 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1436 <source>Previews cache size</source> 1397 <source>Previews cache size</source>
1437 <target>Tamanho do cache de pré-visualizações</target> 1398 <target>Tamanho do cache de pré-visualizações</target>
1438 <context-group name="null"> 1399 <context-group name="null">
1439 <context context-type="linenumber">243</context> 1400 <context context-type="linenumber">271</context>
1440 </context-group> 1401 </context-group>
1441 </trans-unit> 1402 </trans-unit>
1442 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1403 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1443 <source>Video captions cache size</source> 1404 <source>Video captions cache size</source>
1444 <target>Tamanho do cache de legendas ocultas de vídeos</target> 1405 <target>Tamanho do cache de legendas ocultas de vídeos</target>
1445 <context-group name="null"> 1406 <context-group name="null">
1446 <context context-type="linenumber">254</context> 1407 <context context-type="linenumber">280</context>
1447 </context-group> 1408 </context-group>
1448 </trans-unit> 1409 </trans-unit>
1449 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1410 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1450 <source>Customizations</source> 1411 <source>Customizations</source>
1451 <target>Personalizações</target> 1412 <target>Personalizações</target>
1452 <context-group name="null"> 1413 <context-group name="null">
1453 <context context-type="linenumber">264</context> 1414 <context context-type="linenumber">289</context>
1454 </context-group> 1415 </context-group>
1455 </trans-unit> 1416 </trans-unit>
1456 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1417 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1457 <source>JavaScript</source> 1418 <source>JavaScript</source>
1458 <target>JavaScript</target> 1419 <target>JavaScript</target>
1459 <context-group name="null"> 1420 <context-group name="null">
1460 <context context-type="linenumber">267</context> 1421 <context context-type="linenumber">294</context>
1461 </context-group> 1422 </context-group>
1462 </trans-unit> 1423 </trans-unit>
1463 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1424 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1464 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1425 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1465 <target>Escreva diretamente código JavaScript.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('minha instância é demais');&lt;/pre&gt;</target> 1426 <target>Escreva diretamente código JavaScript.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('minha instância é demais');&lt;/pre&gt;</target>
1466 <context-group name="null"> 1427 <context-group name="null">
1467 <context context-type="linenumber">270</context> 1428 <context context-type="linenumber">297</context>
1468 </context-group>
1469 </trans-unit>
1470 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1471 <source>
1472 Write directly CSS code. Example:&lt;br /&gt;
1473 &lt;pre&gt;
1474 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1475 background-color: red;
1476 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1477 &lt;/pre&gt;
1478
1479 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1480 &lt;pre&gt;
1481 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1482 color: red;
1483 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1484 &lt;/pre&gt;
1485 </source>
1486 <target>
1487 Escreva código CSS diretamente. Exemplo:&lt;br /&gt;
1488 &lt;pre&gt;
1489 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1490 background-color: red;
1491 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1492 &lt;/pre&gt;
1493
1494 Preceda com &lt;em&gt;#custom-css&lt;/em&gt; para sobrescrever estilos. Exemplo:
1495 &lt;pre&gt;
1496 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1497 color: red;
1498 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1499 &lt;/pre&gt;
1500 </target>
1501 <context-group name="null">
1502 <context context-type="linenumber">286</context>
1503 </context-group> 1429 </context-group>
1504 </trans-unit> 1430 </trans-unit>
1505 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1431 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1506 <source>Advanced configuration</source> 1432 <source>Advanced configuration</source>
1507 <target>Configurações avançadas</target> 1433 <target>Configurações avançadas</target>
1508 <context-group name="null"> 1434 <context-group name="null">
1509 <context context-type="linenumber">197</context> 1435 <context context-type="linenumber">212</context>
1510 </context-group> 1436 </context-group>
1511 </trans-unit> 1437 </trans-unit>
1512 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1438 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1513 <source>Update configuration</source> 1439 <source>Update configuration</source>
1514 <target>Atualizar configuração</target> 1440 <target>Atualizar configuração</target>
1515 <context-group name="null"> 1441 <context-group name="null">
1516 <context context-type="linenumber">314</context> 1442 <context context-type="linenumber">340</context>
1517 </context-group> 1443 </context-group>
1518 </trans-unit> 1444 </trans-unit>
1519 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1445 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1520 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1446 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1521 <target>Aparentemente a configuração está valida. Por favor procure potenciais erros nas diferentes abas.</target> 1447 <target>Aparentemente a configuração está valida. Por favor procure potenciais erros nas diferentes abas.</target>
1522 <context-group name="null"> 1448 <context-group name="null">
1523 <context context-type="linenumber">315</context> 1449 <context context-type="linenumber">341</context>
1524 </context-group> 1450 </context-group>
1525 </trans-unit> 1451 </trans-unit>
1526 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1452 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1614,14 +1540,14 @@
1614 <source>Score</source> 1540 <source>Score</source>
1615 <target>Pontuação</target> 1541 <target>Pontuação</target>
1616 <context-group name="null"> 1542 <context-group name="null">
1617 <context context-type="linenumber">8</context> 1543 <context context-type="linenumber">17</context>
1618 </context-group> 1544 </context-group>
1619 </trans-unit> 1545 </trans-unit>
1620 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1546 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1621 <source>Host</source> 1547 <source>Host</source>
1622 <target>Host</target> 1548 <target>Host</target>
1623 <context-group name="null"> 1549 <context-group name="null">
1624 <context context-type="linenumber">8</context> 1550 <context context-type="linenumber">19</context>
1625 </context-group> 1551 </context-group>
1626 </trans-unit> 1552 </trans-unit>
1627 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1553 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1726,7 +1652,7 @@
1726 <source>Role</source> 1652 <source>Role</source>
1727 <target>Papel</target> 1653 <target>Papel</target>
1728 <context-group name="null"> 1654 <context-group name="null">
1729 <context context-type="linenumber">20</context> 1655 <context context-type="linenumber">43</context>
1730 </context-group> 1656 </context-group>
1731 </trans-unit> 1657 </trans-unit>
1732 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1658 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1749,38 +1675,6 @@
1749 <context context-type="linenumber">72</context> 1675 <context context-type="linenumber">72</context>
1750 </context-group> 1676 </context-group>
1751 </trans-unit> 1677 </trans-unit>
1752 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33">
1753 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source>
1754 <target>Banir <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target>
1755 <context-group name="null">
1756 <context context-type="linenumber">3</context>
1757 </context-group>
1758 </trans-unit>
1759 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1760 <source>Reason...</source>
1761 <target>Motivo...</target>
1762 <context-group name="null">
1763 <context context-type="linenumber">11</context>
1764 </context-group>
1765 </trans-unit>
1766 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
1767 <source>
1768 A banned user will no longer be able to login.
1769 </source>
1770 <target>
1771 Um usuário banido não conseguirá mais fazer login.
1772 </target>
1773 <context-group name="null">
1774 <context context-type="linenumber">17</context>
1775 </context-group>
1776 </trans-unit>
1777 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
1778 <source>Ban this user</source>
1779 <target>Banir este usuário</target>
1780 <context-group name="null">
1781 <context context-type="linenumber">25</context>
1782 </context-group>
1783 </trans-unit>
1784 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1678 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1785 <source>Users list</source> 1679 <source>Users list</source>
1786 <target>Lista de usuários</target> 1680 <target>Lista de usuários</target>
@@ -1792,21 +1686,21 @@
1792 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1686 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1793 <target>Nome de usuário <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1687 <target>Nome de usuário <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1794 <context-group name="null"> 1688 <context-group name="null">
1795 <context context-type="linenumber">17</context> 1689 <context context-type="linenumber">40</context>
1796 </context-group> 1690 </context-group>
1797 </trans-unit> 1691 </trans-unit>
1798 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1692 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1799 <source>Actions</source> 1693 <source>Go to the account page</source>
1800 <target>Ações</target> 1694 <target>Ir para a página da conta</target>
1801 <context-group name="null"> 1695 <context-group name="null">
1802 <context context-type="linenumber">33</context> 1696 <context context-type="linenumber">133</context>
1803 </context-group> 1697 </context-group>
1804 </trans-unit> 1698 </trans-unit>
1805 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1699 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1806 <source>Ban reason:</source> 1700 <source>Ban reason:</source>
1807 <target>Motivo do banimento:</target> 1701 <target>Motivo do banimento:</target>
1808 <context-group name="null"> 1702 <context-group name="null">
1809 <context context-type="linenumber">51</context> 1703 <context context-type="linenumber">95</context>
1810 </context-group> 1704 </context-group>
1811 </trans-unit> 1705 </trans-unit>
1812 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1706 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1869,6 +1763,13 @@
1869 <context context-type="linenumber">33</context> 1763 <context context-type="linenumber">33</context>
1870 </context-group> 1764 </context-group>
1871 </trans-unit> 1765 </trans-unit>
1766 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1767 <source>Actions</source>
1768 <target>Ações</target>
1769 <context-group name="null">
1770 <context context-type="linenumber">35</context>
1771 </context-group>
1772 </trans-unit>
1872 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1773 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1873 <source>Reason:</source> 1774 <source>Reason:</source>
1874 <target>Motivo:</target> 1775 <target>Motivo:</target>
@@ -1901,14 +1802,14 @@
1901 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1802 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1902 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1803 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1903 <context-group name="null"> 1804 <context-group name="null">
1904 <context context-type="linenumber">10</context> 1805 <context context-type="linenumber">11</context>
1905 </context-group> 1806 </context-group>
1906 </trans-unit> 1807 </trans-unit>
1907 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 1808 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1908 <source>Blacklist reason:</source> 1809 <source>Blacklist reason:</source>
1909 <target>Motivo da lista negra:</target> 1810 <target>Motivo da lista negra:</target>
1910 <context-group name="null"> 1811 <context-group name="null">
1911 <context context-type="linenumber">41</context> 1812 <context context-type="linenumber">43</context>
1912 </context-group> 1813 </context-group>
1913 </trans-unit> 1814 </trans-unit>
1914 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1815 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1932,55 +1833,6 @@
1932 <context context-type="linenumber">7</context> 1833 <context context-type="linenumber">7</context>
1933 </context-group> 1834 </context-group>
1934 </trans-unit> 1835 </trans-unit>
1935 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1936 <source>My settings</source>
1937 <target>Minhas configurações</target>
1938 <context-group name="null">
1939 <context context-type="linenumber">3</context>
1940 </context-group>
1941 </trans-unit>
1942 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1943 <source>My library</source>
1944 <target>Minha biblioteca</target>
1945 <context-group name="null">
1946 <context context-type="linenumber">7</context>
1947 </context-group>
1948 </trans-unit>
1949 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1950 <source>My channels</source>
1951 <target>Meus canais</target>
1952 <context-group name="null">
1953 <context context-type="linenumber">12</context>
1954 </context-group>
1955 </trans-unit>
1956 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1957 <source>My videos</source>
1958 <target>Meus vídeos</target>
1959 <context-group name="null">
1960 <context context-type="linenumber">14</context>
1961 </context-group>
1962 </trans-unit>
1963 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1964 <source>My subscriptions</source>
1965 <target>Minhas inscrições</target>
1966 <context-group name="null">
1967 <context context-type="linenumber">16</context>
1968 </context-group>
1969 </trans-unit>
1970 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1971 <source>My imports</source>
1972 <target>Minhas importações</target>
1973 <context-group name="null">
1974 <context context-type="linenumber">18</context>
1975 </context-group>
1976 </trans-unit>
1977 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1978 <source>Ownership changes</source>
1979 <target>Mudanças de dono</target>
1980 <context-group name="null">
1981 <context context-type="linenumber">22</context>
1982 </context-group>
1983 </trans-unit>
1984 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1836 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1985 <source>Video quota:</source> 1837 <source>Video quota:</source>
1986 <target>Cota de vídeo:</target> 1838 <target>Cota de vídeo:</target>
@@ -1992,21 +1844,21 @@
1992 <source>Profile</source> 1844 <source>Profile</source>
1993 <target>Perfil</target> 1845 <target>Perfil</target>
1994 <context-group name="null"> 1846 <context-group name="null">
1995 <context context-type="linenumber">8</context> 1847 <context context-type="linenumber">7</context>
1996 </context-group> 1848 </context-group>
1997 </trans-unit> 1849 </trans-unit>
1998 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1850 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1999 <source>Video settings</source> 1851 <source>Video settings</source>
2000 <target>Configurações de vídeo</target> 1852 <target>Configurações de vídeo</target>
2001 <context-group name="null"> 1853 <context-group name="null">
2002 <context context-type="linenumber">15</context> 1854 <context context-type="linenumber">16</context>
2003 </context-group> 1855 </context-group>
2004 </trans-unit> 1856 </trans-unit>
2005 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1857 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2006 <source>Danger zone</source> 1858 <source>Danger zone</source>
2007 <target>Zona perigosa</target> 1859 <target>Zona perigosa</target>
2008 <context-group name="null"> 1860 <context-group name="null">
2009 <context context-type="linenumber">18</context> 1861 <context context-type="linenumber">19</context>
2010 </context-group> 1862 </context-group>
2011 </trans-unit> 1863 </trans-unit>
2012 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1864 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2034,13 +1886,6 @@
2034 <context context-type="linenumber">35</context> 1886 <context context-type="linenumber">35</context>
2035 </context-group> 1887 </context-group>
2036 </trans-unit> 1888 </trans-unit>
2037 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2038 <source>Submit</source>
2039 <target>Enviar</target>
2040 <context-group name="null">
2041 <context context-type="linenumber">24</context>
2042 </context-group>
2043 </trans-unit>
2044 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1889 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2045 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1890 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2046 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target> 1891 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target>
@@ -2200,6 +2045,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2200 <context context-type="linenumber">30</context> 2045 <context context-type="linenumber">30</context>
2201 </context-group> 2046 </context-group>
2202 </trans-unit> 2047 </trans-unit>
2048 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2049 <source>Current password</source>
2050 <target>Senha atual</target>
2051 <context-group name="null">
2052 <context context-type="linenumber">7</context>
2053 </context-group>
2054 </trans-unit>
2203 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2055 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2204 <source>New password</source> 2056 <source>New password</source>
2205 <target>Nova senha</target> 2057 <target>Nova senha</target>
@@ -2225,14 +2077,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2225 <source>Automatically plays video</source> 2077 <source>Automatically plays video</source>
2226 <target>Reproduzir vídeo automaticamente</target> 2078 <target>Reproduzir vídeo automaticamente</target>
2227 <context-group name="null"> 2079 <context-group name="null">
2228 <context context-type="linenumber">20</context> 2080 <context context-type="linenumber">28</context>
2229 </context-group> 2081 </context-group>
2230 </trans-unit> 2082 </trans-unit>
2231 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2083 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2232 <source>Save</source> 2084 <source>Save</source>
2233 <target>Salvar</target> 2085 <target>Salvar</target>
2234 <context-group name="null"> 2086 <context-group name="null">
2235 <context context-type="linenumber">23</context> 2087 <context context-type="linenumber">32</context>
2236 </context-group> 2088 </context-group>
2237 </trans-unit> 2089 </trans-unit>
2238 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2090 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2385,7 +2237,7 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2385 Meus parabéns! O vídeo sob <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> será importado! Você já pode adicionar informações sobre esse vídeo. 2237 Meus parabéns! O vídeo sob <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> será importado! Você já pode adicionar informações sobre esse vídeo.
2386</target> 2238</target>
2387 <context-group name="null"> 2239 <context-group name="null">
2388 <context context-type="linenumber">40</context> 2240 <context context-type="linenumber">46</context>
2389 </context-group> 2241 </context-group>
2390 </trans-unit> 2242 </trans-unit>
2391 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2243 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2406,14 +2258,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2406 <source>Publish will be available when upload is finished</source> 2258 <source>Publish will be available when upload is finished</source>
2407 <target>A publicação estará disponível quando o envio terminar</target> 2259 <target>A publicação estará disponível quando o envio terminar</target>
2408 <context-group name="null"> 2260 <context-group name="null">
2409 <context context-type="linenumber">48</context> 2261 <context context-type="linenumber">58</context>
2410 </context-group> 2262 </context-group>
2411 </trans-unit> 2263 </trans-unit>
2412 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2264 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2413 <source>Publish</source> 2265 <source>Publish</source>
2414 <target>Publicar</target> 2266 <target>Publicar</target>
2415 <context-group name="null"> 2267 <context-group name="null">
2416 <context context-type="linenumber">55</context> 2268 <context context-type="linenumber">65</context>
2417 </context-group> 2269 </context-group>
2418 </trans-unit> 2270 </trans-unit>
2419 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2271 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2445,7 +2297,7 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2445 Meus parabéns! O vídeo será importado com BitTorrent! Você já pode adicionar informações sobre esse vídeo. 2297 Meus parabéns! O vídeo será importado com BitTorrent! Você já pode adicionar informações sobre esse vídeo.
2446</target> 2298</target>
2447 <context-group name="null"> 2299 <context-group name="null">
2448 <context context-type="linenumber">48</context> 2300 <context context-type="linenumber">53</context>
2449 </context-group> 2301 </context-group>
2450 </trans-unit> 2302 </trans-unit>
2451 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2303 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2575,14 +2427,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2575 <source>Wait transcoding before publishing the video</source> 2427 <source>Wait transcoding before publishing the video</source>
2576 <target>Aguarde a transcodificação antes de publicar o vídeo</target> 2428 <target>Aguarde a transcodificação antes de publicar o vídeo</target>
2577 <context-group name="null"> 2429 <context-group name="null">
2578 <context context-type="linenumber">130</context> 2430 <context context-type="linenumber">131</context>
2579 </context-group> 2431 </context-group>
2580 </trans-unit> 2432 </trans-unit>
2581 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2433 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2582 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2434 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2583 <target>Se você decidir não aguardar a transcodificação antes de publicar o vídeo, ele poderá não ser reproduzido até que a transcodificação termine.</target> 2435 <target>Se você decidir não aguardar a transcodificação antes de publicar o vídeo, ele poderá não ser reproduzido até que a transcodificação termine.</target>
2584 <context-group name="null"> 2436 <context-group name="null">
2585 <context context-type="linenumber">131</context> 2437 <context context-type="linenumber">132</context>
2586 </context-group> 2438 </context-group>
2587 </trans-unit> 2439 </trans-unit>
2588 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2440 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2596,49 +2448,49 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2596 <source>Add another caption</source> 2448 <source>Add another caption</source>
2597 <target>Adicionar outra legenda oculta</target> 2449 <target>Adicionar outra legenda oculta</target>
2598 <context-group name="null"> 2450 <context-group name="null">
2599 <context context-type="linenumber">146</context> 2451 <context context-type="linenumber">147</context>
2600 </context-group> 2452 </context-group>
2601 </trans-unit> 2453 </trans-unit>
2602 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2454 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2603 <source>See the subtitle file</source> 2455 <source>See the subtitle file</source>
2604 <target>Veja o arquivo de legenda</target> 2456 <target>Veja o arquivo de legenda</target>
2605 <context-group name="null"> 2457 <context-group name="null">
2606 <context context-type="linenumber">155</context> 2458 <context context-type="linenumber">156</context>
2607 </context-group> 2459 </context-group>
2608 </trans-unit> 2460 </trans-unit>
2609 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2461 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2610 <source>Cancel create</source> 2462 <source>Cancel create</source>
2611 <target>Cancelar criação</target> 2463 <target>Cancelar criação</target>
2612 <context-group name="null"> 2464 <context-group name="null">
2613 <context context-type="linenumber">169</context> 2465 <context context-type="linenumber">170</context>
2614 </context-group> 2466 </context-group>
2615 </trans-unit> 2467 </trans-unit>
2616 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2468 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2617 <source>Cancel deletion</source> 2469 <source>Cancel deletion</source>
2618 <target>Cancelar exclusão</target> 2470 <target>Cancelar exclusão</target>
2619 <context-group name="null"> 2471 <context-group name="null">
2620 <context context-type="linenumber">177</context> 2472 <context context-type="linenumber">178</context>
2621 </context-group> 2473 </context-group>
2622 </trans-unit> 2474 </trans-unit>
2623 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2475 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2624 <source>Captions</source> 2476 <source>Captions</source>
2625 <target>Legendas ocultas</target> 2477 <target>Legendas ocultas</target>
2626 <context-group name="null"> 2478 <context-group name="null">
2627 <context context-type="linenumber">139</context> 2479 <context context-type="linenumber">140</context>
2628 </context-group> 2480 </context-group>
2629 </trans-unit> 2481 </trans-unit>
2630 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2482 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2631 <source>Upload thumbnail</source> 2483 <source>Upload thumbnail</source>
2632 <target>Enviar miniatura</target> 2484 <target>Enviar miniatura</target>
2633 <context-group name="null"> 2485 <context-group name="null">
2634 <context context-type="linenumber">195</context> 2486 <context context-type="linenumber">196</context>
2635 </context-group> 2487 </context-group>
2636 </trans-unit> 2488 </trans-unit>
2637 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2489 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2638 <source>Upload preview</source> 2490 <source>Upload preview</source>
2639 <target>Enviar pré-visualização</target> 2491 <target>Enviar pré-visualização</target>
2640 <context-group name="null"> 2492 <context-group name="null">
2641 <context context-type="linenumber">202</context> 2493 <context context-type="linenumber">203</context>
2642 </context-group> 2494 </context-group>
2643 </trans-unit> 2495 </trans-unit>
2644 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2496 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2652,14 +2504,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2652 <source>Short text to tell people how they can support you (membership platform...).</source> 2504 <source>Short text to tell people how they can support you (membership platform...).</source>
2653 <target>Texto curto para dizer às pessoas como elas podem apoiar você (plataforma de membros, etc.).</target> 2505 <target>Texto curto para dizer às pessoas como elas podem apoiar você (plataforma de membros, etc.).</target>
2654 <context-group name="null"> 2506 <context-group name="null">
2655 <context context-type="linenumber">209</context> 2507 <context context-type="linenumber">210</context>
2656 </context-group> 2508 </context-group>
2657 </trans-unit> 2509 </trans-unit>
2658 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2510 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2659 <source>Advanced settings</source> 2511 <source>Advanced settings</source>
2660 <target>Configurações avançadas</target> 2512 <target>Configurações avançadas</target>
2661 <context-group name="null"> 2513 <context-group name="null">
2662 <context context-type="linenumber">190</context> 2514 <context context-type="linenumber">191</context>
2663 </context-group> 2515 </context-group>
2664 </trans-unit> 2516 </trans-unit>
2665 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2517 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2726,17 +2578,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2726 <context context-type="linenumber">3</context> 2578 <context context-type="linenumber">3</context>
2727 </context-group> 2579 </context-group>
2728 </trans-unit> 2580 </trans-unit>
2729 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2730 <source>
2731 Cancel
2732 </source>
2733 <target>
2734 Cancelar
2735 </target>
2736 <context-group name="null">
2737 <context context-type="linenumber">19</context>
2738 </context-group>
2739 </trans-unit>
2740 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2581 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2741 <source>Share</source> 2582 <source>Share</source>
2742 <target>Compartilhar</target> 2583 <target>Compartilhar</target>
@@ -2936,13 +2777,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2936 <context context-type="linenumber">134</context> 2777 <context context-type="linenumber">134</context>
2937 </context-group> 2778 </context-group>
2938 </trans-unit> 2779 </trans-unit>
2939 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2940 <source>Go to the account page</source>
2941 <target>Ir para a página da conta</target>
2942 <context-group name="null">
2943 <context context-type="linenumber">133</context>
2944 </context-group>
2945 </trans-unit>
2946 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 2780 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2947 <source>Show more</source> 2781 <source>Show more</source>
2948 <target>Mostrar mais</target> 2782 <target>Mostrar mais</target>
@@ -3022,25 +2856,18 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3022 <context context-type="linenumber">3</context> 2856 <context context-type="linenumber">3</context>
3023 </context-group> 2857 </context-group>
3024 </trans-unit> 2858 </trans-unit>
3025 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3026 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3027 <target>Você pode comentar na página de sua instância na qual esse vídeo está federado com outra conta do PeerTube, ou por meio de qualquer instância fediverse com capacidade para ActivityPub. Por exemplo, com Mastodon ou Pleroma, você pode digitar na caixa de pesquisa &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; e encontrar o vídeo. Capacidades de comentar diretamente estão sendo trabalhadas em &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/470'&gt;#470&lt;/a&gt;.</target>
3028 <context-group name="null">
3029 <context context-type="linenumber">8</context>
3030 </context-group>
3031 </trans-unit>
3032 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 2859 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3033 <source>No comments.</source> 2860 <source>No comments.</source>
3034 <target>Nenhum comentário.</target> 2861 <target>Nenhum comentário.</target>
3035 <context-group name="null"> 2862 <context-group name="null">
3036 <context context-type="linenumber">18</context> 2863 <context context-type="linenumber">17</context>
3037 </context-group> 2864 </context-group>
3038 </trans-unit> 2865 </trans-unit>
3039 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 2866 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3040 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 2867 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3041 <target>Ver todas as <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respostas</target> 2868 <target>Ver todas as <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> respostas</target>
3042 <context-group name="null"> 2869 <context-group name="null">
3043 <context context-type="linenumber">55</context> 2870 <context context-type="linenumber">54</context>
3044 </context-group> 2871 </context-group>
3045 </trans-unit> 2872 </trans-unit>
3046 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 2873 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3051,7 +2878,7 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3051 Comentários estão desabilitados. 2878 Comentários estão desabilitados.
3052 </target> 2879 </target>
3053 <context-group name="null"> 2880 <context-group name="null">
3054 <context context-type="linenumber">64</context> 2881 <context context-type="linenumber">63</context>
3055 </context-group> 2882 </context-group>
3056 </trans-unit> 2883 </trans-unit>
3057 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 2884 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3086,13 +2913,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3086 <context context-type="linenumber">14</context> 2913 <context context-type="linenumber">14</context>
3087 </context-group> 2914 </context-group>
3088 </trans-unit> 2915 </trans-unit>
3089 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3090 <source>Error getting about from server</source>
3091 <target>Erro ao obter detalhes do servidor</target>
3092 <context-group name="null">
3093 <context context-type="linenumber">1</context>
3094 </context-group>
3095 </trans-unit>
3096 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2916 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3097 <source>No description</source> 2917 <source>No description</source>
3098 <target>Nenhuma descrição</target> 2918 <target>Nenhuma descrição</target>
@@ -3114,55 +2934,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3114 <context context-type="linenumber">1</context> 2934 <context context-type="linenumber">1</context>
3115 </context-group> 2935 </context-group>
3116 </trans-unit> 2936 </trans-unit>
3117 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3118 <source>Error</source>
3119 <target>Erro</target>
3120 <context-group name="null">
3121 <context context-type="linenumber">1</context>
3122 </context-group>
3123 </trans-unit>
3124 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3125 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3126 <target>Você definiu <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/> personalizado. </target>
3127 <context-group name="null">
3128 <context context-type="linenumber">1</context>
3129 </context-group>
3130 </trans-unit>
3131 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
3132 <source>This could lead to security issues or bugs if you do not understand it. </source>
3133 <target>Isso pode levar a problemas de segurança ou bugs se você não entender.</target>
3134 <context-group name="null">
3135 <context context-type="linenumber">1</context>
3136 </context-group>
3137 </trans-unit>
3138 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
3139 <source>Are you sure you want to update the configuration?</source>
3140 <target>Tem certeza de que deseja atualizar a configuração?</target>
3141 <context-group name="null">
3142 <context context-type="linenumber">1</context>
3143 </context-group>
3144 </trans-unit>
3145 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
3146 <source>Please type</source>
3147 <target>Por favor, digite</target>
3148 <context-group name="null">
3149 <context context-type="linenumber">1</context>
3150 </context-group>
3151 </trans-unit>
3152 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
3153 <source>to confirm.</source>
3154 <target>para confirmar.</target>
3155 <context-group name="null">
3156 <context context-type="linenumber">1</context>
3157 </context-group>
3158 </trans-unit>
3159 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3160 <source>Success</source>
3161 <target>Sucesso</target>
3162 <context-group name="null">
3163 <context context-type="linenumber">1</context>
3164 </context-group>
3165 </trans-unit>
3166 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2937 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3167 <source>Configuration updated.</source> 2938 <source>Configuration updated.</source>
3168 <target>Configuração atualizada.</target> 2939 <target>Configuração atualizada.</target>
@@ -3268,13 +3039,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3268 <context context-type="linenumber">1</context> 3039 <context context-type="linenumber">1</context>
3269 </context-group> 3040 </context-group>
3270 </trans-unit> 3041 </trans-unit>
3271 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03">
3272 <source>Do you really want to delete this abuse?</source>
3273 <target>Você realmente deseja excluir este abuso?</target>
3274 <context-group name="null">
3275 <context context-type="linenumber">1</context>
3276 </context-group>
3277 </trans-unit>
3278 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9"> 3042 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
3279 <source>Abuse deleted.</source> 3043 <source>Abuse deleted.</source>
3280 <target>Abuso deletado.</target> 3044 <target>Abuso deletado.</target>
@@ -3317,20 +3081,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3317 <context context-type="linenumber">1</context> 3081 <context context-type="linenumber">1</context>
3318 </context-group> 3082 </context-group>
3319 </trans-unit> 3083 </trans-unit>
3320 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
3321 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
3322 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> banido.</target>
3323 <context-group name="null">
3324 <context context-type="linenumber">1</context>
3325 </context-group>
3326 </trans-unit>
3327 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3328 <source>Ban</source>
3329 <target>Banir</target>
3330 <context-group name="null">
3331 <context context-type="linenumber">1</context>
3332 </context-group>
3333 </trans-unit>
3334 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3084 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3335 <source>Unban</source> 3085 <source>Unban</source>
3336 <target>Desbanir</target> 3086 <target>Desbanir</target>
@@ -3345,20 +3095,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3345 <context context-type="linenumber">1</context> 3095 <context context-type="linenumber">1</context>
3346 </context-group> 3096 </context-group>
3347 </trans-unit> 3097 </trans-unit>
3348 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
3349 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
3350 <target>Você realmente quer desbanir <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
3351 <context-group name="null">
3352 <context context-type="linenumber">1</context>
3353 </context-group>
3354 </trans-unit>
3355 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
3356 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
3357 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> foi desbanido.</target>
3358 <context-group name="null">
3359 <context context-type="linenumber">1</context>
3360 </context-group>
3361 </trans-unit>
3362 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 3098 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
3363 <source>You cannot delete root.</source> 3099 <source>You cannot delete root.</source>
3364 <target>Você não pode excluir root.</target> 3100 <target>Você não pode excluir root.</target>
@@ -3366,13 +3102,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3366 <context context-type="linenumber">1</context> 3102 <context context-type="linenumber">1</context>
3367 </context-group> 3103 </context-group>
3368 </trans-unit> 3104 </trans-unit>
3369 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
3370 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
3371 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> excluído.</target>
3372 <context-group name="null">
3373 <context context-type="linenumber">1</context>
3374 </context-group>
3375 </trans-unit>
3376 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e"> 3105 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3377 <source>Ownership accepted</source> 3106 <source>Ownership accepted</source>
3378 <target>Propriedade aceita</target> 3107 <target>Propriedade aceita</target>
@@ -3457,23 +3186,16 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3457 <context context-type="linenumber">1</context> 3186 <context context-type="linenumber">1</context>
3458 </context-group> 3187 </context-group>
3459 </trans-unit> 3188 </trans-unit>
3460 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3189 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3461 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3190 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3462 <target>Você realmente deseja excluir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Isso também excluirá todos os vídeos enviados neste canal.</target> 3191 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target>
3463 <context-group name="null">
3464 <context context-type="linenumber">1</context>
3465 </context-group>
3466 </trans-unit>
3467 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3468 <source>Please type the name of the video channel to confirm</source>
3469 <target>Por favor, digite o nome do canal de vídeo para confirmar</target>
3470 <context-group name="null"> 3192 <context-group name="null">
3471 <context context-type="linenumber">1</context> 3193 <context context-type="linenumber">1</context>
3472 </context-group> 3194 </context-group>
3473 </trans-unit> 3195 </trans-unit>
3474 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3196 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3475 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3197 <source>My videos</source>
3476 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target> 3198 <target>Meus vídeos</target>
3477 <context-group name="null"> 3199 <context-group name="null">
3478 <context context-type="linenumber">1</context> 3200 <context context-type="linenumber">1</context>
3479 </context-group> 3201 </context-group>
@@ -3548,16 +3270,37 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3548 <context context-type="linenumber">1</context> 3270 <context context-type="linenumber">1</context>
3549 </context-group> 3271 </context-group>
3550 </trans-unit> 3272 </trans-unit>
3551 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3273 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3552 <source>Channels</source> 3274 <source>My library</source>
3553 <target>Canais</target> 3275 <target>Minha biblioteca</target>
3276 <context-group name="null">
3277 <context context-type="linenumber">1</context>
3278 </context-group>
3279 </trans-unit>
3280 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3281 <source>My channels</source>
3282 <target>Meus canais</target>
3283 <context-group name="null">
3284 <context context-type="linenumber">1</context>
3285 </context-group>
3286 </trans-unit>
3287 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3288 <source>My subscriptions</source>
3289 <target>Minhas inscrições</target>
3554 <context-group name="null"> 3290 <context-group name="null">
3555 <context context-type="linenumber">1</context> 3291 <context context-type="linenumber">1</context>
3556 </context-group> 3292 </context-group>
3557 </trans-unit> 3293 </trans-unit>
3558 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3294 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3559 <source>Video imports</source> 3295 <source>Ownership changes</source>
3560 <target>Importações de vídeos</target> 3296 <target>Mudanças de dono</target>
3297 <context-group name="null">
3298 <context context-type="linenumber">1</context>
3299 </context-group>
3300 </trans-unit>
3301 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3302 <source>My settings</source>
3303 <target>Minhas configurações</target>
3561 <context-group name="null"> 3304 <context-group name="null">
3562 <context context-type="linenumber">1</context> 3305 <context context-type="linenumber">1</context>
3563 </context-group> 3306 </context-group>
@@ -3592,6 +3335,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3592 <context context-type="linenumber">1</context> 3335 <context context-type="linenumber">1</context>
3593 </context-group> 3336 </context-group>
3594 </trans-unit> 3337 </trans-unit>
3338 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3339 <source>Error</source>
3340 <target>Erro</target>
3341 <context-group name="null">
3342 <context context-type="linenumber">1</context>
3343 </context-group>
3344 </trans-unit>
3595 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 3345 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3596 <source>You need to reconnect.</source> 3346 <source>You need to reconnect.</source>
3597 <target>você precisa se reconectar.</target> 3347 <target>você precisa se reconectar.</target>
@@ -3606,6 +3356,20 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3606 <context context-type="linenumber">1</context> 3356 <context context-type="linenumber">1</context>
3607 </context-group> 3357 </context-group>
3608 </trans-unit> 3358 </trans-unit>
3359 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3360 <source>Info</source>
3361 <target>Info</target>
3362 <context-group name="null">
3363 <context context-type="linenumber">1</context>
3364 </context-group>
3365 </trans-unit>
3366 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3367 <source>Success</source>
3368 <target>Sucesso</target>
3369 <context-group name="null">
3370 <context context-type="linenumber">1</context>
3371 </context-group>
3372 </trans-unit>
3609 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 3373 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3610 <source>Incorrect username or password.</source> 3374 <source>Incorrect username or password.</source>
3611 <target>Nome de usuário ou senha incorretos.</target> 3375 <target>Nome de usuário ou senha incorretos.</target>
@@ -3823,6 +3587,20 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3823 <context context-type="linenumber">1</context> 3587 <context context-type="linenumber">1</context>
3824 </context-group> 3588 </context-group>
3825 </trans-unit> 3589 </trans-unit>
3590 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3591 <source>Email is required.</source>
3592 <target>E-mail é necessário.</target>
3593 <context-group name="null">
3594 <context context-type="linenumber">1</context>
3595 </context-group>
3596 </trans-unit>
3597 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3598 <source>Email must be valid.</source>
3599 <target>E-mail deve ser válido.</target>
3600 <context-group name="null">
3601 <context context-type="linenumber">1</context>
3602 </context-group>
3603 </trans-unit>
3826 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 3604 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3827 <source>Username is required.</source> 3605 <source>Username is required.</source>
3828 <target>Nome de usuário é necessário.</target> 3606 <target>Nome de usuário é necessário.</target>
@@ -3844,41 +3622,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3844 <context context-type="linenumber">1</context> 3622 <context context-type="linenumber">1</context>
3845 </context-group> 3623 </context-group>
3846 </trans-unit> 3624 </trans-unit>
3847 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3848 <source>Username must be at least 3 characters long.</source>
3849 <target>Nome de usuário deve ter pelo menos 3 caracteres.</target>
3850 <context-group name="null">
3851 <context context-type="linenumber">1</context>
3852 </context-group>
3853 </trans-unit>
3854 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3855 <source>Username cannot be more than 20 characters long.</source>
3856 <target>Nome de usuário não pode ter mais que 20 caracteres.</target>
3857 <context-group name="null">
3858 <context context-type="linenumber">1</context>
3859 </context-group>
3860 </trans-unit>
3861 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3862 <source>Username should be only lowercase alphanumeric characters.</source>
3863 <target>Nome de usuário deve ter apenas caracteres alfanuméricos minúsculos.</target>
3864 <context-group name="null">
3865 <context context-type="linenumber">1</context>
3866 </context-group>
3867 </trans-unit>
3868 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3869 <source>Email is required.</source>
3870 <target>E-mail é necessário.</target>
3871 <context-group name="null">
3872 <context context-type="linenumber">1</context>
3873 </context-group>
3874 </trans-unit>
3875 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3876 <source>Email must be valid.</source>
3877 <target>E-mail deve ser válido.</target>
3878 <context-group name="null">
3879 <context context-type="linenumber">1</context>
3880 </context-group>
3881 </trans-unit>
3882 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 3625 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3883 <source>Password must be at least 6 characters long.</source> 3626 <source>Password must be at least 6 characters long.</source>
3884 <target>Senha deve ter pelo menos 6 caracteres.</target> 3627 <target>Senha deve ter pelo menos 6 caracteres.</target>
@@ -3942,20 +3685,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3942 <context context-type="linenumber">1</context> 3685 <context context-type="linenumber">1</context>
3943 </context-group> 3686 </context-group>
3944 </trans-unit> 3687 </trans-unit>
3945 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3946 <source>Display name must be at least 3 characters long.</source>
3947 <target>Nome de exibição deve ter pelo menos 3 caracteres.</target>
3948 <context-group name="null">
3949 <context context-type="linenumber">1</context>
3950 </context-group>
3951 </trans-unit>
3952 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3953 <source>Display name cannot be more than 120 characters long.</source>
3954 <target>Nome de exibição não pode ter mais que 120 caracteres.</target>
3955 <context-group name="null">
3956 <context context-type="linenumber">1</context>
3957 </context-group>
3958 </trans-unit>
3959 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3688 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3960 <source>Description must be at least 3 characters long.</source> 3689 <source>Description must be at least 3 characters long.</source>
3961 <target>Descrição deve ter pelo menos 3 caracteres.</target> 3690 <target>Descrição deve ter pelo menos 3 caracteres.</target>
@@ -3963,13 +3692,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3963 <context context-type="linenumber">1</context> 3692 <context context-type="linenumber">1</context>
3964 </context-group> 3693 </context-group>
3965 </trans-unit> 3694 </trans-unit>
3966 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3">
3967 <source>Description cannot be more than 250 characters long.</source>
3968 <target>Descrição não pode ter mais que 250 caracteres.</target>
3969 <context-group name="null">
3970 <context context-type="linenumber">1</context>
3971 </context-group>
3972 </trans-unit>
3973 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561"> 3695 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
3974 <source>You must to agree with the instance terms in order to registering on it.</source> 3696 <source>You must to agree with the instance terms in order to registering on it.</source>
3975 <target>Você deve concordar com os termos da instância para se registrar nela.</target> 3697 <target>Você deve concordar com os termos da instância para se registrar nela.</target>
@@ -4005,13 +3727,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4005 <context context-type="linenumber">1</context> 3727 <context context-type="linenumber">1</context>
4006 </context-group> 3728 </context-group>
4007 </trans-unit> 3729 </trans-unit>
4008 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4009 <source>Report reason cannot be more than 300 characters long.</source>
4010 <target>Motivo da denúncia não pode ter mais que 300 caracteres.</target>
4011 <context-group name="null">
4012 <context context-type="linenumber">1</context>
4013 </context-group>
4014 </trans-unit>
4015 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 3730 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4016 <source>Moderation comment is required.</source> 3731 <source>Moderation comment is required.</source>
4017 <target>Comentário de moderação é obrigatório.</target> 3732 <target>Comentário de moderação é obrigatório.</target>
@@ -4026,13 +3741,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4026 <context context-type="linenumber">1</context> 3741 <context context-type="linenumber">1</context>
4027 </context-group> 3742 </context-group>
4028 </trans-unit> 3743 </trans-unit>
4029 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4030 <source>Moderation comment cannot be more than 300 characters long.</source>
4031 <target>Comentário de moderação não pode ter mais de 300 caracteres.</target>
4032 <context-group name="null">
4033 <context context-type="linenumber">1</context>
4034 </context-group>
4035 </trans-unit>
4036 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 3744 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4037 <source>The channel is required.</source> 3745 <source>The channel is required.</source>
4038 <target>O canal é obrigatório.</target> 3746 <target>O canal é obrigatório.</target>
@@ -4082,34 +3790,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4082 <context context-type="linenumber">1</context> 3790 <context context-type="linenumber">1</context>
4083 </context-group> 3791 </context-group>
4084 </trans-unit> 3792 </trans-unit>
4085 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4086 <source>Name must be at least 3 characters long.</source>
4087 <target>Nome deve ter pelo menos 3 caracteres.</target>
4088 <context-group name="null">
4089 <context context-type="linenumber">1</context>
4090 </context-group>
4091 </trans-unit>
4092 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4093 <source>Name cannot be more than 20 characters long.</source>
4094 <target>Nome não pode ter mais de 20 caracteres.</target>
4095 <context-group name="null">
4096 <context context-type="linenumber">1</context>
4097 </context-group>
4098 </trans-unit>
4099 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4100 <source>Name should be only lowercase alphanumeric characters.</source>
4101 <target>Nome deve ser apenas caracteres alfanuméricos minúsculos.</target>
4102 <context-group name="null">
4103 <context context-type="linenumber">1</context>
4104 </context-group>
4105 </trans-unit>
4106 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
4107 <source>Description cannot be more than 500 characters long.</source>
4108 <target>Descrição não pode ter mais que 500 caracteres.</target>
4109 <context-group name="null">
4110 <context context-type="linenumber">1</context>
4111 </context-group>
4112 </trans-unit>
4113 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3793 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4114 <source>Support text must be at least 3 characters long.</source> 3794 <source>Support text must be at least 3 characters long.</source>
4115 <target>Texto de apoio deve ter pelo menos 3 caracteres.</target> 3795 <target>Texto de apoio deve ter pelo menos 3 caracteres.</target>
@@ -4117,13 +3797,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4117 <context context-type="linenumber">1</context> 3797 <context context-type="linenumber">1</context>
4118 </context-group> 3798 </context-group>
4119 </trans-unit> 3799 </trans-unit>
4120 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813">
4121 <source>Support text cannot be more than 500 characters long.</source>
4122 <target>Texto de apoio não pode ter mais que 500 caracteres.</target>
4123 <context-group name="null">
4124 <context context-type="linenumber">1</context>
4125 </context-group>
4126 </trans-unit>
4127 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 3800 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
4128 <source>Comment is required.</source> 3801 <source>Comment is required.</source>
4129 <target>Comentário é necessário.</target> 3802 <target>Comentário é necessário.</target>
@@ -4215,13 +3888,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4215 <context context-type="linenumber">1</context> 3888 <context context-type="linenumber">1</context>
4216 </context-group> 3889 </context-group>
4217 </trans-unit> 3890 </trans-unit>
4218 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b">
4219 <source>Video support cannot be more than 500 characters long.</source>
4220 <target>Apoio ao vídeo não pode ter mais que 500 caracteres.</target>
4221 <context-group name="null">
4222 <context context-type="linenumber">1</context>
4223 </context-group>
4224 </trans-unit>
4225 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 3891 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
4226 <source>A date is required to schedule video update.</source> 3892 <source>A date is required to schedule video update.</source>
4227 <target>Uma data é necessária para agendar uma atualização de vídeo.</target> 3893 <target>Uma data é necessária para agendar uma atualização de vídeo.</target>
@@ -4747,6 +4413,34 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4747 <context context-type="linenumber">1</context> 4413 <context context-type="linenumber">1</context>
4748 </context-group> 4414 </context-group>
4749 </trans-unit> 4415 </trans-unit>
4416 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
4417 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
4418 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> banido.</target>
4419 <context-group name="null">
4420 <context context-type="linenumber">1</context>
4421 </context-group>
4422 </trans-unit>
4423 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
4424 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
4425 <target>Você realmente quer desbanir <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
4426 <context-group name="null">
4427 <context context-type="linenumber">1</context>
4428 </context-group>
4429 </trans-unit>
4430 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
4431 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
4432 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> foi desbanido.</target>
4433 <context-group name="null">
4434 <context context-type="linenumber">1</context>
4435 </context-group>
4436 </trans-unit>
4437 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
4438 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
4439 <target>Usuário <x id="INTERPOLATION" equiv-text="{{username}}"/> excluído.</target>
4440 <context-group name="null">
4441 <context context-type="linenumber">1</context>
4442 </context-group>
4443 </trans-unit>
4750 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 4444 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4751 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 4445 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4752 <target>A solicitação é grande demais para o servidor. Entre em contato com seu administrador se quiser aumentar o tamanho do limite.</target> 4446 <target>A solicitação é grande demais para o servidor. Entre em contato com seu administrador se quiser aumentar o tamanho do limite.</target>
@@ -4775,13 +4469,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4775 <context context-type="linenumber">1</context> 4469 <context context-type="linenumber">1</context>
4776 </context-group> 4470 </context-group>
4777 </trans-unit> 4471 </trans-unit>
4778 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4779 <source>Subscribed</source>
4780 <target>Inscrito</target>
4781 <context-group name="null">
4782 <context context-type="linenumber">1</context>
4783 </context-group>
4784 </trans-unit>
4785 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 4472 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
4786 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 4473 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4787 <target>Inscrito em <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 4474 <target>Inscrito em <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -4789,9 +4476,9 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4789 <context context-type="linenumber">1</context> 4476 <context context-type="linenumber">1</context>
4790 </context-group> 4477 </context-group>
4791 </trans-unit> 4478 </trans-unit>
4792 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 4479 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4793 <source>Unsubscribed</source> 4480 <source>Subscribed</source>
4794 <target>Desinscrito</target> 4481 <target>Inscrito</target>
4795 <context-group name="null"> 4482 <context-group name="null">
4796 <context context-type="linenumber">1</context> 4483 <context context-type="linenumber">1</context>
4797 </context-group> 4484 </context-group>
@@ -4803,6 +4490,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4803 <context context-type="linenumber">1</context> 4490 <context context-type="linenumber">1</context>
4804 </context-group> 4491 </context-group>
4805 </trans-unit> 4492 </trans-unit>
4493 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
4494 <source>Unsubscribed</source>
4495 <target>Desinscrito</target>
4496 <context-group name="null">
4497 <context context-type="linenumber">1</context>
4498 </context-group>
4499 </trans-unit>
4806 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb"> 4500 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
4807 <source>Only I can see this video</source> 4501 <source>Only I can see this video</source>
4808 <target>Apenas eu posso ver este vídeo</target> 4502 <target>Apenas eu posso ver este vídeo</target>
@@ -4824,27 +4518,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4824 <context context-type="linenumber">1</context> 4518 <context context-type="linenumber">1</context>
4825 </context-group> 4519 </context-group>
4826 </trans-unit> 4520 </trans-unit>
4827 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2">
4828 <source>Welcome</source>
4829 <target>Bem vindo</target>
4830 <context-group name="null">
4831 <context context-type="linenumber">1</context>
4832 </context-group>
4833 </trans-unit>
4834 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
4835 <source>Please check your email to verify your account and complete signup.</source>
4836 <target>Por favor cheque seu email para verificar sua conta e completar o registro.</target>
4837 <context-group name="null">
4838 <context context-type="linenumber">1</context>
4839 </context-group>
4840 </trans-unit>
4841 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
4842 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
4843 <target>Registro para <x id="INTERPOLATION" equiv-text="{{username}}"/> concluído.</target>
4844 <context-group name="null">
4845 <context context-type="linenumber">1</context>
4846 </context-group>
4847 </trans-unit>
4848 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb"> 4521 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
4849 <source>Video to import updated.</source> 4522 <source>Video to import updated.</source>
4850 <target>Vídeo para importar atualizado.</target> 4523 <target>Vídeo para importar atualizado.</target>
@@ -4873,13 +4546,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4873 <context context-type="linenumber">1</context> 4546 <context context-type="linenumber">1</context>
4874 </context-group> 4547 </context-group>
4875 </trans-unit> 4548 </trans-unit>
4876 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4877 <source>Info</source>
4878 <target>Info</target>
4879 <context-group name="null">
4880 <context context-type="linenumber">1</context>
4881 </context-group>
4882 </trans-unit>
4883 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 4549 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4884 <source>Upload cancelled</source> 4550 <source>Upload cancelled</source>
4885 <target>Envio cancelado</target> 4551 <target>Envio cancelado</target>
@@ -4887,13 +4553,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4887 <context context-type="linenumber">1</context> 4553 <context context-type="linenumber">1</context>
4888 </context-group> 4554 </context-group>
4889 </trans-unit> 4555 </trans-unit>
4890 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4891 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4892 <target>Lamentamos, mas o PeerTube não consegue lidar com vídeos&gt; 8GB</target>
4893 <context-group name="null">
4894 <context context-type="linenumber">1</context>
4895 </context-group>
4896 </trans-unit>
4897 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 4556 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4898 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 4557 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4899 <target>Sua quota de vídeos é excedida com este vídeo (tamanho do vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizado: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 4558 <target>Sua quota de vídeos é excedida com este vídeo (tamanho do vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizado: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
diff --git a/client/src/locale/target/angular_ru_RU.xml b/client/src/locale/target/angular_ru_RU.xml
index accbbdd71..b3e2afb96 100644
--- a/client/src/locale/target/angular_ru_RU.xml
+++ b/client/src/locale/target/angular_ru_RU.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Выберите меÑÑц</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Выберите год</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -101,6 +115,13 @@
101 <context context-type="linenumber">6</context> 115 <context context-type="linenumber">6</context>
102 </context-group> 116 </context-group>
103 </trans-unit> 117 </trans-unit>
118 <trans-unit id="ngb.timepicker.increment-hours">
119 <source>Increment hours</source>
120 <target>Увеличение чаÑob</target>
121 <context-group name="null">
122 <context context-type="linenumber">9</context>
123 </context-group>
124 </trans-unit>
104 <trans-unit id="ngb.timepicker.HH"> 125 <trans-unit id="ngb.timepicker.HH">
105 <source>HH</source> 126 <source>HH</source>
106 <target>HH</target> 127 <target>HH</target>
@@ -115,6 +136,20 @@
115 <context context-type="linenumber">14</context> 136 <context context-type="linenumber">14</context>
116 </context-group> 137 </context-group>
117 </trans-unit> 138 </trans-unit>
139 <trans-unit id="ngb.timepicker.decrement-hours">
140 <source>Decrement hours</source>
141 <target>Сокращение чаÑов</target>
142 <context-group name="null">
143 <context context-type="linenumber">19</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="ngb.timepicker.increment-minutes">
147 <source>Increment minutes</source>
148 <target>Увеличение минут</target>
149 <context-group name="null">
150 <context context-type="linenumber">28</context>
151 </context-group>
152 </trans-unit>
118 <trans-unit id="ngb.timepicker.MM"> 153 <trans-unit id="ngb.timepicker.MM">
119 <source>MM</source> 154 <source>MM</source>
120 <target>MM</target> 155 <target>MM</target>
@@ -129,6 +164,20 @@
129 <context context-type="linenumber">33</context> 164 <context context-type="linenumber">33</context>
130 </context-group> 165 </context-group>
131 </trans-unit> 166 </trans-unit>
167 <trans-unit id="ngb.timepicker.decrement-minutes">
168 <source>Decrement minutes</source>
169 <target>Сокращение минут</target>
170 <context-group name="null">
171 <context context-type="linenumber">38</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="ngb.timepicker.increment-seconds">
175 <source>Increment seconds</source>
176 <target>Увеличение Ñекунд</target>
177 <context-group name="null">
178 <context context-type="linenumber">47</context>
179 </context-group>
180 </trans-unit>
132 <trans-unit id="ngb.timepicker.SS"> 181 <trans-unit id="ngb.timepicker.SS">
133 <source>SS</source> 182 <source>SS</source>
134 <target>SS</target> 183 <target>SS</target>
@@ -175,7 +224,7 @@
175 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 224 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
176 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target> 225 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target>
177 <context-group name="null"> 226 <context-group name="null">
178 <context context-type="linenumber">13</context> 227 <context context-type="linenumber">16</context>
179 </context-group> 228 </context-group>
180 </trans-unit> 229 </trans-unit>
181 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 230 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -189,7 +238,7 @@
189 <source>Edit</source> 238 <source>Edit</source>
190 <target>Редактировать</target> 239 <target>Редактировать</target>
191 <context-group name="null"> 240 <context-group name="null">
192 <context context-type="linenumber">5</context> 241 <context context-type="linenumber">1</context>
193 </context-group> 242 </context-group>
194 </trans-unit> 243 </trans-unit>
195 <trans-unit id="9c71feb04c2beab559f79c41c6127815fb9c1a6f"> 244 <trans-unit id="9c71feb04c2beab559f79c41c6127815fb9c1a6f">
@@ -203,7 +252,7 @@
203 <source>Video quota</source> 252 <source>Video quota</source>
204 <target>Квота видео</target> 253 <target>Квота видео</target>
205 <context-group name="null"> 254 <context-group name="null">
206 <context context-type="linenumber">19</context> 255 <context context-type="linenumber">42</context>
207 </context-group> 256 </context-group>
208 </trans-unit> 257 </trans-unit>
209 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 258 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -217,6 +266,31 @@
217 <context context-type="linenumber">14</context> 266 <context context-type="linenumber">14</context>
218 </context-group> 267 </context-group>
219 </trans-unit> 268 </trans-unit>
269 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
270 <source>Reason...</source>
271 <target>Причина...</target>
272 <context-group name="null">
273 <context context-type="linenumber">11</context>
274 </context-group>
275 </trans-unit>
276 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
277 <source>
278 A banned user will no longer be able to login.
279 </source>
280 <target>
281 Забаненый пользователь не Ñможет больше подÑоединитьÑÑ.
282 </target>
283 <context-group name="null">
284 <context context-type="linenumber">17</context>
285 </context-group>
286 </trans-unit>
287 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
288 <source>Ban this user</source>
289 <target>Отправить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² бан</target>
290 <context-group name="null">
291 <context context-type="linenumber">25</context>
292 </context-group>
293 </trans-unit>
220 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 294 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
221 <source> 295 <source>
222 Login 296 Login
@@ -282,7 +356,7 @@
282 <source>Password</source> 356 <source>Password</source>
283 <target>Пароль</target> 357 <target>Пароль</target>
284 <context-group name="null"> 358 <context-group name="null">
285 <context context-type="linenumber">12</context> 359 <context context-type="linenumber">13</context>
286 </context-group> 360 </context-group>
287 </trans-unit> 361 </trans-unit>
288 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 362 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -296,7 +370,7 @@
296 <source>Login</source> 370 <source>Login</source>
297 <target>ÐвторизациÑ</target> 371 <target>ÐвторизациÑ</target>
298 <context-group name="null"> 372 <context-group name="null">
299 <context context-type="linenumber">38</context> 373 <context context-type="linenumber">36</context>
300 </context-group> 374 </context-group>
301 </trans-unit> 375 </trans-unit>
302 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 376 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -324,7 +398,7 @@
324 <source>Send me an email to reset my password</source> 398 <source>Send me an email to reset my password</source>
325 <target>Отправить пароль на Ñлектронную почту</target> 399 <target>Отправить пароль на Ñлектронную почту</target>
326 <context-group name="null"> 400 <context-group name="null">
327 <context context-type="linenumber">75</context> 401 <context context-type="linenumber">80</context>
328 </context-group> 402 </context-group>
329 </trans-unit> 403 </trans-unit>
330 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 404 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -381,28 +455,21 @@
381 <source>Example: jane_doe</source> 455 <source>Example: jane_doe</source>
382 <target>Пример: иванов_иван</target> 456 <target>Пример: иванов_иван</target>
383 <context-group name="null"> 457 <context-group name="null">
384 <context context-type="linenumber">16</context> 458 <context context-type="linenumber">17</context>
385 </context-group>
386 </trans-unit>
387 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b">
388 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
389 <target>Я прочел и ÑоглаÑен Ñ &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;УÑловиÑми пользованиÑ&lt;/a&gt; Ñтого Ñервера</target>
390 <context-group name="null">
391 <context context-type="linenumber">54</context>
392 </context-group> 459 </context-group>
393 </trans-unit> 460 </trans-unit>
394 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 461 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
395 <source>Signup</source> 462 <source>Signup</source>
396 <target>ЗарегиÑтрироватьÑÑ</target> 463 <target>ЗарегиÑтрироватьÑÑ</target>
397 <context-group name="null"> 464 <context-group name="null">
398 <context context-type="linenumber">88</context> 465 <context context-type="linenumber">78</context>
399 </context-group> 466 </context-group>
400 </trans-unit> 467 </trans-unit>
401 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 468 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
402 <source>Features found on this instance</source> 469 <source>Features found on this instance</source>
403 <target>функциональные возможноÑти Ñервера</target> 470 <target>функциональные возможноÑти Ñервера</target>
404 <context-group name="null"> 471 <context-group name="null">
405 <context context-type="linenumber">66</context> 472 <context context-type="linenumber">67</context>
406 </context-group> 473 </context-group>
407 </trans-unit> 474 </trans-unit>
408 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 475 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -423,13 +490,6 @@
423 <context context-type="linenumber">6</context> 490 <context context-type="linenumber">6</context>
424 </context-group> 491 </context-group>
425 </trans-unit> 492 </trans-unit>
426 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6">
427 <source>Filters</source>
428 <target>Критерии</target>
429 <context-group name="null">
430 <context context-type="linenumber">16</context>
431 </context-group>
432 </trans-unit>
433 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 493 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
434 <source> 494 <source>
435 No results found 495 No results found
@@ -438,28 +498,28 @@
438 поиÑк не дал результатов 498 поиÑк не дал результатов
439 </target> 499 </target>
440 <context-group name="null"> 500 <context-group name="null">
441 <context context-type="linenumber">25</context> 501 <context context-type="linenumber">28</context>
442 </context-group> 502 </context-group>
443 </trans-unit> 503 </trans-unit>
444 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 504 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
445 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 505 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
446 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> подпиÑчики</target> 506 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> подпиÑчики</target>
447 <context-group name="null"> 507 <context-group name="null">
448 <context context-type="linenumber">41</context> 508 <context context-type="linenumber">44</context>
449 </context-group> 509 </context-group>
450 </trans-unit> 510 </trans-unit>
451 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 511 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
452 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 512 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
453 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> проÑмотры</target> 513 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> проÑмотры</target>
454 <context-group name="null"> 514 <context-group name="null">
455 <context context-type="linenumber">52</context> 515 <context context-type="linenumber">55</context>
456 </context-group> 516 </context-group>
457 </trans-unit> 517 </trans-unit>
458 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 518 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
459 <source>Change the language</source> 519 <source>Change the language</source>
460 <target>Изменить Ñзык</target> 520 <target>Изменить Ñзык</target>
461 <context-group name="null"> 521 <context-group name="null">
462 <context context-type="linenumber">88</context> 522 <context context-type="linenumber">86</context>
463 </context-group> 523 </context-group>
464 </trans-unit> 524 </trans-unit>
465 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 525 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -470,7 +530,7 @@
470 Мой побличный профиль 530 Мой побличный профиль
471 </target> 531 </target>
472 <context-group name="null"> 532 <context-group name="null">
473 <context context-type="linenumber">18</context> 533 <context context-type="linenumber">16</context>
474 </context-group> 534 </context-group>
475 </trans-unit> 535 </trans-unit>
476 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 536 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -481,7 +541,7 @@
481 ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ 541 ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ
482 </target> 542 </target>
483 <context-group name="null"> 543 <context-group name="null">
484 <context context-type="linenumber">22</context> 544 <context context-type="linenumber">20</context>
485 </context-group> 545 </context-group>
486 </trans-unit> 546 </trans-unit>
487 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 547 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -492,7 +552,7 @@
492 Мои видео 552 Мои видео
493 </target> 553 </target>
494 <context-group name="null"> 554 <context-group name="null">
495 <context context-type="linenumber">26</context> 555 <context context-type="linenumber">24</context>
496 </context-group> 556 </context-group>
497 </trans-unit> 557 </trans-unit>
498 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 558 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -503,14 +563,14 @@
503 Выйти 563 Выйти
504 </target> 564 </target>
505 <context-group name="null"> 565 <context-group name="null">
506 <context context-type="linenumber">30</context> 566 <context context-type="linenumber">28</context>
507 </context-group> 567 </context-group>
508 </trans-unit> 568 </trans-unit>
509 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 569 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
510 <source>Create an account</source> 570 <source>Create an account</source>
511 <target>Создать учетную запиÑÑŒ</target> 571 <target>Создать учетную запиÑÑŒ</target>
512 <context-group name="null"> 572 <context-group name="null">
513 <context context-type="linenumber">39</context> 573 <context context-type="linenumber">37</context>
514 </context-group> 574 </context-group>
515 </trans-unit> 575 </trans-unit>
516 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 576 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -524,49 +584,49 @@
524 <source>Subscriptions</source> 584 <source>Subscriptions</source>
525 <target>ПодпиÑки</target> 585 <target>ПодпиÑки</target>
526 <context-group name="null"> 586 <context-group name="null">
527 <context context-type="linenumber">47</context> 587 <context context-type="linenumber">45</context>
528 </context-group> 588 </context-group>
529 </trans-unit> 589 </trans-unit>
530 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 590 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
531 <source>Overview</source> 591 <source>Overview</source>
532 <target>Общий вид</target> 592 <target>Общий вид</target>
533 <context-group name="null"> 593 <context-group name="null">
534 <context context-type="linenumber">52</context> 594 <context context-type="linenumber">50</context>
535 </context-group> 595 </context-group>
536 </trans-unit> 596 </trans-unit>
537 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 597 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
538 <source>Trending</source> 598 <source>Trending</source>
539 <target>Тенденции</target> 599 <target>Тенденции</target>
540 <context-group name="null"> 600 <context-group name="null">
541 <context context-type="linenumber">57</context> 601 <context context-type="linenumber">55</context>
542 </context-group> 602 </context-group>
543 </trans-unit> 603 </trans-unit>
544 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 604 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
545 <source>Recently added</source> 605 <source>Recently added</source>
546 <target>Ðедавно добавленный </target> 606 <target>Ðедавно добавленный </target>
547 <context-group name="null"> 607 <context-group name="null">
548 <context context-type="linenumber">62</context> 608 <context context-type="linenumber">60</context>
549 </context-group> 609 </context-group>
550 </trans-unit> 610 </trans-unit>
551 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 611 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
552 <source>Local</source> 612 <source>Local</source>
553 <target>Локальный</target> 613 <target>Локальный</target>
554 <context-group name="null"> 614 <context-group name="null">
555 <context context-type="linenumber">67</context> 615 <context context-type="linenumber">65</context>
556 </context-group> 616 </context-group>
557 </trans-unit> 617 </trans-unit>
558 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 618 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
559 <source>More</source> 619 <source>More</source>
560 <target>Больше</target> 620 <target>Больше</target>
561 <context-group name="null"> 621 <context-group name="null">
562 <context context-type="linenumber">72</context> 622 <context context-type="linenumber">70</context>
563 </context-group> 623 </context-group>
564 </trans-unit> 624 </trans-unit>
565 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 625 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
566 <source>Administration</source> 626 <source>Administration</source>
567 <target>ÐдминиÑтрациÑ</target> 627 <target>ÐдминиÑтрациÑ</target>
568 <context-group name="null"> 628 <context-group name="null">
569 <context context-type="linenumber">76</context> 629 <context context-type="linenumber">74</context>
570 </context-group> 630 </context-group>
571 </trans-unit> 631 </trans-unit>
572 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 632 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -580,7 +640,7 @@
580 <source>Toggle dark interface</source> 640 <source>Toggle dark interface</source>
581 <target>Изменить интерфейÑ</target> 641 <target>Изменить интерфейÑ</target>
582 <context-group name="null"> 642 <context-group name="null">
583 <context context-type="linenumber">94</context> 643 <context context-type="linenumber">92</context>
584 </context-group> 644 </context-group>
585 </trans-unit> 645 </trans-unit>
586 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 646 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -685,7 +745,7 @@
685 <source>No results.</source> 745 <source>No results.</source>
686 <target>Ðет результатов</target> 746 <target>Ðет результатов</target>
687 <context-group name="null"> 747 <context-group name="null">
688 <context context-type="linenumber">7</context> 748 <context context-type="linenumber">20</context>
689 </context-group> 749 </context-group>
690 </trans-unit> 750 </trans-unit>
691 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 751 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -720,9 +780,9 @@
720 </trans-unit> 780 </trans-unit>
721 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 781 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
722 <source>Instance</source> 782 <source>Instance</source>
723 <target>СеÑвеÑ</target> 783 <target>ИнÑтанциÑ</target>
724 <context-group name="null"> 784 <context-group name="null">
725 <context context-type="linenumber">8</context> 785 <context context-type="linenumber">12</context>
726 </context-group> 786 </context-group>
727 </trans-unit> 787 </trans-unit>
728 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 788 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -732,15 +792,11 @@
732 <context context-type="linenumber">7</context> 792 <context context-type="linenumber">7</context>
733 </context-group> 793 </context-group>
734 </trans-unit> 794 </trans-unit>
735 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 795 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
736 <source> 796 <source>Submit</source>
737 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 797 <target>Отправить</target>
738</source>
739 <target>
740 О <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> Ñервере
741</target>
742 <context-group name="null"> 798 <context-group name="null">
743 <context context-type="linenumber">1</context> 799 <context context-type="linenumber">31</context>
744 </context-group> 800 </context-group>
745 </trans-unit> 801 </trans-unit>
746 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 802 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -754,47 +810,14 @@
754 <source>Terms</source> 810 <source>Terms</source>
755 <target>УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ </target> 811 <target>УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ </target>
756 <context-group name="null"> 812 <context-group name="null">
757 <context context-type="linenumber">44</context> 813 <context context-type="linenumber">39</context>
758 </context-group> 814 </context-group>
759 </trans-unit> 815 </trans-unit>
760 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 816 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
761 <source>User registration is allowed and</source> 817 <source>User registration is allowed and</source>
762 <target>Ð¡Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи разрешено и</target> 818 <target>Ð¡Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи разрешено и</target>
763 <context-group name="null"> 819 <context-group name="null">
764 <context context-type="linenumber">25</context> 820 <context context-type="linenumber">29</context>
765 </context-group>
766 </trans-unit>
767 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
768 <source>
769 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
770 </source>
771 <target>
772 Ñтот Ñервер предоÑтавлÑет <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> меÑта Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹.
773 </target>
774 <context-group name="null">
775 <context context-type="linenumber">27</context>
776 </context-group>
777 </trans-unit>
778 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
779 <source>
780 this instance provides unlimited space for the videos of its users.
781 </source>
782 <target>
783 Ñтот Ñервер предоÑтавлÑет неограниченное меÑто Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹.
784 </target>
785 <context-group name="null">
786 <context context-type="linenumber">31</context>
787 </context-group>
788 </trans-unit>
789 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
790 <source>
791 User registration is currently not allowed.
792 </source>
793 <target>
794 Создание учетной запиÑи не разрешено в данный момент.
795 </target>
796 <context-group name="null">
797 <context context-type="linenumber">36</context>
798 </context-group> 821 </context-group>
799 </trans-unit> 822 </trans-unit>
800 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 823 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -897,7 +920,7 @@
897 </source> 920 </source>
898 <target> 921 <target>
899 Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ отправленного запроÑа, трекер возвращает ограниченное количеÑтво Ñлучайных партнеров. 922 Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ отправленного запроÑа, трекер возвращает ограниченное количеÑтво Ñлучайных партнеров.
900 Ðапример, при 1000 партнеров в swarm, и при том, что трекер возвращает только 20 партнеров на каждый запроÑ, нужно 50 запроÑов, чтоб узнать вÑех партнеров в swarm 923 Ðапример, при 1000 партнеров в рой, и при том, что трекер возвращает только 20 партнеров на каждый запроÑ, нужно 50 запроÑов, чтоб узнать вÑех партнеров в рой
901 </target> 924 </target>
902 <context-group name="null"> 925 <context-group name="null">
903 <context context-type="linenumber">38</context> 926 <context context-type="linenumber">38</context>
@@ -1015,19 +1038,6 @@
1015 <context context-type="linenumber">83</context> 1038 <context context-type="linenumber">83</context>
1016 </context-group> 1039 </context-group>
1017 </trans-unit> 1040 </trans-unit>
1018 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8">
1019 <source>
1020 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
1021 In the meantime, we want to test different ideas related to this issue:
1022 </source>
1023 <target>
1024 PeerTube еÑÑ‚ÑŒ только в beta верÑии, и хочет предоÑтавить лучшие возможные Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð² момент выхода поÑтоÑнной верÑии.
1025 Пока мы теÑтируем множеÑтво идей, чтоб решить Ñту проблему:
1026 </target>
1027 <context-group name="null">
1028 <context context-type="linenumber">85</context>
1029 </context-group>
1030 </trans-unit>
1031 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1041 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1032 <source>Set a limit to the number of peers sent by the tracker</source> 1042 <source>Set a limit to the number of peers sent by the tracker</source>
1033 <target>УÑтановить лимит на количеÑтво партнеров отправленых трекером</target> 1043 <target>УÑтановить лимит на количеÑтво партнеров отправленых трекером</target>
@@ -1067,14 +1077,14 @@
1067 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1077 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1068 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> подпиÑчики</target> 1078 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> подпиÑчики</target>
1069 <context-group name="null"> 1079 <context-group name="null">
1070 <context context-type="linenumber">12</context> 1080 <context context-type="linenumber">24</context>
1071 </context-group> 1081 </context-group>
1072 </trans-unit> 1082 </trans-unit>
1073 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1083 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1074 <source>Video channels</source> 1084 <source>Video channels</source>
1075 <target>Видеоканал</target> 1085 <target>Видеоканал</target>
1076 <context-group name="null"> 1086 <context-group name="null">
1077 <context context-type="linenumber">19</context> 1087 <context context-type="linenumber">31</context>
1078 </context-group> 1088 </context-group>
1079 </trans-unit> 1089 </trans-unit>
1080 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1090 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1116,49 +1126,49 @@
1116 <source>Short description</source> 1126 <source>Short description</source>
1117 <target>Краткое опиÑание</target> 1127 <target>Краткое опиÑание</target>
1118 <context-group name="null"> 1128 <context-group name="null">
1119 <context context-type="linenumber">22</context> 1129 <context context-type="linenumber">21</context>
1120 </context-group> 1130 </context-group>
1121 </trans-unit> 1131 </trans-unit>
1122 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1132 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1123 <source>Default client route</source> 1133 <source>Default client route</source>
1124 <target>Default client route</target> 1134 <target>Default client route</target>
1125 <context-group name="null"> 1135 <context-group name="null">
1126 <context context-type="linenumber">55</context> 1136 <context context-type="linenumber">48</context>
1127 </context-group> 1137 </context-group>
1128 </trans-unit> 1138 </trans-unit>
1129 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1139 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1130 <source>Videos Overview</source> 1140 <source>Videos Overview</source>
1131 <target>Ð’Ñе видео</target> 1141 <target>Ð’Ñе видео</target>
1132 <context-group name="null"> 1142 <context-group name="null">
1133 <context context-type="linenumber">58</context> 1143 <context context-type="linenumber">51</context>
1134 </context-group> 1144 </context-group>
1135 </trans-unit> 1145 </trans-unit>
1136 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1146 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1137 <source>Videos Trending</source> 1147 <source>Videos Trending</source>
1138 <target>Тенденции видео</target> 1148 <target>Тенденции видео</target>
1139 <context-group name="null"> 1149 <context-group name="null">
1140 <context context-type="linenumber">59</context> 1150 <context context-type="linenumber">52</context>
1141 </context-group> 1151 </context-group>
1142 </trans-unit> 1152 </trans-unit>
1143 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1153 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1144 <source>Videos Recently Added</source> 1154 <source>Videos Recently Added</source>
1145 <target>Ðедавно добавленное видео</target> 1155 <target>Ðедавно добавленное видео</target>
1146 <context-group name="null"> 1156 <context-group name="null">
1147 <context context-type="linenumber">60</context> 1157 <context context-type="linenumber">53</context>
1148 </context-group> 1158 </context-group>
1149 </trans-unit> 1159 </trans-unit>
1150 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1160 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1151 <source>Local videos</source> 1161 <source>Local videos</source>
1152 <target>МеÑтное видео</target> 1162 <target>МеÑтное видео</target>
1153 <context-group name="null"> 1163 <context-group name="null">
1154 <context context-type="linenumber">61</context> 1164 <context context-type="linenumber">54</context>
1155 </context-group> 1165 </context-group>
1156 </trans-unit> 1166 </trans-unit>
1157 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1167 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1158 <source>Policy on videos containing sensitive content</source> 1168 <source>Policy on videos containing sensitive content</source>
1159 <target>Политика каÑательно видео Ñодержащих нежелательный контент</target> 1169 <target>Политика каÑательно видео Ñодержащих нежелательный контент</target>
1160 <context-group name="null"> 1170 <context-group name="null">
1161 <context context-type="linenumber">70</context> 1171 <context context-type="linenumber">61</context>
1162 </context-group> 1172 </context-group>
1163 </trans-unit> 1173 </trans-unit>
1164 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1174 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1193,21 +1203,42 @@
1193 <source>Signup enabled</source> 1203 <source>Signup enabled</source>
1194 <target>РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°</target> 1204 <target>РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°</target>
1195 <context-group name="null"> 1205 <context-group name="null">
1196 <context context-type="linenumber">92</context> 1206 <context context-type="linenumber">84</context>
1197 </context-group> 1207 </context-group>
1198 </trans-unit> 1208 </trans-unit>
1199 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1209 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1200 <source>Signup requires email verification</source> 1210 <source>Signup requires email verification</source>
1201 <target>Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации нужно подтвержение через Ñлектронную почту</target> 1211 <target>Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации нужно подтвержение через Ñлектронную почту</target>
1202 <context-group name="null"> 1212 <context-group name="null">
1203 <context context-type="linenumber">97</context> 1213 <context context-type="linenumber">91</context>
1204 </context-group> 1214 </context-group>
1205 </trans-unit> 1215 </trans-unit>
1206 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1216 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1207 <source>Signup limit</source> 1217 <source>Signup limit</source>
1208 <target>Лимит региÑтрации</target> 1218 <target>Лимит региÑтрации</target>
1209 <context-group name="null"> 1219 <context-group name="null">
1210 <context context-type="linenumber">101</context> 1220 <context context-type="linenumber">96</context>
1221 </context-group>
1222 </trans-unit>
1223 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1224 <source>Users</source>
1225 <target>Пользователи</target>
1226 <context-group name="null">
1227 <context context-type="linenumber">105</context>
1228 </context-group>
1229 </trans-unit>
1230 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1231 <source>User default video quota</source>
1232 <target>Квота видео по умолчанию на одного пользователÑ</target>
1233 <context-group name="null">
1234 <context context-type="linenumber">109</context>
1235 </context-group>
1236 </trans-unit>
1237 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1238 <source>User default daily upload limit</source>
1239 <target>Ежедневный лимит загрузок по умолчанию на одгого пользователÑ</target>
1240 <context-group name="null">
1241 <context context-type="linenumber">121</context>
1211 </context-group> 1242 </context-group>
1212 </trans-unit> 1243 </trans-unit>
1213 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1244 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1217,53 +1248,25 @@
1217 <context context-type="linenumber">42</context> 1248 <context context-type="linenumber">42</context>
1218 </context-group> 1249 </context-group>
1219 </trans-unit> 1250 </trans-unit>
1220 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce">
1221 <source>Video import with HTTP enabled</source>
1222 <target>Импорт видео Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ HTTP активирован</target>
1223 <context-group name="null">
1224 <context context-type="linenumber">115</context>
1225 </context-group>
1226 </trans-unit>
1227 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1251 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1228 <source>Video import with a torrent file or a magnet URI enabled</source> 1252 <source>Video import with a torrent file or a magnet URI enabled</source>
1229 <target>Импорт видео Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ файла торент или magnet URI активирован</target> 1253 <target>Импорт видео Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ файла торент или magnet URI активирован</target>
1230 <context-group name="null"> 1254 <context-group name="null">
1231 <context context-type="linenumber">120</context> 1255 <context context-type="linenumber">148</context>
1232 </context-group> 1256 </context-group>
1233 </trans-unit> 1257 </trans-unit>
1234 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1258 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1235 <source>Administrator</source> 1259 <source>Administrator</source>
1236 <target>ÐдминиÑтратор</target> 1260 <target>ÐдминиÑтратор</target>
1237 <context-group name="null"> 1261 <context-group name="null">
1238 <context context-type="linenumber">123</context> 1262 <context context-type="linenumber">155</context>
1239 </context-group> 1263 </context-group>
1240 </trans-unit> 1264 </trans-unit>
1241 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1265 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1242 <source>Admin email</source> 1266 <source>Admin email</source>
1243 <target>Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° админиÑтратора</target> 1267 <target>Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° админиÑтратора</target>
1244 <context-group name="null"> 1268 <context-group name="null">
1245 <context context-type="linenumber">126</context> 1269 <context context-type="linenumber">158</context>
1246 </context-group>
1247 </trans-unit>
1248 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1249 <source>Users</source>
1250 <target>Пользователи</target>
1251 <context-group name="null">
1252 <context context-type="linenumber">136</context>
1253 </context-group>
1254 </trans-unit>
1255 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1256 <source>User default video quota</source>
1257 <target>Квота видео по умолчанию на одного пользователÑ</target>
1258 <context-group name="null">
1259 <context context-type="linenumber">139</context>
1260 </context-group>
1261 </trans-unit>
1262 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1263 <source>User default daily upload limit</source>
1264 <target>Ежедневный лимит загрузок по умолчанию на одгого пользователÑ</target>
1265 <context-group name="null">
1266 <context context-type="linenumber">153</context>
1267 </context-group> 1270 </context-group>
1268 </trans-unit> 1271 </trans-unit>
1269 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1272 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1277,81 +1280,70 @@
1277 <source>Twitter</source> 1280 <source>Twitter</source>
1278 <target>Twitter</target> 1281 <target>Twitter</target>
1279 <context-group name="null"> 1282 <context-group name="null">
1280 <context context-type="linenumber">170</context> 1283 <context context-type="linenumber">178</context>
1281 </context-group> 1284 </context-group>
1282 </trans-unit> 1285 </trans-unit>
1283 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1286 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1284 <source>Your Twitter username</source> 1287 <source>Your Twitter username</source>
1285 <target>Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Twitter</target> 1288 <target>Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Twitter</target>
1286 <context-group name="null"> 1289 <context-group name="null">
1287 <context context-type="linenumber">173</context> 1290 <context context-type="linenumber">184</context>
1288 </context-group> 1291 </context-group>
1289 </trans-unit> 1292 </trans-unit>
1290 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1293 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1291 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1294 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1292 <target>Показывает учетнаю запиÑÑŒ в Twitter Ñайта или платформы Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… было опубликован контент</target> 1295 <target>Показывает учетнаю запиÑÑŒ в Twitter Ñайта или платформы Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… было опубликован контент</target>
1293 <context-group name="null"> 1296 <context-group name="null">
1294 <context context-type="linenumber">176</context> 1297 <context context-type="linenumber">187</context>
1295 </context-group> 1298 </context-group>
1296 </trans-unit> 1299 </trans-unit>
1297 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1300 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1298 <source>Instance whitelisted by Twitter</source> 1301 <source>Instance whitelisted by Twitter</source>
1299 <target>Сервер имеет аккредитацию Twitter</target> 1302 <target>Сервер имеет аккредитацию Twitter</target>
1300 <context-group name="null"> 1303 <context-group name="null">
1301 <context context-type="linenumber">189</context> 1304 <context context-type="linenumber">199</context>
1302 </context-group>
1303 </trans-unit>
1304 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1305 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1306 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1307 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1308 <target>ЕÑли Ваш Ñервер имеет аккредитацию Twitter, проигрыватель видео будет вÑтавлен в ленту Twitter во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ видео на PeerTube .&lt;br /&gt;
1309 ЕÑли Ñервер не аккредитирован, мы иÑпользуем ÑÑылку в виде картинки который Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ Ð’Ð°Ñ Ð½Ð° Ñервер PeerTube.&lt;br /&gt;&lt;br /&gt;
1310 Отметте галочкой Ñто окошко, Ñохраните конфигурацию и попробуйте Ñ URL видео на вашем Ñервере (https://example.com/videos/watch/blabla) на &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; чтоб узнать имеет ли аккредитацию Ваш Ñервер.</target>
1311 <context-group name="null">
1312 <context context-type="linenumber">190</context>
1313 </context-group> 1305 </context-group>
1314 </trans-unit> 1306 </trans-unit>
1315 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1307 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1316 <source>Services</source> 1308 <source>Services</source>
1317 <target>СервиÑ</target> 1309 <target>СервиÑ</target>
1318 <context-group name="null"> 1310 <context-group name="null">
1319 <context context-type="linenumber">168</context> 1311 <context context-type="linenumber">176</context>
1320 </context-group> 1312 </context-group>
1321 </trans-unit> 1313 </trans-unit>
1322 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1314 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1323 <source>Transcoding</source> 1315 <source>Transcoding</source>
1324 <target>ТранÑкодирование</target> 1316 <target>ТранÑкодирование</target>
1325 <context-group name="null"> 1317 <context-group name="null">
1326 <context context-type="linenumber">200</context> 1318 <context context-type="linenumber">215</context>
1327 </context-group> 1319 </context-group>
1328 </trans-unit> 1320 </trans-unit>
1329 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1321 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1330 <source>Transcoding enabled</source> 1322 <source>Transcoding enabled</source>
1331 <target>ТранÑкодирование активировано</target> 1323 <target>ТранÑкодирование активировано</target>
1332 <context-group name="null"> 1324 <context-group name="null">
1333 <context context-type="linenumber">204</context> 1325 <context context-type="linenumber">221</context>
1334 </context-group> 1326 </context-group>
1335 </trans-unit> 1327 </trans-unit>
1336 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1328 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1337 <source>If you disable transcoding, many videos from your users will not work!</source> 1329 <source>If you disable transcoding, many videos from your users will not work!</source>
1338 <target>ЕÑли вы дезактивируете транÑкодирование, многие видео пользователей переÑтанут работать</target> 1330 <target>ЕÑли вы дезактивируете транÑкодирование, многие видео пользователей переÑтанут работать</target>
1339 <context-group name="null"> 1331 <context-group name="null">
1340 <context context-type="linenumber">205</context> 1332 <context context-type="linenumber">222</context>
1341 </context-group> 1333 </context-group>
1342 </trans-unit> 1334 </trans-unit>
1343 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1335 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1344 <source>Transcoding threads</source> 1336 <source>Transcoding threads</source>
1345 <target>КоличеÑтво threads Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑкодированиÑ</target> 1337 <target>КоличеÑтво threads Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑкодированиÑ</target>
1346 <context-group name="null"> 1338 <context-group name="null">
1347 <context context-type="linenumber">211</context> 1339 <context context-type="linenumber">237</context>
1348 </context-group> 1340 </context-group>
1349 </trans-unit> 1341 </trans-unit>
1350 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1342 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1351 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1343 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1352 <target>Разрешение <x id="INTERPOLATION" equiv-text="{{resolution}}"/> активировано</target> 1344 <target>Разрешение <x id="INTERPOLATION" equiv-text="{{resolution}}"/> активировано</target>
1353 <context-group name="null"> 1345 <context-group name="null">
1354 <context context-type="linenumber">227</context> 1346 <context context-type="linenumber">252</context>
1355 </context-group> 1347 </context-group>
1356 </trans-unit> 1348 </trans-unit>
1357 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1349 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1366,105 +1358,70 @@
1366 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1358 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1367 </target> 1359 </target>
1368 <context-group name="null"> 1360 <context-group name="null">
1369 <context context-type="linenumber">233</context> 1361 <context context-type="linenumber">260</context>
1370 </context-group> 1362 </context-group>
1371 </trans-unit> 1363 </trans-unit>
1372 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1364 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1373 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1365 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1374 <target>Ðекоторые миниатюры не федератные (миниатюры, названиÑ). Они взÑÑ‚Ñ‹ непоÑредÑтвенно из их оригинального Ñервера и мы их не храним.</target> 1366 <target>Ðекоторые миниатюры не федератные (миниатюры, названиÑ). Они взÑÑ‚Ñ‹ непоÑредÑтвенно из их оригинального Ñервера и мы их не храним.</target>
1375 <context-group name="null"> 1367 <context-group name="null">
1376 <context context-type="linenumber">238</context> 1368 <context context-type="linenumber">265</context>
1377 </context-group> 1369 </context-group>
1378 </trans-unit> 1370 </trans-unit>
1379 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1371 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1380 <source>Previews cache size</source> 1372 <source>Previews cache size</source>
1381 <target>Размер кеша предпроÑмотра</target> 1373 <target>Размер кеша предпроÑмотра</target>
1382 <context-group name="null"> 1374 <context-group name="null">
1383 <context context-type="linenumber">243</context> 1375 <context context-type="linenumber">271</context>
1384 </context-group> 1376 </context-group>
1385 </trans-unit> 1377 </trans-unit>
1386 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1378 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1387 <source>Video captions cache size</source> 1379 <source>Video captions cache size</source>
1388 <target>Размер кеша предпроÑмотра надпиÑей</target> 1380 <target>Размер кеша предпроÑмотра надпиÑей</target>
1389 <context-group name="null"> 1381 <context-group name="null">
1390 <context context-type="linenumber">254</context> 1382 <context context-type="linenumber">280</context>
1391 </context-group> 1383 </context-group>
1392 </trans-unit> 1384 </trans-unit>
1393 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1385 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1394 <source>Customizations</source> 1386 <source>Customizations</source>
1395 <target>ПерÑонализациÑ</target> 1387 <target>ПерÑонализациÑ</target>
1396 <context-group name="null"> 1388 <context-group name="null">
1397 <context context-type="linenumber">264</context> 1389 <context context-type="linenumber">289</context>
1398 </context-group> 1390 </context-group>
1399 </trans-unit> 1391 </trans-unit>
1400 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1392 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1401 <source>JavaScript</source> 1393 <source>JavaScript</source>
1402 <target>Ява Скрипт</target> 1394 <target>Ява Скрипт</target>
1403 <context-group name="null"> 1395 <context-group name="null">
1404 <context context-type="linenumber">267</context> 1396 <context context-type="linenumber">294</context>
1405 </context-group> 1397 </context-group>
1406 </trans-unit> 1398 </trans-unit>
1407 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1399 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1408 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1400 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1409 <target>Ðапишите непоÑредÑтвенно код Ява Скрипта .&lt;br /&gt;Пример : &lt;pre&gt;console.log('мой Ñервер крут');&lt;/pre&gt;</target> 1401 <target>Ðапишите непоÑредÑтвенно код Ява Скрипта .&lt;br /&gt;Пример : &lt;pre&gt;console.log('мой Ñервер крут');&lt;/pre&gt;</target>
1410 <context-group name="null"> 1402 <context-group name="null">
1411 <context context-type="linenumber">270</context> 1403 <context context-type="linenumber">297</context>
1412 </context-group>
1413 </trans-unit>
1414 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1415 <source>
1416 Write directly CSS code. Example:&lt;br /&gt;
1417 &lt;pre&gt;
1418 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1419 background-color: red;
1420 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1421 &lt;/pre&gt;
1422
1423 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1424 &lt;pre&gt;
1425 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1426 color: red;
1427 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1428 &lt;/pre&gt;
1429 </source>
1430 <target>
1431 Ðапишите непоÑредÑтвенно код CSS. Пример:&lt;br /&gt;
1432 &lt;pre&gt;
1433 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1434 background-color: red;
1435 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1436 &lt;/pre&gt;
1437
1438 Ðачните Ñ &lt;em&gt;#custom-css&lt;/em&gt; чтоб получить приоритет. Пример:
1439 &lt;pre&gt;
1440 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1441 color: red;
1442 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1443 &lt;/pre&gt;
1444 </target>
1445 <context-group name="null">
1446 <context context-type="linenumber">286</context>
1447 </context-group> 1404 </context-group>
1448 </trans-unit> 1405 </trans-unit>
1449 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1406 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1450 <source>Advanced configuration</source> 1407 <source>Advanced configuration</source>
1451 <target>ÐŸÑ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ</target> 1408 <target>ÐŸÑ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ</target>
1452 <context-group name="null"> 1409 <context-group name="null">
1453 <context context-type="linenumber">197</context> 1410 <context context-type="linenumber">212</context>
1454 </context-group> 1411 </context-group>
1455 </trans-unit> 1412 </trans-unit>
1456 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1413 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1457 <source>Update configuration</source> 1414 <source>Update configuration</source>
1458 <target>Обновить конфигурацию</target> 1415 <target>Обновить конфигурацию</target>
1459 <context-group name="null"> 1416 <context-group name="null">
1460 <context context-type="linenumber">314</context> 1417 <context context-type="linenumber">340</context>
1461 </context-group> 1418 </context-group>
1462 </trans-unit> 1419 </trans-unit>
1463 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1420 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1464 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1421 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1465 <target>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ. ПожалуйÑта, найдите потенциальную ошибку в разных окнах. </target> 1422 <target>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ. ПожалуйÑта, найдите потенциальную ошибку в разных окнах. </target>
1466 <context-group name="null"> 1423 <context-group name="null">
1467 <context context-type="linenumber">315</context> 1424 <context context-type="linenumber">341</context>
1468 </context-group> 1425 </context-group>
1469 </trans-unit> 1426 </trans-unit>
1470 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1427 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1558,14 +1515,14 @@
1558 <source>Score</source> 1515 <source>Score</source>
1559 <target>Счет</target> 1516 <target>Счет</target>
1560 <context-group name="null"> 1517 <context-group name="null">
1561 <context context-type="linenumber">8</context> 1518 <context context-type="linenumber">17</context>
1562 </context-group> 1519 </context-group>
1563 </trans-unit> 1520 </trans-unit>
1564 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1521 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1565 <source>Host</source> 1522 <source>Host</source>
1566 <target>Host</target> 1523 <target>Host</target>
1567 <context-group name="null"> 1524 <context-group name="null">
1568 <context context-type="linenumber">8</context> 1525 <context context-type="linenumber">19</context>
1569 </context-group> 1526 </context-group>
1570 </trans-unit> 1527 </trans-unit>
1571 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1528 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1670,7 +1627,7 @@
1670 <source>Role</source> 1627 <source>Role</source>
1671 <target>Роль</target> 1628 <target>Роль</target>
1672 <context-group name="null"> 1629 <context-group name="null">
1673 <context context-type="linenumber">20</context> 1630 <context context-type="linenumber">43</context>
1674 </context-group> 1631 </context-group>
1675 </trans-unit> 1632 </trans-unit>
1676 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1633 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1693,38 +1650,6 @@
1693 <context context-type="linenumber">72</context> 1650 <context context-type="linenumber">72</context>
1694 </context-group> 1651 </context-group>
1695 </trans-unit> 1652 </trans-unit>
1696 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33">
1697 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source>
1698 <target>Бан <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target>
1699 <context-group name="null">
1700 <context context-type="linenumber">3</context>
1701 </context-group>
1702 </trans-unit>
1703 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1704 <source>Reason...</source>
1705 <target>Причина...</target>
1706 <context-group name="null">
1707 <context context-type="linenumber">11</context>
1708 </context-group>
1709 </trans-unit>
1710 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
1711 <source>
1712 A banned user will no longer be able to login.
1713 </source>
1714 <target>
1715 Забаненый пользователь не Ñможет больше подÑоединитьÑÑ.
1716 </target>
1717 <context-group name="null">
1718 <context context-type="linenumber">17</context>
1719 </context-group>
1720 </trans-unit>
1721 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
1722 <source>Ban this user</source>
1723 <target>Отправить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² бан</target>
1724 <context-group name="null">
1725 <context context-type="linenumber">25</context>
1726 </context-group>
1727 </trans-unit>
1728 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1653 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1729 <source>Users list</source> 1654 <source>Users list</source>
1730 <target>СпиÑок пользователей</target> 1655 <target>СпиÑок пользователей</target>
@@ -1736,21 +1661,14 @@
1736 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1661 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1737 <target>Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1662 <target>Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1738 <context-group name="null"> 1663 <context-group name="null">
1739 <context context-type="linenumber">17</context> 1664 <context context-type="linenumber">40</context>
1740 </context-group>
1741 </trans-unit>
1742 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1743 <source>Actions</source>
1744 <target>ДейÑтвиÑ</target>
1745 <context-group name="null">
1746 <context context-type="linenumber">33</context>
1747 </context-group> 1665 </context-group>
1748 </trans-unit> 1666 </trans-unit>
1749 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1667 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1750 <source>Ban reason:</source> 1668 <source>Ban reason:</source>
1751 <target>Причины бана:</target> 1669 <target>Причины бана:</target>
1752 <context-group name="null"> 1670 <context-group name="null">
1753 <context context-type="linenumber">51</context> 1671 <context context-type="linenumber">95</context>
1754 </context-group> 1672 </context-group>
1755 </trans-unit> 1673 </trans-unit>
1756 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1674 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1813,6 +1731,13 @@
1813 <context context-type="linenumber">33</context> 1731 <context context-type="linenumber">33</context>
1814 </context-group> 1732 </context-group>
1815 </trans-unit> 1733 </trans-unit>
1734 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1735 <source>Actions</source>
1736 <target>ДейÑтвиÑ</target>
1737 <context-group name="null">
1738 <context context-type="linenumber">35</context>
1739 </context-group>
1740 </trans-unit>
1816 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1741 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1817 <source>Reason:</source> 1742 <source>Reason:</source>
1818 <target>Причины:</target> 1743 <target>Причины:</target>
@@ -1845,14 +1770,14 @@
1845 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1770 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1846 <target>Дата <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1771 <target>Дата <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1847 <context-group name="null"> 1772 <context-group name="null">
1848 <context context-type="linenumber">10</context> 1773 <context context-type="linenumber">11</context>
1849 </context-group> 1774 </context-group>
1850 </trans-unit> 1775 </trans-unit>
1851 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 1776 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1852 <source>Blacklist reason:</source> 1777 <source>Blacklist reason:</source>
1853 <target>Причина блокированиÑ:</target> 1778 <target>Причина блокированиÑ:</target>
1854 <context-group name="null"> 1779 <context-group name="null">
1855 <context context-type="linenumber">41</context> 1780 <context context-type="linenumber">43</context>
1856 </context-group> 1781 </context-group>
1857 </trans-unit> 1782 </trans-unit>
1858 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1783 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1876,55 +1801,6 @@
1876 <context context-type="linenumber">7</context> 1801 <context context-type="linenumber">7</context>
1877 </context-group> 1802 </context-group>
1878 </trans-unit> 1803 </trans-unit>
1879 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1880 <source>My settings</source>
1881 <target>Мои наÑтройки</target>
1882 <context-group name="null">
1883 <context context-type="linenumber">3</context>
1884 </context-group>
1885 </trans-unit>
1886 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1887 <source>My library</source>
1888 <target>ÐœÐ¾Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°</target>
1889 <context-group name="null">
1890 <context context-type="linenumber">7</context>
1891 </context-group>
1892 </trans-unit>
1893 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1894 <source>My channels</source>
1895 <target>Мои каналы</target>
1896 <context-group name="null">
1897 <context context-type="linenumber">12</context>
1898 </context-group>
1899 </trans-unit>
1900 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1901 <source>My videos</source>
1902 <target>Мои видео</target>
1903 <context-group name="null">
1904 <context context-type="linenumber">14</context>
1905 </context-group>
1906 </trans-unit>
1907 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1908 <source>My subscriptions</source>
1909 <target>Мои подпиÑки</target>
1910 <context-group name="null">
1911 <context context-type="linenumber">16</context>
1912 </context-group>
1913 </trans-unit>
1914 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1915 <source>My imports</source>
1916 <target>Мои импортированные видео</target>
1917 <context-group name="null">
1918 <context context-type="linenumber">18</context>
1919 </context-group>
1920 </trans-unit>
1921 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1922 <source>Ownership changes</source>
1923 <target>Смена ÑобÑтвенника</target>
1924 <context-group name="null">
1925 <context context-type="linenumber">22</context>
1926 </context-group>
1927 </trans-unit>
1928 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1804 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1929 <source>Video quota:</source> 1805 <source>Video quota:</source>
1930 <target>Квота видео</target> 1806 <target>Квота видео</target>
@@ -1936,21 +1812,21 @@
1936 <source>Profile</source> 1812 <source>Profile</source>
1937 <target>Профиль</target> 1813 <target>Профиль</target>
1938 <context-group name="null"> 1814 <context-group name="null">
1939 <context context-type="linenumber">8</context> 1815 <context context-type="linenumber">7</context>
1940 </context-group> 1816 </context-group>
1941 </trans-unit> 1817 </trans-unit>
1942 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1818 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1943 <source>Video settings</source> 1819 <source>Video settings</source>
1944 <target>ÐаÑтройки видео</target> 1820 <target>ÐаÑтройки видео</target>
1945 <context-group name="null"> 1821 <context-group name="null">
1946 <context context-type="linenumber">15</context> 1822 <context context-type="linenumber">16</context>
1947 </context-group> 1823 </context-group>
1948 </trans-unit> 1824 </trans-unit>
1949 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1825 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1950 <source>Danger zone</source> 1826 <source>Danger zone</source>
1951 <target>ОраÑÐ½Ð°Ñ Ð·Ð¾Ð½Ð°</target> 1827 <target>ОраÑÐ½Ð°Ñ Ð·Ð¾Ð½Ð°</target>
1952 <context-group name="null"> 1828 <context-group name="null">
1953 <context context-type="linenumber">18</context> 1829 <context context-type="linenumber">19</context>
1954 </context-group> 1830 </context-group>
1955 </trans-unit> 1831 </trans-unit>
1956 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1832 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1978,13 +1854,6 @@
1978 <context context-type="linenumber">35</context> 1854 <context context-type="linenumber">35</context>
1979 </context-group> 1855 </context-group>
1980 </trans-unit> 1856 </trans-unit>
1981 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1982 <source>Submit</source>
1983 <target>Отправить</target>
1984 <context-group name="null">
1985 <context context-type="linenumber">24</context>
1986 </context-group>
1987 </trans-unit>
1988 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1857 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1989 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1858 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1990 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target> 1859 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target>
@@ -2169,14 +2038,14 @@ When you will upload a video in this channel, the video support field will be au
2169 <source>Automatically plays video</source> 2038 <source>Automatically plays video</source>
2170 <target>ВоÑпроизводить автоматичеÑки видео</target> 2039 <target>ВоÑпроизводить автоматичеÑки видео</target>
2171 <context-group name="null"> 2040 <context-group name="null">
2172 <context context-type="linenumber">20</context> 2041 <context context-type="linenumber">28</context>
2173 </context-group> 2042 </context-group>
2174 </trans-unit> 2043 </trans-unit>
2175 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2044 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2176 <source>Save</source> 2045 <source>Save</source>
2177 <target>Сохранить</target> 2046 <target>Сохранить</target>
2178 <context-group name="null"> 2047 <context-group name="null">
2179 <context context-type="linenumber">23</context> 2048 <context context-type="linenumber">32</context>
2180 </context-group> 2049 </context-group>
2181 </trans-unit> 2050 </trans-unit>
2182 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2051 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2282,6 +2151,153 @@ When you will upload a video in this channel, the video support field will be au
2282 <context context-type="linenumber">17</context> 2151 <context context-type="linenumber">17</context>
2283 </context-group> 2152 </context-group>
2284 </trans-unit> 2153 </trans-unit>
2154 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2155 <source>My videos</source>
2156 <target>Мои видео</target>
2157 <context-group name="null">
2158 <context context-type="linenumber">1</context>
2159 </context-group>
2160 </trans-unit>
2161 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2162 <source>My library</source>
2163 <target>ÐœÐ¾Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">1</context>
2166 </context-group>
2167 </trans-unit>
2168 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2169 <source>My channels</source>
2170 <target>Мои каналы</target>
2171 <context-group name="null">
2172 <context context-type="linenumber">1</context>
2173 </context-group>
2174 </trans-unit>
2175 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2176 <source>My subscriptions</source>
2177 <target>Мои подпиÑки</target>
2178 <context-group name="null">
2179 <context context-type="linenumber">1</context>
2180 </context-group>
2181 </trans-unit>
2182 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2183 <source>Ownership changes</source>
2184 <target>Смена ÑобÑтвенника</target>
2185 <context-group name="null">
2186 <context context-type="linenumber">1</context>
2187 </context-group>
2188 </trans-unit>
2189 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2190 <source>My settings</source>
2191 <target>Мои наÑтройки</target>
2192 <context-group name="null">
2193 <context context-type="linenumber">1</context>
2194 </context-group>
2195 </trans-unit>
2196 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
2197 <source>Transcoding threads is required.</source>
2198 <target>ТранÑкодирование потоки требуетÑÑ.</target>
2199 <context-group name="null">
2200 <context context-type="linenumber">1</context>
2201 </context-group>
2202 </trans-unit>
2203 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
2204 <source>Transcoding threads must be greater or equal to 0.</source>
2205 <target>ТранÑкодирование потоков должны быть больше или равно 0.</target>
2206 <context-group name="null">
2207 <context context-type="linenumber">1</context>
2208 </context-group>
2209 </trans-unit>
2210 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2211 <source>Username is required.</source>
2212 <target>Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ.</target>
2213 <context-group name="null">
2214 <context context-type="linenumber">1</context>
2215 </context-group>
2216 </trans-unit>
2217 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
2218 <source>Password is required.</source>
2219 <target>Пароль необходим.</target>
2220 <context-group name="null">
2221 <context context-type="linenumber">1</context>
2222 </context-group>
2223 </trans-unit>
2224 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2225 <source>Password must be at least 6 characters long.</source>
2226 <target>Пароль должен быть длиной не менее 6 Ñимволов.</target>
2227 <context-group name="null">
2228 <context context-type="linenumber">1</context>
2229 </context-group>
2230 </trans-unit>
2231 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2232 <source>Description must be at least 3 characters long.</source>
2233 <target>ОпиÑание должно быть длиной не менее 3-Ñ… Ñимволов.</target>
2234 <context-group name="null">
2235 <context context-type="linenumber">1</context>
2236 </context-group>
2237 </trans-unit>
2238 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
2239 <source>Ban reason must be at least 3 characters long.</source>
2240 <target>Запрет причина должно длитьÑÑ Ð½Ðµ менее 3 Ñимволов.</target>
2241 <context-group name="null">
2242 <context context-type="linenumber">1</context>
2243 </context-group>
2244 </trans-unit>
2245 <trans-unit id="993f9f5703d449a1d467243db75253d288a2947e">
2246 <source>Report reason must be at least 2 characters long.</source>
2247 <target>Доклад причина должно быть не менее 2 Ñимволов.</target>
2248 <context-group name="null">
2249 <context context-type="linenumber">1</context>
2250 </context-group>
2251 </trans-unit>
2252 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
2253 <source>Moderation comment must be at least 2 characters long.</source>
2254 <target>ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ð¹ должен быть длиной не менее 2 Ñимвола.</target>
2255 <context-group name="null">
2256 <context context-type="linenumber">1</context>
2257 </context-group>
2258 </trans-unit>
2259 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
2260 <source>Blacklist reason must be at least 2 characters long.</source>
2261 <target>Причина черного ÑпиÑка должна быть не менее 2 Ñимволов.</target>
2262 <context-group name="null">
2263 <context context-type="linenumber">1</context>
2264 </context-group>
2265 </trans-unit>
2266 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2267 <source>Support text must be at least 3 characters long.</source>
2268 <target>ТекÑÑ‚ поддержки должен Ñодержать не менее 3 Ñимволов.</target>
2269 <context-group name="null">
2270 <context context-type="linenumber">1</context>
2271 </context-group>
2272 </trans-unit>
2273 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
2274 <source>Comment must be at least 2 characters long.</source>
2275 <target>Комментарий должен Ñодержать не менее 2 Ñимволов.</target>
2276 <context-group name="null">
2277 <context context-type="linenumber">1</context>
2278 </context-group>
2279 </trans-unit>
2280 <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c">
2281 <source>Video name must be at least 3 characters long.</source>
2282 <target>Ðазвание видео должно быть не менее 3-Ñ… Ñимволов.</target>
2283 <context-group name="null">
2284 <context context-type="linenumber">1</context>
2285 </context-group>
2286 </trans-unit>
2287 <trans-unit id="af5e2d5f3ac817c735fb7ff9ca16322789f66fef">
2288 <source>Video description must be at least 3 characters long.</source>
2289 <target>ОпиÑание видео должно быть не менее 3-Ñ… Ñимволов.</target>
2290 <context-group name="null">
2291 <context context-type="linenumber">1</context>
2292 </context-group>
2293 </trans-unit>
2294 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
2295 <source>Video support must be at least 3 characters long.</source>
2296 <target>ОпиÑание видео должно быть не менее 3-Ñ… Ñимволов.</target>
2297 <context-group name="null">
2298 <context context-type="linenumber">1</context>
2299 </context-group>
2300 </trans-unit>
2285 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 2301 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
2286 <source>Subscribed</source> 2302 <source>Subscribed</source>
2287 <target>ПодпиÑатьÑÑ</target> 2303 <target>ПодпиÑатьÑÑ</target>
diff --git a/client/src/locale/target/angular_sv_SE.xml b/client/src/locale/target/angular_sv_SE.xml
index 7377f7c23..ffa8b19ca 100644
--- a/client/src/locale/target/angular_sv_SE.xml
+++ b/client/src/locale/target/angular_sv_SE.xml
@@ -227,11 +227,25 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Olistad</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Privat</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
230 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
231 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
232 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target>
233 <context-group name="null"> 247 <context-group name="null">
234 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
235 </context-group> 249 </context-group>
236 </trans-unit> 250 </trans-unit>
237 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -245,7 +259,7 @@
245 <source>Edit</source> 259 <source>Edit</source>
246 <target>Redigera</target> 260 <target>Redigera</target>
247 <context-group name="null"> 261 <context-group name="null">
248 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
249 </context-group> 263 </context-group>
250 </trans-unit> 264 </trans-unit>
251 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -301,6 +315,13 @@
301 <context context-type="linenumber">18</context> 315 <context context-type="linenumber">18</context>
302 </context-group> 316 </context-group>
303 </trans-unit> 317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>Med ett ActivityPub-konto</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
304 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3"> 325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
305 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source> 326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
306 <target>Prenumerera med ett konto på <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target> 327 <target>Prenumerera med ett konto på <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
@@ -315,6 +336,13 @@
315 <context context-type="linenumber">40</context> 336 <context context-type="linenumber">40</context>
316 </context-group> 337 </context-group>
317 </trans-unit> 338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>Prenumerera med ett Mastodon-konto:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
318 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1"> 346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
319 <source>Using a syndication feed</source> 347 <source>Using a syndication feed</source>
320 <target>Med ett syndikeringsflöde</target> 348 <target>Med ett syndikeringsflöde</target>
@@ -360,7 +388,7 @@
360 <source>Video quota</source> 388 <source>Video quota</source>
361 <target>Videokvot</target> 389 <target>Videokvot</target>
362 <context-group name="null"> 390 <context-group name="null">
363 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
364 </context-group> 392 </context-group>
365 </trans-unit> 393 </trans-unit>
366 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -374,6 +402,38 @@
374 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
375 </context-group> 403 </context-group>
376 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>Blockera</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>Anledning …</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424 En blockerad användare kommer inte längre kunna logga in.
425 </target>
426 <context-group name="null">
427 <context context-type="linenumber">17</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
431 <source>Ban this user</source>
432 <target>Blockera den här användaren</target>
433 <context-group name="null">
434 <context context-type="linenumber">25</context>
435 </context-group>
436 </trans-unit>
377 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
378 <source> 438 <source>
379 Login 439 Login
@@ -439,7 +499,7 @@
439 <source>Password</source> 499 <source>Password</source>
440 <target>Lösenord</target> 500 <target>Lösenord</target>
441 <context-group name="null"> 501 <context-group name="null">
442 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
443 </context-group> 503 </context-group>
444 </trans-unit> 504 </trans-unit>
445 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -453,7 +513,7 @@
453 <source>Login</source> 513 <source>Login</source>
454 <target>Logga in</target> 514 <target>Logga in</target>
455 <context-group name="null"> 515 <context-group name="null">
456 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
457 </context-group> 517 </context-group>
458 </trans-unit> 518 </trans-unit>
459 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -481,7 +541,7 @@
481 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
482 <target>Skicka ett e-postmeddelande för att återställa mitt lösenord</target> 542 <target>Skicka ett e-postmeddelande för att återställa mitt lösenord</target>
483 <context-group name="null"> 543 <context-group name="null">
484 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
485 </context-group> 545 </context-group>
486 </trans-unit> 546 </trans-unit>
487 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -538,28 +598,28 @@
538 <source>Example: jane_doe</source> 598 <source>Example: jane_doe</source>
539 <target>Exempel: anna_johansson</target> 599 <target>Exempel: anna_johansson</target>
540 <context-group name="null"> 600 <context-group name="null">
541 <context context-type="linenumber">16</context> 601 <context context-type="linenumber">17</context>
542 </context-group> 602 </context-group>
543 </trans-unit> 603 </trans-unit>
544 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 604 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
545 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 605 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
546 <target>Jag har läst och godkänner den här &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;instansens villkor&lt;/a&gt;</target> 606 <target>Jag är 16 år eller äldre och godkänner den här instansens &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;villkor&lt;/a&gt;</target>
547 <context-group name="null"> 607 <context-group name="null">
548 <context context-type="linenumber">54</context> 608 <context context-type="linenumber">55</context>
549 </context-group> 609 </context-group>
550 </trans-unit> 610 </trans-unit>
551 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 611 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
552 <source>Signup</source> 612 <source>Signup</source>
553 <target>Registrering</target> 613 <target>Registrering</target>
554 <context-group name="null"> 614 <context-group name="null">
555 <context context-type="linenumber">88</context> 615 <context context-type="linenumber">78</context>
556 </context-group> 616 </context-group>
557 </trans-unit> 617 </trans-unit>
558 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
559 <source>Features found on this instance</source> 619 <source>Features found on this instance</source>
560 <target>Funktioner på den här instansen</target> 620 <target>Funktioner på den här instansen</target>
561 <context-group name="null"> 621 <context-group name="null">
562 <context context-type="linenumber">66</context> 622 <context context-type="linenumber">67</context>
563 </context-group> 623 </context-group>
564 </trans-unit> 624 </trans-unit>
565 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 625 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -580,9 +640,15 @@
580 <context context-type="linenumber">6</context> 640 <context context-type="linenumber">6</context>
581 </context-group> 641 </context-group>
582 </trans-unit> 642 </trans-unit>
583 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 643 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
584 <source>Filters</source> 644 <source>
585 <target>Filter</target> 645 Filters
646 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
647 </source>
648 <target>
649 Filter
650 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
651 </target>
586 <context-group name="null"> 652 <context-group name="null">
587 <context context-type="linenumber">16</context> 653 <context context-type="linenumber">16</context>
588 </context-group> 654 </context-group>
@@ -595,28 +661,28 @@
595 Inga resultat hittades 661 Inga resultat hittades
596 </target> 662 </target>
597 <context-group name="null"> 663 <context-group name="null">
598 <context context-type="linenumber">25</context> 664 <context context-type="linenumber">28</context>
599 </context-group> 665 </context-group>
600 </trans-unit> 666 </trans-unit>
601 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 667 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
602 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 668 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
603 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> prenumeranter</target> 669 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> prenumeranter</target>
604 <context-group name="null"> 670 <context-group name="null">
605 <context context-type="linenumber">41</context> 671 <context context-type="linenumber">44</context>
606 </context-group> 672 </context-group>
607 </trans-unit> 673 </trans-unit>
608 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 674 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
609 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 675 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
610 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visningar</target> 676 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> visningar</target>
611 <context-group name="null"> 677 <context-group name="null">
612 <context context-type="linenumber">52</context> 678 <context context-type="linenumber">55</context>
613 </context-group> 679 </context-group>
614 </trans-unit> 680 </trans-unit>
615 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 681 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
616 <source>Change the language</source> 682 <source>Change the language</source>
617 <target>Ändra språk</target> 683 <target>Ändra språk</target>
618 <context-group name="null"> 684 <context-group name="null">
619 <context context-type="linenumber">88</context> 685 <context context-type="linenumber">86</context>
620 </context-group> 686 </context-group>
621 </trans-unit> 687 </trans-unit>
622 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -627,7 +693,7 @@
627 Min offentliga profil 693 Min offentliga profil
628 </target> 694 </target>
629 <context-group name="null"> 695 <context-group name="null">
630 <context context-type="linenumber">18</context> 696 <context context-type="linenumber">16</context>
631 </context-group> 697 </context-group>
632 </trans-unit> 698 </trans-unit>
633 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -638,7 +704,7 @@
638 Mitt konto 704 Mitt konto
639 </target> 705 </target>
640 <context-group name="null"> 706 <context-group name="null">
641 <context context-type="linenumber">22</context> 707 <context context-type="linenumber">20</context>
642 </context-group> 708 </context-group>
643 </trans-unit> 709 </trans-unit>
644 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -649,7 +715,7 @@
649 Mina videor 715 Mina videor
650 </target> 716 </target>
651 <context-group name="null"> 717 <context-group name="null">
652 <context context-type="linenumber">26</context> 718 <context context-type="linenumber">24</context>
653 </context-group> 719 </context-group>
654 </trans-unit> 720 </trans-unit>
655 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -660,14 +726,14 @@
660 Logga ut 726 Logga ut
661 </target> 727 </target>
662 <context-group name="null"> 728 <context-group name="null">
663 <context context-type="linenumber">30</context> 729 <context context-type="linenumber">28</context>
664 </context-group> 730 </context-group>
665 </trans-unit> 731 </trans-unit>
666 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
667 <source>Create an account</source> 733 <source>Create an account</source>
668 <target>Skapa ett konto</target> 734 <target>Skapa ett konto</target>
669 <context-group name="null"> 735 <context-group name="null">
670 <context context-type="linenumber">39</context> 736 <context context-type="linenumber">37</context>
671 </context-group> 737 </context-group>
672 </trans-unit> 738 </trans-unit>
673 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -681,49 +747,49 @@
681 <source>Subscriptions</source> 747 <source>Subscriptions</source>
682 <target>Prenumerationer</target> 748 <target>Prenumerationer</target>
683 <context-group name="null"> 749 <context-group name="null">
684 <context context-type="linenumber">47</context> 750 <context context-type="linenumber">45</context>
685 </context-group> 751 </context-group>
686 </trans-unit> 752 </trans-unit>
687 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
688 <source>Overview</source> 754 <source>Overview</source>
689 <target>Översikt</target> 755 <target>Översikt</target>
690 <context-group name="null"> 756 <context-group name="null">
691 <context context-type="linenumber">52</context> 757 <context context-type="linenumber">50</context>
692 </context-group> 758 </context-group>
693 </trans-unit> 759 </trans-unit>
694 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
695 <source>Trending</source> 761 <source>Trending</source>
696 <target>Populärt</target> 762 <target>Populärt</target>
697 <context-group name="null"> 763 <context-group name="null">
698 <context context-type="linenumber">57</context> 764 <context context-type="linenumber">55</context>
699 </context-group> 765 </context-group>
700 </trans-unit> 766 </trans-unit>
701 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
702 <source>Recently added</source> 768 <source>Recently added</source>
703 <target>Nyligen tillagt</target> 769 <target>Nyligen tillagt</target>
704 <context-group name="null"> 770 <context-group name="null">
705 <context context-type="linenumber">62</context> 771 <context context-type="linenumber">60</context>
706 </context-group> 772 </context-group>
707 </trans-unit> 773 </trans-unit>
708 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
709 <source>Local</source> 775 <source>Local</source>
710 <target>Lokalt</target> 776 <target>Lokalt</target>
711 <context-group name="null"> 777 <context-group name="null">
712 <context context-type="linenumber">67</context> 778 <context context-type="linenumber">65</context>
713 </context-group> 779 </context-group>
714 </trans-unit> 780 </trans-unit>
715 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
716 <source>More</source> 782 <source>More</source>
717 <target>Mer</target> 783 <target>Mer</target>
718 <context-group name="null"> 784 <context-group name="null">
719 <context context-type="linenumber">72</context> 785 <context context-type="linenumber">70</context>
720 </context-group> 786 </context-group>
721 </trans-unit> 787 </trans-unit>
722 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
723 <source>Administration</source> 789 <source>Administration</source>
724 <target>Administration</target> 790 <target>Administration</target>
725 <context-group name="null"> 791 <context-group name="null">
726 <context context-type="linenumber">76</context> 792 <context context-type="linenumber">74</context>
727 </context-group> 793 </context-group>
728 </trans-unit> 794 </trans-unit>
729 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -737,14 +803,14 @@
737 <source>Show keyboard shortcuts</source> 803 <source>Show keyboard shortcuts</source>
738 <target>Visa kortkommandon</target> 804 <target>Visa kortkommandon</target>
739 <context-group name="null"> 805 <context-group name="null">
740 <context context-type="linenumber">91</context> 806 <context context-type="linenumber">89</context>
741 </context-group> 807 </context-group>
742 </trans-unit> 808 </trans-unit>
743 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
744 <source>Toggle dark interface</source> 810 <source>Toggle dark interface</source>
745 <target>Växla mörkt gränssnitt</target> 811 <target>Växla mörkt gränssnitt</target>
746 <context-group name="null"> 812 <context-group name="null">
747 <context context-type="linenumber">94</context> 813 <context context-type="linenumber">92</context>
748 </context-group> 814 </context-group>
749 </trans-unit> 815 </trans-unit>
750 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -845,11 +911,18 @@
845 <context context-type="linenumber">94</context> 911 <context context-type="linenumber">94</context>
846 </context-group> 912 </context-group>
847 </trans-unit> 913 </trans-unit>
914 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
915 <source>Display unlisted and private videos</source>
916 <target>Visa olistade och privata videor</target>
917 <context-group name="null">
918 <context context-type="linenumber">14</context>
919 </context-group>
920 </trans-unit>
848 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
849 <source>No results.</source> 922 <source>No results.</source>
850 <target>Inga resultat.</target> 923 <target>Inga resultat.</target>
851 <context-group name="null"> 924 <context-group name="null">
852 <context context-type="linenumber">7</context> 925 <context context-type="linenumber">20</context>
853 </context-group> 926 </context-group>
854 </trans-unit> 927 </trans-unit>
855 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -863,6 +936,17 @@
863 <context context-type="linenumber">6</context> 936 <context context-type="linenumber">6</context>
864 </context-group> 937 </context-group>
865 </trans-unit> 938 </trans-unit>
939 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
940 <source>
941 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
942 </source>
943 <target>
944 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
945 </target>
946 <context-group name="null">
947 <context context-type="linenumber">14</context>
948 </context-group>
949 </trans-unit>
866 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 950 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
867 <source> 951 <source>
868 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 952 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -886,7 +970,7 @@
886 <source>Instance</source> 970 <source>Instance</source>
887 <target>Instans</target> 971 <target>Instans</target>
888 <context-group name="null"> 972 <context-group name="null">
889 <context context-type="linenumber">8</context> 973 <context context-type="linenumber">12</context>
890 </context-group> 974 </context-group>
891 </trans-unit> 975 </trans-unit>
892 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 976 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -896,15 +980,22 @@
896 <context context-type="linenumber">7</context> 980 <context context-type="linenumber">7</context>
897 </context-group> 981 </context-group>
898 </trans-unit> 982 </trans-unit>
899 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 983 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
900 <source> 984 <source>
901 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 985 Cancel
902</source> 986 </source>
903 <target> 987 <target>
904 Om instansen <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 988 Avbryt
905</target> 989 </target>
906 <context-group name="null"> 990 <context-group name="null">
907 <context context-type="linenumber">1</context> 991 <context context-type="linenumber">26</context>
992 </context-group>
993 </trans-unit>
994 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
995 <source>Submit</source>
996 <target>Skicka</target>
997 <context-group name="null">
998 <context context-type="linenumber">31</context>
908 </context-group> 999 </context-group>
909 </trans-unit> 1000 </trans-unit>
910 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1001 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -918,47 +1009,14 @@
918 <source>Terms</source> 1009 <source>Terms</source>
919 <target>Villkor</target> 1010 <target>Villkor</target>
920 <context-group name="null"> 1011 <context-group name="null">
921 <context context-type="linenumber">44</context> 1012 <context context-type="linenumber">39</context>
922 </context-group> 1013 </context-group>
923 </trans-unit> 1014 </trans-unit>
924 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1015 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
925 <source>User registration is allowed and</source> 1016 <source>User registration is allowed and</source>
926 <target>Användarregistrering är tillåten och</target> 1017 <target>Användarregistrering är tillåten och</target>
927 <context-group name="null"> 1018 <context-group name="null">
928 <context context-type="linenumber">25</context> 1019 <context context-type="linenumber">29</context>
929 </context-group>
930 </trans-unit>
931 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
932 <source>
933 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
934 </source>
935 <target>
936 den här instansen tillhandahåller en grundkvot på <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> utrymme för sina användares videor.
937 </target>
938 <context-group name="null">
939 <context context-type="linenumber">27</context>
940 </context-group>
941 </trans-unit>
942 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
943 <source>
944 this instance provides unlimited space for the videos of its users.
945 </source>
946 <target>
947 den här instansen tillhandahåller obegränsat utrymme för sina användares videor.
948 </target>
949 <context-group name="null">
950 <context context-type="linenumber">31</context>
951 </context-group>
952 </trans-unit>
953 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
954 <source>
955 User registration is currently not allowed.
956 </source>
957 <target>
958 Användarregistrering tillåts inte för tillfället.
959 </target>
960 <context-group name="null">
961 <context context-type="linenumber">36</context>
962 </context-group> 1020 </context-group>
963 </trans-unit> 1021 </trans-unit>
964 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1022 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1179,14 +1237,14 @@
1179 <context context-type="linenumber">83</context> 1237 <context context-type="linenumber">83</context>
1180 </context-group> 1238 </context-group>
1181 </trans-unit> 1239 </trans-unit>
1182 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1240 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1183 <source> 1241 <source>
1184 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1242 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1185 In the meantime, we want to test different ideas related to this issue: 1243 In the meantime, we want to test different ideas related to this issue:
1186 </source> 1244 </source>
1187 <target> 1245 <target>
1188 PeerTube är just nu bara i betaversionen och vill leverera den bästa lösningen när den stabila versionen lanseras. 1246 PeerTube står i ännu startgroparna och siktar på att kunna leverera de bästa lösningarna när den stabila versionen släpps.
1189 Tills dess vill vi testa några olika idéer i den här frågan: 1247 Under tiden vill vi testa några olika idéer som har med det här att göra:
1190 </target> 1248 </target>
1191 <context-group name="null"> 1249 <context-group name="null">
1192 <context context-type="linenumber">85</context> 1250 <context context-type="linenumber">85</context>
@@ -1227,18 +1285,53 @@
1227 <context context-type="linenumber">95</context> 1285 <context context-type="linenumber">95</context>
1228 </context-group> 1286 </context-group>
1229 </trans-unit> 1287 </trans-unit>
1288 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1289 <source>Banned</source>
1290 <target>Blockerad</target>
1291 <context-group name="null">
1292 <context context-type="linenumber">12</context>
1293 </context-group>
1294 </trans-unit>
1295 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1296 <source>Muted</source>
1297 <target>Ignorerad</target>
1298 <context-group name="null">
1299 <context context-type="linenumber">13</context>
1300 </context-group>
1301 </trans-unit>
1302 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1303 <source>Muted by your instance</source>
1304 <target>Ignorerad av din instans</target>
1305 <context-group name="null">
1306 <context context-type="linenumber">14</context>
1307 </context-group>
1308 </trans-unit>
1309 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1310 <source>Instance muted</source>
1311 <target>Instans ignorerad</target>
1312 <context-group name="null">
1313 <context context-type="linenumber">15</context>
1314 </context-group>
1315 </trans-unit>
1316 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1317 <source>Instance muted by your instance</source>
1318 <target>Instans ignorerad av din instans</target>
1319 <context-group name="null">
1320 <context context-type="linenumber">16</context>
1321 </context-group>
1322 </trans-unit>
1230 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1323 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1231 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1324 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1232 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> prenumeranter</target> 1325 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> prenumeranter</target>
1233 <context-group name="null"> 1326 <context-group name="null">
1234 <context context-type="linenumber">12</context> 1327 <context context-type="linenumber">24</context>
1235 </context-group> 1328 </context-group>
1236 </trans-unit> 1329 </trans-unit>
1237 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1330 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1238 <source>Video channels</source> 1331 <source>Video channels</source>
1239 <target>Videokanaler</target> 1332 <target>Videokanaler</target>
1240 <context-group name="null"> 1333 <context-group name="null">
1241 <context context-type="linenumber">19</context> 1334 <context context-type="linenumber">31</context>
1242 </context-group> 1335 </context-group>
1243 </trans-unit> 1336 </trans-unit>
1244 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1337 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1280,49 +1373,49 @@
1280 <source>Short description</source> 1373 <source>Short description</source>
1281 <target>Kort beskrivning</target> 1374 <target>Kort beskrivning</target>
1282 <context-group name="null"> 1375 <context-group name="null">
1283 <context context-type="linenumber">22</context> 1376 <context context-type="linenumber">21</context>
1284 </context-group> 1377 </context-group>
1285 </trans-unit> 1378 </trans-unit>
1286 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1379 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1287 <source>Default client route</source> 1380 <source>Default client route</source>
1288 <target>Klientens standardrouting</target> 1381 <target>Klientens standardrouting</target>
1289 <context-group name="null"> 1382 <context-group name="null">
1290 <context context-type="linenumber">55</context> 1383 <context context-type="linenumber">48</context>
1291 </context-group> 1384 </context-group>
1292 </trans-unit> 1385 </trans-unit>
1293 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1386 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1294 <source>Videos Overview</source> 1387 <source>Videos Overview</source>
1295 <target>Videoöversikt</target> 1388 <target>Videoöversikt</target>
1296 <context-group name="null"> 1389 <context-group name="null">
1297 <context context-type="linenumber">58</context> 1390 <context context-type="linenumber">51</context>
1298 </context-group> 1391 </context-group>
1299 </trans-unit> 1392 </trans-unit>
1300 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1393 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1301 <source>Videos Trending</source> 1394 <source>Videos Trending</source>
1302 <target>Populära videor</target> 1395 <target>Populära videor</target>
1303 <context-group name="null"> 1396 <context-group name="null">
1304 <context context-type="linenumber">59</context> 1397 <context context-type="linenumber">52</context>
1305 </context-group> 1398 </context-group>
1306 </trans-unit> 1399 </trans-unit>
1307 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1400 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1308 <source>Videos Recently Added</source> 1401 <source>Videos Recently Added</source>
1309 <target>Nyligen tillagda videor</target> 1402 <target>Nyligen tillagda videor</target>
1310 <context-group name="null"> 1403 <context-group name="null">
1311 <context context-type="linenumber">60</context> 1404 <context context-type="linenumber">53</context>
1312 </context-group> 1405 </context-group>
1313 </trans-unit> 1406 </trans-unit>
1314 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1407 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1315 <source>Local videos</source> 1408 <source>Local videos</source>
1316 <target>Lokala videor</target> 1409 <target>Lokala videor</target>
1317 <context-group name="null"> 1410 <context-group name="null">
1318 <context context-type="linenumber">61</context> 1411 <context context-type="linenumber">54</context>
1319 </context-group> 1412 </context-group>
1320 </trans-unit> 1413 </trans-unit>
1321 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1414 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1322 <source>Policy on videos containing sensitive content</source> 1415 <source>Policy on videos containing sensitive content</source>
1323 <target>Policy för videor med känsligt innehåll</target> 1416 <target>Policy för videor med känsligt innehåll</target>
1324 <context-group name="null"> 1417 <context-group name="null">
1325 <context context-type="linenumber">70</context> 1418 <context context-type="linenumber">61</context>
1326 </context-group> 1419 </context-group>
1327 </trans-unit> 1420 </trans-unit>
1328 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1421 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1357,21 +1450,42 @@
1357 <source>Signup enabled</source> 1450 <source>Signup enabled</source>
1358 <target>Registrering aktiverad</target> 1451 <target>Registrering aktiverad</target>
1359 <context-group name="null"> 1452 <context-group name="null">
1360 <context context-type="linenumber">92</context> 1453 <context context-type="linenumber">84</context>
1361 </context-group> 1454 </context-group>
1362 </trans-unit> 1455 </trans-unit>
1363 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1456 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1364 <source>Signup requires email verification</source> 1457 <source>Signup requires email verification</source>
1365 <target>Registrering kräver e-postverifikation</target> 1458 <target>Registrering kräver e-postverifikation</target>
1366 <context-group name="null"> 1459 <context-group name="null">
1367 <context context-type="linenumber">97</context> 1460 <context context-type="linenumber">91</context>
1368 </context-group> 1461 </context-group>
1369 </trans-unit> 1462 </trans-unit>
1370 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1463 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1371 <source>Signup limit</source> 1464 <source>Signup limit</source>
1372 <target>Registreringsgräns</target> 1465 <target>Registreringsgräns</target>
1373 <context-group name="null"> 1466 <context-group name="null">
1374 <context context-type="linenumber">101</context> 1467 <context context-type="linenumber">96</context>
1468 </context-group>
1469 </trans-unit>
1470 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1471 <source>Users</source>
1472 <target>Användare</target>
1473 <context-group name="null">
1474 <context context-type="linenumber">105</context>
1475 </context-group>
1476 </trans-unit>
1477 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1478 <source>User default video quota</source>
1479 <target>Standardkvot för användares videor</target>
1480 <context-group name="null">
1481 <context context-type="linenumber">109</context>
1482 </context-group>
1483 </trans-unit>
1484 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1485 <source>User default daily upload limit</source>
1486 <target>Standarduppladdningsgräns för användare</target>
1487 <context-group name="null">
1488 <context context-type="linenumber">121</context>
1375 </context-group> 1489 </context-group>
1376 </trans-unit> 1490 </trans-unit>
1377 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1491 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1381,53 +1495,32 @@
1381 <context context-type="linenumber">42</context> 1495 <context context-type="linenumber">42</context>
1382 </context-group> 1496 </context-group>
1383 </trans-unit> 1497 </trans-unit>
1384 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1498 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1385 <source>Video import with HTTP enabled</source> 1499 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1386 <target>Videoimport med HTTP aktiverad</target> 1500 <target>Videoimport med HTTP-URL tillåten (t.ex. YouTube)</target>
1387 <context-group name="null"> 1501 <context-group name="null">
1388 <context context-type="linenumber">115</context> 1502 <context context-type="linenumber">141</context>
1389 </context-group> 1503 </context-group>
1390 </trans-unit> 1504 </trans-unit>
1391 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1505 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1392 <source>Video import with a torrent file or a magnet URI enabled</source> 1506 <source>Video import with a torrent file or a magnet URI enabled</source>
1393 <target>Videoimport med torrentfil eller magnet-URI är tillåten</target> 1507 <target>Videoimport med torrentfil eller magnet-URI är tillåten</target>
1394 <context-group name="null"> 1508 <context-group name="null">
1395 <context context-type="linenumber">120</context> 1509 <context context-type="linenumber">148</context>
1396 </context-group> 1510 </context-group>
1397 </trans-unit> 1511 </trans-unit>
1398 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1512 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1399 <source>Administrator</source> 1513 <source>Administrator</source>
1400 <target>Administratör</target> 1514 <target>Administratör</target>
1401 <context-group name="null"> 1515 <context-group name="null">
1402 <context context-type="linenumber">123</context> 1516 <context context-type="linenumber">155</context>
1403 </context-group> 1517 </context-group>
1404 </trans-unit> 1518 </trans-unit>
1405 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1519 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1406 <source>Admin email</source> 1520 <source>Admin email</source>
1407 <target>Administratörens e-postadress</target> 1521 <target>Administratörens e-postadress</target>
1408 <context-group name="null"> 1522 <context-group name="null">
1409 <context context-type="linenumber">126</context> 1523 <context context-type="linenumber">158</context>
1410 </context-group>
1411 </trans-unit>
1412 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1413 <source>Users</source>
1414 <target>Användare</target>
1415 <context-group name="null">
1416 <context context-type="linenumber">136</context>
1417 </context-group>
1418 </trans-unit>
1419 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1420 <source>User default video quota</source>
1421 <target>Standardkvot för användares videor</target>
1422 <context-group name="null">
1423 <context context-type="linenumber">139</context>
1424 </context-group>
1425 </trans-unit>
1426 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1427 <source>User default daily upload limit</source>
1428 <target>Standarduppladdningsgräns för användare</target>
1429 <context-group name="null">
1430 <context context-type="linenumber">153</context>
1431 </context-group> 1524 </context-group>
1432 </trans-unit> 1525 </trans-unit>
1433 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1526 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1441,81 +1534,70 @@
1441 <source>Twitter</source> 1534 <source>Twitter</source>
1442 <target>Twitter</target> 1535 <target>Twitter</target>
1443 <context-group name="null"> 1536 <context-group name="null">
1444 <context context-type="linenumber">170</context> 1537 <context context-type="linenumber">178</context>
1445 </context-group> 1538 </context-group>
1446 </trans-unit> 1539 </trans-unit>
1447 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1540 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1448 <source>Your Twitter username</source> 1541 <source>Your Twitter username</source>
1449 <target>Ditt användarnamn på Twitter</target> 1542 <target>Ditt användarnamn på Twitter</target>
1450 <context-group name="null"> 1543 <context-group name="null">
1451 <context context-type="linenumber">173</context> 1544 <context context-type="linenumber">184</context>
1452 </context-group> 1545 </context-group>
1453 </trans-unit> 1546 </trans-unit>
1454 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1547 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1455 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1548 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1456 <target>Webbplatsens eller plattformens Twitterkonto, på vilken innehållet publicerades.</target> 1549 <target>Webbplatsens eller plattformens Twitterkonto, på vilken innehållet publicerades.</target>
1457 <context-group name="null"> 1550 <context-group name="null">
1458 <context context-type="linenumber">176</context> 1551 <context context-type="linenumber">187</context>
1459 </context-group> 1552 </context-group>
1460 </trans-unit> 1553 </trans-unit>
1461 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1554 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1462 <source>Instance whitelisted by Twitter</source> 1555 <source>Instance whitelisted by Twitter</source>
1463 <target>Instans vitlistad av Twitter</target> 1556 <target>Instans vitlistad av Twitter</target>
1464 <context-group name="null"> 1557 <context-group name="null">
1465 <context context-type="linenumber">189</context> 1558 <context context-type="linenumber">199</context>
1466 </context-group>
1467 </trans-unit>
1468 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1469 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1470 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1471 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1472 <target>Om din instans är vitlistad av Twitter kommer en videospelare bäddas in i Twitterflödet när en PeerTube-video delas.&lt;br /&gt;
1473 Om instansen inte är vitlistad använder vi en länkad bild som omdirigerar till din PeerTube-instans.&lt;br /&gt;&lt;br /&gt;
1474 Kryssa i den här rutan, spara inställningarna and testa med en videolänk från din instans (https://example.com/videos/watch/blabla) på &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; för att se om din instans är vitlistad.</target>
1475 <context-group name="null">
1476 <context context-type="linenumber">190</context>
1477 </context-group> 1559 </context-group>
1478 </trans-unit> 1560 </trans-unit>
1479 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1561 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1480 <source>Services</source> 1562 <source>Services</source>
1481 <target>Tjänster</target> 1563 <target>Tjänster</target>
1482 <context-group name="null"> 1564 <context-group name="null">
1483 <context context-type="linenumber">168</context> 1565 <context context-type="linenumber">176</context>
1484 </context-group> 1566 </context-group>
1485 </trans-unit> 1567 </trans-unit>
1486 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1568 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1487 <source>Transcoding</source> 1569 <source>Transcoding</source>
1488 <target>Omkodning</target> 1570 <target>Omkodning</target>
1489 <context-group name="null"> 1571 <context-group name="null">
1490 <context context-type="linenumber">200</context> 1572 <context context-type="linenumber">215</context>
1491 </context-group> 1573 </context-group>
1492 </trans-unit> 1574 </trans-unit>
1493 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1575 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1494 <source>Transcoding enabled</source> 1576 <source>Transcoding enabled</source>
1495 <target>Omkodning aktiverad</target> 1577 <target>Omkodning aktiverad</target>
1496 <context-group name="null"> 1578 <context-group name="null">
1497 <context context-type="linenumber">204</context> 1579 <context context-type="linenumber">221</context>
1498 </context-group> 1580 </context-group>
1499 </trans-unit> 1581 </trans-unit>
1500 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1582 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1501 <source>If you disable transcoding, many videos from your users will not work!</source> 1583 <source>If you disable transcoding, many videos from your users will not work!</source>
1502 <target>Om du avaktiverar omkodning, kommer många av dina användares videor inte fungera!</target> 1584 <target>Om du avaktiverar omkodning, kommer många av dina användares videor inte fungera!</target>
1503 <context-group name="null"> 1585 <context-group name="null">
1504 <context context-type="linenumber">205</context> 1586 <context context-type="linenumber">222</context>
1505 </context-group> 1587 </context-group>
1506 </trans-unit> 1588 </trans-unit>
1507 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1589 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1508 <source>Transcoding threads</source> 1590 <source>Transcoding threads</source>
1509 <target>Omkodningstrådar</target> 1591 <target>Omkodningstrådar</target>
1510 <context-group name="null"> 1592 <context-group name="null">
1511 <context context-type="linenumber">211</context> 1593 <context context-type="linenumber">237</context>
1512 </context-group> 1594 </context-group>
1513 </trans-unit> 1595 </trans-unit>
1514 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1596 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1515 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1597 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1516 <target>Upplösningen <x id="INTERPOLATION" equiv-text="{{resolution}}"/> tillåten</target> 1598 <target>Upplösningen <x id="INTERPOLATION" equiv-text="{{resolution}}"/> tillåten</target>
1517 <context-group name="null"> 1599 <context-group name="null">
1518 <context context-type="linenumber">227</context> 1600 <context context-type="linenumber">252</context>
1519 </context-group> 1601 </context-group>
1520 </trans-unit> 1602 </trans-unit>
1521 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1603 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1530,105 +1612,70 @@
1530 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1612 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1531 </target> 1613 </target>
1532 <context-group name="null"> 1614 <context-group name="null">
1533 <context context-type="linenumber">233</context> 1615 <context context-type="linenumber">260</context>
1534 </context-group> 1616 </context-group>
1535 </trans-unit> 1617 </trans-unit>
1536 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1618 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1537 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1619 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1538 <target>Vissa filer är inte federerade (till exempel förhandsvisningar och undertexter). Vi kan hämta dem direkt från ursprungsinstansen och cachelagra dem.</target> 1620 <target>Vissa filer är inte federerade (till exempel förhandsvisningar och undertexter). Vi kan hämta dem direkt från ursprungsinstansen och cachelagra dem.</target>
1539 <context-group name="null"> 1621 <context-group name="null">
1540 <context context-type="linenumber">238</context> 1622 <context context-type="linenumber">265</context>
1541 </context-group> 1623 </context-group>
1542 </trans-unit> 1624 </trans-unit>
1543 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1625 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1544 <source>Previews cache size</source> 1626 <source>Previews cache size</source>
1545 <target>Förhandsvisningens cachestorlek</target> 1627 <target>Förhandsvisningens cachestorlek</target>
1546 <context-group name="null"> 1628 <context-group name="null">
1547 <context context-type="linenumber">243</context> 1629 <context context-type="linenumber">271</context>
1548 </context-group> 1630 </context-group>
1549 </trans-unit> 1631 </trans-unit>
1550 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1632 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1551 <source>Video captions cache size</source> 1633 <source>Video captions cache size</source>
1552 <target>Undertexternas cachestorlek</target> 1634 <target>Undertexternas cachestorlek</target>
1553 <context-group name="null"> 1635 <context-group name="null">
1554 <context context-type="linenumber">254</context> 1636 <context context-type="linenumber">280</context>
1555 </context-group> 1637 </context-group>
1556 </trans-unit> 1638 </trans-unit>
1557 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1639 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1558 <source>Customizations</source> 1640 <source>Customizations</source>
1559 <target>Anpassningar</target> 1641 <target>Anpassningar</target>
1560 <context-group name="null"> 1642 <context-group name="null">
1561 <context context-type="linenumber">264</context> 1643 <context context-type="linenumber">289</context>
1562 </context-group> 1644 </context-group>
1563 </trans-unit> 1645 </trans-unit>
1564 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1646 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1565 <source>JavaScript</source> 1647 <source>JavaScript</source>
1566 <target>JavaScript</target> 1648 <target>JavaScript</target>
1567 <context-group name="null"> 1649 <context-group name="null">
1568 <context context-type="linenumber">267</context> 1650 <context context-type="linenumber">294</context>
1569 </context-group> 1651 </context-group>
1570 </trans-unit> 1652 </trans-unit>
1571 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1653 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1572 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1654 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1573 <target>Skriv direkt med JavaScript-kod.&lt;br /&gt;Exempel: &lt;pre&gt;console.log('min instans är fantastisk');&lt;/pre&gt;</target> 1655 <target>Skriv direkt med JavaScript-kod.&lt;br /&gt;Exempel: &lt;pre&gt;console.log('min instans är fantastisk');&lt;/pre&gt;</target>
1574 <context-group name="null"> 1656 <context-group name="null">
1575 <context context-type="linenumber">270</context> 1657 <context context-type="linenumber">297</context>
1576 </context-group>
1577 </trans-unit>
1578 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1579 <source>
1580 Write directly CSS code. Example:&lt;br /&gt;
1581 &lt;pre&gt;
1582 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1583 background-color: red;
1584 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1585 &lt;/pre&gt;
1586
1587 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1588 &lt;pre&gt;
1589 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1590 color: red;
1591 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1592 &lt;/pre&gt;
1593 </source>
1594 <target>
1595 Skriv CSS-kod direkt. Exempel:&lt;br /&gt;
1596 &lt;pre&gt;
1597 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1598 background-color: red;
1599 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1600 &lt;/pre&gt;
1601
1602 Lägg till &lt;em&gt;#custom-css&lt;/em&gt; först för att åsidosätta stilmallen. Exempel:
1603 &lt;pre&gt;
1604 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1605 color: red;
1606 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1607 &lt;/pre&gt;
1608 </target>
1609 <context-group name="null">
1610 <context context-type="linenumber">286</context>
1611 </context-group> 1658 </context-group>
1612 </trans-unit> 1659 </trans-unit>
1613 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1660 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1614 <source>Advanced configuration</source> 1661 <source>Advanced configuration</source>
1615 <target>Avancerade inställningar</target> 1662 <target>Avancerade inställningar</target>
1616 <context-group name="null"> 1663 <context-group name="null">
1617 <context context-type="linenumber">197</context> 1664 <context context-type="linenumber">212</context>
1618 </context-group> 1665 </context-group>
1619 </trans-unit> 1666 </trans-unit>
1620 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1667 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1621 <source>Update configuration</source> 1668 <source>Update configuration</source>
1622 <target>Uppdatera inställningar</target> 1669 <target>Uppdatera inställningar</target>
1623 <context-group name="null"> 1670 <context-group name="null">
1624 <context context-type="linenumber">314</context> 1671 <context context-type="linenumber">340</context>
1625 </context-group> 1672 </context-group>
1626 </trans-unit> 1673 </trans-unit>
1627 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1674 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1628 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1675 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1629 <target>Det verkar som att konfigurationen inte stämmer. Sök efter eventuella fel i de olika flikarna.</target> 1676 <target>Det verkar som att konfigurationen inte stämmer. Sök efter eventuella fel i de olika flikarna.</target>
1630 <context-group name="null"> 1677 <context-group name="null">
1631 <context context-type="linenumber">315</context> 1678 <context context-type="linenumber">341</context>
1632 </context-group> 1679 </context-group>
1633 </trans-unit> 1680 </trans-unit>
1634 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1681 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1706,6 +1753,13 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1706 <context context-type="linenumber">21</context> 1753 <context context-type="linenumber">21</context>
1707 </context-group> 1754 </context-group>
1708 </trans-unit> 1755 </trans-unit>
1756 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1757 <source>Filter...</source>
1758 <target>Filtrera …</target>
1759 <context-group name="null">
1760 <context context-type="linenumber">27</context>
1761 </context-group>
1762 </trans-unit>
1709 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1763 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1710 <source>ID</source> 1764 <source>ID</source>
1711 <target>ID</target> 1765 <target>ID</target>
@@ -1717,14 +1771,14 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1717 <source>Score</source> 1771 <source>Score</source>
1718 <target>Poäng</target> 1772 <target>Poäng</target>
1719 <context-group name="null"> 1773 <context-group name="null">
1720 <context context-type="linenumber">8</context> 1774 <context context-type="linenumber">17</context>
1721 </context-group> 1775 </context-group>
1722 </trans-unit> 1776 </trans-unit>
1723 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1777 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1724 <source>Host</source> 1778 <source>Host</source>
1725 <target>Värd</target> 1779 <target>Värd</target>
1726 <context-group name="null"> 1780 <context-group name="null">
1727 <context context-type="linenumber">8</context> 1781 <context context-type="linenumber">19</context>
1728 </context-group> 1782 </context-group>
1729 </trans-unit> 1783 </trans-unit>
1730 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1784 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1745,21 +1799,21 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1745 <source>Accepted</source> 1799 <source>Accepted</source>
1746 <target>Accepterad</target> 1800 <target>Accepterad</target>
1747 <context-group name="null"> 1801 <context-group name="null">
1748 <context context-type="linenumber">21</context> 1802 <context context-type="linenumber">32</context>
1749 </context-group> 1803 </context-group>
1750 </trans-unit> 1804 </trans-unit>
1751 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506"> 1805 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1752 <source>Pending</source> 1806 <source>Pending</source>
1753 <target>Väntar</target> 1807 <target>Väntar</target>
1754 <context-group name="null"> 1808 <context-group name="null">
1755 <context context-type="linenumber">22</context> 1809 <context context-type="linenumber">33</context>
1756 </context-group> 1810 </context-group>
1757 </trans-unit> 1811 </trans-unit>
1758 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8"> 1812 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1759 <source>Redundancy allowed</source> 1813 <source>Redundancy allowed</source>
1760 <target>Redundans tillåten</target> 1814 <target>Redundans tillåten</target>
1761 <context-group name="null"> 1815 <context-group name="null">
1762 <context context-type="linenumber">11</context> 1816 <context context-type="linenumber">22</context>
1763 </context-group> 1817 </context-group>
1764 </trans-unit> 1818 </trans-unit>
1765 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1819 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
@@ -1850,7 +1904,7 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1850 <source>Role</source> 1904 <source>Role</source>
1851 <target>Roll</target> 1905 <target>Roll</target>
1852 <context-group name="null"> 1906 <context-group name="null">
1853 <context context-type="linenumber">20</context> 1907 <context context-type="linenumber">43</context>
1854 </context-group> 1908 </context-group>
1855 </trans-unit> 1909 </trans-unit>
1856 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1910 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1873,64 +1927,60 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1873 <context context-type="linenumber">72</context> 1927 <context context-type="linenumber">72</context>
1874 </context-group> 1928 </context-group>
1875 </trans-unit> 1929 </trans-unit>
1876 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 1930 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1877 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 1931 <source>Users list</source>
1878 <target>Blockera <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target> 1932 <target>Användarlista</target>
1879 <context-group name="null"> 1933 <context-group name="null">
1880 <context context-type="linenumber">3</context> 1934 <context context-type="linenumber">2</context>
1881 </context-group> 1935 </context-group>
1882 </trans-unit> 1936 </trans-unit>
1883 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125"> 1937 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1884 <source>Reason...</source> 1938 <source>Batch actions</source>
1885 <target>Anledning …</target> 1939 <target>Massåtgärder</target>
1886 <context-group name="null"> 1940 <context-group name="null">
1887 <context context-type="linenumber">11</context> 1941 <context context-type="linenumber">19</context>
1888 </context-group> 1942 </context-group>
1889 </trans-unit> 1943 </trans-unit>
1890 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251"> 1944 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1891 <source> 1945 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1892 A banned user will no longer be able to login. 1946 <target>Användarnamn <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1893 </source>
1894 <target>
1895 En blockerad användare kommer inte längre kunna logga in.
1896 </target>
1897 <context-group name="null"> 1947 <context-group name="null">
1898 <context context-type="linenumber">17</context> 1948 <context context-type="linenumber">40</context>
1899 </context-group> 1949 </context-group>
1900 </trans-unit> 1950 </trans-unit>
1901 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 1951 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1902 <source>Ban this user</source> 1952 <source>(banned)</source>
1903 <target>Blockera den här användaren</target> 1953 <target>(blockerad)</target>
1904 <context-group name="null"> 1954 <context-group name="null">
1905 <context context-type="linenumber">25</context> 1955 <context context-type="linenumber">65</context>
1906 </context-group> 1956 </context-group>
1907 </trans-unit> 1957 </trans-unit>
1908 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1958 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1909 <source>Users list</source> 1959 <source>Go to the account page</source>
1910 <target>Användarlista</target> 1960 <target>Gå till kontots sida</target>
1911 <context-group name="null"> 1961 <context-group name="null">
1912 <context context-type="linenumber">2</context> 1962 <context context-type="linenumber">133</context>
1913 </context-group> 1963 </context-group>
1914 </trans-unit> 1964 </trans-unit>
1915 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1965 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1916 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1966 <source>User's email must be verified to login</source>
1917 <target>Användarnamn <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1967 <target>Användarens e-post måste verifieras innan inloggning</target>
1918 <context-group name="null"> 1968 <context-group name="null">
1919 <context context-type="linenumber">17</context> 1969 <context context-type="linenumber">72</context>
1920 </context-group> 1970 </context-group>
1921 </trans-unit> 1971 </trans-unit>
1922 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1972 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1923 <source>Actions</source> 1973 <source>User's email is verified / User can login without email verification</source>
1924 <target>Ãtgärder</target> 1974 <target>Användarens e-post har verifierats / Användaren behöver inte verifiera sin e-post för att logga in</target>
1925 <context-group name="null"> 1975 <context-group name="null">
1926 <context context-type="linenumber">33</context> 1976 <context context-type="linenumber">76</context>
1927 </context-group> 1977 </context-group>
1928 </trans-unit> 1978 </trans-unit>
1929 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1979 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1930 <source>Ban reason:</source> 1980 <source>Ban reason:</source>
1931 <target>Blockeringsanledning:</target> 1981 <target>Blockeringsanledning:</target>
1932 <context-group name="null"> 1982 <context-group name="null">
1933 <context context-type="linenumber">51</context> 1983 <context context-type="linenumber">95</context>
1934 </context-group> 1984 </context-group>
1935 </trans-unit> 1985 </trans-unit>
1936 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1986 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1974,7 +2024,7 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1974 </trans-unit> 2024 </trans-unit>
1975 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9"> 2025 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
1976 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2026 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1977 <target>Tillstånd <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2027 <target>Status <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1978 <context-group name="null"> 2028 <context-group name="null">
1979 <context context-type="linenumber">11</context> 2029 <context context-type="linenumber">11</context>
1980 </context-group> 2030 </context-group>
@@ -1993,6 +2043,13 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
1993 <context context-type="linenumber">33</context> 2043 <context context-type="linenumber">33</context>
1994 </context-group> 2044 </context-group>
1995 </trans-unit> 2045 </trans-unit>
2046 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2047 <source>Actions</source>
2048 <target>Åtgärder</target>
2049 <context-group name="null">
2050 <context context-type="linenumber">35</context>
2051 </context-group>
2052 </trans-unit>
1996 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2053 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1997 <source>Reason:</source> 2054 <source>Reason:</source>
1998 <target>Anledning:</target> 2055 <target>Anledning:</target>
@@ -2025,14 +2082,14 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2025 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2082 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2026 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2083 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2027 <context-group name="null"> 2084 <context-group name="null">
2028 <context context-type="linenumber">10</context> 2085 <context context-type="linenumber">11</context>
2029 </context-group> 2086 </context-group>
2030 </trans-unit> 2087 </trans-unit>
2031 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2088 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2032 <source>Blacklist reason:</source> 2089 <source>Blacklist reason:</source>
2033 <target>Anledning för svartlistning:</target> 2090 <target>Anledning för svartlistning:</target>
2034 <context-group name="null"> 2091 <context-group name="null">
2035 <context context-type="linenumber">41</context> 2092 <context context-type="linenumber">43</context>
2036 </context-group> 2093 </context-group>
2037 </trans-unit> 2094 </trans-unit>
2038 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2095 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2056,53 +2113,39 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2056 <context context-type="linenumber">7</context> 2113 <context context-type="linenumber">7</context>
2057 </context-group> 2114 </context-group>
2058 </trans-unit> 2115 </trans-unit>
2059 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2116 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
2060 <source>My settings</source> 2117 <source>Muted accounts</source>
2061 <target>Mina inställningar</target> 2118 <target>Ignorerade konton</target>
2062 <context-group name="null"> 2119 <context-group name="null">
2063 <context context-type="linenumber">3</context> 2120 <context context-type="linenumber">2</context>
2064 </context-group> 2121 </context-group>
2065 </trans-unit> 2122 </trans-unit>
2066 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2123 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
2067 <source>My library</source> 2124 <source>Muted servers</source>
2068 <target>Mitt bibliotek</target> 2125 <target>Ignorerade servrar</target>
2069 <context-group name="null"> 2126 <context-group name="null">
2070 <context context-type="linenumber">7</context> 2127 <context context-type="linenumber">11</context>
2071 </context-group> 2128 </context-group>
2072 </trans-unit> 2129 </trans-unit>
2073 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2130 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2074 <source>My channels</source> 2131 <source>Account</source>
2075 <target>Mina kanaler</target> 2132 <target>Konto</target>
2076 <context-group name="null"> 2133 <context-group name="null">
2077 <context context-type="linenumber">12</context> 2134 <context context-type="linenumber">12</context>
2078 </context-group> 2135 </context-group>
2079 </trans-unit> 2136 </trans-unit>
2080 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2137 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2081 <source>My videos</source> 2138 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2082 <target>Mina videor</target> 2139 <target>Ignorerad på <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2083 <context-group name="null"> 2140 <context-group name="null">
2084 <context context-type="linenumber">14</context> 2141 <context context-type="linenumber">13</context>
2085 </context-group>
2086 </trans-unit>
2087 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2088 <source>My subscriptions</source>
2089 <target>Mina prenumerationer</target>
2090 <context-group name="null">
2091 <context context-type="linenumber">16</context>
2092 </context-group>
2093 </trans-unit>
2094 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2095 <source>My imports</source>
2096 <target>Mina importeringar</target>
2097 <context-group name="null">
2098 <context context-type="linenumber">18</context>
2099 </context-group> 2142 </context-group>
2100 </trans-unit> 2143 </trans-unit>
2101 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7"> 2144 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2102 <source>Ownership changes</source> 2145 <source>Unmute</source>
2103 <target>Ändringar av ägarskap</target> 2146 <target>Sluta ignorera</target>
2104 <context-group name="null"> 2147 <context-group name="null">
2105 <context context-type="linenumber">22</context> 2148 <context context-type="linenumber">23</context>
2106 </context-group> 2149 </context-group>
2107 </trans-unit> 2150 </trans-unit>
2108 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2151 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2116,21 +2159,21 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2116 <source>Profile</source> 2159 <source>Profile</source>
2117 <target>Profil</target> 2160 <target>Profil</target>
2118 <context-group name="null"> 2161 <context-group name="null">
2119 <context context-type="linenumber">8</context> 2162 <context context-type="linenumber">7</context>
2120 </context-group> 2163 </context-group>
2121 </trans-unit> 2164 </trans-unit>
2122 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2165 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2123 <source>Video settings</source> 2166 <source>Video settings</source>
2124 <target>Videoinställningar</target> 2167 <target>Videoinställningar</target>
2125 <context-group name="null"> 2168 <context-group name="null">
2126 <context context-type="linenumber">15</context> 2169 <context context-type="linenumber">16</context>
2127 </context-group> 2170 </context-group>
2128 </trans-unit> 2171 </trans-unit>
2129 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2172 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2130 <source>Danger zone</source> 2173 <source>Danger zone</source>
2131 <target>Riskzon</target> 2174 <target>Riskzon</target>
2132 <context-group name="null"> 2175 <context-group name="null">
2133 <context context-type="linenumber">18</context> 2176 <context context-type="linenumber">19</context>
2134 </context-group> 2177 </context-group>
2135 </trans-unit> 2178 </trans-unit>
2136 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2179 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2158,13 +2201,6 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2158 <context context-type="linenumber">35</context> 2201 <context context-type="linenumber">35</context>
2159 </context-group> 2202 </context-group>
2160 </trans-unit> 2203 </trans-unit>
2161 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2162 <source>Submit</source>
2163 <target>Skicka</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">24</context>
2166 </context-group>
2167 </trans-unit>
2168 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2204 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2169 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2205 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2170 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target> 2206 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target>
@@ -2324,6 +2360,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2324 <context context-type="linenumber">47</context> 2360 <context context-type="linenumber">47</context>
2325 </context-group> 2361 </context-group>
2326 </trans-unit> 2362 </trans-unit>
2363 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2364 <source>Muted instances</source>
2365 <target>Ignorerade instanser</target>
2366 <context-group name="null">
2367 <context context-type="linenumber">2</context>
2368 </context-group>
2369 </trans-unit>
2327 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2370 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2328 <source>Change password</source> 2371 <source>Change password</source>
2329 <target>Ändra lösenord</target> 2372 <target>Ändra lösenord</target>
@@ -2331,6 +2374,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2331 <context context-type="linenumber">30</context> 2374 <context context-type="linenumber">30</context>
2332 </context-group> 2375 </context-group>
2333 </trans-unit> 2376 </trans-unit>
2377 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2378 <source>Current password</source>
2379 <target>Nuvarande lösenord</target>
2380 <context-group name="null">
2381 <context context-type="linenumber">7</context>
2382 </context-group>
2383 </trans-unit>
2334 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2384 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2335 <source>New password</source> 2385 <source>New password</source>
2336 <target>Nytt lösenord</target> 2386 <target>Nytt lösenord</target>
@@ -2352,18 +2402,25 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2352 <context context-type="linenumber">3</context> 2402 <context context-type="linenumber">3</context>
2353 </context-group> 2403 </context-group>
2354 </trans-unit> 2404 </trans-unit>
2405 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2406 <source>Use WebTorrent to exchange parts of the video with others</source>
2407 <target>Använd WebTorrent för att utbyta delar av videon med andra</target>
2408 <context-group name="null">
2409 <context context-type="linenumber">21</context>
2410 </context-group>
2411 </trans-unit>
2355 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2412 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2356 <source>Automatically plays video</source> 2413 <source>Automatically plays video</source>
2357 <target>Spela videor automatiskt</target> 2414 <target>Spela videor automatiskt</target>
2358 <context-group name="null"> 2415 <context-group name="null">
2359 <context context-type="linenumber">20</context> 2416 <context context-type="linenumber">28</context>
2360 </context-group> 2417 </context-group>
2361 </trans-unit> 2418 </trans-unit>
2362 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2419 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2363 <source>Save</source> 2420 <source>Save</source>
2364 <target>Spara</target> 2421 <target>Spara</target>
2365 <context-group name="null"> 2422 <context-group name="null">
2366 <context context-type="linenumber">23</context> 2423 <context context-type="linenumber">32</context>
2367 </context-group> 2424 </context-group>
2368 </trans-unit> 2425 </trans-unit>
2369 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2426 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2394,6 +2451,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2394 <context context-type="linenumber">18</context> 2451 <context context-type="linenumber">18</context>
2395 </context-group> 2452 </context-group>
2396 </trans-unit> 2453 </trans-unit>
2454 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2455 <source>Once you delete your account, there is no going back. Please be certain.</source>
2456 <target>När du har raderat ditt konto går det inte att ångra. Är du säker på att du vill fortsätta?</target>
2457 <context-group name="null">
2458 <context context-type="linenumber">2</context>
2459 </context-group>
2460 </trans-unit>
2397 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2461 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2398 <source>Delete your account</source> 2462 <source>Delete your account</source>
2399 <target>Radera ditt konto</target> 2463 <target>Radera ditt konto</target>
@@ -2508,6 +2572,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2508 <context context-type="linenumber">159</context> 2572 <context context-type="linenumber">159</context>
2509 </context-group> 2573 </context-group>
2510 </trans-unit> 2574 </trans-unit>
2575 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2576 <source>Sorry, but something went wrong</source>
2577 <target>Någonting har tyvärr gått fel</target>
2578 <context-group name="null">
2579 <context context-type="linenumber">49</context>
2580 </context-group>
2581 </trans-unit>
2511 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2582 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2512 <source> 2583 <source>
2513 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2584 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2516,7 +2587,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2516 Grattis, video bakom <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> kommer importeras! Du kan redan nu lägga till information om videon. 2587 Grattis, video bakom <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> kommer importeras! Du kan redan nu lägga till information om videon.
2517</target> 2588</target>
2518 <context-group name="null"> 2589 <context-group name="null">
2519 <context context-type="linenumber">40</context> 2590 <context context-type="linenumber">46</context>
2520 </context-group> 2591 </context-group>
2521 </trans-unit> 2592 </trans-unit>
2522 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2593 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2544,14 +2615,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2544 <source>Publish will be available when upload is finished</source> 2615 <source>Publish will be available when upload is finished</source>
2545 <target>Du kan publicera när uppladdningen är klar</target> 2616 <target>Du kan publicera när uppladdningen är klar</target>
2546 <context-group name="null"> 2617 <context-group name="null">
2547 <context context-type="linenumber">48</context> 2618 <context context-type="linenumber">58</context>
2548 </context-group> 2619 </context-group>
2549 </trans-unit> 2620 </trans-unit>
2550 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2621 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2551 <source>Publish</source> 2622 <source>Publish</source>
2552 <target>Publisera</target> 2623 <target>Publisera</target>
2553 <context-group name="null"> 2624 <context-group name="null">
2554 <context context-type="linenumber">55</context> 2625 <context context-type="linenumber">65</context>
2555 </context-group> 2626 </context-group>
2556 </trans-unit> 2627 </trans-unit>
2557 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2628 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2561,6 +2632,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2561 <context context-type="linenumber">6</context> 2632 <context context-type="linenumber">6</context>
2562 </context-group> 2633 </context-group>
2563 </trans-unit> 2634 </trans-unit>
2635 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2636 <source>Or</source>
2637 <target>Eller</target>
2638 <context-group name="null">
2639 <context context-type="linenumber">11</context>
2640 </context-group>
2641 </trans-unit>
2564 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2642 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2565 <source>Paste magnet URI</source> 2643 <source>Paste magnet URI</source>
2566 <target>Klistra in magnet-URI</target> 2644 <target>Klistra in magnet-URI</target>
@@ -2583,7 +2661,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2583 Grattis, videon kommer importeras med BitTorrent! Du kan redan nu lägga till information om videon. 2661 Grattis, videon kommer importeras med BitTorrent! Du kan redan nu lägga till information om videon.
2584</target> 2662</target>
2585 <context-group name="null"> 2663 <context-group name="null">
2586 <context context-type="linenumber">48</context> 2664 <context context-type="linenumber">53</context>
2587 </context-group> 2665 </context-group>
2588 </trans-unit> 2666 </trans-unit>
2589 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2667 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2674,6 +2752,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2674 <context context-type="linenumber">18</context> 2752 <context context-type="linenumber">18</context>
2675 </context-group> 2753 </context-group>
2676 </trans-unit> 2754 </trans-unit>
2755 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2756 <source>+ Tag</source>
2757 <target>+ Tagg</target>
2758 <context-group name="null">
2759 <context context-type="linenumber">21</context>
2760 </context-group>
2761 </trans-unit>
2762 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2763 <source>Enter a new tag</source>
2764 <target>Lägg till en ny tagg</target>
2765 <context-group name="null">
2766 <context context-type="linenumber">21</context>
2767 </context-group>
2768 </trans-unit>
2677 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2769 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2678 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2770 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2679 <target>Videobeskrivningar kortas ner som standard och manuell åtgärd krävs för att visa hela.</target> 2771 <target>Videobeskrivningar kortas ner som standard och manuell åtgärd krävs för att visa hela.</target>
@@ -2713,14 +2805,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2713 <source>Wait transcoding before publishing the video</source> 2805 <source>Wait transcoding before publishing the video</source>
2714 <target>Publicera video när omkodningen är avklarad</target> 2806 <target>Publicera video när omkodningen är avklarad</target>
2715 <context-group name="null"> 2807 <context-group name="null">
2716 <context context-type="linenumber">130</context> 2808 <context context-type="linenumber">131</context>
2717 </context-group> 2809 </context-group>
2718 </trans-unit> 2810 </trans-unit>
2719 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2811 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2720 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2812 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2721 <target>Om du väljer att inte vänta på omkodningen innan publicering, kommer videon inte gå att spela förrän omkodningen är färdig.</target> 2813 <target>Om du väljer att inte vänta på omkodningen innan publicering, kommer videon inte gå att spela förrän omkodningen är färdig.</target>
2722 <context-group name="null"> 2814 <context-group name="null">
2723 <context context-type="linenumber">131</context> 2815 <context context-type="linenumber">132</context>
2724 </context-group> 2816 </context-group>
2725 </trans-unit> 2817 </trans-unit>
2726 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2818 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2734,49 +2826,49 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2734 <source>Add another caption</source> 2826 <source>Add another caption</source>
2735 <target>Lägg till ännu en text</target> 2827 <target>Lägg till ännu en text</target>
2736 <context-group name="null"> 2828 <context-group name="null">
2737 <context context-type="linenumber">146</context> 2829 <context context-type="linenumber">147</context>
2738 </context-group> 2830 </context-group>
2739 </trans-unit> 2831 </trans-unit>
2740 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2832 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2741 <source>See the subtitle file</source> 2833 <source>See the subtitle file</source>
2742 <target>Se undertextfilen</target> 2834 <target>Se undertextfilen</target>
2743 <context-group name="null"> 2835 <context-group name="null">
2744 <context context-type="linenumber">155</context> 2836 <context context-type="linenumber">156</context>
2745 </context-group> 2837 </context-group>
2746 </trans-unit> 2838 </trans-unit>
2747 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2839 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2748 <source>Already uploaded ✔</source> 2840 <source>Already uploaded ✔</source>
2749 <target>Redan uppladdad ✔</target> 2841 <target>Redan uppladdad ✔</target>
2750 <context-group name="null"> 2842 <context-group name="null">
2751 <context context-type="linenumber">159</context> 2843 <context context-type="linenumber">160</context>
2752 </context-group> 2844 </context-group>
2753 </trans-unit> 2845 </trans-unit>
2754 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2846 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2755 <source>Will be created on update</source> 2847 <source>Will be created on update</source>
2756 <target>Kommer skapas vid uppdatering</target> 2848 <target>Kommer skapas vid uppdatering</target>
2757 <context-group name="null"> 2849 <context-group name="null">
2758 <context context-type="linenumber">167</context> 2850 <context context-type="linenumber">168</context>
2759 </context-group> 2851 </context-group>
2760 </trans-unit> 2852 </trans-unit>
2761 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2853 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2762 <source>Cancel create</source> 2854 <source>Cancel create</source>
2763 <target>Avbryt skapande</target> 2855 <target>Avbryt skapande</target>
2764 <context-group name="null"> 2856 <context-group name="null">
2765 <context context-type="linenumber">169</context> 2857 <context context-type="linenumber">170</context>
2766 </context-group> 2858 </context-group>
2767 </trans-unit> 2859 </trans-unit>
2768 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2860 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2769 <source>Will be deleted on update</source> 2861 <source>Will be deleted on update</source>
2770 <target>Kommer raderas vid uppdatering</target> 2862 <target>Kommer raderas vid uppdatering</target>
2771 <context-group name="null"> 2863 <context-group name="null">
2772 <context context-type="linenumber">175</context> 2864 <context context-type="linenumber">176</context>
2773 </context-group> 2865 </context-group>
2774 </trans-unit> 2866 </trans-unit>
2775 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2867 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2776 <source>Cancel deletion</source> 2868 <source>Cancel deletion</source>
2777 <target>Avbryt radering</target> 2869 <target>Avbryt radering</target>
2778 <context-group name="null"> 2870 <context-group name="null">
2779 <context context-type="linenumber">177</context> 2871 <context context-type="linenumber">178</context>
2780 </context-group> 2872 </context-group>
2781 </trans-unit> 2873 </trans-unit>
2782 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2874 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2787,28 +2879,28 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2787 Inga undertexter för tillfället. 2879 Inga undertexter för tillfället.
2788 </target> 2880 </target>
2789 <context-group name="null"> 2881 <context-group name="null">
2790 <context context-type="linenumber">182</context> 2882 <context context-type="linenumber">183</context>
2791 </context-group> 2883 </context-group>
2792 </trans-unit> 2884 </trans-unit>
2793 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2885 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2794 <source>Captions</source> 2886 <source>Captions</source>
2795 <target>Texter</target> 2887 <target>Texter</target>
2796 <context-group name="null"> 2888 <context-group name="null">
2797 <context context-type="linenumber">139</context> 2889 <context context-type="linenumber">140</context>
2798 </context-group> 2890 </context-group>
2799 </trans-unit> 2891 </trans-unit>
2800 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2892 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2801 <source>Upload thumbnail</source> 2893 <source>Upload thumbnail</source>
2802 <target>Ladda upp miniatyrbild</target> 2894 <target>Ladda upp miniatyrbild</target>
2803 <context-group name="null"> 2895 <context-group name="null">
2804 <context context-type="linenumber">195</context> 2896 <context context-type="linenumber">196</context>
2805 </context-group> 2897 </context-group>
2806 </trans-unit> 2898 </trans-unit>
2807 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2899 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2808 <source>Upload preview</source> 2900 <source>Upload preview</source>
2809 <target>Ladda upp förhandsvisning</target> 2901 <target>Ladda upp förhandsvisning</target>
2810 <context-group name="null"> 2902 <context-group name="null">
2811 <context context-type="linenumber">202</context> 2903 <context context-type="linenumber">203</context>
2812 </context-group> 2904 </context-group>
2813 </trans-unit> 2905 </trans-unit>
2814 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2906 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2822,14 +2914,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2822 <source>Short text to tell people how they can support you (membership platform...).</source> 2914 <source>Short text to tell people how they can support you (membership platform...).</source>
2823 <target>Kort text för att berätta hur andra kan stödja dig (medlemsplattform …).</target> 2915 <target>Kort text för att berätta hur andra kan stödja dig (medlemsplattform …).</target>
2824 <context-group name="null"> 2916 <context-group name="null">
2825 <context context-type="linenumber">209</context> 2917 <context context-type="linenumber">210</context>
2826 </context-group> 2918 </context-group>
2827 </trans-unit> 2919 </trans-unit>
2828 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2920 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2829 <source>Advanced settings</source> 2921 <source>Advanced settings</source>
2830 <target>Avancerade inställningar</target> 2922 <target>Avancerade inställningar</target>
2831 <context-group name="null"> 2923 <context-group name="null">
2832 <context context-type="linenumber">190</context> 2924 <context context-type="linenumber">191</context>
2833 </context-group> 2925 </context-group>
2834 </trans-unit> 2926 </trans-unit>
2835 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2927 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2896,17 +2988,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2896 <context context-type="linenumber">3</context> 2988 <context context-type="linenumber">3</context>
2897 </context-group> 2989 </context-group>
2898 </trans-unit> 2990 </trans-unit>
2899 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2900 <source>
2901 Cancel
2902 </source>
2903 <target>
2904 Avbryt
2905 </target>
2906 <context-group name="null">
2907 <context context-type="linenumber">19</context>
2908 </context-group>
2909 </trans-unit>
2910 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2991 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2911 <source>Share</source> 2992 <source>Share</source>
2912 <target>Dela</target> 2993 <target>Dela</target>
@@ -3106,13 +3187,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3106 <context context-type="linenumber">134</context> 3187 <context context-type="linenumber">134</context>
3107 </context-group> 3188 </context-group>
3108 </trans-unit> 3189 </trans-unit>
3109 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
3110 <source>Go to the account page</source>
3111 <target>GÃ¥ till kontots sida</target>
3112 <context-group name="null">
3113 <context context-type="linenumber">133</context>
3114 </context-group>
3115 </trans-unit>
3116 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3190 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3117 <source>Show more</source> 3191 <source>Show more</source>
3118 <target>Visa mer</target> 3192 <target>Visa mer</target>
@@ -3139,7 +3213,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3139 the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers. 3213 the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
3140 </source> 3214 </source>
3141 <target> 3215 <target>
3142 den här videons delningssystem medför att en del teknisk information om ditt system (såsom publik IP-adress) kan skickas till andra serventer. 3216 den här videons delningssystem gör att en del teknisk information om ditt system (som publik IP-adress) kan skickas till andra serventer.
3143 </target> 3217 </target>
3144 <context-group name="null"> 3218 <context-group name="null">
3145 <context context-type="linenumber">209</context> 3219 <context context-type="linenumber">209</context>
@@ -3192,25 +3266,18 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3192 <context context-type="linenumber">3</context> 3266 <context context-type="linenumber">3</context>
3193 </context-group> 3267 </context-group>
3194 </trans-unit> 3268 </trans-unit>
3195 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3196 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3197 <target>Du kan kommentera med ditt PeerTube-konto på din instans sida dit videon är federerad eller via valfri fediverse-instans med stöd för ActivityPub. Med till exempel Mastodon eller Pleroma kan du skriva &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; i sökrutan för att hitta videon. Kommentering direkt härfrån är en funktion vi arbetar på i &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</target>
3198 <context-group name="null">
3199 <context context-type="linenumber">8</context>
3200 </context-group>
3201 </trans-unit>
3202 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3269 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3203 <source>No comments.</source> 3270 <source>No comments.</source>
3204 <target>Inga kommentarer.</target> 3271 <target>Inga kommentarer.</target>
3205 <context-group name="null"> 3272 <context-group name="null">
3206 <context context-type="linenumber">18</context> 3273 <context context-type="linenumber">17</context>
3207 </context-group> 3274 </context-group>
3208 </trans-unit> 3275 </trans-unit>
3209 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3276 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3210 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3277 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3211 <target>Visa alla <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> svar</target> 3278 <target>Visa alla <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> svar</target>
3212 <context-group name="null"> 3279 <context-group name="null">
3213 <context context-type="linenumber">55</context> 3280 <context context-type="linenumber">54</context>
3214 </context-group> 3281 </context-group>
3215 </trans-unit> 3282 </trans-unit>
3216 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3283 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3221,7 +3288,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3221 Kommentarer har avaktiverats. 3288 Kommentarer har avaktiverats.
3222 </target> 3289 </target>
3223 <context-group name="null"> 3290 <context-group name="null">
3224 <context context-type="linenumber">64</context> 3291 <context context-type="linenumber">63</context>
3225 </context-group> 3292 </context-group>
3226 </trans-unit> 3293 </trans-unit>
3227 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3294 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3267,6 +3334,32 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3267 <context context-type="linenumber">35</context> 3334 <context context-type="linenumber">35</context>
3268 </context-group> 3335 </context-group>
3269 </trans-unit> 3336 </trans-unit>
3337 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3338 <source>
3339 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3340 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3341 from within the software's interface.
3342 </source>
3343 <target>
3344 Annars kan du kommentera med ett konto på en valfri ActivityPub-instans.
3345 På de flesta plattformar kan du hitta videon genom att skriva dess URL i sökrutan och kommentera
3346 från mjukvarugränssnittet.
3347 </target>
3348 <context-group name="null">
3349 <context context-type="linenumber">36</context>
3350 </context-group>
3351 </trans-unit>
3352 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3353 <source>
3354 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3355 </source>
3356 <target>
3357 Om du har ett konto på Mastodon eller Pleroma kan du öppna det direkt därifrån:
3358 </target>
3359 <context-group name="null">
3360 <context context-type="linenumber">41</context>
3361 </context-group>
3362 </trans-unit>
3270 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3363 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3271 <source>Highlighted comment</source> 3364 <source>Highlighted comment</source>
3272 <target>Markerad kommentar</target> 3365 <target>Markerad kommentar</target>
@@ -3281,13 +3374,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3281 <context context-type="linenumber">14</context> 3374 <context context-type="linenumber">14</context>
3282 </context-group> 3375 </context-group>
3283 </trans-unit> 3376 </trans-unit>
3284 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3285 <source>Error getting about from server</source>
3286 <target>Kan inte hämta information om instansen från servern</target>
3287 <context-group name="null">
3288 <context context-type="linenumber">1</context>
3289 </context-group>
3290 </trans-unit>
3291 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3377 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3292 <source>No description</source> 3378 <source>No description</source>
3293 <target>Ingen beskrivning</target> 3379 <target>Ingen beskrivning</target>
@@ -3304,7 +3390,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3304 </trans-unit> 3390 </trans-unit>
3305 <trans-unit id="369ef5e9c0dd1251abdbf699a5db408bca10777f"> 3391 <trans-unit id="369ef5e9c0dd1251abdbf699a5db408bca10777f">
3306 <source>Published <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videos</source> 3392 <source>Published <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videos</source>
3307 <target>Publiserade <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videor</target> 3393 <target>Publicerade <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videor</target>
3308 <context-group name="null"> 3394 <context-group name="null">
3309 <context context-type="linenumber">1</context> 3395 <context context-type="linenumber">1</context>
3310 </context-group> 3396 </context-group>
@@ -3351,55 +3437,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3351 <context context-type="linenumber">1</context> 3437 <context context-type="linenumber">1</context>
3352 </context-group> 3438 </context-group>
3353 </trans-unit> 3439 </trans-unit>
3354 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3355 <source>Error</source>
3356 <target>Fel</target>
3357 <context-group name="null">
3358 <context context-type="linenumber">1</context>
3359 </context-group>
3360 </trans-unit>
3361 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3362 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3363 <target>Du definierade en egen <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </target>
3364 <context-group name="null">
3365 <context context-type="linenumber">1</context>
3366 </context-group>
3367 </trans-unit>
3368 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
3369 <source>This could lead to security issues or bugs if you do not understand it. </source>
3370 <target>Detta kan orsaka säkerhetsproblem eller buggar om du inte förstår det.</target>
3371 <context-group name="null">
3372 <context context-type="linenumber">1</context>
3373 </context-group>
3374 </trans-unit>
3375 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
3376 <source>Are you sure you want to update the configuration?</source>
3377 <target>Är du säker på att du vill uppdatera konfigurationen?</target>
3378 <context-group name="null">
3379 <context context-type="linenumber">1</context>
3380 </context-group>
3381 </trans-unit>
3382 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
3383 <source>Please type</source>
3384 <target>Skriv</target>
3385 <context-group name="null">
3386 <context context-type="linenumber">1</context>
3387 </context-group>
3388 </trans-unit>
3389 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
3390 <source>to confirm.</source>
3391 <target>för att bekräfta.</target>
3392 <context-group name="null">
3393 <context context-type="linenumber">1</context>
3394 </context-group>
3395 </trans-unit>
3396 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3397 <source>Success</source>
3398 <target>Åtgärden lyckades</target>
3399 <context-group name="null">
3400 <context context-type="linenumber">1</context>
3401 </context-group>
3402 </trans-unit>
3403 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3440 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3404 <source>Configuration updated.</source> 3441 <source>Configuration updated.</source>
3405 <target>Konfigurering uppdaterad.</target> 3442 <target>Konfigurering uppdaterad.</target>
@@ -3561,6 +3598,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3561 <context context-type="linenumber">1</context> 3598 <context context-type="linenumber">1</context>
3562 </context-group> 3599 </context-group>
3563 </trans-unit> 3600 </trans-unit>
3601 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3602 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3603 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av din instans.</target>
3604 <context-group name="null">
3605 <context context-type="linenumber">1</context>
3606 </context-group>
3607 </trans-unit>
3608 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3609 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3610 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av din instans.</target>
3611 <context-group name="null">
3612 <context context-type="linenumber">1</context>
3613 </context-group>
3614 </trans-unit>
3564 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3615 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3565 <source>Comment updated.</source> 3616 <source>Comment updated.</source>
3566 <target>Kommentaren har uppdaterats.</target> 3617 <target>Kommentaren har uppdaterats.</target>
@@ -3568,6 +3619,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3568 <context context-type="linenumber">1</context> 3619 <context context-type="linenumber">1</context>
3569 </context-group> 3620 </context-group>
3570 </trans-unit> 3621 </trans-unit>
3622 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3623 <source>Delete this report</source>
3624 <target>Radera den här anmälan</target>
3625 <context-group name="null">
3626 <context context-type="linenumber">1</context>
3627 </context-group>
3628 </trans-unit>
3571 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3629 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3572 <source>Update moderation comment</source> 3630 <source>Update moderation comment</source>
3573 <target>Uppdatera moderationskommentar</target> 3631 <target>Uppdatera moderationskommentar</target>
@@ -3589,9 +3647,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3589 <context context-type="linenumber">1</context> 3647 <context context-type="linenumber">1</context>
3590 </context-group> 3648 </context-group>
3591 </trans-unit> 3649 </trans-unit>
3592 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3650 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3593 <source>Do you really want to delete this abuse?</source> 3651 <source>Do you really want to delete this abuse report?</source>
3594 <target>Vill du verkligen ta bort den här missbruksanmälan?</target> 3652 <target>Vill du verkligen radera den här missbruksanmälan?</target>
3595 <context-group name="null"> 3653 <context-group name="null">
3596 <context context-type="linenumber">1</context> 3654 <context context-type="linenumber">1</context>
3597 </context-group> 3655 </context-group>
@@ -3638,23 +3696,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3638 <context context-type="linenumber">1</context> 3696 <context context-type="linenumber">1</context>
3639 </context-group> 3697 </context-group>
3640 </trans-unit> 3698 </trans-unit>
3641 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 3699 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3642 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 3700 <source>Unban</source>
3643 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> har blockerats.</target> 3701 <target>Avsluta blockering</target>
3644 <context-group name="null">
3645 <context context-type="linenumber">1</context>
3646 </context-group>
3647 </trans-unit>
3648 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3649 <source>Ban</source>
3650 <target>Blockera</target>
3651 <context-group name="null"> 3702 <context-group name="null">
3652 <context context-type="linenumber">1</context> 3703 <context context-type="linenumber">1</context>
3653 </context-group> 3704 </context-group>
3654 </trans-unit> 3705 </trans-unit>
3655 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3706 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3656 <source>Unban</source> 3707 <source>Set Email as Verified</source>
3657 <target>Avsluta blockering</target> 3708 <target>Markera e-post som verifierad</target>
3658 <context-group name="null"> 3709 <context-group name="null">
3659 <context context-type="linenumber">1</context> 3710 <context context-type="linenumber">1</context>
3660 </context-group> 3711 </context-group>
@@ -3666,16 +3717,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3666 <context context-type="linenumber">1</context> 3717 <context context-type="linenumber">1</context>
3667 </context-group> 3718 </context-group>
3668 </trans-unit> 3719 </trans-unit>
3669 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 3720 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3670 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 3721 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3671 <target>Vill du verkligen avsluta blockeringen av <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target> 3722 <target>Vill du verkligen avbryta blockeringen av <x id="INTERPOLATION" equiv-text="{{num}}"/> användare?</target>
3672 <context-group name="null"> 3723 <context-group name="null">
3673 <context context-type="linenumber">1</context> 3724 <context context-type="linenumber">1</context>
3674 </context-group> 3725 </context-group>
3675 </trans-unit> 3726 </trans-unit>
3676 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 3727 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3677 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 3728 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3678 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> är inte längre blockerad.</target> 3729 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användare avblockerade.</target>
3679 <context-group name="null"> 3730 <context-group name="null">
3680 <context context-type="linenumber">1</context> 3731 <context context-type="linenumber">1</context>
3681 </context-group> 3732 </context-group>
@@ -3687,16 +3738,37 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3687 <context context-type="linenumber">1</context> 3738 <context context-type="linenumber">1</context>
3688 </context-group> 3739 </context-group>
3689 </trans-unit> 3740 </trans-unit>
3690 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603"> 3741 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3691 <source>If you remove this user, you will not be able to create another with the same username!</source> 3742 <source>If you remove these users, you will not be able to create others with the same username!</source>
3692 <target>Om du tar bort den här användaren kommer du inte kunna skapa en ny med samma användarnamn!</target> 3743 <target>Om du tar bort de här användarna kommer du inte kunna skapa nya med samma användarnamn!</target>
3693 <context-group name="null"> 3744 <context-group name="null">
3694 <context context-type="linenumber">1</context> 3745 <context context-type="linenumber">1</context>
3695 </context-group> 3746 </context-group>
3696 </trans-unit> 3747 </trans-unit>
3697 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3748 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3698 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3749 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3699 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> har raderats.</target> 3750 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användare borttagna.</target>
3751 <context-group name="null">
3752 <context context-type="linenumber">1</context>
3753 </context-group>
3754 </trans-unit>
3755 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3756 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3757 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användares e-post har markerats som verifierade.</target>
3758 <context-group name="null">
3759 <context context-type="linenumber">1</context>
3760 </context-group>
3761 </trans-unit>
3762 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3763 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3764 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre.</target>
3765 <context-group name="null">
3766 <context context-type="linenumber">1</context>
3767 </context-group>
3768 </trans-unit>
3769 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3770 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3771 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre.</target>
3700 <context-group name="null"> 3772 <context-group name="null">
3701 <context context-type="linenumber">1</context> 3773 <context context-type="linenumber">1</context>
3702 </context-group> 3774 </context-group>
@@ -3715,6 +3787,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3715 <context context-type="linenumber">1</context> 3787 <context context-type="linenumber">1</context>
3716 </context-group> 3788 </context-group>
3717 </trans-unit> 3789 </trans-unit>
3790 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3791 <source>You current password is invalid.</source>
3792 <target>Ditt nuvarande lösenord är inte giltigt.</target>
3793 <context-group name="null">
3794 <context context-type="linenumber">1</context>
3795 </context-group>
3796 </trans-unit>
3718 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3797 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3719 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3798 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3720 <target>Är du säker på att du vill radera ditt konto? Detta kommer ta bort all din data, bland annat kanaler och videor.</target> 3799 <target>Är du säker på att du vill radera ditt konto? Detta kommer ta bort all din data, bland annat kanaler och videor.</target>
@@ -3771,6 +3850,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3771 <context context-type="linenumber">1</context> 3850 <context context-type="linenumber">1</context>
3772 </context-group> 3851 </context-group>
3773 </trans-unit> 3852 </trans-unit>
3853 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3854 <source>This name already exists on this instance.</source>
3855 <target>Namnet finns redan på den här instansen.</target>
3856 <context-group name="null">
3857 <context context-type="linenumber">1</context>
3858 </context-group>
3859 </trans-unit>
3774 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3860 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3775 <source>Create</source> 3861 <source>Create</source>
3776 <target>Skapa</target> 3862 <target>Skapa</target>
@@ -3785,23 +3871,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3785 <context context-type="linenumber">1</context> 3871 <context context-type="linenumber">1</context>
3786 </context-group> 3872 </context-group>
3787 </trans-unit> 3873 </trans-unit>
3788 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3874 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3789 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3875 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3790 <target>Vill du verkligen radera <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Det kommer radera samtliga videor som laddats upp till kanalen.</target> 3876 <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target>
3791 <context-group name="null">
3792 <context context-type="linenumber">1</context>
3793 </context-group>
3794 </trans-unit>
3795 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3796 <source>Please type the name of the video channel to confirm</source>
3797 <target>Fyll i kanalens namn för att bekräfta</target>
3798 <context-group name="null"> 3877 <context-group name="null">
3799 <context context-type="linenumber">1</context> 3878 <context context-type="linenumber">1</context>
3800 </context-group> 3879 </context-group>
3801 </trans-unit> 3880 </trans-unit>
3802 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3881 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3803 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3882 <source>My videos</source>
3804 <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target> 3883 <target>Mina videor</target>
3805 <context-group name="null"> 3884 <context-group name="null">
3806 <context context-type="linenumber">1</context> 3885 <context context-type="linenumber">1</context>
3807 </context-group> 3886 </context-group>
@@ -3876,16 +3955,44 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3876 <context context-type="linenumber">1</context> 3955 <context context-type="linenumber">1</context>
3877 </context-group> 3956 </context-group>
3878 </trans-unit> 3957 </trans-unit>
3879 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3958 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3880 <source>Channels</source> 3959 <source>My library</source>
3881 <target>Kanaler</target> 3960 <target>Mitt bibliotek</target>
3882 <context-group name="null"> 3961 <context-group name="null">
3883 <context context-type="linenumber">1</context> 3962 <context context-type="linenumber">1</context>
3884 </context-group> 3963 </context-group>
3885 </trans-unit> 3964 </trans-unit>
3886 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3965 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3887 <source>Video imports</source> 3966 <source>My channels</source>
3888 <target>Videoimporteringar</target> 3967 <target>Mina kanaler</target>
3968 <context-group name="null">
3969 <context context-type="linenumber">1</context>
3970 </context-group>
3971 </trans-unit>
3972 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3973 <source>My subscriptions</source>
3974 <target>Mina prenumerationer</target>
3975 <context-group name="null">
3976 <context context-type="linenumber">1</context>
3977 </context-group>
3978 </trans-unit>
3979 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3980 <source>Misc</source>
3981 <target>Diverse</target>
3982 <context-group name="null">
3983 <context context-type="linenumber">1</context>
3984 </context-group>
3985 </trans-unit>
3986 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3987 <source>Ownership changes</source>
3988 <target>Ändringar av ägarskap</target>
3989 <context-group name="null">
3990 <context context-type="linenumber">1</context>
3991 </context-group>
3992 </trans-unit>
3993 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3994 <source>My settings</source>
3995 <target>Mina inställningar</target>
3889 <context-group name="null"> 3996 <context-group name="null">
3890 <context context-type="linenumber">1</context> 3997 <context context-type="linenumber">1</context>
3891 </context-group> 3998 </context-group>
@@ -3904,6 +4011,97 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3904 <context context-type="linenumber">1</context> 4011 <context context-type="linenumber">1</context>
3905 </context-group> 4012 </context-group>
3906 </trans-unit> 4013 </trans-unit>
4014 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4015 <source>Subscribe to the account</source>
4016 <target>Prenumerera på kontot</target>
4017 <context-group name="null">
4018 <context context-type="linenumber">1</context>
4019 </context-group>
4020 </trans-unit>
4021 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4022 <source>Focus the search bar</source>
4023 <target>Markera sökrutan</target>
4024 <context-group name="null">
4025 <context context-type="linenumber">1</context>
4026 </context-group>
4027 </trans-unit>
4028 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4029 <source>Toggle the left menu</source>
4030 <target>Växla vänstermenyn</target>
4031 <context-group name="null">
4032 <context context-type="linenumber">1</context>
4033 </context-group>
4034 </trans-unit>
4035 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4036 <source>Go to the videos overview page</source>
4037 <target>Gå till översiktssidan över videor</target>
4038 <context-group name="null">
4039 <context context-type="linenumber">1</context>
4040 </context-group>
4041 </trans-unit>
4042 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4043 <source>Go to the trending videos page</source>
4044 <target>Gå till sidan med populära videor</target>
4045 <context-group name="null">
4046 <context context-type="linenumber">1</context>
4047 </context-group>
4048 </trans-unit>
4049 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4050 <source>Go to the recently added videos page</source>
4051 <target>GÃ¥ till sidan med nyligen uppladdade videor</target>
4052 <context-group name="null">
4053 <context context-type="linenumber">1</context>
4054 </context-group>
4055 </trans-unit>
4056 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4057 <source>Go to the local videos page</source>
4058 <target>GÃ¥ till sidan med lokala videor</target>
4059 <context-group name="null">
4060 <context context-type="linenumber">1</context>
4061 </context-group>
4062 </trans-unit>
4063 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4064 <source>Go to the videos upload page</source>
4065 <target>Gå till sidan för videouppladdningar</target>
4066 <context-group name="null">
4067 <context context-type="linenumber">1</context>
4068 </context-group>
4069 </trans-unit>
4070 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4071 <source>Toggle Dark theme</source>
4072 <target>Växla mörkt tema</target>
4073 <context-group name="null">
4074 <context context-type="linenumber">1</context>
4075 </context-group>
4076 </trans-unit>
4077 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4078 <source>Go to my subscriptions</source>
4079 <target>GÃ¥ till mina prenumerationer</target>
4080 <context-group name="null">
4081 <context context-type="linenumber">1</context>
4082 </context-group>
4083 </trans-unit>
4084 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4085 <source>Go to my videos</source>
4086 <target>GÃ¥ till mina videor</target>
4087 <context-group name="null">
4088 <context context-type="linenumber">1</context>
4089 </context-group>
4090 </trans-unit>
4091 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4092 <source>Go to my imports</source>
4093 <target>GÃ¥ till mina importeringar</target>
4094 <context-group name="null">
4095 <context context-type="linenumber">1</context>
4096 </context-group>
4097 </trans-unit>
4098 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4099 <source>Go to my channels</source>
4100 <target>GÃ¥ till mina kanaler</target>
4101 <context-group name="null">
4102 <context context-type="linenumber">1</context>
4103 </context-group>
4104 </trans-unit>
3907 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4105 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3908 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4106 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3909</source> 4107</source>
@@ -3920,6 +4118,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3920 <context context-type="linenumber">1</context> 4118 <context context-type="linenumber">1</context>
3921 </context-group> 4119 </context-group>
3922 </trans-unit> 4120 </trans-unit>
4121 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4122 <source>Error</source>
4123 <target>Fel</target>
4124 <context-group name="null">
4125 <context context-type="linenumber">1</context>
4126 </context-group>
4127 </trans-unit>
3923 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4128 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3924 <source>You need to reconnect.</source> 4129 <source>You need to reconnect.</source>
3925 <target>Du måste återansluta.</target> 4130 <target>Du måste återansluta.</target>
@@ -3941,6 +4146,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3941 <context context-type="linenumber">1</context> 4146 <context context-type="linenumber">1</context>
3942 </context-group> 4147 </context-group>
3943 </trans-unit> 4148 </trans-unit>
4149 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4150 <source>Info</source>
4151 <target>Information</target>
4152 <context-group name="null">
4153 <context context-type="linenumber">1</context>
4154 </context-group>
4155 </trans-unit>
4156 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4157 <source>Success</source>
4158 <target>Åtgärden lyckades</target>
4159 <context-group name="null">
4160 <context context-type="linenumber">1</context>
4161 </context-group>
4162 </trans-unit>
3944 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4163 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3945 <source>Incorrect username or password.</source> 4164 <source>Incorrect username or password.</source>
3946 <target>Felaktigt användarnamn eller lösenord.</target> 4165 <target>Felaktigt användarnamn eller lösenord.</target>
@@ -4158,6 +4377,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4158 <context context-type="linenumber">1</context> 4377 <context context-type="linenumber">1</context>
4159 </context-group> 4378 </context-group>
4160 </trans-unit> 4379 </trans-unit>
4380 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4381 <source>Email is required.</source>
4382 <target>E-postadress måste uppges.</target>
4383 <context-group name="null">
4384 <context context-type="linenumber">1</context>
4385 </context-group>
4386 </trans-unit>
4387 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4388 <source>Email must be valid.</source>
4389 <target>E-postadressen måste vara giltig.</target>
4390 <context-group name="null">
4391 <context context-type="linenumber">1</context>
4392 </context-group>
4393 </trans-unit>
4161 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4394 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4162 <source>Username is required.</source> 4395 <source>Username is required.</source>
4163 <target>Användarnamn måste fyllas i.</target> 4396 <target>Användarnamn måste fyllas i.</target>
@@ -4179,41 +4412,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4179 <context context-type="linenumber">1</context> 4412 <context context-type="linenumber">1</context>
4180 </context-group> 4413 </context-group>
4181 </trans-unit> 4414 </trans-unit>
4182 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4183 <source>Username must be at least 3 characters long.</source>
4184 <target>Användarnamnet måste innehålla minst tre tecken.</target>
4185 <context-group name="null">
4186 <context context-type="linenumber">1</context>
4187 </context-group>
4188 </trans-unit>
4189 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4190 <source>Username cannot be more than 20 characters long.</source>
4191 <target>Användarnamnet får inte vara mer än 20 tecken långt.</target>
4192 <context-group name="null">
4193 <context context-type="linenumber">1</context>
4194 </context-group>
4195 </trans-unit>
4196 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4197 <source>Username should be only lowercase alphanumeric characters.</source>
4198 <target>Användarnamnet får endast bestå av små bokstäver och siffror.</target>
4199 <context-group name="null">
4200 <context context-type="linenumber">1</context>
4201 </context-group>
4202 </trans-unit>
4203 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4204 <source>Email is required.</source>
4205 <target>E-postadress måste uppges.</target>
4206 <context-group name="null">
4207 <context context-type="linenumber">1</context>
4208 </context-group>
4209 </trans-unit>
4210 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4211 <source>Email must be valid.</source>
4212 <target>E-postadressen måste vara giltig.</target>
4213 <context-group name="null">
4214 <context context-type="linenumber">1</context>
4215 </context-group>
4216 </trans-unit>
4217 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4415 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4218 <source>Password must be at least 6 characters long.</source> 4416 <source>Password must be at least 6 characters long.</source>
4219 <target>Lösenordet måste innehålla minst sex tecken.</target> 4417 <target>Lösenordet måste innehålla minst sex tecken.</target>
@@ -4277,20 +4475,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4277 <context context-type="linenumber">1</context> 4475 <context context-type="linenumber">1</context>
4278 </context-group> 4476 </context-group>
4279 </trans-unit> 4477 </trans-unit>
4280 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4281 <source>Display name must be at least 3 characters long.</source>
4282 <target>Visningsnamnet måste innehålla minst tre tecken.</target>
4283 <context-group name="null">
4284 <context context-type="linenumber">1</context>
4285 </context-group>
4286 </trans-unit>
4287 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4288 <source>Display name cannot be more than 120 characters long.</source>
4289 <target>Visningsnamnet får inte vara mer än 120 tecken långt.</target>
4290 <context-group name="null">
4291 <context context-type="linenumber">1</context>
4292 </context-group>
4293 </trans-unit>
4294 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4478 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4295 <source>Description must be at least 3 characters long.</source> 4479 <source>Description must be at least 3 characters long.</source>
4296 <target>Beskrivningen måste innehålla minst tre tecken.</target> 4480 <target>Beskrivningen måste innehålla minst tre tecken.</target>
@@ -4298,9 +4482,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4298 <context context-type="linenumber">1</context> 4482 <context context-type="linenumber">1</context>
4299 </context-group> 4483 </context-group>
4300 </trans-unit> 4484 </trans-unit>
4301 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4485 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4302 <source>Description cannot be more than 250 characters long.</source> 4486 <source>Description cannot be more than 1000 characters long.</source>
4303 <target>Beskrivningen får inte vara mer än 250 tecken lång.</target> 4487 <target>Beskrivningen får inte vara mer än 1000 tecken lång.</target>
4304 <context-group name="null"> 4488 <context-group name="null">
4305 <context context-type="linenumber">1</context> 4489 <context context-type="linenumber">1</context>
4306 </context-group> 4490 </context-group>
@@ -4340,13 +4524,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4340 <context context-type="linenumber">1</context> 4524 <context context-type="linenumber">1</context>
4341 </context-group> 4525 </context-group>
4342 </trans-unit> 4526 </trans-unit>
4343 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4344 <source>Report reason cannot be more than 300 characters long.</source>
4345 <target>Orsak för rapportering får inte vara mer än 300 tecken lång.</target>
4346 <context-group name="null">
4347 <context context-type="linenumber">1</context>
4348 </context-group>
4349 </trans-unit>
4350 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4527 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4351 <source>Moderation comment is required.</source> 4528 <source>Moderation comment is required.</source>
4352 <target>Moderationskommentar krävs.</target> 4529 <target>Moderationskommentar krävs.</target>
@@ -4361,13 +4538,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4361 <context context-type="linenumber">1</context> 4538 <context context-type="linenumber">1</context>
4362 </context-group> 4539 </context-group>
4363 </trans-unit> 4540 </trans-unit>
4364 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4365 <source>Moderation comment cannot be more than 300 characters long.</source>
4366 <target>Moderationskommentaren får inte vara mer än 300 tecken lång.</target>
4367 <context-group name="null">
4368 <context context-type="linenumber">1</context>
4369 </context-group>
4370 </trans-unit>
4371 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4541 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4372 <source>The channel is required.</source> 4542 <source>The channel is required.</source>
4373 <target>Kanalen måste anges.</target> 4543 <target>Kanalen måste anges.</target>
@@ -4410,37 +4580,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4410 <context context-type="linenumber">1</context> 4580 <context context-type="linenumber">1</context>
4411 </context-group> 4581 </context-group>
4412 </trans-unit> 4582 </trans-unit>
4413 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4583 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4414 <source>Name is required.</source> 4584 <source>You can only transfer ownership to a local account</source>
4415 <target>Namn måste uppges.</target> 4585 <target>Du kan bara överföra ägarskapet till ett lokalt konto</target>
4416 <context-group name="null">
4417 <context context-type="linenumber">1</context>
4418 </context-group>
4419 </trans-unit>
4420 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4421 <source>Name must be at least 3 characters long.</source>
4422 <target>Namnet måste innehålla minst tre tecken.</target>
4423 <context-group name="null">
4424 <context context-type="linenumber">1</context>
4425 </context-group>
4426 </trans-unit>
4427 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4428 <source>Name cannot be more than 20 characters long.</source>
4429 <target>Namnet får inte vara mer än 20 tecken långt.</target>
4430 <context-group name="null">
4431 <context context-type="linenumber">1</context>
4432 </context-group>
4433 </trans-unit>
4434 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4435 <source>Name should be only lowercase alphanumeric characters.</source>
4436 <target>Namnet kan endast bestå av små bokstäver och siffror</target>
4437 <context-group name="null"> 4586 <context-group name="null">
4438 <context context-type="linenumber">1</context> 4587 <context context-type="linenumber">1</context>
4439 </context-group> 4588 </context-group>
4440 </trans-unit> 4589 </trans-unit>
4441 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 4590 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4442 <source>Description cannot be more than 500 characters long.</source> 4591 <source>Name is required.</source>
4443 <target>Beskrivningen får inte vara mer än 500 tecken lång.</target> 4592 <target>Namn måste uppges.</target>
4444 <context-group name="null"> 4593 <context-group name="null">
4445 <context context-type="linenumber">1</context> 4594 <context context-type="linenumber">1</context>
4446 </context-group> 4595 </context-group>
@@ -4452,9 +4601,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4452 <context context-type="linenumber">1</context> 4601 <context context-type="linenumber">1</context>
4453 </context-group> 4602 </context-group>
4454 </trans-unit> 4603 </trans-unit>
4455 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4604 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4456 <source>Support text cannot be more than 500 characters long.</source> 4605 <source>Support text cannot be more than 1000 characters long.</source>
4457 <target>Suporttexten får inte vara mer än 500 tecken lång.</target> 4606 <target>Supporttexten får inte vara mer än 1000 tecken lång.</target>
4458 <context-group name="null"> 4607 <context-group name="null">
4459 <context context-type="linenumber">1</context> 4608 <context context-type="linenumber">1</context>
4460 </context-group> 4609 </context-group>
@@ -4468,14 +4617,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4468 </trans-unit> 4617 </trans-unit>
4469 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6"> 4618 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
4470 <source>Comment must be at least 2 characters long.</source> 4619 <source>Comment must be at least 2 characters long.</source>
4471 <target>Kommentarer måste innehålla minst två tecken.</target> 4620 <target>Kommentaren måste innehålla minst två tecken.</target>
4472 <context-group name="null"> 4621 <context-group name="null">
4473 <context context-type="linenumber">1</context> 4622 <context context-type="linenumber">1</context>
4474 </context-group> 4623 </context-group>
4475 </trans-unit> 4624 </trans-unit>
4476 <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123"> 4625 <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123">
4477 <source>Comment cannot be more than 3000 characters long.</source> 4626 <source>Comment cannot be more than 3000 characters long.</source>
4478 <target>Kommentar får inte vara mer än 3000 tecken lång.</target> 4627 <target>Kommentaren får inte vara mer än 3000 tecken lång.</target>
4479 <context-group name="null"> 4628 <context-group name="null">
4480 <context context-type="linenumber">1</context> 4629 <context context-type="linenumber">1</context>
4481 </context-group> 4630 </context-group>
@@ -4550,9 +4699,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4550 <context context-type="linenumber">1</context> 4699 <context context-type="linenumber">1</context>
4551 </context-group> 4700 </context-group>
4552 </trans-unit> 4701 </trans-unit>
4553 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4702 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4554 <source>Video support cannot be more than 500 characters long.</source> 4703 <source>Video support cannot be more than 1000 characters long.</source>
4555 <target>Videons supporttext får inte vara mer än 500 tecken lång.</target> 4704 <target>Videons supporttext får inte vara mer än 1000 tecken lång.</target>
4556 <context-group name="null"> 4705 <context-group name="null">
4557 <context context-type="linenumber">1</context> 4706 <context context-type="linenumber">1</context>
4558 </context-group> 4707 </context-group>
@@ -5082,6 +5231,153 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5082 <context context-type="linenumber">1</context> 5231 <context context-type="linenumber">1</context>
5083 </context-group> 5232 </context-group>
5084 </trans-unit> 5233 </trans-unit>
5234 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5235 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5236 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användare blockerade.</target>
5237 <context-group name="null">
5238 <context context-type="linenumber">1</context>
5239 </context-group>
5240 </trans-unit>
5241 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5242 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5243 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> har blockerats.</target>
5244 <context-group name="null">
5245 <context context-type="linenumber">1</context>
5246 </context-group>
5247 </trans-unit>
5248 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5249 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5250 <target>Vill du verkligen avsluta blockeringen av <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
5251 <context-group name="null">
5252 <context context-type="linenumber">1</context>
5253 </context-group>
5254 </trans-unit>
5255 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5256 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5257 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> är inte längre blockerad.</target>
5258 <context-group name="null">
5259 <context context-type="linenumber">1</context>
5260 </context-group>
5261 </trans-unit>
5262 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5263 <source>If you remove this user, you will not be able to create another with the same username!</source>
5264 <target>Om du tar bort den här användaren kommer du inte kunna skapa en ny med samma användarnamn!</target>
5265 <context-group name="null">
5266 <context context-type="linenumber">1</context>
5267 </context-group>
5268 </trans-unit>
5269 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5270 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5271 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/> har raderats.</target>
5272 <context-group name="null">
5273 <context context-type="linenumber">1</context>
5274 </context-group>
5275 </trans-unit>
5276 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5277 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5278 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/>s e-post har markerats som verifierad.</target>
5279 <context-group name="null">
5280 <context context-type="linenumber">1</context>
5281 </context-group>
5282 </trans-unit>
5283 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5284 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5285 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras.</target>
5286 <context-group name="null">
5287 <context context-type="linenumber">1</context>
5288 </context-group>
5289 </trans-unit>
5290 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5291 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5292 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras.</target>
5293 <context-group name="null">
5294 <context context-type="linenumber">1</context>
5295 </context-group>
5296 </trans-unit>
5297 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5298 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5299 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras av instansen.</target>
5300 <context-group name="null">
5301 <context context-type="linenumber">1</context>
5302 </context-group>
5303 </trans-unit>
5304 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5305 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5306 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av instansen.</target>
5307 <context-group name="null">
5308 <context context-type="linenumber">1</context>
5309 </context-group>
5310 </trans-unit>
5311 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5312 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5313 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras av instansen.</target>
5314 <context-group name="null">
5315 <context context-type="linenumber">1</context>
5316 </context-group>
5317 </trans-unit>
5318 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5319 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5320 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av instansen.</target>
5321 <context-group name="null">
5322 <context context-type="linenumber">1</context>
5323 </context-group>
5324 </trans-unit>
5325 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5326 <source>Mute this account</source>
5327 <target>Ignorera det här kontot</target>
5328 <context-group name="null">
5329 <context context-type="linenumber">1</context>
5330 </context-group>
5331 </trans-unit>
5332 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5333 <source>Unmute this account</source>
5334 <target>Sluta ignorera det här kontot</target>
5335 <context-group name="null">
5336 <context context-type="linenumber">1</context>
5337 </context-group>
5338 </trans-unit>
5339 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5340 <source>Mute the instance</source>
5341 <target>Ignorera instansen</target>
5342 <context-group name="null">
5343 <context context-type="linenumber">1</context>
5344 </context-group>
5345 </trans-unit>
5346 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5347 <source>Unmute the instance</source>
5348 <target>Sluta ignorera instansen</target>
5349 <context-group name="null">
5350 <context context-type="linenumber">1</context>
5351 </context-group>
5352 </trans-unit>
5353 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5354 <source>Mute this account by your instance</source>
5355 <target>Ignorera det här kontot av din instans</target>
5356 <context-group name="null">
5357 <context context-type="linenumber">1</context>
5358 </context-group>
5359 </trans-unit>
5360 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5361 <source>Unmute this account by your instance</source>
5362 <target>Sluta ignorera det här kontot av din instans</target>
5363 <context-group name="null">
5364 <context context-type="linenumber">1</context>
5365 </context-group>
5366 </trans-unit>
5367 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5368 <source>Mute the instance by your instance</source>
5369 <target>Ignorera instansen av din instans</target>
5370 <context-group name="null">
5371 <context context-type="linenumber">1</context>
5372 </context-group>
5373 </trans-unit>
5374 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5375 <source>Unmute the instance by your instance</source>
5376 <target>Sluta ignorera instansen av din instans</target>
5377 <context-group name="null">
5378 <context context-type="linenumber">1</context>
5379 </context-group>
5380 </trans-unit>
5085 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5381 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5086 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5382 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5087 <target>Förfrågan är för stor för servern. Kontakta gärna din administratör om du vill öka storleksbegränsningen.</target> 5383 <target>Förfrågan är för stor för servern. Kontakta gärna din administratör om du vill öka storleksbegränsningen.</target>
@@ -5110,6 +5406,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5110 <context context-type="linenumber">1</context> 5406 <context context-type="linenumber">1</context>
5111 </context-group> 5407 </context-group>
5112 </trans-unit> 5408 </trans-unit>
5409 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5410 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5411 <target>Prenumererar på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5412 <context-group name="null">
5413 <context context-type="linenumber">1</context>
5414 </context-group>
5415 </trans-unit>
5113 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5416 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5114 <source>Subscribed</source> 5417 <source>Subscribed</source>
5115 <target>Prenumererar</target> 5418 <target>Prenumererar</target>
@@ -5117,9 +5420,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5117 <context context-type="linenumber">1</context> 5420 <context context-type="linenumber">1</context>
5118 </context-group> 5421 </context-group>
5119 </trans-unit> 5422 </trans-unit>
5120 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5423 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
5121 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5424 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5122 <target>Prenumererar på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5425 <target>Prenumerationen på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> är avslutad</target>
5123 <context-group name="null"> 5426 <context-group name="null">
5124 <context context-type="linenumber">1</context> 5427 <context context-type="linenumber">1</context>
5125 </context-group> 5428 </context-group>
@@ -5131,9 +5434,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5131 <context context-type="linenumber">1</context> 5434 <context context-type="linenumber">1</context>
5132 </context-group> 5435 </context-group>
5133 </trans-unit> 5436 </trans-unit>
5134 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5437 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5135 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5438 <source>Moderator</source>
5136 <target>Prenumerationen på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> är avslutad</target> 5439 <target>Moderator</target>
5137 <context-group name="null"> 5440 <context-group name="null">
5138 <context context-type="linenumber">1</context> 5441 <context context-type="linenumber">1</context>
5139 </context-group> 5442 </context-group>
@@ -5159,23 +5462,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5159 <context context-type="linenumber">1</context> 5462 <context context-type="linenumber">1</context>
5160 </context-group> 5463 </context-group>
5161 </trans-unit> 5464 </trans-unit>
5162 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 5465 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
5163 <source>Welcome</source> 5466 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5164 <target>Välkommen</target> 5467 <target>Välkommen! Kontrollera gärna din e-post för att verifiera ditt konto och fullfölja kontoskapandet.</target>
5165 <context-group name="null">
5166 <context context-type="linenumber">1</context>
5167 </context-group>
5168 </trans-unit>
5169 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
5170 <source>Please check your email to verify your account and complete signup.</source>
5171 <target>Kontrollera din e-post för att verifiera ditt konto och slutföra kontoregistreringen.</target>
5172 <context-group name="null"> 5468 <context-group name="null">
5173 <context context-type="linenumber">1</context> 5469 <context context-type="linenumber">1</context>
5174 </context-group> 5470 </context-group>
5175 </trans-unit> 5471 </trans-unit>
5176 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be"> 5472 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
5177 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source> 5473 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
5178 <target>Registrering av <x id="INTERPOLATION" equiv-text="{{username}}"/> slutförd.</target> 5474 <target>Du är nu inloggad som <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
5179 <context-group name="null"> 5475 <context-group name="null">
5180 <context context-type="linenumber">1</context> 5476 <context context-type="linenumber">1</context>
5181 </context-group> 5477 </context-group>
@@ -5208,13 +5504,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5208 <context context-type="linenumber">1</context> 5504 <context context-type="linenumber">1</context>
5209 </context-group> 5505 </context-group>
5210 </trans-unit> 5506 </trans-unit>
5211 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5212 <source>Info</source>
5213 <target>Information</target>
5214 <context-group name="null">
5215 <context context-type="linenumber">1</context>
5216 </context-group>
5217 </trans-unit>
5218 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5507 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5219 <source>Upload cancelled</source> 5508 <source>Upload cancelled</source>
5220 <target>Uppladdningen avbröts</target> 5509 <target>Uppladdningen avbröts</target>
@@ -5222,13 +5511,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5222 <context context-type="linenumber">1</context> 5511 <context context-type="linenumber">1</context>
5223 </context-group> 5512 </context-group>
5224 </trans-unit> 5513 </trans-unit>
5225 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5226 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5227 <target>Vi ber om ursäkt, PeerTube kan tyvärr inte hantera videor större än 8GB</target>
5228 <context-group name="null">
5229 <context context-type="linenumber">1</context>
5230 </context-group>
5231 </trans-unit>
5232 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5514 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5233 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 5515 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
5234 <target>Den här videon kommer överskrida din videokvot (videostorlek: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, använt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, kvot: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5516 <target>Den här videon kommer överskrida din videokvot (videostorlek: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, använt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, kvot: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -5292,6 +5574,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5292 <context context-type="linenumber">1</context> 5574 <context context-type="linenumber">1</context>
5293 </context-group> 5575 </context-group>
5294 </trans-unit> 5576 </trans-unit>
5577 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5578 <source>Like the video</source>
5579 <target>Gilla videon</target>
5580 <context-group name="null">
5581 <context context-type="linenumber">1</context>
5582 </context-group>
5583 </trans-unit>
5584 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5585 <source>Dislike the video</source>
5586 <target>Ogilla videon</target>
5587 <context-group name="null">
5588 <context context-type="linenumber">1</context>
5589 </context-group>
5590 </trans-unit>
5295 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5591 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5296 <source>Do you really want to delete this video?</source> 5592 <source>Do you really want to delete this video?</source>
5297 <target>Vill du verkligen radera den här videon?</target> 5593 <target>Vill du verkligen radera den här videon?</target>
diff --git a/client/src/locale/target/angular_ta.xml b/client/src/locale/target/angular_ta.xml
new file mode 100644
index 000000000..abd878aaa
--- /dev/null
+++ b/client/src/locale/target/angular_ta.xml
@@ -0,0 +1,514 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--XLIFF document generated by Zanata. Visit http://zanata.org for more infomation.-->
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="ta">
5 <body>
6 <trans-unit id="ngb.alert.close">
7 <source>Close</source>
8 <target>மூடà¯</target>
9 <context-group name="null">
10 <context context-type="linenumber">2</context>
11 </context-group>
12 </trans-unit>
13 <trans-unit id="ngb.carousel.previous">
14 <source>Previous</source>
15 <target>à®®à¯à®¨à¯à®¤à¯ˆà®¯</target>
16 <context-group name="null">
17 <context context-type="linenumber">13</context>
18 </context-group>
19 </trans-unit>
20 <trans-unit id="ngb.carousel.next">
21 <source>Next</source>
22 <target>அடà¯à®¤à¯à®¤à¯</target>
23 <context-group name="null">
24 <context context-type="linenumber">17</context>
25 </context-group>
26 </trans-unit>
27 <trans-unit id="ngb.datepicker.previous-month">
28 <source>Previous month</source>
29 <target>à®®à¯à®¨à¯à®¤à¯ˆà®¯ மாதமà¯</target>
30 <context-group name="null">
31 <context context-type="linenumber">5</context>
32 </context-group>
33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source>
36 <target>அடà¯à®¤à¯à®¤ மாதமà¯</target>
37 <context-group name="null">
38 <context context-type="linenumber">27</context>
39 </context-group>
40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>மாததà¯à®¤à¯ˆ தேரà¯à®µà¯ செயà¯</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>வரà¯à®Ÿà®¤à¯à®¤à¯ˆ தேரà¯à®µà¯ செயà¯</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source>
57 <target>««</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context>
60 </context-group>
61 </trans-unit>
62 <trans-unit id="ngb.pagination.first-aria">
63 <source>First</source>
64 <target>à®®à¯à®¤à®²à¯</target>
65 <context-group name="null">
66 <context context-type="linenumber">5</context>
67 </context-group>
68 </trans-unit>
69 <trans-unit id="ngb.pagination.previous">
70 <source>«</source>
71 <target>«</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context>
74 </context-group>
75 </trans-unit>
76 <trans-unit id="ngb.pagination.previous-aria">
77 <source>Previous</source>
78 <target>à®®à¯à®¨à¯à®¤à¯ˆà®¯</target>
79 <context-group name="null">
80 <context context-type="linenumber">13</context>
81 </context-group>
82 </trans-unit>
83 <trans-unit id="ngb.pagination.next">
84 <source>»</source>
85 <target>»</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context>
88 </context-group>
89 </trans-unit>
90 <trans-unit id="ngb.pagination.next-aria">
91 <source>Next</source>
92 <target>அடà¯à®¤à¯à®¤à¯</target>
93 <context-group name="null">
94 <context context-type="linenumber">27</context>
95 </context-group>
96 </trans-unit>
97 <trans-unit id="ngb.pagination.last">
98 <source>»»</source>
99 <target>»»</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context>
102 </context-group>
103 </trans-unit>
104 <trans-unit id="ngb.pagination.last-aria">
105 <source>Last</source>
106 <target>இறà¯à®¤à®¿</target>
107 <context-group name="null">
108 <context context-type="linenumber">34</context>
109 </context-group>
110 </trans-unit>
111 <trans-unit id="ngb.timepicker.minutes">
112 <source>Minutes</source>
113 <target>நிமிடஙà¯à®•à®³à¯</target>
114 <context-group name="null">
115 <context context-type="linenumber">33</context>
116 </context-group>
117 </trans-unit>
118 <trans-unit id="ngb.timepicker.seconds">
119 <source>Seconds</source>
120 <target>நொடிகளà¯</target>
121 <context-group name="null">
122 <context context-type="linenumber">52</context>
123 </context-group>
124 </trans-unit>
125 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
126 <source>Cancel</source>
127 <target>ரதà¯à®¤à¯ செயà¯</target>
128 <context-group name="null">
129 <context context-type="linenumber">10</context>
130 </context-group>
131 </trans-unit>
132 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
133 <source>Delete</source>
134 <target>அழிதà¯à®¤à®¿à®Ÿà¯</target>
135 <context-group name="null">
136 <context context-type="linenumber">15</context>
137 </context-group>
138 </trans-unit>
139 <trans-unit id="28f86ffd419b869711aa13f5e5ff54be6d70731c">
140 <source>Edit</source>
141 <target>தொகà¯</target>
142 <context-group name="null">
143 <context context-type="linenumber">1</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="9c71feb04c2beab559f79c41c6127815fb9c1a6f">
147 <source>Get help</source>
148 <target>உதவி</target>
149 <context-group name="null">
150 <context context-type="linenumber">19</context>
151 </context-group>
152 </trans-unit>
153 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
154 <source>
155 Unsubscribe
156 </source>
157 <context-group name="null">
158 <context context-type="linenumber">18</context>
159 </context-group>
160 </trans-unit>
161 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
162 <source>Ban</source>
163 <target>ரதà¯à®¤à¯</target>
164 <context-group name="null">
165 <context context-type="linenumber">3</context>
166 </context-group>
167 </trans-unit>
168 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
169 <source>Reason...</source>
170 <target>காரணமà¯...</target>
171 <context-group name="null">
172 <context context-type="linenumber">11</context>
173 </context-group>
174 </trans-unit>
175 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
176 <source>Ban this user</source>
177 <target>இநà¯à®¤ பயணரை ரதà¯à®¤à¯ செயà¯</target>
178 <context-group name="null">
179 <context context-type="linenumber">25</context>
180 </context-group>
181 </trans-unit>
182 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
183 <source>
184 Login
185 </source>
186 <target>
187 உளà¯à®¨à¯à®´à¯ˆ
188 </target>
189 <context-group name="null">
190 <context context-type="linenumber">2</context>
191 </context-group>
192 </trans-unit>
193 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
194 <source>User</source>
195 <target>பயணரà¯</target>
196 <context-group name="null">
197 <context context-type="linenumber">13</context>
198 </context-group>
199 </trans-unit>
200 <trans-unit id="c32ef07f8803a223a83ed17024b38e8d82292407">
201 <source>Password</source>
202 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯</target>
203 <context-group name="null">
204 <context context-type="linenumber">13</context>
205 </context-group>
206 </trans-unit>
207 <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
208 <source>Login</source>
209 <target>உளà¯à®¨à¯à®´à¯ˆ</target>
210 <context-group name="null">
211 <context context-type="linenumber">36</context>
212 </context-group>
213 </trans-unit>
214 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
215 <source>Forgot your password</source>
216 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯</target>
217 <context-group name="null">
218 <context context-type="linenumber">57</context>
219 </context-group>
220 </trans-unit>
221 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
222 <source>Email</source>
223 <target>மினà¯à®©à®žà¯à®šà®²à¯</target>
224 <context-group name="null">
225 <context context-type="linenumber">8</context>
226 </context-group>
227 </trans-unit>
228 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
229 <source>Email address</source>
230 <target>மினà¯à®©à®žà¯à®šà®²à¯</target>
231 <context-group name="null">
232 <context context-type="linenumber">10</context>
233 </context-group>
234 </trans-unit>
235 <trans-unit id="7f3bdcce4b2e8c37cd7f0f6c92ef8cff34b039b8">
236 <source>Confirm password</source>
237 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯ உறà¯à®¤à®¿à®šà¯†à®¯à¯</target>
238 <context-group name="null">
239 <context context-type="linenumber">19</context>
240 </context-group>
241 </trans-unit>
242 <trans-unit id="3652e5c6e33165264d5271d06cc04ab7123b6df1">
243 <source>Confirmed password</source>
244 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯ உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</target>
245 <context-group name="null">
246 <context context-type="linenumber">21</context>
247 </context-group>
248 </trans-unit>
249 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
250 <source>Example: jane_doe</source>
251 <target>உதாரணமà¯: மாரி_à®®à¯à®¤à¯à®¤à¯</target>
252 <context-group name="null">
253 <context context-type="linenumber">17</context>
254 </context-group>
255 </trans-unit>
256 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
257 <source>Change the language</source>
258 <target>மொழியை மாறà¯à®±à¯</target>
259 <context-group name="null">
260 <context context-type="linenumber">86</context>
261 </context-group>
262 </trans-unit>
263 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
264 <source>
265 Log out
266 </source>
267 <target>
268 வெளியேறà¯
269 </target>
270 <context-group name="null">
271 <context context-type="linenumber">28</context>
272 </context-group>
273 </trans-unit>
274 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
275 <source>Create an account</source>
276 <target>கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯</target>
277 <context-group name="null">
278 <context context-type="linenumber">37</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
282 <source>Recently added</source>
283 <target>சமீபதà¯à®¤à®¿à®¯à®µà¯ˆ</target>
284 <context-group name="null">
285 <context context-type="linenumber">60</context>
286 </context-group>
287 </trans-unit>
288 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
289 <source>More</source>
290 <target>மேலà¯à®®à¯</target>
291 <context-group name="null">
292 <context context-type="linenumber">70</context>
293 </context-group>
294 </trans-unit>
295 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
296 <source>About</source>
297 <target>எஙà¯à®•à®³à¯ˆà®ªà¯ பறà¯à®±à®¿</target>
298 <context-group name="null">
299 <context context-type="linenumber">25</context>
300 </context-group>
301 </trans-unit>
302 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
303 <source>Search...</source>
304 <target>தேடà¯...</target>
305 <context-group name="null">
306 <context context-type="linenumber">2</context>
307 </context-group>
308 </trans-unit>
309 <trans-unit id="4b3972c3e9485218508a95f7a4ce7758e3f09ced">
310 <source>Upload</source>
311 <target>பதிவேறà¯à®±à¯</target>
312 <context-group name="null">
313 <context context-type="linenumber">9</context>
314 </context-group>
315 </trans-unit>
316 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
317 <source>Yes</source>
318 <target>ஆமà¯</target>
319 <context-group name="null">
320 <context context-type="linenumber">37</context>
321 </context-group>
322 </trans-unit>
323 <trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd">
324 <source>No</source>
325 <target>இலà¯à®²à¯ˆ</target>
326 <context-group name="null">
327 <context context-type="linenumber">42</context>
328 </context-group>
329 </trans-unit>
330 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
331 <source>Category</source>
332 <target>பிரிவà¯</target>
333 <context-group name="null">
334 <context context-type="linenumber">164</context>
335 </context-group>
336 </trans-unit>
337 <trans-unit id="78d6d3ea26777cd0dad8ddbf9b314151678da46c">
338 <source>Licence</source>
339 <target>உரிமமà¯</target>
340 <context-group name="null">
341 <context context-type="linenumber">173</context>
342 </context-group>
343 </trans-unit>
344 <trans-unit id="fe46ccaae902ce974e2441abe752399288298619">
345 <source>Language</source>
346 <target>மொழி</target>
347 <context-group name="null">
348 <context context-type="linenumber">182</context>
349 </context-group>
350 </trans-unit>
351 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
352 <source>No results.</source>
353 <target>à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯ இலà¯à®²à¯ˆ.</target>
354 <context-group name="null">
355 <context context-type="linenumber">20</context>
356 </context-group>
357 </trans-unit>
358 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
359 <source>PeerTube</source>
360 <target>PeerTube</target>
361 <context-group name="null">
362 <context context-type="linenumber">7</context>
363 </context-group>
364 </trans-unit>
365 <trans-unit id="e4ce50f3019e3ebe9a479784c6cb68a31c7a8231">
366 <source>What are the consequences?</source>
367 <target>பினà¯à®µà®¿à®³à¯ˆà®µà¯à®•à®³à¯ எனà¯à®©?</target>
368 <context-group name="null">
369 <context context-type="linenumber">25</context>
370 </context-group>
371 </trans-unit>
372 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
373 <source>How does PeerTube compare with YouTube?</source>
374 <target>PeerTube-à® Youtube-உடன௠எபà¯à®ªà®Ÿà¯ ஒபà¯à®ªà®¿à®Ÿà¯à®µà®¤à¯?</target>
375 <context-group name="null">
376 <context context-type="linenumber">67</context>
377 </context-group>
378 </trans-unit>
379 <trans-unit id="cff1428d10d59d14e45edec3c735a27b5482db59">
380 <source>Name</source>
381 <target>பெயரà¯</target>
382 <context-group name="null">
383 <context context-type="linenumber">12</context>
384 </context-group>
385 </trans-unit>
386 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e">
387 <source>Display</source>
388 <target>காணà¯à®ªà®¿</target>
389 <context-group name="null">
390 <context context-type="linenumber">13</context>
391 </context-group>
392 </trans-unit>
393 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
394 <source>Users</source>
395 <target>பயணரà¯à®•à®³à¯</target>
396 <context-group name="null">
397 <context context-type="linenumber">105</context>
398 </context-group>
399 </trans-unit>
400 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
401 <source>Twitter</source>
402 <target>Twitter</target>
403 <context-group name="null">
404 <context context-type="linenumber">178</context>
405 </context-group>
406 </trans-unit>
407 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
408 <source>Your Twitter username</source>
409 <target>உஙà¯à®•à®³à¯ Twitter பயணரà¯à®ªà¯†à®¯à®°à¯</target>
410 <context-group name="null">
411 <context context-type="linenumber">184</context>
412 </context-group>
413 </trans-unit>
414 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
415 <source>Services</source>
416 <target>சேவைகளà¯</target>
417 <context-group name="null">
418 <context context-type="linenumber">176</context>
419 </context-group>
420 </trans-unit>
421 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
422 <source>JavaScript</source>
423 <target>JavaScript</target>
424 <context-group name="null">
425 <context context-type="linenumber">294</context>
426 </context-group>
427 </trans-unit>
428 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
429 <source>
430 Users
431 </source>
432 <target>
433 பயணரà¯à®•à®³à¯
434 </target>
435 <context-group name="null">
436 <context context-type="linenumber">3</context>
437 </context-group>
438 </trans-unit>
439 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
440 <source>
441 Jobs
442 </source>
443 <target>
444 வேலைகளà¯
445 </target>
446 <context-group name="null">
447 <context context-type="linenumber">15</context>
448 </context-group>
449 </trans-unit>
450 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
451 <source>ID</source>
452 <target>ID</target>
453 <context-group name="null">
454 <context context-type="linenumber">18</context>
455 </context-group>
456 </trans-unit>
457 <trans-unit id="380e20a1e13d9489c69f6dbea7da19025ab6eb25">
458 <source>Score</source>
459 <target>மதிபà¯à®ªà¯†à®£à¯</target>
460 <context-group name="null">
461 <context context-type="linenumber">17</context>
462 </context-group>
463 </trans-unit>
464 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
465 <source>Accepted</source>
466 <target>à®à®±à¯à®±à¯à®•à¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</target>
467 <context-group name="null">
468 <context context-type="linenumber">32</context>
469 </context-group>
470 </trans-unit>
471 <trans-unit id="f995df052a1dfc675c2a21926420a707d9601936">
472 <source>Following</source>
473 <target>பினà¯à®ªà®±à¯à®±à¯à®ªà®µà¯ˆ</target>
474 <context-group name="null">
475 <context context-type="linenumber">5</context>
476 </context-group>
477 </trans-unit>
478 <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246">
479 <source>Follow</source>
480 <target>பினà¯à®ªà®±à¯à®±à¯</target>
481 <context-group name="null">
482 <context context-type="linenumber">7</context>
483 </context-group>
484 </trans-unit>
485 <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e">
486 <source>Followers</source>
487 <target>பினà¯à®ªà®±à¯à®±à¯à®ªà®µà®°à¯à®•à®³à¯</target>
488 <context-group name="null">
489 <context context-type="linenumber">9</context>
490 </context-group>
491 </trans-unit>
492 <trans-unit id="1bd571d8f3981f6043b0df3402cc3d97e0d7ad2a">
493 <source>john</source>
494 <target>john</target>
495 <context-group name="null">
496 <context context-type="linenumber">10</context>
497 </context-group>
498 </trans-unit>
499 <trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05">
500 <source>mail@example.com</source>
501 <target>mail@example.com</target>
502 <context-group name="null">
503 <context context-type="linenumber">21</context>
504 </context-group>
505 </trans-unit>
506 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
507 <source>Users list</source>
508 <target>பயணரà¯à®•à®³à¯ படà¯à®Ÿà®¿à®¯à®²à¯</target>
509 <context-group name="null">
510 <context context-type="linenumber">2</context>
511 </context-group>
512 </trans-unit>
513 </body>
514 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_zh_Hans_CN.xml b/client/src/locale/target/angular_zh_Hans_CN.xml
index 5b1165dcb..09ed78392 100644
--- a/client/src/locale/target/angular_zh_Hans_CN.xml
+++ b/client/src/locale/target/angular_zh_Hans_CN.xml
@@ -227,11 +227,25 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>ä¸å…¬å¼€</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>ç§äº«</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
230 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
231 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
232 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target>
233 <context-group name="null"> 247 <context-group name="null">
234 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
235 </context-group> 249 </context-group>
236 </trans-unit> 250 </trans-unit>
237 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -245,7 +259,7 @@
245 <source>Edit</source> 259 <source>Edit</source>
246 <target>编辑</target> 260 <target>编辑</target>
247 <context-group name="null"> 261 <context-group name="null">
248 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
249 </context-group> 263 </context-group>
250 </trans-unit> 264 </trans-unit>
251 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -301,6 +315,13 @@
301 <context context-type="linenumber">18</context> 315 <context context-type="linenumber">18</context>
302 </context-group> 316 </context-group>
303 </trans-unit> 317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>使用 ActivityPub å¸æˆ·</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
304 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3"> 325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
305 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source> 326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
306 <target>使用 <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/> 上的å¸æˆ·è®¢é˜…</target> 327 <target>使用 <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/> 上的å¸æˆ·è®¢é˜…</target>
@@ -315,6 +336,13 @@
315 <context context-type="linenumber">40</context> 336 <context context-type="linenumber">40</context>
316 </context-group> 337 </context-group>
317 </trans-unit> 338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>使用 Mastodon å¸æˆ·è®¢é˜…:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
318 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1"> 346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
319 <source>Using a syndication feed</source> 347 <source>Using a syndication feed</source>
320 <target>使用èšåˆä¿¡æ¯æº</target> 348 <target>使用èšåˆä¿¡æ¯æº</target>
@@ -360,7 +388,7 @@
360 <source>Video quota</source> 388 <source>Video quota</source>
361 <target>视频存储空间</target> 389 <target>视频存储空间</target>
362 <context-group name="null"> 390 <context-group name="null">
363 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
364 </context-group> 392 </context-group>
365 </trans-unit> 393 </trans-unit>
366 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -374,6 +402,38 @@
374 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
375 </context-group> 403 </context-group>
376 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>å°ç¦</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>原因...</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424 被å°ç¦çš„用户将无法登录。
425 </target>
426 <context-group name="null">
427 <context context-type="linenumber">17</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
431 <source>Ban this user</source>
432 <target>å°ç¦æ­¤ç”¨æˆ·</target>
433 <context-group name="null">
434 <context context-type="linenumber">25</context>
435 </context-group>
436 </trans-unit>
377 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
378 <source> 438 <source>
379 Login 439 Login
@@ -439,7 +499,7 @@
439 <source>Password</source> 499 <source>Password</source>
440 <target>密ç </target> 500 <target>密ç </target>
441 <context-group name="null"> 501 <context-group name="null">
442 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
443 </context-group> 503 </context-group>
444 </trans-unit> 504 </trans-unit>
445 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -453,7 +513,7 @@
453 <source>Login</source> 513 <source>Login</source>
454 <target>登录</target> 514 <target>登录</target>
455 <context-group name="null"> 515 <context-group name="null">
456 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
457 </context-group> 517 </context-group>
458 </trans-unit> 518 </trans-unit>
459 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -481,7 +541,7 @@
481 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
482 <target>å‘é€å¯†ç é‡ç½®é‚®ä»¶</target> 542 <target>å‘é€å¯†ç é‡ç½®é‚®ä»¶</target>
483 <context-group name="null"> 543 <context-group name="null">
484 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
485 </context-group> 545 </context-group>
486 </trans-unit> 546 </trans-unit>
487 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -536,28 +596,28 @@
536 <source>Example: jane_doe</source> 596 <source>Example: jane_doe</source>
537 <target>示例:jane_doe</target> 597 <target>示例:jane_doe</target>
538 <context-group name="null"> 598 <context-group name="null">
539 <context context-type="linenumber">16</context> 599 <context context-type="linenumber">17</context>
540 </context-group> 600 </context-group>
541 </trans-unit> 601 </trans-unit>
542 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 602 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
543 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 603 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
544 <target>我已阅读并åŒæ„本实例的&lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;æ¡æ¬¾&lt;/a&gt;</target> 604 <target>我确认我已年满 16 å²å¹¶åŒæ„本实例的&lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;使用æ¡æ¬¾&lt;/a&gt;</target>
545 <context-group name="null"> 605 <context-group name="null">
546 <context context-type="linenumber">54</context> 606 <context context-type="linenumber">55</context>
547 </context-group> 607 </context-group>
548 </trans-unit> 608 </trans-unit>
549 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 609 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
550 <source>Signup</source> 610 <source>Signup</source>
551 <target>注册</target> 611 <target>注册</target>
552 <context-group name="null"> 612 <context-group name="null">
553 <context context-type="linenumber">88</context> 613 <context context-type="linenumber">78</context>
554 </context-group> 614 </context-group>
555 </trans-unit> 615 </trans-unit>
556 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 616 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
557 <source>Features found on this instance</source> 617 <source>Features found on this instance</source>
558 <target>本实例æ供的功能</target> 618 <target>本实例æ供的功能</target>
559 <context-group name="null"> 619 <context-group name="null">
560 <context context-type="linenumber">66</context> 620 <context context-type="linenumber">67</context>
561 </context-group> 621 </context-group>
562 </trans-unit> 622 </trans-unit>
563 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 623 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -578,9 +638,15 @@
578 <context context-type="linenumber">6</context> 638 <context context-type="linenumber">6</context>
579 </context-group> 639 </context-group>
580 </trans-unit> 640 </trans-unit>
581 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 641 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
582 <source>Filters</source> 642 <source>
583 <target>过滤</target> 643 Filters
644 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
645 </source>
646 <target>
647 过滤器
648 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
649 </target>
584 <context-group name="null"> 650 <context-group name="null">
585 <context context-type="linenumber">16</context> 651 <context context-type="linenumber">16</context>
586 </context-group> 652 </context-group>
@@ -593,28 +659,28 @@
593 没有结果 659 没有结果
594 </target> 660 </target>
595 <context-group name="null"> 661 <context-group name="null">
596 <context context-type="linenumber">25</context> 662 <context context-type="linenumber">28</context>
597 </context-group> 663 </context-group>
598 </trans-unit> 664 </trans-unit>
599 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 665 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
600 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 666 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
601 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> ä½è®¢é˜…者</target> 667 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> ä½è®¢é˜…者</target>
602 <context-group name="null"> 668 <context-group name="null">
603 <context context-type="linenumber">41</context> 669 <context context-type="linenumber">44</context>
604 </context-group> 670 </context-group>
605 </trans-unit> 671 </trans-unit>
606 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 672 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
607 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 673 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
608 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> 次观看</target> 674 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> 次观看</target>
609 <context-group name="null"> 675 <context-group name="null">
610 <context context-type="linenumber">52</context> 676 <context context-type="linenumber">55</context>
611 </context-group> 677 </context-group>
612 </trans-unit> 678 </trans-unit>
613 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 679 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
614 <source>Change the language</source> 680 <source>Change the language</source>
615 <target>更改语言</target> 681 <target>更改语言</target>
616 <context-group name="null"> 682 <context-group name="null">
617 <context context-type="linenumber">88</context> 683 <context context-type="linenumber">86</context>
618 </context-group> 684 </context-group>
619 </trans-unit> 685 </trans-unit>
620 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 686 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -625,7 +691,7 @@
625 我的公开个人资料 691 我的公开个人资料
626 </target> 692 </target>
627 <context-group name="null"> 693 <context-group name="null">
628 <context context-type="linenumber">18</context> 694 <context context-type="linenumber">16</context>
629 </context-group> 695 </context-group>
630 </trans-unit> 696 </trans-unit>
631 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 697 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -636,7 +702,7 @@
636 我的å¸æˆ· 702 我的å¸æˆ·
637 </target> 703 </target>
638 <context-group name="null"> 704 <context-group name="null">
639 <context context-type="linenumber">22</context> 705 <context context-type="linenumber">20</context>
640 </context-group> 706 </context-group>
641 </trans-unit> 707 </trans-unit>
642 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 708 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -647,7 +713,7 @@
647 我的视频 713 我的视频
648 </target> 714 </target>
649 <context-group name="null"> 715 <context-group name="null">
650 <context context-type="linenumber">26</context> 716 <context context-type="linenumber">24</context>
651 </context-group> 717 </context-group>
652 </trans-unit> 718 </trans-unit>
653 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 719 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -658,14 +724,14 @@
658 注销 724 注销
659 </target> 725 </target>
660 <context-group name="null"> 726 <context-group name="null">
661 <context context-type="linenumber">30</context> 727 <context context-type="linenumber">28</context>
662 </context-group> 728 </context-group>
663 </trans-unit> 729 </trans-unit>
664 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 730 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
665 <source>Create an account</source> 731 <source>Create an account</source>
666 <target>创建å¸æˆ·</target> 732 <target>创建å¸æˆ·</target>
667 <context-group name="null"> 733 <context-group name="null">
668 <context context-type="linenumber">39</context> 734 <context context-type="linenumber">37</context>
669 </context-group> 735 </context-group>
670 </trans-unit> 736 </trans-unit>
671 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 737 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -679,49 +745,49 @@
679 <source>Subscriptions</source> 745 <source>Subscriptions</source>
680 <target>订阅内容</target> 746 <target>订阅内容</target>
681 <context-group name="null"> 747 <context-group name="null">
682 <context context-type="linenumber">47</context> 748 <context context-type="linenumber">45</context>
683 </context-group> 749 </context-group>
684 </trans-unit> 750 </trans-unit>
685 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 751 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
686 <source>Overview</source> 752 <source>Overview</source>
687 <target>总览</target> 753 <target>总览</target>
688 <context-group name="null"> 754 <context-group name="null">
689 <context context-type="linenumber">52</context> 755 <context context-type="linenumber">50</context>
690 </context-group> 756 </context-group>
691 </trans-unit> 757 </trans-unit>
692 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 758 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
693 <source>Trending</source> 759 <source>Trending</source>
694 <target>时下æµè¡Œ</target> 760 <target>时下æµè¡Œ</target>
695 <context-group name="null"> 761 <context-group name="null">
696 <context context-type="linenumber">57</context> 762 <context context-type="linenumber">55</context>
697 </context-group> 763 </context-group>
698 </trans-unit> 764 </trans-unit>
699 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 765 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
700 <source>Recently added</source> 766 <source>Recently added</source>
701 <target>最近添加</target> 767 <target>最近添加</target>
702 <context-group name="null"> 768 <context-group name="null">
703 <context context-type="linenumber">62</context> 769 <context context-type="linenumber">60</context>
704 </context-group> 770 </context-group>
705 </trans-unit> 771 </trans-unit>
706 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 772 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
707 <source>Local</source> 773 <source>Local</source>
708 <target>本地</target> 774 <target>本地</target>
709 <context-group name="null"> 775 <context-group name="null">
710 <context context-type="linenumber">67</context> 776 <context context-type="linenumber">65</context>
711 </context-group> 777 </context-group>
712 </trans-unit> 778 </trans-unit>
713 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 779 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
714 <source>More</source> 780 <source>More</source>
715 <target>更多</target> 781 <target>更多</target>
716 <context-group name="null"> 782 <context-group name="null">
717 <context context-type="linenumber">72</context> 783 <context context-type="linenumber">70</context>
718 </context-group> 784 </context-group>
719 </trans-unit> 785 </trans-unit>
720 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 786 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
721 <source>Administration</source> 787 <source>Administration</source>
722 <target>管ç†</target> 788 <target>管ç†</target>
723 <context-group name="null"> 789 <context-group name="null">
724 <context context-type="linenumber">76</context> 790 <context context-type="linenumber">74</context>
725 </context-group> 791 </context-group>
726 </trans-unit> 792 </trans-unit>
727 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 793 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -735,14 +801,14 @@
735 <source>Show keyboard shortcuts</source> 801 <source>Show keyboard shortcuts</source>
736 <target>显示键盘快æ·é”®</target> 802 <target>显示键盘快æ·é”®</target>
737 <context-group name="null"> 803 <context-group name="null">
738 <context context-type="linenumber">91</context> 804 <context context-type="linenumber">89</context>
739 </context-group> 805 </context-group>
740 </trans-unit> 806 </trans-unit>
741 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 807 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
742 <source>Toggle dark interface</source> 808 <source>Toggle dark interface</source>
743 <target>切æ¢å¤œé—´æ¨¡å¼</target> 809 <target>切æ¢å¤œé—´æ¨¡å¼</target>
744 <context-group name="null"> 810 <context-group name="null">
745 <context context-type="linenumber">94</context> 811 <context context-type="linenumber">92</context>
746 </context-group> 812 </context-group>
747 </trans-unit> 813 </trans-unit>
748 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 814 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -843,11 +909,18 @@
843 <context context-type="linenumber">94</context> 909 <context context-type="linenumber">94</context>
844 </context-group> 910 </context-group>
845 </trans-unit> 911 </trans-unit>
912 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
913 <source>Display unlisted and private videos</source>
914 <target>显示ä¸å…¬å¼€å’Œç§äº«è§†é¢‘</target>
915 <context-group name="null">
916 <context context-type="linenumber">14</context>
917 </context-group>
918 </trans-unit>
846 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 919 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
847 <source>No results.</source> 920 <source>No results.</source>
848 <target>没有结果。</target> 921 <target>没有结果。</target>
849 <context-group name="null"> 922 <context-group name="null">
850 <context context-type="linenumber">7</context> 923 <context context-type="linenumber">20</context>
851 </context-group> 924 </context-group>
852 </trans-unit> 925 </trans-unit>
853 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 926 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -861,6 +934,17 @@
861 <context context-type="linenumber">6</context> 934 <context context-type="linenumber">6</context>
862 </context-group> 935 </context-group>
863 </trans-unit> 936 </trans-unit>
937 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
938 <source>
939 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
940 </source>
941 <target>
942 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
943 </target>
944 <context-group name="null">
945 <context context-type="linenumber">14</context>
946 </context-group>
947 </trans-unit>
864 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 948 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
865 <source> 949 <source>
866 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 950 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -884,7 +968,7 @@
884 <source>Instance</source> 968 <source>Instance</source>
885 <target>实例</target> 969 <target>实例</target>
886 <context-group name="null"> 970 <context-group name="null">
887 <context context-type="linenumber">8</context> 971 <context context-type="linenumber">12</context>
888 </context-group> 972 </context-group>
889 </trans-unit> 973 </trans-unit>
890 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 974 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -894,15 +978,22 @@
894 <context context-type="linenumber">7</context> 978 <context context-type="linenumber">7</context>
895 </context-group> 979 </context-group>
896 </trans-unit> 980 </trans-unit>
897 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 981 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
898 <source> 982 <source>
899 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 983 Cancel
900</source> 984 </source>
901 <target> 985 <target>
902 关于实例 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 986 å–消
903</target> 987 </target>
904 <context-group name="null"> 988 <context-group name="null">
905 <context context-type="linenumber">1</context> 989 <context context-type="linenumber">26</context>
990 </context-group>
991 </trans-unit>
992 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
993 <source>Submit</source>
994 <target>æ交</target>
995 <context-group name="null">
996 <context context-type="linenumber">31</context>
906 </context-group> 997 </context-group>
907 </trans-unit> 998 </trans-unit>
908 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 999 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -916,47 +1007,14 @@
916 <source>Terms</source> 1007 <source>Terms</source>
917 <target>æ¡æ¬¾</target> 1008 <target>æ¡æ¬¾</target>
918 <context-group name="null"> 1009 <context-group name="null">
919 <context context-type="linenumber">44</context> 1010 <context context-type="linenumber">39</context>
920 </context-group> 1011 </context-group>
921 </trans-unit> 1012 </trans-unit>
922 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1013 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
923 <source>User registration is allowed and</source> 1014 <source>User registration is allowed and</source>
924 <target>当å‰å¼€æ”¾æ³¨å†Œï¼Œå¹¶ä¸”</target> 1015 <target>当å‰å¼€æ”¾æ³¨å†Œï¼Œå¹¶ä¸”</target>
925 <context-group name="null"> 1016 <context-group name="null">
926 <context context-type="linenumber">25</context> 1017 <context context-type="linenumber">29</context>
927 </context-group>
928 </trans-unit>
929 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
930 <source>
931 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
932 </source>
933 <target>
934 本实例为用户上传的视频æä¾› <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 的基本存储空间。
935 </target>
936 <context-group name="null">
937 <context context-type="linenumber">27</context>
938 </context-group>
939 </trans-unit>
940 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
941 <source>
942 this instance provides unlimited space for the videos of its users.
943 </source>
944 <target>
945 本实例为用户上传的视频æ供无é™åˆ¶çš„存储空间。
946 </target>
947 <context-group name="null">
948 <context context-type="linenumber">31</context>
949 </context-group>
950 </trans-unit>
951 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
952 <source>
953 User registration is currently not allowed.
954 </source>
955 <target>
956 当å‰ä¸å¼€æ”¾æ³¨å†Œã€‚
957 </target>
958 <context-group name="null">
959 <context context-type="linenumber">36</context>
960 </context-group> 1018 </context-group>
961 </trans-unit> 1019 </trans-unit>
962 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1020 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1175,13 +1233,13 @@
1175 <context context-type="linenumber">83</context> 1233 <context context-type="linenumber">83</context>
1176 </context-group> 1234 </context-group>
1177 </trans-unit> 1235 </trans-unit>
1178 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1236 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1179 <source> 1237 <source>
1180 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1238 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1181 In the meantime, we want to test different ideas related to this issue: 1239 In the meantime, we want to test different ideas related to this issue:
1182 </source> 1240 </source>
1183 <target> 1241 <target>
1184 PeerTube ç›®å‰å°šå¤„于测试阶段,我们会努力在稳定版å‘布之å‰æ‰¾åˆ°æœ€å¥½çš„å制策略。 1242 PeerTube ç›®å‰å°šå¤„于早期开å‘阶段,我们会努力在稳定版å‘布之å‰æ‰¾åˆ°æœ€å¥½çš„å制策略。
1185 ç›®å‰ï¼Œæˆ‘们正在å°è¯•å¦‚下方案: 1243 ç›®å‰ï¼Œæˆ‘们正在å°è¯•å¦‚下方案:
1186 </target> 1244 </target>
1187 <context-group name="null"> 1245 <context-group name="null">
@@ -1223,18 +1281,53 @@
1223 <context context-type="linenumber">95</context> 1281 <context context-type="linenumber">95</context>
1224 </context-group> 1282 </context-group>
1225 </trans-unit> 1283 </trans-unit>
1284 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1285 <source>Banned</source>
1286 <target>å·²å°ç¦</target>
1287 <context-group name="null">
1288 <context context-type="linenumber">12</context>
1289 </context-group>
1290 </trans-unit>
1291 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1292 <source>Muted</source>
1293 <target>å·²å±è”½</target>
1294 <context-group name="null">
1295 <context context-type="linenumber">13</context>
1296 </context-group>
1297 </trans-unit>
1298 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1299 <source>Muted by your instance</source>
1300 <target>已被您的实例å±è”½</target>
1301 <context-group name="null">
1302 <context context-type="linenumber">14</context>
1303 </context-group>
1304 </trans-unit>
1305 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1306 <source>Instance muted</source>
1307 <target>å·²å±è”½å®žä¾‹</target>
1308 <context-group name="null">
1309 <context context-type="linenumber">15</context>
1310 </context-group>
1311 </trans-unit>
1312 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1313 <source>Instance muted by your instance</source>
1314 <target>已被您的实例å±è”½çš„实例</target>
1315 <context-group name="null">
1316 <context context-type="linenumber">16</context>
1317 </context-group>
1318 </trans-unit>
1226 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1319 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1227 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1320 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1228 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> ä½è®¢é˜…者</target> 1321 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> ä½è®¢é˜…者</target>
1229 <context-group name="null"> 1322 <context-group name="null">
1230 <context context-type="linenumber">12</context> 1323 <context context-type="linenumber">24</context>
1231 </context-group> 1324 </context-group>
1232 </trans-unit> 1325 </trans-unit>
1233 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1326 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1234 <source>Video channels</source> 1327 <source>Video channels</source>
1235 <target>视频频é“</target> 1328 <target>视频频é“</target>
1236 <context-group name="null"> 1329 <context-group name="null">
1237 <context context-type="linenumber">19</context> 1330 <context context-type="linenumber">31</context>
1238 </context-group> 1331 </context-group>
1239 </trans-unit> 1332 </trans-unit>
1240 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1333 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1276,49 +1369,49 @@
1276 <source>Short description</source> 1369 <source>Short description</source>
1277 <target>简介</target> 1370 <target>简介</target>
1278 <context-group name="null"> 1371 <context-group name="null">
1279 <context context-type="linenumber">22</context> 1372 <context context-type="linenumber">21</context>
1280 </context-group> 1373 </context-group>
1281 </trans-unit> 1374 </trans-unit>
1282 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1375 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1283 <source>Default client route</source> 1376 <source>Default client route</source>
1284 <target>首页默认内容</target> 1377 <target>首页默认内容</target>
1285 <context-group name="null"> 1378 <context-group name="null">
1286 <context context-type="linenumber">55</context> 1379 <context context-type="linenumber">48</context>
1287 </context-group> 1380 </context-group>
1288 </trans-unit> 1381 </trans-unit>
1289 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1382 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1290 <source>Videos Overview</source> 1383 <source>Videos Overview</source>
1291 <target>视频总览</target> 1384 <target>视频总览</target>
1292 <context-group name="null"> 1385 <context-group name="null">
1293 <context context-type="linenumber">58</context> 1386 <context context-type="linenumber">51</context>
1294 </context-group> 1387 </context-group>
1295 </trans-unit> 1388 </trans-unit>
1296 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1389 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1297 <source>Videos Trending</source> 1390 <source>Videos Trending</source>
1298 <target>时下æµè¡Œçš„视频</target> 1391 <target>时下æµè¡Œçš„视频</target>
1299 <context-group name="null"> 1392 <context-group name="null">
1300 <context context-type="linenumber">59</context> 1393 <context context-type="linenumber">52</context>
1301 </context-group> 1394 </context-group>
1302 </trans-unit> 1395 </trans-unit>
1303 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1396 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1304 <source>Videos Recently Added</source> 1397 <source>Videos Recently Added</source>
1305 <target>最近添加的视频</target> 1398 <target>最近添加的视频</target>
1306 <context-group name="null"> 1399 <context-group name="null">
1307 <context context-type="linenumber">60</context> 1400 <context context-type="linenumber">53</context>
1308 </context-group> 1401 </context-group>
1309 </trans-unit> 1402 </trans-unit>
1310 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1403 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1311 <source>Local videos</source> 1404 <source>Local videos</source>
1312 <target>本地视频</target> 1405 <target>本地视频</target>
1313 <context-group name="null"> 1406 <context-group name="null">
1314 <context context-type="linenumber">61</context> 1407 <context context-type="linenumber">54</context>
1315 </context-group> 1408 </context-group>
1316 </trans-unit> 1409 </trans-unit>
1317 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1410 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1318 <source>Policy on videos containing sensitive content</source> 1411 <source>Policy on videos containing sensitive content</source>
1319 <target>针对包å«æ•æ„Ÿå†…容视频的策略</target> 1412 <target>针对包å«æ•æ„Ÿå†…容视频的策略</target>
1320 <context-group name="null"> 1413 <context-group name="null">
1321 <context context-type="linenumber">70</context> 1414 <context context-type="linenumber">61</context>
1322 </context-group> 1415 </context-group>
1323 </trans-unit> 1416 </trans-unit>
1324 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1417 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1353,21 +1446,42 @@
1353 <source>Signup enabled</source> 1446 <source>Signup enabled</source>
1354 <target>开放注册</target> 1447 <target>开放注册</target>
1355 <context-group name="null"> 1448 <context-group name="null">
1356 <context context-type="linenumber">92</context> 1449 <context context-type="linenumber">84</context>
1357 </context-group> 1450 </context-group>
1358 </trans-unit> 1451 </trans-unit>
1359 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1452 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1360 <source>Signup requires email verification</source> 1453 <source>Signup requires email verification</source>
1361 <target>注册需è¦éªŒè¯ç”µå­é‚®ä»¶åœ°å€</target> 1454 <target>注册需è¦éªŒè¯ç”µå­é‚®ä»¶åœ°å€</target>
1362 <context-group name="null"> 1455 <context-group name="null">
1363 <context context-type="linenumber">97</context> 1456 <context context-type="linenumber">91</context>
1364 </context-group> 1457 </context-group>
1365 </trans-unit> 1458 </trans-unit>
1366 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1459 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1367 <source>Signup limit</source> 1460 <source>Signup limit</source>
1368 <target>注册é™åˆ¶</target> 1461 <target>注册é™åˆ¶</target>
1369 <context-group name="null"> 1462 <context-group name="null">
1370 <context context-type="linenumber">101</context> 1463 <context context-type="linenumber">96</context>
1464 </context-group>
1465 </trans-unit>
1466 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1467 <source>Users</source>
1468 <target>用户</target>
1469 <context-group name="null">
1470 <context context-type="linenumber">105</context>
1471 </context-group>
1472 </trans-unit>
1473 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1474 <source>User default video quota</source>
1475 <target>用户默认视频存储空间大å°</target>
1476 <context-group name="null">
1477 <context context-type="linenumber">109</context>
1478 </context-group>
1479 </trans-unit>
1480 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1481 <source>User default daily upload limit</source>
1482 <target>用户默认å•æ—¥ä¸Šä¼ é™é¢</target>
1483 <context-group name="null">
1484 <context context-type="linenumber">121</context>
1371 </context-group> 1485 </context-group>
1372 </trans-unit> 1486 </trans-unit>
1373 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1487 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1377,53 +1491,32 @@
1377 <context context-type="linenumber">42</context> 1491 <context context-type="linenumber">42</context>
1378 </context-group> 1492 </context-group>
1379 </trans-unit> 1493 </trans-unit>
1380 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1494 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1381 <source>Video import with HTTP enabled</source> 1495 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1382 <target>å…许通过 HTTP 导入视频</target> 1496 <target>å…许通过 HTTP URL(例如 YouTube)导入视频</target>
1383 <context-group name="null"> 1497 <context-group name="null">
1384 <context context-type="linenumber">115</context> 1498 <context context-type="linenumber">141</context>
1385 </context-group> 1499 </context-group>
1386 </trans-unit> 1500 </trans-unit>
1387 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1501 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1388 <source>Video import with a torrent file or a magnet URI enabled</source> 1502 <source>Video import with a torrent file or a magnet URI enabled</source>
1389 <target>å…许通过ç§å­æ–‡ä»¶æˆ–ç£åŠ›é“¾å¯¼å…¥è§†é¢‘</target> 1503 <target>å…许通过ç§å­æ–‡ä»¶æˆ–ç£åŠ›é“¾å¯¼å…¥è§†é¢‘</target>
1390 <context-group name="null"> 1504 <context-group name="null">
1391 <context context-type="linenumber">120</context> 1505 <context context-type="linenumber">148</context>
1392 </context-group> 1506 </context-group>
1393 </trans-unit> 1507 </trans-unit>
1394 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1508 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1395 <source>Administrator</source> 1509 <source>Administrator</source>
1396 <target>管ç†å‘˜</target> 1510 <target>管ç†å‘˜</target>
1397 <context-group name="null"> 1511 <context-group name="null">
1398 <context context-type="linenumber">123</context> 1512 <context context-type="linenumber">155</context>
1399 </context-group> 1513 </context-group>
1400 </trans-unit> 1514 </trans-unit>
1401 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1515 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1402 <source>Admin email</source> 1516 <source>Admin email</source>
1403 <target>管ç†å‘˜ç”µå­é‚®ä»¶åœ°å€</target> 1517 <target>管ç†å‘˜ç”µå­é‚®ä»¶åœ°å€</target>
1404 <context-group name="null"> 1518 <context-group name="null">
1405 <context context-type="linenumber">126</context> 1519 <context context-type="linenumber">158</context>
1406 </context-group>
1407 </trans-unit>
1408 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1409 <source>Users</source>
1410 <target>用户</target>
1411 <context-group name="null">
1412 <context context-type="linenumber">136</context>
1413 </context-group>
1414 </trans-unit>
1415 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1416 <source>User default video quota</source>
1417 <target>用户默认视频存储空间大å°</target>
1418 <context-group name="null">
1419 <context context-type="linenumber">139</context>
1420 </context-group>
1421 </trans-unit>
1422 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1423 <source>User default daily upload limit</source>
1424 <target>用户默认å•æ—¥ä¸Šä¼ é™é¢</target>
1425 <context-group name="null">
1426 <context context-type="linenumber">153</context>
1427 </context-group> 1520 </context-group>
1428 </trans-unit> 1521 </trans-unit>
1429 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1522 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1437,81 +1530,70 @@
1437 <source>Twitter</source> 1530 <source>Twitter</source>
1438 <target>Twitter</target> 1531 <target>Twitter</target>
1439 <context-group name="null"> 1532 <context-group name="null">
1440 <context context-type="linenumber">170</context> 1533 <context context-type="linenumber">178</context>
1441 </context-group> 1534 </context-group>
1442 </trans-unit> 1535 </trans-unit>
1443 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1536 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1444 <source>Your Twitter username</source> 1537 <source>Your Twitter username</source>
1445 <target>您的 Twitter 用户å</target> 1538 <target>您的 Twitter 用户å</target>
1446 <context-group name="null"> 1539 <context-group name="null">
1447 <context context-type="linenumber">173</context> 1540 <context context-type="linenumber">184</context>
1448 </context-group> 1541 </context-group>
1449 </trans-unit> 1542 </trans-unit>
1450 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1543 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1451 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1544 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1452 <target>显示此内容所在的å‘布平å°å¯¹åº”çš„ Twitter å¸æˆ·ã€‚</target> 1545 <target>显示此内容所在的å‘布平å°å¯¹åº”çš„ Twitter å¸æˆ·ã€‚</target>
1453 <context-group name="null"> 1546 <context-group name="null">
1454 <context context-type="linenumber">176</context> 1547 <context context-type="linenumber">187</context>
1455 </context-group> 1548 </context-group>
1456 </trans-unit> 1549 </trans-unit>
1457 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1550 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1458 <source>Instance whitelisted by Twitter</source> 1551 <source>Instance whitelisted by Twitter</source>
1459 <target>实例已进入 Twitter 白åå•</target> 1552 <target>实例已进入 Twitter 白åå•</target>
1460 <context-group name="null"> 1553 <context-group name="null">
1461 <context context-type="linenumber">189</context> 1554 <context context-type="linenumber">199</context>
1462 </context-group>
1463 </trans-unit>
1464 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1465 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1466 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1467 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1468 <target>如果您的实例进入了 Twitter 的白åå•ï¼Œåˆ™åˆ†äº« PeerTube 视频时会在 Twitter 时间线上展示嵌入播放器。&lt;br /&gt;
1469 如果实例没有进入白åå•ï¼Œåˆ™ä¼šå±•ç¤ºä¸€ä¸ªå¸¦å›¾ç‰‡çš„å¡ç‰‡é“¾æŽ¥ï¼Œç‚¹å‡»å³å¯è·³è½¬è‡³ PeerTube 实例播放。&lt;br /&gt;&lt;br /&gt;
1470 您å¯ä»¥å‹¾é€‰æ­¤é€‰é¡¹æ¡†ï¼Œä¿å­˜é…置并在 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; 使用您实例上的一个视频 URL(https://example.com/videos/watch/blabla)进行测试,以确定实例是å¦å·²è¿›å…¥ç™½åå•ã€‚</target>
1471 <context-group name="null">
1472 <context context-type="linenumber">190</context>
1473 </context-group> 1555 </context-group>
1474 </trans-unit> 1556 </trans-unit>
1475 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1557 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1476 <source>Services</source> 1558 <source>Services</source>
1477 <target>æœåŠ¡</target> 1559 <target>æœåŠ¡</target>
1478 <context-group name="null"> 1560 <context-group name="null">
1479 <context context-type="linenumber">168</context> 1561 <context context-type="linenumber">176</context>
1480 </context-group> 1562 </context-group>
1481 </trans-unit> 1563 </trans-unit>
1482 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1564 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1483 <source>Transcoding</source> 1565 <source>Transcoding</source>
1484 <target>转ç </target> 1566 <target>转ç </target>
1485 <context-group name="null"> 1567 <context-group name="null">
1486 <context context-type="linenumber">200</context> 1568 <context context-type="linenumber">215</context>
1487 </context-group> 1569 </context-group>
1488 </trans-unit> 1570 </trans-unit>
1489 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1571 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1490 <source>Transcoding enabled</source> 1572 <source>Transcoding enabled</source>
1491 <target>å¯ç”¨è½¬ç </target> 1573 <target>å¯ç”¨è½¬ç </target>
1492 <context-group name="null"> 1574 <context-group name="null">
1493 <context context-type="linenumber">204</context> 1575 <context context-type="linenumber">221</context>
1494 </context-group> 1576 </context-group>
1495 </trans-unit> 1577 </trans-unit>
1496 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1578 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1497 <source>If you disable transcoding, many videos from your users will not work!</source> 1579 <source>If you disable transcoding, many videos from your users will not work!</source>
1498 <target>如果ç¦ç”¨è½¬ç ï¼Œç”¨æˆ·ä¸Šä¼ çš„视频很有å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ï¼</target> 1580 <target>如果ç¦ç”¨è½¬ç ï¼Œç”¨æˆ·ä¸Šä¼ çš„视频很有å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ï¼</target>
1499 <context-group name="null"> 1581 <context-group name="null">
1500 <context context-type="linenumber">205</context> 1582 <context context-type="linenumber">222</context>
1501 </context-group> 1583 </context-group>
1502 </trans-unit> 1584 </trans-unit>
1503 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1585 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1504 <source>Transcoding threads</source> 1586 <source>Transcoding threads</source>
1505 <target>转ç çº¿ç¨‹æ•°</target> 1587 <target>转ç çº¿ç¨‹æ•°</target>
1506 <context-group name="null"> 1588 <context-group name="null">
1507 <context context-type="linenumber">211</context> 1589 <context context-type="linenumber">237</context>
1508 </context-group> 1590 </context-group>
1509 </trans-unit> 1591 </trans-unit>
1510 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1592 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1511 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1593 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1512 <target>å¯ç”¨ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 分辨率</target> 1594 <target>å¯ç”¨ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 分辨率</target>
1513 <context-group name="null"> 1595 <context-group name="null">
1514 <context context-type="linenumber">227</context> 1596 <context context-type="linenumber">252</context>
1515 </context-group> 1597 </context-group>
1516 </trans-unit> 1598 </trans-unit>
1517 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1599 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1526,105 +1608,70 @@
1526 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1608 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1527 </target> 1609 </target>
1528 <context-group name="null"> 1610 <context-group name="null">
1529 <context context-type="linenumber">233</context> 1611 <context context-type="linenumber">260</context>
1530 </context-group> 1612 </context-group>
1531 </trans-unit> 1613 </trans-unit>
1532 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1614 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1533 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1615 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1534 <target>部分文件ä¸ä¼šè‡ªåŠ¨åŒæ­¥ï¼ˆå¦‚预览图ã€å­—幕)。我们会直接从æºå®žä¾‹æ‹‰å–并进行缓存。</target> 1616 <target>部分文件ä¸ä¼šè‡ªåŠ¨åŒæ­¥ï¼ˆå¦‚预览图ã€å­—幕)。我们会直接从æºå®žä¾‹æ‹‰å–并进行缓存。</target>
1535 <context-group name="null"> 1617 <context-group name="null">
1536 <context context-type="linenumber">238</context> 1618 <context context-type="linenumber">265</context>
1537 </context-group> 1619 </context-group>
1538 </trans-unit> 1620 </trans-unit>
1539 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1621 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1540 <source>Previews cache size</source> 1622 <source>Previews cache size</source>
1541 <target>预览图缓存大å°</target> 1623 <target>预览图缓存大å°</target>
1542 <context-group name="null"> 1624 <context-group name="null">
1543 <context context-type="linenumber">243</context> 1625 <context context-type="linenumber">271</context>
1544 </context-group> 1626 </context-group>
1545 </trans-unit> 1627 </trans-unit>
1546 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1628 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1547 <source>Video captions cache size</source> 1629 <source>Video captions cache size</source>
1548 <target>视频字幕缓存大å°</target> 1630 <target>视频字幕缓存大å°</target>
1549 <context-group name="null"> 1631 <context-group name="null">
1550 <context context-type="linenumber">254</context> 1632 <context context-type="linenumber">280</context>
1551 </context-group> 1633 </context-group>
1552 </trans-unit> 1634 </trans-unit>
1553 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1635 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1554 <source>Customizations</source> 1636 <source>Customizations</source>
1555 <target>自定义</target> 1637 <target>自定义</target>
1556 <context-group name="null"> 1638 <context-group name="null">
1557 <context context-type="linenumber">264</context> 1639 <context context-type="linenumber">289</context>
1558 </context-group> 1640 </context-group>
1559 </trans-unit> 1641 </trans-unit>
1560 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1642 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1561 <source>JavaScript</source> 1643 <source>JavaScript</source>
1562 <target>JavaScript</target> 1644 <target>JavaScript</target>
1563 <context-group name="null"> 1645 <context-group name="null">
1564 <context context-type="linenumber">267</context> 1646 <context context-type="linenumber">294</context>
1565 </context-group> 1647 </context-group>
1566 </trans-unit> 1648 </trans-unit>
1567 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1649 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1568 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1650 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1569 <target>在此处直接输入 JavaScript 代ç ã€‚&lt;br /&gt;示例:&lt;pre&gt;console.log('我的实例太棒了');&lt;/pre&gt;</target> 1651 <target>在此处直接输入 JavaScript 代ç ã€‚&lt;br /&gt;示例:&lt;pre&gt;console.log('我的实例太棒了');&lt;/pre&gt;</target>
1570 <context-group name="null"> 1652 <context-group name="null">
1571 <context context-type="linenumber">270</context> 1653 <context context-type="linenumber">297</context>
1572 </context-group>
1573 </trans-unit>
1574 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1575 <source>
1576 Write directly CSS code. Example:&lt;br /&gt;
1577 &lt;pre&gt;
1578 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1579 background-color: red;
1580 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1581 &lt;/pre&gt;
1582
1583 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1584 &lt;pre&gt;
1585 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1586 color: red;
1587 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1588 &lt;/pre&gt;
1589 </source>
1590 <target>
1591 在此处直接输入 CSS 代ç ã€‚示例:&lt;br /&gt;
1592 &lt;pre&gt;
1593 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1594 background-color: red;
1595 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1596 &lt;/pre&gt;
1597
1598 您å¯ä»¥é€šè¿‡æ’å…¥ &lt;em&gt;#custom-css&lt;/em&gt; æ¥è¦†ç›–æ ·å¼è®¾ç½®ã€‚示例:
1599 &lt;pre&gt;
1600 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1601 color: red;
1602 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1603 &lt;/pre&gt;
1604 </target>
1605 <context-group name="null">
1606 <context context-type="linenumber">286</context>
1607 </context-group> 1654 </context-group>
1608 </trans-unit> 1655 </trans-unit>
1609 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1656 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1610 <source>Advanced configuration</source> 1657 <source>Advanced configuration</source>
1611 <target>高级设置</target> 1658 <target>高级设置</target>
1612 <context-group name="null"> 1659 <context-group name="null">
1613 <context context-type="linenumber">197</context> 1660 <context context-type="linenumber">212</context>
1614 </context-group> 1661 </context-group>
1615 </trans-unit> 1662 </trans-unit>
1616 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1663 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1617 <source>Update configuration</source> 1664 <source>Update configuration</source>
1618 <target>更新设置</target> 1665 <target>更新设置</target>
1619 <context-group name="null"> 1666 <context-group name="null">
1620 <context context-type="linenumber">314</context> 1667 <context context-type="linenumber">340</context>
1621 </context-group> 1668 </context-group>
1622 </trans-unit> 1669 </trans-unit>
1623 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1670 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1624 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1671 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1625 <target>设置信æ¯ä¸åˆæ³•ã€‚请检查å„选项å¡ä¸­çš„设置是å¦å­˜åœ¨é”™è¯¯ã€‚</target> 1672 <target>设置信æ¯ä¸åˆæ³•ã€‚请检查å„选项å¡ä¸­çš„设置是å¦å­˜åœ¨é”™è¯¯ã€‚</target>
1626 <context-group name="null"> 1673 <context-group name="null">
1627 <context context-type="linenumber">315</context> 1674 <context context-type="linenumber">341</context>
1628 </context-group> 1675 </context-group>
1629 </trans-unit> 1676 </trans-unit>
1630 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1677 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1707,6 +1754,13 @@
1707 <context context-type="linenumber">21</context> 1754 <context context-type="linenumber">21</context>
1708 </context-group> 1755 </context-group>
1709 </trans-unit> 1756 </trans-unit>
1757 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1758 <source>Filter...</source>
1759 <target>过滤器…</target>
1760 <context-group name="null">
1761 <context context-type="linenumber">27</context>
1762 </context-group>
1763 </trans-unit>
1710 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1764 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1711 <source>ID</source> 1765 <source>ID</source>
1712 <target>ID</target> 1766 <target>ID</target>
@@ -1718,14 +1772,14 @@
1718 <source>Score</source> 1772 <source>Score</source>
1719 <target>评分</target> 1773 <target>评分</target>
1720 <context-group name="null"> 1774 <context-group name="null">
1721 <context context-type="linenumber">8</context> 1775 <context context-type="linenumber">17</context>
1722 </context-group> 1776 </context-group>
1723 </trans-unit> 1777 </trans-unit>
1724 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1778 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1725 <source>Host</source> 1779 <source>Host</source>
1726 <target>主机å</target> 1780 <target>主机å</target>
1727 <context-group name="null"> 1781 <context-group name="null">
1728 <context context-type="linenumber">8</context> 1782 <context context-type="linenumber">19</context>
1729 </context-group> 1783 </context-group>
1730 </trans-unit> 1784 </trans-unit>
1731 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1785 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1746,21 +1800,21 @@
1746 <source>Accepted</source> 1800 <source>Accepted</source>
1747 <target>已接å—</target> 1801 <target>已接å—</target>
1748 <context-group name="null"> 1802 <context-group name="null">
1749 <context context-type="linenumber">21</context> 1803 <context context-type="linenumber">32</context>
1750 </context-group> 1804 </context-group>
1751 </trans-unit> 1805 </trans-unit>
1752 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506"> 1806 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1753 <source>Pending</source> 1807 <source>Pending</source>
1754 <target>等待中</target> 1808 <target>等待中</target>
1755 <context-group name="null"> 1809 <context-group name="null">
1756 <context context-type="linenumber">22</context> 1810 <context context-type="linenumber">33</context>
1757 </context-group> 1811 </context-group>
1758 </trans-unit> 1812 </trans-unit>
1759 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8"> 1813 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1760 <source>Redundancy allowed</source> 1814 <source>Redundancy allowed</source>
1761 <target>å…许冗余备份</target> 1815 <target>å…许冗余备份</target>
1762 <context-group name="null"> 1816 <context-group name="null">
1763 <context context-type="linenumber">11</context> 1817 <context context-type="linenumber">22</context>
1764 </context-group> 1818 </context-group>
1765 </trans-unit> 1819 </trans-unit>
1766 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1820 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
@@ -1851,7 +1905,7 @@
1851 <source>Role</source> 1905 <source>Role</source>
1852 <target>角色</target> 1906 <target>角色</target>
1853 <context-group name="null"> 1907 <context-group name="null">
1854 <context context-type="linenumber">20</context> 1908 <context context-type="linenumber">43</context>
1855 </context-group> 1909 </context-group>
1856 </trans-unit> 1910 </trans-unit>
1857 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1911 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1874,38 +1928,6 @@
1874 <context context-type="linenumber">72</context> 1928 <context context-type="linenumber">72</context>
1875 </context-group> 1929 </context-group>
1876 </trans-unit> 1930 </trans-unit>
1877 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33">
1878 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source>
1879 <target>å°ç¦ <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target>
1880 <context-group name="null">
1881 <context context-type="linenumber">3</context>
1882 </context-group>
1883 </trans-unit>
1884 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
1885 <source>Reason...</source>
1886 <target>原因...</target>
1887 <context-group name="null">
1888 <context context-type="linenumber">11</context>
1889 </context-group>
1890 </trans-unit>
1891 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
1892 <source>
1893 A banned user will no longer be able to login.
1894 </source>
1895 <target>
1896 被å°ç¦çš„用户将无法登录。
1897 </target>
1898 <context-group name="null">
1899 <context context-type="linenumber">17</context>
1900 </context-group>
1901 </trans-unit>
1902 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
1903 <source>Ban this user</source>
1904 <target>å°ç¦æ­¤ç”¨æˆ·</target>
1905 <context-group name="null">
1906 <context context-type="linenumber">25</context>
1907 </context-group>
1908 </trans-unit>
1909 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1931 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1910 <source>Users list</source> 1932 <source>Users list</source>
1911 <target>用户列表</target> 1933 <target>用户列表</target>
@@ -1913,25 +1935,39 @@
1913 <context context-type="linenumber">2</context> 1935 <context context-type="linenumber">2</context>
1914 </context-group> 1936 </context-group>
1915 </trans-unit> 1937 </trans-unit>
1938 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1939 <source>Batch actions</source>
1940 <target>批é‡æ“作</target>
1941 <context-group name="null">
1942 <context context-type="linenumber">19</context>
1943 </context-group>
1944 </trans-unit>
1916 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1945 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1917 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1946 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1918 <target>用户å <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1947 <target>用户å <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1919 <context-group name="null"> 1948 <context-group name="null">
1920 <context context-type="linenumber">17</context> 1949 <context context-type="linenumber">40</context>
1921 </context-group> 1950 </context-group>
1922 </trans-unit> 1951 </trans-unit>
1923 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1952 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1924 <source>Actions</source> 1953 <source>(banned)</source>
1925 <target>æ“作</target> 1954 <target>(已å°ç¦ï¼‰</target>
1926 <context-group name="null"> 1955 <context-group name="null">
1927 <context context-type="linenumber">33</context> 1956 <context context-type="linenumber">65</context>
1957 </context-group>
1958 </trans-unit>
1959 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1960 <source>Go to the account page</source>
1961 <target>转到å¸æˆ·é¡µé¢</target>
1962 <context-group name="null">
1963 <context context-type="linenumber">133</context>
1928 </context-group> 1964 </context-group>
1929 </trans-unit> 1965 </trans-unit>
1930 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1966 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1931 <source>Ban reason:</source> 1967 <source>Ban reason:</source>
1932 <target>å°ç¦ç†ç”±ï¼š</target> 1968 <target>å°ç¦ç†ç”±ï¼š</target>
1933 <context-group name="null"> 1969 <context-group name="null">
1934 <context context-type="linenumber">51</context> 1970 <context context-type="linenumber">95</context>
1935 </context-group> 1971 </context-group>
1936 </trans-unit> 1972 </trans-unit>
1937 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1973 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1994,6 +2030,13 @@
1994 <context context-type="linenumber">33</context> 2030 <context context-type="linenumber">33</context>
1995 </context-group> 2031 </context-group>
1996 </trans-unit> 2032 </trans-unit>
2033 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2034 <source>Actions</source>
2035 <target>æ“作</target>
2036 <context-group name="null">
2037 <context context-type="linenumber">35</context>
2038 </context-group>
2039 </trans-unit>
1997 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2040 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1998 <source>Reason:</source> 2041 <source>Reason:</source>
1999 <target>ç†ç”±ï¼š</target> 2042 <target>ç†ç”±ï¼š</target>
@@ -2026,14 +2069,14 @@
2026 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2069 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2027 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2070 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2028 <context-group name="null"> 2071 <context-group name="null">
2029 <context context-type="linenumber">10</context> 2072 <context context-type="linenumber">11</context>
2030 </context-group> 2073 </context-group>
2031 </trans-unit> 2074 </trans-unit>
2032 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2075 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2033 <source>Blacklist reason:</source> 2076 <source>Blacklist reason:</source>
2034 <target>黑åå•ç†ç”±ï¼š</target> 2077 <target>黑åå•ç†ç”±ï¼š</target>
2035 <context-group name="null"> 2078 <context-group name="null">
2036 <context context-type="linenumber">41</context> 2079 <context context-type="linenumber">43</context>
2037 </context-group> 2080 </context-group>
2038 </trans-unit> 2081 </trans-unit>
2039 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2082 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2057,53 +2100,39 @@
2057 <context context-type="linenumber">7</context> 2100 <context context-type="linenumber">7</context>
2058 </context-group> 2101 </context-group>
2059 </trans-unit> 2102 </trans-unit>
2060 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2103 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
2061 <source>My settings</source> 2104 <source>Muted accounts</source>
2062 <target>我的设置</target> 2105 <target>å·²å±è”½çš„å¸æˆ·</target>
2063 <context-group name="null"> 2106 <context-group name="null">
2064 <context context-type="linenumber">3</context> 2107 <context context-type="linenumber">2</context>
2065 </context-group> 2108 </context-group>
2066 </trans-unit> 2109 </trans-unit>
2067 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2110 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
2068 <source>My library</source> 2111 <source>Muted servers</source>
2069 <target>我的库</target> 2112 <target>å·²å±è”½çš„实例</target>
2070 <context-group name="null"> 2113 <context-group name="null">
2071 <context context-type="linenumber">7</context> 2114 <context context-type="linenumber">11</context>
2072 </context-group> 2115 </context-group>
2073 </trans-unit> 2116 </trans-unit>
2074 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2117 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2075 <source>My channels</source> 2118 <source>Account</source>
2076 <target>我的频é“</target> 2119 <target>å¸æˆ·</target>
2077 <context-group name="null"> 2120 <context-group name="null">
2078 <context context-type="linenumber">12</context> 2121 <context context-type="linenumber">12</context>
2079 </context-group> 2122 </context-group>
2080 </trans-unit> 2123 </trans-unit>
2081 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2124 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2082 <source>My videos</source> 2125 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2083 <target>我的视频</target> 2126 <target>å±è”½æ—¶é—´ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2084 <context-group name="null"> 2127 <context-group name="null">
2085 <context context-type="linenumber">14</context> 2128 <context context-type="linenumber">13</context>
2086 </context-group>
2087 </trans-unit>
2088 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2089 <source>My subscriptions</source>
2090 <target>我的订阅</target>
2091 <context-group name="null">
2092 <context context-type="linenumber">16</context>
2093 </context-group> 2129 </context-group>
2094 </trans-unit> 2130 </trans-unit>
2095 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed"> 2131 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2096 <source>My imports</source> 2132 <source>Unmute</source>
2097 <target>我的导入</target> 2133 <target>å–æˆå±è”½</target>
2098 <context-group name="null"> 2134 <context-group name="null">
2099 <context context-type="linenumber">18</context> 2135 <context context-type="linenumber">23</context>
2100 </context-group>
2101 </trans-unit>
2102 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2103 <source>Ownership changes</source>
2104 <target>视频转移</target>
2105 <context-group name="null">
2106 <context context-type="linenumber">22</context>
2107 </context-group> 2136 </context-group>
2108 </trans-unit> 2137 </trans-unit>
2109 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2138 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2117,21 +2146,21 @@
2117 <source>Profile</source> 2146 <source>Profile</source>
2118 <target>个人资料</target> 2147 <target>个人资料</target>
2119 <context-group name="null"> 2148 <context-group name="null">
2120 <context context-type="linenumber">8</context> 2149 <context context-type="linenumber">7</context>
2121 </context-group> 2150 </context-group>
2122 </trans-unit> 2151 </trans-unit>
2123 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2152 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2124 <source>Video settings</source> 2153 <source>Video settings</source>
2125 <target>视频设置</target> 2154 <target>视频设置</target>
2126 <context-group name="null"> 2155 <context-group name="null">
2127 <context context-type="linenumber">15</context> 2156 <context context-type="linenumber">16</context>
2128 </context-group> 2157 </context-group>
2129 </trans-unit> 2158 </trans-unit>
2130 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2159 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2131 <source>Danger zone</source> 2160 <source>Danger zone</source>
2132 <target>å±é™©é€‰é¡¹</target> 2161 <target>å±é™©é€‰é¡¹</target>
2133 <context-group name="null"> 2162 <context-group name="null">
2134 <context context-type="linenumber">18</context> 2163 <context context-type="linenumber">19</context>
2135 </context-group> 2164 </context-group>
2136 </trans-unit> 2165 </trans-unit>
2137 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2166 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2159,13 +2188,6 @@
2159 <context context-type="linenumber">35</context> 2188 <context context-type="linenumber">35</context>
2160 </context-group> 2189 </context-group>
2161 </trans-unit> 2190 </trans-unit>
2162 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2163 <source>Submit</source>
2164 <target>æ交</target>
2165 <context-group name="null">
2166 <context context-type="linenumber">24</context>
2167 </context-group>
2168 </trans-unit>
2169 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2191 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2170 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2192 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2171 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target> 2193 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target>
@@ -2325,6 +2347,13 @@ When you will upload a video in this channel, the video support field will be au
2325 <context context-type="linenumber">47</context> 2347 <context context-type="linenumber">47</context>
2326 </context-group> 2348 </context-group>
2327 </trans-unit> 2349 </trans-unit>
2350 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2351 <source>Muted instances</source>
2352 <target>å·²å±è”½çš„实例</target>
2353 <context-group name="null">
2354 <context context-type="linenumber">2</context>
2355 </context-group>
2356 </trans-unit>
2328 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2357 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2329 <source>Change password</source> 2358 <source>Change password</source>
2330 <target>更改密ç </target> 2359 <target>更改密ç </target>
@@ -2332,6 +2361,13 @@ When you will upload a video in this channel, the video support field will be au
2332 <context context-type="linenumber">30</context> 2361 <context context-type="linenumber">30</context>
2333 </context-group> 2362 </context-group>
2334 </trans-unit> 2363 </trans-unit>
2364 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2365 <source>Current password</source>
2366 <target>当å‰å¯†ç </target>
2367 <context-group name="null">
2368 <context context-type="linenumber">7</context>
2369 </context-group>
2370 </trans-unit>
2335 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2371 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2336 <source>New password</source> 2372 <source>New password</source>
2337 <target>新密ç </target> 2373 <target>新密ç </target>
@@ -2353,18 +2389,25 @@ When you will upload a video in this channel, the video support field will be au
2353 <context context-type="linenumber">3</context> 2389 <context context-type="linenumber">3</context>
2354 </context-group> 2390 </context-group>
2355 </trans-unit> 2391 </trans-unit>
2392 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2393 <source>Use WebTorrent to exchange parts of the video with others</source>
2394 <target>使用 WebTorrent 与其他用户交æ¢è§†é¢‘分段</target>
2395 <context-group name="null">
2396 <context context-type="linenumber">21</context>
2397 </context-group>
2398 </trans-unit>
2356 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2399 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2357 <source>Automatically plays video</source> 2400 <source>Automatically plays video</source>
2358 <target>自动播放视频</target> 2401 <target>自动播放视频</target>
2359 <context-group name="null"> 2402 <context-group name="null">
2360 <context context-type="linenumber">20</context> 2403 <context context-type="linenumber">28</context>
2361 </context-group> 2404 </context-group>
2362 </trans-unit> 2405 </trans-unit>
2363 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2406 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2364 <source>Save</source> 2407 <source>Save</source>
2365 <target>ä¿å­˜</target> 2408 <target>ä¿å­˜</target>
2366 <context-group name="null"> 2409 <context-group name="null">
2367 <context context-type="linenumber">23</context> 2410 <context context-type="linenumber">32</context>
2368 </context-group> 2411 </context-group>
2369 </trans-unit> 2412 </trans-unit>
2370 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2413 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2395,6 +2438,13 @@ When you will upload a video in this channel, the video support field will be au
2395 <context context-type="linenumber">18</context> 2438 <context context-type="linenumber">18</context>
2396 </context-group> 2439 </context-group>
2397 </trans-unit> 2440 </trans-unit>
2441 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2442 <source>Once you delete your account, there is no going back. Please be certain.</source>
2443 <target>å¸æˆ·ä¸€æ—¦è¢«åˆ é™¤ï¼Œæ‚¨å°†æ— æ³•æ’¤é”€æ­¤æ“作。继续å‰è¯·ç¡®è®¤æ‚¨æ˜¯å¦çœŸçš„想è¦åˆ é™¤å¸æˆ·ã€‚</target>
2444 <context-group name="null">
2445 <context context-type="linenumber">2</context>
2446 </context-group>
2447 </trans-unit>
2398 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2448 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2399 <source>Delete your account</source> 2449 <source>Delete your account</source>
2400 <target>删除您的å¸æˆ·</target> 2450 <target>删除您的å¸æˆ·</target>
@@ -2517,7 +2567,7 @@ When you will upload a video in this channel, the video support field will be au
2517 æˆåŠŸï¼å°†ä¼šå¯¼å…¥ <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> 中的视频。现在您å¯ä»¥å¡«å†™å…³äºŽæ­¤è§†é¢‘çš„ä¿¡æ¯äº†ã€‚ 2567 æˆåŠŸï¼å°†ä¼šå¯¼å…¥ <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> 中的视频。现在您å¯ä»¥å¡«å†™å…³äºŽæ­¤è§†é¢‘çš„ä¿¡æ¯äº†ã€‚
2518</target> 2568</target>
2519 <context-group name="null"> 2569 <context-group name="null">
2520 <context context-type="linenumber">40</context> 2570 <context context-type="linenumber">46</context>
2521 </context-group> 2571 </context-group>
2522 </trans-unit> 2572 </trans-unit>
2523 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2573 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2545,14 +2595,14 @@ When you will upload a video in this channel, the video support field will be au
2545 <source>Publish will be available when upload is finished</source> 2595 <source>Publish will be available when upload is finished</source>
2546 <target>上传完毕åŽå³å¯å‘布</target> 2596 <target>上传完毕åŽå³å¯å‘布</target>
2547 <context-group name="null"> 2597 <context-group name="null">
2548 <context context-type="linenumber">48</context> 2598 <context context-type="linenumber">58</context>
2549 </context-group> 2599 </context-group>
2550 </trans-unit> 2600 </trans-unit>
2551 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2601 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2552 <source>Publish</source> 2602 <source>Publish</source>
2553 <target>å‘布</target> 2603 <target>å‘布</target>
2554 <context-group name="null"> 2604 <context-group name="null">
2555 <context context-type="linenumber">55</context> 2605 <context context-type="linenumber">65</context>
2556 </context-group> 2606 </context-group>
2557 </trans-unit> 2607 </trans-unit>
2558 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2608 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2562,6 +2612,13 @@ When you will upload a video in this channel, the video support field will be au
2562 <context context-type="linenumber">6</context> 2612 <context context-type="linenumber">6</context>
2563 </context-group> 2613 </context-group>
2564 </trans-unit> 2614 </trans-unit>
2615 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2616 <source>Or</source>
2617 <target>或者</target>
2618 <context-group name="null">
2619 <context context-type="linenumber">11</context>
2620 </context-group>
2621 </trans-unit>
2565 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2622 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2566 <source>Paste magnet URI</source> 2623 <source>Paste magnet URI</source>
2567 <target>粘贴ç£åŠ›é“¾</target> 2624 <target>粘贴ç£åŠ›é“¾</target>
@@ -2584,7 +2641,7 @@ When you will upload a video in this channel, the video support field will be au
2584 æˆåŠŸï¼æ­¤è§†é¢‘将会通过ç§å­å¯¼å…¥ã€‚现在您å¯ä»¥å¡«å†™å…³äºŽæ­¤è§†é¢‘çš„ä¿¡æ¯äº†ã€‚ 2641 æˆåŠŸï¼æ­¤è§†é¢‘将会通过ç§å­å¯¼å…¥ã€‚现在您å¯ä»¥å¡«å†™å…³äºŽæ­¤è§†é¢‘çš„ä¿¡æ¯äº†ã€‚
2585</target> 2642</target>
2586 <context-group name="null"> 2643 <context-group name="null">
2587 <context context-type="linenumber">48</context> 2644 <context context-type="linenumber">53</context>
2588 </context-group> 2645 </context-group>
2589 </trans-unit> 2646 </trans-unit>
2590 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2647 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2675,6 +2732,20 @@ When you will upload a video in this channel, the video support field will be au
2675 <context context-type="linenumber">18</context> 2732 <context context-type="linenumber">18</context>
2676 </context-group> 2733 </context-group>
2677 </trans-unit> 2734 </trans-unit>
2735 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2736 <source>+ Tag</source>
2737 <target>+ 标签</target>
2738 <context-group name="null">
2739 <context context-type="linenumber">21</context>
2740 </context-group>
2741 </trans-unit>
2742 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2743 <source>Enter a new tag</source>
2744 <target>输入新的标签</target>
2745 <context-group name="null">
2746 <context context-type="linenumber">21</context>
2747 </context-group>
2748 </trans-unit>
2678 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2749 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2679 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2750 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2680 <target>视频说明默认åªå±•ç¤ºä¸€éƒ¨åˆ†ï¼Œç”¨æˆ·éœ€è¦æ‰‹åŠ¨å±•å¼€æ‰èƒ½æ˜¾ç¤ºå®Œæ•´å†…容。</target> 2751 <target>视频说明默认åªå±•ç¤ºä¸€éƒ¨åˆ†ï¼Œç”¨æˆ·éœ€è¦æ‰‹åŠ¨å±•å¼€æ‰èƒ½æ˜¾ç¤ºå®Œæ•´å†…容。</target>
@@ -2714,14 +2785,14 @@ When you will upload a video in this channel, the video support field will be au
2714 <source>Wait transcoding before publishing the video</source> 2785 <source>Wait transcoding before publishing the video</source>
2715 <target>等待转ç å®Œæ¯•åŽå†å‘布视频</target> 2786 <target>等待转ç å®Œæ¯•åŽå†å‘布视频</target>
2716 <context-group name="null"> 2787 <context-group name="null">
2717 <context context-type="linenumber">130</context> 2788 <context context-type="linenumber">131</context>
2718 </context-group> 2789 </context-group>
2719 </trans-unit> 2790 </trans-unit>
2720 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2791 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2721 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2792 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2722 <target>如果您选择ä¸ç­‰å¾…转ç å°±å‘布视频,则视频在转ç å®Œæ¯•å‰å¾ˆæœ‰å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ã€‚</target> 2793 <target>如果您选择ä¸ç­‰å¾…转ç å°±å‘布视频,则视频在转ç å®Œæ¯•å‰å¾ˆæœ‰å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ã€‚</target>
2723 <context-group name="null"> 2794 <context-group name="null">
2724 <context context-type="linenumber">131</context> 2795 <context context-type="linenumber">132</context>
2725 </context-group> 2796 </context-group>
2726 </trans-unit> 2797 </trans-unit>
2727 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2798 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2735,49 +2806,49 @@ When you will upload a video in this channel, the video support field will be au
2735 <source>Add another caption</source> 2806 <source>Add another caption</source>
2736 <target>添加字幕</target> 2807 <target>添加字幕</target>
2737 <context-group name="null"> 2808 <context-group name="null">
2738 <context context-type="linenumber">146</context> 2809 <context context-type="linenumber">147</context>
2739 </context-group> 2810 </context-group>
2740 </trans-unit> 2811 </trans-unit>
2741 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2812 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2742 <source>See the subtitle file</source> 2813 <source>See the subtitle file</source>
2743 <target>查看字幕文件</target> 2814 <target>查看字幕文件</target>
2744 <context-group name="null"> 2815 <context-group name="null">
2745 <context context-type="linenumber">155</context> 2816 <context context-type="linenumber">156</context>
2746 </context-group> 2817 </context-group>
2747 </trans-unit> 2818 </trans-unit>
2748 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2819 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2749 <source>Already uploaded ✔</source> 2820 <source>Already uploaded ✔</source>
2750 <target>已上传 ✔</target> 2821 <target>已上传 ✔</target>
2751 <context-group name="null"> 2822 <context-group name="null">
2752 <context context-type="linenumber">159</context> 2823 <context context-type="linenumber">160</context>
2753 </context-group> 2824 </context-group>
2754 </trans-unit> 2825 </trans-unit>
2755 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2826 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2756 <source>Will be created on update</source> 2827 <source>Will be created on update</source>
2757 <target>将在更新时创建</target> 2828 <target>将在更新时创建</target>
2758 <context-group name="null"> 2829 <context-group name="null">
2759 <context context-type="linenumber">167</context> 2830 <context context-type="linenumber">168</context>
2760 </context-group> 2831 </context-group>
2761 </trans-unit> 2832 </trans-unit>
2762 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2833 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2763 <source>Cancel create</source> 2834 <source>Cancel create</source>
2764 <target>å–消创建</target> 2835 <target>å–消创建</target>
2765 <context-group name="null"> 2836 <context-group name="null">
2766 <context context-type="linenumber">169</context> 2837 <context context-type="linenumber">170</context>
2767 </context-group> 2838 </context-group>
2768 </trans-unit> 2839 </trans-unit>
2769 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2840 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2770 <source>Will be deleted on update</source> 2841 <source>Will be deleted on update</source>
2771 <target>将在更新时删除</target> 2842 <target>将在更新时删除</target>
2772 <context-group name="null"> 2843 <context-group name="null">
2773 <context context-type="linenumber">175</context> 2844 <context context-type="linenumber">176</context>
2774 </context-group> 2845 </context-group>
2775 </trans-unit> 2846 </trans-unit>
2776 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2847 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2777 <source>Cancel deletion</source> 2848 <source>Cancel deletion</source>
2778 <target>å–消删除</target> 2849 <target>å–消删除</target>
2779 <context-group name="null"> 2850 <context-group name="null">
2780 <context context-type="linenumber">177</context> 2851 <context context-type="linenumber">178</context>
2781 </context-group> 2852 </context-group>
2782 </trans-unit> 2853 </trans-unit>
2783 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2854 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2788,28 +2859,28 @@ When you will upload a video in this channel, the video support field will be au
2788 当å‰æ²¡æœ‰å­—幕。 2859 当å‰æ²¡æœ‰å­—幕。
2789 </target> 2860 </target>
2790 <context-group name="null"> 2861 <context-group name="null">
2791 <context context-type="linenumber">182</context> 2862 <context context-type="linenumber">183</context>
2792 </context-group> 2863 </context-group>
2793 </trans-unit> 2864 </trans-unit>
2794 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2865 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2795 <source>Captions</source> 2866 <source>Captions</source>
2796 <target>字幕</target> 2867 <target>字幕</target>
2797 <context-group name="null"> 2868 <context-group name="null">
2798 <context context-type="linenumber">139</context> 2869 <context context-type="linenumber">140</context>
2799 </context-group> 2870 </context-group>
2800 </trans-unit> 2871 </trans-unit>
2801 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2872 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2802 <source>Upload thumbnail</source> 2873 <source>Upload thumbnail</source>
2803 <target>上传缩略图</target> 2874 <target>上传缩略图</target>
2804 <context-group name="null"> 2875 <context-group name="null">
2805 <context context-type="linenumber">195</context> 2876 <context context-type="linenumber">196</context>
2806 </context-group> 2877 </context-group>
2807 </trans-unit> 2878 </trans-unit>
2808 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2879 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2809 <source>Upload preview</source> 2880 <source>Upload preview</source>
2810 <target>上传预览图</target> 2881 <target>上传预览图</target>
2811 <context-group name="null"> 2882 <context-group name="null">
2812 <context context-type="linenumber">202</context> 2883 <context context-type="linenumber">203</context>
2813 </context-group> 2884 </context-group>
2814 </trans-unit> 2885 </trans-unit>
2815 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2886 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2823,14 +2894,14 @@ When you will upload a video in this channel, the video support field will be au
2823 <source>Short text to tell people how they can support you (membership platform...).</source> 2894 <source>Short text to tell people how they can support you (membership platform...).</source>
2824 <target>用一段简短的文字告知观众支æŒæ‚¨çš„频é“的方法(赞助社区等)。</target> 2895 <target>用一段简短的文字告知观众支æŒæ‚¨çš„频é“的方法(赞助社区等)。</target>
2825 <context-group name="null"> 2896 <context-group name="null">
2826 <context context-type="linenumber">209</context> 2897 <context context-type="linenumber">210</context>
2827 </context-group> 2898 </context-group>
2828 </trans-unit> 2899 </trans-unit>
2829 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2900 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2830 <source>Advanced settings</source> 2901 <source>Advanced settings</source>
2831 <target>高级设置</target> 2902 <target>高级设置</target>
2832 <context-group name="null"> 2903 <context-group name="null">
2833 <context context-type="linenumber">190</context> 2904 <context context-type="linenumber">191</context>
2834 </context-group> 2905 </context-group>
2835 </trans-unit> 2906 </trans-unit>
2836 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2907 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2897,17 +2968,6 @@ When you will upload a video in this channel, the video support field will be au
2897 <context context-type="linenumber">3</context> 2968 <context context-type="linenumber">3</context>
2898 </context-group> 2969 </context-group>
2899 </trans-unit> 2970 </trans-unit>
2900 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2901 <source>
2902 Cancel
2903 </source>
2904 <target>
2905 å–消
2906 </target>
2907 <context-group name="null">
2908 <context context-type="linenumber">19</context>
2909 </context-group>
2910 </trans-unit>
2911 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2971 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2912 <source>Share</source> 2972 <source>Share</source>
2913 <target>分享</target> 2973 <target>分享</target>
@@ -3107,13 +3167,6 @@ When you will upload a video in this channel, the video support field will be au
3107 <context context-type="linenumber">134</context> 3167 <context context-type="linenumber">134</context>
3108 </context-group> 3168 </context-group>
3109 </trans-unit> 3169 </trans-unit>
3110 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
3111 <source>Go to the account page</source>
3112 <target>转到å¸æˆ·é¡µé¢</target>
3113 <context-group name="null">
3114 <context context-type="linenumber">133</context>
3115 </context-group>
3116 </trans-unit>
3117 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3170 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3118 <source>Show more</source> 3171 <source>Show more</source>
3119 <target>展开</target> 3172 <target>展开</target>
@@ -3193,25 +3246,18 @@ When you will upload a video in this channel, the video support field will be au
3193 <context context-type="linenumber">3</context> 3246 <context context-type="linenumber">3</context>
3194 </context-group> 3247 </context-group>
3195 </trans-unit> 3248 </trans-unit>
3196 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
3197 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
3198 <target>您å¯ä»¥åœ¨æ‚¨ä½¿ç”¨çš„ PeerTube 实例上使用您的å¸æˆ·å¯¹æ­¤è§†é¢‘进行评论(您需è¦åœ¨æ‚¨çš„实例上找到此视频),或者通过任æ„一个使用 ActivityPub 标准的实例å‘é€è¯„论。以 Mastodon å’Œ Pleroma 为例,您需è¦åœ¨æœç´¢æ¡†ä¸­è¾“å…¥ &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; 并在æœç´¢ç»“果中找到此视频。直接评论功能尚在开å‘中,详情请å‚è§ &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;。</target>
3199 <context-group name="null">
3200 <context context-type="linenumber">8</context>
3201 </context-group>
3202 </trans-unit>
3203 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3249 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3204 <source>No comments.</source> 3250 <source>No comments.</source>
3205 <target>尚无评论。</target> 3251 <target>尚无评论。</target>
3206 <context-group name="null"> 3252 <context-group name="null">
3207 <context context-type="linenumber">18</context> 3253 <context context-type="linenumber">17</context>
3208 </context-group> 3254 </context-group>
3209 </trans-unit> 3255 </trans-unit>
3210 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3256 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3211 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3257 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3212 <target>查看全部 <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> æ¡å›žå¤</target> 3258 <target>查看全部 <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> æ¡å›žå¤</target>
3213 <context-group name="null"> 3259 <context-group name="null">
3214 <context context-type="linenumber">55</context> 3260 <context context-type="linenumber">54</context>
3215 </context-group> 3261 </context-group>
3216 </trans-unit> 3262 </trans-unit>
3217 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3263 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -3222,7 +3268,7 @@ When you will upload a video in this channel, the video support field will be au
3222 评论功能已åœç”¨ã€‚ 3268 评论功能已åœç”¨ã€‚
3223 </target> 3269 </target>
3224 <context-group name="null"> 3270 <context-group name="null">
3225 <context context-type="linenumber">64</context> 3271 <context context-type="linenumber">63</context>
3226 </context-group> 3272 </context-group>
3227 </trans-unit> 3273 </trans-unit>
3228 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3274 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3268,6 +3314,31 @@ When you will upload a video in this channel, the video support field will be au
3268 <context context-type="linenumber">35</context> 3314 <context context-type="linenumber">35</context>
3269 </context-group> 3315 </context-group>
3270 </trans-unit> 3316 </trans-unit>
3317 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3318 <source>
3319 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3320 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3321 from within the software's interface.
3322 </source>
3323 <target>
3324 您也å¯ä»¥ä½¿ç”¨å…¼å®¹ ActivityPub 标准的实例å¸æˆ·å‚与评论。
3325 对于ç»å¤§å¤šæ•°å¹³å°ï¼Œæ‚¨å¯ä»¥åœ¨æœç´¢æ¡†ä¸­è¾“å…¥ URL,然åŽå³å¯åœ¨ç•Œé¢å†…进行评论。
3326 </target>
3327 <context-group name="null">
3328 <context context-type="linenumber">36</context>
3329 </context-group>
3330 </trans-unit>
3331 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3332 <source>
3333 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3334 </source>
3335 <target>
3336 如果您在 Mastodon 或 Pleroma 上有å¸æˆ·ï¼Œæ‚¨å¯ä»¥ç›´æŽ¥åœ¨å¯¹åº”çš„ç•Œé¢ä¸­æ‰“开:
3337 </target>
3338 <context-group name="null">
3339 <context context-type="linenumber">41</context>
3340 </context-group>
3341 </trans-unit>
3271 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3342 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3272 <source>Highlighted comment</source> 3343 <source>Highlighted comment</source>
3273 <target>所è¦æŸ¥çœ‹çš„评论</target> 3344 <target>所è¦æŸ¥çœ‹çš„评论</target>
@@ -3282,13 +3353,6 @@ When you will upload a video in this channel, the video support field will be au
3282 <context context-type="linenumber">14</context> 3353 <context context-type="linenumber">14</context>
3283 </context-group> 3354 </context-group>
3284 </trans-unit> 3355 </trans-unit>
3285 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3286 <source>Error getting about from server</source>
3287 <target>从æœåŠ¡å™¨èŽ·å–关于信æ¯æ—¶å‘生错误</target>
3288 <context-group name="null">
3289 <context context-type="linenumber">1</context>
3290 </context-group>
3291 </trans-unit>
3292 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3356 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3293 <source>No description</source> 3357 <source>No description</source>
3294 <target>没有说明</target> 3358 <target>没有说明</target>
@@ -3352,55 +3416,6 @@ When you will upload a video in this channel, the video support field will be au
3352 <context context-type="linenumber">1</context> 3416 <context context-type="linenumber">1</context>
3353 </context-group> 3417 </context-group>
3354 </trans-unit> 3418 </trans-unit>
3355 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3356 <source>Error</source>
3357 <target>错误</target>
3358 <context-group name="null">
3359 <context context-type="linenumber">1</context>
3360 </context-group>
3361 </trans-unit>
3362 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed">
3363 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source>
3364 <target>您设置了自定义 <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>。</target>
3365 <context-group name="null">
3366 <context context-type="linenumber">1</context>
3367 </context-group>
3368 </trans-unit>
3369 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e">
3370 <source>This could lead to security issues or bugs if you do not understand it. </source>
3371 <target>除éžæ‚¨æ¸…楚自己在åšä»€ä¹ˆï¼Œå¦åˆ™è¿™å¯èƒ½ä¼šé€ æˆå®‰å…¨éšæ‚£æˆ–使网站è¿è¡Œä¸æ­£å¸¸ã€‚</target>
3372 <context-group name="null">
3373 <context context-type="linenumber">1</context>
3374 </context-group>
3375 </trans-unit>
3376 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0">
3377 <source>Are you sure you want to update the configuration?</source>
3378 <target>您确定è¦æ›´æ–°è®¾ç½®å—?</target>
3379 <context-group name="null">
3380 <context context-type="linenumber">1</context>
3381 </context-group>
3382 </trans-unit>
3383 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119">
3384 <source>Please type</source>
3385 <target>请输入</target>
3386 <context-group name="null">
3387 <context context-type="linenumber">1</context>
3388 </context-group>
3389 </trans-unit>
3390 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d">
3391 <source>to confirm.</source>
3392 <target>以确认æ“作。</target>
3393 <context-group name="null">
3394 <context context-type="linenumber">1</context>
3395 </context-group>
3396 </trans-unit>
3397 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3398 <source>Success</source>
3399 <target>æˆåŠŸ</target>
3400 <context-group name="null">
3401 <context context-type="linenumber">1</context>
3402 </context-group>
3403 </trans-unit>
3404 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3419 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3405 <source>Configuration updated.</source> 3420 <source>Configuration updated.</source>
3406 <target>设置已更新。</target> 3421 <target>设置已更新。</target>
@@ -3563,6 +3578,20 @@ When you will upload a video in this channel, the video support field will be au
3563 <context context-type="linenumber">1</context> 3578 <context context-type="linenumber">1</context>
3564 </context-group> 3579 </context-group>
3565 </trans-unit> 3580 </trans-unit>
3581 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3582 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3583 <target>已解除在此实例上对å¸æˆ· <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> çš„å±è”½ã€‚</target>
3584 <context-group name="null">
3585 <context context-type="linenumber">1</context>
3586 </context-group>
3587 </trans-unit>
3588 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3589 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3590 <target>已解除在此实例上对实例 <x id="INTERPOLATION" equiv-text="{{host}}"/> çš„å±è”½ã€‚</target>
3591 <context-group name="null">
3592 <context context-type="linenumber">1</context>
3593 </context-group>
3594 </trans-unit>
3566 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3595 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3567 <source>Comment updated.</source> 3596 <source>Comment updated.</source>
3568 <target>è¿è¥å¤‡æ³¨ä¿¡æ¯å·²æ›´æ–°ã€‚</target> 3597 <target>è¿è¥å¤‡æ³¨ä¿¡æ¯å·²æ›´æ–°ã€‚</target>
@@ -3570,6 +3599,13 @@ When you will upload a video in this channel, the video support field will be au
3570 <context context-type="linenumber">1</context> 3599 <context context-type="linenumber">1</context>
3571 </context-group> 3600 </context-group>
3572 </trans-unit> 3601 </trans-unit>
3602 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3603 <source>Delete this report</source>
3604 <target>删除这æ¡ä¸¾æŠ¥</target>
3605 <context-group name="null">
3606 <context context-type="linenumber">1</context>
3607 </context-group>
3608 </trans-unit>
3573 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3609 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3574 <source>Update moderation comment</source> 3610 <source>Update moderation comment</source>
3575 <target>æ›´æ–°è¿è¥å¤‡æ³¨ä¿¡æ¯</target> 3611 <target>æ›´æ–°è¿è¥å¤‡æ³¨ä¿¡æ¯</target>
@@ -3591,9 +3627,9 @@ When you will upload a video in this channel, the video support field will be au
3591 <context context-type="linenumber">1</context> 3627 <context context-type="linenumber">1</context>
3592 </context-group> 3628 </context-group>
3593 </trans-unit> 3629 </trans-unit>
3594 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3630 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3595 <source>Do you really want to delete this abuse?</source> 3631 <source>Do you really want to delete this abuse report?</source>
3596 <target>您确定è¦åˆ é™¤è¿™æ¡ä¸¾æŠ¥è®°å½•å—?</target> 3632 <target>您确定è¦åˆ é™¤è¿™æ¡ä¸¾æŠ¥æ»¥ç”¨è®°å½•å—?</target>
3597 <context-group name="null"> 3633 <context-group name="null">
3598 <context context-type="linenumber">1</context> 3634 <context context-type="linenumber">1</context>
3599 </context-group> 3635 </context-group>
@@ -3640,20 +3676,6 @@ When you will upload a video in this channel, the video support field will be au
3640 <context context-type="linenumber">1</context> 3676 <context context-type="linenumber">1</context>
3641 </context-group> 3677 </context-group>
3642 </trans-unit> 3678 </trans-unit>
3643 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
3644 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
3645 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> å·²å°ç¦ã€‚</target>
3646 <context-group name="null">
3647 <context context-type="linenumber">1</context>
3648 </context-group>
3649 </trans-unit>
3650 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3651 <source>Ban</source>
3652 <target>å°ç¦</target>
3653 <context-group name="null">
3654 <context context-type="linenumber">1</context>
3655 </context-group>
3656 </trans-unit>
3657 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3679 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3658 <source>Unban</source> 3680 <source>Unban</source>
3659 <target>解除å°ç¦</target> 3681 <target>解除å°ç¦</target>
@@ -3668,16 +3690,16 @@ When you will upload a video in this channel, the video support field will be au
3668 <context context-type="linenumber">1</context> 3690 <context context-type="linenumber">1</context>
3669 </context-group> 3691 </context-group>
3670 </trans-unit> 3692 </trans-unit>
3671 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 3693 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3672 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 3694 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3673 <target>您确定è¦è§£é™¤å¯¹ <x id="INTERPOLATION" equiv-text="{{username}}"/> çš„å°ç¦å—?</target> 3695 <target>您确定è¦è§£é™¤å¯¹ <x id="INTERPOLATION" equiv-text="{{num}}"/> 个用户的å°ç¦å—?</target>
3674 <context-group name="null"> 3696 <context-group name="null">
3675 <context context-type="linenumber">1</context> 3697 <context context-type="linenumber">1</context>
3676 </context-group> 3698 </context-group>
3677 </trans-unit> 3699 </trans-unit>
3678 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 3700 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3679 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 3701 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3680 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已解除å°ç¦ã€‚</target> 3702 <target>已解除对 <x id="INTERPOLATION" equiv-text="{{num}}"/> 个用户的å°ç¦ã€‚</target>
3681 <context-group name="null"> 3703 <context-group name="null">
3682 <context context-type="linenumber">1</context> 3704 <context context-type="linenumber">1</context>
3683 </context-group> 3705 </context-group>
@@ -3689,16 +3711,30 @@ When you will upload a video in this channel, the video support field will be au
3689 <context context-type="linenumber">1</context> 3711 <context context-type="linenumber">1</context>
3690 </context-group> 3712 </context-group>
3691 </trans-unit> 3713 </trans-unit>
3692 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603"> 3714 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3693 <source>If you remove this user, you will not be able to create another with the same username!</source> 3715 <source>If you remove these users, you will not be able to create others with the same username!</source>
3694 <target>一旦删除此用户,你将无法å†ä½¿ç”¨æ­¤ç”¨æˆ·å创建新用户ï¼</target> 3716 <target>一旦删除这些用户,你将无法å†ä½¿ç”¨è¿™äº›ç”¨æˆ·å创建新用户ï¼</target>
3695 <context-group name="null"> 3717 <context-group name="null">
3696 <context context-type="linenumber">1</context> 3718 <context context-type="linenumber">1</context>
3697 </context-group> 3719 </context-group>
3698 </trans-unit> 3720 </trans-unit>
3699 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3721 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3700 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3722 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3701 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已删除。</target> 3723 <target>已删除 <x id="INTERPOLATION" equiv-text="{{num}}"/> 个用户。</target>
3724 <context-group name="null">
3725 <context context-type="linenumber">1</context>
3726 </context-group>
3727 </trans-unit>
3728 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3729 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3730 <target>已解除对å¸æˆ· <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> çš„å±è”½ã€‚</target>
3731 <context-group name="null">
3732 <context context-type="linenumber">1</context>
3733 </context-group>
3734 </trans-unit>
3735 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3736 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3737 <target>已解除对实例 <x id="INTERPOLATION" equiv-text="{{host}}"/> çš„å±è”½ã€‚</target>
3702 <context-group name="null"> 3738 <context-group name="null">
3703 <context context-type="linenumber">1</context> 3739 <context context-type="linenumber">1</context>
3704 </context-group> 3740 </context-group>
@@ -3717,6 +3753,13 @@ When you will upload a video in this channel, the video support field will be au
3717 <context context-type="linenumber">1</context> 3753 <context context-type="linenumber">1</context>
3718 </context-group> 3754 </context-group>
3719 </trans-unit> 3755 </trans-unit>
3756 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3757 <source>You current password is invalid.</source>
3758 <target>您的当å‰å¯†ç ä¸æ­£ç¡®ã€‚</target>
3759 <context-group name="null">
3760 <context context-type="linenumber">1</context>
3761 </context-group>
3762 </trans-unit>
3720 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3763 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3721 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3764 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3722 <target>您确定è¦åˆ é™¤æ‚¨çš„å¸æˆ·å—?这将删除您的全部数æ®ï¼ŒåŒ…括频é“和视频等。</target> 3765 <target>您确定è¦åˆ é™¤æ‚¨çš„å¸æˆ·å—?这将删除您的全部数æ®ï¼ŒåŒ…括频é“和视频等。</target>
@@ -3773,6 +3816,13 @@ When you will upload a video in this channel, the video support field will be au
3773 <context context-type="linenumber">1</context> 3816 <context context-type="linenumber">1</context>
3774 </context-group> 3817 </context-group>
3775 </trans-unit> 3818 </trans-unit>
3819 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3820 <source>This name already exists on this instance.</source>
3821 <target>此用户å在本实例上已ç»è¢«ä½¿ç”¨è¿‡ã€‚</target>
3822 <context-group name="null">
3823 <context context-type="linenumber">1</context>
3824 </context-group>
3825 </trans-unit>
3776 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3826 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3777 <source>Create</source> 3827 <source>Create</source>
3778 <target>创建</target> 3828 <target>创建</target>
@@ -3787,23 +3837,16 @@ When you will upload a video in this channel, the video support field will be au
3787 <context context-type="linenumber">1</context> 3837 <context context-type="linenumber">1</context>
3788 </context-group> 3838 </context-group>
3789 </trans-unit> 3839 </trans-unit>
3790 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3840 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3791 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3841 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3792 <target>您确定è¦åˆ é™¤ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> å—?这将åŒæ—¶åˆ é™¤ä¸Šä¼ è‡³è¯¥é¢‘é“的所有视频。</target> 3842 <target>è§†é¢‘é¢‘é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target>
3793 <context-group name="null">
3794 <context context-type="linenumber">1</context>
3795 </context-group>
3796 </trans-unit>
3797 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3798 <source>Please type the name of the video channel to confirm</source>
3799 <target>输入视频频é“的显示å以确认æ“作</target>
3800 <context-group name="null"> 3843 <context-group name="null">
3801 <context context-type="linenumber">1</context> 3844 <context context-type="linenumber">1</context>
3802 </context-group> 3845 </context-group>
3803 </trans-unit> 3846 </trans-unit>
3804 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3847 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3805 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3848 <source>My videos</source>
3806 <target>è§†é¢‘é¢‘é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target> 3849 <target>我的视频</target>
3807 <context-group name="null"> 3850 <context-group name="null">
3808 <context context-type="linenumber">1</context> 3851 <context context-type="linenumber">1</context>
3809 </context-group> 3852 </context-group>
@@ -3878,16 +3921,44 @@ When you will upload a video in this channel, the video support field will be au
3878 <context context-type="linenumber">1</context> 3921 <context context-type="linenumber">1</context>
3879 </context-group> 3922 </context-group>
3880 </trans-unit> 3923 </trans-unit>
3881 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3924 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3882 <source>Channels</source> 3925 <source>My library</source>
3883 <target>é¢é“</target> 3926 <target>æˆçš„库</target>
3884 <context-group name="null"> 3927 <context-group name="null">
3885 <context context-type="linenumber">1</context> 3928 <context context-type="linenumber">1</context>
3886 </context-group> 3929 </context-group>
3887 </trans-unit> 3930 </trans-unit>
3888 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3931 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3889 <source>Video imports</source> 3932 <source>My channels</source>
3890 <target>导入的视频</target> 3933 <target>我的频é“</target>
3934 <context-group name="null">
3935 <context context-type="linenumber">1</context>
3936 </context-group>
3937 </trans-unit>
3938 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3939 <source>My subscriptions</source>
3940 <target>我的订阅</target>
3941 <context-group name="null">
3942 <context context-type="linenumber">1</context>
3943 </context-group>
3944 </trans-unit>
3945 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3946 <source>Misc</source>
3947 <target>æ‚项</target>
3948 <context-group name="null">
3949 <context context-type="linenumber">1</context>
3950 </context-group>
3951 </trans-unit>
3952 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3953 <source>Ownership changes</source>
3954 <target>视频转移</target>
3955 <context-group name="null">
3956 <context context-type="linenumber">1</context>
3957 </context-group>
3958 </trans-unit>
3959 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3960 <source>My settings</source>
3961 <target>我的设置</target>
3891 <context-group name="null"> 3962 <context-group name="null">
3892 <context context-type="linenumber">1</context> 3963 <context context-type="linenumber">1</context>
3893 </context-group> 3964 </context-group>
@@ -3906,6 +3977,97 @@ When you will upload a video in this channel, the video support field will be au
3906 <context context-type="linenumber">1</context> 3977 <context context-type="linenumber">1</context>
3907 </context-group> 3978 </context-group>
3908 </trans-unit> 3979 </trans-unit>
3980 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3981 <source>Subscribe to the account</source>
3982 <target>订阅此å¸æˆ·</target>
3983 <context-group name="null">
3984 <context context-type="linenumber">1</context>
3985 </context-group>
3986 </trans-unit>
3987 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
3988 <source>Focus the search bar</source>
3989 <target>选择æœç´¢æ¡†</target>
3990 <context-group name="null">
3991 <context context-type="linenumber">1</context>
3992 </context-group>
3993 </trans-unit>
3994 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
3995 <source>Toggle the left menu</source>
3996 <target>开关左侧èœå•æ </target>
3997 <context-group name="null">
3998 <context context-type="linenumber">1</context>
3999 </context-group>
4000 </trans-unit>
4001 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4002 <source>Go to the videos overview page</source>
4003 <target>转到视频总览</target>
4004 <context-group name="null">
4005 <context context-type="linenumber">1</context>
4006 </context-group>
4007 </trans-unit>
4008 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4009 <source>Go to the trending videos page</source>
4010 <target>转到时下æµè¡Œ</target>
4011 <context-group name="null">
4012 <context context-type="linenumber">1</context>
4013 </context-group>
4014 </trans-unit>
4015 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4016 <source>Go to the recently added videos page</source>
4017 <target>转到最近添加</target>
4018 <context-group name="null">
4019 <context context-type="linenumber">1</context>
4020 </context-group>
4021 </trans-unit>
4022 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4023 <source>Go to the local videos page</source>
4024 <target>转到本地视频</target>
4025 <context-group name="null">
4026 <context context-type="linenumber">1</context>
4027 </context-group>
4028 </trans-unit>
4029 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4030 <source>Go to the videos upload page</source>
4031 <target>转到上传视频</target>
4032 <context-group name="null">
4033 <context context-type="linenumber">1</context>
4034 </context-group>
4035 </trans-unit>
4036 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4037 <source>Toggle Dark theme</source>
4038 <target>切æ¢å¤œé—´ä¸»é¢˜</target>
4039 <context-group name="null">
4040 <context context-type="linenumber">1</context>
4041 </context-group>
4042 </trans-unit>
4043 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4044 <source>Go to my subscriptions</source>
4045 <target>转到我的订阅</target>
4046 <context-group name="null">
4047 <context context-type="linenumber">1</context>
4048 </context-group>
4049 </trans-unit>
4050 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4051 <source>Go to my videos</source>
4052 <target>转到我的视频</target>
4053 <context-group name="null">
4054 <context context-type="linenumber">1</context>
4055 </context-group>
4056 </trans-unit>
4057 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4058 <source>Go to my imports</source>
4059 <target>转到我的导入</target>
4060 <context-group name="null">
4061 <context context-type="linenumber">1</context>
4062 </context-group>
4063 </trans-unit>
4064 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4065 <source>Go to my channels</source>
4066 <target>转到我的频é“</target>
4067 <context-group name="null">
4068 <context context-type="linenumber">1</context>
4069 </context-group>
4070 </trans-unit>
3909 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4071 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3910 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4072 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3911</source> 4073</source>
@@ -3922,6 +4084,13 @@ When you will upload a video in this channel, the video support field will be au
3922 <context context-type="linenumber">1</context> 4084 <context context-type="linenumber">1</context>
3923 </context-group> 4085 </context-group>
3924 </trans-unit> 4086 </trans-unit>
4087 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4088 <source>Error</source>
4089 <target>错误</target>
4090 <context-group name="null">
4091 <context context-type="linenumber">1</context>
4092 </context-group>
4093 </trans-unit>
3925 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4094 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3926 <source>You need to reconnect.</source> 4095 <source>You need to reconnect.</source>
3927 <target>请é‡æ–°è¿›è¡ŒæŽˆæƒã€‚</target> 4096 <target>请é‡æ–°è¿›è¡ŒæŽˆæƒã€‚</target>
@@ -3943,6 +4112,20 @@ When you will upload a video in this channel, the video support field will be au
3943 <context context-type="linenumber">1</context> 4112 <context context-type="linenumber">1</context>
3944 </context-group> 4113 </context-group>
3945 </trans-unit> 4114 </trans-unit>
4115 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4116 <source>Info</source>
4117 <target>æ示</target>
4118 <context-group name="null">
4119 <context context-type="linenumber">1</context>
4120 </context-group>
4121 </trans-unit>
4122 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4123 <source>Success</source>
4124 <target>æˆåŠŸ</target>
4125 <context-group name="null">
4126 <context context-type="linenumber">1</context>
4127 </context-group>
4128 </trans-unit>
3946 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4129 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3947 <source>Incorrect username or password.</source> 4130 <source>Incorrect username or password.</source>
3948 <target>用户å或密ç ä¸æ­£ç¡®ã€‚</target> 4131 <target>用户å或密ç ä¸æ­£ç¡®ã€‚</target>
@@ -4160,6 +4343,20 @@ When you will upload a video in this channel, the video support field will be au
4160 <context context-type="linenumber">1</context> 4343 <context context-type="linenumber">1</context>
4161 </context-group> 4344 </context-group>
4162 </trans-unit> 4345 </trans-unit>
4346 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4347 <source>Email is required.</source>
4348 <target>请输入电å­é‚®ä»¶åœ°å€ã€‚</target>
4349 <context-group name="null">
4350 <context context-type="linenumber">1</context>
4351 </context-group>
4352 </trans-unit>
4353 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4354 <source>Email must be valid.</source>
4355 <target>请输入åˆæ³•çš„电å­é‚®ä»¶åœ°å€ã€‚</target>
4356 <context-group name="null">
4357 <context context-type="linenumber">1</context>
4358 </context-group>
4359 </trans-unit>
4163 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4360 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4164 <source>Username is required.</source> 4361 <source>Username is required.</source>
4165 <target>请输入用户å。</target> 4362 <target>请输入用户å。</target>
@@ -4181,41 +4378,6 @@ When you will upload a video in this channel, the video support field will be au
4181 <context context-type="linenumber">1</context> 4378 <context context-type="linenumber">1</context>
4182 </context-group> 4379 </context-group>
4183 </trans-unit> 4380 </trans-unit>
4184 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4185 <source>Username must be at least 3 characters long.</source>
4186 <target>用户å应至少 3 个字符。</target>
4187 <context-group name="null">
4188 <context context-type="linenumber">1</context>
4189 </context-group>
4190 </trans-unit>
4191 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4192 <source>Username cannot be more than 20 characters long.</source>
4193 <target>用户åä¸èƒ½è¶…过 20 个字符。</target>
4194 <context-group name="null">
4195 <context context-type="linenumber">1</context>
4196 </context-group>
4197 </trans-unit>
4198 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4199 <source>Username should be only lowercase alphanumeric characters.</source>
4200 <target>用户ååªèƒ½ä½¿ç”¨å°å†™å­—æ¯å’Œæ•°å­—。</target>
4201 <context-group name="null">
4202 <context context-type="linenumber">1</context>
4203 </context-group>
4204 </trans-unit>
4205 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4206 <source>Email is required.</source>
4207 <target>请输入电å­é‚®ä»¶åœ°å€ã€‚</target>
4208 <context-group name="null">
4209 <context context-type="linenumber">1</context>
4210 </context-group>
4211 </trans-unit>
4212 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4213 <source>Email must be valid.</source>
4214 <target>请输入åˆæ³•çš„电å­é‚®ä»¶åœ°å€ã€‚</target>
4215 <context-group name="null">
4216 <context context-type="linenumber">1</context>
4217 </context-group>
4218 </trans-unit>
4219 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4381 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4220 <source>Password must be at least 6 characters long.</source> 4382 <source>Password must be at least 6 characters long.</source>
4221 <target>密ç åº”至少 6 个字符。</target> 4383 <target>密ç åº”至少 6 个字符。</target>
@@ -4279,20 +4441,6 @@ When you will upload a video in this channel, the video support field will be au
4279 <context context-type="linenumber">1</context> 4441 <context context-type="linenumber">1</context>
4280 </context-group> 4442 </context-group>
4281 </trans-unit> 4443 </trans-unit>
4282 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4283 <source>Display name must be at least 3 characters long.</source>
4284 <target>显示å称应至少 3 个字符。</target>
4285 <context-group name="null">
4286 <context context-type="linenumber">1</context>
4287 </context-group>
4288 </trans-unit>
4289 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4290 <source>Display name cannot be more than 120 characters long.</source>
4291 <target>显示å称ä¸èƒ½è¶…过 120 个字符。</target>
4292 <context-group name="null">
4293 <context context-type="linenumber">1</context>
4294 </context-group>
4295 </trans-unit>
4296 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4444 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4297 <source>Description must be at least 3 characters long.</source> 4445 <source>Description must be at least 3 characters long.</source>
4298 <target>说明应至少 3 个字符。</target> 4446 <target>说明应至少 3 个字符。</target>
@@ -4300,9 +4448,9 @@ When you will upload a video in this channel, the video support field will be au
4300 <context context-type="linenumber">1</context> 4448 <context context-type="linenumber">1</context>
4301 </context-group> 4449 </context-group>
4302 </trans-unit> 4450 </trans-unit>
4303 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4451 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4304 <source>Description cannot be more than 250 characters long.</source> 4452 <source>Description cannot be more than 1000 characters long.</source>
4305 <target>说明ä¸èƒ½è¶…过 250 个字符。</target> 4453 <target>说明ä¸èƒ½è¶…过 1000 个字符。</target>
4306 <context-group name="null"> 4454 <context-group name="null">
4307 <context context-type="linenumber">1</context> 4455 <context context-type="linenumber">1</context>
4308 </context-group> 4456 </context-group>
@@ -4342,13 +4490,6 @@ When you will upload a video in this channel, the video support field will be au
4342 <context context-type="linenumber">1</context> 4490 <context context-type="linenumber">1</context>
4343 </context-group> 4491 </context-group>
4344 </trans-unit> 4492 </trans-unit>
4345 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4346 <source>Report reason cannot be more than 300 characters long.</source>
4347 <target>举报ç†ç”±ä¸èƒ½è¶…过 300 个字符。</target>
4348 <context-group name="null">
4349 <context context-type="linenumber">1</context>
4350 </context-group>
4351 </trans-unit>
4352 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4493 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4353 <source>Moderation comment is required.</source> 4494 <source>Moderation comment is required.</source>
4354 <target>请输入è¿è¥å¤‡æ³¨ä¿¡æ¯ã€‚</target> 4495 <target>请输入è¿è¥å¤‡æ³¨ä¿¡æ¯ã€‚</target>
@@ -4363,13 +4504,6 @@ When you will upload a video in this channel, the video support field will be au
4363 <context context-type="linenumber">1</context> 4504 <context context-type="linenumber">1</context>
4364 </context-group> 4505 </context-group>
4365 </trans-unit> 4506 </trans-unit>
4366 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4367 <source>Moderation comment cannot be more than 300 characters long.</source>
4368 <target>è¿è¥å¤‡æ³¨ä¿¡æ¯ä¸èƒ½è¶…过 300 个字符。</target>
4369 <context-group name="null">
4370 <context context-type="linenumber">1</context>
4371 </context-group>
4372 </trans-unit>
4373 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4507 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4374 <source>The channel is required.</source> 4508 <source>The channel is required.</source>
4375 <target>必须指定频é“。</target> 4509 <target>必须指定频é“。</target>
@@ -4412,37 +4546,16 @@ When you will upload a video in this channel, the video support field will be au
4412 <context context-type="linenumber">1</context> 4546 <context context-type="linenumber">1</context>
4413 </context-group> 4547 </context-group>
4414 </trans-unit> 4548 </trans-unit>
4415 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4549 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4416 <source>Name is required.</source> 4550 <source>You can only transfer ownership to a local account</source>
4417 <target>请输入频é“用户å。</target> 4551 <target>您åªèƒ½å°†è§†é¢‘转移到å¦ä¸€ä¸ªæœ¬åœ°å¸æˆ·ä¸­</target>
4418 <context-group name="null">
4419 <context context-type="linenumber">1</context>
4420 </context-group>
4421 </trans-unit>
4422 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4423 <source>Name must be at least 3 characters long.</source>
4424 <target>频é“用户å应至少 3 个字符。</target>
4425 <context-group name="null"> 4552 <context-group name="null">
4426 <context context-type="linenumber">1</context> 4553 <context context-type="linenumber">1</context>
4427 </context-group> 4554 </context-group>
4428 </trans-unit> 4555 </trans-unit>
4429 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 4556 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4430 <source>Name cannot be more than 20 characters long.</source> 4557 <source>Name is required.</source>
4431 <target>频é“用户åä¸èƒ½è¶…过 20 个字符。</target> 4558 <target>请输入频é“用户å。</target>
4432 <context-group name="null">
4433 <context context-type="linenumber">1</context>
4434 </context-group>
4435 </trans-unit>
4436 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4437 <source>Name should be only lowercase alphanumeric characters.</source>
4438 <target>频é“用户ååªèƒ½ä½¿ç”¨å°å†™å­—æ¯å’Œæ•°å­—。</target>
4439 <context-group name="null">
4440 <context context-type="linenumber">1</context>
4441 </context-group>
4442 </trans-unit>
4443 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6">
4444 <source>Description cannot be more than 500 characters long.</source>
4445 <target>说明ä¸èƒ½è¶…过 500 个字符。</target>
4446 <context-group name="null"> 4559 <context-group name="null">
4447 <context context-type="linenumber">1</context> 4560 <context context-type="linenumber">1</context>
4448 </context-group> 4561 </context-group>
@@ -4454,9 +4567,9 @@ When you will upload a video in this channel, the video support field will be au
4454 <context context-type="linenumber">1</context> 4567 <context context-type="linenumber">1</context>
4455 </context-group> 4568 </context-group>
4456 </trans-unit> 4569 </trans-unit>
4457 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4570 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4458 <source>Support text cannot be more than 500 characters long.</source> 4571 <source>Support text cannot be more than 1000 characters long.</source>
4459 <target>支æŒä¿¡æ¯ä¸èƒ½è¶…过 500 个字符。</target> 4572 <target>支æŒä¿¡æ¯ä¸èƒ½è¶…过 1000 个字符。</target>
4460 <context-group name="null"> 4573 <context-group name="null">
4461 <context context-type="linenumber">1</context> 4574 <context context-type="linenumber">1</context>
4462 </context-group> 4575 </context-group>
@@ -4552,9 +4665,9 @@ When you will upload a video in this channel, the video support field will be au
4552 <context context-type="linenumber">1</context> 4665 <context context-type="linenumber">1</context>
4553 </context-group> 4666 </context-group>
4554 </trans-unit> 4667 </trans-unit>
4555 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4668 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4556 <source>Video support cannot be more than 500 characters long.</source> 4669 <source>Video support cannot be more than 1000 characters long.</source>
4557 <target>视频的支æŒä¿¡æ¯ä¸èƒ½è¶…过 500 个字符。</target> 4670 <target>视频的支æŒä¿¡æ¯ä¸èƒ½è¶…过 1000 个字符。</target>
4558 <context-group name="null"> 4671 <context-group name="null">
4559 <context context-type="linenumber">1</context> 4672 <context context-type="linenumber">1</context>
4560 </context-group> 4673 </context-group>
@@ -5084,6 +5197,146 @@ When you will upload a video in this channel, the video support field will be au
5084 <context context-type="linenumber">1</context> 5197 <context context-type="linenumber">1</context>
5085 </context-group> 5198 </context-group>
5086 </trans-unit> 5199 </trans-unit>
5200 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5201 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5202 <target>å·²å°ç¦ <x id="INTERPOLATION" equiv-text="{{num}}"/> 个用户。</target>
5203 <context-group name="null">
5204 <context context-type="linenumber">1</context>
5205 </context-group>
5206 </trans-unit>
5207 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5208 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5209 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> å·²å°ç¦ã€‚</target>
5210 <context-group name="null">
5211 <context context-type="linenumber">1</context>
5212 </context-group>
5213 </trans-unit>
5214 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5215 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5216 <target>您确定è¦è§£é™¤å¯¹ <x id="INTERPOLATION" equiv-text="{{username}}"/> çš„å°ç¦å—?</target>
5217 <context-group name="null">
5218 <context context-type="linenumber">1</context>
5219 </context-group>
5220 </trans-unit>
5221 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5222 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5223 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已解除å°ç¦ã€‚</target>
5224 <context-group name="null">
5225 <context context-type="linenumber">1</context>
5226 </context-group>
5227 </trans-unit>
5228 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5229 <source>If you remove this user, you will not be able to create another with the same username!</source>
5230 <target>一旦删除此用户,你将无法å†ä½¿ç”¨æ­¤ç”¨æˆ·å创建新用户ï¼</target>
5231 <context-group name="null">
5232 <context context-type="linenumber">1</context>
5233 </context-group>
5234 </trans-unit>
5235 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5236 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5237 <target>用户 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已删除。</target>
5238 <context-group name="null">
5239 <context context-type="linenumber">1</context>
5240 </context-group>
5241 </trans-unit>
5242 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5243 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5244 <target>å·²å±è”½å¸æˆ· <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>。</target>
5245 <context-group name="null">
5246 <context context-type="linenumber">1</context>
5247 </context-group>
5248 </trans-unit>
5249 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5250 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5251 <target>å·²å±è”½å®žä¾‹ <x id="INTERPOLATION" equiv-text="{{host}}"/> muted。</target>
5252 <context-group name="null">
5253 <context context-type="linenumber">1</context>
5254 </context-group>
5255 </trans-unit>
5256 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5257 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5258 <target>å¸æˆ· <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已被本实例å±è”½ã€‚</target>
5259 <context-group name="null">
5260 <context context-type="linenumber">1</context>
5261 </context-group>
5262 </trans-unit>
5263 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5264 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5265 <target>å¸æˆ· <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已被本实例解除å±è”½ã€‚</target>
5266 <context-group name="null">
5267 <context context-type="linenumber">1</context>
5268 </context-group>
5269 </trans-unit>
5270 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5271 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5272 <target>实例 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已被本实例å±è”½ã€‚</target>
5273 <context-group name="null">
5274 <context context-type="linenumber">1</context>
5275 </context-group>
5276 </trans-unit>
5277 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5278 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5279 <target>实例 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已被本实例解除å±è”½ã€‚</target>
5280 <context-group name="null">
5281 <context context-type="linenumber">1</context>
5282 </context-group>
5283 </trans-unit>
5284 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5285 <source>Mute this account</source>
5286 <target>å±è”½æ­¤å¸æˆ·</target>
5287 <context-group name="null">
5288 <context context-type="linenumber">1</context>
5289 </context-group>
5290 </trans-unit>
5291 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5292 <source>Unmute this account</source>
5293 <target>解除对此å¸æˆ·çš„å±è”½</target>
5294 <context-group name="null">
5295 <context context-type="linenumber">1</context>
5296 </context-group>
5297 </trans-unit>
5298 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5299 <source>Mute the instance</source>
5300 <target>å±è”½æ­¤å®žä¾‹</target>
5301 <context-group name="null">
5302 <context context-type="linenumber">1</context>
5303 </context-group>
5304 </trans-unit>
5305 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5306 <source>Unmute the instance</source>
5307 <target>解除对此实例的å±è”½</target>
5308 <context-group name="null">
5309 <context context-type="linenumber">1</context>
5310 </context-group>
5311 </trans-unit>
5312 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5313 <source>Mute this account by your instance</source>
5314 <target>在全实例范围内å±è”½æ­¤å¸æˆ·</target>
5315 <context-group name="null">
5316 <context context-type="linenumber">1</context>
5317 </context-group>
5318 </trans-unit>
5319 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5320 <source>Unmute this account by your instance</source>
5321 <target>在全实例范围内解除对此å¸æˆ·çš„å±è”½</target>
5322 <context-group name="null">
5323 <context context-type="linenumber">1</context>
5324 </context-group>
5325 </trans-unit>
5326 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5327 <source>Mute the instance by your instance</source>
5328 <target>在全实例范围内å±è”½æ­¤å®žä¾‹</target>
5329 <context-group name="null">
5330 <context context-type="linenumber">1</context>
5331 </context-group>
5332 </trans-unit>
5333 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5334 <source>Unmute the instance by your instance</source>
5335 <target>在全实例范围内解除对此实例的å±è”½</target>
5336 <context-group name="null">
5337 <context context-type="linenumber">1</context>
5338 </context-group>
5339 </trans-unit>
5087 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5340 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5088 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5341 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5089 <target>请求已超过é™åˆ¶ã€‚请è”系管ç†å‘˜ä»¥æå‡é™åˆ¶ã€‚</target> 5342 <target>请求已超过é™åˆ¶ã€‚请è”系管ç†å‘˜ä»¥æå‡é™åˆ¶ã€‚</target>
@@ -5112,6 +5365,13 @@ When you will upload a video in this channel, the video support field will be au
5112 <context context-type="linenumber">1</context> 5365 <context context-type="linenumber">1</context>
5113 </context-group> 5366 </context-group>
5114 </trans-unit> 5367 </trans-unit>
5368 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5369 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5370 <target>æˆåŠŸè®¢é˜… <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5371 <context-group name="null">
5372 <context context-type="linenumber">1</context>
5373 </context-group>
5374 </trans-unit>
5115 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5375 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5116 <source>Subscribed</source> 5376 <source>Subscribed</source>
5117 <target>已订阅</target> 5377 <target>已订阅</target>
@@ -5119,9 +5379,9 @@ When you will upload a video in this channel, the video support field will be au
5119 <context context-type="linenumber">1</context> 5379 <context context-type="linenumber">1</context>
5120 </context-group> 5380 </context-group>
5121 </trans-unit> 5381 </trans-unit>
5122 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5382 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
5123 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5383 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5124 <target>æˆåŠŸè®¢é˜… <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5384 <target>æˆåŠŸé€€è®¢ <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5125 <context-group name="null"> 5385 <context-group name="null">
5126 <context context-type="linenumber">1</context> 5386 <context context-type="linenumber">1</context>
5127 </context-group> 5387 </context-group>
@@ -5133,9 +5393,9 @@ When you will upload a video in this channel, the video support field will be au
5133 <context context-type="linenumber">1</context> 5393 <context context-type="linenumber">1</context>
5134 </context-group> 5394 </context-group>
5135 </trans-unit> 5395 </trans-unit>
5136 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5396 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5137 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5397 <source>Moderator</source>
5138 <target>æˆåŠŸé€€è®¢ <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5398 <target>监察员</target>
5139 <context-group name="null"> 5399 <context-group name="null">
5140 <context context-type="linenumber">1</context> 5400 <context context-type="linenumber">1</context>
5141 </context-group> 5401 </context-group>
@@ -5161,27 +5421,6 @@ When you will upload a video in this channel, the video support field will be au
5161 <context context-type="linenumber">1</context> 5421 <context context-type="linenumber">1</context>
5162 </context-group> 5422 </context-group>
5163 </trans-unit> 5423 </trans-unit>
5164 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2">
5165 <source>Welcome</source>
5166 <target>欢迎</target>
5167 <context-group name="null">
5168 <context context-type="linenumber">1</context>
5169 </context-group>
5170 </trans-unit>
5171 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
5172 <source>Please check your email to verify your account and complete signup.</source>
5173 <target>è¦éªŒè¯æ‚¨çš„å¸æˆ·å¹¶å®Œæˆæ³¨å†Œï¼Œè¯·æ£€æŸ¥æ‚¨çš„电å­é‚®ä»¶ã€‚</target>
5174 <context-group name="null">
5175 <context context-type="linenumber">1</context>
5176 </context-group>
5177 </trans-unit>
5178 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be">
5179 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source>
5180 <target><x id="INTERPOLATION" equiv-text="{{username}}"/> 的注册已完æˆã€‚</target>
5181 <context-group name="null">
5182 <context context-type="linenumber">1</context>
5183 </context-group>
5184 </trans-unit>
5185 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb"> 5424 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
5186 <source>Video to import updated.</source> 5425 <source>Video to import updated.</source>
5187 <target>已更新待导入的视频。</target> 5426 <target>已更新待导入的视频。</target>
@@ -5210,13 +5449,6 @@ When you will upload a video in this channel, the video support field will be au
5210 <context context-type="linenumber">1</context> 5449 <context context-type="linenumber">1</context>
5211 </context-group> 5450 </context-group>
5212 </trans-unit> 5451 </trans-unit>
5213 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5214 <source>Info</source>
5215 <target>æ示</target>
5216 <context-group name="null">
5217 <context context-type="linenumber">1</context>
5218 </context-group>
5219 </trans-unit>
5220 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5452 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5221 <source>Upload cancelled</source> 5453 <source>Upload cancelled</source>
5222 <target>上传已å–消</target> 5454 <target>上传已å–消</target>
@@ -5224,13 +5456,6 @@ When you will upload a video in this channel, the video support field will be au
5224 <context context-type="linenumber">1</context> 5456 <context context-type="linenumber">1</context>
5225 </context-group> 5457 </context-group>
5226 </trans-unit> 5458 </trans-unit>
5227 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5228 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5229 <target>éžå¸¸æŠ±æ­‰ï¼ŒPeerTube ä¸æ”¯æŒ 8GB 以上的视频</target>
5230 <context-group name="null">
5231 <context context-type="linenumber">1</context>
5232 </context-group>
5233 </trans-unit>
5234 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5459 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5235 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 5460 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
5236 <target>此视频已超出您的视频存储总空间(视频大å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>,当å‰å·²ä½¿ç”¨ï¼š<x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,总空间:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5461 <target>此视频已超出您的视频存储总空间(视频大å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>,当å‰å·²ä½¿ç”¨ï¼š<x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,总空间:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -5294,6 +5519,20 @@ When you will upload a video in this channel, the video support field will be au
5294 <context context-type="linenumber">1</context> 5519 <context context-type="linenumber">1</context>
5295 </context-group> 5520 </context-group>
5296 </trans-unit> 5521 </trans-unit>
5522 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5523 <source>Like the video</source>
5524 <target>顶一下</target>
5525 <context-group name="null">
5526 <context context-type="linenumber">1</context>
5527 </context-group>
5528 </trans-unit>
5529 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5530 <source>Dislike the video</source>
5531 <target>踩一下</target>
5532 <context-group name="null">
5533 <context context-type="linenumber">1</context>
5534 </context-group>
5535 </trans-unit>
5297 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5536 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5298 <source>Do you really want to delete this video?</source> 5537 <source>Do you really want to delete this video?</source>
5299 <target>您确定è¦åˆ é™¤è¿™ä¸ªè§†é¢‘å—?</target> 5538 <target>您确定è¦åˆ é™¤è¿™ä¸ªè§†é¢‘å—?</target>
diff --git a/client/src/locale/target/angular_zh_Hant_TW.xml b/client/src/locale/target/angular_zh_Hant_TW.xml
index b6b7f1e4f..c1aefbb40 100644
--- a/client/src/locale/target/angular_zh_Hant_TW.xml
+++ b/client/src/locale/target/angular_zh_Hant_TW.xml
@@ -38,6 +38,20 @@
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
40 </trans-unit> 40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>é¸å–月份</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>é¸å–年份</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
41 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
42 <source>««</source> 56 <source>««</source>
43 <target>««</target> 57 <target>««</target>
@@ -213,11 +227,25 @@
213 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
214 </context-group> 228 </context-group>
215 </trans-unit> 229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>未列出</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>ç§å¯†</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
216 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
217 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
218 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target>
219 <context-group name="null"> 247 <context-group name="null">
220 <context context-type="linenumber">13</context> 248 <context context-type="linenumber">16</context>
221 </context-group> 249 </context-group>
222 </trans-unit> 250 </trans-unit>
223 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7"> 251 <trans-unit id="826b25211922a1b46436589233cb6f1a163d89b7">
@@ -231,7 +259,7 @@
231 <source>Edit</source> 259 <source>Edit</source>
232 <target>編輯</target> 260 <target>編輯</target>
233 <context-group name="null"> 261 <context-group name="null">
234 <context context-type="linenumber">5</context> 262 <context context-type="linenumber">1</context>
235 </context-group> 263 </context-group>
236 </trans-unit> 264 </trans-unit>
237 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d"> 265 <trans-unit id="961a134583d6256df39fbc520d020ebc48e3128d">
@@ -255,11 +283,112 @@
255 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
256 </context-group> 284 </context-group>
257 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 訂閱
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
302 </target>
303 <context-group name="null">
304 <context context-type="linenumber">5</context>
305 </context-group>
306 </trans-unit>
307 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
308 <source>
309 Unsubscribe
310 </source>
311 <target>
312 å–消訂閱
313 </target>
314 <context-group name="null">
315 <context context-type="linenumber">18</context>
316 </context-group>
317 </trans-unit>
318 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
319 <source>Using an ActivityPub account</source>
320 <target>使用 ActivityPub 帳號</target>
321 <context-group name="null">
322 <context context-type="linenumber">36</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
326 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
327 <target>使用 <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/> 上的帳號訂閱</target>
328 <context-group name="null">
329 <context context-type="linenumber">39</context>
330 </context-group>
331 </trans-unit>
332 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
333 <source>Subscribe with your local account</source>
334 <target>以您的本地帳號訂閱</target>
335 <context-group name="null">
336 <context context-type="linenumber">40</context>
337 </context-group>
338 </trans-unit>
339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
340 <source>Subscribe with a Mastodon account:</source>
341 <target>使用 Mastodon 帳號訂閱:</target>
342 <context-group name="null">
343 <context context-type="linenumber">43</context>
344 </context-group>
345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>使用è¯åˆä¾›ç¨¿</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
354 <source>Subscribe via RSS</source>
355 <target>é€éŽ RSS 訂閱</target>
356 <context-group name="null">
357 <context context-type="linenumber">49</context>
358 </context-group>
359 </trans-unit>
360 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
361 <source>
362 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
363 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
364 </source>
365 <target>
366 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>é ç«¯è¨‚é–±<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
367 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>é ç«¯å¯¦é«”<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
368 </target>
369 <context-group name="null">
370 <context context-type="linenumber">10</context>
371 </context-group>
372 </trans-unit>
373 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
374 <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
375 <target>您å¯ä»¥é€éŽä»»ä½•ç›¸å®¹æ–¼ ActivityPub çš„è¯ç›Ÿå¯¦é«”訂閱。例如 Mastodon 或 Pleroma,您å¯ä»¥åœ¨æœå°‹æ¡†è¼¸å…¥é »é“ URL 以訂閱。</target>
376 <context-group name="null">
377 <context context-type="linenumber">17</context>
378 </context-group>
379 </trans-unit>
380 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
381 <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
382 <target>您å¯ä»¥é€éŽä»»ä½•ç›¸å®¹æ–¼ ActivityPub çš„è¯ç›Ÿå¯¦é«”進行互動。例如 Mastodon 或 Pleroma,您å¯ä»¥åœ¨æœå°‹æ¡†ä¸­è¼¸å…¥ç›®å‰çš„ URL 並在那裡與其互動。</target>
383 <context-group name="null">
384 <context context-type="linenumber">22</context>
385 </context-group>
386 </trans-unit>
258 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 387 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
259 <source>Video quota</source> 388 <source>Video quota</source>
260 <target>影片é…é¡</target> 389 <target>影片é…é¡</target>
261 <context-group name="null"> 390 <context-group name="null">
262 <context context-type="linenumber">19</context> 391 <context context-type="linenumber">42</context>
263 </context-group> 392 </context-group>
264 </trans-unit> 393 </trans-unit>
265 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85"> 394 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
@@ -273,6 +402,38 @@
273 <context context-type="linenumber">14</context> 402 <context context-type="linenumber">14</context>
274 </context-group> 403 </context-group>
275 </trans-unit> 404 </trans-unit>
405 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
406 <source>Ban</source>
407 <target>阻擋</target>
408 <context-group name="null">
409 <context context-type="linenumber">3</context>
410 </context-group>
411 </trans-unit>
412 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
413 <source>Reason...</source>
414 <target>ç†ç”±â€¦â€¦</target>
415 <context-group name="null">
416 <context context-type="linenumber">11</context>
417 </context-group>
418 </trans-unit>
419 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
420 <source>
421 A banned user will no longer be able to login.
422 </source>
423 <target>
424 被阻擋的使用者將ä¸å†èƒ½ç™»å…¥ã€‚
425 </target>
426 <context-group name="null">
427 <context context-type="linenumber">17</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
431 <source>Ban this user</source>
432 <target>阻擋此使用者</target>
433 <context-group name="null">
434 <context context-type="linenumber">25</context>
435 </context-group>
436 </trans-unit>
276 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
277 <source> 438 <source>
278 Login 439 Login
@@ -336,7 +497,7 @@
336 <source>Password</source> 497 <source>Password</source>
337 <target>密碼</target> 498 <target>密碼</target>
338 <context-group name="null"> 499 <context-group name="null">
339 <context context-type="linenumber">12</context> 500 <context context-type="linenumber">13</context>
340 </context-group> 501 </context-group>
341 </trans-unit> 502 </trans-unit>
342 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 503 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -350,7 +511,7 @@
350 <source>Login</source> 511 <source>Login</source>
351 <target>登入</target> 512 <target>登入</target>
352 <context-group name="null"> 513 <context-group name="null">
353 <context context-type="linenumber">38</context> 514 <context context-type="linenumber">36</context>
354 </context-group> 515 </context-group>
355 </trans-unit> 516 </trans-unit>
356 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 517 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -378,7 +539,7 @@
378 <source>Send me an email to reset my password</source> 539 <source>Send me an email to reset my password</source>
379 <target>傳é€é›»å­éƒµä»¶çµ¦æˆ‘以é‡è¨­æˆ‘的密碼</target> 540 <target>傳é€é›»å­éƒµä»¶çµ¦æˆ‘以é‡è¨­æˆ‘的密碼</target>
380 <context-group name="null"> 541 <context-group name="null">
381 <context context-type="linenumber">75</context> 542 <context context-type="linenumber">80</context>
382 </context-group> 543 </context-group>
383 </trans-unit> 544 </trans-unit>
384 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 545 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -431,28 +592,28 @@
431 <source>Example: jane_doe</source> 592 <source>Example: jane_doe</source>
432 <target>範例:jane_doe</target> 593 <target>範例:jane_doe</target>
433 <context-group name="null"> 594 <context-group name="null">
434 <context context-type="linenumber">16</context> 595 <context context-type="linenumber">17</context>
435 </context-group> 596 </context-group>
436 </trans-unit> 597 </trans-unit>
437 <trans-unit id="2ac776627e18565d7ae85cd7f4cd033bc5d0c88b"> 598 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
438 <source>I have read and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source> 599 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
439 <target>我已經讀éŽä¸”åŒæ„這個實體的&lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;æ¢æ¬¾&lt;/a&gt;</target> 600 <target>我至少 16 歲且åŒæ„此實體的&lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;æ¢æ¬¾&lt;/a&gt;</target>
440 <context-group name="null"> 601 <context-group name="null">
441 <context context-type="linenumber">54</context> 602 <context context-type="linenumber">55</context>
442 </context-group> 603 </context-group>
443 </trans-unit> 604 </trans-unit>
444 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 605 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
445 <source>Signup</source> 606 <source>Signup</source>
446 <target>註冊</target> 607 <target>註冊</target>
447 <context-group name="null"> 608 <context-group name="null">
448 <context context-type="linenumber">88</context> 609 <context context-type="linenumber">78</context>
449 </context-group> 610 </context-group>
450 </trans-unit> 611 </trans-unit>
451 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 612 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
452 <source>Features found on this instance</source> 613 <source>Features found on this instance</source>
453 <target>在此實體上找到的功能</target> 614 <target>在此實體上找到的功能</target>
454 <context-group name="null"> 615 <context-group name="null">
455 <context context-type="linenumber">66</context> 616 <context context-type="linenumber">67</context>
456 </context-group> 617 </context-group>
457 </trans-unit> 618 </trans-unit>
458 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 619 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -473,9 +634,15 @@
473 <context context-type="linenumber">6</context> 634 <context context-type="linenumber">6</context>
474 </context-group> 635 </context-group>
475 </trans-unit> 636 </trans-unit>
476 <trans-unit id="1298c1d2bbbb7415f5494e800f6775fdb70f4df6"> 637 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
477 <source>Filters</source> 638 <source>
478 <target>éŽæ¿¾å™¨</target> 639 Filters
640 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
641 </source>
642 <target>
643 éŽæ¿¾å™¨
644 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
645 </target>
479 <context-group name="null"> 646 <context-group name="null">
480 <context context-type="linenumber">16</context> 647 <context context-type="linenumber">16</context>
481 </context-group> 648 </context-group>
@@ -486,28 +653,28 @@
486 </source> 653 </source>
487 <target>沒有çµæžœ</target> 654 <target>沒有çµæžœ</target>
488 <context-group name="null"> 655 <context-group name="null">
489 <context context-type="linenumber">25</context> 656 <context context-type="linenumber">28</context>
490 </context-group> 657 </context-group>
491 </trans-unit> 658 </trans-unit>
492 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a"> 659 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
493 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source> 660 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
494 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> 個訂閱者</target> 661 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> 個訂閱者</target>
495 <context-group name="null"> 662 <context-group name="null">
496 <context context-type="linenumber">41</context> 663 <context context-type="linenumber">44</context>
497 </context-group> 664 </context-group>
498 </trans-unit> 665 </trans-unit>
499 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883"> 666 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
500 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source> 667 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
501 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> 次檢視</target> 668 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> 次檢視</target>
502 <context-group name="null"> 669 <context-group name="null">
503 <context context-type="linenumber">52</context> 670 <context context-type="linenumber">55</context>
504 </context-group> 671 </context-group>
505 </trans-unit> 672 </trans-unit>
506 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 673 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
507 <source>Change the language</source> 674 <source>Change the language</source>
508 <target>變更語言</target> 675 <target>變更語言</target>
509 <context-group name="null"> 676 <context-group name="null">
510 <context context-type="linenumber">88</context> 677 <context context-type="linenumber">86</context>
511 </context-group> 678 </context-group>
512 </trans-unit> 679 </trans-unit>
513 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 680 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -518,7 +685,7 @@
518 我的公開個人資料 685 我的公開個人資料
519 </target> 686 </target>
520 <context-group name="null"> 687 <context-group name="null">
521 <context context-type="linenumber">18</context> 688 <context context-type="linenumber">16</context>
522 </context-group> 689 </context-group>
523 </trans-unit> 690 </trans-unit>
524 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 691 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -529,7 +696,7 @@
529 我的帳號 696 我的帳號
530 </target> 697 </target>
531 <context-group name="null"> 698 <context-group name="null">
532 <context context-type="linenumber">22</context> 699 <context context-type="linenumber">20</context>
533 </context-group> 700 </context-group>
534 </trans-unit> 701 </trans-unit>
535 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 702 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -540,7 +707,7 @@
540 我的影片 707 我的影片
541 </target> 708 </target>
542 <context-group name="null"> 709 <context-group name="null">
543 <context context-type="linenumber">26</context> 710 <context context-type="linenumber">24</context>
544 </context-group> 711 </context-group>
545 </trans-unit> 712 </trans-unit>
546 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 713 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -551,14 +718,14 @@
551 登出 718 登出
552 </target> 719 </target>
553 <context-group name="null"> 720 <context-group name="null">
554 <context context-type="linenumber">30</context> 721 <context context-type="linenumber">28</context>
555 </context-group> 722 </context-group>
556 </trans-unit> 723 </trans-unit>
557 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 724 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
558 <source>Create an account</source> 725 <source>Create an account</source>
559 <target>建立帳號</target> 726 <target>建立帳號</target>
560 <context-group name="null"> 727 <context-group name="null">
561 <context context-type="linenumber">39</context> 728 <context context-type="linenumber">37</context>
562 </context-group> 729 </context-group>
563 </trans-unit> 730 </trans-unit>
564 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 731 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -572,49 +739,49 @@
572 <source>Subscriptions</source> 739 <source>Subscriptions</source>
573 <target>訂閱</target> 740 <target>訂閱</target>
574 <context-group name="null"> 741 <context-group name="null">
575 <context context-type="linenumber">47</context> 742 <context context-type="linenumber">45</context>
576 </context-group> 743 </context-group>
577 </trans-unit> 744 </trans-unit>
578 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 745 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
579 <source>Overview</source> 746 <source>Overview</source>
580 <target>概覽</target> 747 <target>概覽</target>
581 <context-group name="null"> 748 <context-group name="null">
582 <context context-type="linenumber">52</context> 749 <context context-type="linenumber">50</context>
583 </context-group> 750 </context-group>
584 </trans-unit> 751 </trans-unit>
585 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 752 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
586 <source>Trending</source> 753 <source>Trending</source>
587 <target>趨勢</target> 754 <target>趨勢</target>
588 <context-group name="null"> 755 <context-group name="null">
589 <context context-type="linenumber">57</context> 756 <context context-type="linenumber">55</context>
590 </context-group> 757 </context-group>
591 </trans-unit> 758 </trans-unit>
592 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 759 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
593 <source>Recently added</source> 760 <source>Recently added</source>
594 <target>最近新增</target> 761 <target>最近新增</target>
595 <context-group name="null"> 762 <context-group name="null">
596 <context context-type="linenumber">62</context> 763 <context context-type="linenumber">60</context>
597 </context-group> 764 </context-group>
598 </trans-unit> 765 </trans-unit>
599 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 766 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
600 <source>Local</source> 767 <source>Local</source>
601 <target>本地</target> 768 <target>本地</target>
602 <context-group name="null"> 769 <context-group name="null">
603 <context context-type="linenumber">67</context> 770 <context context-type="linenumber">65</context>
604 </context-group> 771 </context-group>
605 </trans-unit> 772 </trans-unit>
606 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 773 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
607 <source>More</source> 774 <source>More</source>
608 <target>更多</target> 775 <target>更多</target>
609 <context-group name="null"> 776 <context-group name="null">
610 <context context-type="linenumber">72</context> 777 <context context-type="linenumber">70</context>
611 </context-group> 778 </context-group>
612 </trans-unit> 779 </trans-unit>
613 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 780 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
614 <source>Administration</source> 781 <source>Administration</source>
615 <target>管ç†</target> 782 <target>管ç†</target>
616 <context-group name="null"> 783 <context-group name="null">
617 <context context-type="linenumber">76</context> 784 <context context-type="linenumber">74</context>
618 </context-group> 785 </context-group>
619 </trans-unit> 786 </trans-unit>
620 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 787 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -624,11 +791,18 @@
624 <context context-type="linenumber">25</context> 791 <context context-type="linenumber">25</context>
625 </context-group> 792 </context-group>
626 </trans-unit> 793 </trans-unit>
794 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
795 <source>Show keyboard shortcuts</source>
796 <target>顯示éµç›¤å¿«æ·éµ</target>
797 <context-group name="null">
798 <context context-type="linenumber">89</context>
799 </context-group>
800 </trans-unit>
627 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 801 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
628 <source>Toggle dark interface</source> 802 <source>Toggle dark interface</source>
629 <target>切æ›è‡³æš—色介é¢</target> 803 <target>切æ›è‡³æš—色介é¢</target>
630 <context-group name="null"> 804 <context-group name="null">
631 <context context-type="linenumber">94</context> 805 <context context-type="linenumber">92</context>
632 </context-group> 806 </context-group>
633 </trans-unit> 807 </trans-unit>
634 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 808 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -729,11 +903,18 @@
729 <context context-type="linenumber">94</context> 903 <context context-type="linenumber">94</context>
730 </context-group> 904 </context-group>
731 </trans-unit> 905 </trans-unit>
906 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
907 <source>Display unlisted and private videos</source>
908 <target>顯示未列出與ç§å¯†å½±ç‰‡</target>
909 <context-group name="null">
910 <context context-type="linenumber">14</context>
911 </context-group>
912 </trans-unit>
732 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 913 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
733 <source>No results.</source> 914 <source>No results.</source>
734 <target>沒有çµæžœ</target> 915 <target>沒有çµæžœ</target>
735 <context-group name="null"> 916 <context-group name="null">
736 <context context-type="linenumber">7</context> 917 <context context-type="linenumber">20</context>
737 </context-group> 918 </context-group>
738 </trans-unit> 919 </trans-unit>
739 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 920 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -747,6 +928,17 @@
747 <context context-type="linenumber">6</context> 928 <context context-type="linenumber">6</context>
748 </context-group> 929 </context-group>
749 </trans-unit> 930 </trans-unit>
931 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
932 <source>
933 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
934 </source>
935 <target>
936 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
937 </target>
938 <context-group name="null">
939 <context context-type="linenumber">14</context>
940 </context-group>
941 </trans-unit>
750 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b"> 942 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
751 <source> 943 <source>
752 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/> 944 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
@@ -770,7 +962,7 @@
770 <source>Instance</source> 962 <source>Instance</source>
771 <target>實體</target> 963 <target>實體</target>
772 <context-group name="null"> 964 <context-group name="null">
773 <context context-type="linenumber">8</context> 965 <context context-type="linenumber">12</context>
774 </context-group> 966 </context-group>
775 </trans-unit> 967 </trans-unit>
776 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 968 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -780,13 +972,22 @@
780 <context context-type="linenumber">7</context> 972 <context context-type="linenumber">7</context>
781 </context-group> 973 </context-group>
782 </trans-unit> 974 </trans-unit>
783 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 975 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
784 <source> 976 <source>
785 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 977 Cancel
786</source> 978 </source>
787 <target>關於 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 實體</target> 979 <target>
980 å–消
981 </target>
788 <context-group name="null"> 982 <context-group name="null">
789 <context context-type="linenumber">1</context> 983 <context context-type="linenumber">26</context>
984 </context-group>
985 </trans-unit>
986 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
987 <source>Submit</source>
988 <target>éžäº¤</target>
989 <context-group name="null">
990 <context context-type="linenumber">31</context>
790 </context-group> 991 </context-group>
791 </trans-unit> 992 </trans-unit>
792 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 993 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -800,41 +1001,14 @@
800 <source>Terms</source> 1001 <source>Terms</source>
801 <target>æ¢æ¬¾</target> 1002 <target>æ¢æ¬¾</target>
802 <context-group name="null"> 1003 <context-group name="null">
803 <context context-type="linenumber">44</context> 1004 <context context-type="linenumber">39</context>
804 </context-group> 1005 </context-group>
805 </trans-unit> 1006 </trans-unit>
806 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1007 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
807 <source>User registration is allowed and</source> 1008 <source>User registration is allowed and</source>
808 <target>å…許使用者註冊與</target> 1009 <target>å…許使用者註冊與</target>
809 <context-group name="null"> 1010 <context-group name="null">
810 <context context-type="linenumber">25</context> 1011 <context context-type="linenumber">29</context>
811 </context-group>
812 </trans-unit>
813 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
814 <source>
815 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
816 </source>
817 <target>此實體æ供了基本é…é¡ <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 空間給它的使用者的影片。</target>
818 <context-group name="null">
819 <context context-type="linenumber">27</context>
820 </context-group>
821 </trans-unit>
822 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
823 <source>
824 this instance provides unlimited space for the videos of its users.
825 </source>
826 <target>此實體æ供了無é™çš„影片空間給它的使用者。</target>
827 <context-group name="null">
828 <context context-type="linenumber">31</context>
829 </context-group>
830 </trans-unit>
831 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
832 <source>
833 User registration is currently not allowed.
834 </source>
835 <target>ç›®å‰ä¸å…許使用者註冊。</target>
836 <context-group name="null">
837 <context context-type="linenumber">36</context>
838 </context-group> 1012 </context-group>
839 </trans-unit> 1013 </trans-unit>
840 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1014 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1025,13 +1199,15 @@
1025 <context context-type="linenumber">83</context> 1199 <context context-type="linenumber">83</context>
1026 </context-group> 1200 </context-group>
1027 </trans-unit> 1201 </trans-unit>
1028 <trans-unit id="d8f1c6b816aaf1ebcb936a705dbe88bcef28eaa8"> 1202 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1029 <source> 1203 <source>
1030 PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released. 1204 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1031 In the meantime, we want to test different ideas related to this issue: 1205 In the meantime, we want to test different ideas related to this issue:
1032 </source> 1206 </source>
1033 <target>PeerTube 還在測試階段,希望能在穩定版釋出時æ供最佳å°ç­–。 1207 <target>
1034與此åŒæ™‚,我們想測試關於此å•é¡Œçš„ä¸åŒæƒ³æ³•ï¼š</target> 1208 PeerTube ä»è™•åœ¨å¾ˆæ—©æœŸçš„階段,並希望在穩定版發佈時能æ供最佳å°ç­–。
1209 與此åŒæ™‚,我們想測試與此å•é¡Œç›¸é—œçš„ä¸åŒæƒ³æ³•ï¼š
1210 </target>
1035 <context-group name="null"> 1211 <context-group name="null">
1036 <context context-type="linenumber">85</context> 1212 <context context-type="linenumber">85</context>
1037 </context-group> 1213 </context-group>
@@ -1071,18 +1247,53 @@
1071 <context context-type="linenumber">95</context> 1247 <context context-type="linenumber">95</context>
1072 </context-group> 1248 </context-group>
1073 </trans-unit> 1249 </trans-unit>
1250 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1251 <source>Banned</source>
1252 <target>已阻擋</target>
1253 <context-group name="null">
1254 <context context-type="linenumber">12</context>
1255 </context-group>
1256 </trans-unit>
1257 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1258 <source>Muted</source>
1259 <target>å·²éœéŸ³</target>
1260 <context-group name="null">
1261 <context context-type="linenumber">13</context>
1262 </context-group>
1263 </trans-unit>
1264 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1265 <source>Muted by your instance</source>
1266 <target>被您的實體éœéŸ³</target>
1267 <context-group name="null">
1268 <context context-type="linenumber">14</context>
1269 </context-group>
1270 </trans-unit>
1271 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1272 <source>Instance muted</source>
1273 <target>實體已éœéŸ³</target>
1274 <context-group name="null">
1275 <context context-type="linenumber">15</context>
1276 </context-group>
1277 </trans-unit>
1278 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1279 <source>Instance muted by your instance</source>
1280 <target>被您的實體éœéŸ³çš„實體</target>
1281 <context-group name="null">
1282 <context context-type="linenumber">16</context>
1283 </context-group>
1284 </trans-unit>
1074 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1285 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1075 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1286 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1076 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> 個訂閱者</target> 1287 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> 個訂閱者</target>
1077 <context-group name="null"> 1288 <context-group name="null">
1078 <context context-type="linenumber">12</context> 1289 <context context-type="linenumber">24</context>
1079 </context-group> 1290 </context-group>
1080 </trans-unit> 1291 </trans-unit>
1081 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8"> 1292 <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
1082 <source>Video channels</source> 1293 <source>Video channels</source>
1083 <target>影片頻é“</target> 1294 <target>影片頻é“</target>
1084 <context-group name="null"> 1295 <context-group name="null">
1085 <context context-type="linenumber">19</context> 1296 <context context-type="linenumber">31</context>
1086 </context-group> 1297 </context-group>
1087 </trans-unit> 1298 </trans-unit>
1088 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a"> 1299 <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
@@ -1124,49 +1335,49 @@
1124 <source>Short description</source> 1335 <source>Short description</source>
1125 <target>短æè¿°</target> 1336 <target>短æè¿°</target>
1126 <context-group name="null"> 1337 <context-group name="null">
1127 <context context-type="linenumber">22</context> 1338 <context context-type="linenumber">21</context>
1128 </context-group> 1339 </context-group>
1129 </trans-unit> 1340 </trans-unit>
1130 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1341 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1131 <source>Default client route</source> 1342 <source>Default client route</source>
1132 <target>é è¨­å®¢æˆ¶ç«¯è·¯ç”±</target> 1343 <target>é è¨­å®¢æˆ¶ç«¯è·¯ç”±</target>
1133 <context-group name="null"> 1344 <context-group name="null">
1134 <context context-type="linenumber">55</context> 1345 <context context-type="linenumber">48</context>
1135 </context-group> 1346 </context-group>
1136 </trans-unit> 1347 </trans-unit>
1137 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1348 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1138 <source>Videos Overview</source> 1349 <source>Videos Overview</source>
1139 <target>影片概覽</target> 1350 <target>影片概覽</target>
1140 <context-group name="null"> 1351 <context-group name="null">
1141 <context context-type="linenumber">58</context> 1352 <context context-type="linenumber">51</context>
1142 </context-group> 1353 </context-group>
1143 </trans-unit> 1354 </trans-unit>
1144 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1355 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1145 <source>Videos Trending</source> 1356 <source>Videos Trending</source>
1146 <target>影片趨勢</target> 1357 <target>影片趨勢</target>
1147 <context-group name="null"> 1358 <context-group name="null">
1148 <context context-type="linenumber">59</context> 1359 <context context-type="linenumber">52</context>
1149 </context-group> 1360 </context-group>
1150 </trans-unit> 1361 </trans-unit>
1151 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1362 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1152 <source>Videos Recently Added</source> 1363 <source>Videos Recently Added</source>
1153 <target>最近新增的影片</target> 1364 <target>最近新增的影片</target>
1154 <context-group name="null"> 1365 <context-group name="null">
1155 <context context-type="linenumber">60</context> 1366 <context context-type="linenumber">53</context>
1156 </context-group> 1367 </context-group>
1157 </trans-unit> 1368 </trans-unit>
1158 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1369 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1159 <source>Local videos</source> 1370 <source>Local videos</source>
1160 <target>本地影片</target> 1371 <target>本地影片</target>
1161 <context-group name="null"> 1372 <context-group name="null">
1162 <context context-type="linenumber">61</context> 1373 <context context-type="linenumber">54</context>
1163 </context-group> 1374 </context-group>
1164 </trans-unit> 1375 </trans-unit>
1165 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1376 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1166 <source>Policy on videos containing sensitive content</source> 1377 <source>Policy on videos containing sensitive content</source>
1167 <target>包å«æ•æ„Ÿå…§å®¹çš„影片政策</target> 1378 <target>包å«æ•æ„Ÿå…§å®¹çš„影片政策</target>
1168 <context-group name="null"> 1379 <context-group name="null">
1169 <context context-type="linenumber">70</context> 1380 <context context-type="linenumber">61</context>
1170 </context-group> 1381 </context-group>
1171 </trans-unit> 1382 </trans-unit>
1172 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1383 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1201,21 +1412,42 @@
1201 <source>Signup enabled</source> 1412 <source>Signup enabled</source>
1202 <target>已啟用註冊</target> 1413 <target>已啟用註冊</target>
1203 <context-group name="null"> 1414 <context-group name="null">
1204 <context context-type="linenumber">92</context> 1415 <context context-type="linenumber">84</context>
1205 </context-group> 1416 </context-group>
1206 </trans-unit> 1417 </trans-unit>
1207 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1418 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1208 <source>Signup requires email verification</source> 1419 <source>Signup requires email verification</source>
1209 <target>註冊需è¦é›»å­éƒµä»¶é©—è­‰</target> 1420 <target>註冊需è¦é›»å­éƒµä»¶é©—è­‰</target>
1210 <context-group name="null"> 1421 <context-group name="null">
1211 <context context-type="linenumber">97</context> 1422 <context context-type="linenumber">91</context>
1212 </context-group> 1423 </context-group>
1213 </trans-unit> 1424 </trans-unit>
1214 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1425 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1215 <source>Signup limit</source> 1426 <source>Signup limit</source>
1216 <target>é™åˆ¶è¨»å†Š</target> 1427 <target>é™åˆ¶è¨»å†Š</target>
1217 <context-group name="null"> 1428 <context-group name="null">
1218 <context context-type="linenumber">101</context> 1429 <context context-type="linenumber">96</context>
1430 </context-group>
1431 </trans-unit>
1432 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1433 <source>Users</source>
1434 <target>使用者</target>
1435 <context-group name="null">
1436 <context context-type="linenumber">105</context>
1437 </context-group>
1438 </trans-unit>
1439 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1440 <source>User default video quota</source>
1441 <target>使用者é è¨­å½±ç‰‡é…é¡</target>
1442 <context-group name="null">
1443 <context context-type="linenumber">109</context>
1444 </context-group>
1445 </trans-unit>
1446 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1447 <source>User default daily upload limit</source>
1448 <target>é è¨­ä½¿ç”¨è€…æ¯æ—¥ä¸Šå‚³é™åˆ¶</target>
1449 <context-group name="null">
1450 <context context-type="linenumber">121</context>
1219 </context-group> 1451 </context-group>
1220 </trans-unit> 1452 </trans-unit>
1221 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1453 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -1225,53 +1457,32 @@
1225 <context context-type="linenumber">42</context> 1457 <context context-type="linenumber">42</context>
1226 </context-group> 1458 </context-group>
1227 </trans-unit> 1459 </trans-unit>
1228 <trans-unit id="e9964673c94eb0b4ff8088c84018217c031f31ce"> 1460 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1229 <source>Video import with HTTP enabled</source> 1461 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1230 <target>已啟用 HTTP 匯入影片</target> 1462 <target>以 HTTP URL 匯入影片(如 YouTube)已啟用</target>
1231 <context-group name="null"> 1463 <context-group name="null">
1232 <context context-type="linenumber">115</context> 1464 <context context-type="linenumber">141</context>
1233 </context-group> 1465 </context-group>
1234 </trans-unit> 1466 </trans-unit>
1235 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1467 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1236 <source>Video import with a torrent file or a magnet URI enabled</source> 1468 <source>Video import with a torrent file or a magnet URI enabled</source>
1237 <target>已啟用種å­æª”案或ç£åŠ›é€£çµåŒ¯å…¥å½±ç‰‡</target> 1469 <target>已啟用種å­æª”案或ç£åŠ›é€£çµåŒ¯å…¥å½±ç‰‡</target>
1238 <context-group name="null"> 1470 <context-group name="null">
1239 <context context-type="linenumber">120</context> 1471 <context context-type="linenumber">148</context>
1240 </context-group> 1472 </context-group>
1241 </trans-unit> 1473 </trans-unit>
1242 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1474 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1243 <source>Administrator</source> 1475 <source>Administrator</source>
1244 <target>管ç†å“¡</target> 1476 <target>管ç†å“¡</target>
1245 <context-group name="null"> 1477 <context-group name="null">
1246 <context context-type="linenumber">123</context> 1478 <context context-type="linenumber">155</context>
1247 </context-group> 1479 </context-group>
1248 </trans-unit> 1480 </trans-unit>
1249 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1481 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1250 <source>Admin email</source> 1482 <source>Admin email</source>
1251 <target>管ç†é›»å­éƒµä»¶</target> 1483 <target>管ç†é›»å­éƒµä»¶</target>
1252 <context-group name="null"> 1484 <context-group name="null">
1253 <context context-type="linenumber">126</context> 1485 <context context-type="linenumber">158</context>
1254 </context-group>
1255 </trans-unit>
1256 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1257 <source>Users</source>
1258 <target>使用者</target>
1259 <context-group name="null">
1260 <context context-type="linenumber">136</context>
1261 </context-group>
1262 </trans-unit>
1263 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1264 <source>User default video quota</source>
1265 <target>使用者é è¨­å½±ç‰‡é…é¡</target>
1266 <context-group name="null">
1267 <context context-type="linenumber">139</context>
1268 </context-group>
1269 </trans-unit>
1270 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1271 <source>User default daily upload limit</source>
1272 <target>é è¨­ä½¿ç”¨è€…æ¯æ—¥ä¸Šå‚³é™åˆ¶</target>
1273 <context-group name="null">
1274 <context context-type="linenumber">153</context>
1275 </context-group> 1486 </context-group>
1276 </trans-unit> 1487 </trans-unit>
1277 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1488 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1285,81 +1496,70 @@
1285 <source>Twitter</source> 1496 <source>Twitter</source>
1286 <target>Twitter</target> 1497 <target>Twitter</target>
1287 <context-group name="null"> 1498 <context-group name="null">
1288 <context context-type="linenumber">170</context> 1499 <context context-type="linenumber">178</context>
1289 </context-group> 1500 </context-group>
1290 </trans-unit> 1501 </trans-unit>
1291 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524"> 1502 <trans-unit id="7fdb41bbf2ee042ec5f68725a1c16a1c97f3e524">
1292 <source>Your Twitter username</source> 1503 <source>Your Twitter username</source>
1293 <target>您的 Twitter 使用者å稱</target> 1504 <target>您的 Twitter 使用者å稱</target>
1294 <context-group name="null"> 1505 <context-group name="null">
1295 <context context-type="linenumber">173</context> 1506 <context context-type="linenumber">184</context>
1296 </context-group> 1507 </context-group>
1297 </trans-unit> 1508 </trans-unit>
1298 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1509 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1299 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1510 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1300 <target>指示發佈影片的網é æˆ–平臺的 Twitter 帳號</target> 1511 <target>指示發佈影片的網é æˆ–平臺的 Twitter 帳號</target>
1301 <context-group name="null"> 1512 <context-group name="null">
1302 <context context-type="linenumber">176</context> 1513 <context context-type="linenumber">187</context>
1303 </context-group> 1514 </context-group>
1304 </trans-unit> 1515 </trans-unit>
1305 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1516 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1306 <source>Instance whitelisted by Twitter</source> 1517 <source>Instance whitelisted by Twitter</source>
1307 <target>ç”± Twitter 列入白å單的實體</target> 1518 <target>ç”± Twitter 列入白å單的實體</target>
1308 <context-group name="null"> 1519 <context-group name="null">
1309 <context context-type="linenumber">189</context> 1520 <context context-type="linenumber">199</context>
1310 </context-group>
1311 </trans-unit>
1312 <trans-unit id="a62985a76e947b0068ad328b5172d5af5b125b9a">
1313 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1314 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1315 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1316 <target>如果您的實體在 Twitter 上是白å單的話,在 Twitter 上分享 PeerTube 的影片就會出ç¾åµŒå…¥å¼çš„影片。&lt;br /&gt;
1317 若實體ä¸åœ¨ç™½å單內,我們使用圖片連çµå¡ï¼Œé€™å°‡æœƒé‡æ–°å°Žå‘到您的 PeerTube 實體。&lt;br /&gt;&lt;br /&gt;
1318 勾é¸æ­¤æ–¹æ¡†ï¼Œå„²å­˜è¨­å®šä¸¦ä»¥æ‚¨çš„實體的影片 URL 測試 (https://example.com/videos/watch/blabla) 在 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; 以檢視您的實體是å¦åœ¨ç™½å單內。</target>
1319 <context-group name="null">
1320 <context context-type="linenumber">190</context>
1321 </context-group> 1521 </context-group>
1322 </trans-unit> 1522 </trans-unit>
1323 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1523 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
1324 <source>Services</source> 1524 <source>Services</source>
1325 <target>æœå‹™</target> 1525 <target>æœå‹™</target>
1326 <context-group name="null"> 1526 <context-group name="null">
1327 <context context-type="linenumber">168</context> 1527 <context context-type="linenumber">176</context>
1328 </context-group> 1528 </context-group>
1329 </trans-unit> 1529 </trans-unit>
1330 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490"> 1530 <trans-unit id="fe22d2c0020e913ee4b75ec22a3abc8814810490">
1331 <source>Transcoding</source> 1531 <source>Transcoding</source>
1332 <target>轉æ›ç·¨ç¢¼</target> 1532 <target>轉æ›ç·¨ç¢¼</target>
1333 <context-group name="null"> 1533 <context-group name="null">
1334 <context context-type="linenumber">200</context> 1534 <context context-type="linenumber">215</context>
1335 </context-group> 1535 </context-group>
1336 </trans-unit> 1536 </trans-unit>
1337 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1537 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1338 <source>Transcoding enabled</source> 1538 <source>Transcoding enabled</source>
1339 <target>轉æ›ç·¨ç¢¼å·²å•Ÿç”¨</target> 1539 <target>轉æ›ç·¨ç¢¼å·²å•Ÿç”¨</target>
1340 <context-group name="null"> 1540 <context-group name="null">
1341 <context context-type="linenumber">204</context> 1541 <context context-type="linenumber">221</context>
1342 </context-group> 1542 </context-group>
1343 </trans-unit> 1543 </trans-unit>
1344 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1544 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1345 <source>If you disable transcoding, many videos from your users will not work!</source> 1545 <source>If you disable transcoding, many videos from your users will not work!</source>
1346 <target>若您åœç”¨è½‰æ›ç·¨ç¢¼ï¼Œå¾žæ‚¨çš„使用者們而來的許多影片將會無法é‹ä½œï¼</target> 1546 <target>若您åœç”¨è½‰æ›ç·¨ç¢¼ï¼Œå¾žæ‚¨çš„使用者們而來的許多影片將會無法é‹ä½œï¼</target>
1347 <context-group name="null"> 1547 <context-group name="null">
1348 <context context-type="linenumber">205</context> 1548 <context context-type="linenumber">222</context>
1349 </context-group> 1549 </context-group>
1350 </trans-unit> 1550 </trans-unit>
1351 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1551 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1352 <source>Transcoding threads</source> 1552 <source>Transcoding threads</source>
1353 <target>轉æ›ç·¨ç¢¼åŸ·è¡Œç·’</target> 1553 <target>轉æ›ç·¨ç¢¼åŸ·è¡Œç·’</target>
1354 <context-group name="null"> 1554 <context-group name="null">
1355 <context context-type="linenumber">211</context> 1555 <context context-type="linenumber">237</context>
1356 </context-group> 1556 </context-group>
1357 </trans-unit> 1557 </trans-unit>
1358 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1558 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1359 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1559 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1360 <target>解æžåº¦ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 已啟用</target> 1560 <target>解æžåº¦ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 已啟用</target>
1361 <context-group name="null"> 1561 <context-group name="null">
1362 <context context-type="linenumber">227</context> 1562 <context context-type="linenumber">252</context>
1363 </context-group> 1563 </context-group>
1364 </trans-unit> 1564 </trans-unit>
1365 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1565 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1374,105 +1574,70 @@
1374 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1574 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1375 </target> 1575 </target>
1376 <context-group name="null"> 1576 <context-group name="null">
1377 <context context-type="linenumber">233</context> 1577 <context context-type="linenumber">260</context>
1378 </context-group> 1578 </context-group>
1379 </trans-unit> 1579 </trans-unit>
1380 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1580 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1381 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1581 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1382 <target>有一些檔案並未è¯ç›ŸåŒ–(é è¦½ã€å­—幕)。我們會直接從原始實體擷å–它們並快å–。</target> 1582 <target>有一些檔案並未è¯ç›ŸåŒ–(é è¦½ã€å­—幕)。我們會直接從原始實體擷å–它們並快å–。</target>
1383 <context-group name="null"> 1583 <context-group name="null">
1384 <context context-type="linenumber">238</context> 1584 <context context-type="linenumber">265</context>
1385 </context-group> 1585 </context-group>
1386 </trans-unit> 1586 </trans-unit>
1387 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1587 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1388 <source>Previews cache size</source> 1588 <source>Previews cache size</source>
1389 <target>é è¦½å¿«å–大å°</target> 1589 <target>é è¦½å¿«å–大å°</target>
1390 <context-group name="null"> 1590 <context-group name="null">
1391 <context context-type="linenumber">243</context> 1591 <context context-type="linenumber">271</context>
1392 </context-group> 1592 </context-group>
1393 </trans-unit> 1593 </trans-unit>
1394 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1594 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1395 <source>Video captions cache size</source> 1595 <source>Video captions cache size</source>
1396 <target>影片字幕快å–大å°</target> 1596 <target>影片字幕快å–大å°</target>
1397 <context-group name="null"> 1597 <context-group name="null">
1398 <context context-type="linenumber">254</context> 1598 <context context-type="linenumber">280</context>
1399 </context-group> 1599 </context-group>
1400 </trans-unit> 1600 </trans-unit>
1401 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1601 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1402 <source>Customizations</source> 1602 <source>Customizations</source>
1403 <target>自訂</target> 1603 <target>自訂</target>
1404 <context-group name="null"> 1604 <context-group name="null">
1405 <context context-type="linenumber">264</context> 1605 <context context-type="linenumber">289</context>
1406 </context-group> 1606 </context-group>
1407 </trans-unit> 1607 </trans-unit>
1408 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1608 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1409 <source>JavaScript</source> 1609 <source>JavaScript</source>
1410 <target>JavaScript</target> 1610 <target>JavaScript</target>
1411 <context-group name="null"> 1611 <context-group name="null">
1412 <context context-type="linenumber">267</context> 1612 <context context-type="linenumber">294</context>
1413 </context-group> 1613 </context-group>
1414 </trans-unit> 1614 </trans-unit>
1415 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1615 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1416 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1616 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1417 <target>直接編寫 JavaScript 程å¼ç¢¼ã€‚&lt;br /&gt;範例:&lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</target> 1617 <target>直接編寫 JavaScript 程å¼ç¢¼ã€‚&lt;br /&gt;範例:&lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</target>
1418 <context-group name="null"> 1618 <context-group name="null">
1419 <context context-type="linenumber">270</context> 1619 <context context-type="linenumber">297</context>
1420 </context-group>
1421 </trans-unit>
1422 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1423 <source>
1424 Write directly CSS code. Example:&lt;br /&gt;
1425 &lt;pre&gt;
1426 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1427 background-color: red;
1428 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1429 &lt;/pre&gt;
1430
1431 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1432 &lt;pre&gt;
1433 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1434 color: red;
1435 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1436 &lt;/pre&gt;
1437 </source>
1438 <target>
1439 直接撰寫 CSS 程å¼ç¢¼ã€‚範例:&lt;br /&gt;
1440 &lt;pre&gt;
1441 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1442 background-color: red;
1443 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1444 &lt;/pre&gt;
1445
1446 附加 &lt;em&gt;#custom-css&lt;/em&gt; 以覆寫樣å¼ã€‚範例:
1447 &lt;pre&gt;
1448 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1449 color: red;
1450 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1451 &lt;/pre&gt;
1452 </target>
1453 <context-group name="null">
1454 <context context-type="linenumber">286</context>
1455 </context-group> 1620 </context-group>
1456 </trans-unit> 1621 </trans-unit>
1457 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1622 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1458 <source>Advanced configuration</source> 1623 <source>Advanced configuration</source>
1459 <target>進階設定</target> 1624 <target>進階設定</target>
1460 <context-group name="null"> 1625 <context-group name="null">
1461 <context context-type="linenumber">197</context> 1626 <context context-type="linenumber">212</context>
1462 </context-group> 1627 </context-group>
1463 </trans-unit> 1628 </trans-unit>
1464 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1629 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1465 <source>Update configuration</source> 1630 <source>Update configuration</source>
1466 <target>更新設定</target> 1631 <target>更新設定</target>
1467 <context-group name="null"> 1632 <context-group name="null">
1468 <context context-type="linenumber">314</context> 1633 <context context-type="linenumber">340</context>
1469 </context-group> 1634 </context-group>
1470 </trans-unit> 1635 </trans-unit>
1471 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1636 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1472 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1637 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1473 <target>設定似乎無效。請在ä¸åŒçš„分é ä¸­æœå°‹æ½›åœ¨çš„錯誤。</target> 1638 <target>設定似乎無效。請在ä¸åŒçš„分é ä¸­æœå°‹æ½›åœ¨çš„錯誤。</target>
1474 <context-group name="null"> 1639 <context-group name="null">
1475 <context context-type="linenumber">315</context> 1640 <context context-type="linenumber">341</context>
1476 </context-group> 1641 </context-group>
1477 </trans-unit> 1642 </trans-unit>
1478 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1643 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1545,6 +1710,13 @@
1545 <context context-type="linenumber">21</context> 1710 <context context-type="linenumber">21</context>
1546 </context-group> 1711 </context-group>
1547 </trans-unit> 1712 </trans-unit>
1713 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1714 <source>Filter...</source>
1715 <target>éŽæ¿¾å™¨â€¦â€¦</target>
1716 <context-group name="null">
1717 <context context-type="linenumber">27</context>
1718 </context-group>
1719 </trans-unit>
1548 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1720 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1549 <source>ID</source> 1721 <source>ID</source>
1550 <target>ID</target> 1722 <target>ID</target>
@@ -1556,14 +1728,14 @@
1556 <source>Score</source> 1728 <source>Score</source>
1557 <target>分數</target> 1729 <target>分數</target>
1558 <context-group name="null"> 1730 <context-group name="null">
1559 <context context-type="linenumber">8</context> 1731 <context context-type="linenumber">17</context>
1560 </context-group> 1732 </context-group>
1561 </trans-unit> 1733 </trans-unit>
1562 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767"> 1734 <trans-unit id="fe22ca53e651df951dac25b67c17894b0980f767">
1563 <source>Host</source> 1735 <source>Host</source>
1564 <target>主機</target> 1736 <target>主機</target>
1565 <context-group name="null"> 1737 <context-group name="null">
1566 <context context-type="linenumber">8</context> 1738 <context context-type="linenumber">19</context>
1567 </context-group> 1739 </context-group>
1568 </trans-unit> 1740 </trans-unit>
1569 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b"> 1741 <trans-unit id="873b72903b1858a9cd6c8967521030b4d7d1435b">
@@ -1580,6 +1752,27 @@
1580 <context context-type="linenumber">11</context> 1752 <context context-type="linenumber">11</context>
1581 </context-group> 1753 </context-group>
1582 </trans-unit> 1754 </trans-unit>
1755 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1756 <source>Accepted</source>
1757 <target>已接å—</target>
1758 <context-group name="null">
1759 <context context-type="linenumber">32</context>
1760 </context-group>
1761 </trans-unit>
1762 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1763 <source>Pending</source>
1764 <target>擱置中</target>
1765 <context-group name="null">
1766 <context context-type="linenumber">33</context>
1767 </context-group>
1768 </trans-unit>
1769 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1770 <source>Redundancy allowed</source>
1771 <target>å…許冗餘</target>
1772 <context-group name="null">
1773 <context context-type="linenumber">22</context>
1774 </context-group>
1775 </trans-unit>
1583 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1776 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1584 <source>Manage follows</source> 1777 <source>Manage follows</source>
1585 <target>管ç†è¿½è¹¤</target> 1778 <target>管ç†è¿½è¹¤</target>
@@ -1668,7 +1861,7 @@
1668 <source>Role</source> 1861 <source>Role</source>
1669 <target>角色</target> 1862 <target>角色</target>
1670 <context-group name="null"> 1863 <context-group name="null">
1671 <context context-type="linenumber">20</context> 1864 <context context-type="linenumber">43</context>
1672 </context-group> 1865 </context-group>
1673 </trans-unit> 1866 </trans-unit>
1674 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345"> 1867 <trans-unit id="42e3c0e89177ca135974221eaf0e4e836c32e345">
@@ -1691,64 +1884,60 @@
1691 <context context-type="linenumber">72</context> 1884 <context context-type="linenumber">72</context>
1692 </context-group> 1885 </context-group>
1693 </trans-unit> 1886 </trans-unit>
1694 <trans-unit id="ffd94bfbcc0363386484e45e8bdc7b2361a95a33"> 1887 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1695 <source>Ban <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></source> 1888 <source>Users list</source>
1696 <target>阻擋 <x id="INTERPOLATION" equiv-text="{{ userToBan.username }}"/></target> 1889 <target>使用者清單</target>
1697 <context-group name="null"> 1890 <context-group name="null">
1698 <context context-type="linenumber">3</context> 1891 <context context-type="linenumber">2</context>
1699 </context-group> 1892 </context-group>
1700 </trans-unit> 1893 </trans-unit>
1701 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125"> 1894 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1702 <source>Reason...</source> 1895 <source>Batch actions</source>
1703 <target>ç†ç”±â€¦â€¦</target> 1896 <target>批次動作</target>
1704 <context-group name="null"> 1897 <context-group name="null">
1705 <context context-type="linenumber">11</context> 1898 <context context-type="linenumber">19</context>
1706 </context-group> 1899 </context-group>
1707 </trans-unit> 1900 </trans-unit>
1708 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251"> 1901 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1709 <source> 1902 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1710 A banned user will no longer be able to login. 1903 <target>使用者å稱 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1711 </source>
1712 <target>
1713 被阻擋的使用者將ä¸å†èƒ½ç™»å…¥ã€‚
1714 </target>
1715 <context-group name="null"> 1904 <context-group name="null">
1716 <context context-type="linenumber">17</context> 1905 <context context-type="linenumber">40</context>
1717 </context-group> 1906 </context-group>
1718 </trans-unit> 1907 </trans-unit>
1719 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020"> 1908 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1720 <source>Ban this user</source> 1909 <source>(banned)</source>
1721 <target>阻擋此使用者</target> 1910 <target>(已阻擋)</target>
1722 <context-group name="null"> 1911 <context-group name="null">
1723 <context context-type="linenumber">25</context> 1912 <context context-type="linenumber">65</context>
1724 </context-group> 1913 </context-group>
1725 </trans-unit> 1914 </trans-unit>
1726 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1915 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1727 <source>Users list</source> 1916 <source>Go to the account page</source>
1728 <target>使用者清單</target> 1917 <target>到帳號é é¢</target>
1729 <context-group name="null"> 1918 <context-group name="null">
1730 <context context-type="linenumber">2</context> 1919 <context context-type="linenumber">133</context>
1731 </context-group> 1920 </context-group>
1732 </trans-unit> 1921 </trans-unit>
1733 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1922 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1734 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1923 <source>User's email must be verified to login</source>
1735 <target>使用者å稱 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1924 <target>使用者的電å­éƒµä»¶å¿…須驗證éŽæ‰èƒ½ç™»å…¥</target>
1736 <context-group name="null"> 1925 <context-group name="null">
1737 <context context-type="linenumber">17</context> 1926 <context context-type="linenumber">72</context>
1738 </context-group> 1927 </context-group>
1739 </trans-unit> 1928 </trans-unit>
1740 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c"> 1929 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1741 <source>Actions</source> 1930 <source>User's email is verified / User can login without email verification</source>
1742 <target>動作</target> 1931 <target>使用者的電å­éƒµä»¶å·²é©—è­‰ï¼ä½¿ç”¨è€…å¯ä»¥ä¸é€éŽé›»å­éƒµä»¶é©—證登入</target>
1743 <context-group name="null"> 1932 <context-group name="null">
1744 <context context-type="linenumber">33</context> 1933 <context context-type="linenumber">76</context>
1745 </context-group> 1934 </context-group>
1746 </trans-unit> 1935 </trans-unit>
1747 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1936 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1748 <source>Ban reason:</source> 1937 <source>Ban reason:</source>
1749 <target>阻擋ç†ç”±ï¼š</target> 1938 <target>阻擋ç†ç”±ï¼š</target>
1750 <context-group name="null"> 1939 <context-group name="null">
1751 <context context-type="linenumber">51</context> 1940 <context context-type="linenumber">95</context>
1752 </context-group> 1941 </context-group>
1753 </trans-unit> 1942 </trans-unit>
1754 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1943 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1811,6 +2000,13 @@
1811 <context context-type="linenumber">33</context> 2000 <context context-type="linenumber">33</context>
1812 </context-group> 2001 </context-group>
1813 </trans-unit> 2002 </trans-unit>
2003 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2004 <source>Actions</source>
2005 <target>動作</target>
2006 <context-group name="null">
2007 <context context-type="linenumber">35</context>
2008 </context-group>
2009 </trans-unit>
1814 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2010 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1815 <source>Reason:</source> 2011 <source>Reason:</source>
1816 <target>ç†ç”±ï¼š</target> 2012 <target>ç†ç”±ï¼š</target>
@@ -1843,14 +2039,14 @@
1843 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2039 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1844 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2040 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1845 <context-group name="null"> 2041 <context-group name="null">
1846 <context context-type="linenumber">10</context> 2042 <context context-type="linenumber">11</context>
1847 </context-group> 2043 </context-group>
1848 </trans-unit> 2044 </trans-unit>
1849 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2045 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1850 <source>Blacklist reason:</source> 2046 <source>Blacklist reason:</source>
1851 <target>黑åå–®ç†ç”±ï¼š</target> 2047 <target>黑åå–®ç†ç”±ï¼š</target>
1852 <context-group name="null"> 2048 <context-group name="null">
1853 <context context-type="linenumber">41</context> 2049 <context context-type="linenumber">43</context>
1854 </context-group> 2050 </context-group>
1855 </trans-unit> 2051 </trans-unit>
1856 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2052 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1874,53 +2070,39 @@
1874 <context context-type="linenumber">7</context> 2070 <context context-type="linenumber">7</context>
1875 </context-group> 2071 </context-group>
1876 </trans-unit> 2072 </trans-unit>
1877 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2073 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1878 <source>My settings</source> 2074 <source>Muted accounts</source>
1879 <target>我的設定</target> 2075 <target>å·²éœéŸ³çš„帳號</target>
1880 <context-group name="null"> 2076 <context-group name="null">
1881 <context context-type="linenumber">3</context> 2077 <context context-type="linenumber">2</context>
1882 </context-group> 2078 </context-group>
1883 </trans-unit> 2079 </trans-unit>
1884 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432"> 2080 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1885 <source>My library</source> 2081 <source>Muted servers</source>
1886 <target>我的媒體庫</target> 2082 <target>å·²éœéŸ³ä¼ºæœå™¨</target>
1887 <context-group name="null"> 2083 <context-group name="null">
1888 <context context-type="linenumber">7</context> 2084 <context context-type="linenumber">11</context>
1889 </context-group> 2085 </context-group>
1890 </trans-unit> 2086 </trans-unit>
1891 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f"> 2087 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
1892 <source>My channels</source> 2088 <source>Account</source>
1893 <target>我的頻é“</target> 2089 <target>帳號</target>
1894 <context-group name="null"> 2090 <context-group name="null">
1895 <context context-type="linenumber">12</context> 2091 <context context-type="linenumber">12</context>
1896 </context-group> 2092 </context-group>
1897 </trans-unit> 2093 </trans-unit>
1898 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2094 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
1899 <source>My videos</source> 2095 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1900 <target>我的影片</target> 2096 <target>éœéŸ³æ–¼ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1901 <context-group name="null">
1902 <context context-type="linenumber">14</context>
1903 </context-group>
1904 </trans-unit>
1905 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1906 <source>My subscriptions</source>
1907 <target>我的訂閱</target>
1908 <context-group name="null"> 2097 <context-group name="null">
1909 <context context-type="linenumber">16</context> 2098 <context context-type="linenumber">13</context>
1910 </context-group>
1911 </trans-unit>
1912 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1913 <source>My imports</source>
1914 <target>我的匯入</target>
1915 <context-group name="null">
1916 <context context-type="linenumber">18</context>
1917 </context-group> 2099 </context-group>
1918 </trans-unit> 2100 </trans-unit>
1919 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7"> 2101 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
1920 <source>Ownership changes</source> 2102 <source>Unmute</source>
1921 <target>所有權變更</target> 2103 <target>解除éœéŸ³</target>
1922 <context-group name="null"> 2104 <context-group name="null">
1923 <context context-type="linenumber">22</context> 2105 <context context-type="linenumber">23</context>
1924 </context-group> 2106 </context-group>
1925 </trans-unit> 2107 </trans-unit>
1926 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2108 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1934,21 +2116,21 @@
1934 <source>Profile</source> 2116 <source>Profile</source>
1935 <target>簡介</target> 2117 <target>簡介</target>
1936 <context-group name="null"> 2118 <context-group name="null">
1937 <context context-type="linenumber">8</context> 2119 <context context-type="linenumber">7</context>
1938 </context-group> 2120 </context-group>
1939 </trans-unit> 2121 </trans-unit>
1940 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2122 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1941 <source>Video settings</source> 2123 <source>Video settings</source>
1942 <target>影片設定</target> 2124 <target>影片設定</target>
1943 <context-group name="null"> 2125 <context-group name="null">
1944 <context context-type="linenumber">15</context> 2126 <context context-type="linenumber">16</context>
1945 </context-group> 2127 </context-group>
1946 </trans-unit> 2128 </trans-unit>
1947 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2129 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1948 <source>Danger zone</source> 2130 <source>Danger zone</source>
1949 <target>å±éšªå€åŸŸ</target> 2131 <target>å±éšªå€åŸŸ</target>
1950 <context-group name="null"> 2132 <context-group name="null">
1951 <context context-type="linenumber">18</context> 2133 <context context-type="linenumber">19</context>
1952 </context-group> 2134 </context-group>
1953 </trans-unit> 2135 </trans-unit>
1954 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2136 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1976,13 +2158,6 @@
1976 <context context-type="linenumber">35</context> 2158 <context context-type="linenumber">35</context>
1977 </context-group> 2159 </context-group>
1978 </trans-unit> 2160 </trans-unit>
1979 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1980 <source>Submit</source>
1981 <target>éžäº¤</target>
1982 <context-group name="null">
1983 <context context-type="linenumber">24</context>
1984 </context-group>
1985 </trans-unit>
1986 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2161 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1987 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2162 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1988 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target> 2163 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target>
@@ -2058,6 +2233,13 @@ When you will upload a video in this channel, the video support field will be au
2058 <context context-type="linenumber">8</context> 2233 <context context-type="linenumber">8</context>
2059 </context-group> 2234 </context-group>
2060 </trans-unit> 2235 </trans-unit>
2236 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2237 <source>You don't have any subscriptions yet.</source>
2238 <target>您還沒有任何訂閱。</target>
2239 <context-group name="null">
2240 <context context-type="linenumber">1</context>
2241 </context-group>
2242 </trans-unit>
2061 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2243 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
2062 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2244 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
2063 <target>由 <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/> 建立</target> 2245 <target>由 <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/> 建立</target>
@@ -2134,6 +2316,13 @@ When you will upload a video in this channel, the video support field will be au
2134 <context context-type="linenumber">47</context> 2316 <context context-type="linenumber">47</context>
2135 </context-group> 2317 </context-group>
2136 </trans-unit> 2318 </trans-unit>
2319 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2320 <source>Muted instances</source>
2321 <target>å·²éœéŸ³çš„實體</target>
2322 <context-group name="null">
2323 <context context-type="linenumber">2</context>
2324 </context-group>
2325 </trans-unit>
2137 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2326 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2138 <source>Change password</source> 2327 <source>Change password</source>
2139 <target>變更密碼</target> 2328 <target>變更密碼</target>
@@ -2141,6 +2330,13 @@ When you will upload a video in this channel, the video support field will be au
2141 <context context-type="linenumber">30</context> 2330 <context context-type="linenumber">30</context>
2142 </context-group> 2331 </context-group>
2143 </trans-unit> 2332 </trans-unit>
2333 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2334 <source>Current password</source>
2335 <target>ç›®å‰çš„密碼</target>
2336 <context-group name="null">
2337 <context context-type="linenumber">7</context>
2338 </context-group>
2339 </trans-unit>
2144 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2340 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2145 <source>New password</source> 2341 <source>New password</source>
2146 <target>新密碼</target> 2342 <target>新密碼</target>
@@ -2162,18 +2358,25 @@ When you will upload a video in this channel, the video support field will be au
2162 <context context-type="linenumber">3</context> 2358 <context context-type="linenumber">3</context>
2163 </context-group> 2359 </context-group>
2164 </trans-unit> 2360 </trans-unit>
2361 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2362 <source>Use WebTorrent to exchange parts of the video with others</source>
2363 <target>使用 WebTorrent 以與其他人交æ›å½±ç‰‡çš„一部份</target>
2364 <context-group name="null">
2365 <context context-type="linenumber">21</context>
2366 </context-group>
2367 </trans-unit>
2165 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2368 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2166 <source>Automatically plays video</source> 2369 <source>Automatically plays video</source>
2167 <target>自動播放影片</target> 2370 <target>自動播放影片</target>
2168 <context-group name="null"> 2371 <context-group name="null">
2169 <context context-type="linenumber">20</context> 2372 <context context-type="linenumber">28</context>
2170 </context-group> 2373 </context-group>
2171 </trans-unit> 2374 </trans-unit>
2172 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe"> 2375 <trans-unit id="52c9a103b812f258bcddc3d90a6e3f46871d25fe">
2173 <source>Save</source> 2376 <source>Save</source>
2174 <target>儲存</target> 2377 <target>儲存</target>
2175 <context-group name="null"> 2378 <context-group name="null">
2176 <context context-type="linenumber">23</context> 2379 <context context-type="linenumber">32</context>
2177 </context-group> 2380 </context-group>
2178 </trans-unit> 2381 </trans-unit>
2179 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2382 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
@@ -2204,6 +2407,13 @@ When you will upload a video in this channel, the video support field will be au
2204 <context context-type="linenumber">18</context> 2407 <context context-type="linenumber">18</context>
2205 </context-group> 2408 </context-group>
2206 </trans-unit> 2409 </trans-unit>
2410 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2411 <source>Once you delete your account, there is no going back. Please be certain.</source>
2412 <target>一旦您刪除了您的帳號,就ä¸èƒ½å›žé ­äº†ã€‚請考慮清楚。</target>
2413 <context-group name="null">
2414 <context context-type="linenumber">2</context>
2415 </context-group>
2416 </trans-unit>
2207 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2417 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2208 <source>Delete your account</source> 2418 <source>Delete your account</source>
2209 <target>刪除您的帳號</target> 2419 <target>刪除您的帳號</target>
@@ -2316,13 +2526,20 @@ When you will upload a video in this channel, the video support field will be au
2316 <context context-type="linenumber">159</context> 2526 <context context-type="linenumber">159</context>
2317 </context-group> 2527 </context-group>
2318 </trans-unit> 2528 </trans-unit>
2529 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2530 <source>Sorry, but something went wrong</source>
2531 <target>抱歉,ä¸éŽå¥½åƒæœ‰ä»€éº¼æ±è¥¿å‡ºéŒ¯äº†</target>
2532 <context-group name="null">
2533 <context context-type="linenumber">49</context>
2534 </context-group>
2535 </trans-unit>
2319 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2536 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2320 <source> 2537 <source>
2321 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2538 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
2322</source> 2539</source>
2323 <target>æ­å–œï¼Œåœ¨ <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> 後的影片將會匯入ï¼æ‚¨å·²ç¶“å¯ä»¥åŠ å…¥é—œæ–¼æ­¤å½±ç‰‡çš„資訊了。</target> 2540 <target>æ­å–œï¼Œåœ¨ <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> 後的影片將會匯入ï¼æ‚¨å·²ç¶“å¯ä»¥åŠ å…¥é—œæ–¼æ­¤å½±ç‰‡çš„資訊了。</target>
2324 <context-group name="null"> 2541 <context-group name="null">
2325 <context context-type="linenumber">40</context> 2542 <context context-type="linenumber">46</context>
2326 </context-group> 2543 </context-group>
2327 </trans-unit> 2544 </trans-unit>
2328 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb"> 2545 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
@@ -2339,18 +2556,25 @@ When you will upload a video in this channel, the video support field will be au
2339 <context context-type="linenumber">6</context> 2556 <context context-type="linenumber">6</context>
2340 </context-group> 2557 </context-group>
2341 </trans-unit> 2558 </trans-unit>
2559 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2560 <source>Scheduled</source>
2561 <target>排定</target>
2562 <context-group name="null">
2563 <context context-type="linenumber">25</context>
2564 </context-group>
2565 </trans-unit>
2342 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2566 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
2343 <source>Publish will be available when upload is finished</source> 2567 <source>Publish will be available when upload is finished</source>
2344 <target>上傳完æˆæ™‚å°‡å¯ç™¼ä½ˆ</target> 2568 <target>上傳完æˆæ™‚å°‡å¯ç™¼ä½ˆ</target>
2345 <context-group name="null"> 2569 <context-group name="null">
2346 <context context-type="linenumber">48</context> 2570 <context context-type="linenumber">58</context>
2347 </context-group> 2571 </context-group>
2348 </trans-unit> 2572 </trans-unit>
2349 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2573 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2350 <source>Publish</source> 2574 <source>Publish</source>
2351 <target>發佈</target> 2575 <target>發佈</target>
2352 <context-group name="null"> 2576 <context-group name="null">
2353 <context context-type="linenumber">55</context> 2577 <context context-type="linenumber">65</context>
2354 </context-group> 2578 </context-group>
2355 </trans-unit> 2579 </trans-unit>
2356 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2580 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2360,6 +2584,13 @@ When you will upload a video in this channel, the video support field will be au
2360 <context context-type="linenumber">6</context> 2584 <context context-type="linenumber">6</context>
2361 </context-group> 2585 </context-group>
2362 </trans-unit> 2586 </trans-unit>
2587 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2588 <source>Or</source>
2589 <target>或</target>
2590 <context-group name="null">
2591 <context context-type="linenumber">11</context>
2592 </context-group>
2593 </trans-unit>
2363 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 2594 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2364 <source>Paste magnet URI</source> 2595 <source>Paste magnet URI</source>
2365 <target>貼上ç£åŠ›é€£çµ</target> 2596 <target>貼上ç£åŠ›é€£çµ</target>
@@ -2380,7 +2611,7 @@ When you will upload a video in this channel, the video support field will be au
2380</source> 2611</source>
2381 <target>æ­å–œï¼Œå½±ç‰‡å°‡æœƒä½¿ç”¨ BitTorrent 匯入ï¼æ‚¨å·²ç¶“å¯ä»¥åŠ å…¥é—œæ–¼æ­¤å½±ç‰‡çš„資訊了。</target> 2612 <target>æ­å–œï¼Œå½±ç‰‡å°‡æœƒä½¿ç”¨ BitTorrent 匯入ï¼æ‚¨å·²ç¶“å¯ä»¥åŠ å…¥é—œæ–¼æ­¤å½±ç‰‡çš„資訊了。</target>
2382 <context-group name="null"> 2613 <context-group name="null">
2383 <context context-type="linenumber">48</context> 2614 <context context-type="linenumber">53</context>
2384 </context-group> 2615 </context-group>
2385 </trans-unit> 2616 </trans-unit>
2386 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860"> 2617 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
@@ -2471,6 +2702,20 @@ When you will upload a video in this channel, the video support field will be au
2471 <context context-type="linenumber">18</context> 2702 <context context-type="linenumber">18</context>
2472 </context-group> 2703 </context-group>
2473 </trans-unit> 2704 </trans-unit>
2705 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2706 <source>+ Tag</source>
2707 <target>+ 標籤</target>
2708 <context-group name="null">
2709 <context context-type="linenumber">21</context>
2710 </context-group>
2711 </trans-unit>
2712 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2713 <source>Enter a new tag</source>
2714 <target>輸入新標籤</target>
2715 <context-group name="null">
2716 <context context-type="linenumber">21</context>
2717 </context-group>
2718 </trans-unit>
2474 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2719 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2475 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2720 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2476 <target>é è¨­æƒ…æ³ä¸‹ï¼Œå½±ç‰‡æè¿°ä¸æœƒå®Œæ•´é¡¯ç¤ºï¼Œéœ€è¦æ‰‹å‹•æ“作æ‰èƒ½å±•é–‹å®ƒå€‘。</target> 2721 <target>é è¨­æƒ…æ³ä¸‹ï¼Œå½±ç‰‡æè¿°ä¸æœƒå®Œæ•´é¡¯ç¤ºï¼Œéœ€è¦æ‰‹å‹•æ“作æ‰èƒ½å±•é–‹å®ƒå€‘。</target>
@@ -2510,14 +2755,14 @@ When you will upload a video in this channel, the video support field will be au
2510 <source>Wait transcoding before publishing the video</source> 2755 <source>Wait transcoding before publishing the video</source>
2511 <target>正等待發佈影片å‰çš„轉æ›ç·¨ç¢¼</target> 2756 <target>正等待發佈影片å‰çš„轉æ›ç·¨ç¢¼</target>
2512 <context-group name="null"> 2757 <context-group name="null">
2513 <context context-type="linenumber">130</context> 2758 <context context-type="linenumber">131</context>
2514 </context-group> 2759 </context-group>
2515 </trans-unit> 2760 </trans-unit>
2516 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2761 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2517 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2762 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2518 <target>如果您決定ä¸è¦ç­‰å¾…在發佈影片å‰çš„轉æ›ç·¨ç¢¼ï¼Œå®ƒå¯èƒ½æœƒåœ¨è½‰æ›ç·¨ç¢¼çµæŸå‰éƒ½ç„¡æ³•æ’­æ”¾ã€‚</target> 2763 <target>如果您決定ä¸è¦ç­‰å¾…在發佈影片å‰çš„轉æ›ç·¨ç¢¼ï¼Œå®ƒå¯èƒ½æœƒåœ¨è½‰æ›ç·¨ç¢¼çµæŸå‰éƒ½ç„¡æ³•æ’­æ”¾ã€‚</target>
2519 <context-group name="null"> 2764 <context-group name="null">
2520 <context context-type="linenumber">131</context> 2765 <context context-type="linenumber">132</context>
2521 </context-group> 2766 </context-group>
2522 </trans-unit> 2767 </trans-unit>
2523 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2768 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2531,49 +2776,81 @@ When you will upload a video in this channel, the video support field will be au
2531 <source>Add another caption</source> 2776 <source>Add another caption</source>
2532 <target>新增其他字幕</target> 2777 <target>新增其他字幕</target>
2533 <context-group name="null"> 2778 <context-group name="null">
2534 <context context-type="linenumber">146</context> 2779 <context context-type="linenumber">147</context>
2535 </context-group> 2780 </context-group>
2536 </trans-unit> 2781 </trans-unit>
2537 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2782 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2538 <source>See the subtitle file</source> 2783 <source>See the subtitle file</source>
2539 <target>檢視字幕檔案</target> 2784 <target>檢視字幕檔案</target>
2540 <context-group name="null"> 2785 <context-group name="null">
2541 <context context-type="linenumber">155</context> 2786 <context context-type="linenumber">156</context>
2787 </context-group>
2788 </trans-unit>
2789 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2790 <source>Already uploaded ✔</source>
2791 <target>已上傳 ✔</target>
2792 <context-group name="null">
2793 <context context-type="linenumber">160</context>
2794 </context-group>
2795 </trans-unit>
2796 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2797 <source>Will be created on update</source>
2798 <target>將在更新時建立</target>
2799 <context-group name="null">
2800 <context context-type="linenumber">168</context>
2542 </context-group> 2801 </context-group>
2543 </trans-unit> 2802 </trans-unit>
2544 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2803 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2545 <source>Cancel create</source> 2804 <source>Cancel create</source>
2546 <target>å–消建立</target> 2805 <target>å–消建立</target>
2547 <context-group name="null"> 2806 <context-group name="null">
2548 <context context-type="linenumber">169</context> 2807 <context context-type="linenumber">170</context>
2808 </context-group>
2809 </trans-unit>
2810 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2811 <source>Will be deleted on update</source>
2812 <target>將在更新時刪除</target>
2813 <context-group name="null">
2814 <context context-type="linenumber">176</context>
2549 </context-group> 2815 </context-group>
2550 </trans-unit> 2816 </trans-unit>
2551 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2817 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2552 <source>Cancel deletion</source> 2818 <source>Cancel deletion</source>
2553 <target>å–消刪除</target> 2819 <target>å–消刪除</target>
2554 <context-group name="null"> 2820 <context-group name="null">
2555 <context context-type="linenumber">177</context> 2821 <context context-type="linenumber">178</context>
2822 </context-group>
2823 </trans-unit>
2824 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
2825 <source>
2826 No captions for now.
2827 </source>
2828 <target>
2829 ç¾åœ¨æ²’有字幕。
2830 </target>
2831 <context-group name="null">
2832 <context context-type="linenumber">183</context>
2556 </context-group> 2833 </context-group>
2557 </trans-unit> 2834 </trans-unit>
2558 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2835 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2559 <source>Captions</source> 2836 <source>Captions</source>
2560 <target>字幕</target> 2837 <target>字幕</target>
2561 <context-group name="null"> 2838 <context-group name="null">
2562 <context context-type="linenumber">139</context> 2839 <context context-type="linenumber">140</context>
2563 </context-group> 2840 </context-group>
2564 </trans-unit> 2841 </trans-unit>
2565 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2842 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2566 <source>Upload thumbnail</source> 2843 <source>Upload thumbnail</source>
2567 <target>上傳縮圖</target> 2844 <target>上傳縮圖</target>
2568 <context-group name="null"> 2845 <context-group name="null">
2569 <context context-type="linenumber">195</context> 2846 <context context-type="linenumber">196</context>
2570 </context-group> 2847 </context-group>
2571 </trans-unit> 2848 </trans-unit>
2572 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2849 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2573 <source>Upload preview</source> 2850 <source>Upload preview</source>
2574 <target>上傳é è¦½</target> 2851 <target>上傳é è¦½</target>
2575 <context-group name="null"> 2852 <context-group name="null">
2576 <context context-type="linenumber">202</context> 2853 <context context-type="linenumber">203</context>
2577 </context-group> 2854 </context-group>
2578 </trans-unit> 2855 </trans-unit>
2579 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2856 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2587,14 +2864,14 @@ When you will upload a video in this channel, the video support field will be au
2587 <source>Short text to tell people how they can support you (membership platform...).</source> 2864 <source>Short text to tell people how they can support you (membership platform...).</source>
2588 <target>告訴人們他們å¯ä»¥å¦‚何支æ´æ‚¨ï¼ˆæˆå“¡å¹³è‡ºç­‰ï¼‰çš„短文</target> 2865 <target>告訴人們他們å¯ä»¥å¦‚何支æ´æ‚¨ï¼ˆæˆå“¡å¹³è‡ºç­‰ï¼‰çš„短文</target>
2589 <context-group name="null"> 2866 <context-group name="null">
2590 <context context-type="linenumber">209</context> 2867 <context context-type="linenumber">210</context>
2591 </context-group> 2868 </context-group>
2592 </trans-unit> 2869 </trans-unit>
2593 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2870 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2594 <source>Advanced settings</source> 2871 <source>Advanced settings</source>
2595 <target>進階設定</target> 2872 <target>進階設定</target>
2596 <context-group name="null"> 2873 <context-group name="null">
2597 <context context-type="linenumber">190</context> 2874 <context context-type="linenumber">191</context>
2598 </context-group> 2875 </context-group>
2599 </trans-unit> 2876 </trans-unit>
2600 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2877 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2661,17 +2938,6 @@ When you will upload a video in this channel, the video support field will be au
2661 <context context-type="linenumber">3</context> 2938 <context context-type="linenumber">3</context>
2662 </context-group> 2939 </context-group>
2663 </trans-unit> 2940 </trans-unit>
2664 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2665 <source>
2666 Cancel
2667 </source>
2668 <target>
2669 å–消
2670 </target>
2671 <context-group name="null">
2672 <context context-type="linenumber">19</context>
2673 </context-group>
2674 </trans-unit>
2675 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2941 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2676 <source>Share</source> 2942 <source>Share</source>
2677 <target>分享</target> 2943 <target>分享</target>
@@ -2869,13 +3135,6 @@ When you will upload a video in this channel, the video support field will be au
2869 <context context-type="linenumber">134</context> 3135 <context context-type="linenumber">134</context>
2870 </context-group> 3136 </context-group>
2871 </trans-unit> 3137 </trans-unit>
2872 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
2873 <source>Go to the account page</source>
2874 <target>到帳號é é¢</target>
2875 <context-group name="null">
2876 <context context-type="linenumber">133</context>
2877 </context-group>
2878 </trans-unit>
2879 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3138 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2880 <source>Show more</source> 3139 <source>Show more</source>
2881 <target>顯示更多</target> 3140 <target>顯示更多</target>
@@ -2955,25 +3214,18 @@ When you will upload a video in this channel, the video support field will be au
2955 <context context-type="linenumber">3</context> 3214 <context context-type="linenumber">3</context>
2956 </context-group> 3215 </context-group>
2957 </trans-unit> 3216 </trans-unit>
2958 <trans-unit id="da8a38f72f92714cf8680560c99982dc651480d5">
2959 <source>You can either comment on the page of your instance where this video is federated with your PeerTube account, or via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type in the search box &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; and find back the video. Direct commenting capabilities are being worked on in &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt;.</source>
2960 <target>您å¯ä»¥å°æ­¤å½±ç‰‡ä½¿ç”¨æœ‰èˆ‡æ‚¨çš„ PeerTube 帳號在互è¯çš„實體上評論,或是é€éŽä»»ä½•æ”¯æ´ ActivityPub 的互è¯å¯¦é«”來進行。例如 Mastodon 或 Pleroma,您å¯ä»¥åœ¨æœå°‹æ¬„輸入 &lt;strong&gt;@<x id="INTERPOLATION" equiv-text="{{video.account.name}}"/>@<x id="INTERPOLATION_1" equiv-text="{{video.account.host}}"/>&lt;/strong&gt; 並æœå°‹å½±ç‰‡ã€‚直接評論的功能還在 &lt;a href='https://github.com/Chocobozzz/PeerTube/issues/224'&gt;#224&lt;/a&gt; 上繼續努力實ç¾ã€‚</target>
2961 <context-group name="null">
2962 <context context-type="linenumber">8</context>
2963 </context-group>
2964 </trans-unit>
2965 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4"> 3217 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
2966 <source>No comments.</source> 3218 <source>No comments.</source>
2967 <target>沒有評論。</target> 3219 <target>沒有評論。</target>
2968 <context-group name="null"> 3220 <context-group name="null">
2969 <context context-type="linenumber">18</context> 3221 <context context-type="linenumber">17</context>
2970 </context-group> 3222 </context-group>
2971 </trans-unit> 3223 </trans-unit>
2972 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e"> 3224 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
2973 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source> 3225 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
2974 <target>檢視全部 <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> 個回覆</target> 3226 <target>檢視全部 <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> 個回覆</target>
2975 <context-group name="null"> 3227 <context-group name="null">
2976 <context context-type="linenumber">55</context> 3228 <context context-type="linenumber">54</context>
2977 </context-group> 3229 </context-group>
2978 </trans-unit> 3230 </trans-unit>
2979 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828"> 3231 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
@@ -2984,7 +3236,7 @@ When you will upload a video in this channel, the video support field will be au
2984 è©•è«–å·²åœç”¨ã€‚ 3236 è©•è«–å·²åœç”¨ã€‚
2985 </target> 3237 </target>
2986 <context-group name="null"> 3238 <context-group name="null">
2987 <context context-type="linenumber">64</context> 3239 <context context-type="linenumber">63</context>
2988 </context-group> 3240 </context-group>
2989 </trans-unit> 3241 </trans-unit>
2990 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e"> 3242 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
@@ -3005,6 +3257,57 @@ When you will upload a video in this channel, the video support field will be au
3005 <context context-type="linenumber">20</context> 3257 <context context-type="linenumber">20</context>
3006 </context-group> 3258 </context-group>
3007 </trans-unit> 3259 </trans-unit>
3260 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3261 <source>You are one step away from commenting</source>
3262 <target>您離評論åªæœ‰ä¸€æ­¥ä¹‹é™</target>
3263 <context-group name="null">
3264 <context context-type="linenumber">28</context>
3265 </context-group>
3266 </trans-unit>
3267 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3268 <source>
3269 If you have an account on this instance, you can login:
3270 </source>
3271 <target>
3272 如果您在此實體上有帳號,您å¯ä»¥ç™»å…¥ï¼š
3273 </target>
3274 <context-group name="null">
3275 <context context-type="linenumber">32</context>
3276 </context-group>
3277 </trans-unit>
3278 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3279 <source>login to comment</source>
3280 <target>登入以評論</target>
3281 <context-group name="null">
3282 <context context-type="linenumber">35</context>
3283 </context-group>
3284 </trans-unit>
3285 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3286 <source>
3287 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3288 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3289 from within the software's interface.
3290 </source>
3291 <target>
3292 或者您也å¯ä»¥ä½¿ç”¨åœ¨ä»»ä½•ç›¸å®¹æ–¼ ActibityPub 的實體上的帳號評論。
3293 在大多數的平臺上,您å¯ä»¥é€éŽè¼¸å…¥ URL 來找到影片,從而å°å…¶è©•è«–
3294 從軟體的界é¢ã€‚
3295 </target>
3296 <context-group name="null">
3297 <context context-type="linenumber">36</context>
3298 </context-group>
3299 </trans-unit>
3300 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3301 <source>
3302 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3303 </source>
3304 <target>
3305 如果您有 Mastodon 或 Pleroma 的帳號,您å¯ä»¥åœ¨ä»–們的界é¢ä¸­ç›´æŽ¥é–‹å•Ÿå®ƒï¼š
3306 </target>
3307 <context-group name="null">
3308 <context context-type="linenumber">41</context>
3309 </context-group>
3310 </trans-unit>
3008 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3311 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3009 <source>Highlighted comment</source> 3312 <source>Highlighted comment</source>
3010 <target>å·²çªé¡¯çš„è©•è«–</target> 3313 <target>å·²çªé¡¯çš„è©•è«–</target>
@@ -3019,13 +3322,6 @@ When you will upload a video in this channel, the video support field will be au
3019 <context context-type="linenumber">14</context> 3322 <context context-type="linenumber">14</context>
3020 </context-group> 3323 </context-group>
3021 </trans-unit> 3324 </trans-unit>
3022 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3023 <source>Error getting about from server</source>
3024 <target>å–得關於伺æœå™¨çš„錯誤</target>
3025 <context-group name="null">
3026 <context context-type="linenumber">1</context>
3027 </context-group>
3028 </trans-unit>
3029 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3325 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3030 <source>No description</source> 3326 <source>No description</source>
3031 <target>沒有æè¿°</target> 3327 <target>沒有æè¿°</target>
@@ -3047,51 +3343,44 @@ When you will upload a video in this channel, the video support field will be au
3047 <context context-type="linenumber">1</context> 3343 <context context-type="linenumber">1</context>
3048 </context-group> 3344 </context-group>
3049 </trans-unit> 3345 </trans-unit>
3050 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3346 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3051 <source>Error</source> 3347 <source>240p</source>
3052 <target>錯誤</target> 3348 <target>240p</target>
3053 <context-group name="null"> 3349 <context-group name="null">
3054 <context context-type="linenumber">1</context> 3350 <context context-type="linenumber">1</context>
3055 </context-group> 3351 </context-group>
3056 </trans-unit> 3352 </trans-unit>
3057 <trans-unit id="27a71a0aee65258179e90ecf0841c0a68f95beed"> 3353 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3058 <source>You set custom <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>. </source> 3354 <source>360p</source>
3059 <target>您å¯ä»¥è¨­å®šè‡ªè¨‚ <x id="INTERPOLATION" equiv-text="{{customizationsText}}"/>。</target> 3355 <target>360p</target>
3060 <context-group name="null"> 3356 <context-group name="null">
3061 <context context-type="linenumber">1</context> 3357 <context context-type="linenumber">1</context>
3062 </context-group> 3358 </context-group>
3063 </trans-unit> 3359 </trans-unit>
3064 <trans-unit id="865bc18d22e223101ede0916967ead0abd515d0e"> 3360 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3065 <source>This could lead to security issues or bugs if you do not understand it. </source> 3361 <source>480p</source>
3066 <target>這å¯èƒ½æœƒå°Žè‡´å®‰å…¨æ€§å•é¡Œæˆ–臭蟲。若您ä¸äº†è§£å®ƒã€‚</target> 3362 <target>480p</target>
3067 <context-group name="null"> 3363 <context-group name="null">
3068 <context context-type="linenumber">1</context> 3364 <context context-type="linenumber">1</context>
3069 </context-group> 3365 </context-group>
3070 </trans-unit> 3366 </trans-unit>
3071 <trans-unit id="262e18b2efb5912651684a522fc08d77c99972d0"> 3367 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3072 <source>Are you sure you want to update the configuration?</source> 3368 <source>720p</source>
3073 <target>您確定您想è¦æ›´æ–°è¨­å®šå—Žï¼Ÿ</target> 3369 <target>720p</target>
3074 <context-group name="null"> 3370 <context-group name="null">
3075 <context context-type="linenumber">1</context> 3371 <context context-type="linenumber">1</context>
3076 </context-group> 3372 </context-group>
3077 </trans-unit> 3373 </trans-unit>
3078 <trans-unit id="1ae0ab69f5c19d179282c8d882fd2f3c00e29119"> 3374 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3079 <source>Please type</source> 3375 <source>1080p</source>
3080 <target>請輸入</target> 3376 <target>1080p</target>
3081 <context-group name="null"> 3377 <context-group name="null">
3082 <context context-type="linenumber">1</context> 3378 <context context-type="linenumber">1</context>
3083 </context-group> 3379 </context-group>
3084 </trans-unit> 3380 </trans-unit>
3085 <trans-unit id="75f4bb68ee4c6b282abfd9d8d32be22c6202794d"> 3381 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3086 <source>to confirm.</source> 3382 <source>Auto (via ffmpeg)</source>
3087 <target>以確èªã€‚</target> 3383 <target>自動(é€éŽ ffmpeg)</target>
3088 <context-group name="null">
3089 <context context-type="linenumber">1</context>
3090 </context-group>
3091 </trans-unit>
3092 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3093 <source>Success</source>
3094 <target>æˆåŠŸ</target>
3095 <context-group name="null"> 3384 <context-group name="null">
3096 <context context-type="linenumber">1</context> 3385 <context context-type="linenumber">1</context>
3097 </context-group> 3386 </context-group>
@@ -3110,6 +3399,69 @@ When you will upload a video in this channel, the video support field will be au
3110 <context context-type="linenumber">1</context> 3399 <context context-type="linenumber">1</context>
3111 </context-group> 3400 </context-group>
3112 </trans-unit> 3401 </trans-unit>
3402 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3403 <source>100MB</source>
3404 <target>100MB</target>
3405 <context-group name="null">
3406 <context context-type="linenumber">1</context>
3407 </context-group>
3408 </trans-unit>
3409 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3410 <source>500MB</source>
3411 <target>500MB</target>
3412 <context-group name="null">
3413 <context context-type="linenumber">1</context>
3414 </context-group>
3415 </trans-unit>
3416 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3417 <source>1GB</source>
3418 <target>1GB</target>
3419 <context-group name="null">
3420 <context context-type="linenumber">1</context>
3421 </context-group>
3422 </trans-unit>
3423 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3424 <source>5GB</source>
3425 <target>5GB</target>
3426 <context-group name="null">
3427 <context context-type="linenumber">1</context>
3428 </context-group>
3429 </trans-unit>
3430 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3431 <source>20GB</source>
3432 <target>20GB</target>
3433 <context-group name="null">
3434 <context context-type="linenumber">1</context>
3435 </context-group>
3436 </trans-unit>
3437 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3438 <source>50GB</source>
3439 <target>50GB</target>
3440 <context-group name="null">
3441 <context context-type="linenumber">1</context>
3442 </context-group>
3443 </trans-unit>
3444 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3445 <source>10MB</source>
3446 <target>10MB</target>
3447 <context-group name="null">
3448 <context context-type="linenumber">1</context>
3449 </context-group>
3450 </trans-unit>
3451 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3452 <source>50MB</source>
3453 <target>50MB</target>
3454 <context-group name="null">
3455 <context context-type="linenumber">1</context>
3456 </context-group>
3457 </trans-unit>
3458 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3459 <source>2GB</source>
3460 <target>2GB</target>
3461 <context-group name="null">
3462 <context context-type="linenumber">1</context>
3463 </context-group>
3464 </trans-unit>
3113 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3465 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3114 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3466 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3115 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> 無效</target> 3467 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> 無效</target>
@@ -3173,6 +3525,41 @@ When you will upload a video in this channel, the video support field will be au
3173 <context context-type="linenumber">1</context> 3525 <context context-type="linenumber">1</context>
3174 </context-group> 3526 </context-group>
3175 </trans-unit> 3527 </trans-unit>
3528 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
3529 <source>enabled</source>
3530 <target>已啟用</target>
3531 <context-group name="null">
3532 <context context-type="linenumber">1</context>
3533 </context-group>
3534 </trans-unit>
3535 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
3536 <source>disabled</source>
3537 <target>å·²åœç”¨</target>
3538 <context-group name="null">
3539 <context context-type="linenumber">1</context>
3540 </context-group>
3541 </trans-unit>
3542 <trans-unit id="1123807fc813c816404598147173403d00117557">
3543 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
3544 <target>冗餘 <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
3545 <context-group name="null">
3546 <context context-type="linenumber">1</context>
3547 </context-group>
3548 </trans-unit>
3549 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3550 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3551 <target>帳號 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已被您的實體解除éœéŸ³ã€‚</target>
3552 <context-group name="null">
3553 <context context-type="linenumber">1</context>
3554 </context-group>
3555 </trans-unit>
3556 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3557 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3558 <target>實體 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已被您的實體解除éœéŸ³ã€‚</target>
3559 <context-group name="null">
3560 <context context-type="linenumber">1</context>
3561 </context-group>
3562 </trans-unit>
3176 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6"> 3563 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3177 <source>Comment updated.</source> 3564 <source>Comment updated.</source>
3178 <target>評論已更新。</target> 3565 <target>評論已更新。</target>
@@ -3180,6 +3567,13 @@ When you will upload a video in this channel, the video support field will be au
3180 <context context-type="linenumber">1</context> 3567 <context context-type="linenumber">1</context>
3181 </context-group> 3568 </context-group>
3182 </trans-unit> 3569 </trans-unit>
3570 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3571 <source>Delete this report</source>
3572 <target>刪除此回報</target>
3573 <context-group name="null">
3574 <context context-type="linenumber">1</context>
3575 </context-group>
3576 </trans-unit>
3183 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3577 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3184 <source>Update moderation comment</source> 3578 <source>Update moderation comment</source>
3185 <target>更新管ç†è©•è«–</target> 3579 <target>更新管ç†è©•è«–</target>
@@ -3201,9 +3595,9 @@ When you will upload a video in this channel, the video support field will be au
3201 <context context-type="linenumber">1</context> 3595 <context context-type="linenumber">1</context>
3202 </context-group> 3596 </context-group>
3203 </trans-unit> 3597 </trans-unit>
3204 <trans-unit id="01a909e58239b5dde966ef97a79c656d2c452e03"> 3598 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3205 <source>Do you really want to delete this abuse?</source> 3599 <source>Do you really want to delete this abuse report?</source>
3206 <target>您真的想è¦åˆªé™¤æ­¤æ¿«ç”¨å—Žï¼Ÿ</target> 3600 <target>您真的想è¦åˆªé™¤é€™ä»½æ¿«ç”¨å›žå ±å—Žï¼Ÿ</target>
3207 <context-group name="null"> 3601 <context-group name="null">
3208 <context context-type="linenumber">1</context> 3602 <context context-type="linenumber">1</context>
3209 </context-group> 3603 </context-group>
@@ -3250,23 +3644,16 @@ When you will upload a video in this channel, the video support field will be au
3250 <context context-type="linenumber">1</context> 3644 <context context-type="linenumber">1</context>
3251 </context-group> 3645 </context-group>
3252 </trans-unit> 3646 </trans-unit>
3253 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 3647 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3254 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 3648 <source>Unban</source>
3255 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已阻擋。</target> 3649 <target>å–消阻擋</target>
3256 <context-group name="null">
3257 <context context-type="linenumber">1</context>
3258 </context-group>
3259 </trans-unit>
3260 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
3261 <source>Ban</source>
3262 <target>阻擋</target>
3263 <context-group name="null"> 3650 <context-group name="null">
3264 <context context-type="linenumber">1</context> 3651 <context context-type="linenumber">1</context>
3265 </context-group> 3652 </context-group>
3266 </trans-unit> 3653 </trans-unit>
3267 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8"> 3654 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3268 <source>Unban</source> 3655 <source>Set Email as Verified</source>
3269 <target>å–消阻擋</target> 3656 <target>設定é»å­éƒµä»¶ç‚ºå·²é©—è­‰</target>
3270 <context-group name="null"> 3657 <context-group name="null">
3271 <context context-type="linenumber">1</context> 3658 <context context-type="linenumber">1</context>
3272 </context-group> 3659 </context-group>
@@ -3278,16 +3665,16 @@ When you will upload a video in this channel, the video support field will be au
3278 <context context-type="linenumber">1</context> 3665 <context context-type="linenumber">1</context>
3279 </context-group> 3666 </context-group>
3280 </trans-unit> 3667 </trans-unit>
3281 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734"> 3668 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3282 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source> 3669 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3283 <target>您真的想è¦å–消阻擋 <x id="INTERPOLATION" equiv-text="{{username}}"/> 嗎?</target> 3670 <target>您真的想è¦è§£é™¤é˜»æ“‹ <x id="INTERPOLATION" equiv-text="{{num}}"/> 使用者嗎?</target>
3284 <context-group name="null"> 3671 <context-group name="null">
3285 <context context-type="linenumber">1</context> 3672 <context context-type="linenumber">1</context>
3286 </context-group> 3673 </context-group>
3287 </trans-unit> 3674 </trans-unit>
3288 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd"> 3675 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3289 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source> 3676 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3290 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> å·²å–消阻擋。</target> 3677 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> 使用者已解除阻擋。</target>
3291 <context-group name="null"> 3678 <context-group name="null">
3292 <context context-type="linenumber">1</context> 3679 <context context-type="linenumber">1</context>
3293 </context-group> 3680 </context-group>
@@ -3299,9 +3686,37 @@ When you will upload a video in this channel, the video support field will be au
3299 <context context-type="linenumber">1</context> 3686 <context context-type="linenumber">1</context>
3300 </context-group> 3687 </context-group>
3301 </trans-unit> 3688 </trans-unit>
3302 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3689 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3303 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3690 <source>If you remove these users, you will not be able to create others with the same username!</source>
3304 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已刪除。</target> 3691 <target>若您移除了這些使用者,您將無法建立相åŒä½¿ç”¨è€…å稱的其他使用者ï¼</target>
3692 <context-group name="null">
3693 <context context-type="linenumber">1</context>
3694 </context-group>
3695 </trans-unit>
3696 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3697 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3698 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> 個使用者已刪除。</target>
3699 <context-group name="null">
3700 <context context-type="linenumber">1</context>
3701 </context-group>
3702 </trans-unit>
3703 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3704 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3705 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> 個使用者電å­éƒµä»¶è¨­å®šç‚ºå·²é©—證。</target>
3706 <context-group name="null">
3707 <context context-type="linenumber">1</context>
3708 </context-group>
3709 </trans-unit>
3710 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3711 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3712 <target>帳號 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已解除éœéŸ³ã€‚</target>
3713 <context-group name="null">
3714 <context context-type="linenumber">1</context>
3715 </context-group>
3716 </trans-unit>
3717 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3718 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3719 <target>實體 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已解除éœéŸ³ã€‚</target>
3305 <context-group name="null"> 3720 <context-group name="null">
3306 <context context-type="linenumber">1</context> 3721 <context context-type="linenumber">1</context>
3307 </context-group> 3722 </context-group>
@@ -3320,6 +3735,13 @@ When you will upload a video in this channel, the video support field will be au
3320 <context context-type="linenumber">1</context> 3735 <context context-type="linenumber">1</context>
3321 </context-group> 3736 </context-group>
3322 </trans-unit> 3737 </trans-unit>
3738 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3739 <source>You current password is invalid.</source>
3740 <target>您目å‰å¯†ç¢¼ç„¡æ•ˆã€‚</target>
3741 <context-group name="null">
3742 <context context-type="linenumber">1</context>
3743 </context-group>
3744 </trans-unit>
3323 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 3745 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3324 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 3746 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3325 <target>您確定è¦åˆªé™¤æ‚¨çš„帳號?這將會刪除您所有的資料,包å«é »é“ã€å½±ç‰‡ç­‰ã€‚</target> 3747 <target>您確定è¦åˆªé™¤æ‚¨çš„帳號?這將會刪除您所有的資料,包å«é »é“ã€å½±ç‰‡ç­‰ã€‚</target>
@@ -3376,6 +3798,13 @@ When you will upload a video in this channel, the video support field will be au
3376 <context context-type="linenumber">1</context> 3798 <context context-type="linenumber">1</context>
3377 </context-group> 3799 </context-group>
3378 </trans-unit> 3800 </trans-unit>
3801 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3802 <source>This name already exists on this instance.</source>
3803 <target>æ­¤å稱已存在於此實體上。</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3379 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3808 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3380 <source>Create</source> 3809 <source>Create</source>
3381 <target>建立</target> 3810 <target>建立</target>
@@ -3390,23 +3819,16 @@ When you will upload a video in this channel, the video support field will be au
3390 <context context-type="linenumber">1</context> 3819 <context context-type="linenumber">1</context>
3391 </context-group> 3820 </context-group>
3392 </trans-unit> 3821 </trans-unit>
3393 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3822 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3394 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3823 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3395 <target>您真的想è¦åˆªé™¤ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 嗎?這也會刪除所有上傳到這個頻é“的影片。</target> 3824 <target>å½±ç‰‡é »é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target>
3396 <context-group name="null">
3397 <context context-type="linenumber">1</context>
3398 </context-group>
3399 </trans-unit>
3400 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3401 <source>Please type the name of the video channel to confirm</source>
3402 <target>請輸入影片頻é“çš„å稱以確èª</target>
3403 <context-group name="null"> 3825 <context-group name="null">
3404 <context context-type="linenumber">1</context> 3826 <context context-type="linenumber">1</context>
3405 </context-group> 3827 </context-group>
3406 </trans-unit> 3828 </trans-unit>
3407 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3829 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3408 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3830 <source>My videos</source>
3409 <target>å½±ç‰‡é »é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target> 3831 <target>我的影片</target>
3410 <context-group name="null"> 3832 <context-group name="null">
3411 <context context-type="linenumber">1</context> 3833 <context context-type="linenumber">1</context>
3412 </context-group> 3834 </context-group>
@@ -3481,16 +3903,44 @@ When you will upload a video in this channel, the video support field will be au
3481 <context context-type="linenumber">1</context> 3903 <context context-type="linenumber">1</context>
3482 </context-group> 3904 </context-group>
3483 </trans-unit> 3905 </trans-unit>
3484 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3906 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3485 <source>Channels</source> 3907 <source>My library</source>
3486 <target>é »é“</target> 3908 <target>我的媒體庫</target>
3909 <context-group name="null">
3910 <context context-type="linenumber">1</context>
3911 </context-group>
3912 </trans-unit>
3913 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3914 <source>My channels</source>
3915 <target>我的頻é“</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3921 <source>My subscriptions</source>
3922 <target>我的訂閱</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3928 <source>Misc</source>
3929 <target>雜項</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3935 <source>Ownership changes</source>
3936 <target>所有權變更</target>
3487 <context-group name="null"> 3937 <context-group name="null">
3488 <context context-type="linenumber">1</context> 3938 <context context-type="linenumber">1</context>
3489 </context-group> 3939 </context-group>
3490 </trans-unit> 3940 </trans-unit>
3491 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3941 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3492 <source>Video imports</source> 3942 <source>My settings</source>
3493 <target>影片匯入</target> 3943 <target>我的設定</target>
3494 <context-group name="null"> 3944 <context-group name="null">
3495 <context context-type="linenumber">1</context> 3945 <context context-type="linenumber">1</context>
3496 </context-group> 3946 </context-group>
@@ -3509,6 +3959,97 @@ When you will upload a video in this channel, the video support field will be au
3509 <context context-type="linenumber">1</context> 3959 <context context-type="linenumber">1</context>
3510 </context-group> 3960 </context-group>
3511 </trans-unit> 3961 </trans-unit>
3962 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3963 <source>Subscribe to the account</source>
3964 <target>訂閱帳號</target>
3965 <context-group name="null">
3966 <context context-type="linenumber">1</context>
3967 </context-group>
3968 </trans-unit>
3969 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
3970 <source>Focus the search bar</source>
3971 <target>將焦點置於æœå°‹åˆ—</target>
3972 <context-group name="null">
3973 <context context-type="linenumber">1</context>
3974 </context-group>
3975 </trans-unit>
3976 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
3977 <source>Toggle the left menu</source>
3978 <target>切æ›å·¦é¸å–®</target>
3979 <context-group name="null">
3980 <context context-type="linenumber">1</context>
3981 </context-group>
3982 </trans-unit>
3983 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
3984 <source>Go to the videos overview page</source>
3985 <target>到影片概覽é é¢</target>
3986 <context-group name="null">
3987 <context context-type="linenumber">1</context>
3988 </context-group>
3989 </trans-unit>
3990 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
3991 <source>Go to the trending videos page</source>
3992 <target>到熱門影片é é¢</target>
3993 <context-group name="null">
3994 <context context-type="linenumber">1</context>
3995 </context-group>
3996 </trans-unit>
3997 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
3998 <source>Go to the recently added videos page</source>
3999 <target>到最近新增影片é é¢</target>
4000 <context-group name="null">
4001 <context context-type="linenumber">1</context>
4002 </context-group>
4003 </trans-unit>
4004 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4005 <source>Go to the local videos page</source>
4006 <target>到本地影片é é¢</target>
4007 <context-group name="null">
4008 <context context-type="linenumber">1</context>
4009 </context-group>
4010 </trans-unit>
4011 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4012 <source>Go to the videos upload page</source>
4013 <target>到影片上傳é é¢</target>
4014 <context-group name="null">
4015 <context context-type="linenumber">1</context>
4016 </context-group>
4017 </trans-unit>
4018 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4019 <source>Toggle Dark theme</source>
4020 <target>切æ›æš—色主題</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4026 <source>Go to my subscriptions</source>
4027 <target>到我的訂閱</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4033 <source>Go to my videos</source>
4034 <target>到我的影片</target>
4035 <context-group name="null">
4036 <context context-type="linenumber">1</context>
4037 </context-group>
4038 </trans-unit>
4039 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4040 <source>Go to my imports</source>
4041 <target>到我們的匯入</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4047 <source>Go to my channels</source>
4048 <target>到我的頻é“</target>
4049 <context-group name="null">
4050 <context context-type="linenumber">1</context>
4051 </context-group>
4052 </trans-unit>
3512 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4053 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3513 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4054 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3514</source> 4055</source>
@@ -3525,6 +4066,13 @@ When you will upload a video in this channel, the video support field will be au
3525 <context context-type="linenumber">1</context> 4066 <context context-type="linenumber">1</context>
3526 </context-group> 4067 </context-group>
3527 </trans-unit> 4068 </trans-unit>
4069 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4070 <source>Error</source>
4071 <target>錯誤</target>
4072 <context-group name="null">
4073 <context context-type="linenumber">1</context>
4074 </context-group>
4075 </trans-unit>
3528 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4076 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3529 <source>You need to reconnect.</source> 4077 <source>You need to reconnect.</source>
3530 <target>您需è¦é‡æ–°é€£ç·šã€‚</target> 4078 <target>您需è¦é‡æ–°é€£ç·šã€‚</target>
@@ -3539,6 +4087,27 @@ When you will upload a video in this channel, the video support field will be au
3539 <context context-type="linenumber">1</context> 4087 <context context-type="linenumber">1</context>
3540 </context-group> 4088 </context-group>
3541 </trans-unit> 4089 </trans-unit>
4090 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4091 <source>Keyboard Shortcuts:</source>
4092 <target>éµç›¤å¿«æ·éµï¼š</target>
4093 <context-group name="null">
4094 <context context-type="linenumber">1</context>
4095 </context-group>
4096 </trans-unit>
4097 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4098 <source>Info</source>
4099 <target>資訊</target>
4100 <context-group name="null">
4101 <context context-type="linenumber">1</context>
4102 </context-group>
4103 </trans-unit>
4104 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4105 <source>Success</source>
4106 <target>æˆåŠŸ</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
3542 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4111 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3543 <source>Incorrect username or password.</source> 4112 <source>Incorrect username or password.</source>
3544 <target>ä¸æ­£ç¢ºçš„使用者å稱或密碼。</target> 4113 <target>ä¸æ­£ç¢ºçš„使用者å稱或密碼。</target>
@@ -3756,6 +4325,20 @@ When you will upload a video in this channel, the video support field will be au
3756 <context context-type="linenumber">1</context> 4325 <context context-type="linenumber">1</context>
3757 </context-group> 4326 </context-group>
3758 </trans-unit> 4327 </trans-unit>
4328 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4329 <source>Email is required.</source>
4330 <target>é›»å­éƒµä»¶å¿…填。</target>
4331 <context-group name="null">
4332 <context context-type="linenumber">1</context>
4333 </context-group>
4334 </trans-unit>
4335 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4336 <source>Email must be valid.</source>
4337 <target>é›»å­éƒµä»¶å¿…須為有效電å­éƒµä»¶ã€‚</target>
4338 <context-group name="null">
4339 <context context-type="linenumber">1</context>
4340 </context-group>
4341 </trans-unit>
3759 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4342 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3760 <source>Username is required.</source> 4343 <source>Username is required.</source>
3761 <target>使用者å稱必填。</target> 4344 <target>使用者å稱必填。</target>
@@ -3777,41 +4360,6 @@ When you will upload a video in this channel, the video support field will be au
3777 <context context-type="linenumber">1</context> 4360 <context context-type="linenumber">1</context>
3778 </context-group> 4361 </context-group>
3779 </trans-unit> 4362 </trans-unit>
3780 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3781 <source>Username must be at least 3 characters long.</source>
3782 <target>使用者å稱必須至少 3 個字元長。</target>
3783 <context-group name="null">
3784 <context context-type="linenumber">1</context>
3785 </context-group>
3786 </trans-unit>
3787 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3788 <source>Username cannot be more than 20 characters long.</source>
3789 <target>使用者å稱ä¸èƒ½å¤šæ–¼ 20 個字元。</target>
3790 <context-group name="null">
3791 <context context-type="linenumber">1</context>
3792 </context-group>
3793 </trans-unit>
3794 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3795 <source>Username should be only lowercase alphanumeric characters.</source>
3796 <target>使用者å稱應該僅有å°å¯«è‹±æ•¸å­—元。</target>
3797 <context-group name="null">
3798 <context context-type="linenumber">1</context>
3799 </context-group>
3800 </trans-unit>
3801 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3802 <source>Email is required.</source>
3803 <target>é›»å­éƒµä»¶å¿…填。</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3808 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3809 <source>Email must be valid.</source>
3810 <target>é›»å­éƒµä»¶å¿…須為有效電å­éƒµä»¶ã€‚</target>
3811 <context-group name="null">
3812 <context context-type="linenumber">1</context>
3813 </context-group>
3814 </trans-unit>
3815 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4363 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3816 <source>Password must be at least 6 characters long.</source> 4364 <source>Password must be at least 6 characters long.</source>
3817 <target>密碼必須至少 6 個字元長。</target> 4365 <target>密碼必須至少 6 個字元長。</target>
@@ -3875,20 +4423,6 @@ When you will upload a video in this channel, the video support field will be au
3875 <context context-type="linenumber">1</context> 4423 <context context-type="linenumber">1</context>
3876 </context-group> 4424 </context-group>
3877 </trans-unit> 4425 </trans-unit>
3878 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3879 <source>Display name must be at least 3 characters long.</source>
3880 <target>顯示å稱必須至少 3 個字元長。</target>
3881 <context-group name="null">
3882 <context context-type="linenumber">1</context>
3883 </context-group>
3884 </trans-unit>
3885 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3886 <source>Display name cannot be more than 120 characters long.</source>
3887 <target>顯示å稱ä¸èƒ½å¤šæ–¼ 120 個字元。</target>
3888 <context-group name="null">
3889 <context context-type="linenumber">1</context>
3890 </context-group>
3891 </trans-unit>
3892 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4426 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3893 <source>Description must be at least 3 characters long.</source> 4427 <source>Description must be at least 3 characters long.</source>
3894 <target>æ述必須至少 3 個字元長。</target> 4428 <target>æ述必須至少 3 個字元長。</target>
@@ -3896,9 +4430,9 @@ When you will upload a video in this channel, the video support field will be au
3896 <context context-type="linenumber">1</context> 4430 <context context-type="linenumber">1</context>
3897 </context-group> 4431 </context-group>
3898 </trans-unit> 4432 </trans-unit>
3899 <trans-unit id="916a6e4fd83ece1dc54c6135eb3b8cd064b4bac3"> 4433 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
3900 <source>Description cannot be more than 250 characters long.</source> 4434 <source>Description cannot be more than 1000 characters long.</source>
3901 <target>æè¿°ä¸èƒ½å¤šæ–¼ 250 個字元。</target> 4435 <target>æè¿°ä¸èƒ½å¤šæ–¼ 1000 個字元。</target>
3902 <context-group name="null"> 4436 <context-group name="null">
3903 <context context-type="linenumber">1</context> 4437 <context context-type="linenumber">1</context>
3904 </context-group> 4438 </context-group>
@@ -3938,13 +4472,6 @@ When you will upload a video in this channel, the video support field will be au
3938 <context context-type="linenumber">1</context> 4472 <context context-type="linenumber">1</context>
3939 </context-group> 4473 </context-group>
3940 </trans-unit> 4474 </trans-unit>
3941 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3942 <source>Report reason cannot be more than 300 characters long.</source>
3943 <target>回報ç†ç”±ä¸èƒ½å¤šæ–¼ 300 個字元。</target>
3944 <context-group name="null">
3945 <context context-type="linenumber">1</context>
3946 </context-group>
3947 </trans-unit>
3948 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4475 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
3949 <source>Moderation comment is required.</source> 4476 <source>Moderation comment is required.</source>
3950 <target>管ç†è©•è«–必填。</target> 4477 <target>管ç†è©•è«–必填。</target>
@@ -3959,13 +4486,6 @@ When you will upload a video in this channel, the video support field will be au
3959 <context context-type="linenumber">1</context> 4486 <context context-type="linenumber">1</context>
3960 </context-group> 4487 </context-group>
3961 </trans-unit> 4488 </trans-unit>
3962 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
3963 <source>Moderation comment cannot be more than 300 characters long.</source>
3964 <target>管ç†è©•è«–無法多於 300 個字元。</target>
3965 <context-group name="null">
3966 <context context-type="linenumber">1</context>
3967 </context-group>
3968 </trans-unit>
3969 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4489 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
3970 <source>The channel is required.</source> 4490 <source>The channel is required.</source>
3971 <target>é »é“必填。</target> 4491 <target>é »é“必填。</target>
@@ -4008,37 +4528,16 @@ When you will upload a video in this channel, the video support field will be au
4008 <context context-type="linenumber">1</context> 4528 <context context-type="linenumber">1</context>
4009 </context-group> 4529 </context-group>
4010 </trans-unit> 4530 </trans-unit>
4011 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4531 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4012 <source>Name is required.</source> 4532 <source>You can only transfer ownership to a local account</source>
4013 <target>å稱必填。</target> 4533 <target>您å¯ä»¥åƒ…轉移所有權到本地帳號</target>
4014 <context-group name="null">
4015 <context context-type="linenumber">1</context>
4016 </context-group>
4017 </trans-unit>
4018 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4019 <source>Name must be at least 3 characters long.</source>
4020 <target>å稱必須至少 3 個字元。</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4026 <source>Name cannot be more than 20 characters long.</source>
4027 <target>å稱ä¸èƒ½è¶…éŽ 20 個字元。</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4033 <source>Name should be only lowercase alphanumeric characters.</source>
4034 <target>å稱應該åªæœ‰å°å¯«è‹±æ•¸å­—元。</target>
4035 <context-group name="null"> 4534 <context-group name="null">
4036 <context context-type="linenumber">1</context> 4535 <context context-type="linenumber">1</context>
4037 </context-group> 4536 </context-group>
4038 </trans-unit> 4537 </trans-unit>
4039 <trans-unit id="fac936be125163a8494f3d7e7f21d65c7e4f1ff6"> 4538 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4040 <source>Description cannot be more than 500 characters long.</source> 4539 <source>Name is required.</source>
4041 <target>æè¿°ä¸èƒ½å¤šæ–¼ 500 個字åƒã€‚</target> 4540 <target>å稱å¿å¡«ã€‚</target>
4042 <context-group name="null"> 4541 <context-group name="null">
4043 <context context-type="linenumber">1</context> 4542 <context context-type="linenumber">1</context>
4044 </context-group> 4543 </context-group>
@@ -4050,9 +4549,9 @@ When you will upload a video in this channel, the video support field will be au
4050 <context context-type="linenumber">1</context> 4549 <context context-type="linenumber">1</context>
4051 </context-group> 4550 </context-group>
4052 </trans-unit> 4551 </trans-unit>
4053 <trans-unit id="3fe80c71378e127dda2dda9dbcd66b059d362813"> 4552 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4054 <source>Support text cannot be more than 500 characters long.</source> 4553 <source>Support text cannot be more than 1000 characters long.</source>
4055 <target>支æ´æ–‡å­—ä¸èƒ½å¤šæ–¼ 500 個字元。</target> 4554 <target>支æ´æ–‡å­—ä¸èƒ½è¶…éŽ 1000 的字元長。</target>
4056 <context-group name="null"> 4555 <context-group name="null">
4057 <context context-type="linenumber">1</context> 4556 <context context-type="linenumber">1</context>
4058 </context-group> 4557 </context-group>
@@ -4148,9 +4647,9 @@ When you will upload a video in this channel, the video support field will be au
4148 <context context-type="linenumber">1</context> 4647 <context context-type="linenumber">1</context>
4149 </context-group> 4648 </context-group>
4150 </trans-unit> 4649 </trans-unit>
4151 <trans-unit id="e61f1c05121fa5effa6ccddf5be6dcf1c822ff4b"> 4650 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4152 <source>Video support cannot be more than 500 characters long.</source> 4651 <source>Video support cannot be more than 1000 characters long.</source>
4153 <target>影片支æ´ä¸èƒ½å¤šæ–¼ 500 個字元長。</target> 4652 <target>影片支æ´ä¸èƒ½è¶…éŽ 1000 的字元長。</target>
4154 <context-group name="null"> 4653 <context-group name="null">
4155 <context context-type="linenumber">1</context> 4654 <context context-type="linenumber">1</context>
4156 </context-group> 4655 </context-group>
@@ -4680,6 +5179,153 @@ When you will upload a video in this channel, the video support field will be au
4680 <context context-type="linenumber">1</context> 5179 <context context-type="linenumber">1</context>
4681 </context-group> 5180 </context-group>
4682 </trans-unit> 5181 </trans-unit>
5182 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5183 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5184 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> 個使用者已解除阻擋。</target>
5185 <context-group name="null">
5186 <context context-type="linenumber">1</context>
5187 </context-group>
5188 </trans-unit>
5189 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5190 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5191 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已阻擋。</target>
5192 <context-group name="null">
5193 <context context-type="linenumber">1</context>
5194 </context-group>
5195 </trans-unit>
5196 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5197 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5198 <target>您真的想è¦å–消阻擋 <x id="INTERPOLATION" equiv-text="{{username}}"/> 嗎?</target>
5199 <context-group name="null">
5200 <context context-type="linenumber">1</context>
5201 </context-group>
5202 </trans-unit>
5203 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5204 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5205 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> å·²å–消阻擋。</target>
5206 <context-group name="null">
5207 <context context-type="linenumber">1</context>
5208 </context-group>
5209 </trans-unit>
5210 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5211 <source>If you remove this user, you will not be able to create another with the same username!</source>
5212 <target>如果您移除此使用者,您就沒辦法å†ä½¿ç”¨åŒä¸€å€‹ä½¿ç”¨è€…å稱來建立å¦ä¸€å€‹ä½¿ç”¨è€…ï¼</target>
5213 <context-group name="null">
5214 <context context-type="linenumber">1</context>
5215 </context-group>
5216 </trans-unit>
5217 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5218 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5219 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> 已刪除。</target>
5220 <context-group name="null">
5221 <context context-type="linenumber">1</context>
5222 </context-group>
5223 </trans-unit>
5224 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5225 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5226 <target>使用者 <x id="INTERPOLATION" equiv-text="{{username}}"/> çš„é›»å­éƒµä»¶è¨­å®šç‚ºå·²é©—è­‰</target>
5227 <context-group name="null">
5228 <context context-type="linenumber">1</context>
5229 </context-group>
5230 </trans-unit>
5231 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5232 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5233 <target>帳號 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已解除éœéŸ³ã€‚</target>
5234 <context-group name="null">
5235 <context context-type="linenumber">1</context>
5236 </context-group>
5237 </trans-unit>
5238 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5239 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5240 <target>實體 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已解除éœéŸ³ã€‚</target>
5241 <context-group name="null">
5242 <context context-type="linenumber">1</context>
5243 </context-group>
5244 </trans-unit>
5245 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5246 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5247 <target>帳號 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已被實體éœéŸ³ã€‚</target>
5248 <context-group name="null">
5249 <context context-type="linenumber">1</context>
5250 </context-group>
5251 </trans-unit>
5252 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5253 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5254 <target>帳號 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 已被實體解除éœéŸ³ã€‚</target>
5255 <context-group name="null">
5256 <context context-type="linenumber">1</context>
5257 </context-group>
5258 </trans-unit>
5259 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5260 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5261 <target>實體 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已被實體éœéŸ³ã€‚</target>
5262 <context-group name="null">
5263 <context context-type="linenumber">1</context>
5264 </context-group>
5265 </trans-unit>
5266 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5267 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5268 <target>實體 <x id="INTERPOLATION" equiv-text="{{host}}"/> 已被實體解除éœéŸ³ã€‚</target>
5269 <context-group name="null">
5270 <context context-type="linenumber">1</context>
5271 </context-group>
5272 </trans-unit>
5273 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5274 <source>Mute this account</source>
5275 <target>éœéŸ³æ­¤å¸³è™Ÿ</target>
5276 <context-group name="null">
5277 <context context-type="linenumber">1</context>
5278 </context-group>
5279 </trans-unit>
5280 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5281 <source>Unmute this account</source>
5282 <target>解除éœéŸ³æ­¤å¸³è™Ÿ</target>
5283 <context-group name="null">
5284 <context context-type="linenumber">1</context>
5285 </context-group>
5286 </trans-unit>
5287 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5288 <source>Mute the instance</source>
5289 <target>éœéŸ³å¯¦é«”</target>
5290 <context-group name="null">
5291 <context context-type="linenumber">1</context>
5292 </context-group>
5293 </trans-unit>
5294 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5295 <source>Unmute the instance</source>
5296 <target>解除éœéŸ³å¯¦é«”</target>
5297 <context-group name="null">
5298 <context context-type="linenumber">1</context>
5299 </context-group>
5300 </trans-unit>
5301 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5302 <source>Mute this account by your instance</source>
5303 <target>您的實體éœéŸ³æ­¤å¸³è™Ÿ</target>
5304 <context-group name="null">
5305 <context context-type="linenumber">1</context>
5306 </context-group>
5307 </trans-unit>
5308 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5309 <source>Unmute this account by your instance</source>
5310 <target>您的實體解除éœéŸ³æ­¤å¸³è™Ÿ</target>
5311 <context-group name="null">
5312 <context context-type="linenumber">1</context>
5313 </context-group>
5314 </trans-unit>
5315 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5316 <source>Mute the instance by your instance</source>
5317 <target>您的實體éœéŸ³æ­¤å¯¦é«”</target>
5318 <context-group name="null">
5319 <context context-type="linenumber">1</context>
5320 </context-group>
5321 </trans-unit>
5322 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5323 <source>Unmute the instance by your instance</source>
5324 <target>您的實體解除éœéŸ³æ­¤å¯¦é«”</target>
5325 <context-group name="null">
5326 <context context-type="linenumber">1</context>
5327 </context-group>
5328 </trans-unit>
4683 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5329 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4684 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5330 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4685 <target>請求å°ä¼ºæœå™¨ä¾†èªªå¤ªå¤§ã€‚若您想è¦å¢žåŠ é™åˆ¶å¤§å°ï¼Œè«‹è¯çµ¡æ‚¨çš„管ç†å“¡ã€‚</target> 5331 <target>請求å°ä¼ºæœå™¨ä¾†èªªå¤ªå¤§ã€‚若您想è¦å¢žåŠ é™åˆ¶å¤§å°ï¼Œè«‹è¯çµ¡æ‚¨çš„管ç†å“¡ã€‚</target>
@@ -4708,6 +5354,13 @@ When you will upload a video in this channel, the video support field will be au
4708 <context context-type="linenumber">1</context> 5354 <context context-type="linenumber">1</context>
4709 </context-group> 5355 </context-group>
4710 </trans-unit> 5356 </trans-unit>
5357 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5358 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5359 <target>訂閱 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5360 <context-group name="null">
5361 <context context-type="linenumber">1</context>
5362 </context-group>
5363 </trans-unit>
4711 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 5364 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4712 <source>Subscribed</source> 5365 <source>Subscribed</source>
4713 <target>已訂閱</target> 5366 <target>已訂閱</target>
@@ -4715,9 +5368,9 @@ When you will upload a video in this channel, the video support field will be au
4715 <context context-type="linenumber">1</context> 5368 <context context-type="linenumber">1</context>
4716 </context-group> 5369 </context-group>
4717 </trans-unit> 5370 </trans-unit>
4718 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5371 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
4719 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5372 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4720 <target>訂閱 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5373 <target>從 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 許消訂閱</target>
4721 <context-group name="null"> 5374 <context-group name="null">
4722 <context context-type="linenumber">1</context> 5375 <context context-type="linenumber">1</context>
4723 </context-group> 5376 </context-group>
@@ -4729,9 +5382,9 @@ When you will upload a video in this channel, the video support field will be au
4729 <context context-type="linenumber">1</context> 5382 <context context-type="linenumber">1</context>
4730 </context-group> 5383 </context-group>
4731 </trans-unit> 5384 </trans-unit>
4732 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26"> 5385 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
4733 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5386 <source>Moderator</source>
4734 <target>從 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> 許消訂閱</target> 5387 <target>主æŒäºº</target>
4735 <context-group name="null"> 5388 <context-group name="null">
4736 <context context-type="linenumber">1</context> 5389 <context context-type="linenumber">1</context>
4737 </context-group> 5390 </context-group>
@@ -4757,23 +5410,16 @@ When you will upload a video in this channel, the video support field will be au
4757 <context context-type="linenumber">1</context> 5410 <context context-type="linenumber">1</context>
4758 </context-group> 5411 </context-group>
4759 </trans-unit> 5412 </trans-unit>
4760 <trans-unit id="65cc4ab3b4c438e07c89be2b677d08369fb62da2"> 5413 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
4761 <source>Welcome</source> 5414 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
4762 <target>æ­¡è¿Ž</target> 5415 <target>æ­¡è¿Žï¼ç¾åœ¨è«‹æª¢æŸ¥æ‚¨çš„é›»å­éƒµä»¶ä»¥é©—證您的帳號並完æˆè¨»å†Šã€‚</target>
4763 <context-group name="null">
4764 <context context-type="linenumber">1</context>
4765 </context-group>
4766 </trans-unit>
4767 <trans-unit id="f5e3d1e1cd2650fc6e86fbfcc8fe854e5cf18d6c">
4768 <source>Please check your email to verify your account and complete signup.</source>
4769 <target>請檢查您的電å­éƒµä»¶ä»¥é©—證您的帳號與完æˆè¨»å†Šç¨‹åºã€‚</target>
4770 <context-group name="null"> 5416 <context-group name="null">
4771 <context context-type="linenumber">1</context> 5417 <context context-type="linenumber">1</context>
4772 </context-group> 5418 </context-group>
4773 </trans-unit> 5419 </trans-unit>
4774 <trans-unit id="20deec13d8d4ff199aa04318818ca44dab0585be"> 5420 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
4775 <source>Registration for <x id="INTERPOLATION" equiv-text="{{username}}"/> complete.</source> 5421 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
4776 <target>註冊 <x id="INTERPOLATION" equiv-text="{{username}}"/> 完æˆã€‚</target> 5422 <target>您ç¾åœ¨ç™»å…¥ç‚º <x id="INTERPOLATION" equiv-text="{{username}}"/>ï¼</target>
4777 <context-group name="null"> 5423 <context-group name="null">
4778 <context context-type="linenumber">1</context> 5424 <context context-type="linenumber">1</context>
4779 </context-group> 5425 </context-group>
@@ -4806,13 +5452,6 @@ When you will upload a video in this channel, the video support field will be au
4806 <context context-type="linenumber">1</context> 5452 <context context-type="linenumber">1</context>
4807 </context-group> 5453 </context-group>
4808 </trans-unit> 5454 </trans-unit>
4809 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4810 <source>Info</source>
4811 <target>資訊</target>
4812 <context-group name="null">
4813 <context context-type="linenumber">1</context>
4814 </context-group>
4815 </trans-unit>
4816 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5455 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4817 <source>Upload cancelled</source> 5456 <source>Upload cancelled</source>
4818 <target>å·²å–消上傳</target> 5457 <target>å·²å–消上傳</target>
@@ -4820,13 +5459,6 @@ When you will upload a video in this channel, the video support field will be au
4820 <context context-type="linenumber">1</context> 5459 <context context-type="linenumber">1</context>
4821 </context-group> 5460 </context-group>
4822 </trans-unit> 5461 </trans-unit>
4823 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4824 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4825 <target>我們很抱歉,但 PeerTube 無法處ç†å¤§æ–¼ 8GB 的影片</target>
4826 <context-group name="null">
4827 <context context-type="linenumber">1</context>
4828 </context-group>
4829 </trans-unit>
4830 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5462 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4831 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source> 5463 <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
4832 <target>您的影片é…é¡å·²å› æ­¤å½±ç‰‡è¶…éŽï¼ˆå½±ç‰‡å¤§å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,é…é¡ï¼š<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5464 <target>您的影片é…é¡å·²å› æ­¤å½±ç‰‡è¶…éŽï¼ˆå½±ç‰‡å¤§å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,é…é¡ï¼š<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
@@ -4890,6 +5522,20 @@ When you will upload a video in this channel, the video support field will be au
4890 <context context-type="linenumber">1</context> 5522 <context context-type="linenumber">1</context>
4891 </context-group> 5523 </context-group>
4892 </trans-unit> 5524 </trans-unit>
5525 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5526 <source>Like the video</source>
5527 <target>喜歡影片</target>
5528 <context-group name="null">
5529 <context context-type="linenumber">1</context>
5530 </context-group>
5531 </trans-unit>
5532 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5533 <source>Dislike the video</source>
5534 <target>ä¸å–œæ­¡å½±ç‰‡</target>
5535 <context-group name="null">
5536 <context context-type="linenumber">1</context>
5537 </context-group>
5538 </trans-unit>
4893 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 5539 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
4894 <source>Do you really want to delete this video?</source> 5540 <source>Do you really want to delete this video?</source>
4895 <target>您真的想è¦åˆªé™¤æ­¤å½±ç‰‡å—Žï¼Ÿ</target> 5541 <target>您真的想è¦åˆªé™¤æ­¤å½±ç‰‡å—Žï¼Ÿ</target>
diff --git a/client/src/locale/target/iso639_nl_NL.xml b/client/src/locale/target/iso639_nl_NL.xml
index 9c0e2fd9e..b3a4ff541 100644
--- a/client/src/locale/target/iso639_nl_NL.xml
+++ b/client/src/locale/target/iso639_nl_NL.xml
@@ -5,7 +5,7 @@
5 <body> 5 <body>
6 <trans-unit id="Afar"> 6 <trans-unit id="Afar">
7 <source>Afar</source> 7 <source>Afar</source>
8 <target>Afar</target> 8 <target>Ver</target>
9 </trans-unit> 9 </trans-unit>
10 <trans-unit id="Abkhazian"> 10 <trans-unit id="Abkhazian">
11 <source>Abkhazian</source> 11 <source>Abkhazian</source>
@@ -43,6 +43,10 @@
43 <source>Avaric</source> 43 <source>Avaric</source>
44 <target>Avaars</target> 44 <target>Avaars</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="Kotava">
47 <source>Kotava</source>
48 <target>Kotava</target>
49 </trans-unit>
46 <trans-unit id="Aymara"> 50 <trans-unit id="Aymara">
47 <source>Aymara</source> 51 <source>Aymara</source>
48 <target>Aymara</target> 52 <target>Aymara</target>
@@ -167,6 +171,10 @@
167 <source>English</source> 171 <source>English</source>
168 <target>Engels</target> 172 <target>Engels</target>
169 </trans-unit> 173 </trans-unit>
174 <trans-unit id="Esperanto">
175 <source>Esperanto</source>
176 <target>Esperanto</target>
177 </trans-unit>
170 <trans-unit id="Estonian"> 178 <trans-unit id="Estonian">
171 <source>Estonian</source> 179 <source>Estonian</source>
172 <target>Ests</target> 180 <target>Ests</target>
@@ -311,6 +319,10 @@
311 <source>Javanese</source> 319 <source>Javanese</source>
312 <target>Javaans</target> 320 <target>Javaans</target>
313 </trans-unit> 321 </trans-unit>
322 <trans-unit id="Lojban">
323 <source>Lojban</source>
324 <target>Lojban</target>
325 </trans-unit>
314 <trans-unit id="Japanese"> 326 <trans-unit id="Japanese">
315 <source>Japanese</source> 327 <source>Japanese</source>
316 <target>Japans</target> 328 <target>Japans</target>
@@ -495,6 +507,10 @@
495 <source>Nyanja</source> 507 <source>Nyanja</source>
496 <target>Nyanja</target> 508 <target>Nyanja</target>
497 </trans-unit> 509 </trans-unit>
510 <trans-unit id="Occitan">
511 <source>Occitan</source>
512 <target>Occitan</target>
513 </trans-unit>
498 <trans-unit id="Ojibwa"> 514 <trans-unit id="Ojibwa">
499 <source>Ojibwa</source> 515 <source>Ojibwa</source>
500 <target>Ojibwe</target> 516 <target>Ojibwe</target>
@@ -671,6 +687,10 @@
671 <source>Tigrinya</source> 687 <source>Tigrinya</source>
672 <target>Tigrinya</target> 688 <target>Tigrinya</target>
673 </trans-unit> 689 </trans-unit>
690 <trans-unit id="Klingon">
691 <source>Klingon</source>
692 <target>Klingon</target>
693 </trans-unit>
674 <trans-unit id="Tonga (Tonga Islands)"> 694 <trans-unit id="Tonga (Tonga Islands)">
675 <source>Tonga (Tonga Islands)</source> 695 <source>Tonga (Tonga Islands)</source>
676 <target>Tongaans</target> 696 <target>Tongaans</target>
diff --git a/client/src/locale/target/iso639_pl_PL.xml b/client/src/locale/target/iso639_pl_PL.xml
deleted file mode 100644
index b483f5ce8..000000000
--- a/client/src/locale/target/iso639_pl_PL.xml
+++ /dev/null
@@ -1,695 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--XLIFF document generated by Zanata. Visit http://zanata.org for more infomation.-->
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="pl-PL">
5 <body>
6 <trans-unit id="Afar">
7 <source>Afar</source>
8 <target>Afar</target>
9 </trans-unit>
10 <trans-unit id="Abkhazian">
11 <source>Abkhazian</source>
12 <target>Abchaski</target>
13 </trans-unit>
14 <trans-unit id="Afrikaans">
15 <source>Afrikaans</source>
16 <target>Afrikaans</target>
17 </trans-unit>
18 <trans-unit id="Akan">
19 <source>Akan</source>
20 <target>Akan</target>
21 </trans-unit>
22 <trans-unit id="Amharic">
23 <source>Amharic</source>
24 <target>Amharski</target>
25 </trans-unit>
26 <trans-unit id="Arabic">
27 <source>Arabic</source>
28 <target>Arabski</target>
29 </trans-unit>
30 <trans-unit id="Aragonese">
31 <source>Aragonese</source>
32 </trans-unit>
33 <trans-unit id="American Sign Language">
34 <source>American Sign Language</source>
35 <target>Amerykański Język Migowy</target>
36 </trans-unit>
37 <trans-unit id="Assamese">
38 <source>Assamese</source>
39 </trans-unit>
40 <trans-unit id="Avaric">
41 <source>Avaric</source>
42 <target>Awarski</target>
43 </trans-unit>
44 <trans-unit id="Kotava">
45 <source>Kotava</source>
46 </trans-unit>
47 <trans-unit id="Aymara">
48 <source>Aymara</source>
49 </trans-unit>
50 <trans-unit id="Azerbaijani">
51 <source>Azerbaijani</source>
52 </trans-unit>
53 <trans-unit id="Bashkir">
54 <source>Bashkir</source>
55 <target>Baszkirski</target>
56 </trans-unit>
57 <trans-unit id="Bambara">
58 <source>Bambara</source>
59 <target>Bambara</target>
60 </trans-unit>
61 <trans-unit id="Belarusian">
62 <source>Belarusian</source>
63 <target>Białoruski</target>
64 </trans-unit>
65 <trans-unit id="Bengali">
66 <source>Bengali</source>
67 <target>Bengalski</target>
68 </trans-unit>
69 <trans-unit id="British Sign Language">
70 <source>British Sign Language</source>
71 <target>Brytyjski Język Migowy</target>
72 </trans-unit>
73 <trans-unit id="Bislama">
74 <source>Bislama</source>
75 <target>Bislama</target>
76 </trans-unit>
77 <trans-unit id="Tibetan">
78 <source>Tibetan</source>
79 <target>Tybetański</target>
80 </trans-unit>
81 <trans-unit id="Bosnian">
82 <source>Bosnian</source>
83 <target>Bośniacki</target>
84 </trans-unit>
85 <trans-unit id="Breton">
86 <source>Breton</source>
87 <target>Bretoński</target>
88 </trans-unit>
89 <trans-unit id="Bulgarian">
90 <source>Bulgarian</source>
91 <target>Bułgarski</target>
92 </trans-unit>
93 <trans-unit id="Brazilian Sign Language">
94 <source>Brazilian Sign Language</source>
95 </trans-unit>
96 <trans-unit id="Catalan">
97 <source>Catalan</source>
98 <target>Kataloński</target>
99 </trans-unit>
100 <trans-unit id="Czech">
101 <source>Czech</source>
102 <target>Czeski</target>
103 </trans-unit>
104 <trans-unit id="Chamorro">
105 <source>Chamorro</source>
106 </trans-unit>
107 <trans-unit id="Chechen">
108 <source>Chechen</source>
109 </trans-unit>
110 <trans-unit id="Chuvash">
111 <source>Chuvash</source>
112 </trans-unit>
113 <trans-unit id="Cornish">
114 <source>Cornish</source>
115 <target>Kornijski</target>
116 </trans-unit>
117 <trans-unit id="Corsican">
118 <source>Corsican</source>
119 <target>Korsykański</target>
120 </trans-unit>
121 <trans-unit id="Cree">
122 <source>Cree</source>
123 <target>Kri</target>
124 </trans-unit>
125 <trans-unit id="Czech Sign Language">
126 <source>Czech Sign Language</source>
127 <target>Czeski Język Migowy</target>
128 </trans-unit>
129 <trans-unit id="Chinese Sign Language">
130 <source>Chinese Sign Language</source>
131 <target>Chiński Język Migowy</target>
132 </trans-unit>
133 <trans-unit id="Welsh">
134 <source>Welsh</source>
135 <target>Walijski</target>
136 </trans-unit>
137 <trans-unit id="Danish">
138 <source>Danish</source>
139 <target>Duński</target>
140 </trans-unit>
141 <trans-unit id="German">
142 <source>German</source>
143 <target>Niemiecki</target>
144 </trans-unit>
145 <trans-unit id="Dhivehi">
146 <source>Dhivehi</source>
147 </trans-unit>
148 <trans-unit id="Danish Sign Language">
149 <source>Danish Sign Language</source>
150 <target>Duński Język Migowy</target>
151 </trans-unit>
152 <trans-unit id="Dzongkha">
153 <source>Dzongkha</source>
154 <target>Dzongkha</target>
155 </trans-unit>
156 <trans-unit id="Modern Greek (1453-)">
157 <source>Modern Greek (1453-)</source>
158 <target>Nowogrecki (1453-)</target>
159 </trans-unit>
160 <trans-unit id="English">
161 <source>English</source>
162 <target>Angielski</target>
163 </trans-unit>
164 <trans-unit id="Esperanto">
165 <source>Esperanto</source>
166 </trans-unit>
167 <trans-unit id="Estonian">
168 <source>Estonian</source>
169 <target>Estoński</target>
170 </trans-unit>
171 <trans-unit id="Basque">
172 <source>Basque</source>
173 <target>Baskijski</target>
174 </trans-unit>
175 <trans-unit id="Ewe">
176 <source>Ewe</source>
177 <target>Ewe</target>
178 </trans-unit>
179 <trans-unit id="Faroese">
180 <source>Faroese</source>
181 </trans-unit>
182 <trans-unit id="Persian">
183 <source>Persian</source>
184 <target>Perski</target>
185 </trans-unit>
186 <trans-unit id="Fijian">
187 <source>Fijian</source>
188 <target>Fidżyjski</target>
189 </trans-unit>
190 <trans-unit id="Finnish">
191 <source>Finnish</source>
192 <target>Fiński</target>
193 </trans-unit>
194 <trans-unit id="French">
195 <source>French</source>
196 <target>Francuski</target>
197 </trans-unit>
198 <trans-unit id="Western Frisian">
199 <source>Western Frisian</source>
200 </trans-unit>
201 <trans-unit id="French Sign Language">
202 <source>French Sign Language</source>
203 <target>Francuski Język Migowy</target>
204 </trans-unit>
205 <trans-unit id="Fulah">
206 <source>Fulah</source>
207 <target>Ful</target>
208 </trans-unit>
209 <trans-unit id="Scottish Gaelic">
210 <source>Scottish Gaelic</source>
211 </trans-unit>
212 <trans-unit id="Irish">
213 <source>Irish</source>
214 <target>Irlandzki</target>
215 </trans-unit>
216 <trans-unit id="Galician">
217 <source>Galician</source>
218 <target>Galicyjski</target>
219 </trans-unit>
220 <trans-unit id="Manx">
221 <source>Manx</source>
222 </trans-unit>
223 <trans-unit id="Guarani">
224 <source>Guarani</source>
225 </trans-unit>
226 <trans-unit id="German Sign Language">
227 <source>German Sign Language</source>
228 <target>Niemiecki Język Migowy</target>
229 </trans-unit>
230 <trans-unit id="Gujarati">
231 <source>Gujarati</source>
232 </trans-unit>
233 <trans-unit id="Haitian">
234 <source>Haitian</source>
235 </trans-unit>
236 <trans-unit id="Hausa">
237 <source>Hausa</source>
238 <target>Hausa</target>
239 </trans-unit>
240 <trans-unit id="Serbo-Croatian">
241 <source>Serbo-Croatian</source>
242 <target>Serbsko-Chorwacki</target>
243 </trans-unit>
244 <trans-unit id="Hebrew">
245 <source>Hebrew</source>
246 </trans-unit>
247 <trans-unit id="Herero">
248 <source>Herero</source>
249 </trans-unit>
250 <trans-unit id="Hindi">
251 <source>Hindi</source>
252 <target>Hindi</target>
253 </trans-unit>
254 <trans-unit id="Hiri Motu">
255 <source>Hiri Motu</source>
256 </trans-unit>
257 <trans-unit id="Croatian">
258 <source>Croatian</source>
259 <target>Chorwacki</target>
260 </trans-unit>
261 <trans-unit id="Hungarian">
262 <source>Hungarian</source>
263 <target>Węgierski</target>
264 </trans-unit>
265 <trans-unit id="Armenian">
266 <source>Armenian</source>
267 <target>Ormański</target>
268 </trans-unit>
269 <trans-unit id="Igbo">
270 <source>Igbo</source>
271 <target>Igbo</target>
272 </trans-unit>
273 <trans-unit id="Sichuan Yi">
274 <source>Sichuan Yi</source>
275 </trans-unit>
276 <trans-unit id="Inuktitut">
277 <source>Inuktitut</source>
278 </trans-unit>
279 <trans-unit id="Indonesian">
280 <source>Indonesian</source>
281 <target>Indonezyjski</target>
282 </trans-unit>
283 <trans-unit id="Inupiaq">
284 <source>Inupiaq</source>
285 </trans-unit>
286 <trans-unit id="Icelandic">
287 <source>Icelandic</source>
288 <target>Islandzki</target>
289 </trans-unit>
290 <trans-unit id="Italian">
291 <source>Italian</source>
292 <target>WÅ‚oski</target>
293 </trans-unit>
294 <trans-unit id="Javanese">
295 <source>Javanese</source>
296 <target>Jawajski</target>
297 </trans-unit>
298 <trans-unit id="Lojban">
299 <source>Lojban</source>
300 </trans-unit>
301 <trans-unit id="Japanese">
302 <source>Japanese</source>
303 <target>Japoński</target>
304 </trans-unit>
305 <trans-unit id="Japanese Sign Language">
306 <source>Japanese Sign Language</source>
307 <target>Japoński Język Migowy</target>
308 </trans-unit>
309 <trans-unit id="Kalaallisut">
310 <source>Kalaallisut</source>
311 </trans-unit>
312 <trans-unit id="Kannada">
313 <source>Kannada</source>
314 </trans-unit>
315 <trans-unit id="Kashmiri">
316 <source>Kashmiri</source>
317 </trans-unit>
318 <trans-unit id="Georgian">
319 <source>Georgian</source>
320 </trans-unit>
321 <trans-unit id="Kanuri">
322 <source>Kanuri</source>
323 </trans-unit>
324 <trans-unit id="Kazakh">
325 <source>Kazakh</source>
326 </trans-unit>
327 <trans-unit id="Khmer">
328 <source>Khmer</source>
329 </trans-unit>
330 <trans-unit id="Kikuyu">
331 <source>Kikuyu</source>
332 </trans-unit>
333 <trans-unit id="Kinyarwanda">
334 <source>Kinyarwanda</source>
335 </trans-unit>
336 <trans-unit id="Kirghiz">
337 <source>Kirghiz</source>
338 </trans-unit>
339 <trans-unit id="Komi">
340 <source>Komi</source>
341 <target>Komi</target>
342 </trans-unit>
343 <trans-unit id="Kongo">
344 <source>Kongo</source>
345 <target>Kongo</target>
346 </trans-unit>
347 <trans-unit id="Korean">
348 <source>Korean</source>
349 <target>Koreański</target>
350 </trans-unit>
351 <trans-unit id="Kuanyama">
352 <source>Kuanyama</source>
353 </trans-unit>
354 <trans-unit id="Kurdish">
355 <source>Kurdish</source>
356 <target>Kurdyjski</target>
357 </trans-unit>
358 <trans-unit id="Lao">
359 <source>Lao</source>
360 <target>Laotański</target>
361 </trans-unit>
362 <trans-unit id="Latvian">
363 <source>Latvian</source>
364 <target>Åotewski</target>
365 </trans-unit>
366 <trans-unit id="Limburgan">
367 <source>Limburgan</source>
368 </trans-unit>
369 <trans-unit id="Lingala">
370 <source>Lingala</source>
371 </trans-unit>
372 <trans-unit id="Lithuanian">
373 <source>Lithuanian</source>
374 <target>Litewski</target>
375 </trans-unit>
376 <trans-unit id="Luxembourgish">
377 <source>Luxembourgish</source>
378 <target>Luksemburski</target>
379 </trans-unit>
380 <trans-unit id="Luba-Katanga">
381 <source>Luba-Katanga</source>
382 </trans-unit>
383 <trans-unit id="Ganda">
384 <source>Ganda</source>
385 </trans-unit>
386 <trans-unit id="Marshallese">
387 <source>Marshallese</source>
388 </trans-unit>
389 <trans-unit id="Malayalam">
390 <source>Malayalam</source>
391 </trans-unit>
392 <trans-unit id="Marathi">
393 <source>Marathi</source>
394 </trans-unit>
395 <trans-unit id="Macedonian">
396 <source>Macedonian</source>
397 </trans-unit>
398 <trans-unit id="Malagasy">
399 <source>Malagasy</source>
400 </trans-unit>
401 <trans-unit id="Maltese">
402 <source>Maltese</source>
403 </trans-unit>
404 <trans-unit id="Mongolian">
405 <source>Mongolian</source>
406 </trans-unit>
407 <trans-unit id="Maori">
408 <source>Maori</source>
409 </trans-unit>
410 <trans-unit id="Malay (macrolanguage)">
411 <source>Malay (macrolanguage)</source>
412 </trans-unit>
413 <trans-unit id="Burmese">
414 <source>Burmese</source>
415 </trans-unit>
416 <trans-unit id="Nauru">
417 <source>Nauru</source>
418 <target>Naurański</target>
419 </trans-unit>
420 <trans-unit id="Navajo">
421 <source>Navajo</source>
422 </trans-unit>
423 <trans-unit id="South Ndebele">
424 <source>South Ndebele</source>
425 </trans-unit>
426 <trans-unit id="North Ndebele">
427 <source>North Ndebele</source>
428 </trans-unit>
429 <trans-unit id="Ndonga">
430 <source>Ndonga</source>
431 </trans-unit>
432 <trans-unit id="Nepali (macrolanguage)">
433 <source>Nepali (macrolanguage)</source>
434 </trans-unit>
435 <trans-unit id="Dutch">
436 <source>Dutch</source>
437 <target>Holenderski</target>
438 </trans-unit>
439 <trans-unit id="Norwegian Nynorsk">
440 <source>Norwegian Nynorsk</source>
441 <target>Norweski Nynorsk</target>
442 </trans-unit>
443 <trans-unit id="Norwegian Bokmål">
444 <source>Norwegian Bokmål</source>
445 <target>Norweski Bokmål</target>
446 </trans-unit>
447 <trans-unit id="Norwegian">
448 <source>Norwegian</source>
449 <target>Norweski</target>
450 </trans-unit>
451 <trans-unit id="Nyanja">
452 <source>Nyanja</source>
453 </trans-unit>
454 <trans-unit id="Occitan">
455 <source>Occitan</source>
456 </trans-unit>
457 <trans-unit id="Ojibwa">
458 <source>Ojibwa</source>
459 </trans-unit>
460 <trans-unit id="Oriya (macrolanguage)">
461 <source>Oriya (macrolanguage)</source>
462 </trans-unit>
463 <trans-unit id="Oromo">
464 <source>Oromo</source>
465 <target>Oromo</target>
466 </trans-unit>
467 <trans-unit id="Ossetian">
468 <source>Ossetian</source>
469 </trans-unit>
470 <trans-unit id="Panjabi">
471 <source>Panjabi</source>
472 </trans-unit>
473 <trans-unit id="Pakistan Sign Language">
474 <source>Pakistan Sign Language</source>
475 </trans-unit>
476 <trans-unit id="Polish">
477 <source>Polish</source>
478 <target>Polski</target>
479 </trans-unit>
480 <trans-unit id="Portuguese">
481 <source>Portuguese</source>
482 <target>Portugalski</target>
483 </trans-unit>
484 <trans-unit id="Pushto">
485 <source>Pushto</source>
486 <target>Paszto</target>
487 </trans-unit>
488 <trans-unit id="Quechua">
489 <source>Quechua</source>
490 </trans-unit>
491 <trans-unit id="Romansh">
492 <source>Romansh</source>
493 <target>Romansz</target>
494 </trans-unit>
495 <trans-unit id="Romanian">
496 <source>Romanian</source>
497 <target>Rumuński</target>
498 </trans-unit>
499 <trans-unit id="Russian Sign Language">
500 <source>Russian Sign Language</source>
501 <target>Rosyjski Język Migowy</target>
502 </trans-unit>
503 <trans-unit id="Rundi">
504 <source>Rundi</source>
505 <target>Rundi</target>
506 </trans-unit>
507 <trans-unit id="Russian">
508 <source>Russian</source>
509 <target>Rosyjski</target>
510 </trans-unit>
511 <trans-unit id="Sango">
512 <source>Sango</source>
513 <target>Sango</target>
514 </trans-unit>
515 <trans-unit id="Saudi Arabian Sign Language">
516 <source>Saudi Arabian Sign Language</source>
517 </trans-unit>
518 <trans-unit id="South African Sign Language">
519 <source>South African Sign Language</source>
520 </trans-unit>
521 <trans-unit id="Sinhala">
522 <source>Sinhala</source>
523 </trans-unit>
524 <trans-unit id="Slovak">
525 <source>Slovak</source>
526 <target>SÅ‚owacki</target>
527 </trans-unit>
528 <trans-unit id="Slovenian">
529 <source>Slovenian</source>
530 <target>Słoweński</target>
531 </trans-unit>
532 <trans-unit id="Northern Sami">
533 <source>Northern Sami</source>
534 </trans-unit>
535 <trans-unit id="Samoan">
536 <source>Samoan</source>
537 <target>Samoański</target>
538 </trans-unit>
539 <trans-unit id="Shona">
540 <source>Shona</source>
541 <target>Shona</target>
542 </trans-unit>
543 <trans-unit id="Sindhi">
544 <source>Sindhi</source>
545 <target>Sindhi</target>
546 </trans-unit>
547 <trans-unit id="Somali">
548 <source>Somali</source>
549 <target>Somalijski</target>
550 </trans-unit>
551 <trans-unit id="Southern Sotho">
552 <source>Southern Sotho</source>
553 </trans-unit>
554 <trans-unit id="Spanish">
555 <source>Spanish</source>
556 <target>Hiszpański</target>
557 </trans-unit>
558 <trans-unit id="Albanian">
559 <source>Albanian</source>
560 </trans-unit>
561 <trans-unit id="Sardinian">
562 <source>Sardinian</source>
563 </trans-unit>
564 <trans-unit id="Serbian">
565 <source>Serbian</source>
566 <target>Serbski</target>
567 </trans-unit>
568 <trans-unit id="Swati">
569 <source>Swati</source>
570 </trans-unit>
571 <trans-unit id="Sundanese">
572 <source>Sundanese</source>
573 </trans-unit>
574 <trans-unit id="Swahili (macrolanguage)">
575 <source>Swahili (macrolanguage)</source>
576 </trans-unit>
577 <trans-unit id="Swedish">
578 <source>Swedish</source>
579 <target>Szwedzki</target>
580 </trans-unit>
581 <trans-unit id="Swedish Sign Language">
582 <source>Swedish Sign Language</source>
583 <target>Szwedzki Język Migowy</target>
584 </trans-unit>
585 <trans-unit id="Tahitian">
586 <source>Tahitian</source>
587 </trans-unit>
588 <trans-unit id="Tamil">
589 <source>Tamil</source>
590 <target>Tamilski</target>
591 </trans-unit>
592 <trans-unit id="Tatar">
593 <source>Tatar</source>
594 <target>Tatarski</target>
595 </trans-unit>
596 <trans-unit id="Telugu">
597 <source>Telugu</source>
598 <target>Telugu</target>
599 </trans-unit>
600 <trans-unit id="Tajik">
601 <source>Tajik</source>
602 <target>Tadżycki</target>
603 </trans-unit>
604 <trans-unit id="Tagalog">
605 <source>Tagalog</source>
606 <target>Tagalski</target>
607 </trans-unit>
608 <trans-unit id="Thai">
609 <source>Thai</source>
610 <target>Tajski</target>
611 </trans-unit>
612 <trans-unit id="Tigrinya">
613 <source>Tigrinya</source>
614 </trans-unit>
615 <trans-unit id="Klingon">
616 <source>Klingon</source>
617 </trans-unit>
618 <trans-unit id="Tonga (Tonga Islands)">
619 <source>Tonga (Tonga Islands)</source>
620 </trans-unit>
621 <trans-unit id="Tswana">
622 <source>Tswana</source>
623 </trans-unit>
624 <trans-unit id="Tsonga">
625 <source>Tsonga</source>
626 </trans-unit>
627 <trans-unit id="Turkmen">
628 <source>Turkmen</source>
629 <target>Turkmeński</target>
630 </trans-unit>
631 <trans-unit id="Turkish">
632 <source>Turkish</source>
633 <target>Turecki</target>
634 </trans-unit>
635 <trans-unit id="Twi">
636 <source>Twi</source>
637 <target>Twi</target>
638 </trans-unit>
639 <trans-unit id="Uighur">
640 <source>Uighur</source>
641 </trans-unit>
642 <trans-unit id="Ukrainian">
643 <source>Ukrainian</source>
644 <target>Ukraiński</target>
645 </trans-unit>
646 <trans-unit id="Urdu">
647 <source>Urdu</source>
648 <target>Urdu</target>
649 </trans-unit>
650 <trans-unit id="Uzbek">
651 <source>Uzbek</source>
652 <target>Uzbecki</target>
653 </trans-unit>
654 <trans-unit id="Venda">
655 <source>Venda</source>
656 <target>Venda</target>
657 </trans-unit>
658 <trans-unit id="Vietnamese">
659 <source>Vietnamese</source>
660 <target>Wietnamski</target>
661 </trans-unit>
662 <trans-unit id="Walloon">
663 <source>Walloon</source>
664 <target>Waloński</target>
665 </trans-unit>
666 <trans-unit id="Wolof">
667 <source>Wolof</source>
668 <target>Wolof</target>
669 </trans-unit>
670 <trans-unit id="Xhosa">
671 <source>Xhosa</source>
672 <target>Xhosa</target>
673 </trans-unit>
674 <trans-unit id="Yiddish">
675 <source>Yiddish</source>
676 <target>Jidysz</target>
677 </trans-unit>
678 <trans-unit id="Yoruba">
679 <source>Yoruba</source>
680 <target>Joruba</target>
681 </trans-unit>
682 <trans-unit id="Zhuang">
683 <source>Zhuang</source>
684 <target>Zhuang</target>
685 </trans-unit>
686 <trans-unit id="Chinese">
687 <source>Chinese</source>
688 <target>Chiński</target>
689 </trans-unit>
690 <trans-unit id="Zulu">
691 <source>Zulu</source>
692 <target>Zulu</target>
693 </trans-unit>
694 </body>
695 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/player_ar_001.xml b/client/src/locale/target/player_ar_001.xml
index e2c20884b..4e3a12ad7 100644
--- a/client/src/locale/target/player_ar_001.xml
+++ b/client/src/locale/target/player_ar_001.xml
@@ -81,11 +81,11 @@
81 </trans-unit> 81 </trans-unit>
82 <trans-unit id="Subtitles"> 82 <trans-unit id="Subtitles">
83 <source>Subtitles</source> 83 <source>Subtitles</source>
84 <target>ترجمة</target> 84 <target>الترجمات</target>
85 </trans-unit> 85 </trans-unit>
86 <trans-unit id="subtitles off"> 86 <trans-unit id="subtitles off">
87 <source>subtitles off</source> 87 <source>subtitles off</source>
88 <target>ألغ الترجمة</target> 88 <target>تعطيل الترجمة النصية</target>
89 </trans-unit> 89 </trans-unit>
90 <trans-unit id="Captions"> 90 <trans-unit id="Captions">
91 <source>Captions</source> 91 <source>Captions</source>
@@ -93,7 +93,7 @@
93 </trans-unit> 93 </trans-unit>
94 <trans-unit id="captions off"> 94 <trans-unit id="captions off">
95 <source>captions off</source> 95 <source>captions off</source>
96 <target>ألغ التعليقات</target> 96 <target>تعطيل التعليقات</target>
97 </trans-unit> 97 </trans-unit>
98 <trans-unit id="Chapters"> 98 <trans-unit id="Chapters">
99 <source>Chapters</source> 99 <source>Chapters</source>
@@ -169,7 +169,7 @@
169 </trans-unit> 169 </trans-unit>
170 <trans-unit id=", opens subtitles settings dialog"> 170 <trans-unit id=", opens subtitles settings dialog">
171 <source>, opens subtitles settings dialog</source> 171 <source>, opens subtitles settings dialog</source>
172 <target>ØŒ Ø¥Ùتح ناÙذة إعدادات الترجمة</target> 172 <target>ØŒ Ø¥Ùتح ناÙذة إعدادات الترجمات النصية</target>
173 </trans-unit> 173 </trans-unit>
174 <trans-unit id=", opens descriptions settings dialog"> 174 <trans-unit id=", opens descriptions settings dialog">
175 <source>, opens descriptions settings dialog</source> 175 <source>, opens descriptions settings dialog</source>
@@ -249,7 +249,11 @@
249 </trans-unit> 249 </trans-unit>
250 <trans-unit id="None"> 250 <trans-unit id="None">
251 <source>None</source> 251 <source>None</source>
252 <target>لا شيئ</target> 252 <target>لا شيء</target>
253 </trans-unit>
254 <trans-unit id="Font Family">
255 <source>Font Family</source>
256 <target>صن٠الخط</target>
253 </trans-unit> 257 </trans-unit>
254 <trans-unit id="Reset"> 258 <trans-unit id="Reset">
255 <source>Reset</source> 259 <source>Reset</source>
@@ -257,7 +261,7 @@
257 </trans-unit> 261 </trans-unit>
258 <trans-unit id="restore all settings to the default values"> 262 <trans-unit id="restore all settings to the default values">
259 <source>restore all settings to the default values</source> 263 <source>restore all settings to the default values</source>
260 <target>أعد ك٠الإعدادات الى القيم الاÙتراضية</target> 264 <target>أعادة كاÙØ© الإعدادات إلى القيم الإÙتراضية</target>
261 </trans-unit> 265 </trans-unit>
262 <trans-unit id="Done"> 266 <trans-unit id="Done">
263 <source>Done</source> 267 <source>Done</source>
@@ -265,7 +269,7 @@
265 </trans-unit> 269 </trans-unit>
266 <trans-unit id="Caption Settings Dialog"> 270 <trans-unit id="Caption Settings Dialog">
267 <source>Caption Settings Dialog</source> 271 <source>Caption Settings Dialog</source>
268 <target>اعدادات التعليقات</target> 272 <target>إعدادات التعليقات</target>
269 </trans-unit> 273 </trans-unit>
270 <trans-unit id="End of dialog window."> 274 <trans-unit id="End of dialog window.">
271 <source>End of dialog window.</source> 275 <source>End of dialog window.</source>
@@ -287,6 +291,10 @@
287 <source>Speed</source> 291 <source>Speed</source>
288 <target>السرعة</target> 292 <target>السرعة</target>
289 </trans-unit> 293 </trans-unit>
294 <trans-unit id="Subtitles/CC">
295 <source>Subtitles/CC</source>
296 <target>الترجمات النصية</target>
297 </trans-unit>
290 <trans-unit id="peers"> 298 <trans-unit id="peers">
291 <source>peers</source> 299 <source>peers</source>
292 <target>الأقران</target> 300 <target>الأقران</target>
@@ -299,6 +307,10 @@
299 <source>Settings</source> 307 <source>Settings</source>
300 <target>الإعدادات</target> 308 <target>الإعدادات</target>
301 </trans-unit> 309 </trans-unit>
310 <trans-unit id="Uses P2P, others may know you are watching this video.">
311 <source>Uses P2P, others may know you are watching this video.</source>
312 <target>يستخدم P2PØŒ يمكن للآخرين معرÙØ© إن كنت تشاهد هذا الÙيديو.</target>
313 </trans-unit>
302 <trans-unit id="Copy the video URL"> 314 <trans-unit id="Copy the video URL">
303 <source>Copy the video URL</source> 315 <source>Copy the video URL</source>
304 <target>نسخ رابط الÙيديو</target> 316 <target>نسخ رابط الÙيديو</target>
@@ -309,7 +321,7 @@
309 </trans-unit> 321 </trans-unit>
310 <trans-unit id="Copy embed code"> 322 <trans-unit id="Copy embed code">
311 <source>Copy embed code</source> 323 <source>Copy embed code</source>
312 <target>نسخ الكود المØمن</target> 324 <target>نسخ الرÙز المدمج</target>
313 </trans-unit> 325 </trans-unit>
314 </body> 326 </body>
315 </file></xliff> \ No newline at end of file 327 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/player_de_DE.json b/client/src/locale/target/player_de_DE.json
index afcc2a286..fb4847590 100644
--- a/client/src/locale/target/player_de_DE.json
+++ b/client/src/locale/target/player_de_DE.json
@@ -1 +1 @@
{"Audio Player":"Audio-Player","Video Player":"Video-Player","Play":"Wiedergabe","Pause":"Wiedergabe pausieren","Replay":"Nochmal","Current Time":"Aktuelle Zeit","Duration":"Länge","Remaining Time":"Verbleibende Zeit","Stream Type":"Streamtyp","LIVE":"Live","Loaded":"Geladen","Progress":"Fortschritt","Progress Bar":"Fortschrittsanzeige","progress bar timing: currentTime={1} duration={2}":"{1} von {2}","Fullscreen":"Vollbildschirm","Non-Fullscreen":"Kein Vollbildschirm","Mute":"Ton aus","Unmute":"Ton an","Playback Rate":"Wiedergabegeschwindigkeit","Subtitles":"Untertitel","subtitles off":"Untertitel aus","Captions":"Untertitel für Gehörlose und Schwerhörige","captions off":"Untertitel für Gehörlose und Schwerhörige aus","Chapters":"Kapitel","Descriptions":"Beschreibungen","descriptions off":"Beschreibungen aus","Audio Track":"Tonspur","Volume Level":"Lautstärke","You aborted the media playback":"Du hast die Medienwiedergabe abgebrochen.","A network error caused the media download to fail part-way.":"Ein Netzwerkfehler hat das Herunterladen des Videos teilweise verhindert.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Es ist ein Fehler beim Laden aufgetreten. Das kann an einer fehlenden Netzwerk-Verbindung liegen oder daran, dass das Format nicht unterstützt wird.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Die Medienwiedergabe wurde abgebrochen, weil die erhaltenen Daten entweder fehlerhaft sind vom aktuellen Browser nicht unterstützt werden.","No compatible source was found for this media.":"Es konnte keine kompatible Quelle gefunden werden.","The media is encrypted and we do not have the keys to decrypt it.":"Die Daten sind verschlüsselt und es liegen keine Schlüssel dafür vor.","Play Video":"Video abspielen","Close":"Schließen","Close Modal Dialog":"Dialogfenster schließen","Modal Window":"Dialogfenster","This is a modal window":"Dies ist ein Dialogfenster.","This modal can be closed by pressing the Escape key or activating the close button.":"Dieses Dialogfenster kann geschlossen werden, indem man die Escape-Taste drückt oder auf die Schaltfläche zum Schließen des Fenster klickt.",", opens captions settings dialog":", öffnet die Einstellungen für Untertitel für Gehörlose und Schwerhörige",", opens subtitles settings dialog":", öffnet die Einstellungen für Untertitel",", opens descriptions settings dialog":", öffnet die Einstellungen für Beschreibungen",", selected":", ausgewählt","captions settings":"Einstellungen für Untertitel für Gehörlose und Schwerhörige","subtitles settings":"Einstellungen für Untertitel","descriptions settings":"Einstellungen für Beschreibungen","Text":"Text","White":"Weiß","Black":"Schwarz","Red":"Rot","Green":"Grün","Blue":"Blau","Yellow":"Gelb","Magenta":"Magenta","Cyan":"Cyan","Background":"Hintergrund","Window":"Fenster","Transparent":"durchsichtig","Semi-Transparent":"halbdurchsichtig","Opaque":"undurchsichtig","Font Size":"Schriftgröße","Text Edge Style":"Textkantenstil","None":"Nichts","Raised":"Erhöht","Depressed":"Erniedrigt","Uniform":"Gleichmäßig","Dropshadow":"Schlagschatten","Font Family":"Schriftart","Proportional Sans-Serif":"Proportionale Grotesk","Monospace Sans-Serif":"Nichtproportionale Grotesk","Proportional Serif":"Proportionale Serifen-Schrit","Monospace Serif":"Nichtproportionale Serifen-Schrift","Casual":"Gewöhnlich","Script":"Schreibschrift","Small Caps":"Kapitälchen","Reset":"Zurücksetzen","restore all settings to the default values":"Alle Einstellungen auf ihre Standardwerte zurücksetzen","Done":"Fertig","Caption Settings Dialog":"Dialogfenster für Einstellungen für Untertitel für Gehörlose und Schwerhörige","Beginning of dialog window. Escape will cancel and close the window.":"Anfang des Dialogfensters. Mit der Escape-Taste wird das Fenster ohne Speichern geschlossen.","End of dialog window.":"Ende des Dialogfensters.","{1} is loading.":"{1} lädt.","Quality":"Qualität","Auto":"Automatisch","Speed":"Geschwindigkeit","Subtitles/CC":"Untertitel","peers":"Peers","Go to the video page":"Zur Video-Seite gehen","Settings":"Einstellungen","Uses P2P, others may know you are watching this video.":"Nutzt Peer-to-Peer-Technologie, daher könnten andere wissen, dass du dieses Video ansiehst.","Copy the video URL":"Video-URL kopieren","Copy the video URL at the current time":"Video-URL an dieser Stelle kopieren","Copy embed code":"Einbettungscode kopieren"} \ No newline at end of file {"Audio Player":"Audio-Player","Video Player":"Video-Player","Play":"Wiedergabe","Pause":"Wiedergabe pausieren","Replay":"Nochmal","Current Time":"Aktuelle Zeit","Duration":"Länge","Remaining Time":"Verbleibende Zeit","Stream Type":"Streamtyp","LIVE":"Live","Loaded":"Geladen","Progress":"Fortschritt","Progress Bar":"Fortschrittsanzeige","progress bar timing: currentTime={1} duration={2}":"{1} von {2}","Fullscreen":"Vollbild","Non-Fullscreen":"Vollbild beenden","Mute":"Ton aus","Unmute":"Ton an","Playback Rate":"Wiedergabegeschwindigkeit","Subtitles":"Untertitel","subtitles off":"Untertitel aus","Captions":"Untertitel für Gehörlose und Schwerhörige","captions off":"Untertitel für Gehörlose und Schwerhörige aus","Chapters":"Kapitel","Descriptions":"Beschreibungen","descriptions off":"Beschreibungen aus","Audio Track":"Tonspur","Volume Level":"Lautstärke","You aborted the media playback":"Du hast die Medienwiedergabe abgebrochen.","A network error caused the media download to fail part-way.":"Ein Netzwerkfehler hat das Herunterladen des Videos teilweise verhindert.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Es ist ein Fehler beim Laden aufgetreten. Das kann an einer fehlenden Netzwerk-Verbindung liegen oder daran, dass das Format nicht unterstützt wird.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Die Medienwiedergabe wurde abgebrochen, weil die erhaltenen Daten entweder fehlerhaft sind vom aktuellen Browser nicht unterstützt werden.","No compatible source was found for this media.":"Es konnte keine kompatible Quelle gefunden werden.","The media is encrypted and we do not have the keys to decrypt it.":"Die Daten sind verschlüsselt und es liegen keine Schlüssel dafür vor.","Play Video":"Video abspielen","Close":"Schließen","Close Modal Dialog":"Dialogfenster schließen","Modal Window":"Dialogfenster","This is a modal window":"Dies ist ein Dialogfenster.","This modal can be closed by pressing the Escape key or activating the close button.":"Dieses Dialogfenster kann geschlossen werden, indem man die Escape-Taste drückt oder auf die Schaltfläche zum Schließen des Fenster klickt.",", opens captions settings dialog":", öffnet die Einstellungen für Untertitel für Gehörlose und Schwerhörige",", opens subtitles settings dialog":", öffnet die Einstellungen für Untertitel",", opens descriptions settings dialog":", öffnet die Einstellungen für Beschreibungen",", selected":", ausgewählt","captions settings":"Einstellungen für Untertitel für Gehörlose und Schwerhörige","subtitles settings":"Einstellungen für Untertitel","descriptions settings":"Einstellungen für Beschreibungen","Text":"Text","White":"Weiß","Black":"Schwarz","Red":"Rot","Green":"Grün","Blue":"Blau","Yellow":"Gelb","Magenta":"Magenta","Cyan":"Cyan","Background":"Hintergrund","Window":"Fenster","Transparent":"durchsichtig","Semi-Transparent":"halbdurchsichtig","Opaque":"undurchsichtig","Font Size":"Schriftgröße","Text Edge Style":"Textkantenstil","None":"Nichts","Raised":"Erhöht","Depressed":"Erniedrigt","Uniform":"Gleichmäßig","Dropshadow":"Schlagschatten","Font Family":"Schriftart","Proportional Sans-Serif":"Proportionale Grotesk","Monospace Sans-Serif":"Nichtproportionale Grotesk","Proportional Serif":"Proportionale Serifen-Schrit","Monospace Serif":"Nichtproportionale Serifen-Schrift","Casual":"Gewöhnlich","Script":"Schreibschrift","Small Caps":"Kapitälchen","Reset":"Zurücksetzen","restore all settings to the default values":"Alle Einstellungen auf ihre Standardwerte zurücksetzen","Done":"Fertig","Caption Settings Dialog":"Dialogfenster für Einstellungen für Untertitel für Gehörlose und Schwerhörige","Beginning of dialog window. Escape will cancel and close the window.":"Anfang des Dialogfensters. Mit der Escape-Taste wird das Fenster ohne Speichern geschlossen.","End of dialog window.":"Ende des Dialogfensters.","{1} is loading.":"{1} lädt.","Quality":"Qualität","Auto":"Automatisch","Speed":"Geschwindigkeit","Subtitles/CC":"Untertitel","peers":"Peers","Go to the video page":"Zur Video-Seite gehen","Settings":"Einstellungen","Uses P2P, others may know you are watching this video.":"Nutzt Peer-to-Peer-Technologie, daher könnten andere wissen, dass du dieses Video ansiehst.","Copy the video URL":"Video-URL kopieren","Copy the video URL at the current time":"Video-URL an dieser Stelle kopieren","Copy embed code":"Einbettungscode kopieren"} \ No newline at end of file
diff --git a/client/src/locale/target/player_it_IT.json b/client/src/locale/target/player_it_IT.json
new file mode 100644
index 000000000..add193bfe
--- /dev/null
+++ b/client/src/locale/target/player_it_IT.json
@@ -0,0 +1 @@
{"Audio Player":"Riproduttore Audio","Video Player":"Riproduttore Video","Play":"Play","Pause":"Pausa","Replay":"Replay","Current Time":"Posizione attuale","Duration":"Durata","Remaining Time":"Tempo rimanente","Stream Type":"Tipo dello Streaming","LIVE":"LIVE","Loaded":"Caricato","Progress":"Stato","Progress Bar":"Barra di progresso","progress bar timing: currentTime={1} duration={2}":"{1} di {2}","Fullscreen":"Schermo intero","Non-Fullscreen":"Chiudi schermo intero","Mute":"Muto","Unmute":"Audio ","Playback Rate":"Velocità di riproduzione","Subtitles":"Sottotitoli","subtitles off":"Senza sottotitoli","Captions":"Sottotitoli per non udenti","captions off":"Senza sottotitoli per non udenti","Chapters":"Capitoli","Descriptions":"Descrizioni","descriptions off":"Descrizioni disattivate","Audio Track":"Traccia Audio","Volume Level":"Volume","You aborted the media playback":"La riproduzione del filmato è stata interrotta","A network error caused the media download to fail part-way.":"Il download del filmato è stato interrotto a causa di un problema rete.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.","No compatible source was found for this media.":"Non ci sono fonti compatibili per questo filmato.","The media is encrypted and we do not have the keys to decrypt it.":"Il filmato è crittato e non disponiamo delle chiavi per decrittarlo","Play Video":"Riproduci Video","Close":"Chiudi","Close Modal Dialog":"Chiudi finestra di dialogo","Modal Window":"Finestra di dialogo","This is a modal window":"Questa è una finestra di dialogo","This modal can be closed by pressing the Escape key or activating the close button.":"Questa finestra di dialogo può essere chiusa premendo Esc o cliccando sul pulsante chiudi.",", opens captions settings dialog":", apri la finestra delle impostazioni delle didascalie",", opens subtitles settings dialog":", apri la finestra delle impostazioni dei sottotitoli",", opens descriptions settings dialog":", apri la finestra delle impostazioni delle descrizioni",", selected":", selezionati","captions settings":"impostazioni delle didascalie","subtitles settings":"impostazioni dei sottotitoli","descriptions settings":"impostazioni delle descrizioni","Text":"Testo","White":"Bianco","Black":"Nero","Red":"Rosso","Green":"Verde","Blue":"Blu","Yellow":"Giallo","Magenta":"Magenta","Cyan":"Ciano","Background":"Sfondo","Window":"Finestra","Transparent":"Trasparente","Semi-Transparent":"Semi-Trasparente","Opaque":"Opaco","Font Size":"Dimensione del Testo","Text Edge Style":"Stile dei Bordi del Testo","None":"Nessuno","Raised":"In Rilievo","Depressed":"Incavato","Uniform":"Uniforme","Dropshadow":"Ombreggiatura","Font Family":"Stile del Testo","Proportional Sans-Serif":"Senza Grazie Proporzionale","Monospace Sans-Serif":"Senza Grazie Monospazio","Proportional Serif":"Con Grazie Proporzionale","Monospace Serif":"Con Grazie Monospazio","Casual":"Casuale","Script":"Codice","Small Caps":"Maiuscoletto","Reset":"Ripristina","restore all settings to the default values":"ripristina tutte le impostazioni ai valori predefiniti","Done":"Fatto","Caption Settings Dialog":"Finestra delle Impostazioni dei Sottotitoli","Beginning of dialog window. Escape will cancel and close the window.":"Apertura della finestra di dialogo. Premendo ESC si annullerà e si chiuderà la finestra.","End of dialog window.":"Chiusura della finestra di dialogo.","{1} is loading.":"{1} è in caricamento.","Quality":"Qualità","Auto":"Auto","Speed":"Velocità","Subtitles/CC":"Sottotitoli/CC","peers":"nodi","Go to the video page":"Vai alla pagina del video","Settings":"Impostazioni","Uses P2P, others may know you are watching this video.":"Usa P2P, altri potrebbero sapere che stai guardando questo video.","Copy the video URL":"Copia l'URL del video","Copy the video URL at the current time":"Copia l'URL del video della posizione corrente","Copy embed code":"Copia il codice per incorporare"} \ No newline at end of file
diff --git a/client/src/locale/target/player_nl_NL.xml b/client/src/locale/target/player_nl_NL.xml
index 5b689f2a2..45bc76a55 100644
--- a/client/src/locale/target/player_nl_NL.xml
+++ b/client/src/locale/target/player_nl_NL.xml
@@ -347,6 +347,10 @@
347 <source>Speed</source> 347 <source>Speed</source>
348 <target>Snelheid</target> 348 <target>Snelheid</target>
349 </trans-unit> 349 </trans-unit>
350 <trans-unit id="Subtitles/CC">
351 <source>Subtitles/CC</source>
352 <target>Ondertiteling/CC</target>
353 </trans-unit>
350 <trans-unit id="peers"> 354 <trans-unit id="peers">
351 <source>peers</source> 355 <source>peers</source>
352 <target>peers</target> 356 <target>peers</target>
diff --git a/client/src/locale/target/player_oc.json b/client/src/locale/target/player_oc.json
index 972041dc1..e64b68b00 100644
--- a/client/src/locale/target/player_oc.json
+++ b/client/src/locale/target/player_oc.json
@@ -1 +1 @@
{"Audio Player":"Lector àudio","Video Player":"Lector vidèo","Play":"Lectura","Pause":"Pausa","Replay":"Tornar legir","Current Time":"Durada passada","Duration":"Durada","Remaining Time":"Temps restant","Stream Type":"Tipe de difusion","LIVE":"DIRÈCTE","Loaded":"Cargat","Progress":"Progression","Progress Bar":"Barra de progession","progress bar timing: currentTime={1} duration={2}":"{1} sus {2}","Fullscreen":"Ecran complèt","Non-Fullscreen":"Pas en ecran complèt","Mute":"Copar lo son","Unmute":"Restablir lo son","Playback Rate":"Velocitat de lectura","Subtitles":"Sostítols","subtitles off":"Sostítols desactivats","Captions":"Legendas","captions off":"Legendas desactivadas","Chapters":"Capítols","Descriptions":"Descripcions","descriptions off":"descripcions desactivadas","Audio Track":"Pista àudio","Volume Level":"Nivèl del volum","You aborted the media playback":"Avètz copat la lectura del mèdia","A network error caused the media download to fail part-way.":"Una error de ret a provocat un fracàs del telecargament.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Lo mèdia a pas pogut èsser cargat, siá perque lo servidor o lo ret a fracassat siá perque lo format es pas suportat.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"La lectura del mèdia es copada a causa d’un problèma de corrupcion o perque lo mèdia utiliza de foncionalitats pas suportadas pel navigador.","No compatible source was found for this media.":"Cap de font compatiblas pas trobada per aqueste mèdia.","The media is encrypted and we do not have the keys to decrypt it.":"Lo mèdia es chifrat e avèm pas las claus per lo deschifrar.","Play Video":"Legir la vidèo","Close":"Tampar","Close Modal Dialog":"Tampar la fenèstra","Modal Window":"Fenèstra","This is a modal window":"Aquò es una fenèstra","This modal can be closed by pressing the Escape key or activating the close button.":"Aquesta fenèstra pòt èsser tampada en quichar Escapar sul clavièr o en activar lo boton de tampadura.",", opens captions settings dialog":", dobrís la fenèstra de paramètres de legenda",", opens subtitles settings dialog":", dorbís la fenèstra de paramètres de sostítols",", opens descriptions settings dialog":", dorbís la fenèstra de paramètres de descripcions",", selected":", seleccionat","captions settings":"paramètres de legenda","subtitles settings":"paramètres de sostítols","descriptions settings":"paramètres de descripcions","Text":"Tèxte","White":"Blanc","Black":"Nègre","Red":"Roge","Green":"Verd","Blue":"Blau","Yellow":"Jaune","Magenta":"Magenta","Cyan":"Cian","Background":"Rèireplan","Window":"Fenèstra","Transparent":"Transparent","Semi-Transparent":"Semitransparent","Opaque":"Opac","Font Size":"Talha de la polissa","Text Edge Style":"Tèxte coma Edge","None":"Cap","Raised":"Montat","Depressed":"Enfonsat","Uniform":"Unifòrme","Dropshadow":"Ombrat","Font Family":"Familha de polissa","Proportional Sans-Serif":"Sans-Serif proporcional","Monospace Sans-Serif":"Monospace Sans-Serif","Proportional Serif":"Serif proporcional","Monospace Serif":"Monospace Serif","Casual":"Abituala","Script":"Script","Small Caps":"Pichonas majusculas","Reset":"Reïnicializar","restore all settings to the default values":"o restablir tot a las valors per defaut","Done":"Acabat","Caption Settings Dialog":"Fenèstra de paramètres de legenda","Beginning of dialog window. Escape will cancel and close the window.":"Debuta de la fenèstra. Escapar anullarà e tamparà la fenèstra.","End of dialog window.":"Fin de la fenèstra","{1} is loading.":"{1} es a cargar.","Quality":"Qualitat","Auto":"Auto","Speed":"Velocitat","Subtitles/CC":"Sostítols/CC","peers":"pars","Go to the video page":"Anar a la pagina de la vidèo","Settings":"Paramètres","Uses P2P, others may know you are watching this video.":"Utiliza lo P2P, se pòt que d’autres sián a agachar aquesta vidèo.","Copy the video URL":"Copiar l’URL de la vidèo","Copy the video URL at the current time":"Copiar l’URL de la vidèo a aquesta posicion","Copy embed code":"Copiar lo còdi d’integracion"} \ No newline at end of file {"Audio Player":"Lector àudio","Video Player":"Lector vidèo","Play":"Lectura","Pause":"Pausa","Replay":"Tornar legir","Current Time":"Durada passada","Duration":"Durada","Remaining Time":"Temps restant","Stream Type":"Tipe de difusion","LIVE":"DIRÈCTE","Loaded":"Cargat","Progress":"Progression","Progress Bar":"Barra de progession","progress bar timing: currentTime={1} duration={2}":"{1} sus {2}","Fullscreen":"Ecran complèt","Non-Fullscreen":"Pas en ecran complèt","Mute":"Copar lo son","Unmute":"Restablir lo son","Playback Rate":"Velocitat de lectura","Subtitles":"Sostítols","subtitles off":"Sostítols desactivats","Captions":"Legendas","captions off":"Legendas desactivadas","Chapters":"Capítols","Descriptions":"Descripcions","descriptions off":"descripcions desactivadas","Audio Track":"Pista àudio","Volume Level":"Nivèl del volum","You aborted the media playback":"Avètz copat la lectura del mèdia","A network error caused the media download to fail part-way.":"Una error de ret a provocat un fracàs del telecargament.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Lo mèdia a pas pogut èsser cargat, siá perque lo servidor o lo ret a fracassat siá perque lo format es pas compatible.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"La lectura del mèdia es copada a causa d’un problèma de corrupcion o perque lo mèdia utiliza de foncionalitats pas suportadas pel navigador.","No compatible source was found for this media.":"Cap de font compatiblas pas trobada per aqueste mèdia.","The media is encrypted and we do not have the keys to decrypt it.":"Lo mèdia es chifrat e avèm pas las claus per lo deschifrar.","Play Video":"Legir la vidèo","Close":"Tampar","Close Modal Dialog":"Tampar la fenèstra","Modal Window":"Fenèstra","This is a modal window":"Aquò es una fenèstra","This modal can be closed by pressing the Escape key or activating the close button.":"Aquesta fenèstra pòt èsser tampada en quichar Escapar sul clavièr o en activar lo boton de tampadura.",", opens captions settings dialog":", dobrís la fenèstra de paramètres de legenda",", opens subtitles settings dialog":", dobrís la fenèstra de paramètres de sostítol",", opens descriptions settings dialog":", dobrís la fenèstra de paramètres de descripcion",", selected":", seleccionat","captions settings":"paramètres de legenda","subtitles settings":"paramètres de sostítol","descriptions settings":"paramètres de descripcion","Text":"Tèxte","White":"Blanc","Black":"Negre","Red":"Roge","Green":"Verd","Blue":"Blau","Yellow":"Jaune","Magenta":"Magenta","Cyan":"Cian","Background":"Rèireplan","Window":"Fenèstra","Transparent":"Transparent","Semi-Transparent":"Semitransparent","Opaque":"Opac","Font Size":"Talha de la polissa","Text Edge Style":"Estil dels contorn del tèxte","None":"Cap","Raised":"Naut","Depressed":"Enfonsat","Uniform":"Unifòrme","Dropshadow":"Ombrat","Font Family":"Familha de polissa","Proportional Sans-Serif":"Sans-Serif proporcional","Monospace Sans-Serif":"Monospace Sans-Serif","Proportional Serif":"Serif proporcional","Monospace Serif":"Monospace Serif","Casual":"Manuscrita","Script":"Script","Small Caps":"Pichonas majusculas","Reset":"Reïnicializar","restore all settings to the default values":"o restablir tot a las valors per defaut","Done":"Acabat","Caption Settings Dialog":"Fenèstra de paramètres de legenda","Beginning of dialog window. Escape will cancel and close the window.":"Debuta de la fenèstra. Escapar anullarà e tamparà la fenèstra.","End of dialog window.":"Fin de la fenèstra.","{1} is loading.":"{1} es a cargar.","Quality":"Qualitat","Auto":"Auto","Speed":"Velocitat","Subtitles/CC":"Sostítols/CC","peers":"pars","Go to the video page":"Anar a la pagina de la vidèo","Settings":"Paramètres","Uses P2P, others may know you are watching this video.":"Utiliza lo P2P, se pòt que d’autres sián a agachar aquesta vidèo.","Copy the video URL":"Copiar l’URL de la vidèo","Copy the video URL at the current time":"Copiar l’URL de la vidèo a aquesta posicion","Copy embed code":"Copiar lo còdi d’integracion"} \ No newline at end of file
diff --git a/client/src/locale/target/player_pl_PL.json b/client/src/locale/target/player_pl_PL.json
new file mode 100644
index 000000000..2178a137d
--- /dev/null
+++ b/client/src/locale/target/player_pl_PL.json
@@ -0,0 +1 @@
{"Audio Player":"Odtwarzacz audio","Video Player":"Odtwarzacz wideo","Play":"Odtwórz","Pause":"Wstrzymaj","Replay":"Powtórz","Current Time":"Obecny czas","Duration":"Czas trwania","Remaining Time":"Pozostały czas","Stream Type":"Rodzaj strumienia","LIVE":"NA ŻYWO","Loaded":"Załadowano","Progress":"Postęp","Progress Bar":"Pasek postępu","progress bar timing: currentTime={1} duration={2}":"{1} z {2}","Fullscreen":"Pełny ekran","Non-Fullscreen":"Bez pełnego ekranu","Mute":"Wycisz","Unmute":"Cofnij wyciszenie","Playback Rate":"Szybkość odtwarzania","Subtitles":"Napisy","subtitles off":"napisy są wyłączone","Captions":"CC","captions off":"CC są wyłączone","Chapters":"Rozdziały","Descriptions":"Opisy","descriptions off":"opisy są wyłączone","Audio Track":"Ścieżka dźwiękowa","Volume Level":"Poziom głośności","You aborted the media playback":"Przerwałeś odtwarzanie zawartości mulimedialnej","A network error caused the media download to fail part-way.":"Błąd sieci spowodował, że zawartość multimedialna została pobrana tylko częściowo.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Nie udało się załadować zawartości multimedialnej z powodu błędy sieci lub serwera lub ponieważ format nie jest obsługiwany.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Odtwarzanie zostało przerwane ze względu na uszkodzenie pliku lub przez brak wsparcia funkcji multimediów przez Twoją przeglądarkę.","No compatible source was found for this media.":"Nie znaleziono kompatybilnego źródła dla tego media.","The media is encrypted and we do not have the keys to decrypt it.":"Zawartość multimedialna jest zaszyfrowana, a klucz do jej odszyfrowania jest nieznany.","Play Video":"Odtwórz film","Close":"Zamknij","Close Modal Dialog":"Zamknij okno modalne","Modal Window":"Okno modalne","This is a modal window":"To jest okno modalne","This modal can be closed by pressing the Escape key or activating the close button.":"To okno może zostać zamknięte klawiszem Escape lub przyciskiem zamykania.",", opens captions settings dialog":", otwiera okno ustawień CC",", opens subtitles settings dialog":", otwiera okno ustawień napisów",", opens descriptions settings dialog":", otwiera okno ustawień opisów",", selected":", zaznaczone","captions settings":"ustawienia CC","subtitles settings":"ustawienia napisów","descriptions settings":"ustawienia opisów","Text":"Tekst","White":"Biały","Black":"Czarny","Red":"Czerwony","Green":"Zielony","Blue":"Niebieski","Yellow":"Żółty","Magenta":"Magenta","Cyan":"Cyjanowy","Background":"Tło","Window":"Okno","Transparent":"Przezroczyste","Semi-Transparent":"Półprzezroczyste","Opaque":"Widoczne","Font Size":"Rozmiar czcionki","Text Edge Style":"Styl krawędzi tekstu","None":"Brak","Raised":"Wypukłe","Depressed":"Wgłębione","Uniform":"Jednolity","Dropshadow":"Cień","Font Family":"Rodzina czcionek","Proportional Sans-Serif":"Proporcjonalne bezszeryfowe","Monospace Sans-Serif":"Bezszeryfowe o stałej szerokości","Proportional Serif":"Proporcjonalne szeryfowe","Monospace Serif":"Szeryfowe o stałej szerokości","Casual":"Ozdobne","Script":"Pismo odręczne","Small Caps":"Kapitaliki","Reset":"Resetuj","restore all settings to the default values":"przywróć wszystkie ustawienia do wartości domyślnych","Done":"Gotowe","Caption Settings Dialog":"Okno ustawień napisów","Beginning of dialog window. Escape will cancel and close the window.":"Początek okna dialogowego. Przycisk Escape anuluje i zamknie okno.","End of dialog window.":"Koniec okna dialogowego.","{1} is loading.":"{1} ładuje się.","Quality":"Jakość","Auto":"Automatyczna","Speed":"Prędkość","Subtitles/CC":"Napisy/CC","peers":"peers","Go to the video page":"Przejdź na stronę filmu","Settings":"Ustawienia","Uses P2P, others may know you are watching this video.":"Korzysta z P2P, inni mogą dowiedzieć się, że oglądasz ten film.","Copy the video URL":"Skopiuj adres URL filmu","Copy the video URL at the current time":"Skopiuj adres URL filmu z obecnym czasem","Copy embed code":"Skopiuj kod do osadzenia"} \ No newline at end of file
diff --git a/client/src/locale/target/player_pl_PL.xml b/client/src/locale/target/player_pl_PL.xml
deleted file mode 100644
index 2affa5948..000000000
--- a/client/src/locale/target/player_pl_PL.xml
+++ /dev/null
@@ -1,383 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--XLIFF document generated by Zanata. Visit http://zanata.org for more infomation.-->
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="pl-PL">
5 <body>
6 <trans-unit id="Audio Player">
7 <source>Audio Player</source>
8 <target>Odtwarzacz audio</target>
9 </trans-unit>
10 <trans-unit id="Video Player">
11 <source>Video Player</source>
12 <target>Odtwarzacz wideo</target>
13 </trans-unit>
14 <trans-unit id="Play">
15 <source>Play</source>
16 <target>Odtwórz</target>
17 </trans-unit>
18 <trans-unit id="Pause">
19 <source>Pause</source>
20 <target>Wstrzymaj</target>
21 </trans-unit>
22 <trans-unit id="Replay">
23 <source>Replay</source>
24 <target>Powtórz</target>
25 </trans-unit>
26 <trans-unit id="Current Time">
27 <source>Current Time</source>
28 <target>Obecny czas</target>
29 </trans-unit>
30 <trans-unit id="Duration">
31 <source>Duration</source>
32 <target>Czas trwania</target>
33 </trans-unit>
34 <trans-unit id="Remaining Time">
35 <source>Remaining Time</source>
36 <target>Pozostały czas</target>
37 </trans-unit>
38 <trans-unit id="Stream Type">
39 <source>Stream Type</source>
40 <target>Rodzaj strumienia</target>
41 </trans-unit>
42 <trans-unit id="LIVE">
43 <source>LIVE</source>
44 <target>NA ŻYWO</target>
45 </trans-unit>
46 <trans-unit id="Loaded">
47 <source>Loaded</source>
48 <target>Załadowano</target>
49 </trans-unit>
50 <trans-unit id="Progress">
51 <source>Progress</source>
52 <target>Postęp</target>
53 </trans-unit>
54 <trans-unit id="Progress Bar">
55 <source>Progress Bar</source>
56 <target>Pasek postępu</target>
57 </trans-unit>
58 <trans-unit id="progress bar timing: currentTime={1} duration={2}">
59 <source>{1} of {2}</source>
60 <target>{1} z {2}</target>
61 </trans-unit>
62 <trans-unit id="Fullscreen">
63 <source>Fullscreen</source>
64 <target>Pełny ekran</target>
65 </trans-unit>
66 <trans-unit id="Non-Fullscreen">
67 <source>Non-Fullscreen</source>
68 <target>Bez pełnego ekranu</target>
69 </trans-unit>
70 <trans-unit id="Mute">
71 <source>Mute</source>
72 <target>Wycisz</target>
73 </trans-unit>
74 <trans-unit id="Unmute">
75 <source>Unmute</source>
76 <target>Cofnij wyciszenie</target>
77 </trans-unit>
78 <trans-unit id="Playback Rate">
79 <source>Playback Rate</source>
80 <target>Szybkość odtwarzania</target>
81 </trans-unit>
82 <trans-unit id="Subtitles">
83 <source>Subtitles</source>
84 <target>Napisy</target>
85 </trans-unit>
86 <trans-unit id="subtitles off">
87 <source>subtitles off</source>
88 <target>napisy są wyłączone</target>
89 </trans-unit>
90 <trans-unit id="Captions">
91 <source>Captions</source>
92 <target>CC</target>
93 </trans-unit>
94 <trans-unit id="captions off">
95 <source>captions off</source>
96 <target>CC są wyłączone</target>
97 </trans-unit>
98 <trans-unit id="Chapters">
99 <source>Chapters</source>
100 <target>Rozdziały</target>
101 </trans-unit>
102 <trans-unit id="Descriptions">
103 <source>Descriptions</source>
104 <target>Opisy</target>
105 </trans-unit>
106 <trans-unit id="descriptions off">
107 <source>descriptions off</source>
108 <target>opisy są wyłączone</target>
109 </trans-unit>
110 <trans-unit id="Audio Track">
111 <source>Audio Track</source>
112 <target>Ścieżka dźwiękowa</target>
113 </trans-unit>
114 <trans-unit id="Volume Level">
115 <source>Volume Level</source>
116 <target>Poziom głośności</target>
117 </trans-unit>
118 <trans-unit id="You aborted the media playback">
119 <source>You aborted the media playback</source>
120 <target>Przerwałeś odtwarzanie zawartości mulimedialnej</target>
121 </trans-unit>
122 <trans-unit id="A network error caused the media download to fail part-way.">
123 <source>A network error caused the media download to fail part-way.</source>
124 <target>Błąd sieci spowodował, że zawartość multimedialna została pobrana tylko częściowo.</target>
125 </trans-unit>
126 <trans-unit id="The media could not be loaded, either because the server or network failed or because the format is not supported.">
127 <source>The media could not be loaded, either because the server or network failed or because the format is not supported.</source>
128 <target>Nie udało się załadować zawartości multimedialnej z powodu błędy sieci lub serwera lub ponieważ format nie jest obsługiwany.</target>
129 </trans-unit>
130 <trans-unit id="The media playback was aborted due to a corruption problem or because the media used features your browser did not support.">
131 <source>The media playback was aborted due to a corruption problem or because the media used features your browser did not support.</source>
132 <target>Odtwarzanie zostało przerwane ze względu na uszkodzenie pliku lub przez brak wsparcia funkcji multimediów przez Twoją przeglądarkę.</target>
133 </trans-unit>
134 <trans-unit id="No compatible source was found for this media.">
135 <source>No compatible source was found for this media.</source>
136 <target>Nie znaleziono kompatybilnego źródła dla tego media.</target>
137 </trans-unit>
138 <trans-unit id="The media is encrypted and we do not have the keys to decrypt it.">
139 <source>The media is encrypted and we do not have the keys to decrypt it.</source>
140 <target>Zawartość multimedialna jest zaszyfrowana, a klucz do jej odszyfrowania jest nieznany.</target>
141 </trans-unit>
142 <trans-unit id="Play Video">
143 <source>Play Video</source>
144 <target>Odtwórz film</target>
145 </trans-unit>
146 <trans-unit id="Close">
147 <source>Close</source>
148 <target>Zamknij</target>
149 </trans-unit>
150 <trans-unit id="Close Modal Dialog">
151 <source>Close Modal Dialog</source>
152 <target>Zamknij okno modalne</target>
153 </trans-unit>
154 <trans-unit id="Modal Window">
155 <source>Modal Window</source>
156 <target>Okno modalne</target>
157 </trans-unit>
158 <trans-unit id="This is a modal window">
159 <source>This is a modal window</source>
160 <target>To jest okno modalne</target>
161 </trans-unit>
162 <trans-unit id="This modal can be closed by pressing the Escape key or activating the close button.">
163 <source>This modal can be closed by pressing the Escape key or activating the close button.</source>
164 <target>To okno może zostać zamknięte klawiszem Escape lub przyciskiem zamykania.</target>
165 </trans-unit>
166 <trans-unit id=", opens captions settings dialog">
167 <source>, opens captions settings dialog</source>
168 <target>, otwiera okno ustawień CC</target>
169 </trans-unit>
170 <trans-unit id=", opens subtitles settings dialog">
171 <source>, opens subtitles settings dialog</source>
172 <target>, otwiera okno ustawień napisów</target>
173 </trans-unit>
174 <trans-unit id=", opens descriptions settings dialog">
175 <source>, opens descriptions settings dialog</source>
176 <target>, otwiera okno ustawień opisów</target>
177 </trans-unit>
178 <trans-unit id=", selected">
179 <source>, selected</source>
180 <target>, zaznaczone</target>
181 </trans-unit>
182 <trans-unit id="captions settings">
183 <source>captions settings</source>
184 <target>ustawienia CC</target>
185 </trans-unit>
186 <trans-unit id="subtitles settings">
187 <source>subititles settings</source>
188 <target>ustawienia napisów</target>
189 </trans-unit>
190 <trans-unit id="descriptions settings">
191 <source>descriptions settings</source>
192 <target>ustawienia opisów</target>
193 </trans-unit>
194 <trans-unit id="Text">
195 <source>Text</source>
196 <target>Tekst</target>
197 </trans-unit>
198 <trans-unit id="White">
199 <source>White</source>
200 <target>Biały</target>
201 </trans-unit>
202 <trans-unit id="Black">
203 <source>Black</source>
204 <target>Czarny</target>
205 </trans-unit>
206 <trans-unit id="Red">
207 <source>Red</source>
208 <target>Czerwony</target>
209 </trans-unit>
210 <trans-unit id="Green">
211 <source>Green</source>
212 <target>Zielony</target>
213 </trans-unit>
214 <trans-unit id="Blue">
215 <source>Blue</source>
216 <target>Niebieski</target>
217 </trans-unit>
218 <trans-unit id="Yellow">
219 <source>Yellow</source>
220 <target>Żółty</target>
221 </trans-unit>
222 <trans-unit id="Magenta">
223 <source>Magenta</source>
224 <target>Magenta</target>
225 </trans-unit>
226 <trans-unit id="Cyan">
227 <source>Cyan</source>
228 <target>Cyjanowy</target>
229 </trans-unit>
230 <trans-unit id="Background">
231 <source>Background</source>
232 <target>TÅ‚o</target>
233 </trans-unit>
234 <trans-unit id="Window">
235 <source>Window</source>
236 <target>Okno</target>
237 </trans-unit>
238 <trans-unit id="Transparent">
239 <source>Transparent</source>
240 <target>Przezroczyste</target>
241 </trans-unit>
242 <trans-unit id="Semi-Transparent">
243 <source>Semi-Transparent</source>
244 <target>Półprzezroczyste</target>
245 </trans-unit>
246 <trans-unit id="Opaque">
247 <source>Opaque</source>
248 <target>Widoczne</target>
249 </trans-unit>
250 <trans-unit id="Font Size">
251 <source>Font Size</source>
252 <target>Rozmiar czcionki</target>
253 </trans-unit>
254 <trans-unit id="Text Edge Style">
255 <source>Text Edge Style</source>
256 <target>Styl krawędzi tekstu</target>
257 </trans-unit>
258 <trans-unit id="None">
259 <source>None</source>
260 <target>Brak</target>
261 </trans-unit>
262 <trans-unit id="Raised">
263 <source>Raised</source>
264 <target>Wypukłe</target>
265 </trans-unit>
266 <trans-unit id="Depressed">
267 <source>Depressed</source>
268 <target>Wgłębione</target>
269 </trans-unit>
270 <trans-unit id="Uniform">
271 <source>Uniform</source>
272 <target>Jednolity</target>
273 </trans-unit>
274 <trans-unit id="Dropshadow">
275 <source>Dropshadow</source>
276 <target>Cień</target>
277 </trans-unit>
278 <trans-unit id="Font Family">
279 <source>Font Family</source>
280 <target>Rodzina czcionek</target>
281 </trans-unit>
282 <trans-unit id="Proportional Sans-Serif">
283 <source>Proportional Sans-Serif</source>
284 <target>Proporcjonalne bezszeryfowe</target>
285 </trans-unit>
286 <trans-unit id="Monospace Sans-Serif">
287 <source>Monospace Sans-Serif</source>
288 <target>Bezszeryfowe o stałej szerokości</target>
289 </trans-unit>
290 <trans-unit id="Proportional Serif">
291 <source>Proportional Serif</source>
292 <target>Proporcjonalne szeryfowe</target>
293 </trans-unit>
294 <trans-unit id="Monospace Serif">
295 <source>Monospace Serif</source>
296 <target>Szeryfowe o stałej szerokości</target>
297 </trans-unit>
298 <trans-unit id="Casual">
299 <source>Casual</source>
300 <target>Ozdobne</target>
301 </trans-unit>
302 <trans-unit id="Script">
303 <source>Script</source>
304 <target>Pismo odręczne</target>
305 </trans-unit>
306 <trans-unit id="Small Caps">
307 <source>Small Caps</source>
308 <target>Kapitaliki</target>
309 </trans-unit>
310 <trans-unit id="Reset">
311 <source>Reset</source>
312 <target>Resetuj</target>
313 </trans-unit>
314 <trans-unit id="restore all settings to the default values">
315 <source>restore all settings to the default values</source>
316 <target>przywróć wszystkie ustawienia do wartości domyślnych</target>
317 </trans-unit>
318 <trans-unit id="Done">
319 <source>Done</source>
320 <target>Gotowe</target>
321 </trans-unit>
322 <trans-unit id="Caption Settings Dialog">
323 <source>Caption Settings Dialog</source>
324 <target>Okno ustawień napisów</target>
325 </trans-unit>
326 <trans-unit id="Beginning of dialog window. Escape will cancel and close the window.">
327 <source>Beginning of dialog window. Escape will cancel and close the window.</source>
328 <target>PoczÄ…tek okna dialogowego. Przycisk Escape anuluje i zamknie okno.</target>
329 </trans-unit>
330 <trans-unit id="End of dialog window.">
331 <source>End of dialog window.</source>
332 <target>Koniec okna dialogowego.</target>
333 </trans-unit>
334 <trans-unit id="{1} is loading.">
335 <source>{1} is loading.</source>
336 <target>{1} Å‚aduje siÄ™.</target>
337 </trans-unit>
338 <trans-unit id="Quality">
339 <source>Quality</source>
340 <target>Jakość</target>
341 </trans-unit>
342 <trans-unit id="Auto">
343 <source>Auto</source>
344 <target>Automatyczna</target>
345 </trans-unit>
346 <trans-unit id="Speed">
347 <source>Speed</source>
348 <target>Prędkość</target>
349 </trans-unit>
350 <trans-unit id="Subtitles/CC">
351 <source>Subtitles/CC</source>
352 <target>Napisy/CC</target>
353 </trans-unit>
354 <trans-unit id="peers">
355 <source>peers</source>
356 <target>peers</target>
357 </trans-unit>
358 <trans-unit id="Go to the video page">
359 <source>Go to the video page</source>
360 <target>Przejdź na stronę filmu</target>
361 </trans-unit>
362 <trans-unit id="Settings">
363 <source>Settings</source>
364 <target>Ustawienia</target>
365 </trans-unit>
366 <trans-unit id="Uses P2P, others may know you are watching this video.">
367 <source>Uses P2P, others may know you are watching this video.</source>
368 <target>Korzysta z P2P, inni mogą dowiedzieć się, że oglądasz ten film.</target>
369 </trans-unit>
370 <trans-unit id="Copy the video URL">
371 <source>Copy the video URL</source>
372 <target>Skopiuj adres URL filmu</target>
373 </trans-unit>
374 <trans-unit id="Copy the video URL at the current time">
375 <source>Copy the video URL at the current time</source>
376 <target>Skopiuj adres URL filmu z obecnym czasem</target>
377 </trans-unit>
378 <trans-unit id="Copy embed code">
379 <source>Copy embed code</source>
380 <target>Skopiuj kod do osadzenia</target>
381 </trans-unit>
382 </body>
383 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/player_ru_RU.json b/client/src/locale/target/player_ru_RU.json
new file mode 100644
index 000000000..e2d8d4980
--- /dev/null
+++ b/client/src/locale/target/player_ru_RU.json
@@ -0,0 +1 @@
{"Audio Player":"Ðудиоплеер","Video Player":"Видеоплеер","Play":"ВоÑпроизвеÑти","Pause":"Пауза","Replay":"ВоÑпроизвеÑти Ñнова","Current Time":"Текущий момент","Duration":"ПродолжительноÑÑ‚ÑŒ","Remaining Time":"ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ","Stream Type":"Тип потока","LIVE":"ПрÑмой Ñфир","Loaded":"Загружено","Progress":"Ход выполнениÑ","Progress Bar":"Индикатор выполнениÑ","progress bar timing: currentTime={1} duration={2}":"{1} из {2}","Fullscreen":"Полный Ñкран","Non-Fullscreen":"Окно","Mute":"Без звука","Unmute":"Со звуком","Playback Rate":" СкороÑÑ‚ÑŒ воÑпроизведениÑ","Subtitles":"Субтитры","subtitles off":"Без Ñубтитров","Captions":"Сопроводительные надпиÑи","captions off":"Без Ñопроводительных надпиÑей","Chapters":"Главы","Descriptions":"ОпиÑание","descriptions off":"без опиÑаний","Audio Track":"Ðудиодорожка","Volume Level":"ГромкоÑÑ‚ÑŒ","You aborted the media playback":"Ð’Ñ‹ отменили воÑпроизведение медиафайла","A network error caused the media download to fail part-way.":"Ошибка Ñети Ñтала причиной неудачного воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð°","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Медиафайл не может быть воÑпроизведен: ошибки Ñервера или Ñети; или не поддерживаетÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ медиафайла","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"ВоÑпроизведение отменено: файл иÑпорчен или иÑпользует инÑтрументы, которые ваш навигатор не поддерживает ","No compatible source was found for this media.":"Ðе найдено ÑовмеÑтимого иÑточника Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ„Ð°Ð¹Ð»Ð°","The media is encrypted and we do not have the keys to decrypt it.":"Этот медиафайл зашифрован и у Ð½Ð°Ñ Ð½ÐµÑ‚ ключей Ð´Ð»Ñ ÐµÐ³Ð¾ раÑшифровки ","Play Video":"ВоÑпроизвеÑти видео","Close":"Закрыть","Close Modal Dialog":"Закрыть модальное диалоговое окно","Modal Window":"Модальное окно","This is a modal window":"Это модальное окно","This modal can be closed by pressing the Escape key or activating the close button.":"Это модальное окно можно закрыть нажав на кнопку Escape или на кнопку закрыть",", opens captions settings dialog":", открывает окно наÑтроек Ñопроводительных надпиÑей",", opens subtitles settings dialog":", открывает окно наÑтроек Ñубтитров",", opens descriptions settings dialog":", открывает окно наÑтроек опиÑаний",", selected":", выделено ","captions settings":"ÐаÑтройки Ñопроводительных надпиÑей","subtitles settings":"ÐаÑтройки Ñубтитров","descriptions settings":"ÐаÑтройки опиÑаний ","Text":"ТекÑÑ‚","White":"Белый","Black":"Черный","Red":"КраÑный","Green":"Зеленый","Blue":"Синий","Yellow":"Желтый","Magenta":"Пурпурный ","Cyan":"Голубой","Background":"Фон","Window":"Окно","Transparent":"Прозрачный","Semi-Transparent":"Полупрозрачный ","Opaque":"Ðепрозрачный","Font Size":"Размер шрифта ","None":"ОтÑутÑтвует","Uniform":"Однообразный","Dropshadow":"ÐŸÐ°Ð´Ð°ÑŽÑ‰Ð°Ñ Ñ‚ÐµÐ½ÑŒ","Font Family":"Шрифт","Proportional Sans-Serif":"Пропорциональный без заÑечек","Monospace Sans-Serif":"ФикÑированной ширины без заÑечек","Proportional Serif":"Пропорциональный Ñ Ð·Ð°Ñечками","Monospace Serif":"ФикÑированной ширины Ñ Ð·Ð°Ñечками","Casual":"Свободный","Script":"рукопиÑный шрифт","Small Caps":" Уменьшенные заглавные буквы","Reset":"ВоÑÑтановить ","restore all settings to the default values":"ВоÑÑтановить наÑтройки по умолчанию ","Done":"Выполнено","Caption Settings Dialog":"Окно наÑтроек Ñопроводительных надпиÑей","Beginning of dialog window. Escape will cancel and close the window.":"Ðачало диалогового окна. Клавиша Escape отменит дейÑтвие и закроет окно","End of dialog window.":"Конец диалогового окна","{1} is loading.":"{1} в процеÑÑе загрузки","Quality":"КачеÑтво","Auto":"Ðвто","Speed":"СкороÑÑ‚ÑŒ","Subtitles/CC":"Субтитры","peers":"Партнер","Go to the video page":"Перейти на Ñтраницу Ñ Ð²Ð¸Ð´ÐµÐ¾","Settings":"ÐаÑтройки","Uses P2P, others may know you are watching this video.":"ИÑпользует P2P, другие могут знать, что вы проÑматриваете Ñто видео.","Copy the video URL":"Скопировать URL видео","Copy the video URL at the current time":"Скопировать URL видео на текущем моменте ","Copy embed code":"Скопировать вÑтроенный код"} \ No newline at end of file
diff --git a/client/src/locale/target/player_sv_SE.json b/client/src/locale/target/player_sv_SE.json
index 5bf4cb63a..b7582e244 100644
--- a/client/src/locale/target/player_sv_SE.json
+++ b/client/src/locale/target/player_sv_SE.json
@@ -1 +1 @@
{"Audio Player":"Ljudspelare","Video Player":"Videospelare","Play":"Spela upp","Pause":"Pausa","Replay":"Spela igen","Current Time":"Nuvarande tid","Duration":"Längd","Remaining Time":"Kvarvarande tid","Stream Type":"Strömtyp","LIVE":"DIREKT","Loaded":"Laddad","Progress":"Förlopp","Progress Bar":"Förloppsindikator","progress bar timing: currentTime={1} duration={2}":"{1} av {2}","Fullscreen":"Fullskärm","Non-Fullscreen":"Inte fullskärm","Mute":"Stäng av ljudet","Unmute":"Sätt på ljudet","Playback Rate":"Uppspelningshastighet","Subtitles":"Undertexter","subtitles off":"undertexter av","Captions":"Textning","captions off":"textning av","Chapters":"Kapitel","Descriptions":"Beskrivningar","descriptions off":"beskrivningar av","Audio Track":"Ljudspår","Volume Level":"Volymnivå","You aborted the media playback":"Du avbröt uppspelningen","A network error caused the media download to fail part-way.":"Ett nätverksfel gjorde att nedladdningen av mediafilen misslyckades","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Mediet kunde inte laddas, antingen på grund av ett server- eller nätverksfel eller eftersom formatet inte stöds.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Uppspelningen avbröts på grund av ett korruptionsfel eller eftersom mediet använde funktioner din webbläsare inte stöder.","No compatible source was found for this media.":"Ingen kompatibel källa hittades för detta media.","The media is encrypted and we do not have the keys to decrypt it.":"Mediet är krypterat och vi har inte nycklarna för att dekryptera.","Play Video":"Spela upp video","Close":"Stäng","Close Modal Dialog":"Stäng dialogruta","Modal Window":"Dialogrutan","This is a modal window":"Detta är en dialogruta","This modal can be closed by pressing the Escape key or activating the close button.":"Dialogrutan kan stängas genom att trycka Escape eller klicka på stäng-knappen.",", opens captions settings dialog":", öppnar dialogrutan för inställning av textning",", opens subtitles settings dialog":", öppnar dialogrutan för inställning av undertexter",", opens descriptions settings dialog":", öppnar dialogrutan för inställning av beskrivningar",", selected":", vald","captions settings":"textningsinställningar","subtitles settings":"inställningar för undertexter","descriptions settings":"inställningar för beskrivning","Text":"Text","White":"Vit","Black":"Svart","Red":"Röd","Green":"Grön","Blue":"Blå","Yellow":"Gul","Magenta":"Magenta","Cyan":"Cyan","Background":"Bakgrund","Window":"Fönster","Transparent":"Genomskinlig","Semi-Transparent":"Halvgenomskinlig","Opaque":"Ogenomskinlig","Font Size":"Textstorlek","Text Edge Style":"Textkanter","None":"Ingen","Raised":"Upphöjd","Depressed":"Nedsänkt","Uniform":"Enhetlig","Dropshadow":"Skuggning","Font Family":"Typsnitt","Proportional Sans-Serif":"Proportionerlig sans-serif","Monospace Sans-Serif":"Monospace sans-serif","Proportional Serif":"Proportionerlig serif","Monospace Serif":"Monospace serif","Casual":"Ledig stil","Script":"Skript","Small Caps":"Små kapitäler","Reset":"Återställ","restore all settings to the default values":"återställ alla inställningar till sina standardvärden","Done":"Klar","Caption Settings Dialog":"Dialogruta för textningsinställningar","Beginning of dialog window. Escape will cancel and close the window.":"Början av dialogruta. Tryck Escape för att avbryta och stänga fönstret.","End of dialog window.":"Slut på dialogruta.","{1} is loading.":"{1} laddar.","Quality":"Kvalitet","Auto":"Auto","Speed":"Hastighet","Subtitles/CC":"Undertext","peers":"peers","Go to the video page":"Gå till videosidan","Settings":"Inställningar","Uses P2P, others may know you are watching this video.":"Använder P2P, andra kan veta att du tittar på den här videon.","Copy the video URL":"Kopiera videons URL","Copy the video URL at the current time":"Kopiera videons URL vid den här tidpunkten","Copy embed code":"Kopiera inbäddningskod"} \ No newline at end of file {"Audio Player":"Ljudspelare","Video Player":"Videospelare","Play":"Spela","Pause":"Pausa","Replay":"Spela igen","Current Time":"Aktuell tid","Duration":"Total tid","Remaining Time":"Återstående tid","Stream Type":"Strömningstyp","LIVE":"DIREKT","Loaded":"Laddad","Progress":"Förlopp","Progress Bar":"Förloppsindikator","progress bar timing: currentTime={1} duration={2}":"{1} av {2}","Fullscreen":"Fullskärm","Non-Fullscreen":"Inte fullskärm","Mute":"Ljud av","Unmute":"Ljud på","Playback Rate":"Uppspelningshastighet","Subtitles":"Undertexter på","subtitles off":"Undertexter av","Captions":"Textning","captions off":"Textning av","Chapters":"Kapitel","Descriptions":"Beskrivningar på","descriptions off":"Beskrivningar av","Audio Track":"Ljudspår","Volume Level":"Volymnivå","You aborted the media playback":"Du avbröt uppspelningen.","A network error caused the media download to fail part-way.":"Ett nätverksfel gjorde att nedladdningen av videon misslyckades.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Uppspelningen avbröts på grund av att videon är skadad eller för att videon använder funktioner som din webbläsare inte stöder.","No compatible source was found for this media.":"Det gick inte att hitta någon kompatibel källa för videon.","The media is encrypted and we do not have the keys to decrypt it.":"Videon är krypterad och vi har inte dekrypteringsnycklarna.","Play Video":"Spela upp video","Close":"Stäng","Close Modal Dialog":"Stäng dialogruta","Modal Window":"Dialogrutan","This is a modal window":"Detta är en dialogruta","This modal can be closed by pressing the Escape key or activating the close button.":"Dialogrutan kan stängas genom att trycka Escape eller klicka på stäng-knappen.",", opens captions settings dialog":", öppnar dialogrutan för inställning av textning",", opens subtitles settings dialog":", öppnar dialogrutan för inställning av undertexter",", opens descriptions settings dialog":", öppnar dialogrutan för inställning av beskrivningar",", selected":", vald","captions settings":"textningsinställningar","subtitles settings":"inställningar för undertexter","descriptions settings":"inställningar för beskrivning","Text":"Text","White":"Vit","Black":"Svart","Red":"Röd","Green":"Grön","Blue":"Blå","Yellow":"Gul","Magenta":"Magenta","Cyan":"Cyan","Background":"Bakgrund","Window":"Fönster","Transparent":"Genomskinlig","Semi-Transparent":"Halvgenomskinlig","Opaque":"Ogenomskinlig","Font Size":"Textstorlek","Text Edge Style":"Textkanter","None":"Ingen","Raised":"Upphöjd","Depressed":"Nedsänkt","Uniform":"Enhetlig","Dropshadow":"Skuggning","Font Family":"Typsnitt","Proportional Sans-Serif":"Proportionerlig sans-serif","Monospace Sans-Serif":"Monospace sans-serif","Proportional Serif":"Proportionerlig serif","Monospace Serif":"Monospace serif","Casual":"Ledig stil","Script":"Skript","Small Caps":"Små kapitäler","Reset":"Återställ","restore all settings to the default values":"återställ alla inställningar till sina standardvärden","Done":"Klar","Caption Settings Dialog":"Dialogruta för textningsinställningar","Beginning of dialog window. Escape will cancel and close the window.":"Början av dialogruta. Tryck Escape för att avbryta och stänga fönstret.","End of dialog window.":"Slut på dialogruta.","{1} is loading.":"{1} laddar.","Quality":"Kvalitet","Auto":"Auto","Speed":"Hastighet","Subtitles/CC":"Undertext","peers":"peers","Go to the video page":"Gå till videosidan","Settings":"Inställningar","Uses P2P, others may know you are watching this video.":"Använder P2P, andra kan veta att du tittar på den här videon.","Copy the video URL":"Kopiera videons URL","Copy the video URL at the current time":"Kopiera videons URL vid den här tidpunkten","Copy embed code":"Kopiera inbäddningskod"} \ No newline at end of file
diff --git a/client/src/locale/target/player_zh_Hans_CN.json b/client/src/locale/target/player_zh_Hans_CN.json
index b7ed005d8..4d7fcf047 100644
--- a/client/src/locale/target/player_zh_Hans_CN.json
+++ b/client/src/locale/target/player_zh_Hans_CN.json
@@ -1 +1 @@
{"Audio Player":"音ä¹æ’­æ”¾å™¨","Video Player":"视频播放器","Play":"播放","Pause":"æš‚åœ","Replay":"é‡æ”¾","Current Time":"当å‰æ—¶é—´","Duration":"时长","Remaining Time":"剩余时间","Stream Type":"媒体æµç±»åž‹","LIVE":"ç›´æ’­","Loaded":"加载完毕","Progress":"进度","Progress Bar":"进度æ¡","progress bar timing: currentTime={1} duration={2}":"已加载 {1},总时长 {2}","Fullscreen":"å…¨å±","Non-Fullscreen":"退出全å±","Mute":"é™éŸ³","Unmute":"å–消é™éŸ³","Playback Rate":"播放速度","Subtitles":"字幕","subtitles off":"关闭字幕","Captions":"内嵌字幕","captions off":"关闭内嵌字幕","Chapters":"节目段è½","Descriptions":"æè¿°","descriptions off":"关闭æè¿°","Audio Track":"音轨","Volume Level":"音é‡","You aborted the media playback":"视频播放被终止","A network error caused the media download to fail part-way.":"网络错误导致视频下载中途失败。","The media could not be loaded, either because the server or network failed or because the format is not supported.":"视频因格å¼ä¸æ”¯æŒæˆ–者æœåŠ¡å™¨æˆ–网络的问题无法加载。","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"由于视频文件æŸå或是该视频使用了你的æµè§ˆå™¨ä¸æ”¯æŒçš„功能,播放终止。","No compatible source was found for this media.":"无法找到此视频兼容的æºã€‚","The media is encrypted and we do not have the keys to decrypt it.":"视频已加密,无法解密。","Play Video":"播放视频","Close":"关闭","Close Modal Dialog":"关闭弹窗","Modal Window":"弹窗","This is a modal window":"这是一个弹窗","This modal can be closed by pressing the Escape key or activating the close button.":"å¯ä»¥æŒ‰ ESC 按键或å¯ç”¨å…³é—­æŒ‰é’®æ¥å…³é—­æ­¤å¼¹çª—。",", opens captions settings dialog":",开å¯æ ‡é¢˜è®¾ç½®å¼¹çª—",", opens subtitles settings dialog":",开å¯å­—幕设置弹窗",", opens descriptions settings dialog":",开å¯æ述设置弹窗",", selected":",选择","captions settings":"内嵌字幕设置","subtitles settings":"字幕设置","descriptions settings":"æ述设置","Text":"文字","White":"白","Black":"黑","Red":"红","Green":"绿","Blue":"è“","Yellow":"黄","Magenta":"紫红","Cyan":"é’","Background":"背景","Window":"视窗","Transparent":"é€æ˜Ž","Semi-Transparent":"åŠé€æ˜Ž","Opaque":"ä¸é€æ˜Ž","Font Size":"字体尺寸","Text Edge Style":"字体边缘样å¼","None":"æ— ","Raised":"浮雕","Depressed":"压低","Uniform":"å‡åŒ€","Dropshadow":"下阴影","Font Family":"字体库","Proportional Sans-Serif":"比例无细体","Monospace Sans-Serif":"å•é—´éš”无细体","Proportional Serif":"比例细体","Monospace Serif":"å•é—´éš”细体","Casual":"舒适","Script":"手写体","Small Caps":"å°åž‹å¤§å†™å­—体","Reset":"é‡å¯","restore all settings to the default values":"æ¢å¤å…¨éƒ¨è®¾ç½®è‡³é¢„设值","Done":"完æˆ","Caption Settings Dialog":"字幕设置弹窗","Beginning of dialog window. Escape will cancel and close the window.":"开始对è¯å¼¹çª—。离开会å–消并关闭弹窗。","End of dialog window.":"结æŸå¯¹è¯å¼¹çª—","{1} is loading.":"正在加载 {1}。","Quality":"画质","Auto":"自动","Speed":"速度","Subtitles/CC":"字幕","peers":" ä½ç”¨æˆ·","Go to the video page":"进入视频页é¢","Settings":"设置","Uses P2P, others may know you are watching this video.":"使用 P2P 时,其他人将能够知é“您正在观看此视频。","Copy the video URL":"å¤åˆ¶è§†é¢‘网å€","Copy the video URL at the current time":"å¤åˆ¶å½“å‰æ—¶é—´çš„视频网å€","Copy embed code":"å¤åˆ¶åµŒå…¥ä»£ç "} \ No newline at end of file {"Audio Player":"音ä¹æ’­æ”¾å™¨","Video Player":"视频播放器","Play":"播放","Pause":"æš‚åœ","Replay":"é‡æ”¾","Current Time":"当å‰æ—¶é—´","Duration":"时长","Remaining Time":"剩余时间","Stream Type":"媒体æµç±»åž‹","LIVE":"ç›´æ’­","Loaded":"加载完毕","Progress":"进度","Progress Bar":"进度æ¡","progress bar timing: currentTime={1} duration={2}":"已加载 {1},总时长 {2}","Fullscreen":"å…¨å±","Non-Fullscreen":"退出全å±","Mute":"é™éŸ³","Unmute":"å–消é™éŸ³","Playback Rate":"播放速度","Subtitles":"字幕","subtitles off":"关闭字幕","Captions":"内嵌字幕","captions off":"关闭内嵌字幕","Chapters":"节目段è½","Descriptions":"æè¿°","descriptions off":"关闭æè¿°","Audio Track":"音轨","Volume Level":"音é‡","You aborted the media playback":"视频播放被终止","A network error caused the media download to fail part-way.":"网络错误导致视频下载中途失败。","The media could not be loaded, either because the server or network failed or because the format is not supported.":"视频因格å¼ä¸æ”¯æŒæˆ–者æœåŠ¡å™¨æˆ–网络的问题无法加载。","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"由于视频文件æŸå或是该视频使用了你的æµè§ˆå™¨ä¸æ”¯æŒçš„功能,播放终止。","No compatible source was found for this media.":"无法找到此视频兼容的æºã€‚","The media is encrypted and we do not have the keys to decrypt it.":"视频已加密,无法解密。","Play Video":"播放视频","Close":"关闭","Close Modal Dialog":"关闭弹窗","Modal Window":"弹窗","This is a modal window":"这是一个弹窗","This modal can be closed by pressing the Escape key or activating the close button.":"å¯ä»¥æŒ‰ ESC 按键或å¯ç”¨å…³é—­æŒ‰é’®æ¥å…³é—­æ­¤å¼¹çª—。",", opens captions settings dialog":",开å¯æ ‡é¢˜è®¾ç½®å¼¹çª—",", opens subtitles settings dialog":",开å¯å­—幕设置弹窗",", opens descriptions settings dialog":",开å¯æ述设置弹窗",", selected":",选择","captions settings":"内嵌字幕设置","subtitles settings":"字幕设置","descriptions settings":"æ述设置","Text":"文字","White":"白","Black":"黑","Red":"红","Green":"绿","Blue":"è“","Yellow":"黄","Magenta":"紫红","Cyan":"é’","Background":"背景","Window":"视窗","Transparent":"é€æ˜Ž","Semi-Transparent":"åŠé€æ˜Ž","Opaque":"ä¸é€æ˜Ž","Font Size":"字体尺寸","Text Edge Style":"字体边缘样å¼","None":"æ— ","Raised":"浮雕","Depressed":"压低","Uniform":"å‡åŒ€","Dropshadow":"下阴影","Font Family":"字体库","Proportional Sans-Serif":"比例无细体","Monospace Sans-Serif":"å•é—´éš”无细体","Proportional Serif":"比例细体","Monospace Serif":"å•é—´éš”细体","Casual":"舒适","Script":"手写体","Small Caps":"å°åž‹å¤§å†™å­—体","Reset":"é‡å¯","restore all settings to the default values":"æ¢å¤å…¨éƒ¨è®¾ç½®è‡³é¢„设值","Done":"完æˆ","Caption Settings Dialog":"字幕设置弹窗","Beginning of dialog window. Escape will cancel and close the window.":"开始对è¯å¼¹çª—。离开会å–消并关闭弹窗。","End of dialog window.":"结æŸå¯¹è¯å¼¹çª—","{1} is loading.":"正在加载 {1}。","Quality":"画质","Auto":"自动","Speed":"速度","Subtitles/CC":"字幕","peers":"个æ¥æº","Go to the video page":"进入视频页é¢","Settings":"设置","Uses P2P, others may know you are watching this video.":"使用 P2P 时,其他人将能够知é“您正在观看此视频。","Copy the video URL":"å¤åˆ¶è§†é¢‘网å€","Copy the video URL at the current time":"å¤åˆ¶å½“å‰æ—¶é—´çš„视频网å€","Copy embed code":"å¤åˆ¶åµŒå…¥ä»£ç "} \ No newline at end of file
diff --git a/client/src/locale/target/server_ar_001.xml b/client/src/locale/target/server_ar_001.xml
index 83ceaae51..af71187aa 100644
--- a/client/src/locale/target/server_ar_001.xml
+++ b/client/src/locale/target/server_ar_001.xml
@@ -43,9 +43,9 @@
43 <source>Entertainment</source> 43 <source>Entertainment</source>
44 <target>ترÙيه</target> 44 <target>ترÙيه</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="News"> 46 <trans-unit id="News &amp; Politics">
47 <source>News</source> 47 <source>News &amp; Politics</source>
48 <target>أخبار</target> 48 <target>أخبار وسياسة</target>
49 </trans-unit> 49 </trans-unit>
50 <trans-unit id="How To"> 50 <trans-unit id="How To">
51 <source>How To</source> 51 <source>How To</source>
@@ -99,6 +99,10 @@
99 <source>Attribution - Non Commercial - No Derivatives</source> 99 <source>Attribution - Non Commercial - No Derivatives</source>
100 <target>نسب المصن٠- غير تجاري - منع الشتقاق</target> 100 <target>نسب المصن٠- غير تجاري - منع الشتقاق</target>
101 </trans-unit> 101 </trans-unit>
102 <trans-unit id="Public Domain Dedication">
103 <source>Public Domain Dedication</source>
104 <target>رخصة عمومية</target>
105 </trans-unit>
102 <trans-unit id="Public"> 106 <trans-unit id="Public">
103 <source>Public</source> 107 <source>Public</source>
104 <target>عام</target> 108 <target>عام</target>
@@ -111,13 +115,21 @@
111 <source>Private</source> 115 <source>Private</source>
112 <target>خاص</target> 116 <target>خاص</target>
113 </trans-unit> 117 </trans-unit>
118 <trans-unit id="Published">
119 <source>Published</source>
120 <target>تم نشرها</target>
121 </trans-unit>
114 <trans-unit id="To import"> 122 <trans-unit id="To import">
115 <source>To import</source> 123 <source>To import</source>
116 <target>للاستيراد</target> 124 <target>للاستيراد</target>
117 </trans-unit> 125 </trans-unit>
126 <trans-unit id="Pending">
127 <source>Pending</source>
128 <target>معلّقة</target>
129 </trans-unit>
118 <trans-unit id="Success"> 130 <trans-unit id="Success">
119 <source>Success</source> 131 <source>Success</source>
120 <target>نجح</target> 132 <target>تم بنجاح</target>
121 </trans-unit> 133 </trans-unit>
122 <trans-unit id="Failed"> 134 <trans-unit id="Failed">
123 <source>Failed</source> 135 <source>Failed</source>
@@ -129,7 +141,7 @@
129 </trans-unit> 141 </trans-unit>
130 <trans-unit id="Unknown"> 142 <trans-unit id="Unknown">
131 <source>Unknown</source> 143 <source>Unknown</source>
132 <target>مجهول</target> 144 <target>مجهولة</target>
133 </trans-unit> 145 </trans-unit>
134 </body> 146 </body>
135 </file></xliff> \ No newline at end of file 147 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/server_ca_ES.json b/client/src/locale/target/server_ca_ES.json
index 95994e618..f20f0fa61 100644
--- a/client/src/locale/target/server_ca_ES.json
+++ b/client/src/locale/target/server_ca_ES.json
@@ -1 +1 @@
{"Music":"Música","Films":"Pel·lícules","Vehicles":"Vehicles","Art":"Art","Sports":"Esports","Travels":"Viatges","Gaming":"Jocs","People":"Gent","Comedy":"Comèdia","Entertainment":"Entreteniment","News":"Notícies","How To":"Com fer","Education":"Educació","Activism":"Activisme","Science & Technology":"Ciència i tecnologia","Animals":"Animals","Kids":"Nens","Food":"Aliments","Attribution":"Atribució","Attribution - Share Alike":"Atribució: Comparteix-ho per igual","Attribution - No Derivatives":"Atribució - Sense Derivats","Attribution - Non Commercial":"Atribució: No Comercial","Attribution - Non Commercial - Share Alike":"Atribució - No Comercial - Compartir per igual","Attribution - Non Commercial - No Derivatives":"Attribution - No Comercial - Sense Derivats","Public Domain Dedication":"Dedicació de Domini Públic","Public":"Públic","Unlisted":"No llistat","Private":"Privat","Misc":"Miscel·lània","Unknown":"Desconegut","Afar":"Àfar","Abkhazian":"Abkhaz","Afrikaans":"Afrikaans","Akan":"Àkan","Amharic":"Amhàric","Arabic":"Àrab","Aragonese":"Aragonès","American Sign Language":"Llengua de Signes Nord-Americana","Assamese":"Assamès","Avaric":"Àvar","Aymara":"Aimara","Azerbaijani":"Àzeri","Bashkir":"Baixkir","Bambara":"Bambara","Belarusian":"Bielorús","Bengali":"Bengalí","British Sign Language":"Llengua de Signes Britànica","Bislama":"Bislama","Tibetan":"Tibetà","Bosnian":"Bosnià","Breton":"Bretó","Bulgarian":"Búlgar","Brazilian Sign Language":"Llengua de Signes Brasiler","Catalan":"Català","Czech":"Txec","Chamorro":"Chamorro","Chechen":"Txetxè","Chuvash":"Txuvaix","Cornish":"Korni","Corsican":"Cors","Cree":"Cree","Czech Sign Language":"Llengua de Signes Txec","Chinese Sign Language":"Llengua de Signes Xinesa","Welsh":"Gal·lès","Danish":"Danès","German":"Alemany","Dhivehi":"Divehi","Danish Sign Language":"Llengua de Signes Danesa","Dzongkha":"Dzongka","Modern Greek (1453-)":"Grec modern (1453-)","English":"Anglès","Estonian":"Estonià","Basque":"Basc","Ewe":"Ewe","Faroese":"Feroès","Persian":"Persa","Fijian":"Fijià","Finnish":"Finlandès","French":"Francès","Western Frisian":"Frisó occidental","French Sign Language":"Llengua de Signes Francesa","Fulah":"Ful","Scottish Gaelic":"Gaèlic Escocès","Irish":"Irlandès","Galician":"Gallec","Manx":"Manx","Guarani":"Guaraní","German Sign Language":"Llengua de Signes Alemanya","Gujarati":"Gujarati","Haitian":"Haitià","Hausa":"Haussa","Serbo-Croatian":"Serbocroat","Hebrew":"Hebreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Croat","Hungarian":"Hongarès","Armenian":"Armeni","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonesi","Inupiaq":"Inupiaq","Icelandic":"Islandès","Italian":"Italià","Javanese":"Javanès","Japanese":"Japonès","Japanese Sign Language":"Llengua de Signes Japonesa","Kalaallisut":"Kalaallisut","Kannada":"Kannada","Kashmiri":"Caixmiri","Georgian":"Georgià","Kanuri":"Kanuri","Kazakh":"Kazakh","Khmer":"Khmer","Kikuyu":"Kikuiu","Kinyarwanda":"Ruandès","Kirghiz":"Kirguís","Komi":"Komi","Kongo":"Koongo","Korean":"Coreà","Kuanyama":"Kwanyama","Kurdish":"Kurd","Lao":"Laosià","Latvian":"Letó","Limburgan":"Limburgan","Lingala":"Lingala","Lithuanian":"Lituà","Luxembourgish":"Luxemburguès","Luba-Katanga":"Luba","Ganda":"Ganda","Marshallese":"Marshallès","Malayalam":"Malaialam","Marathi":"Marathi","Macedonian":"Macedoni","Malagasy":"Malgache","Maltese":"Maltès","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malai (macro llengua)","Burmese":"Birmà","Nauru":"Nauruà","Navajo":"Navaho","South Ndebele":"Ndebele del Sud","North Ndebele":"Ndebele del Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalès (macro llengua)","Dutch":"Holandès","Norwegian Nynorsk":"Noruec Nynorsk","Norwegian Bokmål":"Noruec Bokmål","Norwegian":"Noruec","Nyanja":"Nyanga","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macro llengua)","Oromo":"Oromo","Ossetian":"Osset","Panjabi":"Panjabi","Pakistan Sign Language":"Llengua de Signes de Pakistan","Polish":"Polonès","Portuguese":"Portuguès","Pushto":"Paixtu","Quechua":"Quítxua","Romansh":"Romanx","Romanian":"Romanès","Russian Sign Language":"Llengua de Signes Russa","Rundi":"Rundi","Russian":"Rus","Sango":"Sango","Saudi Arabian Sign Language":"Llengua de Signes de l'Aràbia Saudita","South African Sign Language":"Llengua de Signes Sud-Africana","Sinhala":"Singalès","Slovak":"Eslovac","Slovenian":"Eslovè","Northern Sami":"Sami del Nord","Samoan":"Samoà","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho del Sud","Spanish":"Espanyol","Albanian":"Albanès","Sardinian":"Sard","Serbian":"Serbi","Swati":"Swati","Sundanese":"Sundanès","Swahili (macrolanguage)":"Suahili (macro llengua)","Swedish":"Suec","Swedish Sign Language":"Llengua de Signes Sueca","Tahitian":"Tahití","Tamil":"Tàmil","Tatar":"Tàtar","Telugu":"Telugu","Tajik":"Tadjik","Tagalog":"Tagàlog","Thai":"Tailandès","Tigrinya":"Tigrinya","Tonga (Tonga Islands)":"Tongalès (arxipèlag de Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turcman","Turkish":"Turc","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraïnès","Urdu":"Urdú","Uzbek":"Uzbek","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Való","Wolof":"Wòlof","Xhosa":"Xosa","Yiddish":"Jiddisch","Yoruba":"Ioruba","Zhuang":"Zhuang","Chinese":"Xinès","Zulu":"Zulu"} \ No newline at end of file {"Music":"Música","Films":"Pel·lícules","Vehicles":"Vehicles","Art":"Art","Sports":"Esports","Travels":"Viatges","Gaming":"Jocs","People":"Gent","Comedy":"Comèdia","Entertainment":"Entreteniment","How To":"Com fer","Education":"Educació","Activism":"Activisme","Science & Technology":"Ciència i tecnologia","Animals":"Animals","Kids":"Nens","Food":"Aliments","Attribution":"Atribució","Attribution - Share Alike":"Atribució: Comparteix-ho per igual","Attribution - No Derivatives":"Atribució - Sense Derivats","Attribution - Non Commercial":"Atribució: No Comercial","Attribution - Non Commercial - Share Alike":"Atribució - No Comercial - Compartir per igual","Attribution - Non Commercial - No Derivatives":"Attribution - No Comercial - Sense Derivats","Public Domain Dedication":"Dedicació de Domini Públic","Public":"Públic","Unlisted":"No llistat","Private":"Privat","Misc":"Miscel·lània","Unknown":"Desconegut","Afar":"Àfar","Abkhazian":"Abkhaz","Afrikaans":"Afrikaans","Akan":"Àkan","Amharic":"Amhàric","Arabic":"Àrab","Aragonese":"Aragonès","American Sign Language":"Llengua de Signes Nord-Americana","Assamese":"Assamès","Avaric":"Àvar","Aymara":"Aimara","Azerbaijani":"Àzeri","Bashkir":"Baixkir","Bambara":"Bambara","Belarusian":"Bielorús","Bengali":"Bengalí","British Sign Language":"Llengua de Signes Britànica","Bislama":"Bislama","Tibetan":"Tibetà","Bosnian":"Bosnià","Breton":"Bretó","Bulgarian":"Búlgar","Brazilian Sign Language":"Llengua de Signes Brasiler","Catalan":"Català","Czech":"Txec","Chamorro":"Chamorro","Chechen":"Txetxè","Chuvash":"Txuvaix","Cornish":"Korni","Corsican":"Cors","Cree":"Cree","Czech Sign Language":"Llengua de Signes Txec","Chinese Sign Language":"Llengua de Signes Xinesa","Welsh":"Gal·lès","Danish":"Danès","German":"Alemany","Dhivehi":"Divehi","Danish Sign Language":"Llengua de Signes Danesa","Dzongkha":"Dzongka","Modern Greek (1453-)":"Grec modern (1453-)","English":"Anglès","Estonian":"Estonià","Basque":"Basc","Ewe":"Ewe","Faroese":"Feroès","Persian":"Persa","Fijian":"Fijià","Finnish":"Finlandès","French":"Francès","Western Frisian":"Frisó occidental","French Sign Language":"Llengua de Signes Francesa","Fulah":"Ful","Scottish Gaelic":"Gaèlic Escocès","Irish":"Irlandès","Galician":"Gallec","Manx":"Manx","Guarani":"Guaraní","German Sign Language":"Llengua de Signes Alemanya","Gujarati":"Gujarati","Haitian":"Haitià","Hausa":"Haussa","Serbo-Croatian":"Serbocroat","Hebrew":"Hebreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Croat","Hungarian":"Hongarès","Armenian":"Armeni","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonesi","Inupiaq":"Inupiaq","Icelandic":"Islandès","Italian":"Italià","Javanese":"Javanès","Japanese":"Japonès","Japanese Sign Language":"Llengua de Signes Japonesa","Kalaallisut":"Kalaallisut","Kannada":"Kannada","Kashmiri":"Caixmiri","Georgian":"Georgià","Kanuri":"Kanuri","Kazakh":"Kazakh","Khmer":"Khmer","Kikuyu":"Kikuiu","Kinyarwanda":"Ruandès","Kirghiz":"Kirguís","Komi":"Komi","Kongo":"Koongo","Korean":"Coreà","Kuanyama":"Kwanyama","Kurdish":"Kurd","Lao":"Laosià","Latvian":"Letó","Limburgan":"Limburgan","Lingala":"Lingala","Lithuanian":"Lituà","Luxembourgish":"Luxemburguès","Luba-Katanga":"Luba","Ganda":"Ganda","Marshallese":"Marshallès","Malayalam":"Malaialam","Marathi":"Marathi","Macedonian":"Macedoni","Malagasy":"Malgache","Maltese":"Maltès","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malai (macro llengua)","Burmese":"Birmà","Nauru":"Nauruà","Navajo":"Navaho","South Ndebele":"Ndebele del Sud","North Ndebele":"Ndebele del Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalès (macro llengua)","Dutch":"Holandès","Norwegian Nynorsk":"Noruec Nynorsk","Norwegian Bokmål":"Noruec Bokmål","Norwegian":"Noruec","Nyanja":"Nyanga","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macro llengua)","Oromo":"Oromo","Ossetian":"Osset","Panjabi":"Panjabi","Pakistan Sign Language":"Llengua de Signes de Pakistan","Polish":"Polonès","Portuguese":"Portuguès","Pushto":"Paixtu","Quechua":"Quítxua","Romansh":"Romanx","Romanian":"Romanès","Russian Sign Language":"Llengua de Signes Russa","Rundi":"Rundi","Russian":"Rus","Sango":"Sango","Saudi Arabian Sign Language":"Llengua de Signes de l'Aràbia Saudita","South African Sign Language":"Llengua de Signes Sud-Africana","Sinhala":"Singalès","Slovak":"Eslovac","Slovenian":"Eslovè","Northern Sami":"Sami del Nord","Samoan":"Samoà","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho del Sud","Spanish":"Espanyol","Albanian":"Albanès","Sardinian":"Sard","Serbian":"Serbi","Swati":"Swati","Sundanese":"Sundanès","Swahili (macrolanguage)":"Suahili (macro llengua)","Swedish":"Suec","Swedish Sign Language":"Llengua de Signes Sueca","Tahitian":"Tahití","Tamil":"Tàmil","Tatar":"Tàtar","Telugu":"Telugu","Tajik":"Tadjik","Tagalog":"Tagàlog","Thai":"Tailandès","Tigrinya":"Tigrinya","Tonga (Tonga Islands)":"Tongalès (arxipèlag de Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turcman","Turkish":"Turc","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraïnès","Urdu":"Urdú","Uzbek":"Uzbek","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Való","Wolof":"Wòlof","Xhosa":"Xosa","Yiddish":"Jiddisch","Yoruba":"Ioruba","Zhuang":"Zhuang","Chinese":"Xinès","Zulu":"Zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_cs_CZ.json b/client/src/locale/target/server_cs_CZ.json
index 593983c46..e013a910f 100644
--- a/client/src/locale/target/server_cs_CZ.json
+++ b/client/src/locale/target/server_cs_CZ.json
@@ -1 +1 @@
{"Music":"Hudba","Films":"Filmy","Vehicles":"Auta","Art":"UmÄ›ní","Sports":"Sport","Travels":"Cestování","Gaming":"Hry","People":"Lidé","Comedy":"Komedie","Entertainment":"Zábava","News":"Zprávy","How To":"Jak na to","Education":"Výukové","Activism":"Aktivismus","Science & Technology":"VÄ›da a technologie","Animals":"Zvířata","Kids":"DÄ›ti","Food":"Jídlo a vaÅ™ení","Attribution":"UveÄte autora","Attribution - Share Alike":"UveÄte autora - Zachovejte licenci","Attribution - No Derivatives":"UveÄte autora - Nezpracovávejte","Attribution - Non Commercial":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ›","Attribution - Non Commercial - Share Alike":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ› - Zachovejte licenci","Attribution - Non Commercial - No Derivatives":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ› - Nezpracovávejte","Public Domain Dedication":"Volné dílo","Public":"VeÅ™ejné","Unlisted":"Nezobrazeno","Private":"Soukromé","Misc":"Různé","Unknown":"Neznámé","Afar":"AfarÅ¡tina","Abkhazian":"AbcházÅ¡tina","Afrikaans":"AfrikánÅ¡tina","Akan":"AkanÅ¡tina","Amharic":"AmharÅ¡tina","Arabic":"ArabÅ¡tina","Aragonese":"AragonÅ¡tina","American Sign Language":"Americká znaková Å™eÄ","Assamese":"ÃsámÅ¡tina","Avaric":"AvarÅ¡tina","Kotava":"Kotava","Aymara":"AjmarÅ¡tina","Azerbaijani":"ÃzerbájdžánÅ¡tina","Bashkir":"BaÅ¡kirÅ¡tina","Bambara":"BambarÅ¡tina","Belarusian":"BÄ›loruÅ¡tina","Bengali":"BengálÅ¡tina","British Sign Language":"Britská znaková Å™eÄ","Bislama":"BislamÅ¡tina","Tibetan":"TibetÅ¡tina","Bosnian":"BosenÅ¡tina","Breton":"BretonÅ¡tina","Bulgarian":"BulharÅ¡tina","Brazilian Sign Language":"Brazilská znaková Å™eÄ","Catalan":"KatalánÅ¡tina","Czech":"ÄŒeÅ¡tina","Chamorro":"Chamorro","Chechen":"ÄŒeÄenÅ¡tina","Chuvash":"ÄŒuvaÅ¡tina","Cornish":"KornÅ¡tina","Corsican":"KorsiÄtina","Cree":"KríjÅ¡tina","Czech Sign Language":"ÄŒeská znaková Å™eÄ","Chinese Sign Language":"Čínská znaková Å™eÄ","Welsh":"VelÅ¡tina","Danish":"DánÅ¡tina","German":"NÄ›mÄina","Dhivehi":"MaledivÅ¡tina","Danish Sign Language":"Dánská znaková Å™eÄ","Dzongkha":"Dzongkä","Modern Greek (1453-)":"Moderní Å™eÄtina","English":"AngliÄtina","Esperanto":"Esperanto","Estonian":"EstonÅ¡tina","Basque":"BaskiÄtina","Ewe":"EveÅ¡tina","Faroese":"FaerÅ¡tina","Persian":"PerÅ¡tina","Fijian":"FidžijÅ¡tina","Finnish":"FinÅ¡tina","French":"FrancouzÅ¡tina","Western Frisian":"Západofríština","French Sign Language":"Francouzská znaková Å™eÄ","Fulah":"FulbÅ¡tina","Scottish Gaelic":"Skotská gaelÅ¡tina","Irish":"IrÅ¡tina","Galician":"GalicijÅ¡tina","Manx":"ManÅ¡tina","Guarani":"GuaranÅ¡tina","German Sign Language":"NÄ›mecká znaková Å™eÄ","Gujarati":"GudžarátÅ¡tina","Haitian":"Haitská kreolÅ¡tina","Hausa":"HauÅ¡tina","Serbo-Croatian":"SrcbochorvatÅ¡inta","Hebrew":"HebrejÅ¡tina","Herero":"Herero","Hindi":"HindÅ¡tina","Hiri Motu":"Hiri Motu","Croatian":"ChorvatÅ¡tina","Hungarian":"MaÄarÅ¡tina","Armenian":"ArménÅ¡tina","Igbo":"IgboÅ¡tina","Sichuan Yi":"Nuosu","Inuktitut":"InuktitutÅ¡tina","Indonesian":"Indonéština","Inupiaq":"Inupiaq","Icelandic":"IslandÅ¡tina","Italian":"ItalÅ¡tina","Javanese":"JavánÅ¡tina","Lojban":"Lojban","Japanese":"JaponÅ¡tina","Japanese Sign Language":"Japonská znaková Å™eÄ","Kalaallisut":"GrónÅ¡tina","Kannada":"KannadÅ¡tina","Kashmiri":"KaÅ¡mírÅ¡tina","Georgian":"GruzínÅ¡tina","Kanuri":"KanurijÅ¡tina","Kazakh":"KazaÅ¡tina","Khmer":"KhmerÅ¡tina","Kikuyu":"KikujÅ¡tina","Kinyarwanda":"RwandÅ¡tina","Kirghiz":"KyrgyzÅ¡tina","Komi":"Komi","Kongo":"Konžština","Korean":"KorejÅ¡tina","Kuanyama":"Kuanyama","Kurdish":"KurdÅ¡tina","Lao":"LaoÅ¡tina","Latvian":"LotyÅ¡tina","Limburgan":"LimburÅ¡tina","Lingala":"NgalÅ¡tina","Lithuanian":"LitevÅ¡tina","Luxembourgish":"LucemburÅ¡tina","Luba-Katanga":"Luba-Katanga","Ganda":"GandÅ¡tina","Marshallese":"MaršálÅ¡tina","Malayalam":"MalajálamÅ¡tina","Marathi":"MaráthÅ¡tina","Macedonian":"MakedonÅ¡tina","Malagasy":"MalgaÅ¡tina","Maltese":"MaltÅ¡tina","Mongolian":"MongolÅ¡tina","Maori":"MaorÅ¡tina","Malay (macrolanguage)":"MalajÅ¡tina","Burmese":"BarmÅ¡tina","Nauru":"NaurÅ¡tina","Navajo":"Navažština","South Ndebele":"Jižní ndebelÅ¡tina","North Ndebele":"Severní ndebelÅ¡tina","Ndonga":"NdondÅ¡tina","Nepali (macrolanguage)":"NepálÅ¡tina","Dutch":"DánÅ¡tina","Norwegian Nynorsk":"NorÅ¡tina Nynorsk","Norwegian BokmÃ¥l":"NorÅ¡tina BokmÃ¥l","Norwegian":"NorÅ¡tina ","Nyanja":"ÄŒiÄevÅ¡tina","Occitan":"OkcitánÅ¡tina","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"UrijÅ¡tina","Oromo":"OromÅ¡tina","Ossetian":"OsetÅ¡tina","Panjabi":"PaňdžábÅ¡tina","Pakistan Sign Language":"Pakistánská znaková Å™eÄ","Polish":"PolÅ¡tina","Portuguese":"PortugalÅ¡tina","Pushto":"PaÅ¡tÅ¡tina","Quechua":"KeÄuánÅ¡tina","Romansh":"RétorománÅ¡tina","Romanian":"RumunÅ¡tina","Russian Sign Language":"Ruská znaková Å™eÄ","Rundi":"Kirundi","Russian":"RuÅ¡tina","Sango":"Sango","Saudi Arabian Sign Language":"Saudská arabská znaková Å™eÄ","South African Sign Language":"Jihoafrická znaková Å™eÄ","Sinhala":"SinhálÅ¡tina","Slovak":"SlovenÅ¡tina","Slovenian":"SlovinÅ¡tina","Northern Sami":"Severní sámÅ¡tina","Samoan":"SamojÅ¡tina","Shona":"Shona","Sindhi":"SindhÅ¡tina","Somali":"SomálÅ¡tina","Southern Sotho":"Jižní sotÅ¡tina","Spanish":"Å panÄ›lÅ¡tina","Albanian":"AlbánÅ¡tina","Sardinian":"SardínÅ¡tina","Serbian":"SrbÅ¡tina","Swati":"Swati","Sundanese":"SundÅ¡tina","Swahili (macrolanguage)":"SvahilÅ¡tina","Swedish":"Å védÅ¡tina","Swedish Sign Language":"Å védská znaková Å™eÄ","Tahitian":"TahitÅ¡tina","Tamil":"TamilÅ¡tina","Tatar":"TatarÅ¡tina","Telugu":"TelugÅ¡tina","Tajik":"TádžiÄtina","Tagalog":"Tagalog","Thai":"ThajÅ¡tina","Tigrinya":"Tigrinya","Klingon":"KlingonÅ¡tina","Tonga (Tonga Islands)":"TongánÅ¡tina","Tswana":"SetswanÅ¡tina","Tsonga":"TsongÅ¡tina","Turkmen":"TurkmenÅ¡tina","Turkish":"TureÄtina","Twi":"Twi","Uighur":"UjgurÅ¡tina","Ukrainian":"UkrajinÅ¡tina","Urdu":"UrdÅ¡tina","Uzbek":"UzbeÄtina","Venda":"VendÅ¡tina","Vietnamese":"VietnamÅ¡tina","Walloon":"ValonÅ¡tina","Wolof":"Wolof ","Xhosa":"XhoÅ¡tina","Yiddish":"JidiÅ¡","Yoruba":"JorubÅ¡tina","Zhuang":"ÄŒuangÅ¡tina","Chinese":"ČínÅ¡tina","Zulu":"ZuluÅ¡tina"} \ No newline at end of file {"Music":"Hudba","Films":"Filmy","Vehicles":"Auta","Art":"UmÄ›ní","Sports":"Sport","Travels":"Cestování","Gaming":"Hry","People":"Lidé","Comedy":"Komedie","Entertainment":"Zábava","News & Politics":"Zprávy a politika","How To":"Jak na to","Education":"Výukové","Activism":"Aktivismus","Science & Technology":"VÄ›da a technologie","Animals":"Zvířata","Kids":"DÄ›ti","Food":"Jídlo a vaÅ™ení","Attribution":"UveÄte autora","Attribution - Share Alike":"UveÄte autora - Zachovejte licenci","Attribution - No Derivatives":"UveÄte autora - Nezpracovávejte","Attribution - Non Commercial":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ›","Attribution - Non Commercial - Share Alike":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ› - Zachovejte licenci","Attribution - Non Commercial - No Derivatives":"UveÄte autora - NeÅ¡iÅ™te dílo komerÄnÄ› - Nezpracovávejte","Public Domain Dedication":"Volné dílo","Public":"VeÅ™ejné","Unlisted":"Nezobrazeno","Private":"Soukromé","Published":"Publikované","To transcode":"K transkódování","To import":"To import","Pending":"ÄŒekající","Success":"ÚspÄ›ch","Failed":"NeúspÄ›ch","Misc":"Různé","Unknown":"Neznámé","Afar":"AfarÅ¡tina","Abkhazian":"AbcházÅ¡tina","Afrikaans":"AfrikánÅ¡tina","Akan":"AkanÅ¡tina","Amharic":"AmharÅ¡tina","Arabic":"ArabÅ¡tina","Aragonese":"AragonÅ¡tina","American Sign Language":"Americká znaková Å™eÄ","Assamese":"ÃsámÅ¡tina","Avaric":"AvarÅ¡tina","Kotava":"Kotava","Aymara":"AjmarÅ¡tina","Azerbaijani":"ÃzerbájdžánÅ¡tina","Bashkir":"BaÅ¡kirÅ¡tina","Bambara":"BambarÅ¡tina","Belarusian":"BÄ›loruÅ¡tina","Bengali":"BengálÅ¡tina","British Sign Language":"Britská znaková Å™eÄ","Bislama":"BislamÅ¡tina","Tibetan":"TibetÅ¡tina","Bosnian":"BosenÅ¡tina","Breton":"BretonÅ¡tina","Bulgarian":"BulharÅ¡tina","Brazilian Sign Language":"Brazilská znaková Å™eÄ","Catalan":"KatalánÅ¡tina","Czech":"ÄŒeÅ¡tina","Chamorro":"Chamorro","Chechen":"ÄŒeÄenÅ¡tina","Chuvash":"ÄŒuvaÅ¡tina","Cornish":"KornÅ¡tina","Corsican":"KorsiÄtina","Cree":"KríjÅ¡tina","Czech Sign Language":"ÄŒeská znaková Å™eÄ","Chinese Sign Language":"Čínská znaková Å™eÄ","Welsh":"VelÅ¡tina","Danish":"DánÅ¡tina","German":"NÄ›mÄina","Dhivehi":"MaledivÅ¡tina","Danish Sign Language":"Dánská znaková Å™eÄ","Dzongkha":"Dzongkä","Modern Greek (1453-)":"Moderní Å™eÄtina","English":"AngliÄtina","Esperanto":"Esperanto","Estonian":"EstonÅ¡tina","Basque":"BaskiÄtina","Ewe":"EveÅ¡tina","Faroese":"FaerÅ¡tina","Persian":"PerÅ¡tina","Fijian":"FidžijÅ¡tina","Finnish":"FinÅ¡tina","French":"FrancouzÅ¡tina","Western Frisian":"Západofríština","French Sign Language":"Francouzská znaková Å™eÄ","Fulah":"FulbÅ¡tina","Scottish Gaelic":"Skotská gaelÅ¡tina","Irish":"IrÅ¡tina","Galician":"GalicijÅ¡tina","Manx":"ManÅ¡tina","Guarani":"GuaranÅ¡tina","German Sign Language":"NÄ›mecká znaková Å™eÄ","Gujarati":"GudžarátÅ¡tina","Haitian":"Haitská kreolÅ¡tina","Hausa":"HauÅ¡tina","Serbo-Croatian":"SrcbochorvatÅ¡inta","Hebrew":"HebrejÅ¡tina","Herero":"Herero","Hindi":"HindÅ¡tina","Hiri Motu":"Hiri Motu","Croatian":"ChorvatÅ¡tina","Hungarian":"MaÄarÅ¡tina","Armenian":"ArménÅ¡tina","Igbo":"IgboÅ¡tina","Sichuan Yi":"Nuosu","Inuktitut":"InuktitutÅ¡tina","Indonesian":"Indonéština","Inupiaq":"Inupiaq","Icelandic":"IslandÅ¡tina","Italian":"ItalÅ¡tina","Javanese":"JavánÅ¡tina","Lojban":"Lojban","Japanese":"JaponÅ¡tina","Japanese Sign Language":"Japonská znaková Å™eÄ","Kalaallisut":"GrónÅ¡tina","Kannada":"KannadÅ¡tina","Kashmiri":"KaÅ¡mírÅ¡tina","Georgian":"GruzínÅ¡tina","Kanuri":"KanurijÅ¡tina","Kazakh":"KazaÅ¡tina","Khmer":"KhmerÅ¡tina","Kikuyu":"KikujÅ¡tina","Kinyarwanda":"RwandÅ¡tina","Kirghiz":"KyrgyzÅ¡tina","Komi":"Komi","Kongo":"Konžština","Korean":"KorejÅ¡tina","Kuanyama":"Kuanyama","Kurdish":"KurdÅ¡tina","Lao":"LaoÅ¡tina","Latvian":"LotyÅ¡tina","Limburgan":"LimburÅ¡tina","Lingala":"NgalÅ¡tina","Lithuanian":"LitevÅ¡tina","Luxembourgish":"LucemburÅ¡tina","Luba-Katanga":"Luba-Katanga","Ganda":"GandÅ¡tina","Marshallese":"MaršálÅ¡tina","Malayalam":"MalajálamÅ¡tina","Marathi":"MaráthÅ¡tina","Macedonian":"MakedonÅ¡tina","Malagasy":"MalgaÅ¡tina","Maltese":"MaltÅ¡tina","Mongolian":"MongolÅ¡tina","Maori":"MaorÅ¡tina","Malay (macrolanguage)":"MalajÅ¡tina","Burmese":"BarmÅ¡tina","Nauru":"NaurÅ¡tina","Navajo":"Navažština","South Ndebele":"Jižní ndebelÅ¡tina","North Ndebele":"Severní ndebelÅ¡tina","Ndonga":"NdondÅ¡tina","Nepali (macrolanguage)":"NepálÅ¡tina","Dutch":"DánÅ¡tina","Norwegian Nynorsk":"NorÅ¡tina Nynorsk","Norwegian BokmÃ¥l":"NorÅ¡tina BokmÃ¥l","Norwegian":"NorÅ¡tina ","Nyanja":"ÄŒiÄevÅ¡tina","Occitan":"OkcitánÅ¡tina","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"UrijÅ¡tina","Oromo":"OromÅ¡tina","Ossetian":"OsetÅ¡tina","Panjabi":"PaňdžábÅ¡tina","Pakistan Sign Language":"Pakistánská znaková Å™eÄ","Polish":"PolÅ¡tina","Portuguese":"PortugalÅ¡tina","Pushto":"PaÅ¡tÅ¡tina","Quechua":"KeÄuánÅ¡tina","Romansh":"RétorománÅ¡tina","Romanian":"RumunÅ¡tina","Russian Sign Language":"Ruská znaková Å™eÄ","Rundi":"Kirundi","Russian":"RuÅ¡tina","Sango":"Sango","Saudi Arabian Sign Language":"Saudská arabská znaková Å™eÄ","South African Sign Language":"Jihoafrická znaková Å™eÄ","Sinhala":"SinhálÅ¡tina","Slovak":"SlovenÅ¡tina","Slovenian":"SlovinÅ¡tina","Northern Sami":"Severní sámÅ¡tina","Samoan":"SamojÅ¡tina","Shona":"Shona","Sindhi":"SindhÅ¡tina","Somali":"SomálÅ¡tina","Southern Sotho":"Jižní sotÅ¡tina","Spanish":"Å panÄ›lÅ¡tina","Albanian":"AlbánÅ¡tina","Sardinian":"SardínÅ¡tina","Serbian":"SrbÅ¡tina","Swati":"Swati","Sundanese":"SundÅ¡tina","Swahili (macrolanguage)":"SvahilÅ¡tina","Swedish":"Å védÅ¡tina","Swedish Sign Language":"Å védská znaková Å™eÄ","Tahitian":"TahitÅ¡tina","Tamil":"TamilÅ¡tina","Tatar":"TatarÅ¡tina","Telugu":"TelugÅ¡tina","Tajik":"TádžiÄtina","Tagalog":"Tagalog","Thai":"ThajÅ¡tina","Tigrinya":"Tigrinya","Klingon":"KlingonÅ¡tina","Tonga (Tonga Islands)":"TongánÅ¡tina","Tswana":"SetswanÅ¡tina","Tsonga":"TsongÅ¡tina","Turkmen":"TurkmenÅ¡tina","Turkish":"TureÄtina","Twi":"Twi","Uighur":"UjgurÅ¡tina","Ukrainian":"UkrajinÅ¡tina","Urdu":"UrdÅ¡tina","Uzbek":"UzbeÄtina","Venda":"VendÅ¡tina","Vietnamese":"VietnamÅ¡tina","Walloon":"ValonÅ¡tina","Wolof":"Wolof ","Xhosa":"XhoÅ¡tina","Yiddish":"JidiÅ¡","Yoruba":"JorubÅ¡tina","Zhuang":"ÄŒuangÅ¡tina","Chinese":"ČínÅ¡tina","Zulu":"ZuluÅ¡tina"} \ No newline at end of file
diff --git a/client/src/locale/target/server_de_DE.json b/client/src/locale/target/server_de_DE.json
index 0f513cbd5..b3801c4ca 100644
--- a/client/src/locale/target/server_de_DE.json
+++ b/client/src/locale/target/server_de_DE.json
@@ -1 +1 @@
{"Music":"Musik","Films":"Filme","Vehicles":"Fahrzeuge","Art":"Kunst","Sports":"Sport","Travels":"Reisen","Gaming":"Spiele","People":"Leute","Comedy":"Komödie","Entertainment":"Unterhaltung","News":"Nachrichten","How To":"How-to","Education":"Bildung","Activism":"Aktivismus","Science & Technology":"Wissenschaft und Technologie","Animals":"Tiere","Kids":"Kinder","Food":"Essen","Attribution":"Namensnennung","Attribution - Share Alike":"Namensnennung - Weitergabe unter gleichen Bedingungen","Attribution - No Derivatives":"Namensnennung - Keine Bearbeitung","Attribution - Non Commercial":"Namensnennung - nicht kommerziell","Attribution - Non Commercial - Share Alike":"Namensnennung - nicht kommerziell, Weitergabe unter gleichen Bedingungen","Attribution - Non Commercial - No Derivatives":"Namensnennung - nicht kommerziell, keine Bearbeitung","Public Domain Dedication":"In Gemeinfreiheit entlassen","Public":"Öffentlich","Unlisted":"Nicht gelistet","Private":"Privat","Published":"Veröffentlicht","To transcode":"Zu transkodieren","To import":"Zu importieren","Pending":"Ausstehend","Success":"Erfolg","Failed":"Fehlgeschlagen","Misc":"Verschiedenes","Unknown":"Unbekannt","Afar":"Afar","Abkhazian":"Abchasisch","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharisch","Arabic":"Arabisch","Aragonese":"Aragonesisch","American Sign Language":"Amerikanische Gebärdensprache","Assamese":"Assamesisch","Avaric":"Awarisch","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Aserbeidschanisch","Bashkir":"Baschkirisch","Bambara":"Bambara","Belarusian":"Weißrussisch","Bengali":"Bengali","British Sign Language":"Britische Gebärdensprache","Bislama":"Beach-la-mar","Tibetan":"Tibetisch","Bosnian":"Bosnisch","Breton":"Bretonisch","Bulgarian":"Bulgarisch","Brazilian Sign Language":"Brasilianische Gebärdensprache","Catalan":"Katalanisch","Czech":"Tschechisch","Chamorro":"Chamorro","Chechen":"Tschetschenisch","Chuvash":"Tschuwaschisch","Cornish":"Kornisch","Corsican":"Korsisch","Cree":"Cree","Czech Sign Language":"Tschechische Gebärdensprache","Chinese Sign Language":"Chinesiche Gebärdensprache","Welsh":"Kymrisch","Danish":"Dänisch","German":"Deutsch","Dhivehi":"Maledivisch","Danish Sign Language":"Dänische Gebärdensprache","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Neugriechisch","English":"Englisch","Esperanto":"Esperanto","Estonian":"Estnisch","Basque":"Baskisch","Ewe":"Ewe","Faroese":"Färöisch","Persian":"Persisch","Fijian":"Fidschi","Finnish":"Finnisch","French":"Französisch","Western Frisian":"Friesisch","French Sign Language":"Französiche Gebärdensprache","Fulah":"Ful","Scottish Gaelic":"Gälisch-Schottisch","Irish":"Irisch","Galician":"Galicisch","Manx":"Manx","Guarani":"Guaraní","German Sign Language":"Deutsche Gebärdensprache","Gujarati":"Gujarati","Haitian":"Haïtien (Haiti-Kreolisch)","Hausa":"Hausa","Serbo-Croatian":"Serbokroatisch","Hebrew":"Hebräisch","Herero":"Otjiherero","Hindi":"Hindi","Hiri Motu":"Hiri-Motu","Croatian":"Kroatisch","Hungarian":"Ungarisch","Armenian":"Armenisch","Igbo":"Igbo","Sichuan Yi":"Yi","Inuktitut":"Inuktitut","Indonesian":"Bahasa Indonesia","Inupiaq":"Inupik","Icelandic":"Isländisch","Italian":"Italienisch","Javanese":"Javanisch","Lojban":"Lojban","Japanese":"Japanisch","Japanese Sign Language":"Japanische Gebärdensprache","Kalaallisut":"Grönländisch","Kannada":"Kannada","Kashmiri":"Kaschmiri","Georgian":"Georgisch","Kanuri":"Kanuri","Kazakh":"Kasachisch","Khmer":"Kambodschanisch","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Kirgisisch","Komi":"Komi","Kongo":"Kikongo","Korean":"Koreanisch","Kuanyama":"Kuanyama","Kurdish":"Kurdisch","Lao":"Laotisch","Latvian":"Lettisch","Limburgan":"Limburgisch","Lingala":"Lingala","Lithuanian":"Litauisch","Luxembourgish":"Luxemburgisch","Luba-Katanga":"Kiluba","Ganda":"Luganda","Marshallese":"Marschallesisch","Malayalam":"Malayalam","Marathi":"Marathi","Macedonian":"Makedonisch","Malagasy":"Malagassi","Maltese":"Maltesisch","Mongolian":"Mongolisch","Maori":"MÄori","Malay (macrolanguage)":"Malaiisch","Burmese":"Birmanisch","Nauru":"Nauruanisch","Navajo":"Navajo","South Ndebele":"Süd-Ndebele","North Ndebele":"Nord-Ndebele","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepali","Dutch":"Niederländisch","Norwegian Nynorsk":"Nynorsk","Norwegian BokmÃ¥l":"BokmÃ¥l","Norwegian":"Norwegisch","Nyanja":"Chichewa","Occitan":"Okzitanisch","Ojibwa":"Ojibwe","Oriya (macrolanguage)":"Oriya","Oromo":"Oromo","Ossetian":"Ossetisch","Panjabi":"Panjabi","Pakistan Sign Language":"Pakistanische Gebärdensprache","Polish":"Polnisch","Portuguese":"Portugiesisch","Pushto":"Paschtu","Quechua":"Quechua","Romansh":"Rätoromanisch","Romanian":"Rumänisch","Russian Sign Language":"Russische Gebärdensprache","Rundi":"Kirundi","Russian":"Russisch","Sango":"Sango","Saudi Arabian Sign Language":"Saudi-arabische Gebärdensprache","South African Sign Language":"Südafrikanische Gebärdensprache","Sinhala":"Singhalesisch","Slovak":"Slowakisch","Slovenian":"Slowenisch","Northern Sami":"Nordsaamisch","Samoan":"Samoanisch","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sesotho","Spanish":"Spanisch","Albanian":"Albanisch","Sardinian":"Sardisch","Serbian":"Serbisch","Swati":"siSwati","Sundanese":"Sundanesisch","Swahili (macrolanguage)":"Swahili","Swedish":"Schwedisch","Swedish Sign Language":"Schwedische Gebärdensprache","Tahitian":"Tahitisch","Tamil":"Tamil","Tatar":"Tatarisch","Telugu":"Telugu","Tajik":"Tadschikisch","Tagalog":"Tagalog","Thai":"Thailändisch","Tigrinya":"Tigrinisch","Klingon":"Klingonisch","Tonga (Tonga Islands)":"Tongaisch","Tswana":"Setswana","Tsonga":"Xitsonga","Turkmen":"Turkmenisch","Turkish":"Türkisch","Twi":"Twi","Uighur":"Uigurisch","Ukrainian":"Ukrainisch","Urdu":"Urdu","Uzbek":"Usbekisch","Venda":"Tshivenda","Vietnamese":"Vietnamesisch","Walloon":"Wallonisch","Wolof":"Wolof","Xhosa":"isiXhosa","Yiddish":"Jiddisch","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinesisch","Zulu":"isiZulu"} \ No newline at end of file {"Music":"Musik","Films":"Filme","Vehicles":"Fahrzeuge","Art":"Kunst","Sports":"Sport","Travels":"Reisen","Gaming":"Spiele","People":"Menschen","Comedy":"Komödie","Entertainment":"Unterhaltung","News & Politics":"Nachrichten & Politik","How To":"Anleitung","Education":"Bildung","Activism":"Aktivismus","Science & Technology":"Wissenschaft und Technologie","Animals":"Tiere","Kids":"Kinder","Food":"Essen","Attribution":"Namensnennung","Attribution - Share Alike":"Namensnennung - Weitergabe unter gleichen Bedingungen","Attribution - No Derivatives":"Namensnennung - Keine Bearbeitung","Attribution - Non Commercial":"Namensnennung - Nicht kommerziell","Attribution - Non Commercial - Share Alike":"Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen","Attribution - Non Commercial - No Derivatives":"Namensnennung - Nicht-kommerziell - Keine Bearbeitung","Public Domain Dedication":"In Gemeinfreiheit entlassen","Public":"Öffentlich","Unlisted":"Nicht gelistet","Private":"Privat","Published":"Veröffentlicht","To transcode":"Zu transkodieren","To import":"Zu importieren","Pending":"Ausstehend","Success":"Erfolg","Failed":"Fehlgeschlagen","Misc":"Verschiedenes","Unknown":"Unbekannt","Afar":"Afar","Abkhazian":"Abchasisch","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharisch","Arabic":"Arabisch","Aragonese":"Aragonesisch","American Sign Language":"Amerikanische Gebärdensprache","Assamese":"Assamesisch","Avaric":"Awarisch","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Aserbeidschanisch","Bashkir":"Baschkirisch","Bambara":"Bambara","Belarusian":"Weißrussisch","Bengali":"Bengali","British Sign Language":"Britische Gebärdensprache","Bislama":"Beach-la-mar","Tibetan":"Tibetisch","Bosnian":"Bosnisch","Breton":"Bretonisch","Bulgarian":"Bulgarisch","Brazilian Sign Language":"Brasilianische Gebärdensprache","Catalan":"Katalanisch","Czech":"Tschechisch","Chamorro":"Chamorro","Chechen":"Tschetschenisch","Chuvash":"Tschuwaschisch","Cornish":"Kornisch","Corsican":"Korsisch","Cree":"Cree","Czech Sign Language":"Tschechische Gebärdensprache","Chinese Sign Language":"Chinesiche Gebärdensprache","Welsh":"Kymrisch","Danish":"Dänisch","German":"Deutsch","Dhivehi":"Maledivisch","Danish Sign Language":"Dänische Gebärdensprache","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Neugriechisch","English":"Englisch","Esperanto":"Esperanto","Estonian":"Estnisch","Basque":"Baskisch","Ewe":"Ewe","Faroese":"Färöisch","Persian":"Persisch","Fijian":"Fidschi","Finnish":"Finnisch","French":"Französisch","Western Frisian":"Friesisch","French Sign Language":"Französiche Gebärdensprache","Fulah":"Ful","Scottish Gaelic":"Gälisch-Schottisch","Irish":"Irisch","Galician":"Galicisch","Manx":"Manx","Guarani":"Guaraní","German Sign Language":"Deutsche Gebärdensprache","Gujarati":"Gujarati","Haitian":"Haïtien (Haiti-Kreolisch)","Hausa":"Hausa","Serbo-Croatian":"Serbokroatisch","Hebrew":"Hebräisch","Herero":"Otjiherero","Hindi":"Hindi","Hiri Motu":"Hiri-Motu","Croatian":"Kroatisch","Hungarian":"Ungarisch","Armenian":"Armenisch","Igbo":"Igbo","Sichuan Yi":"Yi","Inuktitut":"Inuktitut","Indonesian":"Bahasa Indonesia","Inupiaq":"Inupik","Icelandic":"Isländisch","Italian":"Italienisch","Javanese":"Javanisch","Lojban":"Lojban","Japanese":"Japanisch","Japanese Sign Language":"Japanische Gebärdensprache","Kalaallisut":"Grönländisch","Kannada":"Kannada","Kashmiri":"Kaschmiri","Georgian":"Georgisch","Kanuri":"Kanuri","Kazakh":"Kasachisch","Khmer":"Kambodschanisch","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Kirgisisch","Komi":"Komi","Kongo":"Kikongo","Korean":"Koreanisch","Kuanyama":"Kuanyama","Kurdish":"Kurdisch","Lao":"Laotisch","Latvian":"Lettisch","Limburgan":"Limburgisch","Lingala":"Lingala","Lithuanian":"Litauisch","Luxembourgish":"Luxemburgisch","Luba-Katanga":"Kiluba","Ganda":"Luganda","Marshallese":"Marschallesisch","Malayalam":"Malayalam","Marathi":"Marathi","Macedonian":"Makedonisch","Malagasy":"Malagassi","Maltese":"Maltesisch","Mongolian":"Mongolisch","Maori":"MÄori","Malay (macrolanguage)":"Malaiisch","Burmese":"Birmanisch","Nauru":"Nauruanisch","Navajo":"Navajo","South Ndebele":"Süd-Ndebele","North Ndebele":"Nord-Ndebele","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepali","Dutch":"Niederländisch","Norwegian Nynorsk":"Nynorsk","Norwegian BokmÃ¥l":"BokmÃ¥l","Norwegian":"Norwegisch","Nyanja":"Chichewa","Occitan":"Okzitanisch","Ojibwa":"Ojibwe","Oriya (macrolanguage)":"Oriya","Oromo":"Oromo","Ossetian":"Ossetisch","Panjabi":"Panjabi","Pakistan Sign Language":"Pakistanische Gebärdensprache","Polish":"Polnisch","Portuguese":"Portugiesisch","Pushto":"Paschtu","Quechua":"Quechua","Romansh":"Rätoromanisch","Romanian":"Rumänisch","Russian Sign Language":"Russische Gebärdensprache","Rundi":"Kirundi","Russian":"Russisch","Sango":"Sango","Saudi Arabian Sign Language":"Saudi-arabische Gebärdensprache","South African Sign Language":"Südafrikanische Gebärdensprache","Sinhala":"Singhalesisch","Slovak":"Slowakisch","Slovenian":"Slowenisch","Northern Sami":"Nordsaamisch","Samoan":"Samoanisch","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sesotho","Spanish":"Spanisch","Albanian":"Albanisch","Sardinian":"Sardisch","Serbian":"Serbisch","Swati":"siSwati","Sundanese":"Sundanesisch","Swahili (macrolanguage)":"Swahili","Swedish":"Schwedisch","Swedish Sign Language":"Schwedische Gebärdensprache","Tahitian":"Tahitisch","Tamil":"Tamil","Tatar":"Tatarisch","Telugu":"Telugu","Tajik":"Tadschikisch","Tagalog":"Tagalog","Thai":"Thailändisch","Tigrinya":"Tigrinisch","Klingon":"Klingonisch","Tonga (Tonga Islands)":"Tongaisch","Tswana":"Setswana","Tsonga":"Xitsonga","Turkmen":"Turkmenisch","Turkish":"Türkisch","Twi":"Twi","Uighur":"Uigurisch","Ukrainian":"Ukrainisch","Urdu":"Urdu","Uzbek":"Usbekisch","Venda":"Tshivenda","Vietnamese":"Vietnamesisch","Walloon":"Wallonisch","Wolof":"Wolof","Xhosa":"isiXhosa","Yiddish":"Jiddisch","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinesisch","Zulu":"isiZulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_eo.json b/client/src/locale/target/server_eo.json
index 43cfef5ff..c1ee83e7f 100644
--- a/client/src/locale/target/server_eo.json
+++ b/client/src/locale/target/server_eo.json
@@ -1 +1 @@
{"Music":"Muziko","Films":"Filmoj","Vehicles":"Veturiloj","Art":"Arto","Sports":"Sporto","Travels":"VojaÄado","Gaming":"Ludoj","People":"Homoj","Comedy":"Komedio","Entertainment":"Amuzo","News":"Novaĵoj","How To":"Instrukcioj","Education":"Instruado","Activism":"Aktivismo","Science & Technology":"Scienco Ï— teÄ¥nikaro","Animals":"Bestoj","Kids":"Infanoj","Food":"ManÄo","Attribution":"Atribuite","Attribution - Share Alike":"Atribuite – Samkondiĉe","Attribution - No Derivatives":"Atribuite – Nemodifite","Attribution - Non Commercial":"Atribuite – Nekomerce","Attribution - Non Commercial - Share Alike":"Atribuite – Nekomerce – Samkondiĉe","Attribution - Non Commercial - No Derivatives":"Atribuite – Nekomerce – Nemodifite","Public Domain Dedication":"Dediĉo al publika posedo","Public":"Publika","Unlisted":"Nelistigata","Private":"Privata","Success":"Sukcesis","Failed":"Malsukcesis","Misc":"Diversaĵoj","Unknown":"Nekonata","Afar":"Afara","Abkhazian":"AbÄ¥aza","Afrikaans":"Afrikansa","Akan":"Akana","Amharic":"Amhara","Arabic":"Araba","Aragonese":"Aragona","American Sign Language":"Usona gestlingvo","Assamese":"Asama","Avaric":"Avara","Kotava":"Kotavo","Aymara":"Ajmara","Azerbaijani":"AzerbajÄana","Bashkir":"BaÅkira","Bambara":"Bambara","Belarusian":"Belorusa","Bengali":"Bengala","British Sign Language":"Brita gestlingvo","Bislama":"Bislama","Tibetan":"Tibeta","Bosnian":"Bosna","Breton":"Bretona","Bulgarian":"Bulgara","Brazilian Sign Language":"Brazila gestlingvo","Catalan":"Kataluna","Czech":"ĈeÄ¥a","Chamorro":"Ĉamora","Chechen":"Ĉeĉena","Chuvash":"ĈuvaÅa","Cornish":"Kornvala","Corsican":"Korsika","Czech Sign Language":"ĈeÄ¥a gestlingvo","Chinese Sign Language":"Ĉina gestlingvo","Welsh":"Kimra","Danish":"Dana","German":"Germana","Dhivehi":"Maldiva","Danish Sign Language":"Dana gestlingvo","Dzongkha":"Butana","Modern Greek (1453-)":"Novgreka","English":"Angla","Esperanto":"Esperanto","Estonian":"Estona","Basque":"EÅ­ska","Ewe":"Evea","Faroese":"Feroa","Persian":"Persa","Fijian":"FiÄia","Finnish":"Finna","French":"Franca","Western Frisian":"Okcidentfrisa","French Sign Language":"Franca gestlingvo","Fulah":"Fula","Scottish Gaelic":"Skotgaela","Irish":"Irlanda","Galician":"Galega","Manx":"Manksa","Guarani":"Gvarania","German Sign Language":"Germana gestlingvo","Gujarati":"GuÄarata","Haitian":"Haitia","Hausa":"HaÅ­sa","Serbo-Croatian":"Kroatserba","Hebrew":"Hebrea","Herero":"Herera","Hindi":"Hinda","Hiri Motu":"Hirimotua","Croatian":"Kroata","Hungarian":"Hungara","Armenian":"Armena","Igbo":"Igba","Sichuan Yi":"Jia","Inuktitut":"Inuktituta","Indonesian":"Indonezia","Inupiaq":"Inupiko","Icelandic":"Islanda","Italian":"Itala","Javanese":"Java","Lojban":"Loĵbano","Japanese":"Japana","Japanese Sign Language":"Japana gestlingvo","Kalaallisut":"Gronlanda","Kannada":"Kanara","Kashmiri":"KaÅmira","Georgian":"Kartvela","Kanuri":"Kanuria","Kazakh":"KazaÄ¥a","Khmer":"Kmera","Kirghiz":"Kirgiza","Komi":"Komia","Kongo":"Konga","Korean":"Korea","Kuanyama":"Kvanjama","Kurdish":"Kurda","Lao":"Laosa","Latvian":"Latva","Limburgan":"Limburga","Lingala":"Lingala","Lithuanian":"Litova","Luxembourgish":"Luksemburga","Marshallese":"MarÅalinsula","Malayalam":"Malajalama","Marathi":"Marata","Macedonian":"Makedona","Malagasy":"MalgaÅa","Maltese":"Malta","Mongolian":"Mongola","Maori":"Maoria","Malay (macrolanguage)":"Malaja","Burmese":"Birma","Nauru":"Naura","Navajo":"Navajo","South Ndebele":"Sudndebela","North Ndebele":"Nordndebela","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepala","Dutch":"Nederlanda","Norwegian Nynorsk":"Novnorvega","Norwegian BokmÃ¥l":"Bukmolo","Norwegian":"Norvega","Nyanja":"Ĉiĉeva","Ojibwa":"OÄibua","Oriya (macrolanguage)":"Orisa","Oromo":"Oroma","Ossetian":"Oseta","Panjabi":"PanÄaba","Pakistan Sign Language":"Pakistana gestlingvo","Polish":"Pola","Portuguese":"Portugala","Pushto":"PaÅtua","Quechua":"Keĉua","Romansh":"Romanĉa","Romanian":"Rumana","Russian Sign Language":"Rusa gestlingvo","Russian":"Rusa","Saudi Arabian Sign Language":"Saudarabuja gestlingvo","South African Sign Language":"Sudafrika gestlingvo","Sinhala":"Sinhala","Slovak":"Slovaka","Slovenian":"Slovena","Northern Sami":"Nordlapona","Samoan":"Samoa","Shona":"Åœona","Sindhi":"Sinda","Somali":"Somala","Southern Sotho":"Sudsota","Spanish":"Hispana","Albanian":"Albana","Sardinian":"Sarda","Serbian":"Serba","Swati":"Svazia","Sundanese":"Sunda","Swahili (macrolanguage)":"Svahila","Swedish":"Sveda","Swedish Sign Language":"Sveda gestlingvo","Tahitian":"Tahitia","Tamil":"Tamula","Tatar":"Tatara","Telugu":"Telugua","Tajik":"TaÄika","Tagalog":"Tagaloga","Thai":"Taja","Klingon":"Klingona","Tonga (Tonga Islands)":"Tonga","Tswana":"Cvana","Tsonga":"Conga","Turkmen":"Turkmena","Turkish":"Turka","Uighur":"Ujgura","Ukrainian":"Ukrajna","Urdu":"Urdua","Uzbek":"Uzbeka","Venda":"Vendaa","Vietnamese":"Vjetnama","Walloon":"Valona","Wolof":"Volofa","Xhosa":"Kosa","Yiddish":"Jido","Yoruba":"Joruba","Zhuang":"Ĉuanga","Chinese":"Ĉina","Zulu":"Zulua"} \ No newline at end of file {"Music":"Muziko","Films":"Filmoj","Vehicles":"Veturiloj","Art":"Arto","Sports":"Sporto","Travels":"VojaÄado","Gaming":"Ludoj","People":"Homoj","Comedy":"Komedio","Entertainment":"Amuzo","News & Politics":"Novaĵoj kaj politiko","How To":"Instrukcioj","Education":"Instruado","Activism":"Aktivismo","Science & Technology":"Scienco Ï— teÄ¥nikaro","Animals":"Bestoj","Kids":"Infanoj","Food":"ManÄo","Attribution":"Atribuite","Attribution - Share Alike":"Atribuite – Samkondiĉe","Attribution - No Derivatives":"Atribuite – Nemodifite","Attribution - Non Commercial":"Atribuite – Nekomerce","Attribution - Non Commercial - Share Alike":"Atribuite – Nekomerce – Samkondiĉe","Attribution - Non Commercial - No Derivatives":"Atribuite – Nekomerce – Nemodifite","Public Domain Dedication":"Dediĉo al publika posedo","Public":"Publika","Unlisted":"Nelistigata","Private":"Privata","Success":"Sukcesis","Failed":"Malsukcesis","Misc":"Diversaĵoj","Unknown":"Nekonata","Afar":"Afara","Abkhazian":"AbÄ¥aza","Afrikaans":"Afrikansa","Akan":"Akana","Amharic":"Amhara","Arabic":"Araba","Aragonese":"Aragona","American Sign Language":"Usona gestlingvo","Assamese":"Asama","Avaric":"Avara","Kotava":"Kotavo","Aymara":"Ajmara","Azerbaijani":"AzerbajÄana","Bashkir":"BaÅkira","Bambara":"Bambara","Belarusian":"Belorusa","Bengali":"Bengala","British Sign Language":"Brita gestlingvo","Bislama":"Bislama","Tibetan":"Tibeta","Bosnian":"Bosna","Breton":"Bretona","Bulgarian":"Bulgara","Brazilian Sign Language":"Brazila gestlingvo","Catalan":"Kataluna","Czech":"ĈeÄ¥a","Chamorro":"Ĉamora","Chechen":"Ĉeĉena","Chuvash":"ĈuvaÅa","Cornish":"Kornvala","Corsican":"Korsika","Czech Sign Language":"ĈeÄ¥a gestlingvo","Chinese Sign Language":"Ĉina gestlingvo","Welsh":"Kimra","Danish":"Dana","German":"Germana","Dhivehi":"Maldiva","Danish Sign Language":"Dana gestlingvo","Dzongkha":"Butana","Modern Greek (1453-)":"Novgreka","English":"Angla","Esperanto":"Esperanto","Estonian":"Estona","Basque":"EÅ­ska","Ewe":"Evea","Faroese":"Feroa","Persian":"Persa","Fijian":"FiÄia","Finnish":"Finna","French":"Franca","Western Frisian":"Okcidentfrisa","French Sign Language":"Franca gestlingvo","Fulah":"Fula","Scottish Gaelic":"Skotgaela","Irish":"Irlanda","Galician":"Galega","Manx":"Manksa","Guarani":"Gvarania","German Sign Language":"Germana gestlingvo","Gujarati":"GuÄarata","Haitian":"Haitia","Hausa":"HaÅ­sa","Serbo-Croatian":"Kroatserba","Hebrew":"Hebrea","Herero":"Herera","Hindi":"Hinda","Hiri Motu":"Hirimotua","Croatian":"Kroata","Hungarian":"Hungara","Armenian":"Armena","Igbo":"Igba","Sichuan Yi":"Jia","Inuktitut":"Inuktituta","Indonesian":"Indonezia","Inupiaq":"Inupiko","Icelandic":"Islanda","Italian":"Itala","Javanese":"Java","Lojban":"Loĵbano","Japanese":"Japana","Japanese Sign Language":"Japana gestlingvo","Kalaallisut":"Gronlanda","Kannada":"Kanara","Kashmiri":"KaÅmira","Georgian":"Kartvela","Kanuri":"Kanuria","Kazakh":"KazaÄ¥a","Khmer":"Kmera","Kirghiz":"Kirgiza","Komi":"Komia","Kongo":"Konga","Korean":"Korea","Kuanyama":"Kvanjama","Kurdish":"Kurda","Lao":"Laosa","Latvian":"Latva","Limburgan":"Limburga","Lingala":"Lingala","Lithuanian":"Litova","Luxembourgish":"Luksemburga","Marshallese":"MarÅalinsula","Malayalam":"Malajalama","Marathi":"Marata","Macedonian":"Makedona","Malagasy":"MalgaÅa","Maltese":"Malta","Mongolian":"Mongola","Maori":"Maoria","Malay (macrolanguage)":"Malaja","Burmese":"Birma","Nauru":"Naura","Navajo":"Navajo","South Ndebele":"Sudndebela","North Ndebele":"Nordndebela","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepala","Dutch":"Nederlanda","Norwegian Nynorsk":"Novnorvega","Norwegian BokmÃ¥l":"Bukmolo","Norwegian":"Norvega","Nyanja":"Ĉiĉeva","Ojibwa":"OÄibua","Oriya (macrolanguage)":"Orisa","Oromo":"Oroma","Ossetian":"Oseta","Panjabi":"PanÄaba","Pakistan Sign Language":"Pakistana gestlingvo","Polish":"Pola","Portuguese":"Portugala","Pushto":"PaÅtua","Quechua":"Keĉua","Romansh":"Romanĉa","Romanian":"Rumana","Russian Sign Language":"Rusa gestlingvo","Russian":"Rusa","Saudi Arabian Sign Language":"Saudarabuja gestlingvo","South African Sign Language":"Sudafrika gestlingvo","Sinhala":"Sinhala","Slovak":"Slovaka","Slovenian":"Slovena","Northern Sami":"Nordlapona","Samoan":"Samoa","Shona":"Åœona","Sindhi":"Sinda","Somali":"Somala","Southern Sotho":"Sudsota","Spanish":"Hispana","Albanian":"Albana","Sardinian":"Sarda","Serbian":"Serba","Swati":"Svazia","Sundanese":"Sunda","Swahili (macrolanguage)":"Svahila","Swedish":"Sveda","Swedish Sign Language":"Sveda gestlingvo","Tahitian":"Tahitia","Tamil":"Tamula","Tatar":"Tatara","Telugu":"Telugua","Tajik":"TaÄika","Tagalog":"Tagaloga","Thai":"Taja","Klingon":"Klingona","Tonga (Tonga Islands)":"Tonga","Tswana":"Cvana","Tsonga":"Conga","Turkmen":"Turkmena","Turkish":"Turka","Uighur":"Ujgura","Ukrainian":"Ukrajna","Urdu":"Urdua","Uzbek":"Uzbeka","Venda":"Vendaa","Vietnamese":"Vjetnama","Walloon":"Valona","Wolof":"Volofa","Xhosa":"Kosa","Yiddish":"Jido","Yoruba":"Joruba","Zhuang":"Ĉuanga","Chinese":"Ĉina","Zulu":"Zulua"} \ No newline at end of file
diff --git a/client/src/locale/target/server_es_ES.json b/client/src/locale/target/server_es_ES.json
index 21831df98..c8e6f5788 100644
--- a/client/src/locale/target/server_es_ES.json
+++ b/client/src/locale/target/server_es_ES.json
@@ -1 +1 @@
{"Music":"Música","Films":"Películas","Vehicles":"Transporte","Art":"Arte","Sports":"Deportes","Travels":"Viajes","Gaming":"Juegos","People":"Personalidades","Comedy":"Comedia","Entertainment":"Entretenimiento","News":"Noticias","How To":"Tutorial","Education":"Educación","Activism":"Activismo","Science & Technology":"Cienca & Tecnología","Animals":"Animales","Kids":"Niños","Food":"Cocina","Attribution":"Atribución","Attribution - Share Alike":"Atribución - Compartir Igual","Attribution - No Derivatives":"Atribución - No Derivadas","Attribution - Non Commercial":"Atribución - No Comercial","Attribution - Non Commercial - Share Alike":"Atribución - No Comercial - Compartir Igual","Attribution - Non Commercial - No Derivatives":"Atribución - No Comercial - No Derivadas","Public Domain Dedication":"Dominio Público","Public":"Público","Unlisted":"Sin listar","Private":"Privado","Published":"Pulicados","To transcode":"Para codificar","To import":"Para importar","Pending":"Pendientes","Misc":"Miscelánea","Unknown":"Desconocido","Afar":"Afar","Abkhazian":"Abjasio","Afrikaans":"Afrikáans","Akan":"Acano","Amharic":"Amhárico","Arabic":"Ãrabe","Aragonese":"Aragonés","American Sign Language":"Lengua de signos americana","Assamese":"Asamés","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aimara","Azerbaijani":"Azerí","Bashkir":"Baskir","Bambara":"Bambara","Belarusian":"Bielorruso","Bengali":"Bengalí","British Sign Language":"Lenga de signos británica","Bislama":"Bislama","Tibetan":"Tibetano","Bosnian":"Bosnio","Breton":"Bretón","Bulgarian":"Búlgaro","Brazilian Sign Language":"Lengua de signos brasileña","Catalan":"Catalán","Czech":"Checo","Chamorro":"Chamorro","Chechen":"Checheno","Chuvash":"Chuvasio","Cornish":"Córnico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Lengua de signos checa","Chinese Sign Language":"Lengua de signos china","Welsh":"Gaélico","Danish":"Danés","German":"Alemán","Dhivehi":"Maldivo","Danish Sign Language":"Lengua de signos danesa","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Griego moderno","English":"Inglés","Esperanto":"Esperanto","Estonian":"Estonio","Basque":"Euskera","Ewe":"Ewé","Faroese":"Feroés","Persian":"Persa","Fijian":"Fiyiano","Finnish":"Finés","French":"Francés","Western Frisian":"Frisón occidental","French Sign Language":"Lengua de signos francesa","Fulah":"Fula","Scottish Gaelic":"Gaélico escocés","Irish":"Irlandés","Galician":"Gallego","Manx":"Manés","Guarani":"Guaraní","German Sign Language":"Lengua de signos alemana","Gujarati":"Gujaratí","Haitian":"Haitiano","Hausa":"Hausa","Serbo-Croatian":"Serbocroata","Hebrew":"Hebreo","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croata","Hungarian":"Húngaro","Armenian":"Armenio","Igbo":"Igbo","Sichuan Yi":"Nuosu","Inuktitut":"Inuit","Indonesian":"Indonesio","Inupiaq":"Iñupiaq","Icelandic":"Islandés","Italian":"Italiano","Javanese":"Javanés","Lojban":"Lojban","Japanese":"Japonés","Japanese Sign Language":"Lengua de signos japonesa","Kalaallisut":"Kalaallisut","Kannada":"Canarés","Kashmiri":"Cachemir","Georgian":"Georgiano","Kanuri":"Kanurí","Kazakh":"Kazajo","Khmer":"Camboyano","Kikuyu":"Kikuyú","Kinyarwanda":"Kiñaruanda","Kirghiz":"Kirguís","Komi":"Komi","Kongo":"Kongo","Korean":"Coreano","Kuanyama":"Kuanyama","Kurdish":"Kurdo","Lao":"Lao","Latvian":"Letón","Limburgan":"Limburgués","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Luxemburgués","Luba-Katanga":"Luba oriental","Ganda":"Luganda","Marshallese":"Mashalés","Malayalam":"Malabar","Marathi":"Maratí","Macedonian":"Macedonio","Malagasy":"Malgache","Maltese":"Maltés","Mongolian":"Mongol","Maori":"Maorí","Malay (macrolanguage)":"Malayo","Burmese":"Birmano","Nauru":"Nauruano","Navajo":"Navajo","South Ndebele":"Ndebele del sur","North Ndebele":"Ndebele del norte","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalí","Dutch":"Neerlandés","Norwegian Nynorsk":"Nynorsk","Norwegian BokmÃ¥l":"BokmÃ¥l","Norwegian":"Noruego","Nyanja":"Chichewa","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Oromo","Ossetian":"Osetio","Panjabi":"Panyabí","Pakistan Sign Language":"Lengua de signos pakistaní","Polish":"Polaco","Portuguese":"Portugués","Pushto":"Pastún","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Rumano","Russian Sign Language":"Lengua de signos rusa","Rundi":"Kirundí","Russian":"Ruso","Sango":"Sango","Saudi Arabian Sign Language":"Lengua de signos saudí","South African Sign Language":"Lengua de signos sudafricana","Sinhala":"Cingalés","Slovak":"Eslovaco","Slovenian":"Esloveno","Northern Sami":"Sami septentrional","Samoan":"Samoano","Shona":"Shona","Sindhi":"Sindi","Somali":"Somalí","Southern Sotho":"Soto meridional","Spanish":"Español","Albanian":"Albano","Sardinian":"Sardo","Serbian":"Serbio","Swati":"Suazi","Sundanese":"Sudanés","Swahili (macrolanguage)":"Suajili","Swedish":"Sueco","Swedish Sign Language":"Lengua de signos sueca","Tahitian":"Tahitiano","Tamil":"Támil","Tatar":"Tártaro","Telugu":"Télugu","Tajik":"Tayiko","Tagalog":"Tagalo","Thai":"Tailandés","Tigrinya":"Tigriña","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongano","Tswana":"Setsuana","Tsonga":"Tsonga","Turkmen":"Turcomano","Turkish":"Turco","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraniano","Urdu":"Urdu","Uzbek":"Uzbeko","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Valón","Wolof":"Wólof","Xhosa":"Xhosa","Yiddish":"Yidis","Yoruba":"Yoruba","Zhuang":"Chuang","Chinese":"Chino","Zulu":"Zulú"} \ No newline at end of file {"Music":"Música","Films":"Películas","Vehicles":"Transporte","Art":"Arte","Sports":"Deportes","Travels":"Viajes","Gaming":"Juegos","People":"Personalidades","Comedy":"Comedia","Entertainment":"Entretenimiento","News & Politics":"Noticias y política","How To":"Tutorial","Education":"Educación","Activism":"Activismo","Science & Technology":"Ciencia & Tecnología","Animals":"Animales","Kids":"Niños","Food":"Cocina","Attribution":"Atribución","Attribution - Share Alike":"Atribución - Compartir Igual","Attribution - No Derivatives":"Atribución - No Derivadas","Attribution - Non Commercial":"Atribución - No Comercial","Attribution - Non Commercial - Share Alike":"Atribución - No Comercial - Compartir Igual","Attribution - Non Commercial - No Derivatives":"Atribución - No Comercial - No Derivadas","Public Domain Dedication":"Dominio Público","Public":"Público","Unlisted":"Sin listar","Private":"Privado","Published":"Publicados","To transcode":"Para codificar","To import":"Para importar","Pending":"Pendientes","Success":"Subidos con éxito","Failed":"Fallidos","Misc":"Miscelánea","Unknown":"Desconocido","Afar":"Afar","Abkhazian":"Abjasio","Afrikaans":"Afrikáans","Akan":"Acano","Amharic":"Amhárico","Arabic":"Ãrabe","Aragonese":"Aragonés","American Sign Language":"Lenguaje de signos americano","Assamese":"Asamés","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aimara","Azerbaijani":"Azerí","Bashkir":"Baskir","Bambara":"Bambara","Belarusian":"Bielorruso","Bengali":"Bengalí","British Sign Language":"Lenguaje de signos británico","Bislama":"Bislama","Tibetan":"Tibetano","Bosnian":"Bosnio","Breton":"Bretón","Bulgarian":"Búlgaro","Brazilian Sign Language":"Lenguaje de signos brasileño","Catalan":"Catalán","Czech":"Checo","Chamorro":"Chamorro","Chechen":"Checheno","Chuvash":"Chuvasio","Cornish":"Córnico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Lenguaje de signos checo","Chinese Sign Language":"Lenguaje de signos chino","Welsh":"Gaélico","Danish":"Danés","German":"Alemán","Dhivehi":"Maldivo","Danish Sign Language":"Lenguaje de signos danés","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Griego moderno","English":"Inglés","Esperanto":"Esperanto","Estonian":"Estonio","Basque":"Euskera","Ewe":"Ewé","Faroese":"Feroés","Persian":"Persa","Fijian":"Fiyiano","Finnish":"Finés","French":"Francés","Western Frisian":"Frisón occidental","French Sign Language":"Lenguaje de signos francés","Fulah":"Fula","Scottish Gaelic":"Gaélico escocés","Irish":"Irlandés","Galician":"Gallego","Manx":"Manés","Guarani":"Guaraní","German Sign Language":"Lenguaje de signos alemán","Gujarati":"Gujaratí","Haitian":"Haitiano","Hausa":"Hausa","Serbo-Croatian":"Serbocroata","Hebrew":"Hebreo","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croata","Hungarian":"Húngaro","Armenian":"Armenio","Igbo":"Igbo","Sichuan Yi":"Nuosu","Inuktitut":"Inuit","Indonesian":"Indonesio","Inupiaq":"Iñupiaq","Icelandic":"Islandés","Italian":"Italiano","Javanese":"Javanés","Lojban":"Lojban","Japanese":"Japonés","Japanese Sign Language":"Lenguaje de signos japonés","Kalaallisut":"Kalaallisut","Kannada":"Canarés","Kashmiri":"Cachemir","Georgian":"Georgiano","Kanuri":"Kanurí","Kazakh":"Kazajo","Khmer":"Camboyano","Kikuyu":"Kikuyú","Kinyarwanda":"Kiñaruanda","Kirghiz":"Kirguís","Komi":"Komi","Kongo":"Kongo","Korean":"Coreano","Kuanyama":"Kuanyama","Kurdish":"Kurdo","Lao":"Lao","Latvian":"Letón","Limburgan":"Limburgués","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Luxemburgués","Luba-Katanga":"Luba oriental","Ganda":"Luganda","Marshallese":"Mashalés","Malayalam":"Malabar","Marathi":"Maratí","Macedonian":"Macedonio","Malagasy":"Malgache","Maltese":"Maltés","Mongolian":"Mongol","Maori":"Maorí","Malay (macrolanguage)":"Malayo","Burmese":"Birmano","Nauru":"Nauruano","Navajo":"Navajo","South Ndebele":"Ndebele del sur","North Ndebele":"Ndebele del norte","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalí","Dutch":"Neerlandés","Norwegian Nynorsk":"Nynorsk","Norwegian BokmÃ¥l":"BokmÃ¥l","Norwegian":"Noruego","Nyanja":"Chichewa","Occitan":"Occitano","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Oromo","Ossetian":"Osetio","Panjabi":"Panyabí","Pakistan Sign Language":"Lenguaje de signos pakistaní","Polish":"Polaco","Portuguese":"Portugués","Pushto":"Pastún","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Rumano","Russian Sign Language":"Lenguaje de signos ruso","Rundi":"Kirundí","Russian":"Ruso","Sango":"Sango","Saudi Arabian Sign Language":"Lenguaje de signos saudí","South African Sign Language":"Lenguaje de signos sudafricana","Sinhala":"Cingalés","Slovak":"Eslovaco","Slovenian":"Esloveno","Northern Sami":"Sami septentrional","Samoan":"Samoano","Shona":"Shona","Sindhi":"Sindi","Somali":"Somalí","Southern Sotho":"Soto meridional","Spanish":"Español","Albanian":"Albano","Sardinian":"Sardo","Serbian":"Serbio","Swati":"Suazi","Sundanese":"Sudanés","Swahili (macrolanguage)":"Suajili","Swedish":"Sueco","Swedish Sign Language":"Lenguaje de signos sueca","Tahitian":"Tahitiano","Tamil":"Támil","Tatar":"Tártaro","Telugu":"Télugu","Tajik":"Tayiko","Tagalog":"Tagalo","Thai":"Tailandés","Tigrinya":"Tigriña","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongano","Tswana":"Setsuana","Tsonga":"Tsonga","Turkmen":"Turcomano","Turkish":"Turco","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraniano","Urdu":"Urdu","Uzbek":"Uzbeko","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Valón","Wolof":"Wólof","Xhosa":"Xhosa","Yiddish":"Yidis","Yoruba":"Yoruba","Zhuang":"Chuang","Chinese":"Chino","Zulu":"Zulú"} \ No newline at end of file
diff --git a/client/src/locale/target/server_eu_ES.json b/client/src/locale/target/server_eu_ES.json
index b725d4f55..1a867a7c4 100644
--- a/client/src/locale/target/server_eu_ES.json
+++ b/client/src/locale/target/server_eu_ES.json
@@ -1 +1 @@
{"Music":"Musika","Films":"Filmak","Vehicles":"Ibilgailuak","Art":"Artea","Sports":"Kirolak","Travels":"Bidaiak","Gaming":"Jolasak","People":"Jendea","Comedy":"Komedia","Entertainment":"Aisia","News":"Berriak","How To":"Argibideak","Education":"Hezkuntza","Activism":"Aktibismoa","Science & Technology":"Zientzia eta teknologia","Animals":"Animaliak","Kids":"Haurrak","Food":"Janaria","Attribution":"Atribuzioa","Attribution - Share Alike":"Atribuzioa - Partekatu berdin","Attribution - No Derivatives":"Atribuzioa - Eratorririk ez","Attribution - Non Commercial":"Atribuzioa - Ez komertziala","Attribution - Non Commercial - Share Alike":"Atribuzioa - Ez komertziala - Partekatu berdin","Attribution - Non Commercial - No Derivatives":"Atribuzioa - Ez komertziala - Eratorririk ez","Public Domain Dedication":"Domeinu publikoa","Public":"Publikoa","Unlisted":"Zerrendatu gabea","Private":"Pribatua","Published":"Argitaratua","To transcode":"Transkodetzeko","To import":"Inportatzeko","Pending":"Egiteke","Success":"Arrakasta","Failed":"Hutsa","Misc":"Denetarik","Unknown":"Ezezaguna","Afar":"Afar","Abkhazian":"Abkhaziera","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharera","Arabic":"Arabiera","Aragonese":"Aragoiera","American Sign Language":"Amerikako zeinu-hizkuntza ","Assamese":"Assamera","Avaric":"Avarera","Kotava":"Kotava","Aymara":"Aimara","Azerbaijani":"Azerbaijanera","Bashkir":"Baxkirera","Bambara":"Banbara","Belarusian":"Bielorrusiera","Bengali":"Bengalera","British Sign Language":"Britainiako zeinu-hizkuntza","Bislama":"Bislama","Tibetan":"Tibetera","Bosnian":"Bosniera","Breton":"Bretoiera","Bulgarian":"Bulgariera","Brazilian Sign Language":"Brasilgo zeinu-hizkuntza","Catalan":"Katalana","Czech":"Txekiera","Chamorro":"Chamorro","Chechen":"Txetxenera","Chuvash":"Txuvaxera","Cornish":"Kornubiera","Corsican":"Korsikera","Cree":"Cree","Czech Sign Language":"Txekiako zeinu-hizkuntza","Chinese Sign Language":"Txinako zeinu-hizkuntza","Welsh":"Galesa","Danish":"Daniera","German":"Alemana","Dhivehi":"Dhivehi (maldivera) ","Danish Sign Language":"Danimarkako zeinu-hizkuntza","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Greziera moernoa (1453-)","English":"Ingelesa","Esperanto":"Esperantoa","Estonian":"Estoniera","Basque":"Euskara","Ewe":"Eweera","Faroese":"Faroera","Persian":"Persiera","Fijian":"Fijiera","Finnish":"Suomiera","French":"Frantsesa","Western Frisian":"Mendebaldeko frisiera","French Sign Language":"Frantziako zeinu-hizkuntza","Fulah":"Fula","Scottish Gaelic":"Eskoziako gaelikoa","Irish":"Irlandera","Galician":"Galiziera","Manx":"Manera","Guarani":"Guaraniera","German Sign Language":"Alemaniako zeinu-hizkuntza","Gujarati":"Gujaratera","Haitian":"Haitiko kreolera","Hausa":"Hausa","Serbo-Croatian":"Serbokroaziera ","Hebrew":"Hebreera","Herero":"Hereroera","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Kroaziera","Hungarian":"Hungariera","Armenian":"Armeniera","Igbo":"Igboera","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitutera","Indonesian":"Indonesiera","Inupiaq":"Inupiaq","Icelandic":"Islandiera","Italian":"Italiera","Javanese":"Javera","Lojban":"Lojban","Japanese":"Japoniera","Japanese Sign Language":"Japoniako zeinu-hizkuntza","Kalaallisut":"Groenlandiera","Kannada":"Kannada","Kashmiri":"Kaxmirera","Georgian":"Georgiera / Kartveliera ","Kanuri":"Kanuri","Kazakh":"Kazakhera","Khmer":"Khmerera","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyaruanda","Kirghiz":"Kirgizera","Komi":"Komiera","Kongo":"Kikongo","Korean":"Koreera","Kuanyama":"Kuanyama","Kurdish":"Kurduera","Lao":"Laosera","Latvian":"Letoniera","Limburgan":"Limburgera","Lingala":"Lingala","Lithuanian":"Lituaniera","Luxembourgish":"Luxenburgera","Luba-Katanga":"Luba-Katanga","Ganda":"Luganda","Marshallese":"Marshallera","Malayalam":"Malabarera","Marathi":"Marathera","Macedonian":"Mazedoniera","Malagasy":"Malgaxe","Maltese":"Maltera","Mongolian":"Mongoliera","Maori":"Maoriera","Malay (macrolanguage)":"Malaysiera (makro-hizkuntza)","Burmese":"Birmaniera","Nauru":"Nauruera","Navajo":"Navajoa","South Ndebele":"Hego Ndebele","North Ndebele":"Ipar Ndebele","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalera (makro-hizkuntza)","Dutch":"Nederlandera","Norwegian Nynorsk":"Norvegiako Nynorsk","Norwegian Bokmål":"Norvegiako Bokmål","Norwegian":"Norvegiera","Nyanja":"Txewera","Occitan":"Okzitaniera","Ojibwa":"Ojibwera","Oriya (macrolanguage)":"Oriya (makro-hizkuntza)","Oromo":"Oromoera","Ossetian":"Osetiera","Panjabi":"Punjabera","Pakistan Sign Language":"Pakistango zeinu-hizkuntza","Polish":"Poloniera","Portuguese":"Portugesa","Pushto":"Paxtuera","Quechua":"Kitxua","Romansh":"Erromantxea","Romanian":"Errumaniera","Russian Sign Language":"Errusiako zeinu-hizkuntza","Rundi":"Kirundi","Russian":"Errusiera","Sango":"Sango","Saudi Arabian Sign Language":"Saudi Arabiako zeinu-hizkuntza","South African Sign Language":"Hego Afrikako zeinu-hizkuntza","Sinhala":"Sinhala","Slovak":"Eslovakiera","Slovenian":"Esloveniera","Northern Sami":"Ipar Samiera","Samoan":"Samoera","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somaliera","Southern Sotho":"Sothoera","Spanish":"Espainiera","Albanian":"Albaniera","Sardinian":"Sardiniera","Serbian":"Serbiera","Swati":"Swaziera","Sundanese":"Sundera","Swahili (macrolanguage)":"Swahili (makro-hizkuntza)","Swedish":"Suediera","Swedish Sign Language":"Suediako zeinu-hizkuntza","Tahitian":"Maoriera","Tamil":"Tamilera","Tatar":"Tatarera","Telugu":"Telugu","Tajik":"Tajikera","Tagalog":"Tagaloa","Thai":"Thailandiera","Tigrinya":"Tigrinyera","Klingon":"Klingon","Tonga (Tonga Islands)":"Tonga (Tonga irlak)","Tswana":"Tswanera","Tsonga":"Tsongera","Turkmen":"Turkmenera","Turkish":"Turkiera","Twi":"Twi","Uighur":"Uigurrera","Ukrainian":"Ukrainera","Urdu":"Urduera","Uzbek":"Uzbekera","Venda":"Vendera","Vietnamese":"Vietnamera","Walloon":"Valoniera","Wolof":"Wolofera","Xhosa":"Xhosera","Yiddish":"Yiddish","Yoruba":"Jorubera","Zhuang":"Zhuang","Chinese":"Txinera","Zulu":"Zuluera"} \ No newline at end of file {"Music":"Musika","Films":"Filmak","Vehicles":"Ibilgailuak","Art":"Artea","Sports":"Kirolak","Travels":"Bidaiak","Gaming":"Jolasak","People":"Jendea","Comedy":"Komedia","Entertainment":"Aisia","News & Politics":"Berriak eta politika","How To":"Argibideak","Education":"Hezkuntza","Activism":"Aktibismoa","Science & Technology":"Zientzia eta teknologia","Animals":"Animaliak","Kids":"Haurrak","Food":"Janaria","Attribution":"Atribuzioa","Attribution - Share Alike":"Atribuzioa - Partekatu berdin","Attribution - No Derivatives":"Atribuzioa - Eratorririk ez","Attribution - Non Commercial":"Atribuzioa - Ez komertziala","Attribution - Non Commercial - Share Alike":"Atribuzioa - Ez komertziala - Partekatu berdin","Attribution - Non Commercial - No Derivatives":"Atribuzioa - Ez komertziala - Eratorririk ez","Public Domain Dedication":"Domeinu publikoa","Public":"Publikoa","Unlisted":"Zerrendatu gabea","Private":"Pribatua","Published":"Argitaratua","To transcode":"Transkodetzeko","To import":"Inportatzeko","Pending":"Egiteke","Success":"Arrakasta","Failed":"Hutsa","Misc":"Denetarik","Unknown":"Ezezaguna","Afar":"Afar","Abkhazian":"Abkhaziera","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharera","Arabic":"Arabiera","Aragonese":"Aragoiera","American Sign Language":"Amerikako zeinu-hizkuntza ","Assamese":"Assamera","Avaric":"Avarera","Kotava":"Kotava","Aymara":"Aimara","Azerbaijani":"Azerbaijanera","Bashkir":"Baxkirera","Bambara":"Banbara","Belarusian":"Bielorrusiera","Bengali":"Bengalera","British Sign Language":"Britainiako zeinu-hizkuntza","Bislama":"Bislama","Tibetan":"Tibetera","Bosnian":"Bosniera","Breton":"Bretoiera","Bulgarian":"Bulgariera","Brazilian Sign Language":"Brasilgo zeinu-hizkuntza","Catalan":"Katalana","Czech":"Txekiera","Chamorro":"Chamorro","Chechen":"Txetxenera","Chuvash":"Txuvaxera","Cornish":"Kornubiera","Corsican":"Korsikera","Cree":"Cree","Czech Sign Language":"Txekiako zeinu-hizkuntza","Chinese Sign Language":"Txinako zeinu-hizkuntza","Welsh":"Galesa","Danish":"Daniera","German":"Alemana","Dhivehi":"Dhivehi (maldivera) ","Danish Sign Language":"Danimarkako zeinu-hizkuntza","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Greziera moernoa (1453-)","English":"Ingelesa","Esperanto":"Esperantoa","Estonian":"Estoniera","Basque":"Euskara","Ewe":"Eweera","Faroese":"Faroera","Persian":"Persiera","Fijian":"Fijiera","Finnish":"Suomiera","French":"Frantsesa","Western Frisian":"Mendebaldeko frisiera","French Sign Language":"Frantziako zeinu-hizkuntza","Fulah":"Fula","Scottish Gaelic":"Eskoziako gaelikoa","Irish":"Irlandera","Galician":"Galiziera","Manx":"Manera","Guarani":"Guaraniera","German Sign Language":"Alemaniako zeinu-hizkuntza","Gujarati":"Gujaratera","Haitian":"Haitiko kreolera","Hausa":"Hausa","Serbo-Croatian":"Serbokroaziera ","Hebrew":"Hebreera","Herero":"Hereroera","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Kroaziera","Hungarian":"Hungariera","Armenian":"Armeniera","Igbo":"Igboera","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitutera","Indonesian":"Indonesiera","Inupiaq":"Inupiaq","Icelandic":"Islandiera","Italian":"Italiera","Javanese":"Javera","Lojban":"Lojban","Japanese":"Japoniera","Japanese Sign Language":"Japoniako zeinu-hizkuntza","Kalaallisut":"Groenlandiera","Kannada":"Kannada","Kashmiri":"Kaxmirera","Georgian":"Georgiera / Kartveliera ","Kanuri":"Kanuri","Kazakh":"Kazakhera","Khmer":"Khmerera","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyaruanda","Kirghiz":"Kirgizera","Komi":"Komiera","Kongo":"Kikongo","Korean":"Koreera","Kuanyama":"Kuanyama","Kurdish":"Kurduera","Lao":"Laosera","Latvian":"Letoniera","Limburgan":"Limburgera","Lingala":"Lingala","Lithuanian":"Lituaniera","Luxembourgish":"Luxenburgera","Luba-Katanga":"Luba-Katanga","Ganda":"Luganda","Marshallese":"Marshallera","Malayalam":"Malabarera","Marathi":"Marathera","Macedonian":"Mazedoniera","Malagasy":"Malgaxe","Maltese":"Maltera","Mongolian":"Mongoliera","Maori":"Maoriera","Malay (macrolanguage)":"Malaysiera (makro-hizkuntza)","Burmese":"Birmaniera","Nauru":"Nauruera","Navajo":"Navajoa","South Ndebele":"Hego Ndebele","North Ndebele":"Ipar Ndebele","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalera (makro-hizkuntza)","Dutch":"Nederlandera","Norwegian Nynorsk":"Norvegiako Nynorsk","Norwegian Bokmål":"Norvegiako Bokmål","Norwegian":"Norvegiera","Nyanja":"Txewera","Occitan":"Okzitaniera","Ojibwa":"Ojibwera","Oriya (macrolanguage)":"Oriya (makro-hizkuntza)","Oromo":"Oromoera","Ossetian":"Osetiera","Panjabi":"Punjabera","Pakistan Sign Language":"Pakistango zeinu-hizkuntza","Polish":"Poloniera","Portuguese":"Portugesa","Pushto":"Paxtuera","Quechua":"Kitxua","Romansh":"Erromantxea","Romanian":"Errumaniera","Russian Sign Language":"Errusiako zeinu-hizkuntza","Rundi":"Kirundi","Russian":"Errusiera","Sango":"Sango","Saudi Arabian Sign Language":"Saudi Arabiako zeinu-hizkuntza","South African Sign Language":"Hego Afrikako zeinu-hizkuntza","Sinhala":"Sinhala","Slovak":"Eslovakiera","Slovenian":"Esloveniera","Northern Sami":"Ipar Samiera","Samoan":"Samoera","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somaliera","Southern Sotho":"Sothoera","Spanish":"Espainiera","Albanian":"Albaniera","Sardinian":"Sardiniera","Serbian":"Serbiera","Swati":"Swaziera","Sundanese":"Sundera","Swahili (macrolanguage)":"Swahili (makro-hizkuntza)","Swedish":"Suediera","Swedish Sign Language":"Suediako zeinu-hizkuntza","Tahitian":"Maoriera","Tamil":"Tamilera","Tatar":"Tatarera","Telugu":"Telugu","Tajik":"Tajikera","Tagalog":"Tagaloa","Thai":"Thailandiera","Tigrinya":"Tigrinyera","Klingon":"Klingon","Tonga (Tonga Islands)":"Tonga (Tonga irlak)","Tswana":"Tswanera","Tsonga":"Tsongera","Turkmen":"Turkmenera","Turkish":"Turkiera","Twi":"Twi","Uighur":"Uigurrera","Ukrainian":"Ukrainera","Urdu":"Urduera","Uzbek":"Uzbekera","Venda":"Vendera","Vietnamese":"Vietnamera","Walloon":"Valoniera","Wolof":"Wolofera","Xhosa":"Xhosera","Yiddish":"Yiddish","Yoruba":"Jorubera","Zhuang":"Zhuang","Chinese":"Txinera","Zulu":"Zuluera"} \ No newline at end of file
diff --git a/client/src/locale/target/server_fr_FR.json b/client/src/locale/target/server_fr_FR.json
index f575556a2..64762b575 100644
--- a/client/src/locale/target/server_fr_FR.json
+++ b/client/src/locale/target/server_fr_FR.json
@@ -1 +1 @@
{"Music":"Musiques","Films":"Films","Vehicles":"Transport","Art":"Art","Sports":"Sports","Travels":"Voyages","Gaming":"Jeux vidéos","People":"Personnalités","Comedy":"Humour","Entertainment":"Divertissement","News":"Actualités","How To":"Tutoriels","Education":"Éducation","Activism":"Militantisme","Science & Technology":"Science & Technologie","Animals":"Animaux","Kids":"Enfants","Food":"Cuisine","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Partage dans les mêmes conditions","Attribution - No Derivatives":"Attribution - Pas d’œuvre dérivée","Attribution - Non Commercial":"Attribution - Utilisation non commerciale","Attribution - Non Commercial - Share Alike":"Attribution - Utilisation non commerciale - Partage dans les mêmes conditions","Attribution - Non Commercial - No Derivatives":"Attribution - Utilisation non commerciale - Pas d’œuvre dérivée","Public Domain Dedication":"Domaine public","Public":"Publique","Unlisted":"Non listée","Private":"Privée","Published":"Publiée","To transcode":"À transcoder","To import":"À importer","Pending":"En cours","Success":"Succès","Failed":"Échoué","Misc":"Divers","Unknown":"Inconnu","Afar":"Afar","Abkhazian":"Abkhaze","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharique","Arabic":"Arabe","Aragonese":"Aragonais","American Sign Language":"Langue des signes américaine","Assamese":"Assamais","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azéri","Bashkir":"Bachkir","Bambara":"Bambara","Belarusian":"Biélorusse","Bengali":"Bengali","British Sign Language":"Langue des signes britannique","Bislama":"Bichlamar","Tibetan":"Tibétain","Bosnian":"Bosniaque","Breton":"Breton","Bulgarian":"Bulgare","Brazilian Sign Language":"Langue des signes brésilienne","Catalan":"Catalan","Czech":"Tchèque","Chamorro":"Chamorro","Chechen":"Tchétchène","Chuvash":"Tchouvache","Cornish":"Cornique","Corsican":"Corse","Cree":"Cree","Czech Sign Language":"Langue des signes tchèque","Chinese Sign Language":"Langue des signes chinoise","Welsh":"Gallois","Danish":"Danois","German":"Allemand","Dhivehi":"Maldivien","Danish Sign Language":"Langue des signes danoise","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grec moderne (après 1453)","English":"Anglais","Esperanto":"Espéranto","Estonian":"Estonien","Basque":"Basque","Ewe":"Éwé","Faroese":"Féroïen","Persian":"Persan","Fijian":"Fidjien","Finnish":"Finnois","French":"Français","Western Frisian":"Frison occidental","French Sign Language":"Langue des signes française","Fulah":"Peul","Scottish Gaelic":"Gaélique","Irish":"Irlandais","Galician":"Galicien","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Langue des signes allemande","Gujarati":"Goudjrati","Haitian":"Haïtien","Hausa":"Haoussa","Serbo-Croatian":"Serbo-croate","Hebrew":"Hébreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croate","Hungarian":"Hongrois","Armenian":"Arménien","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonésien","Inupiaq":"Inupiaq","Icelandic":"Islandais","Italian":"Italien","Javanese":"Javanais","Lojban":"Lojban","Japanese":"Japonais","Japanese Sign Language":"Langue des signes japonaise","Kalaallisut":"Groenlandais","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Géorgien","Kanuri":"Kanouri","Kazakh":"Kazakh","Khmer":"Khmer central","Kikuyu":"Kikuyu","Kinyarwanda":"Rwanda","Kirghiz":"Kirghiz","Komi":"Kom","Kongo":"Kongo","Korean":"Coréen","Kuanyama":"Kuanyama","Kurdish":"Kurde","Lao":"Lao","Latvian":"Letton","Limburgan":"Limbourgeois","Lingala":"Lingala","Lithuanian":"Lituanien","Luxembourgish":"Luxembourgeois","Luba-Katanga":"Luba-katanga","Ganda":"Ganda","Marshallese":"Marshall","Malayalam":"Malayalam","Marathi":"Marathe","Macedonian":"Macédonien","Malagasy":"Malgache","Maltese":"Maltais","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malais","Burmese":"Birman","Nauru":"Nauruan","Navajo":"Navaho","South Ndebele":"Ndébélé du Sud","North Ndebele":"Ndébélé du Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Népalais","Dutch":"Néerlandais","Norwegian Nynorsk":"Norvégien nynorsk","Norwegian Bokmål":"Norvégien bokmål","Norwegian":"Norvégien","Nyanja":"Chichewa","Occitan":"Occitane","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Galla","Ossetian":"Ossète","Panjabi":"Pendjabi","Pakistan Sign Language":"Langue des signes pakistanaise","Polish":"Polonais","Portuguese":"Portugais","Pushto":"Pachto","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Roumain","Russian Sign Language":"Langue des signes russe","Rundi":"Rundi","Russian":"Russe","Sango":"Sango","Saudi Arabian Sign Language":"Langue des signes saoudienne","South African Sign Language":"Langue des signes sud-africaine","Sinhala":"Singhalais","Slovak":"Slovaque","Slovenian":"Slovène","Northern Sami":"Sami du Nord","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho du Sud","Spanish":"Espagnol","Albanian":"Albanais","Sardinian":"Sarde","Serbian":"Serbe","Swati":"Swati","Sundanese":"Soundanais","Swahili (macrolanguage)":"Swahili","Swedish":"Suédois","Swedish Sign Language":"Langue des signes suédoise","Tahitian":"Tahitien","Tamil":"Tamoul","Tatar":"Tatar","Telugu":"Télougou","Tajik":"Tadjik","Tagalog":"Tagalog","Thai":"Thaï","Tigrinya":"Tigrigna","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongan (Îles Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turkmène","Turkish":"Turc","Twi":"Twi","Uighur":"Ouïgour","Ukrainian":"Ukrainien","Urdu":"Ourdou","Uzbek":"Ouszbek","Venda":"Venda","Vietnamese":"Vietnamien","Walloon":"Wallon","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinois","Zulu":"Zoulou"} \ No newline at end of file {"Music":"Musiques","Films":"Films","Vehicles":"Transport","Art":"Art","Sports":"Sports","Travels":"Voyages","Gaming":"Jeux vidéos","People":"Personnalités","Comedy":"Humour","Entertainment":"Divertissement","News & Politics":"Actualité & Politique","How To":"Tutoriels","Education":"Éducation","Activism":"Militantisme","Science & Technology":"Science & Technologie","Animals":"Animaux","Kids":"Enfants","Food":"Cuisine","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Partage dans les mêmes conditions","Attribution - No Derivatives":"Attribution - Pas d’œuvre dérivée","Attribution - Non Commercial":"Attribution - Utilisation non commerciale","Attribution - Non Commercial - Share Alike":"Attribution - Utilisation non commerciale - Partage dans les mêmes conditions","Attribution - Non Commercial - No Derivatives":"Attribution - Utilisation non commerciale - Pas d’œuvre dérivée","Public Domain Dedication":"Domaine public","Public":"Publique","Unlisted":"Non listée","Private":"Privée","Published":"Publiée","To transcode":"À transcoder","To import":"À importer","Pending":"En cours","Success":"Succès","Failed":"Échoué","This video does not exist.":"Cette vidéo n'existe pas.","We cannot fetch the video. Please try again later.":"Nous ne pouvons pas récupérer la vidéo. Merci de réessayer plus tard.","Sorry":"Désolé","This video is not available because the remote instance is not responding.":"Cette vidéo n'est pas disponible car l'instance distante ne répond pas.","Misc":"Divers","Unknown":"Inconnu","Afar":"Afar","Abkhazian":"Abkhaze","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharique","Arabic":"Arabe","Aragonese":"Aragonais","American Sign Language":"Langue des signes américaine","Assamese":"Assamais","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azéri","Bashkir":"Bachkir","Bambara":"Bambara","Belarusian":"Biélorusse","Bengali":"Bengali","British Sign Language":"Langue des signes britannique","Bislama":"Bichlamar","Tibetan":"Tibétain","Bosnian":"Bosniaque","Breton":"Breton","Bulgarian":"Bulgare","Brazilian Sign Language":"Langue des signes brésilienne","Catalan":"Catalan","Czech":"Tchèque","Chamorro":"Chamorro","Chechen":"Tchétchène","Chuvash":"Tchouvache","Cornish":"Cornique","Corsican":"Corse","Cree":"Cree","Czech Sign Language":"Langue des signes tchèque","Chinese Sign Language":"Langue des signes chinoise","Welsh":"Gallois","Danish":"Danois","German":"Allemand","Dhivehi":"Maldivien","Danish Sign Language":"Langue des signes danoise","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grec moderne (après 1453)","English":"Anglais","Esperanto":"Espéranto","Estonian":"Estonien","Basque":"Basque","Ewe":"Éwé","Faroese":"Féroïen","Persian":"Persan","Fijian":"Fidjien","Finnish":"Finnois","French":"Français","Western Frisian":"Frison occidental","French Sign Language":"Langue des signes française","Fulah":"Peul","Scottish Gaelic":"Gaélique","Irish":"Irlandais","Galician":"Galicien","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Langue des signes allemande","Gujarati":"Goudjrati","Haitian":"Haïtien","Hausa":"Haoussa","Serbo-Croatian":"Serbo-croate","Hebrew":"Hébreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croate","Hungarian":"Hongrois","Armenian":"Arménien","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonésien","Inupiaq":"Inupiaq","Icelandic":"Islandais","Italian":"Italien","Javanese":"Javanais","Lojban":"Lojban","Japanese":"Japonais","Japanese Sign Language":"Langue des signes japonaise","Kalaallisut":"Groenlandais","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Géorgien","Kanuri":"Kanouri","Kazakh":"Kazakh","Khmer":"Khmer central","Kikuyu":"Kikuyu","Kinyarwanda":"Rwanda","Kirghiz":"Kirghiz","Komi":"Kom","Kongo":"Kongo","Korean":"Coréen","Kuanyama":"Kuanyama","Kurdish":"Kurde","Lao":"Lao","Latvian":"Letton","Limburgan":"Limbourgeois","Lingala":"Lingala","Lithuanian":"Lituanien","Luxembourgish":"Luxembourgeois","Luba-Katanga":"Luba-katanga","Ganda":"Ganda","Marshallese":"Marshall","Malayalam":"Malayalam","Marathi":"Marathe","Macedonian":"Macédonien","Malagasy":"Malgache","Maltese":"Maltais","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malais","Burmese":"Birman","Nauru":"Nauruan","Navajo":"Navaho","South Ndebele":"Ndébélé du Sud","North Ndebele":"Ndébélé du Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Népalais","Dutch":"Néerlandais","Norwegian Nynorsk":"Norvégien nynorsk","Norwegian Bokmål":"Norvégien bokmål","Norwegian":"Norvégien","Nyanja":"Chichewa","Occitan":"Occitane","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Galla","Ossetian":"Ossète","Panjabi":"Pendjabi","Pakistan Sign Language":"Langue des signes pakistanaise","Polish":"Polonais","Portuguese":"Portugais","Pushto":"Pachto","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Roumain","Russian Sign Language":"Langue des signes russe","Rundi":"Rundi","Russian":"Russe","Sango":"Sango","Saudi Arabian Sign Language":"Langue des signes saoudienne","South African Sign Language":"Langue des signes sud-africaine","Sinhala":"Singhalais","Slovak":"Slovaque","Slovenian":"Slovène","Northern Sami":"Sami du Nord","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho du Sud","Spanish":"Espagnol","Albanian":"Albanais","Sardinian":"Sarde","Serbian":"Serbe","Swati":"Swati","Sundanese":"Soundanais","Swahili (macrolanguage)":"Swahili","Swedish":"Suédois","Swedish Sign Language":"Langue des signes suédoise","Tahitian":"Tahitien","Tamil":"Tamoul","Tatar":"Tatar","Telugu":"Télougou","Tajik":"Tadjik","Tagalog":"Tagalog","Thai":"Thaï","Tigrinya":"Tigrigna","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongan (Îles Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turkmène","Turkish":"Turc","Twi":"Twi","Uighur":"Ouïgour","Ukrainian":"Ukrainien","Urdu":"Ourdou","Uzbek":"Ouszbek","Venda":"Venda","Vietnamese":"Vietnamien","Walloon":"Wallon","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinois","Zulu":"Zoulou"} \ No newline at end of file
diff --git a/client/src/locale/target/server_gl_ES.xml b/client/src/locale/target/server_gl_ES.xml
index 33aaf78dd..6ae3a16b4 100644
--- a/client/src/locale/target/server_gl_ES.xml
+++ b/client/src/locale/target/server_gl_ES.xml
@@ -43,10 +43,6 @@
43 <source>Entertainment</source> 43 <source>Entertainment</source>
44 <target>Entretemento</target> 44 <target>Entretemento</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="News">
47 <source>News</source>
48 <target>Novas</target>
49 </trans-unit>
50 <trans-unit id="How To"> 46 <trans-unit id="How To">
51 <source>How To</source> 47 <source>How To</source>
52 <target>Manuais</target> 48 <target>Manuais</target>
diff --git a/client/src/locale/target/server_it_IT.json b/client/src/locale/target/server_it_IT.json
new file mode 100644
index 000000000..6586f622e
--- /dev/null
+++ b/client/src/locale/target/server_it_IT.json
@@ -0,0 +1 @@
{"Music":"Musica","Films":"Film","Vehicles":"Veicoli","Art":"Arte","Sports":"Sport","Travels":"Viaggi","Gaming":"Giochi","People":"Persone","Comedy":"Commedia","Entertainment":"Intrattenimento","News & Politics":"Notizie & Politica","How To":"Come fare","Education":"Educazione","Activism":"Attivismo","Science & Technology":"Scienza & Tecnologia","Animals":"Animali","Kids":"Bambini","Food":"Cibo","Attribution":"Attribuzione","Attribution - Share Alike":"Attribuzione - Condividi Allo Stesso Modo","Attribution - No Derivatives":"Attribuzione - Non Opere Derivate","Attribution - Non Commercial":"Attribuzione - Non Commerciale","Attribution - Non Commercial - Share Alike":"Attribuzione - Non Commerciale - Condividi Allo Stesso Modo","Attribution - Non Commercial - No Derivatives":"Attribuzione - Non Commerciale - Non Opere Derivate","Public Domain Dedication":"Pubblico Dominio","Public":"Pubblico","Unlisted":"Non elencato","Private":"Privato","Published":"Pubblicato","To transcode":"Da codificare","To import":"Da importare","Pending":"In sospeso","Success":"Successo","Failed":"Fallito","Misc":"Altro","Unknown":"Sconosciuto","Afar":"Afar","Abkhazian":"Abcaso","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amarico","Arabic":"Arabo","Aragonese":"Aragonese","American Sign Language":"Lingua dei Segni Americana","Assamese":"Assamese","Avaric":"Avarico","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azero","Bashkir":"Bashkir","Bambara":"Bambara","Belarusian":"Bielorusso","Bengali":"Bengalese","British Sign Language":"Lingua dei Segni Britannica","Bislama":"Bislama","Tibetan":"Tibetano","Bosnian":"Bosniaco","Breton":"Bretone","Bulgarian":"Bulgaro","Brazilian Sign Language":"Lingua dei Segni Brasiliana","Catalan":"Catalano","Czech":"Ceco","Chamorro":"Chamorro","Chechen":"Ceceno","Chuvash":"Ciuvascio","Cornish":"Cornico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Lingua dei Segni Ceca","Chinese Sign Language":"Lingua dei Segni Cinese","Welsh":"Gallese","Danish":"Danese","German":"Tedesco","Dhivehi":"Dhivehi","Danish Sign Language":"Lingua dei Segni Danese","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Greco Moderno (1453-)","English":"Inglese","Esperanto":"Esperanto","Estonian":"Estone","Basque":"Basco","Ewe":"Ewe","Faroese":"Faroese","Persian":"Persiano","Fijian":"Fijiano","Finnish":"Finlandese","French":"Francese","Western Frisian":"Frisone Occidentale","French Sign Language":"Lingua dei Segni Francese","Fulah":"Fula","Scottish Gaelic":"Gaelico Scozzese","Irish":"Irlandese","Galician":"Galiziano","Manx":"Mannese","Guarani":"Guarani","German Sign Language":"Lingua dei Segni Tedesca","Gujarati":"Gujarati","Haitian":"Haitiano","Hausa":"Hausa","Serbo-Croatian":"Serbocroato","Hebrew":"Ebraico","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Croato","Hungarian":"Ungherese","Armenian":"Armeno","Igbo":"Igbo","Sichuan Yi":"Sichuan Yi","Inuktitut":"Inuktitut","Indonesian":"Indonesiano","Inupiaq":"Inupiaq","Icelandic":"Islandese","Italian":"Italiano","Javanese":"Giavanese","Lojban":"Lojban","Japanese":"Giapponese","Japanese Sign Language":"Lingua dei Segni Giapponese","Kalaallisut":"Kalaallisut","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Georgiano","Kanuri":"Kanuri","Kazakh":"Kazako","Khmer":"Khmer","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Kirghiso","Komi":"Komi","Kongo":"Kongo","Korean":"Coreano","Kuanyama":"Kuanyama","Kurdish":"Curdo","Lao":"Lao","Latvian":"Lettone","Limburgan":"Limburghese","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Lussemburghese","Luba-Katanga":"Luba-Katanga","Ganda":"Ganda","Marshallese":"Marshallese","Malayalam":"Malayalam","Marathi":"Marathi","Macedonian":"Macedone","Malagasy":"Malgascio","Maltese":"Maltese","Mongolian":"Mongolo","Maori":"Maori","Malay (macrolanguage)":"Malay (macrolinguaggio)","Burmese":"Birmano","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele Meridionale","North Ndebele":"Ndebele Settentrionale","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalese (macrolinguaggio)","Dutch":"Olandese","Norwegian Nynorsk":"Norvegese Nynorsk","Norwegian Bokmål":"Norvegese Bokmål","Norwegian":"Norvegese","Nyanja":"Chewa","Occitan":"Occitano","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macrolinguaggio)","Oromo":"Oromo","Ossetian":"Osseto","Panjabi":"Punjabi","Pakistan Sign Language":"Lingua dei Segni Pakistana","Polish":"Polacco","Portuguese":"Portoghese","Pushto":"Pashto","Quechua":"Quechua","Romansh":"Romancio","Romanian":"Romeno","Russian Sign Language":"Lingua dei Segni Russa","Rundi":"Rundi","Russian":"Russo","Sango":"Sango","Saudi Arabian Sign Language":"Lingua dei Segni dell'Arabia Saudita","South African Sign Language":"Lingua dei Segni Sudafricana","Sinhala":"Singalese","Slovak":"Slovacco","Slovenian":"Sloveno","Northern Sami":"Sami Settentrionale","Samoan":"Samoano","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somalo","Southern Sotho":"Sotho Meridionale","Spanish":"Spagnolo","Albanian":"Albanese","Sardinian":"Sardo","Serbian":"Serbo","Swati":"Swati","Sundanese":"Sondanese","Swahili (macrolanguage)":"Swahili (macrolinguaggio)","Swedish":"Svedese","Swedish Sign Language":"Lingua dei Segni Svedese","Tahitian":"Tahitiano","Tamil":"Tamil","Tatar":"Tataro","Telugu":"Telugu","Tajik":"Tagico","Tagalog":"Tagalog","Thai":"Thai","Tigrinya":"Tigrino","Klingon":"Klingon","Tonga (Tonga Islands)":"Tonga (Isole delle Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turcmeno","Turkish":"Turco","Twi":"Twi","Uighur":"Uighuro","Ukrainian":"Ucraino","Urdu":"Urdu","Uzbek":"Uzbeco","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Vallone","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Cinese","Zulu":"Zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_nl_NL.xml b/client/src/locale/target/server_nl_NL.xml
index 7e7ce8f08..a53a90588 100644
--- a/client/src/locale/target/server_nl_NL.xml
+++ b/client/src/locale/target/server_nl_NL.xml
@@ -43,9 +43,9 @@
43 <source>Entertainment</source> 43 <source>Entertainment</source>
44 <target>Entertainment</target> 44 <target>Entertainment</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="News"> 46 <trans-unit id="News &amp; Politics">
47 <source>News</source> 47 <source>News &amp; Politics</source>
48 <target>Nieuws</target> 48 <target>Nieuws en Politiek</target>
49 </trans-unit> 49 </trans-unit>
50 <trans-unit id="How To"> 50 <trans-unit id="How To">
51 <source>How To</source> 51 <source>How To</source>
@@ -61,7 +61,7 @@
61 </trans-unit> 61 </trans-unit>
62 <trans-unit id="Science &amp; Technology"> 62 <trans-unit id="Science &amp; Technology">
63 <source>Science &amp; Technology</source> 63 <source>Science &amp; Technology</source>
64 <target>Wetenschap &amp; technologie</target> 64 <target>Wetenschap en technologie</target>
65 </trans-unit> 65 </trans-unit>
66 <trans-unit id="Animals"> 66 <trans-unit id="Animals">
67 <source>Animals</source> 67 <source>Animals</source>
@@ -81,7 +81,7 @@
81 </trans-unit> 81 </trans-unit>
82 <trans-unit id="Attribution - Share Alike"> 82 <trans-unit id="Attribution - Share Alike">
83 <source>Attribution - Share Alike</source> 83 <source>Attribution - Share Alike</source>
84 <target>Naamsvermelding – Gelijk Delen</target> 84 <target>Naamsvermelding – Gelijken Delen</target>
85 </trans-unit> 85 </trans-unit>
86 <trans-unit id="Attribution - No Derivatives"> 86 <trans-unit id="Attribution - No Derivatives">
87 <source>Attribution - No Derivatives</source> 87 <source>Attribution - No Derivatives</source>
@@ -115,9 +115,33 @@
115 <source>Private</source> 115 <source>Private</source>
116 <target>Privé</target> 116 <target>Privé</target>
117 </trans-unit> 117 </trans-unit>
118 <trans-unit id="Published">
119 <source>Published</source>
120 <target>Gepubliceerd</target>
121 </trans-unit>
122 <trans-unit id="To transcode">
123 <source>To transcode</source>
124 <target>Transcoden</target>
125 </trans-unit>
126 <trans-unit id="To import">
127 <source>To import</source>
128 <target>Importeren</target>
129 </trans-unit>
130 <trans-unit id="Pending">
131 <source>Pending</source>
132 <target>In behandeling</target>
133 </trans-unit>
134 <trans-unit id="Success">
135 <source>Success</source>
136 <target>Success</target>
137 </trans-unit>
138 <trans-unit id="Failed">
139 <source>Failed</source>
140 <target>Gefaald</target>
141 </trans-unit>
118 <trans-unit id="Misc"> 142 <trans-unit id="Misc">
119 <source>Misc</source> 143 <source>Misc</source>
120 <target>Diverse</target> 144 <target>Varia</target>
121 </trans-unit> 145 </trans-unit>
122 <trans-unit id="Unknown"> 146 <trans-unit id="Unknown">
123 <source>Unknown</source> 147 <source>Unknown</source>
diff --git a/client/src/locale/target/server_oc.json b/client/src/locale/target/server_oc.json
index 09f7b3d7f..2a12278d0 100644
--- a/client/src/locale/target/server_oc.json
+++ b/client/src/locale/target/server_oc.json
@@ -1 +1 @@
{"Music":"Musica","Films":"Films","Vehicles":"Veituras","Art":"Art","Sports":"Espòrts","Travels":"Viatges","Gaming":"Vidèo jòc","People":"Gent","Comedy":"Comèdia","Entertainment":"Léser ","News":"Actualitat","How To":"Demonstracions","Education":"Educacion","Activism":"Activisme","Science & Technology":"Sciéncia & Tecnologia","Animals":"Animals","Kids":"Mainatges","Food":"Manjar","Attribution":"Atribucion","Attribution - Share Alike":"Atribucion - Partejar a l’identic","Attribution - No Derivatives":"Atribucion - Cap de derivacion","Attribution - Non Commercial":"Atribucion - Pas comercial","Attribution - Non Commercial - Share Alike":"Atribucion - Pas comercial - Partejar a l’identic","Attribution - Non Commercial - No Derivatives":"Atribucion - Pas comercial - Cap de derivacion","Public Domain Dedication":"Domeni public","Public":"Public","Unlisted":"Pas listat","Private":"Privat","Published":"Publicada","To transcode":"De transcodar","To import":"D’importar","Pending":"En espèra","Success":"Reüssida","Failed":"Fracàs","Misc":"Divèrs","Unknown":"Desconegut","Afar":"Afar","Abkhazian":"Abcaz","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharic","Arabic":"Arabi","Aragonese":"Aragonés","American Sign Language":"Lenga de signes americana","Assamese":"Assamés","Avaric":"Avaric","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azèri","Bashkir":"Bashkir","Bambara":"Bambara","Belarusian":"Bielorús","Bengali":"Bengalin","British Sign Language":"Lenga de signes britanica","Bislama":"Bislama","Tibetan":"Tibetan","Bosnian":"Bosnian","Breton":"Breton","Bulgarian":"Bulgar","Brazilian Sign Language":"Lenga de signes brasiliana","Catalan":"Catalan","Czech":"Chèc","Chamorro":"Chamorro","Chechen":"Chenchèn","Chuvash":"Chuvash","Cornish":"Cornic","Corsican":"Còrs","Cree":"Cree","Czech Sign Language":"Lenga de signes chèca","Chinese Sign Language":"Lenga de signes chinesa","Welsh":"Galés","Danish":"Danés","German":"Alemand","Danish Sign Language":"Lenga de signes danesa","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grèc","English":"Anglés","Esperanto":"Esperanto","Estonian":"Estonian","Basque":"Basc","Ewe":"Ewe","Faroese":"Faroés","Persian":"Persan","Fijian":"Fijian","Finnish":"Finés","French":"Francés","Western Frisian":"Frison occitendal","French Sign Language":"Lenga de signes francesa","Fulah":"Fulah","Scottish Gaelic":"Gaelic escossés","Irish":"Irlandés","Galician":"Galician","Manx":"Manés","Guarani":"Guaraní","German Sign Language":"Lenga de signes alemanda","Gujarati":"Gujarati","Haitian":"Haitian","Hausa":"Hausa","Serbo-Croatian":"Sèrbocroat","Hebrew":"Ebrieu","Herero":"Herero","Hindi":"Indi","Hiri Motu":"Hiri Motu","Croatian":"Croat","Hungarian":"Ongrés","Armenian":"Armèni","Igbo":"Igbo","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitut","Indonesian":"Bahasa Indonesia","Inupiaq":"Inupiaq","Icelandic":"Islandés","Italian":"Italian","Javanese":"Javanés","Lojban":"Lojban","Japanese":"Japonés","Japanese Sign Language":"Lenga de signes japonesa","Kalaallisut":"Kalaallisut","Kannada":"Canarés","Georgian":"Georgian","Kanuri":"Kanuri","Kazakh":"Cazac","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Quirguiz","Komi":"Komi","Kongo":"Kongo","Korean":"Corean","Kuanyama":"Kuanyama","Kurdish":"Curd","Lao":"Laosian","Latvian":"Leton","Limburgan":"Limborgués","Lingala":"Lingala","Lithuanian":"Lituanian","Luxembourgish":"Luxemborgés","Luba-Katanga":"Luba-Katanga","Ganda":"Ganda","Marshallese":"Marshallés","Marathi":"Marathi","Macedonian":"Macedonian","Malagasy":"Malgash","Maltese":"Maltés","Mongolian":"Mongòl","Maori":"Maòri","Malay (macrolanguage)":"Malai (macrolengatge)","Burmese":"Birman","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele del Sud","North Ndebele":"Ndebele del Nòrd","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepali (macrolengatge)","Dutch":"Neerlandés","Norwegian Nynorsk":"Norvegian Nynorsk","Norwegian Bokmål":"Norvegian","Norwegian":"Norwegian","Nyanja":"Nyanja","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macrolengatge)","Oromo":"Oromo","Panjabi":"Panjabi","Polish":"Polonés","Portuguese":"Portugués","Pushto":"Pushto","Quechua":"Quíchoa","Romansh":"Romanch","Romanian":"Romanés","Russian Sign Language":"Lenga de signes russa","Rundi":"Rundi","Russian":"Rus","Sango":"Sango","South African Sign Language":"Lenga de signes d’Africa del Sud","Sinhala":"Singalés","Slovak":"Eslovac","Slovenian":"Eslovèn","Northern Sami":"Sami septentrional","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho meridional","Spanish":"Espanhòl","Albanian":"Albanés","Sardinian":"Sard","Serbian":"Sèrbe","Swati":"Swati","Sundanese":"Sodanés","Swahili (macrolanguage)":"Swahili (macrolengatge)","Swedish":"Suedés","Swedish Sign Language":"Lenga de signes suedesa","Tahitian":"Tahician","Tamil":"Tamil","Tatar":"Tatar","Telugu":"Telugu","Tajik":"Tajik","Tagalog":"Tagalòg","Thai":"Tailandés","Tigrinya":"Tigrinya","Klingon":"Klingon","Tonga (Tonga Islands)":"Tònga (islas Tònga)","Tswana":"Tswana","Turkmen":"Turcmèn","Turkish":"Turc","Uighur":"Oigors","Ukrainian":"Ucraïnian","Urdu":"Ordo","Uzbek":"Uzbec","Venda":"Venda","Vietnamese":"Vietnamian","Walloon":"Valon","Wolof":"Wolòf","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinés","Zulu":"Zulu"} \ No newline at end of file {"Music":"Musica","Films":"Films","Vehicles":"Veituras","Art":"Art","Sports":"Espòrts","Travels":"Viatges","Gaming":"Vidèo jòc","People":"Gent","Comedy":"Comèdia","Entertainment":"Léser ","News & Politics":"Actualitat e Politica","How To":"Demonstracions","Education":"Educacion","Activism":"Activisme","Science & Technology":"Sciéncia & Tecnologia","Animals":"Animals","Kids":"Mainatges","Food":"Manjar","Attribution":"Atribucion","Attribution - Share Alike":"Atribucion - Partejar a l’identic","Attribution - No Derivatives":"Atribucion - Cap de derivacion","Attribution - Non Commercial":"Atribucion - Pas comercial","Attribution - Non Commercial - Share Alike":"Atribucion - Pas comercial - Partejar a l’identic","Attribution - Non Commercial - No Derivatives":"Atribucion - Pas comercial - Cap de derivacion","Public Domain Dedication":"Domeni public","Public":"Public","Unlisted":"Pas listat","Private":"Privat","Published":"Publicada","To transcode":"De transcodar","To import":"D’importar","Pending":"En espèra","Success":"Reüssida","Failed":"Fracàs","Misc":"Divèrs","Unknown":"Desconegut","Afar":"Afar","Abkhazian":"Abcaz","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharic","Arabic":"Arabi","Aragonese":"Aragonés","American Sign Language":"Lenga de signes americana","Assamese":"Assamés","Avaric":"Avaric","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azèri","Bashkir":"Bashkir","Bambara":"Bambara","Belarusian":"Bielorús","Bengali":"Bengalin","British Sign Language":"Lenga de signes britanica","Bislama":"Bislama","Tibetan":"Tibetan","Bosnian":"Bosnian","Breton":"Breton","Bulgarian":"Bulgar","Brazilian Sign Language":"Lenga de signes brasiliana","Catalan":"Catalan","Czech":"Chèc","Chamorro":"Chamorro","Chechen":"Chenchèn","Chuvash":"Chuvash","Cornish":"Cornic","Corsican":"Còrs","Cree":"Cree","Czech Sign Language":"Lenga de signes chèca","Chinese Sign Language":"Lenga de signes chinesa","Welsh":"Galés","Danish":"Danés","German":"Alemand","Dhivehi":"Maldivian","Danish Sign Language":"Lenga de signes danesa","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grèc","English":"Anglés","Esperanto":"Esperanto","Estonian":"Estonian","Basque":"Basc","Ewe":"Ewe","Faroese":"Faroés","Persian":"Persan","Fijian":"Fijian","Finnish":"Finés","French":"Francés","Western Frisian":"Frison occitendal","French Sign Language":"Lenga de signes francesa","Fulah":"Fulah","Scottish Gaelic":"Gaelic escossés","Irish":"Irlandés","Galician":"Galician","Manx":"Manés","Guarani":"Guaraní","German Sign Language":"Lenga de signes alemanda","Gujarati":"Gujarati","Haitian":"Haitian","Hausa":"Hausa","Serbo-Croatian":"Sèrbocroat","Hebrew":"Ebrieu","Herero":"Herero","Hindi":"Indi","Hiri Motu":"Hiri Motu","Croatian":"Croat","Hungarian":"Ongrés","Armenian":"Armèni","Igbo":"Igbo","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitut","Indonesian":"Bahasa Indonesia","Inupiaq":"Inupiaq","Icelandic":"Islandés","Italian":"Italian","Javanese":"Javanés","Lojban":"Lojban","Japanese":"Japonés","Japanese Sign Language":"Lenga de signes japonesa","Kalaallisut":"Kalaallisut","Kannada":"Canarés","Kashmiri":"Cashmiri","Georgian":"Georgian","Kanuri":"Kanuri","Kazakh":"Cazac","Khmer":"Cmèr","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Quirguiz","Komi":"Komi","Kongo":"Kongo","Korean":"Corean","Kuanyama":"Kuanyama","Kurdish":"Curd","Lao":"Laosian","Latvian":"Leton","Limburgan":"Limborgués","Lingala":"Lingala","Lithuanian":"Lituanian","Luxembourgish":"Luxemborgés","Luba-Katanga":"Luba-Katanga","Ganda":"Ganda","Marshallese":"Marshallés","Malayalam":"Malaialam","Marathi":"Marathi","Macedonian":"Macedonian","Malagasy":"Malgash","Maltese":"Maltés","Mongolian":"Mongòl","Maori":"Maòri","Malay (macrolanguage)":"Malai (macrolengatge)","Burmese":"Birman","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele del Sud","North Ndebele":"Ndebele del Nòrd","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepali (macrolengatge)","Dutch":"Neerlandés","Norwegian Nynorsk":"Norvegian Nynorsk","Norwegian Bokmål":"Norvegian","Norwegian":"Norwegian","Nyanja":"Nyanja","Occitan":"Occitan","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macrolengatge)","Oromo":"Oromo","Ossetian":"Ossèt","Panjabi":"Panjabi","Pakistan Sign Language":"Lenga de signes de Paquistan","Polish":"Polonés","Portuguese":"Portugués","Pushto":"Pushto","Quechua":"Quíchoa","Romansh":"Romanch","Romanian":"Romanés","Russian Sign Language":"Lenga de signes russa","Rundi":"Rundi","Russian":"Rus","Sango":"Sango","Saudi Arabian Sign Language":"Lenga de signes d'Arabia Saudita","South African Sign Language":"Lenga de signes d’Africa del Sud","Sinhala":"Singalés","Slovak":"Eslovac","Slovenian":"Eslovèn","Northern Sami":"Sami septentrional","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho meridional","Spanish":"Espanhòl","Albanian":"Albanés","Sardinian":"Sard","Serbian":"Sèrbe","Swati":"Swati","Sundanese":"Sodanés","Swahili (macrolanguage)":"Swahili (macrolengatge)","Swedish":"Suedés","Swedish Sign Language":"Lenga de signes suedesa","Tahitian":"Tahician","Tamil":"Tamil","Tatar":"Tatar","Telugu":"Telugu","Tajik":"Tajik","Tagalog":"Tagalòg","Thai":"Tailandés","Tigrinya":"Tigrinya","Klingon":"Klingon","Tonga (Tonga Islands)":"Tònga (islas Tònga)","Tswana":"Tswana","Tsonga":"Tsònga","Turkmen":"Turcmèn","Turkish":"Turc","Twi":"Toï","Uighur":"Oigors","Ukrainian":"Ucraïnian","Urdu":"Ordo","Uzbek":"Uzbec","Venda":"Venda","Vietnamese":"Vietnamian","Walloon":"Valon","Wolof":"Wolòf","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinés","Zulu":"Zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_pl_PL.json b/client/src/locale/target/server_pl_PL.json
new file mode 100644
index 000000000..90973bf28
--- /dev/null
+++ b/client/src/locale/target/server_pl_PL.json
@@ -0,0 +1 @@
{"Music":"Muzyka","Films":"Filmy","Vehicles":"Pojazdy","Art":"Sztuka","Sports":"Sport","Travels":"Podróże","Gaming":"Gry","People":"Ludzie","Comedy":"Komedia","Entertainment":"Rozrywka","How To":"Poradniki","Education":"Edukacja","Activism":"Aktywizm","Science & Technology":"Nauka i technologia","Animals":"ZwierzÄ™ta","Kids":"Dzieci","Food":"Jedzenie","Attribution":"Uznanie autostwa","Attribution - Share Alike":"Uznanie autorstwa - Na tych samych warunkach","Attribution - No Derivatives":"Uznanie autorstwa - Bez utworów zależnych","Attribution - Non Commercial":"Uznanie autorstwa - Użycie niekomercyjne","Attribution - Non Commercial - Share Alike":"Uznanie autorstwa - Użycie niekomercyjne - Na tych samych warunkach","Attribution - Non Commercial - No Derivatives":"Uznanie autorstwa - Użycie niekomercyjne - Bez utworów zależnych","Public Domain Dedication":"Przekazanie do Domeny Publicznej","Public":"Publiczne","Unlisted":"Niewypisane","Private":"Prywatne","Published":"Opublikowano","To transcode":"Transkodować","To import":"Importować","Pending":"Oczekiwanie","Success":"Sukces","Failed":"Niepowodzenie","Misc":"Różne","Unknown":"Nieznane","Afar":"Afar","Abkhazian":"Abchaski","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharski","Arabic":"Arabski","American Sign Language":"AmerykaÅ„ski JÄ™zyk Migowy","Avaric":"Awarski","Bashkir":"Baszkirski","Bambara":"Bambara","Belarusian":"BiaÅ‚oruski","Bengali":"Bengalski","British Sign Language":"Brytyjski JÄ™zyk Migowy","Bislama":"Bislama","Tibetan":"TybetaÅ„ski","Bosnian":"BoÅ›niacki","Breton":"BretoÅ„ski","Bulgarian":"BuÅ‚garski","Catalan":"KataloÅ„ski","Czech":"Czeski","Cornish":"Kornijski","Corsican":"KorsykaÅ„ski","Cree":"Kri","Czech Sign Language":"Czeski JÄ™zyk Migowy","Chinese Sign Language":"ChiÅ„ski JÄ™zyk Migowy","Welsh":"Walijski","Danish":"DuÅ„ski","German":"Niemiecki","Danish Sign Language":"DuÅ„ski JÄ™zyk Migowy","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Nowogrecki (1453-)","English":"Angielski","Estonian":"EstoÅ„ski","Basque":"Baskijski","Ewe":"Ewe","Persian":"Perski","Fijian":"Fidżyjski","Finnish":"FiÅ„ski","French":"Francuski","French Sign Language":"Francuski JÄ™zyk Migowy","Fulah":"Ful","Irish":"Irlandzki","Galician":"Galicyjski","German Sign Language":"Niemiecki JÄ™zyk Migowy","Hausa":"Hausa","Serbo-Croatian":"Serbsko-Chorwacki","Hindi":"Hindi","Croatian":"Chorwacki","Hungarian":"WÄ™gierski","Armenian":"OrmaÅ„ski","Igbo":"Igbo","Indonesian":"Indonezyjski","Icelandic":"Islandzki","Italian":"WÅ‚oski","Javanese":"Jawajski","Japanese":"JapoÅ„ski","Japanese Sign Language":"JapoÅ„ski JÄ™zyk Migowy","Komi":"Komi","Kongo":"Kongo","Korean":"KoreaÅ„ski","Kurdish":"Kurdyjski","Lao":"LaotaÅ„ski","Latvian":"Åotewski","Lithuanian":"Litewski","Luxembourgish":"Luksemburski","Nauru":"NauraÅ„ski","Dutch":"Holenderski","Norwegian Nynorsk":"Norweski Nynorsk","Norwegian BokmÃ¥l":"Norweski BokmÃ¥l","Norwegian":"Norweski","Oromo":"Oromo","Polish":"Polski","Portuguese":"Portugalski","Pushto":"Paszto","Romansh":"Romansz","Romanian":"RumuÅ„ski","Russian Sign Language":"Rosyjski JÄ™zyk Migowy","Rundi":"Rundi","Russian":"Rosyjski","Sango":"Sango","Slovak":"SÅ‚owacki","Slovenian":"SÅ‚oweÅ„ski","Samoan":"SamoaÅ„ski","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somalijski","Spanish":"HiszpaÅ„ski","Serbian":"Serbski","Swedish":"Szwedzki","Swedish Sign Language":"Szwedzki JÄ™zyk Migowy","Tamil":"Tamilski","Tatar":"Tatarski","Telugu":"Telugu","Tajik":"Tadżycki","Tagalog":"Tagalski","Thai":"Tajski","Turkmen":"TurkmeÅ„ski","Turkish":"Turecki","Twi":"Twi","Ukrainian":"UkraiÅ„ski","Urdu":"Urdu","Uzbek":"Uzbecki","Venda":"Venda","Vietnamese":"Wietnamski","Walloon":"WaloÅ„ski","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Jidysz","Yoruba":"Joruba","Zhuang":"Zhuang","Chinese":"ChiÅ„ski","Zulu":"Zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_pl_PL.xml b/client/src/locale/target/server_pl_PL.xml
deleted file mode 100644
index 30b403986..000000000
--- a/client/src/locale/target/server_pl_PL.xml
+++ /dev/null
@@ -1,151 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--XLIFF document generated by Zanata. Visit http://zanata.org for more infomation.-->
3<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="pl-PL">
5 <body>
6 <trans-unit id="Music">
7 <source>Music</source>
8 <target>Muzyka</target>
9 </trans-unit>
10 <trans-unit id="Films">
11 <source>Films</source>
12 <target>Filmy</target>
13 </trans-unit>
14 <trans-unit id="Vehicles">
15 <source>Vehicles</source>
16 <target>Pojazdy</target>
17 </trans-unit>
18 <trans-unit id="Art">
19 <source>Art</source>
20 <target>Sztuka</target>
21 </trans-unit>
22 <trans-unit id="Sports">
23 <source>Sports</source>
24 <target>Sport</target>
25 </trans-unit>
26 <trans-unit id="Travels">
27 <source>Travels</source>
28 <target>Podróże</target>
29 </trans-unit>
30 <trans-unit id="Gaming">
31 <source>Gaming</source>
32 <target>Gry</target>
33 </trans-unit>
34 <trans-unit id="People">
35 <source>People</source>
36 <target>Ludzie</target>
37 </trans-unit>
38 <trans-unit id="Comedy">
39 <source>Comedy</source>
40 <target>Komedia</target>
41 </trans-unit>
42 <trans-unit id="Entertainment">
43 <source>Entertainment</source>
44 <target>Rozrywka</target>
45 </trans-unit>
46 <trans-unit id="News">
47 <source>News</source>
48 <target>Wiadomości</target>
49 </trans-unit>
50 <trans-unit id="How To">
51 <source>How To</source>
52 <target>Poradniki</target>
53 </trans-unit>
54 <trans-unit id="Education">
55 <source>Education</source>
56 <target>Edukacja</target>
57 </trans-unit>
58 <trans-unit id="Activism">
59 <source>Activism</source>
60 <target>Aktywizm</target>
61 </trans-unit>
62 <trans-unit id="Science &amp; Technology">
63 <source>Science &amp; Technology</source>
64 <target>Nauka i technologia</target>
65 </trans-unit>
66 <trans-unit id="Animals">
67 <source>Animals</source>
68 <target>Zwierzęta</target>
69 </trans-unit>
70 <trans-unit id="Kids">
71 <source>Kids</source>
72 <target>Dzieci</target>
73 </trans-unit>
74 <trans-unit id="Food">
75 <source>Food</source>
76 <target>Jedzenie</target>
77 </trans-unit>
78 <trans-unit id="Attribution">
79 <source>Attribution</source>
80 <target>Uznanie autostwa</target>
81 </trans-unit>
82 <trans-unit id="Attribution - Share Alike">
83 <source>Attribution - Share Alike</source>
84 <target>Uznanie autorstwa - Na tych samych warunkach</target>
85 </trans-unit>
86 <trans-unit id="Attribution - No Derivatives">
87 <source>Attribution - No Derivatives</source>
88 <target>Uznanie autorstwa - Bez utworów zależnych</target>
89 </trans-unit>
90 <trans-unit id="Attribution - Non Commercial">
91 <source>Attribution - Non Commercial</source>
92 <target>Uznanie autorstwa - Użycie niekomercyjne</target>
93 </trans-unit>
94 <trans-unit id="Attribution - Non Commercial - Share Alike">
95 <source>Attribution - Non Commercial - Share Alike</source>
96 <target>Uznanie autorstwa - Użycie niekomercyjne - Na tych samych warunkach</target>
97 </trans-unit>
98 <trans-unit id="Attribution - Non Commercial - No Derivatives">
99 <source>Attribution - Non Commercial - No Derivatives</source>
100 <target>Uznanie autorstwa - Użycie niekomercyjne - Bez utworów zależnych</target>
101 </trans-unit>
102 <trans-unit id="Public Domain Dedication">
103 <source>Public Domain Dedication</source>
104 <target>Przekazanie do Domeny Publicznej</target>
105 </trans-unit>
106 <trans-unit id="Public">
107 <source>Public</source>
108 <target>Publiczne</target>
109 </trans-unit>
110 <trans-unit id="Unlisted">
111 <source>Unlisted</source>
112 <target>Niewypisane</target>
113 </trans-unit>
114 <trans-unit id="Private">
115 <source>Private</source>
116 <target>Prywatne</target>
117 </trans-unit>
118 <trans-unit id="Published">
119 <source>Published</source>
120 <target>Opublikowano</target>
121 </trans-unit>
122 <trans-unit id="To transcode">
123 <source>To transcode</source>
124 <target>Transkodować</target>
125 </trans-unit>
126 <trans-unit id="To import">
127 <source>To import</source>
128 <target>Importować</target>
129 </trans-unit>
130 <trans-unit id="Pending">
131 <source>Pending</source>
132 <target>Oczekiwanie</target>
133 </trans-unit>
134 <trans-unit id="Success">
135 <source>Success</source>
136 <target>Sukces</target>
137 </trans-unit>
138 <trans-unit id="Failed">
139 <source>Failed</source>
140 <target>Niepowodzenie</target>
141 </trans-unit>
142 <trans-unit id="Misc">
143 <source>Misc</source>
144 <target>Różne</target>
145 </trans-unit>
146 <trans-unit id="Unknown">
147 <source>Unknown</source>
148 <target>Nieznane</target>
149 </trans-unit>
150 </body>
151 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/server_pt_BR.json b/client/src/locale/target/server_pt_BR.json
index 375da1829..2bfcbaa59 100644
--- a/client/src/locale/target/server_pt_BR.json
+++ b/client/src/locale/target/server_pt_BR.json
@@ -1 +1 @@
{"Music":"Músicas","Films":"Filmes","Vehicles":"Veículos","Art":"Arte","Sports":"Esportes","Travels":"Viagens","Gaming":"Jogos","People":"Pessoas","Comedy":"Comédia","Entertainment":"Entretenimento","News":"Notícias","How To":"Como fazer","Education":"Educação","Activism":"Ativismo","Science & Technology":"Ciência & Tecnologia","Animals":"Animais","Kids":"Infantil","Food":"Comida","Attribution":"Atribuição","Attribution - Share Alike":"Atribuição - Compartilha Igual","Attribution - No Derivatives":"Atribuição - Sem Derivações","Attribution - Non Commercial":"Atribuição - Não Comercial","Attribution - Non Commercial - Share Alike":"Atribuição - Não Comercial - Compartilha Igual","Attribution - Non Commercial - No Derivatives":"Atribuição - Não Comercial - Sem Derivações","Public Domain Dedication":"Dedicação para Domínio Público","Public":"Público","Unlisted":"Não listado","Private":"Privado","Published":"Publicado","To transcode":"Para transcodificar","To import":"Para importar","Pending":"Pendente","Success":"Sucesso","Failed":"Falhou","Misc":"Diversos","Unknown":"Desconhecido","Afar":"Afar","Abkhazian":"Abcázio","Afrikaans":"Africâner","Akan":"Akan","Amharic":"Amárico","Arabic":"Ãrabe","Aragonese":"Aragonês","American Sign Language":"Língua de sinais americana","Assamese":"Assamês","Avaric":"Avárico","Kotava":"Coreano","Aymara":"Aimará","Azerbaijani":"Azerbaidjano","Bashkir":"Basquir","Bambara":"Bambara","Belarusian":"Bielorusso","Bengali":"Bengali","British Sign Language":"Língua de sinais britânica","Bislama":"Bislamá","Tibetan":"Tibetano","Bosnian":"Bósnio","Breton":"Bretão","Bulgarian":"Búlgaro","Brazilian Sign Language":"Língua de sinais brasileira","Catalan":"Catalão","Czech":"Tcheco","Chamorro":"Chamorro","Chechen":"Checheno","Chuvash":"Tchuvache","Cornish":"Córnico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Língua de sinais tcheca","Chinese Sign Language":"Língua de sinais chinesa","Welsh":"Galês","Danish":"Dinamarquês","German":"Alemão","Dhivehi":"Sérvio","Danish Sign Language":"Língua de sinais dinamarquesa","Dzongkha":"Butanês","Modern Greek (1453-)":"Grego, Moderno (1453-)","English":"Inglês","Esperanto":"Esperanto","Estonian":"Estoniano","Basque":"Basco","Ewe":"Jeje","Faroese":"Faroês","Persian":"Persa","Fijian":"Fidjiano","Finnish":"Finlandês","French":"Francês","Western Frisian":"Frísio ocidental","French Sign Language":"Língua de sinais francesa","Fulah":"Fula","Scottish Gaelic":"Gaélico Escocês","Irish":"Irlandês","Galician":"Galego","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Língua de sinais alemã","Gujarati":"Gujerati","Haitian":"Italiano","Hausa":"Hauçá","Serbo-Croatian":"Croata","Hebrew":"Hebraico","Herero":"Hereró","Hindi":"Híndi","Hiri Motu":"Hiri Motu","Croatian":"Croata","Hungarian":"Húngaro","Armenian":"Armênio","Igbo":"Ibo","Sichuan Yi":"Lituano","Inuktitut":"Inuktitut","Indonesian":"Indonésio","Inupiaq":"Inupiaque","Icelandic":"Islandês","Italian":"Italiano","Javanese":"Javanês","Lojban":"Lojban","Japanese":"Japonês","Japanese Sign Language":"Língua de sinais japonesa","Kalaallisut":"Groenlandês (Kalaallisut)","Kannada":"Canarês","Kashmiri":"Caxemira","Georgian":"Georgiano","Kanuri":"Canúri","Kazakh":"Cazaque","Khmer":"Khmer","Kikuyu":"Kikuyu","Kinyarwanda":"Ruanda","Kirghiz":"Quirguiz","Komi":"Komi","Kongo":"Congo","Korean":"Coreano","Kuanyama":"Cuanhama","Kurdish":"Curdo","Lao":"Laosiano","Latvian":"Letão","Limburgan":"Lituano","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Luxemburguês","Luba-Katanga":"Baluba","Ganda":"Nganda","Marshallese":"Marshalês","Malayalam":"Malaiala","Marathi":"Marati","Macedonian":"Macedônio","Malagasy":"Malgaxe","Maltese":"Maltês","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malaiala (macrolíngua)","Burmese":"Birmanês","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele do Sul","North Ndebele":"Ndebele do Norte","Ndonga":"Ovampo","Nepali (macrolanguage)":"Nepalês (macrolíngua)","Dutch":"Holandês","Norwegian Nynorsk":"Norueguês Nynorsk","Norwegian BokmÃ¥l":"Norueguês Nynorsk","Norwegian":"Norueguês","Nyanja":"Lituano","Occitan":"Occitano","Ojibwa":"Obíjua","Oriya (macrolanguage)":"Oriá (macrolíngua)","Oromo":"Oromo","Ossetian":"Ossétio","Panjabi":"Panjabi","Pakistan Sign Language":"Língua de sinais paquistanesa","Polish":"Polonês","Portuguese":"Português","Pushto":"Pachto","Quechua":"Quíchua","Romansh":"Romanche","Romanian":"Romeno","Russian Sign Language":"Idiomas de Sinais","Rundi":"Kirundi","Russian":"Russo","Sango":"Sango","Saudi Arabian Sign Language":"Língua de sinais da Arábia Saudita","South African Sign Language":"Língua de sinais da Ãfrica do Sul","Sinhala":"Cingalês","Slovak":"Eslovaco","Slovenian":"Esloveno","Northern Sami":"Sami do norte","Samoan":"Samoano","Shona":"Xona","Sindhi":"Síndi","Somali":"Somali","Southern Sotho":"Soto do Sul","Spanish":"Espanhol","Albanian":"Albanês","Sardinian":"Sardo","Serbian":"Sérvio","Swati":"Swati","Sundanese":"Sundanês","Swahili (macrolanguage)":"Suaíli (macrolíngua)","Swedish":"Sueco","Swedish Sign Language":"Língua de sinais sueca","Tahitian":"Taitiano","Tamil":"Tâmil","Tatar":"Tártaro","Telugu":"Télugo","Tajik":"Tadjique","Tagalog":"Tagalo","Thai":"Tailandês","Tigrinya":"Tigrínia","Klingon":"Letão","Tonga (Tonga Islands)":"Tonga","Tswana":"Tsuana","Tsonga":"Tsonga","Turkmen":"Turcomeno","Turkish":"Turco","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraniano","Urdu":"Urdu","Uzbek":"Uzbeque","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Valão","Wolof":"Uólofe","Xhosa":"Xhosa","Yiddish":"Iídiche","Yoruba":"Ioruba","Zhuang":"Zuni","Chinese":"Chinês","Zulu":"Zulu"} \ No newline at end of file {"Music":"Músicas","Films":"Filmes","Vehicles":"Veículos","Art":"Arte","Sports":"Esportes","Travels":"Viagens","Gaming":"Jogos","People":"Pessoas","Comedy":"Comédia","Entertainment":"Entretenimento","How To":"Como fazer","Education":"Educação","Activism":"Ativismo","Science & Technology":"Ciência & Tecnologia","Animals":"Animais","Kids":"Infantil","Food":"Comida","Attribution":"Atribuição","Attribution - Share Alike":"Atribuição - Compartilha Igual","Attribution - No Derivatives":"Atribuição - Sem Derivações","Attribution - Non Commercial":"Atribuição - Não Comercial","Attribution - Non Commercial - Share Alike":"Atribuição - Não Comercial - Compartilha Igual","Attribution - Non Commercial - No Derivatives":"Atribuição - Não Comercial - Sem Derivações","Public Domain Dedication":"Dedicação para Domínio Público","Public":"Público","Unlisted":"Não listado","Private":"Privado","Published":"Publicado","To transcode":"Para transcodificar","To import":"Para importar","Pending":"Pendente","Success":"Sucesso","Failed":"Falhou","Misc":"Diversos","Unknown":"Desconhecido","Afar":"Afar","Abkhazian":"Abcázio","Afrikaans":"Africâner","Akan":"Akan","Amharic":"Amárico","Arabic":"Ãrabe","Aragonese":"Aragonês","American Sign Language":"Língua de sinais americana","Assamese":"Assamês","Avaric":"Avárico","Kotava":"Coreano","Aymara":"Aimará","Azerbaijani":"Azerbaidjano","Bashkir":"Basquir","Bambara":"Bambara","Belarusian":"Bielorusso","Bengali":"Bengali","British Sign Language":"Língua de sinais britânica","Bislama":"Bislamá","Tibetan":"Tibetano","Bosnian":"Bósnio","Breton":"Bretão","Bulgarian":"Búlgaro","Brazilian Sign Language":"Língua de sinais brasileira","Catalan":"Catalão","Czech":"Tcheco","Chamorro":"Chamorro","Chechen":"Checheno","Chuvash":"Tchuvache","Cornish":"Córnico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Língua de sinais tcheca","Chinese Sign Language":"Língua de sinais chinesa","Welsh":"Galês","Danish":"Dinamarquês","German":"Alemão","Dhivehi":"Sérvio","Danish Sign Language":"Língua de sinais dinamarquesa","Dzongkha":"Butanês","Modern Greek (1453-)":"Grego, Moderno (1453-)","English":"Inglês","Esperanto":"Esperanto","Estonian":"Estoniano","Basque":"Basco","Ewe":"Jeje","Faroese":"Faroês","Persian":"Persa","Fijian":"Fidjiano","Finnish":"Finlandês","French":"Francês","Western Frisian":"Frísio ocidental","French Sign Language":"Língua de sinais francesa","Fulah":"Fula","Scottish Gaelic":"Gaélico Escocês","Irish":"Irlandês","Galician":"Galego","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Língua de sinais alemã","Gujarati":"Gujerati","Haitian":"Italiano","Hausa":"Hauçá","Serbo-Croatian":"Croata","Hebrew":"Hebraico","Herero":"Hereró","Hindi":"Híndi","Hiri Motu":"Hiri Motu","Croatian":"Croata","Hungarian":"Húngaro","Armenian":"Armênio","Igbo":"Ibo","Sichuan Yi":"Lituano","Inuktitut":"Inuktitut","Indonesian":"Indonésio","Inupiaq":"Inupiaque","Icelandic":"Islandês","Italian":"Italiano","Javanese":"Javanês","Lojban":"Lojban","Japanese":"Japonês","Japanese Sign Language":"Língua de sinais japonesa","Kalaallisut":"Groenlandês (Kalaallisut)","Kannada":"Canarês","Kashmiri":"Caxemira","Georgian":"Georgiano","Kanuri":"Canúri","Kazakh":"Cazaque","Khmer":"Khmer","Kikuyu":"Kikuyu","Kinyarwanda":"Ruanda","Kirghiz":"Quirguiz","Komi":"Komi","Kongo":"Congo","Korean":"Coreano","Kuanyama":"Cuanhama","Kurdish":"Curdo","Lao":"Laosiano","Latvian":"Letão","Limburgan":"Lituano","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Luxemburguês","Luba-Katanga":"Baluba","Ganda":"Nganda","Marshallese":"Marshalês","Malayalam":"Malaiala","Marathi":"Marati","Macedonian":"Macedônio","Malagasy":"Malgaxe","Maltese":"Maltês","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malaiala (macrolíngua)","Burmese":"Birmanês","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele do Sul","North Ndebele":"Ndebele do Norte","Ndonga":"Ovampo","Nepali (macrolanguage)":"Nepalês (macrolíngua)","Dutch":"Holandês","Norwegian Nynorsk":"Norueguês Nynorsk","Norwegian BokmÃ¥l":"Norueguês Nynorsk","Norwegian":"Norueguês","Nyanja":"Lituano","Occitan":"Occitano","Ojibwa":"Obíjua","Oriya (macrolanguage)":"Oriá (macrolíngua)","Oromo":"Oromo","Ossetian":"Ossétio","Panjabi":"Panjabi","Pakistan Sign Language":"Língua de sinais paquistanesa","Polish":"Polonês","Portuguese":"Português","Pushto":"Pachto","Quechua":"Quíchua","Romansh":"Romanche","Romanian":"Romeno","Russian Sign Language":"Idiomas de Sinais","Rundi":"Kirundi","Russian":"Russo","Sango":"Sango","Saudi Arabian Sign Language":"Língua de sinais da Arábia Saudita","South African Sign Language":"Língua de sinais da Ãfrica do Sul","Sinhala":"Cingalês","Slovak":"Eslovaco","Slovenian":"Esloveno","Northern Sami":"Sami do norte","Samoan":"Samoano","Shona":"Xona","Sindhi":"Síndi","Somali":"Somali","Southern Sotho":"Soto do Sul","Spanish":"Espanhol","Albanian":"Albanês","Sardinian":"Sardo","Serbian":"Sérvio","Swati":"Swati","Sundanese":"Sundanês","Swahili (macrolanguage)":"Suaíli (macrolíngua)","Swedish":"Sueco","Swedish Sign Language":"Língua de sinais sueca","Tahitian":"Taitiano","Tamil":"Tâmil","Tatar":"Tártaro","Telugu":"Télugo","Tajik":"Tadjique","Tagalog":"Tagalo","Thai":"Tailandês","Tigrinya":"Tigrínia","Klingon":"Letão","Tonga (Tonga Islands)":"Tonga","Tswana":"Tsuana","Tsonga":"Tsonga","Turkmen":"Turcomeno","Turkish":"Turco","Twi":"Twi","Uighur":"Uigur","Ukrainian":"Ucraniano","Urdu":"Urdu","Uzbek":"Uzbeque","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Valão","Wolof":"Uólofe","Xhosa":"Xhosa","Yiddish":"Iídiche","Yoruba":"Ioruba","Zhuang":"Zuni","Chinese":"Chinês","Zulu":"Zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_ru_RU.json b/client/src/locale/target/server_ru_RU.json
new file mode 100644
index 000000000..e62f2aeb4
--- /dev/null
+++ b/client/src/locale/target/server_ru_RU.json
@@ -0,0 +1 @@
{"Music":"Музыка","Films":"Филмы","Vehicles":"ТранÑпортные ÑредÑтва","Art":"ИÑкуÑÑтво","Sports":"Спорт","Travels":"ПутешеÑтвиÑ","Gaming":"Видеоигры","People":"Люди","Comedy":"КомедиÑ","Entertainment":"РазвлечениÑ","How To":"Как","Education":"Образование","Activism":"Ðктивизм","Science & Technology":"Ðаука и ТехнологиÑ","Animals":"Животные ","Kids":"Дети","Food":"Еда","Attribution":"ÐтрибуциÑ","Attribution - Share Alike":" ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ уÑловиÑми ","Attribution - No Derivatives":"ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - без права Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ","Attribution - Non Commercial":"ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - не коммерчеÑкое иÑпользование","Attribution - Non Commercial - Share Alike":"ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - не коммерчеÑкое иÑпользование - Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ уÑловиÑми","Attribution - Non Commercial - No Derivatives":"ÐÑ‚Ñ€Ð¸Ð±ÑƒÑ†Ð¸Ñ - не коммерчеÑкое иÑпользование - без права изменениÑ","Public Domain Dedication":"Безлицензионный","Public":"ОбщеÑтвенный","Unlisted":" Ее включённый в ÑпиÑок","Private":"Личный","Published":"Опубликованный","To transcode":"Перекодировать","To import":"Импортировать","Pending":"Ð’ ожидании","Success":"Удачное завершение","Failed":"Ðеудачно","Misc":"Разное","Unknown":"ÐеизвеÑтное","Afar":"ÐфарÑкий","Abkhazian":"ÐбхазÑкий","Afrikaans":"ÐфрикаанÑ","Akan":"Ðкан","Amharic":"ÐмхарÑкий","Arabic":"ÐрабÑкий","Aragonese":"ÐрагонÑкий","American Sign Language":"ÐмÑлен","Assamese":"ÐÑÑамÑкий","Avaric":"ÐварÑкий","Kotava":"Котава","Aymara":"Ðймара","Azerbaijani":"ÐзербайджанÑкий","Bashkir":"БашкирÑкий","Bambara":"Бамана","Belarusian":"БелоруÑÑкий","Bengali":"БенгальÑкий","British Sign Language":"БританÑкий жеÑтовый","Bislama":"БиÑлама","Tibetan":"ТибетÑкий","Bosnian":"БоÑнийÑкий","Breton":"БретонÑкий","Bulgarian":"БолгарÑкий","Brazilian Sign Language":"БразильÑкий жеÑтовый","Catalan":"КаталанÑкий","Czech":"ЧешÑкий","Chamorro":"Чаморро","Chechen":"ЧеченÑкий","Chuvash":"ЧувашÑкий","Cornish":"КорнÑкий","Corsican":"КорÑиканÑкий","Cree":"Кри","Czech Sign Language":"ЧешÑкий жеÑтовый","Chinese Sign Language":"КитайÑкий жеÑтовый","Welsh":"УÑлш","Danish":"ДатÑкий","German":"Ðемецкий","Dhivehi":"Дивехи","Danish Sign Language":"ДатÑкий жеÑтовый ","Dzongkha":"Дзонг-кÑ","Modern Greek (1453-)":"Современный гречеÑкий","English":"ÐнглийÑкий","Esperanto":"ЭÑперанто","Estonian":"ЭÑтонÑкий","Basque":"БаÑкÑкий","Ewe":"Эве","Faroese":"ФарерÑкий","Persian":"ПерÑидÑкий","Fijian":"ФиджийÑкий","Finnish":"ФинÑкий","French":"ФранцузÑкий","Western Frisian":"ЗападнофризÑкий","French Sign Language":"ФранцузÑкий жеÑтовый","Fulah":"Фула","Scottish Gaelic":"ШотландÑкий","Irish":"ИрландÑкий","Galician":"ГалиÑийÑкий","Manx":"ÐœÑнÑкий","Guarani":"Гуарани","German Sign Language":"Ðемецкий жеÑтовый","Gujarati":"Гуджарати","Haitian":"ГаитÑнÑкий креольÑкий","Hausa":"ХауÑа","Serbo-Croatian":"СербохорватÑкий","Hebrew":"Иврит","Herero":"Гереро","Hindi":"Хинди","Hiri Motu":"Хири-моту","Croatian":"ХорватÑкий","Hungarian":"ВенгерÑкий","Armenian":"ÐрмÑнÑкий","Igbo":"Игбо","Sichuan Yi":"ÐоÑу","Inuktitut":"Инуктитут","Indonesian":"ИндонезийÑкий","Inupiaq":"ÐлÑÑкинÑко-инуитÑкие","Icelandic":"ИÑландÑкий","Italian":"ИтальÑнÑкий","Javanese":"ЯванÑкий","Lojban":"Ложбан","Japanese":"ЯпонÑкий","Japanese Sign Language":"ЯпонÑкий жеÑтовый","Kalaallisut":"ГренландÑкий","Kannada":"Каннада","Kashmiri":"КашмирÑкий","Georgian":"ГрузинÑкий","Kanuri":"Канури","Kazakh":"КазахÑкий","Khmer":"КхмерÑкий","Kikuyu":"Кикуйю","Kinyarwanda":"Руанда","Kirghiz":"КиргизÑкий","Komi":"Коми","Kongo":"Конго","Korean":"КорейÑкий","Kuanyama":"КваньÑма","Kurdish":"КурдÑкие","Lao":"ЛаоÑÑкий","Latvian":"ЛатышÑкий","Limburgan":"ЛимбургÑкий","Lingala":"Лингала","Lithuanian":"ЛитовÑкий","Luxembourgish":"ЛюкÑембургÑкий","Luba-Katanga":"Луба-катанга","Ganda":"Луганда","Marshallese":"МаршалльÑкий","Malayalam":"МалаÑлам","Marathi":"Маратхи","Macedonian":"МакедонÑкий","Malagasy":"МалагаÑийÑкий","Maltese":"МальтийÑкий","Mongolian":"МонгольÑкий","Maori":"Маори","Malay (macrolanguage)":"МалайÑкий","Burmese":"БирманÑкий","Nauru":"ÐауруанÑкий","Navajo":"Ðавахо","South Ndebele":"Южный ндебеле","North Ndebele":"Северный ндебеле","Ndonga":"Ðдонга","Nepali (macrolanguage)":"ÐепальÑкий","Dutch":"ÐидерландÑкий","Norwegian Nynorsk":"ÐовонорвежÑкий","Norwegian BokmÃ¥l":"Букмол","Norwegian":"ÐорвежÑкий","Nyanja":"ÐÑŒÑнджа","Ojibwa":"Оджибве","Oriya (macrolanguage)":"ОриÑ","Oromo":"Оромо","Ossetian":"ОÑетинÑкий","Panjabi":"Панджаби","Pakistan Sign Language":"ДагеÑтанÑкий ","Polish":"ПольÑкий","Portuguese":"ПортугальÑкий","Pushto":"Пушту","Quechua":"КеÌчуа","Romansh":"РоманшÑкий","Romanian":"РумынÑкий","Russian Sign Language":"РуÑÑкий жеÑтовый","Rundi":"Рунди","Russian":"РуÑÑкий","Sango":"Санго","Saudi Arabian Sign Language":"ÐрабÑкий жеÑтовый","South African Sign Language":"ЖеÑтовый Южной Ðфрики","Sinhala":"СингальÑкий","Slovak":"Словацкий","Slovenian":"СловенÑкий","Northern Sami":"СеверноÑаамÑкий","Samoan":"СамоанÑкий","Shona":"Шона","Sindhi":"Синдхи","Somali":"СомалийÑкий","Southern Sotho":"СеÑото","Spanish":"ИÑпанÑкий","Albanian":"ÐлбанÑкий","Sardinian":"СардинÑкий","Serbian":"СербÑкий","Swati":"Свати","Sundanese":"СунданÑкий","Swahili (macrolanguage)":"Суахили","Swedish":"ШведÑкий","Swedish Sign Language":"ШведÑкий жеÑтовый","Tahitian":"ТаитÑнÑкий","Tamil":"ТамильÑкий","Tatar":"ТатарÑкий","Telugu":"Телугу","Tajik":"ТаджикÑкий","Tagalog":"ТагальÑкий","Thai":"ТайÑкий","Tigrinya":"ТигриньÑ","Klingon":"КлингонÑкий","Tonga (Tonga Islands)":"ТонганÑкий","Tswana":"ТÑвана","Tsonga":"ТÑонга","Turkmen":"ТуркменÑкий","Turkish":"Турецкий","Twi":"Чви","Uighur":"УйгурÑкий","Ukrainian":"УкраинÑкий","Urdu":"Урду","Uzbek":"УзбекÑкий","Venda":"Венда","Vietnamese":"ВьетнамÑкий","Walloon":"ВаллонÑкий","Wolof":"Волоф","Xhosa":"КоÑа","Yiddish":"Идиш","Yoruba":"Йоруба","Zhuang":"ЧжуанÑкий","Chinese":"КитайÑкий","Zulu":"Зулу"} \ No newline at end of file
diff --git a/client/src/locale/target/server_sv_SE.json b/client/src/locale/target/server_sv_SE.json
index 6df53199b..ed5e8c8ef 100644
--- a/client/src/locale/target/server_sv_SE.json
+++ b/client/src/locale/target/server_sv_SE.json
@@ -1 +1 @@
{"Music":"Musik","Films":"Filmer","Vehicles":"Fordon","Art":"Konst","Sports":"Sport","Travels":"Resor","Gaming":"Spel","People":"Människor","Comedy":"Komedi","Entertainment":"Underhållning","News":"Nyheter","How To":"Instruktioner","Education":"Utbildning","Activism":"Aktivism","Science & Technology":"Vetenskap och teknik","Animals":"Djur","Kids":"Barn","Food":"Mat","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Share Alike","Attribution - No Derivatives":"Attribution - No Derivatives","Attribution - Non Commercial":"Attribution - Non Commercial","Attribution - Non Commercial - Share Alike":"Attribution - Non Commercial - Share Alike","Attribution - Non Commercial - No Derivatives":"Attribution - Non Commercial - No Derivatives","Public Domain Dedication":"Public Domain Dedication","Public":"Offentlig","Unlisted":"Olistad","Private":"Privat","Published":"Publicerad","To transcode":"Att omkoda","To import":"Att importera","Pending":"I kö","Success":"Lyckades","Failed":"Misslyckades","Misc":"Diverse","Unknown":"Okänd","Afar":"afar","Abkhazian":"abchaziska","Afrikaans":"afrikaans","Akan":"akan","Amharic":"amhariska","Arabic":"arabiska","Aragonese":"aragonska","American Sign Language":"amerikanskt teckenspråk","Assamese":"assamesiska","Avaric":"avariska","Kotava":"kotava","Aymara":"aymara","Azerbaijani":"azerbajdzjanska","Bashkir":"basjkiriska","Bambara":"bambara","Belarusian":"vitryska","Bengali":"bengali","British Sign Language":"brittiskt teckenspråk","Bislama":"bislama","Tibetan":"tibetanska","Bosnian":"bosniska","Breton":"bretonska","Bulgarian":"bulgariska","Brazilian Sign Language":"brasilianskt teckenspråk","Catalan":"katalanska","Czech":"tjeckiska","Chamorro":"chamorro","Chechen":"tjetjenska","Chuvash":"tjuvasjiska","Cornish":"korniska","Corsican":"korsikanska","Cree":"cree","Czech Sign Language":"tjeckiskt teckenspråk","Chinese Sign Language":"kinesiskt teckenspråk","Welsh":"kymriska","Danish":"danska","German":"tyska","Dhivehi":"divehi","Danish Sign Language":"danskt teckenspråk","Dzongkha":"dzongkha","Modern Greek (1453-)":"modern grekiska (1453–)","English":"engelska","Esperanto":"esperanto","Estonian":"estniska","Basque":"baskiska","Ewe":"ewe","Faroese":"färöiska","Persian":"persiska","Fijian":"fijianska","Finnish":"finska","French":"franska","Western Frisian":"västfrisiska","French Sign Language":"franskt teckenspråk","Fulah":"fula","Scottish Gaelic":"skotsk gäliska","Irish":"iriska","Galician":"galiciska","Manx":"manx","Guarani":"guaraní","German Sign Language":"tyskt teckenspråk","Gujarati":"gujarati","Haitian":"haitisk kreol","Hausa":"hausa","Serbo-Croatian":"serbokroatiska","Hebrew":"hebreiska","Herero":"herero","Hindi":"hindi","Hiri Motu":"hiri motu","Croatian":"kroatiska","Hungarian":"ungerska","Armenian":"armeniska","Igbo":"igbo","Sichuan Yi":"sichuan yi","Inuktitut":"inuktitut","Indonesian":"indonesiska","Inupiaq":"iñupiaq","Icelandic":"isländska","Italian":"italienska","Javanese":"javanesiska","Lojban":"lojban","Japanese":"japanska","Japanese Sign Language":"japanskt teckenspråk","Kalaallisut":"kalaallisut","Kannada":"kannada","Kashmiri":"kashmiri","Georgian":"georgiska","Kanuri":"kanuri","Kazakh":"kazakiska","Khmer":"khmer","Kikuyu":"kikuyu","Kinyarwanda":"rwanda","Kirghiz":"kirgiziska","Komi":"komi","Kongo":"kikongo","Korean":"koreanska","Kuanyama":"kwanyama","Kurdish":"kurdiska","Lao":"lao","Latvian":"lettiska","Limburgan":"limburgiska","Lingala":"lingala","Lithuanian":"litauiska","Luxembourgish":"luxemburgiska","Luba-Katanga":"luba-katanga","Ganda":"luganda","Marshallese":"marshallesiska","Malayalam":"malayalam","Marathi":"marathi","Macedonian":"makedonska","Malagasy":"malagassiska","Maltese":"maltesiska","Mongolian":"mongoliska","Maori":"maori","Malay (macrolanguage)":"malajiska","Burmese":"burmesiska","Nauru":"nauruanska","Navajo":"navajo","South Ndebele":"sydndebele","North Ndebele":"nordndebele","Ndonga":"ndonga","Nepali (macrolanguage)":"nepali","Dutch":"nederländska","Norwegian Nynorsk":"nynorska","Norwegian Bokmål":"bokmål","Norwegian":"norska","Nyanja":"chichewa","Occitan":"occitanska","Ojibwa":"ojibwa","Oriya (macrolanguage)":"oriya","Oromo":"oromo","Ossetian":"ossetiska","Panjabi":"punjabi","Pakistan Sign Language":"pakistanskt teckenspråk","Polish":"polska","Portuguese":"portugisiska","Pushto":"pashto","Quechua":"quechua","Romansh":"rätoromanska","Romanian":"rumänska","Russian Sign Language":"ryskt teckenspråk","Rundi":"kirundi","Russian":"ryska","Sango":"sango","Saudi Arabian Sign Language":"saudiarabiskt teckenspråk","South African Sign Language":"sydafrikanskt teckenspråk","Sinhala":"singalesiska","Slovak":"slovakiska","Slovenian":"slovenska","Northern Sami":"nordsamiska","Samoan":"samoanska","Shona":"shona","Sindhi":"sindhi","Somali":"somaliska","Southern Sotho":"sesotho","Spanish":"spanska","Albanian":"albanska","Sardinian":"sardiska","Serbian":"serbiska","Swati":"siSwati","Sundanese":"sundanesiska","Swahili (macrolanguage)":"swahili","Swedish":"svenska","Swedish Sign Language":"svenskt teckenspråk","Tahitian":"tahitiska","Tamil":"tamil","Tatar":"tatariska","Telugu":"telugu","Tajik":"tadzjikiska","Tagalog":"tagalog","Thai":"thai","Tigrinya":"tigrinska","Klingon":"klingon","Tonga (Tonga Islands)":"tonganska","Tswana":"setswana","Tsonga":"tsonga","Turkmen":"turkmeniska","Turkish":"turkiska","Twi":"twi","Uighur":"uiguriska","Ukrainian":"ukrainska","Urdu":"urdu","Uzbek":"uzbekiska","Venda":"venda","Vietnamese":"vietnamesiska","Walloon":"vallonska","Wolof":"wolof","Xhosa":"xhosa","Yiddish":"jiddisch","Yoruba":"yoruba","Zhuang":"zhuang","Chinese":"kinesiska","Zulu":"zulu"} \ No newline at end of file {"Music":"Musik","Films":"Filmer","Vehicles":"Fordon","Art":"Konst","Sports":"Sport","Travels":"Resor","Gaming":"Spel","People":"Människor","Comedy":"Komedi","Entertainment":"Underhållning","News & Politics":"Nyheter och politik","How To":"Instruktioner","Education":"Utbildning","Activism":"Aktivism","Science & Technology":"Vetenskap och teknik","Animals":"Djur","Kids":"Barn","Food":"Mat","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Share Alike","Attribution - No Derivatives":"Attribution - No Derivatives","Attribution - Non Commercial":"Attribution - Non Commercial","Attribution - Non Commercial - Share Alike":"Attribution - Non Commercial - Share Alike","Attribution - Non Commercial - No Derivatives":"Attribution - Non Commercial - No Derivatives","Public Domain Dedication":"Public Domain Dedication","Public":"Offentlig","Unlisted":"Olistad","Private":"Privat","Published":"Publicerad","To transcode":"Att omkoda","To import":"Att importera","Pending":"I kö","Success":"Lyckades","Failed":"Misslyckades","Misc":"Diverse","Unknown":"Okänd","Afar":"afar","Abkhazian":"abchaziska","Afrikaans":"afrikaans","Akan":"akan","Amharic":"amhariska","Arabic":"arabiska","Aragonese":"aragonska","American Sign Language":"amerikanskt teckenspråk","Assamese":"assamesiska","Avaric":"avariska","Kotava":"kotava","Aymara":"aymara","Azerbaijani":"azerbajdzjanska","Bashkir":"basjkiriska","Bambara":"bambara","Belarusian":"vitryska","Bengali":"bengali","British Sign Language":"brittiskt teckenspråk","Bislama":"bislama","Tibetan":"tibetanska","Bosnian":"bosniska","Breton":"bretonska","Bulgarian":"bulgariska","Brazilian Sign Language":"brasilianskt teckenspråk","Catalan":"katalanska","Czech":"tjeckiska","Chamorro":"chamorro","Chechen":"tjetjenska","Chuvash":"tjuvasjiska","Cornish":"korniska","Corsican":"korsikanska","Cree":"cree","Czech Sign Language":"tjeckiskt teckenspråk","Chinese Sign Language":"kinesiskt teckenspråk","Welsh":"kymriska","Danish":"danska","German":"tyska","Dhivehi":"divehi","Danish Sign Language":"danskt teckenspråk","Dzongkha":"dzongkha","Modern Greek (1453-)":"modern grekiska (1453–)","English":"engelska","Esperanto":"esperanto","Estonian":"estniska","Basque":"baskiska","Ewe":"ewe","Faroese":"färöiska","Persian":"persiska","Fijian":"fijianska","Finnish":"finska","French":"franska","Western Frisian":"västfrisiska","French Sign Language":"franskt teckenspråk","Fulah":"fula","Scottish Gaelic":"skotsk gäliska","Irish":"iriska","Galician":"galiciska","Manx":"manx","Guarani":"guaraní","German Sign Language":"tyskt teckenspråk","Gujarati":"gujarati","Haitian":"haitisk kreol","Hausa":"hausa","Serbo-Croatian":"serbokroatiska","Hebrew":"hebreiska","Herero":"herero","Hindi":"hindi","Hiri Motu":"hiri motu","Croatian":"kroatiska","Hungarian":"ungerska","Armenian":"armeniska","Igbo":"igbo","Sichuan Yi":"sichuan yi","Inuktitut":"inuktitut","Indonesian":"indonesiska","Inupiaq":"iñupiaq","Icelandic":"isländska","Italian":"italienska","Javanese":"javanesiska","Lojban":"lojban","Japanese":"japanska","Japanese Sign Language":"japanskt teckenspråk","Kalaallisut":"kalaallisut","Kannada":"kannada","Kashmiri":"kashmiri","Georgian":"georgiska","Kanuri":"kanuri","Kazakh":"kazakiska","Khmer":"khmer","Kikuyu":"kikuyu","Kinyarwanda":"rwanda","Kirghiz":"kirgiziska","Komi":"komi","Kongo":"kikongo","Korean":"koreanska","Kuanyama":"kwanyama","Kurdish":"kurdiska","Lao":"lao","Latvian":"lettiska","Limburgan":"limburgiska","Lingala":"lingala","Lithuanian":"litauiska","Luxembourgish":"luxemburgiska","Luba-Katanga":"luba-katanga","Ganda":"luganda","Marshallese":"marshallesiska","Malayalam":"malayalam","Marathi":"marathi","Macedonian":"makedonska","Malagasy":"malagassiska","Maltese":"maltesiska","Mongolian":"mongoliska","Maori":"maori","Malay (macrolanguage)":"malajiska","Burmese":"burmesiska","Nauru":"nauruanska","Navajo":"navajo","South Ndebele":"sydndebele","North Ndebele":"nordndebele","Ndonga":"ndonga","Nepali (macrolanguage)":"nepali","Dutch":"nederländska","Norwegian Nynorsk":"nynorska","Norwegian Bokmål":"bokmål","Norwegian":"norska","Nyanja":"chichewa","Occitan":"occitanska","Ojibwa":"ojibwa","Oriya (macrolanguage)":"oriya","Oromo":"oromo","Ossetian":"ossetiska","Panjabi":"punjabi","Pakistan Sign Language":"pakistanskt teckenspråk","Polish":"polska","Portuguese":"portugisiska","Pushto":"pashto","Quechua":"quechua","Romansh":"rätoromanska","Romanian":"rumänska","Russian Sign Language":"ryskt teckenspråk","Rundi":"kirundi","Russian":"ryska","Sango":"sango","Saudi Arabian Sign Language":"saudiarabiskt teckenspråk","South African Sign Language":"sydafrikanskt teckenspråk","Sinhala":"singalesiska","Slovak":"slovakiska","Slovenian":"slovenska","Northern Sami":"nordsamiska","Samoan":"samoanska","Shona":"shona","Sindhi":"sindhi","Somali":"somaliska","Southern Sotho":"sesotho","Spanish":"spanska","Albanian":"albanska","Sardinian":"sardiska","Serbian":"serbiska","Swati":"siSwati","Sundanese":"sundanesiska","Swahili (macrolanguage)":"swahili","Swedish":"svenska","Swedish Sign Language":"svenskt teckenspråk","Tahitian":"tahitiska","Tamil":"tamil","Tatar":"tatariska","Telugu":"telugu","Tajik":"tadzjikiska","Tagalog":"tagalog","Thai":"thai","Tigrinya":"tigrinska","Klingon":"klingon","Tonga (Tonga Islands)":"tonganska","Tswana":"setswana","Tsonga":"tsonga","Turkmen":"turkmeniska","Turkish":"turkiska","Twi":"twi","Uighur":"uiguriska","Ukrainian":"ukrainska","Urdu":"urdu","Uzbek":"uzbekiska","Venda":"venda","Vietnamese":"vietnamesiska","Walloon":"vallonska","Wolof":"wolof","Xhosa":"xhosa","Yiddish":"jiddisch","Yoruba":"yoruba","Zhuang":"zhuang","Chinese":"kinesiska","Zulu":"zulu"} \ No newline at end of file
diff --git a/client/src/locale/target/server_zh_Hans_CN.json b/client/src/locale/target/server_zh_Hans_CN.json
index 1ba54d276..28e66105f 100644
--- a/client/src/locale/target/server_zh_Hans_CN.json
+++ b/client/src/locale/target/server_zh_Hans_CN.json
@@ -1 +1 @@
{"Music":"音ä¹","Films":"电影","Vehicles":"汽车","Art":"艺术","Sports":"体育","Travels":"旅游","Gaming":"游æˆ","People":"人物","Comedy":"喜剧","Entertainment":"娱ä¹","News":"æ–°é—»","How To":"教程","Education":"教育","Activism":"社会活动","Science & Technology":"科学和技术","Animals":"动物","Kids":"å„¿ç«¥","Food":"美食","Attribution":"ç½²å","Attribution - Share Alike":"ç½²å - 相åŒæ–¹å¼å…±äº«","Attribution - No Derivatives":"ç½²å - ç¦æ­¢æ¼”绎","Attribution - Non Commercial":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨","Attribution - Non Commercial - Share Alike":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨ - 相åŒæ–¹å¼å…±äº«","Attribution - Non Commercial - No Derivatives":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨ - ç¦æ­¢æ¼”绎","Public Domain Dedication":"公共领域贡献","Public":"公开","Unlisted":"ä¸å…¬å¼€","Private":"ç§äº«","Published":"å·²å‘布","To transcode":"转ç ä¸­","To import":"导入中","Pending":"等待中","Success":"æˆåŠŸ","Failed":"失败","Misc":"æ‚项","Unknown":"未知","Afar":"阿法尔语","Abkhazian":"阿布哈兹语","Afrikaans":"阿éžåˆ©å ªæ–¯è¯­","Akan":"阿åŽè¯­","Amharic":"阿姆哈拉语","Arabic":"阿拉伯语","Aragonese":"阿拉贡语","American Sign Language":"美国手语","Assamese":"阿è¨å§†è¯­","Avaric":"阿瓦尔语","Kotava":"科塔瓦语","Aymara":"艾马拉语","Azerbaijani":"阿塞拜疆语","Bashkir":"巴什基尔语","Bambara":"ç­å·´æ‹‰è¯­","Belarusian":"白俄罗斯语","Bengali":"孟加拉语","British Sign Language":"英国手语","Bislama":"比斯拉玛语","Tibetan":"è—语","Bosnian":"波斯尼亚语","Breton":"布列塔尼语","Bulgarian":"ä¿åŠ åˆ©äºšè¯­","Brazilian Sign Language":"巴西手语","Catalan":"加泰隆语","Czech":"æ·å…‹è¯­","Chamorro":"查莫罗语","Chechen":"车臣语","Chuvash":"楚瓦什语","Cornish":"康沃尔语","Corsican":"科西嘉语","Cree":"克里语","Czech Sign Language":"æ·å…‹æ‰‹è¯­","Chinese Sign Language":"中国手语","Welsh":"å¨å°”士语","Danish":"丹麦语","German":"德语","Dhivehi":"迪维希语","Danish Sign Language":"丹麦手语","Dzongkha":"ä¸ä¸¹è¯­","Modern Greek (1453-)":"现代希腊语","English":"英语","Esperanto":"世界语","Estonian":"爱沙尼亚语","Basque":"巴斯克语","Ewe":"埃维语","Faroese":"法罗斯语","Persian":"波斯语","Fijian":"æ–济语","Finnish":"芬兰语","French":"法语","Western Frisian":"弗里西亚语","French Sign Language":"法国手语","Fulah":"富拉语","Scottish Gaelic":"è‹æ ¼å…°ç›–尔语","Irish":"爱尔兰语","Galician":"加利西亚语","Manx":"马æ©å²›è¯­","Guarani":"瓜拉尼语","German Sign Language":"德国手语","Gujarati":"å¤å‰æ‹‰ç‰¹è¯­","Haitian":"海地语","Hausa":"豪è¨è¯­","Serbo-Croatian":"塞尔维亚-克罗地亚语","Hebrew":"希伯æ¥è¯­","Herero":"赫雷罗语","Hindi":"å°åœ°è¯­","Hiri Motu":"希里莫图语","Croatian":"克罗地亚语","Hungarian":"匈牙利语","Armenian":"亚美尼亚语","Igbo":"伊åšè¯­","Sichuan Yi":"å››å·å½è¯­","Inuktitut":"伊努伊特语","Indonesian":"å°å°¼è¯­","Inupiaq":"ä¾åŠªåº‡å…‹è¯­","Icelandic":"冰岛语","Italian":"æ„大利语","Javanese":"爪哇语","Lojban":"逻辑语","Japanese":"日语","Japanese Sign Language":"日本手语","Kalaallisut":"格陵兰语","Kannada":"åŽçº³è¾¾è¯­","Kashmiri":"克什米尔语","Georgian":"æ ¼é²å‰äºšè¯­","Kanuri":"å¡åŠªé‡Œè¯­","Kazakh":"哈è¨å…‹è¯­","Khmer":"高棉语","Kikuyu":"基库尤语","Kinyarwanda":"基尼阿万达语","Kirghiz":"å‰å°”å‰æ–¯è¯­","Komi":"科米语","Kongo":"刚果语","Korean":"æœé²œè¯­","Kuanyama":"宽亚玛语","Kurdish":"库尔德语","Lao":"è€æŒè¯­","Latvian":"拉脱维亚语","Limburgan":"林堡语","Lingala":"林加拉语","Lithuanian":"立陶宛语","Luxembourgish":"å¢æ£®å ¡è¯­","Luba-Katanga":"å¢å·´-加丹加语","Ganda":"干达语","Marshallese":"马ç»å°”语","Malayalam":"马拉亚拉姆语","Marathi":"马拉æ语","Macedonian":"马其顿语","Malagasy":"马达加斯加语","Maltese":"马耳他语","Mongolian":"è’™å¤è¯­","Maori":"毛利语","Malay (macrolanguage)":"马æ¥è¯­ï¼ˆå¹¿ä¹‰ï¼‰","Burmese":"缅甸语","Nauru":"ç‘™é²è¯­","Navajo":"纳瓦éœè¯­","South Ndebele":"å—æ©å¾·è´å‹’语","North Ndebele":"北æ©å¾·è´å‹’语","Ndonga":"æ©æ•¦åŠ è¯­","Nepali (macrolanguage)":"尼泊尔语(广义)","Dutch":"è·å…°è¯­","Norwegian Nynorsk":"新挪å¨è¯­","Norwegian BokmÃ¥l":"挪å¨å¸ƒå…‹èŽ«å°”语","Norwegian":"挪å¨è¯­","Nyanja":"尼扬贾语","Occitan":"奥克西å”语","Ojibwa":"奥å‰å¸ƒç“¦è¯­","Oriya (macrolanguage)":"奥利亚语(广义)","Oromo":"阿芳·奥洛莫语","Ossetian":"奥塞梯语","Panjabi":"æ—é®æ™®è¯­","Pakistan Sign Language":"巴基斯å¦æ‰‹è¯­","Polish":"波兰语","Portuguese":"è‘¡è„牙语","Pushto":"普什图语","Quechua":"凯楚亚语","Romansh":"罗曼什语","Romanian":"罗马尼亚语","Russian Sign Language":"俄罗斯手语","Rundi":"基隆迪语","Russian":"俄语","Sango":"桑戈语","Saudi Arabian Sign Language":"沙特阿拉伯手语","South African Sign Language":"å—éžæ‰‹è¯­","Sinhala":"僧加罗语","Slovak":"斯洛ä¼å…‹è¯­","Slovenian":"斯洛文尼亚语","Northern Sami":"北è¨ç±³è¯­","Samoan":"è¨æ‘©äºšè¯­","Shona":"ç»çº³è¯­","Sindhi":"信德语","Somali":"索马里语","Southern Sotho":"塞索托语","Spanish":"西ç­ç‰™è¯­","Albanian":"阿尔巴尼亚语","Sardinian":"æ’’ä¸è¯­","Serbian":"塞尔维亚语","Swati":"塞斯瓦替语","Sundanese":"巽他语","Swahili (macrolanguage)":"斯瓦希里语(广义)","Swedish":"瑞典语","Swedish Sign Language":"瑞典手语","Tahitian":"塔希æ语","Tamil":"泰米尔语","Tatar":"塔塔尔语","Telugu":"æ³°å¢å›ºè¯­","Tajik":"å¡”å‰å…‹è¯­","Tagalog":"他加禄语","Thai":"泰语","Tigrinya":"æ格里尼亚语","Klingon":"克林贡语","Tonga (Tonga Islands)":"汤加语","Tswana":"塞茨瓦纳语","Tsonga":"宗加语","Turkmen":"土库曼语","Turkish":"土耳其语","Twi":"特å¨è¯­","Uighur":"ç»´å¾å°”语","Ukrainian":"乌克兰语","Urdu":"乌尔都语","Uzbek":"乌兹别克语","Venda":"文达语","Vietnamese":"越å—语","Walloon":"沃伦语","Wolof":"沃洛夫语","Xhosa":"科è¨è¯­","Yiddish":"ä¾åœ°è¯­","Yoruba":"约é²å·´è¯­","Zhuang":"壮语","Chinese":"汉语","Zulu":"祖é²è¯­"} \ No newline at end of file {"Music":"音ä¹","Films":"电影","Vehicles":"汽车","Art":"艺术","Sports":"体育","Travels":"旅游","Gaming":"游æˆ","People":"人物","Comedy":"喜剧","Entertainment":"娱ä¹","News & Politics":"新闻和时政","How To":"教程","Education":"教育","Activism":"社会活动","Science & Technology":"科学和技术","Animals":"动物","Kids":"å„¿ç«¥","Food":"美食","Attribution":"ç½²å","Attribution - Share Alike":"ç½²å - 相åŒæ–¹å¼å…±äº«","Attribution - No Derivatives":"ç½²å - ç¦æ­¢æ¼”绎","Attribution - Non Commercial":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨","Attribution - Non Commercial - Share Alike":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨ - 相åŒæ–¹å¼å…±äº«","Attribution - Non Commercial - No Derivatives":"ç½²å - éžå•†ä¸šæ€§ä½¿ç”¨ - ç¦æ­¢æ¼”绎","Public Domain Dedication":"公共领域贡献","Public":"公开","Unlisted":"ä¸å…¬å¼€","Private":"ç§äº«","Published":"å·²å‘布","To transcode":"转ç ä¸­","To import":"导入中","Pending":"等待中","Success":"æˆåŠŸ","Failed":"失败","Misc":"æ‚项","Unknown":"未知","Afar":"阿法尔语","Abkhazian":"阿布哈兹语","Afrikaans":"阿éžåˆ©å ªæ–¯è¯­","Akan":"阿åŽè¯­","Amharic":"阿姆哈拉语","Arabic":"阿拉伯语","Aragonese":"阿拉贡语","American Sign Language":"美国手语","Assamese":"阿è¨å§†è¯­","Avaric":"阿瓦尔语","Kotava":"科塔瓦语","Aymara":"艾马拉语","Azerbaijani":"阿塞拜疆语","Bashkir":"巴什基尔语","Bambara":"ç­å·´æ‹‰è¯­","Belarusian":"白俄罗斯语","Bengali":"孟加拉语","British Sign Language":"英国手语","Bislama":"比斯拉玛语","Tibetan":"è—语","Bosnian":"波斯尼亚语","Breton":"布列塔尼语","Bulgarian":"ä¿åŠ åˆ©äºšè¯­","Brazilian Sign Language":"巴西手语","Catalan":"加泰隆语","Czech":"æ·å…‹è¯­","Chamorro":"查莫罗语","Chechen":"车臣语","Chuvash":"楚瓦什语","Cornish":"康沃尔语","Corsican":"科西嘉语","Cree":"克里语","Czech Sign Language":"æ·å…‹æ‰‹è¯­","Chinese Sign Language":"中国手语","Welsh":"å¨å°”士语","Danish":"丹麦语","German":"德语","Dhivehi":"迪维希语","Danish Sign Language":"丹麦手语","Dzongkha":"ä¸ä¸¹è¯­","Modern Greek (1453-)":"现代希腊语","English":"英语","Esperanto":"世界语","Estonian":"爱沙尼亚语","Basque":"巴斯克语","Ewe":"埃维语","Faroese":"法罗斯语","Persian":"波斯语","Fijian":"æ–济语","Finnish":"芬兰语","French":"法语","Western Frisian":"弗里西亚语","French Sign Language":"法国手语","Fulah":"富拉语","Scottish Gaelic":"è‹æ ¼å…°ç›–尔语","Irish":"爱尔兰语","Galician":"加利西亚语","Manx":"马æ©å²›è¯­","Guarani":"瓜拉尼语","German Sign Language":"德国手语","Gujarati":"å¤å‰æ‹‰ç‰¹è¯­","Haitian":"海地语","Hausa":"豪è¨è¯­","Serbo-Croatian":"塞尔维亚-克罗地亚语","Hebrew":"希伯æ¥è¯­","Herero":"赫雷罗语","Hindi":"å°åœ°è¯­","Hiri Motu":"希里莫图语","Croatian":"克罗地亚语","Hungarian":"匈牙利语","Armenian":"亚美尼亚语","Igbo":"伊åšè¯­","Sichuan Yi":"å››å·å½è¯­","Inuktitut":"伊努伊特语","Indonesian":"å°å°¼è¯­","Inupiaq":"ä¾åŠªåº‡å…‹è¯­","Icelandic":"冰岛语","Italian":"æ„大利语","Javanese":"爪哇语","Lojban":"逻辑语","Japanese":"日语","Japanese Sign Language":"日本手语","Kalaallisut":"格陵兰语","Kannada":"åŽçº³è¾¾è¯­","Kashmiri":"克什米尔语","Georgian":"æ ¼é²å‰äºšè¯­","Kanuri":"å¡åŠªé‡Œè¯­","Kazakh":"哈è¨å…‹è¯­","Khmer":"高棉语","Kikuyu":"基库尤语","Kinyarwanda":"基尼阿万达语","Kirghiz":"å‰å°”å‰æ–¯è¯­","Komi":"科米语","Kongo":"刚果语","Korean":"æœé²œè¯­","Kuanyama":"宽亚玛语","Kurdish":"库尔德语","Lao":"è€æŒè¯­","Latvian":"拉脱维亚语","Limburgan":"林堡语","Lingala":"林加拉语","Lithuanian":"立陶宛语","Luxembourgish":"å¢æ£®å ¡è¯­","Luba-Katanga":"å¢å·´-加丹加语","Ganda":"干达语","Marshallese":"马ç»å°”语","Malayalam":"马拉亚拉姆语","Marathi":"马拉æ语","Macedonian":"马其顿语","Malagasy":"马达加斯加语","Maltese":"马耳他语","Mongolian":"è’™å¤è¯­","Maori":"毛利语","Malay (macrolanguage)":"马æ¥è¯­ï¼ˆå¹¿ä¹‰ï¼‰","Burmese":"缅甸语","Nauru":"ç‘™é²è¯­","Navajo":"纳瓦éœè¯­","South Ndebele":"å—æ©å¾·è´å‹’语","North Ndebele":"北æ©å¾·è´å‹’语","Ndonga":"æ©æ•¦åŠ è¯­","Nepali (macrolanguage)":"尼泊尔语(广义)","Dutch":"è·å…°è¯­","Norwegian Nynorsk":"新挪å¨è¯­","Norwegian BokmÃ¥l":"挪å¨å¸ƒå…‹èŽ«å°”语","Norwegian":"挪å¨è¯­","Nyanja":"尼扬贾语","Occitan":"奥克西å”语","Ojibwa":"奥å‰å¸ƒç“¦è¯­","Oriya (macrolanguage)":"奥利亚语(广义)","Oromo":"阿芳·奥洛莫语","Ossetian":"奥塞梯语","Panjabi":"æ—é®æ™®è¯­","Pakistan Sign Language":"巴基斯å¦æ‰‹è¯­","Polish":"波兰语","Portuguese":"è‘¡è„牙语","Pushto":"普什图语","Quechua":"凯楚亚语","Romansh":"罗曼什语","Romanian":"罗马尼亚语","Russian Sign Language":"俄罗斯手语","Rundi":"基隆迪语","Russian":"俄语","Sango":"桑戈语","Saudi Arabian Sign Language":"沙特阿拉伯手语","South African Sign Language":"å—éžæ‰‹è¯­","Sinhala":"僧加罗语","Slovak":"斯洛ä¼å…‹è¯­","Slovenian":"斯洛文尼亚语","Northern Sami":"北è¨ç±³è¯­","Samoan":"è¨æ‘©äºšè¯­","Shona":"ç»çº³è¯­","Sindhi":"信德语","Somali":"索马里语","Southern Sotho":"塞索托语","Spanish":"西ç­ç‰™è¯­","Albanian":"阿尔巴尼亚语","Sardinian":"æ’’ä¸è¯­","Serbian":"塞尔维亚语","Swati":"塞斯瓦替语","Sundanese":"巽他语","Swahili (macrolanguage)":"斯瓦希里语(广义)","Swedish":"瑞典语","Swedish Sign Language":"瑞典手语","Tahitian":"塔希æ语","Tamil":"泰米尔语","Tatar":"塔塔尔语","Telugu":"æ³°å¢å›ºè¯­","Tajik":"å¡”å‰å…‹è¯­","Tagalog":"他加禄语","Thai":"泰语","Tigrinya":"æ格里尼亚语","Klingon":"克林贡语","Tonga (Tonga Islands)":"汤加语","Tswana":"塞茨瓦纳语","Tsonga":"宗加语","Turkmen":"土库曼语","Turkish":"土耳其语","Twi":"特å¨è¯­","Uighur":"ç»´å¾å°”语","Ukrainian":"乌克兰语","Urdu":"乌尔都语","Uzbek":"乌兹别克语","Venda":"文达语","Vietnamese":"越å—语","Walloon":"沃伦语","Wolof":"沃洛夫语","Xhosa":"科è¨è¯­","Yiddish":"ä¾åœ°è¯­","Yoruba":"约é²å·´è¯­","Zhuang":"壮语","Chinese":"汉语","Zulu":"祖é²è¯­"} \ No newline at end of file
diff --git a/client/src/locale/target/server_zh_Hant_TW.json b/client/src/locale/target/server_zh_Hant_TW.json
index 7b210d564..24f638df0 100644
--- a/client/src/locale/target/server_zh_Hant_TW.json
+++ b/client/src/locale/target/server_zh_Hant_TW.json
@@ -1 +1 @@
{"Music":"音樂","Films":"電影","Vehicles":"汽車","Art":"è—è¡“","Sports":"é‹å‹•","Travels":"æ—…éŠ","Gaming":"éŠæˆ²","People":"大眾","Comedy":"喜劇","Entertainment":"娛樂","News":"æ–°èž","How To":"How To","Education":"教育","Activism":"行動","Science & Technology":"科學與科技","Animals":"動物","Kids":"å…’ç«¥","Food":"食物","Attribution":"姓å標示","Attribution - Share Alike":"姓å標示 - 相åŒæ–¹å¼åˆ†äº«","Attribution - No Derivatives":"姓å標示 - ç¦æ­¢æ”¹ä½œ","Attribution - Non Commercial":"姓å標示 - éžå•†æ¥­æ€§","Attribution - Non Commercial - Share Alike":"姓å標示 - éžå•†æ¥­æ€§ - 相åŒæ–¹å¼åˆ†äº«","Attribution - Non Commercial - No Derivatives":"姓å標示 - éžå•†æ¥­æ€§ - ç¦æ­¢æ”¹ä½œ","Public Domain Dedication":"公有領域","Public":"公開","Unlisted":"ä¸åˆ—出","Private":"ç§äºº","Published":"已發佈","To transcode":"待轉æ›ç·¨ç¢¼","To import":"待匯入","Pending":"擱置中","Success":"æˆåŠŸ","Failed":"失敗","Misc":"雜項","Unknown":"未知","Afar":"阿法爾語","Abkhazian":"阿布哈茲語","Afrikaans":"å—éžèªž","Akan":"阿寒語","Amharic":"阿姆哈拉語","Arabic":"阿拉伯語","Aragonese":"亞拉岡語","American Sign Language":"美國手語","Assamese":"阿薩姆語","Avaric":"阿瓦爾語","Kotava":"Kotava 語","Aymara":"艾馬拉語","Azerbaijani":"亞塞拜然語","Bashkir":"巴什基爾語","Bambara":"ç­å·´æ‹‰èªž","Belarusian":"白俄羅斯語","Bengali":"孟加拉語","British Sign Language":"英國手語","Bislama":"比斯拉馬語","Tibetan":"è—語","Bosnian":"波士尼亞語","Breton":"布列塔尼語","Bulgarian":"ä¿åŠ åˆ©äºžèªž","Brazilian Sign Language":"巴西手語","Catalan":"加泰隆尼亞語","Czech":"æ·å…‹èªž","Chamorro":"查莫羅語","Chechen":"車臣語","Chuvash":"楚瓦什語","Cornish":"康瓦爾語","Corsican":"科西嘉語","Cree":"克里語","Czech Sign Language":"æ·å…‹æ‰‹èªž","Chinese Sign Language":"中國手語","Welsh":"å¨çˆ¾æ–¯èªž","Danish":"丹麥語","German":"德語","Dhivehi":"迪維西語","Danish Sign Language":"丹麥手語","Dzongkha":"ä¸ä¸¹èªž","Modern Greek (1453-)":"ç¾ä»£å¸Œè‡˜èªžï¼ˆ1453年後)","English":"英語","Esperanto":"世界語","Estonian":"愛沙尼亞語","Basque":"巴斯克語","Ewe":"埃維語","Faroese":"法羅語","Persian":"波斯語","Fijian":"æ–濟語","Finnish":"芬蘭語","French":"法語","Western Frisian":"西è²å£«è˜­èªž","French Sign Language":"法國手語","Fulah":"富拉語","Scottish Gaelic":"蘇格蘭蓋爾語","Irish":"愛爾蘭語","Galician":"加利西亞語","Manx":"曼島語","Guarani":"瓜拉尼語","German Sign Language":"德國手語","Gujarati":"å¤å‰æ‹‰ç‰¹èªž","Haitian":"海地語","Hausa":"豪薩語","Serbo-Croatian":"塞爾維亞-克羅埃西亞語","Hebrew":"希伯來語","Herero":"赫雷羅語","Hindi":"å°åœ°èªž","Hiri Motu":"希里摩圖語","Croatian":"克羅埃西亞語","Hungarian":"匈牙利語","Armenian":"亞美尼亞語","Igbo":"伊åšèªž","Sichuan Yi":"å½èªžåŒ—部方言","Inuktitut":"å› ç´ç‰¹èªž","Indonesian":"å°å°¼èªž","Inupiaq":"å› ç´çš®é›…特語","Icelandic":"冰島語","Italian":"義大利語","Javanese":"爪哇語","Lojban":"é‚輯語","Japanese":"日語","Japanese Sign Language":"日本手語","Kalaallisut":"格陵蘭語","Kannada":"康ç´é”語","Kashmiri":"喀什米爾語","Georgian":"喬治亞語","Kanuri":"å¡åŠªé‡Œèªž","Kazakh":"哈薩克語","Khmer":"高棉語","Kikuyu":"基庫尤語","Kinyarwanda":"盧安é”語","Kirghiz":"å‰çˆ¾å‰æ–¯èªž","Komi":"科米語","Kongo":"剛果語","Korean":"韓語","Kuanyama":"Kuanyama 語","Kurdish":"庫德語","Lao":"寮語","Latvian":"拉脫維亞語","Limburgan":"林堡語","Lingala":"林格拉語","Lithuanian":"立陶宛語","Luxembourgish":"盧森堡語","Luba-Katanga":"盧巴å¡ä¸¹åŠ èªž","Ganda":"盧干é”語","Marshallese":"馬紹爾語","Malayalam":"馬拉雅拉姆語","Marathi":"馬拉æ語","Macedonian":"馬其頓語","Malagasy":"馬拉加斯語","Maltese":"馬爾他語","Mongolian":"è’™å¤èªž","Maori":"毛利語","Malay (macrolanguage)":"馬來語","Burmese":"緬甸語","Nauru":"諾魯語","Navajo":"ç´ç“¦è·èªž","South Ndebele":"å—æ©å¾·è²å‹’語","North Ndebele":"北æ©å¾·è²å‹’語","Ndonga":"æ©æ•¦åŠ èªž","Nepali (macrolanguage)":"尼泊爾語","Dutch":"è·è˜­èªž","Norwegian Nynorsk":"新挪å¨èªž","Norwegian BokmÃ¥l":"書é¢æŒªå¨èªž","Norwegian":"挪å¨èªž","Nyanja":"å°¼æšè³ˆèªž","Occitan":"奧克西當語","Ojibwa":"æ­åŠå¸ƒå¨èªž","Oriya (macrolanguage)":"æ­åˆ©äºžèªž","Oromo":"奧羅莫語","Ossetian":"奧塞æ亞語","Panjabi":"æ—é®æ™®èªž","Pakistan Sign Language":"巴基斯å¦æ‰‹èªž","Polish":"波蘭語","Portuguese":"è‘¡è„牙語","Pushto":"普什圖語","Quechua":"奇楚瓦語","Romansh":"羅曼什語","Romanian":"羅馬尼亞語","Russian Sign Language":"俄羅斯手語","Rundi":"克倫地語","Russian":"俄語","Sango":"桑戈語","Saudi Arabian Sign Language":"æ²™çƒåœ°é˜¿æ‹‰ä¼¯æ‰‹èªž","South African Sign Language":"å—éžæ‰‹èªž","Sinhala":"僧伽羅語","Slovak":"斯洛ä¼å…‹èªž","Slovenian":"斯洛維尼亞語","Northern Sami":"北方薩米語","Samoan":"薩摩亞語","Shona":"ä¿®ç´èªž","Sindhi":"信德語","Somali":"索馬利亞語","Southern Sotho":"塞索托語","Spanish":"西ç­ç‰™èªž","Albanian":"阿爾巴尼亞語","Sardinian":"è–©ä¸å°¼äºžèªž","Serbian":"塞爾維亞語","Swati":"å²ç“¦æ¿Ÿèªž","Sundanese":"巽他語","Swahili (macrolanguage)":"斯瓦希里語","Swedish":"瑞典語","Swedish Sign Language":"瑞典手語","Tahitian":"大溪地語","Tamil":"å¦ç±³çˆ¾èªž","Tatar":"韃é¼èªž","Telugu":"泰盧固語","Tajik":"å¡”å‰å…‹èªž","Tagalog":"他加祿語","Thai":"泰語","Tigrinya":"æ格利尼亞語","Klingon":"克林貢語","Tonga (Tonga Islands)":"æ±åŠ èªž","Tswana":"札那語","Tsonga":"宋加語","Turkmen":"土庫曼語","Turkish":"土耳其語","Twi":"契維語","Uighur":"維å¾çˆ¾èªž","Ukrainian":"çƒå…‹è˜­èªž","Urdu":"çƒçˆ¾éƒ½èªž","Uzbek":"çƒèŒ²åˆ¥å…‹èªž","Venda":"æ–‡é”語","Vietnamese":"越å—語","Walloon":"瓦隆語","Wolof":"沃洛夫語","Xhosa":"科薩語","Yiddish":"æ„第緒語","Yoruba":"約魯巴語","Zhuang":"壯語","Chinese":"漢語","Zulu":"祖魯語"} \ No newline at end of file {"Music":"音樂","Films":"電影","Vehicles":"汽車","Art":"è—è¡“","Sports":"é‹å‹•","Travels":"æ—…éŠ","Gaming":"éŠæˆ²","People":"大眾","Comedy":"喜劇","Entertainment":"娛樂","News & Politics":"æ–°èžèˆ‡æ”¿ç­–","How To":"How To","Education":"教育","Activism":"行動","Science & Technology":"科學與科技","Animals":"動物","Kids":"å…’ç«¥","Food":"食物","Attribution":"姓å標示","Attribution - Share Alike":"姓å標示 - 相åŒæ–¹å¼åˆ†äº«","Attribution - No Derivatives":"姓å標示 - ç¦æ­¢æ”¹ä½œ","Attribution - Non Commercial":"姓å標示 - éžå•†æ¥­æ€§","Attribution - Non Commercial - Share Alike":"姓å標示 - éžå•†æ¥­æ€§ - 相åŒæ–¹å¼åˆ†äº«","Attribution - Non Commercial - No Derivatives":"姓å標示 - éžå•†æ¥­æ€§ - ç¦æ­¢æ”¹ä½œ","Public Domain Dedication":"公有領域","Public":"公開","Unlisted":"ä¸åˆ—出","Private":"ç§äºº","Published":"已發佈","To transcode":"待轉æ›ç·¨ç¢¼","To import":"待匯入","Pending":"擱置中","Success":"æˆåŠŸ","Failed":"失敗","Misc":"雜項","Unknown":"未知","Afar":"阿法爾語","Abkhazian":"阿布哈茲語","Afrikaans":"å—éžèªž","Akan":"阿寒語","Amharic":"阿姆哈拉語","Arabic":"阿拉伯語","Aragonese":"亞拉岡語","American Sign Language":"美國手語","Assamese":"阿薩姆語","Avaric":"阿瓦爾語","Kotava":"Kotava 語","Aymara":"艾馬拉語","Azerbaijani":"亞塞拜然語","Bashkir":"巴什基爾語","Bambara":"ç­å·´æ‹‰èªž","Belarusian":"白俄羅斯語","Bengali":"孟加拉語","British Sign Language":"英國手語","Bislama":"比斯拉馬語","Tibetan":"è—語","Bosnian":"波士尼亞語","Breton":"布列塔尼語","Bulgarian":"ä¿åŠ åˆ©äºžèªž","Brazilian Sign Language":"巴西手語","Catalan":"加泰隆尼亞語","Czech":"æ·å…‹èªž","Chamorro":"查莫羅語","Chechen":"車臣語","Chuvash":"楚瓦什語","Cornish":"康瓦爾語","Corsican":"科西嘉語","Cree":"克里語","Czech Sign Language":"æ·å…‹æ‰‹èªž","Chinese Sign Language":"中國手語","Welsh":"å¨çˆ¾æ–¯èªž","Danish":"丹麥語","German":"德語","Dhivehi":"迪維西語","Danish Sign Language":"丹麥手語","Dzongkha":"ä¸ä¸¹èªž","Modern Greek (1453-)":"ç¾ä»£å¸Œè‡˜èªžï¼ˆ1453年後)","English":"英語","Esperanto":"世界語","Estonian":"愛沙尼亞語","Basque":"巴斯克語","Ewe":"埃維語","Faroese":"法羅語","Persian":"波斯語","Fijian":"æ–濟語","Finnish":"芬蘭語","French":"法語","Western Frisian":"西è²å£«è˜­èªž","French Sign Language":"法國手語","Fulah":"富拉語","Scottish Gaelic":"蘇格蘭蓋爾語","Irish":"愛爾蘭語","Galician":"加利西亞語","Manx":"曼島語","Guarani":"瓜拉尼語","German Sign Language":"德國手語","Gujarati":"å¤å‰æ‹‰ç‰¹èªž","Haitian":"海地語","Hausa":"豪薩語","Serbo-Croatian":"塞爾維亞-克羅埃西亞語","Hebrew":"希伯來語","Herero":"赫雷羅語","Hindi":"å°åœ°èªž","Hiri Motu":"希里摩圖語","Croatian":"克羅埃西亞語","Hungarian":"匈牙利語","Armenian":"亞美尼亞語","Igbo":"伊åšèªž","Sichuan Yi":"å½èªžåŒ—部方言","Inuktitut":"å› ç´ç‰¹èªž","Indonesian":"å°å°¼èªž","Inupiaq":"å› ç´çš®é›…特語","Icelandic":"冰島語","Italian":"義大利語","Javanese":"爪哇語","Lojban":"é‚輯語","Japanese":"日語","Japanese Sign Language":"日本手語","Kalaallisut":"格陵蘭語","Kannada":"康ç´é”語","Kashmiri":"喀什米爾語","Georgian":"喬治亞語","Kanuri":"å¡åŠªé‡Œèªž","Kazakh":"哈薩克語","Khmer":"高棉語","Kikuyu":"基庫尤語","Kinyarwanda":"盧安é”語","Kirghiz":"å‰çˆ¾å‰æ–¯èªž","Komi":"科米語","Kongo":"剛果語","Korean":"韓語","Kuanyama":"Kuanyama 語","Kurdish":"庫德語","Lao":"寮語","Latvian":"拉脫維亞語","Limburgan":"林堡語","Lingala":"林格拉語","Lithuanian":"立陶宛語","Luxembourgish":"盧森堡語","Luba-Katanga":"盧巴å¡ä¸¹åŠ èªž","Ganda":"盧干é”語","Marshallese":"馬紹爾語","Malayalam":"馬拉雅拉姆語","Marathi":"馬拉æ語","Macedonian":"馬其頓語","Malagasy":"馬拉加斯語","Maltese":"馬爾他語","Mongolian":"è’™å¤èªž","Maori":"毛利語","Malay (macrolanguage)":"馬來語","Burmese":"緬甸語","Nauru":"諾魯語","Navajo":"ç´ç“¦è·èªž","South Ndebele":"å—æ©å¾·è²å‹’語","North Ndebele":"北æ©å¾·è²å‹’語","Ndonga":"æ©æ•¦åŠ èªž","Nepali (macrolanguage)":"尼泊爾語","Dutch":"è·è˜­èªž","Norwegian Nynorsk":"新挪å¨èªž","Norwegian BokmÃ¥l":"書é¢æŒªå¨èªž","Norwegian":"挪å¨èªž","Nyanja":"å°¼æšè³ˆèªž","Occitan":"奧克西當語","Ojibwa":"æ­åŠå¸ƒå¨èªž","Oriya (macrolanguage)":"æ­åˆ©äºžèªž","Oromo":"奧羅莫語","Ossetian":"奧塞æ亞語","Panjabi":"æ—é®æ™®èªž","Pakistan Sign Language":"巴基斯å¦æ‰‹èªž","Polish":"波蘭語","Portuguese":"è‘¡è„牙語","Pushto":"普什圖語","Quechua":"奇楚瓦語","Romansh":"羅曼什語","Romanian":"羅馬尼亞語","Russian Sign Language":"俄羅斯手語","Rundi":"克倫地語","Russian":"俄語","Sango":"桑戈語","Saudi Arabian Sign Language":"æ²™çƒåœ°é˜¿æ‹‰ä¼¯æ‰‹èªž","South African Sign Language":"å—éžæ‰‹èªž","Sinhala":"僧伽羅語","Slovak":"斯洛ä¼å…‹èªž","Slovenian":"斯洛維尼亞語","Northern Sami":"北方薩米語","Samoan":"薩摩亞語","Shona":"ä¿®ç´èªž","Sindhi":"信德語","Somali":"索馬利亞語","Southern Sotho":"塞索托語","Spanish":"西ç­ç‰™èªž","Albanian":"阿爾巴尼亞語","Sardinian":"è–©ä¸å°¼äºžèªž","Serbian":"塞爾維亞語","Swati":"å²ç“¦æ¿Ÿèªž","Sundanese":"巽他語","Swahili (macrolanguage)":"斯瓦希里語","Swedish":"瑞典語","Swedish Sign Language":"瑞典手語","Tahitian":"大溪地語","Tamil":"å¦ç±³çˆ¾èªž","Tatar":"韃é¼èªž","Telugu":"泰盧固語","Tajik":"å¡”å‰å…‹èªž","Tagalog":"他加祿語","Thai":"泰語","Tigrinya":"æ格利尼亞語","Klingon":"克林貢語","Tonga (Tonga Islands)":"æ±åŠ èªž","Tswana":"札那語","Tsonga":"宋加語","Turkmen":"土庫曼語","Turkish":"土耳其語","Twi":"契維語","Uighur":"維å¾çˆ¾èªž","Ukrainian":"çƒå…‹è˜­èªž","Urdu":"çƒçˆ¾éƒ½èªž","Uzbek":"çƒèŒ²åˆ¥å…‹èªž","Venda":"æ–‡é”語","Vietnamese":"越å—語","Walloon":"瓦隆語","Wolof":"沃洛夫語","Xhosa":"科薩語","Yiddish":"æ„第緒語","Yoruba":"約魯巴語","Zhuang":"壯語","Chinese":"漢語","Zulu":"祖魯語"} \ No newline at end of file
diff --git a/client/src/main.ts b/client/src/main.ts
index f456e89c5..86fdabba5 100644
--- a/client/src/main.ts
+++ b/client/src/main.ts
@@ -8,7 +8,7 @@ import { hmrBootstrap } from './hmr'
8import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' 8import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
9import { buildFileLocale } from '../../shared' 9import { buildFileLocale } from '../../shared'
10 10
11let providers = [] 11let providers: any[] = []
12if (environment.production) { 12if (environment.production) {
13 enableProdMode() 13 enableProdMode()
14} 14}
@@ -34,7 +34,7 @@ const bootstrap = () => platformBrowserDynamic()
34 // .catch(err => console.error('Cannot register service worker.', err)) 34 // .catch(err => console.error('Cannot register service worker.', err))
35 // } 35 // }
36 36
37 if (navigator.serviceWorker) { 37 if (navigator.serviceWorker && typeof navigator.serviceWorker.getRegistrations === 'function') {
38 navigator.serviceWorker.getRegistrations() 38 navigator.serviceWorker.getRegistrations()
39 .then(registrations => { 39 .then(registrations => {
40 for (const registration of registrations) { 40 for (const registration of registrations) {
diff --git a/client/src/manifest.webmanifest b/client/src/manifest.webmanifest
index 3d3c7d6d5..851e098a8 100644
--- a/client/src/manifest.webmanifest
+++ b/client/src/manifest.webmanifest
@@ -43,5 +43,5 @@
43 ], 43 ],
44 "name": "PeerTube", 44 "name": "PeerTube",
45 "short_name": "PeerTube", 45 "short_name": "PeerTube",
46 "start_url": "/videos/trending" 46 "start_url": "/"
47} 47}
diff --git a/client/src/polyfills.ts b/client/src/polyfills.ts
index eec30760d..368908432 100644
--- a/client/src/polyfills.ts
+++ b/client/src/polyfills.ts
@@ -18,24 +18,26 @@
18 * BROWSER POLYFILLS 18 * BROWSER POLYFILLS
19 */ 19 */
20 20
21/** IE9, IE10 and IE11 requires all of the following polyfills. **/ 21/**
22 * IE9, IE10 and IE11 requires all of the following polyfills.
23 */
22 24
23// For Google Bot 25// For Google Bot
24import 'core-js/es6/symbol'; 26import 'core-js/es6/symbol'
25import 'core-js/es6/object'; 27import 'core-js/es6/object'
26import 'core-js/es6/function'; 28import 'core-js/es6/function'
27import 'core-js/es6/parse-int'; 29import 'core-js/es6/parse-int'
28import 'core-js/es6/parse-float'; 30import 'core-js/es6/parse-float'
29import 'core-js/es6/number'; 31import 'core-js/es6/number'
30import 'core-js/es6/math'; 32import 'core-js/es6/math'
31import 'core-js/es6/string'; 33import 'core-js/es6/string'
32import 'core-js/es6/date'; 34import 'core-js/es6/date'
33import 'core-js/es6/array'; 35import 'core-js/es6/array'
34import 'core-js/es6/regexp'; 36import 'core-js/es6/regexp'
35import 'core-js/es6/map'; 37import 'core-js/es6/map'
36import 'core-js/es6/weak-map'; 38import 'core-js/es6/weak-map'
37import 'core-js/es6/set'; 39import 'core-js/es6/set'
38import 'core-js/es7/object'; 40import 'core-js/es7/object'
39 41
40/** IE10 and IE11 requires the following for NgClass support on SVG elements */ 42/** IE10 and IE11 requires the following for NgClass support on SVG elements */
41// import 'classlist.js'; // Run `npm install --save classlist.js`. 43// import 'classlist.js'; // Run `npm install --save classlist.js`.
@@ -43,17 +45,18 @@ import 'core-js/es7/object';
43/** IE10 and IE11 requires the following for the Reflect API. */ 45/** IE10 and IE11 requires the following for the Reflect API. */
44 46
45// For Google Bot 47// For Google Bot
46import 'core-js/es6/reflect'; 48// import 'core-js/es6/reflect'; // --> dealt with in src/environment.ts
47 49
48/** Evergreen browsers require these. **/ 50/**
51 * Evergreen browsers require these.
52 */
49// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. 53// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
50import 'core-js/es7/reflect' 54// import 'core-js/es7/reflect' // --> dealt with in src/environment.ts
51
52 55
53/** 56/**
54 * Required to support Web Animations `@angular/platform-browser/animations`. 57 * Required to support Web Animations `@angular/platform-browser/animations`.
55 * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation 58 * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
56 **/ 59 */
57// import 'web-animations-js'; // Run `npm install --save web-animations-js`. 60// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
58 61
59/** 62/**
@@ -70,19 +73,17 @@ import 'core-js/es7/reflect'
70*/ 73*/
71// (window as any).__Zone_enable_cross_context_check = true; 74// (window as any).__Zone_enable_cross_context_check = true;
72 75
73
74/*************************************************************************************************** 76/***************************************************************************************************
75 * Zone JS is required by default for Angular itself. 77 * Zone JS is required by default for Angular itself.
76 */ 78 */
77import 'zone.js/dist/zone' // Included with Angular CLI. 79import 'zone.js/dist/zone' // Included with Angular CLI.
78 80
79
80/*************************************************************************************************** 81/***************************************************************************************************
81 * APPLICATION IMPORTS 82 * APPLICATION IMPORTS
82 */ 83 */
83 84
84// global/process polyfills 85// global/process polyfills
85 86
86;(window as any).global = window; 87;(window as any).global = window
87;(window as any).process = require('process/'); 88;(window as any).process = require('process/')
88;(window as any).Buffer = require('buffer/').Buffer; 89;(window as any).Buffer = require('buffer/').Buffer
diff --git a/client/src/sass/application.scss b/client/src/sass/application.scss
index 2356f9837..478737a43 100644
--- a/client/src/sass/application.scss
+++ b/client/src/sass/application.scss
@@ -23,7 +23,7 @@ body {
23 // now beware node-sass requires interpolation 23 // now beware node-sass requires interpolation
24 // for css custom properties #{$var} 24 // for css custom properties #{$var}
25 --mainColor: #{$orange-color}; 25 --mainColor: #{$orange-color};
26 --mainHoverColor: #{$orange-hoover-color}; 26 --mainHoverColor: #{$orange-hover-color};
27 --mainBackgroundColor: #{$bg-color}; 27 --mainBackgroundColor: #{$bg-color};
28 --mainForegroundColor: #{$fg-color}; 28 --mainForegroundColor: #{$fg-color};
29 --menuBackgroundColor: #{$menu-background}; 29 --menuBackgroundColor: #{$menu-background};
@@ -229,13 +229,12 @@ label {
229 font-weight: $font-semibold; 229 font-weight: $font-semibold;
230 } 230 }
231 231
232 .close { 232 my-global-icon {
233 @include icon(24px); 233 @include icon(24px);
234 234
235 position: relative; 235 position: relative;
236 top: 3px; 236 top: 3px;
237 float: right; 237 float: right;
238 background-image: url('../assets/images/global/cross.svg');
239 238
240 margin: 0; 239 margin: 0;
241 padding: 0; 240 padding: 0;
@@ -293,6 +292,10 @@ ngb-tabset.bootstrap {
293 color: var(--mainForegroundColor) !important; 292 color: var(--mainForegroundColor) !important;
294 } 293 }
295 } 294 }
295
296 .nav-pills .nav-link.active {
297 color: #000 !important;
298 }
296} 299}
297 300
298.nav-tabs .nav-link.active { 301.nav-tabs .nav-link.active {
@@ -324,7 +327,7 @@ ngb-tabset.bootstrap {
324table { 327table {
325 .action-button-edit, .action-button-delete { 328 .action-button-edit, .action-button-delete {
326 &:hover, &:active, &:focus, &[disabled], &.disabled { 329 &:hover, &:active, &:focus, &[disabled], &.disabled {
327 background-color: $grey-color !important; 330 background-color: $grey-background-color !important;
328 } 331 }
329 } 332 }
330} 333}
@@ -389,4 +392,4 @@ table {
389 } 392 }
390 } 393 }
391 } 394 }
392} \ No newline at end of file 395}
diff --git a/client/src/sass/include/_bootstrap-variables.scss b/client/src/sass/include/_bootstrap-variables.scss
index ce2532af5..7f413836b 100644
--- a/client/src/sass/include/_bootstrap-variables.scss
+++ b/client/src/sass/include/_bootstrap-variables.scss
@@ -29,4 +29,7 @@ $input-btn-focus-color: inherit;
29$input-focus-border-color: #ced4da; 29$input-focus-border-color: #ced4da;
30 30
31$nav-pills-link-active-bg: #F0F0F0; 31$nav-pills-link-active-bg: #F0F0F0;
32$nav-pills-link-active-color: #000; \ No newline at end of file 32$nav-pills-link-active-color: #000;
33
34$zindex-dropdown: 10000;
35$zindex-popover: 10000;
diff --git a/client/src/sass/include/_mixins.scss b/client/src/sass/include/_mixins.scss
index 2efd6a1d3..e18e9ae9d 100644
--- a/client/src/sass/include/_mixins.scss
+++ b/client/src/sass/include/_mixins.scss
@@ -29,7 +29,7 @@
29 display: block; 29 display: block;
30 /* Fallback for non-webkit */ 30 /* Fallback for non-webkit */
31 display: -webkit-box; 31 display: -webkit-box;
32 max-height: $font-size*$line-height*$lines-to-show; 32 max-height: $font-size * $line-height * $lines-to-show;
33 /* Fallback for non-webkit */ 33 /* Fallback for non-webkit */
34 font-size: $font-size; 34 font-size: $font-size;
35 line-height: $line-height; 35 line-height: $line-height;
@@ -55,6 +55,18 @@
55 hyphens: auto; 55 hyphens: auto;
56} 56}
57 57
58@mixin apply-svg-color ($color) {
59 /deep/ svg {
60 path[fill="#000000"], g[fill="#000000"], rect[fill="#000000"], circle[fill="#000000"] {
61 fill: $color;
62 }
63
64 path[stroke="#000000"], g[stroke="#000000"], rect[stroke="#000000"], circle[stroke="#000000"] {
65 stroke: $color;
66 }
67 }
68}
69
58@mixin peertube-input-text($width) { 70@mixin peertube-input-text($width) {
59 display: inline-block; 71 display: inline-block;
60 height: $button-height; 72 height: $button-height;
@@ -64,6 +76,7 @@
64 border-radius: 3px; 76 border-radius: 3px;
65 padding-left: 15px; 77 padding-left: 15px;
66 padding-right: 15px; 78 padding-right: 15px;
79 font-size: 15px;
67 80
68 &::placeholder { 81 &::placeholder {
69 color: var(--inputPlaceholderColor); 82 color: var(--inputPlaceholderColor);
@@ -110,22 +123,30 @@
110 color: #fff; 123 color: #fff;
111 background-color: #C6C6C6; 124 background-color: #C6C6C6;
112 } 125 }
126
127 my-global-icon {
128 @include apply-svg-color(#fff)
129 }
113} 130}
114 131
115@mixin grey-button { 132@mixin grey-button {
116 &, &:active, &:focus { 133 &, &:active, &:focus {
117 background-color: $grey-color; 134 background-color: $grey-background-color;
118 color: #585858; 135 color: $grey-foreground-color;
119 } 136 }
120 137
121 &:hover, &:active, &:focus, &[disabled], &.disabled { 138 &:hover, &:active, &:focus, &[disabled], &.disabled {
122 color: #585858; 139 color: $grey-foreground-color;
123 background-color: $grey-hoover-color; 140 background-color: $grey-background-hover-color;
124 } 141 }
125 142
126 &[disabled], &.disabled { 143 &[disabled], &.disabled {
127 cursor: default; 144 cursor: default;
128 } 145 }
146
147 my-global-icon {
148 @include apply-svg-color($grey-foreground-color)
149 }
129} 150}
130 151
131@mixin peertube-button { 152@mixin peertube-button {
@@ -148,6 +169,15 @@
148 @include peertube-button; 169 @include peertube-button;
149} 170}
150 171
172@mixin button-with-icon($width: 20px, $margin-right: 3px, $top: -1px) {
173 my-global-icon {
174 position: relative;
175 width: $width;
176 margin-right: $margin-right;
177 top: $top;
178 }
179}
180
151@mixin peertube-button-file ($width) { 181@mixin peertube-button-file ($width) {
152 position: relative; 182 position: relative;
153 overflow: hidden; 183 overflow: hidden;
@@ -231,6 +261,10 @@
231 color: transparent; 261 color: transparent;
232 text-shadow: 0 0 0 #000; 262 text-shadow: 0 0 0 #000;
233 } 263 }
264
265 option {
266 color: #000;
267 }
234 } 268 }
235} 269}
236 270
@@ -455,18 +489,10 @@
455 } 489 }
456} 490}
457 491
458@mixin create-button ($imageUrl) { 492@mixin create-button {
459 @include peertube-button-link; 493 @include peertube-button-link;
460 @include orange-button; 494 @include orange-button;
461 495 @include button-with-icon(20px, 5px, -1px);
462 .icon.icon-add {
463 @include icon(20px);
464
465 position: relative;
466 top: -1px;
467 margin-right: 5px;
468 background-image: url($imageUrl);
469 }
470} 496}
471 497
472@mixin row-blocks { 498@mixin row-blocks {
@@ -511,4 +537,4 @@
511 } 537 }
512 } 538 }
513 } 539 }
514} \ No newline at end of file 540}
diff --git a/client/src/sass/include/_variables.scss b/client/src/sass/include/_variables.scss
index fdf33b12a..3780b7501 100644
--- a/client/src/sass/include/_variables.scss
+++ b/client/src/sass/include/_variables.scss
@@ -6,10 +6,13 @@ $font-regular: 400;
6$font-semibold: 600; 6$font-semibold: 600;
7$font-bold: 700; 7$font-bold: 700;
8 8
9$grey-color: #E5E5E5; 9$grey-background-color: #E5E5E5;
10$grey-hoover-color: #EFEFEF;; 10$grey-background-hover-color: #EFEFEF;
11$grey-foreground-color: #585858;
12$grey-foreground-hover-color: #303030;
13
11$orange-color: #F1680D; 14$orange-color: #F1680D;
12$orange-hoover-color: #F97D46; 15$orange-hover-color: #F97D46;
13 16
14$bg-color: #fff; 17$bg-color: #fff;
15$fg-color: #000; 18$fg-color: #000;
diff --git a/client/src/sass/player/settings-menu.scss b/client/src/sass/player/settings-menu.scss
index d065e72fb..61965c85e 100644
--- a/client/src/sass/player/settings-menu.scss
+++ b/client/src/sass/player/settings-menu.scss
@@ -171,7 +171,7 @@ $setting-transition-easing: ease-out;
171 left: 8px; 171 left: 8px;
172 content: ' '; 172 content: ' ';
173 margin-top: 1px; 173 margin-top: 1px;
174 background-image: url('#{$assets-path}/player/images/tick.svg'); 174 background-image: url('#{$assets-path}/player/images/tick-white.svg');
175 } 175 }
176 } 176 }
177 } 177 }
@@ -197,4 +197,4 @@ $setting-transition-easing: ease-out;
197 } 197 }
198 } 198 }
199 } 199 }
200} \ No newline at end of file 200}
diff --git a/client/src/sass/primeng-custom.scss b/client/src/sass/primeng-custom.scss
index 5a03ac9c5..6e502b028 100644
--- a/client/src/sass/primeng-custom.scss
+++ b/client/src/sass/primeng-custom.scss
@@ -2,7 +2,7 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4@import '~primeng/resources/primeng.css'; 4@import '~primeng/resources/primeng.css';
5@import '~primeng/resources/themes/bootstrap/theme.css'; 5@import '~primeng/resources/themes/nova-light/theme.css';
6 6
7@mixin glyphicon-light { 7@mixin glyphicon-light {
8 font-family: 'Glyphicons Halflings'; 8 font-family: 'Glyphicons Halflings';
@@ -12,10 +12,29 @@
12 12
13// data table customizations 13// data table customizations
14p-table { 14p-table {
15 font-size: 15px !important; 15 .ui-table-caption {
16 border: none !important;
17 background-color: var(--mainBackgroundColor) !important;
18
19 .caption {
20 height: 40px;
21 display: flex;
22 align-items: center;
23 }
24 }
25
26 th {
27 background-color: var(--mainBackgroundColor) !important;
28 outline: 0;
29 }
30
31 td, th {
32 font-family: $main-fonts;
33 font-size: 15px !important;
34 color: var(--mainForegroundColor) !important;
35 }
16 36
17 td { 37 td {
18 // border: 1px solid #E5E5E5 !important;
19 padding-left: 15px !important; 38 padding-left: 15px !important;
20 39
21 &:not(.action-cell) { 40 &:not(.action-cell) {
@@ -26,8 +45,17 @@ p-table {
26 } 45 }
27 46
28 tr { 47 tr {
48 outline: 0;
29 background-color: var(--mainBackgroundColor) !important; 49 background-color: var(--mainBackgroundColor) !important;
30 height: 46px; 50 height: 46px;
51
52 &.ui-state-highlight {
53 background-color: var(--submenuColor) !important;
54
55 td, td > a {
56 color: var(--mainForegroundColor) !important;
57 }
58 }
31 } 59 }
32 60
33 .ui-table-tbody { 61 .ui-table-tbody {
@@ -42,6 +70,10 @@ p-table {
42 } 70 }
43 } 71 }
44 72
73 td {
74 border: none !important;
75 }
76
45 &:first-child td { 77 &:first-child td {
46 border-top: none !important; 78 border-top: none !important;
47 } 79 }
@@ -79,21 +111,25 @@ p-table {
79 } 111 }
80 112
81 &.ui-state-highlight { 113 &.ui-state-highlight {
82 background-color:var(--submenuColor) !important; 114 background-color: var(--submenuColor) !important;
83 115
84 .pi { 116 .pi {
85 @extend .glyphicon; 117 @extend .glyphicon;
86 118
87 color: #000; 119 color: #000 !important;
88 font-size: 11px; 120 font-size: 11px !important;
89 top: 0; 121 top: 0 !important;
90 122
91 &.pi-sort-up { 123 &.pi-sort-up {
92 @extend .glyphicon-triangle-top; 124 @extend .glyphicon-triangle-top;
125
126 color: var(--mainForegroundColor) !important;
93 } 127 }
94 128
95 &.pi-sort-down { 129 &.pi-sort-down {
96 @extend .glyphicon-triangle-bottom; 130 @extend .glyphicon-triangle-bottom;
131
132 color: var(--mainForegroundColor) !important;
97 } 133 }
98 } 134 }
99 } 135 }
@@ -161,13 +197,14 @@ p-table {
161 height: auto !important; 197 height: auto !important;
162 198
163 a { 199 a {
164 color: #000 !important; 200 color: var(--mainForegroundColor) !important;
165 font-weight: $font-semibold !important; 201 font-weight: $font-semibold !important;
166 margin: 0 10px !important; 202 margin: 0 5px !important;
167 outline: 0 !important; 203 outline: 0 !important;
168 border-radius: 3px !important; 204 border-radius: 3px !important;
169 padding: 5px 2px !important; 205 padding: 5px 2px !important;
170 height: auto !important; 206 height: auto !important;
207 line-height: initial !important;
171 208
172 &.ui-state-active { 209 &.ui-state-active {
173 &, &:hover, &:active, &:focus { 210 &, &:hover, &:active, &:focus {
@@ -196,11 +233,25 @@ p-calendar .ui-datepicker {
196 .ui-datepicker-next { 233 .ui-datepicker-next {
197 @extend .glyphicon-chevron-right; 234 @extend .glyphicon-chevron-right;
198 @include glyphicon-light; 235 @include glyphicon-light;
236
237 color: #000 !important;
238 text-align: right;
239
240 .pi.pi-chevron-right {
241 display: none !important;
242 }
199 } 243 }
200 244
201 .ui-datepicker-prev { 245 .ui-datepicker-prev {
202 @extend .glyphicon-chevron-left; 246 @extend .glyphicon-chevron-left;
203 @include glyphicon-light; 247 @include glyphicon-light;
248
249 color: #000 !important;
250 text-align: left;
251
252 .pi.pi-chevron-left {
253 display: none !important;
254 }
204 } 255 }
205 } 256 }
206 257
@@ -209,11 +260,118 @@ p-calendar .ui-datepicker {
209 .pi.pi-chevron-up { 260 .pi.pi-chevron-up {
210 @extend .glyphicon-chevron-up; 261 @extend .glyphicon-chevron-up;
211 @include glyphicon-light; 262 @include glyphicon-light;
263
264 color: #000 !important;
212 } 265 }
213 266
214 .pi.pi-chevron-down { 267 .pi.pi-chevron-down {
215 @extend .glyphicon-chevron-down; 268 @extend .glyphicon-chevron-down;
216 @include glyphicon-light; 269 @include glyphicon-light;
270
271 color: #000 !important;
272 }
273 }
274}
275
276.ui-chkbox {
277
278 &, .ui-chkbox-box {
279 width: 18px !important;
280 height: 18px !important;
281 }
282
283 .ui-chkbox-box {
284 &.ui-state-active {
285 border-color: var(--mainColor) !important;
286 background-color: var(--mainColor) !important;
287 }
288
289 .ui-chkbox-icon {
290 position: relative;
291 overflow: visible !important;
292
293 &:after {
294 content: '';
295 position: absolute;
296 top: 1px;
297 left: 6px;
298 width: 5px;
299 height: 12px;
300 opacity: 0;
301 transform: rotate(45deg) scale(0);
302 border-right: 2px solid var(--mainBackgroundColor);
303 border-bottom: 2px solid var(--mainBackgroundColor);
304 }
305
306 &.pi-check:after {
307 opacity: 1;
308 transform: rotate(45deg) scale(1);
309 }
217 } 310 }
218 } 311 }
219} \ No newline at end of file 312}
313
314p-inputswitch {
315 .ui-inputswitch-checked .ui-inputswitch-slider {
316 background-color: var(--mainColor) !important;
317 }
318}
319
320p-toast {
321 .ui-toast {
322 // Modal is 10005
323 z-index: 10010 !important;
324 }
325
326 .ui-toast-message {
327 font-family: $main-fonts;
328
329 &.ui-toast-message-success {
330 color: #fff !important;
331 background-color: #8BC34A !important;
332 }
333
334 &.ui-toast-message-error {
335 color: #fff !important;
336 background-color: #F44336 !important;
337 }
338
339 &.ui-toast-message-info {
340 color: #fff !important;
341 background-color: #03A9F4 !important;
342 }
343
344 &.ui-toast-message-info {
345 color: #fff !important;
346 background-color: #03A9F4 !important;
347 }
348
349 .notification-block {
350 display: flex;
351 align-items: center;
352 padding: 5px;
353
354 .message {
355 flex-grow: 1;
356
357 h3 {
358 font-size: 21px;
359 }
360
361 p {
362 font-size: 15px;
363 margin-bottom: 0;
364 }
365 }
366
367 .glyphicon {
368 font-size: 32px;
369 margin-right: 5px;
370 }
371 }
372 }
373}
374
375.ui-widget {
376 font-family: $main-fonts !important;
377}
diff --git a/client/src/shims/noop.ts b/client/src/shims/noop.ts
index 899b69bf3..086a60e32 100644
--- a/client/src/shims/noop.ts
+++ b/client/src/shims/noop.ts
@@ -1,3 +1,3 @@
1// Does nothing. Used to shim out node.js modules 1// Does nothing. Used to shim out node.js modules
2// which are no-ops in the browser. 2// which are no-ops in the browser.
3export const NOOP = 0 \ No newline at end of file 3export const NOOP = 0
diff --git a/client/src/standalone/videos/embed.html b/client/src/standalone/videos/embed.html
index b7cf13ec2..c3b6e08ca 100644
--- a/client/src/standalone/videos/embed.html
+++ b/client/src/standalone/videos/embed.html
@@ -6,6 +6,7 @@
6 <meta charset="UTF-8"> 6 <meta charset="UTF-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="robots" content="noindex"> 8 <meta name="robots" content="noindex">
9 <meta property="og:platform" content="PeerTube" />
9 10
10 <link rel="icon" type="image/png" href="/client/assets/images/favicon.png" /> 11 <link rel="icon" type="image/png" href="/client/assets/images/favicon.png" />
11 </head> 12 </head>
@@ -13,7 +14,7 @@
13 <body> 14 <body>
14 15
15 <div id="error-block"> 16 <div id="error-block">
16 <h1 id="error-title">Sorry</h1> 17 <h1 id="error-title"></h1>
17 18
18 <div id="error-content"></div> 19 <div id="error-content"></div>
19 </div> 20 </div>
diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts
index ea3436c7c..32bf42e12 100644
--- a/client/src/standalone/videos/embed.ts
+++ b/client/src/standalone/videos/embed.ts
@@ -17,14 +17,19 @@ import 'core-js/es6/set'
17// For google bot that uses Chrome 41 and does not understand fetch 17// For google bot that uses Chrome 41 and does not understand fetch
18import 'whatwg-fetch' 18import 'whatwg-fetch'
19 19
20import * as vjs from 'video.js'
21import * as Channel from 'jschannel' 20import * as Channel from 'jschannel'
22 21
23import { peertubeTranslate, ResultList, VideoDetails } from '../../../../shared' 22import { peertubeTranslate, ResultList, VideoDetails } from '../../../../shared'
24import { addContextMenu, getServerTranslations, getVideojsOptions, loadLocaleInVideoJS } from '../../assets/player/peertube-player'
25import { PeerTubeResolution } from '../player/definitions' 23import { PeerTubeResolution } from '../player/definitions'
26import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings' 24import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings'
27import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' 25import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
26import {
27 P2PMediaLoaderOptions,
28 PeertubePlayerManager,
29 PeertubePlayerManagerOptions,
30 PlayerMode
31} from '../../assets/player/peertube-player-manager'
32import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
28 33
29/** 34/**
30 * Embed API exposes control of the embed player to the outside world via 35 * Embed API exposes control of the embed player to the outside world via
@@ -70,16 +75,16 @@ class PeerTubeEmbedApi {
70 } 75 }
71 76
72 private setResolution (resolutionId: number) { 77 private setResolution (resolutionId: number) {
73 if (resolutionId === -1 && this.embed.player.peertube().isAutoResolutionForbidden()) return 78 if (resolutionId === -1 && this.embed.player.webtorrent().isAutoResolutionForbidden()) return
74 79
75 // Auto resolution 80 // Auto resolution
76 if (resolutionId === -1) { 81 if (resolutionId === -1) {
77 this.embed.player.peertube().enableAutoResolution() 82 this.embed.player.webtorrent().enableAutoResolution()
78 return 83 return
79 } 84 }
80 85
81 this.embed.player.peertube().disableAutoResolution() 86 this.embed.player.webtorrent().disableAutoResolution()
82 this.embed.player.peertube().updateResolution(resolutionId) 87 this.embed.player.webtorrent().updateResolution(resolutionId)
83 } 88 }
84 89
85 /** 90 /**
@@ -119,15 +124,17 @@ class PeerTubeEmbedApi {
119 124
120 // PeerTube specific capabilities 125 // PeerTube specific capabilities
121 126
122 this.embed.player.peertube().on('autoResolutionUpdate', () => this.loadResolutions()) 127 if (this.embed.player.webtorrent) {
123 this.embed.player.peertube().on('videoFileUpdate', () => this.loadResolutions()) 128 this.embed.player.webtorrent().on('autoResolutionUpdate', () => this.loadWebTorrentResolutions())
129 this.embed.player.webtorrent().on('videoFileUpdate', () => this.loadWebTorrentResolutions())
130 }
124 } 131 }
125 132
126 private loadResolutions () { 133 private loadWebTorrentResolutions () {
127 let resolutions = [] 134 let resolutions = []
128 let currentResolutionId = this.embed.player.peertube().getCurrentResolutionId() 135 let currentResolutionId = this.embed.player.webtorrent().getCurrentResolutionId()
129 136
130 for (const videoFile of this.embed.player.peertube().videoFiles) { 137 for (const videoFile of this.embed.player.webtorrent().videoFiles) {
131 let label = videoFile.resolution.label 138 let label = videoFile.resolution.label
132 if (videoFile.fps && videoFile.fps >= 50) { 139 if (videoFile.fps && videoFile.fps >= 50) {
133 label += videoFile.fps 140 label += videoFile.fps
@@ -154,12 +161,14 @@ class PeerTubeEmbed {
154 player: any 161 player: any
155 playerOptions: any 162 playerOptions: any
156 api: PeerTubeEmbedApi = null 163 api: PeerTubeEmbedApi = null
157 autoplay = false 164 autoplay: boolean
158 controls = true 165 controls: boolean
159 muted = false 166 muted: boolean
160 loop = false 167 loop: boolean
168 subtitle: string
161 enableApi = false 169 enableApi = false
162 startTime: number | string = 0 170 startTime: number | string = 0
171 mode: PlayerMode
163 scope = 'peertube' 172 scope = 'peertube'
164 173
165 static async main () { 174 static async main () {
@@ -188,34 +197,40 @@ class PeerTubeEmbed {
188 element.parentElement.removeChild(element) 197 element.parentElement.removeChild(element)
189 } 198 }
190 199
191 displayError (text: string) { 200 displayError (text: string, translations?: { [ id: string ]: string }) {
192 // Remove video element 201 // Remove video element
193 if (this.videoElement) this.removeElement(this.videoElement) 202 if (this.videoElement) this.removeElement(this.videoElement)
194 203
195 document.title = 'Sorry - ' + text 204 const translatedText = peertubeTranslate(text, translations)
205 const translatedSorry = peertubeTranslate('Sorry', translations)
206
207 document.title = translatedSorry + ' - ' + translatedText
196 208
197 const errorBlock = document.getElementById('error-block') 209 const errorBlock = document.getElementById('error-block')
198 errorBlock.style.display = 'flex' 210 errorBlock.style.display = 'flex'
199 211
212 const errorTitle = document.getElementById('error-title')
213 errorTitle.innerHTML = peertubeTranslate('Sorry', translations)
214
200 const errorText = document.getElementById('error-content') 215 const errorText = document.getElementById('error-content')
201 errorText.innerHTML = text 216 errorText.innerHTML = translatedText
202 } 217 }
203 218
204 videoNotFound () { 219 videoNotFound (translations?: { [ id: string ]: string }) {
205 const text = 'This video does not exist.' 220 const text = 'This video does not exist.'
206 this.displayError(text) 221 this.displayError(text, translations)
207 } 222 }
208 223
209 videoFetchError () { 224 videoFetchError (translations?: { [ id: string ]: string }) {
210 const text = 'We cannot fetch the video. Please try again later.' 225 const text = 'We cannot fetch the video. Please try again later.'
211 this.displayError(text) 226 this.displayError(text, translations)
212 } 227 }
213 228
214 getParamToggle (params: URLSearchParams, name: string, defaultValue: boolean) { 229 getParamToggle (params: URLSearchParams, name: string, defaultValue?: boolean) {
215 return params.has(name) ? (params.get(name) === '1' || params.get(name) === 'true') : defaultValue 230 return params.has(name) ? (params.get(name) === '1' || params.get(name) === 'true') : defaultValue
216 } 231 }
217 232
218 getParamString (params: URLSearchParams, name: string, defaultValue: string) { 233 getParamString (params: URLSearchParams, name: string, defaultValue?: string) {
219 return params.has(name) ? params.get(name) : defaultValue 234 return params.has(name) ? params.get(name) : defaultValue
220 } 235 }
221 236
@@ -238,36 +253,36 @@ class PeerTubeEmbed {
238 try { 253 try {
239 let params = new URL(window.location.toString()).searchParams 254 let params = new URL(window.location.toString()).searchParams
240 255
241 this.autoplay = this.getParamToggle(params, 'autoplay', this.autoplay) 256 this.autoplay = this.getParamToggle(params, 'autoplay')
242 this.controls = this.getParamToggle(params, 'controls', this.controls) 257 this.controls = this.getParamToggle(params, 'controls')
243 this.muted = this.getParamToggle(params, 'muted', this.muted) 258 this.muted = this.getParamToggle(params, 'muted')
244 this.loop = this.getParamToggle(params, 'loop', this.loop) 259 this.loop = this.getParamToggle(params, 'loop')
245 this.enableApi = this.getParamToggle(params, 'api', this.enableApi) 260 this.enableApi = this.getParamToggle(params, 'api', this.enableApi)
261
246 this.scope = this.getParamString(params, 'scope', this.scope) 262 this.scope = this.getParamString(params, 'scope', this.scope)
263 this.subtitle = this.getParamString(params, 'subtitle')
264 this.startTime = this.getParamString(params, 'start')
247 265
248 const startTimeParamString = params.get('start') 266 this.mode = this.getParamString(params, 'mode') === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
249 if (startTimeParamString) this.startTime = startTimeParamString
250 } catch (err) { 267 } catch (err) {
251 console.error('Cannot get params from URL.', err) 268 console.error('Cannot get params from URL.', err)
252 } 269 }
253 } 270 }
254 271
255 private async initCore () { 272 private async initCore () {
256 const urlParts = window.location.href.split('/') 273 const urlParts = window.location.pathname.split('/')
257 const lastPart = urlParts[ urlParts.length - 1 ] 274 const videoId = urlParts[ urlParts.length - 1 ]
258 const videoId = lastPart.indexOf('?') === -1 ? lastPart : lastPart.split('?')[ 0 ]
259 275
260 const [ , serverTranslations, videoResponse, captionsResponse ] = await Promise.all([ 276 const [ serverTranslations, videoResponse, captionsResponse ] = await Promise.all([
261 loadLocaleInVideoJS(window.location.origin, vjs, navigator.language), 277 PeertubePlayerManager.getServerTranslations(window.location.origin, navigator.language),
262 getServerTranslations(window.location.origin, navigator.language),
263 this.loadVideoInfo(videoId), 278 this.loadVideoInfo(videoId),
264 this.loadVideoCaptions(videoId) 279 this.loadVideoCaptions(videoId)
265 ]) 280 ])
266 281
267 if (!videoResponse.ok) { 282 if (!videoResponse.ok) {
268 if (videoResponse.status === 404) return this.videoNotFound() 283 if (videoResponse.status === 404) return this.videoNotFound(serverTranslations)
269 284
270 return this.videoFetchError() 285 return this.videoFetchError(serverTranslations)
271 } 286 }
272 287
273 const videoInfo: VideoDetails = await videoResponse.json() 288 const videoInfo: VideoDetails = await videoResponse.json()
@@ -283,49 +298,74 @@ class PeerTubeEmbed {
283 298
284 this.loadParams() 299 this.loadParams()
285 300
286 const videojsOptions = getVideojsOptions({ 301 const options: PeertubePlayerManagerOptions = {
287 autoplay: this.autoplay, 302 common: {
288 controls: this.controls, 303 autoplay: this.autoplay,
289 muted: this.muted, 304 controls: this.controls,
290 loop: this.loop, 305 muted: this.muted,
291 startTime: this.startTime, 306 loop: this.loop,
292 307 captions: videoCaptions.length !== 0,
293 videoCaptions, 308 startTime: this.startTime,
294 inactivityTimeout: 1500, 309 subtitle: this.subtitle,
295 videoViewUrl: this.getVideoUrl(videoId) + '/views', 310
296 playerElement: this.videoElement, 311 videoCaptions,
297 videoFiles: videoInfo.files, 312 inactivityTimeout: 1500,
298 videoDuration: videoInfo.duration, 313 videoViewUrl: this.getVideoUrl(videoId) + '/views',
299 enableHotkeys: true, 314
300 peertubeLink: true, 315 playerElement: this.videoElement,
301 poster: window.location.origin + videoInfo.previewPath, 316 onPlayerElementChange: (element: HTMLVideoElement) => this.videoElement = element,
302 theaterMode: false 317
303 }) 318 videoDuration: videoInfo.duration,
319 enableHotkeys: true,
320 peertubeLink: true,
321 poster: window.location.origin + videoInfo.previewPath,
322 theaterMode: false,
323
324 serverUrl: window.location.origin,
325 language: navigator.language,
326 embedUrl: window.location.origin + videoInfo.embedPath
327 },
328
329 webtorrent: {
330 videoFiles: videoInfo.files
331 }
332 }
304 333
305 this.playerOptions = videojsOptions 334 if (this.mode === 'p2p-media-loader') {
306 this.player = vjs(this.videoContainerId, videojsOptions, () => { 335 const hlsPlaylist = videoInfo.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
307 this.player.on('customError', (event, data) => this.handleError(data.err)) 336
337 Object.assign(options, {
338 p2pMediaLoader: {
339 playlistUrl: hlsPlaylist.playlistUrl,
340 segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
341 redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
342 trackerAnnounce: videoInfo.trackerUrls,
343 videoFiles: videoInfo.files
344 } as P2PMediaLoaderOptions
345 })
346 }
308 347
309 window[ 'videojsPlayer' ] = this.player 348 this.player = await PeertubePlayerManager.initialize(this.mode, options)
310 349
311 if (this.controls) { 350 this.player.on('customError', (event: any, data: any) => this.handleError(data.err, serverTranslations))
312 this.player.dock({
313 title: videoInfo.name,
314 description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
315 })
316 }
317 351
318 addContextMenu(this.player, window.location.origin + videoInfo.embedPath) 352 window[ 'videojsPlayer' ] = this.player
319 353
320 this.initializeApi() 354 if (this.controls) {
321 }) 355 this.player.dock({
356 title: videoInfo.name,
357 description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
358 })
359 }
360
361 this.initializeApi()
322 } 362 }
323 363
324 private handleError (err: Error) { 364 private handleError (err: Error, translations?: { [ id: string ]: string }) {
325 if (err.message.indexOf('from xs param') !== -1) { 365 if (err.message.indexOf('from xs param') !== -1) {
326 this.player.dispose() 366 this.player.dispose()
327 this.videoElement = null 367 this.videoElement = null
328 this.displayError('This video is not available because the remote instance is not responding.') 368 this.displayError('This video is not available because the remote instance is not responding.', translations)
329 return 369 return
330 } 370 }
331 } 371 }
diff --git a/client/src/standalone/videos/test-embed.ts b/client/src/standalone/videos/test-embed.ts
index dba331e90..30a298573 100644
--- a/client/src/standalone/videos/test-embed.ts
+++ b/client/src/standalone/videos/test-embed.ts
@@ -1,6 +1,6 @@
1import './test-embed.scss' 1import './test-embed.scss'
2import { PeerTubePlayer } from '../player/player' 2import { PeerTubePlayer } from '../player/player'
3import { PlayerEventType } from '../player/definitions' 3import { PeerTubeResolution, PlayerEventType } from '../player/definitions'
4 4
5window.addEventListener('load', async () => { 5window.addEventListener('load', async () => {
6 const urlParts = window.location.href.split('/') 6 const urlParts = window.location.href.split('/')
@@ -66,7 +66,7 @@ window.addEventListener('load', async () => {
66 updateRates() 66 updateRates()
67 }) 67 })
68 68
69 let updateResolutions = resolutions => { 69 let updateResolutions = ((resolutions: PeerTubeResolution[]) => {
70 let resolutionListEl = document.querySelector('#resolution-list') 70 let resolutionListEl = document.querySelector('#resolution-list')
71 resolutionListEl.innerHTML = '' 71 resolutionListEl.innerHTML = ''
72 72
@@ -87,7 +87,7 @@ window.addEventListener('load', async () => {
87 resolutionListEl.appendChild(itemEl) 87 resolutionListEl.appendChild(itemEl)
88 } 88 }
89 }) 89 })
90 } 90 })
91 91
92 player.getResolutions().then( 92 player.getResolutions().then(
93 resolutions => updateResolutions(resolutions)) 93 resolutions => updateResolutions(resolutions))
diff --git a/client/src/tsconfig.app.json b/client/src/tsconfig.app.json
index af7a74e9e..729eee353 100644
--- a/client/src/tsconfig.app.json
+++ b/client/src/tsconfig.app.json
@@ -3,7 +3,7 @@
3 "compilerOptions": { 3 "compilerOptions": {
4 "outDir": "../out-tsc/app", 4 "outDir": "../out-tsc/app",
5 "baseUrl": "./", 5 "baseUrl": "./",
6 "module": "es2015", 6 "module": "esnext",
7 "types": [], 7 "types": [],
8 "lib": [ 8 "lib": [
9 "es2017", 9 "es2017",
diff --git a/client/src/typings.d.ts b/client/src/typings.d.ts
index ef5c7bd62..ef6c9f2f5 100644
--- a/client/src/typings.d.ts
+++ b/client/src/typings.d.ts
@@ -1,5 +1,6 @@
1/* SystemJS module definition */ 1/* SystemJS module definition */
2declare var module: NodeModule; 2declare var module: NodeModule
3
3interface NodeModule { 4interface NodeModule {
4 id: string; 5 id: string
5} 6}
diff --git a/client/tsconfig.json b/client/tsconfig.json
index e041769dd..3f9986f8a 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -5,9 +5,13 @@
5 "sourceMap": true, 5 "sourceMap": true,
6 "declaration": false, 6 "declaration": false,
7 "moduleResolution": "node", 7 "moduleResolution": "node",
8 "module": "esnext",
8 "emitDecoratorMetadata": true, 9 "emitDecoratorMetadata": true,
9 "experimentalDecorators": true, 10 "experimentalDecorators": true,
10 "noImplicitAny": false, 11 "noImplicitAny": true,
12 "noImplicitThis": true,
13 "suppressImplicitAnyIndexErrors":true,
14 "alwaysStrict": true,
11 "target": "es5", 15 "target": "es5",
12 "typeRoots": [ 16 "typeRoots": [
13 "node_modules/@types" 17 "node_modules/@types"
diff --git a/client/tslint.json b/client/tslint.json
index e997088fd..fcc866ee3 100644
--- a/client/tslint.json
+++ b/client/tslint.json
@@ -7,10 +7,18 @@
7 "max-line-length": [true, 140], 7 "max-line-length": [true, 140],
8 "no-floating-promises": false, 8 "no-floating-promises": false,
9 "no-unused-variable": false, // Memory issues 9 "no-unused-variable": false, // Memory issues
10 "member-ordering": [true, 10 "member-ordering": [true, {
11 "public-before-private", 11 "order": [
12 "static-before-instance", 12 "public-static-field",
13 "variables-before-functions" 13 "private-static-field",
14 "public-instance-field",
15 "private-instance-field",
16 "public-constructor",
17 "private-constructor",
18 "public-instance-method",
19 "protected-instance-method",
20 "private-instance-method"
21 ]}
14 ], 22 ],
15 23
16 "angular-whitespace": [true, "check-interpolation", "check-semicolon"], 24 "angular-whitespace": [true, "check-interpolation", "check-semicolon"],
diff --git a/client/yarn.lock b/client/yarn.lock
index cbd06d57f..63394e0f7 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -2,205 +2,233 @@
2# yarn lockfile v1 2# yarn lockfile v1
3 3
4 4
5"@angular-devkit/architect@0.8.3": 5"@angular-devkit/architect@0.13.1":
6 version "0.8.3" 6 version "0.13.1"
7 resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.8.3.tgz#320c7de2e2e7b984a0e4be51dc60dfe12d4c973e" 7 resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.1.tgz#39597ce94f72d89bdd89ee567cb937cff4c13b98"
8 dependencies: 8 integrity sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw==
9 "@angular-devkit/core" "0.8.3" 9 dependencies:
10 rxjs "~6.2.0" 10 "@angular-devkit/core" "7.3.1"
11 11 rxjs "6.3.3"
12"@angular-devkit/build-angular@^0.8.3": 12
13 version "0.8.3" 13"@angular-devkit/build-angular@~0.13.1":
14 resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.8.3.tgz#e302fdf0f11d589bc518f93afaa7fe5f967bde94" 14 version "0.13.1"
15 dependencies: 15 resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.13.1.tgz#369febda48dd40e47a4f0077064e792612a8e1c1"
16 "@angular-devkit/architect" "0.8.3" 16 integrity sha512-vkKwMVQ+NNCcVR3HFMffS+Mq4b2afXeUjI+02N38hBuFTppnC83uivUB6Uu2NUk5NTSQA4BnJlG5CbMs6N4QYg==
17 "@angular-devkit/build-optimizer" "0.8.3" 17 dependencies:
18 "@angular-devkit/build-webpack" "0.8.3" 18 "@angular-devkit/architect" "0.13.1"
19 "@angular-devkit/core" "0.8.3" 19 "@angular-devkit/build-optimizer" "0.13.1"
20 "@ngtools/webpack" "6.2.3" 20 "@angular-devkit/build-webpack" "0.13.1"
21 ajv "~6.4.0" 21 "@angular-devkit/core" "7.3.1"
22 autoprefixer "^8.4.1" 22 "@ngtools/webpack" "7.3.1"
23 circular-dependency-plugin "^5.0.2" 23 ajv "6.7.0"
24 clean-css "^4.1.11" 24 autoprefixer "9.4.6"
25 copy-webpack-plugin "^4.5.2" 25 circular-dependency-plugin "5.0.2"
26 file-loader "^1.1.11" 26 clean-css "4.2.1"
27 glob "^7.0.3" 27 copy-webpack-plugin "4.6.0"
28 html-webpack-plugin "^3.0.6" 28 file-loader "3.0.1"
29 istanbul "^0.4.5" 29 glob "7.1.3"
30 istanbul-instrumenter-loader "^3.0.1" 30 istanbul-instrumenter-loader "3.0.1"
31 karma-source-map-support "^1.2.0" 31 karma-source-map-support "1.3.0"
32 less "^3.7.1" 32 less "3.9.0"
33 less-loader "^4.1.0" 33 less-loader "4.1.0"
34 license-webpack-plugin "^1.3.1" 34 license-webpack-plugin "2.1.0"
35 loader-utils "^1.1.0" 35 loader-utils "1.2.3"
36 mini-css-extract-plugin "~0.4.0" 36 mini-css-extract-plugin "0.5.0"
37 minimatch "^3.0.4" 37 minimatch "3.0.4"
38 opn "^5.1.0" 38 opn "5.4.0"
39 parse5 "^4.0.0" 39 parse5 "4.0.0"
40 portfinder "^1.0.13" 40 postcss "7.0.14"
41 postcss "^6.0.22" 41 postcss-import "12.0.1"
42 postcss-import "^11.1.0" 42 postcss-loader "3.0.0"
43 postcss-loader "^2.1.5" 43 raw-loader "1.0.0"
44 postcss-url "^7.3.2" 44 rxjs "6.3.3"
45 raw-loader "^0.5.1" 45 sass-loader "7.1.0"
46 rxjs "~6.2.0" 46 semver "5.6.0"
47 sass-loader "^7.1.0" 47 source-map-loader "0.2.4"
48 semver "^5.5.0" 48 source-map-support "0.5.10"
49 source-map-loader "^0.2.3" 49 speed-measure-webpack-plugin "1.3.0"
50 source-map-support "^0.5.0" 50 stats-webpack-plugin "0.7.0"
51 stats-webpack-plugin "^0.6.2" 51 style-loader "0.23.1"
52 style-loader "^0.21.0" 52 stylus "0.54.5"
53 stylus "^0.54.5" 53 stylus-loader "3.0.2"
54 stylus-loader "^3.0.2" 54 terser-webpack-plugin "1.2.2"
55 tree-kill "^1.2.0" 55 tree-kill "1.2.1"
56 uglifyjs-webpack-plugin "^1.2.5" 56 webpack "4.29.0"
57 url-loader "^1.0.1" 57 webpack-dev-middleware "3.5.1"
58 webpack "^4.15.1" 58 webpack-dev-server "3.1.14"
59 webpack-dev-middleware "^3.1.3" 59 webpack-merge "4.2.1"
60 webpack-dev-server "^3.1.4" 60 webpack-sources "1.3.0"
61 webpack-merge "^4.1.2" 61 webpack-subresource-integrity "1.1.0-rc.6"
62 webpack-sources "^1.1.0"
63 webpack-subresource-integrity "^1.1.0-rc.4"
64 optionalDependencies: 62 optionalDependencies:
65 node-sass "^4.9.3" 63 node-sass "4.11.0"
66 64
67"@angular-devkit/build-optimizer@0.8.3": 65"@angular-devkit/build-optimizer@0.13.1":
68 version "0.8.3" 66 version "0.13.1"
69 resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.8.3.tgz#6fdc56bc29313ef9f80af095d5234af750b3277e" 67 resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.13.1.tgz#56151179bd6427918ba8e0f5a7e581e5daa00294"
68 integrity sha512-LmvHiI3H451aVWY5Ac6Fqz0i1eX/mUfWN+uJvo8NaL6Jc0HKYX2o3l4ODr8UUECWWctUC9AMD522ZMwAvnvsKQ==
70 dependencies: 69 dependencies:
71 loader-utils "^1.1.0" 70 loader-utils "1.2.3"
72 source-map "^0.5.6" 71 source-map "0.5.6"
73 typescript "~2.9.2" 72 typescript "3.2.4"
74 webpack-sources "^1.1.0" 73 webpack-sources "1.3.0"
75 74
76"@angular-devkit/build-webpack@0.8.3": 75"@angular-devkit/build-webpack@0.13.1":
77 version "0.8.3" 76 version "0.13.1"
78 resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.8.3.tgz#df8fd2195b0304acfd0c64c8af95ec543ec28593" 77 resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.13.1.tgz#98d666765705e9379c9b2e0a3b6dfcd0347a2a32"
78 integrity sha512-OGwC7bAl3u+w7Glw+OqIrN7OD1BkDXgrWbeQSpKAmsx6VdNPCnI4NPS+JldWNp70LVlE2nQlJUhtEqMVfBMnlg==
79 dependencies: 79 dependencies:
80 "@angular-devkit/architect" "0.8.3" 80 "@angular-devkit/architect" "0.13.1"
81 "@angular-devkit/core" "0.8.3" 81 "@angular-devkit/core" "7.3.1"
82 rxjs "~6.2.0" 82 rxjs "6.3.3"
83 83
84"@angular-devkit/core@0.8.3": 84"@angular-devkit/core@7.3.1":
85 version "0.8.3" 85 version "7.3.1"
86 resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.8.3.tgz#a7158195dc90997de62ec0b12af3325870182c3b" 86 resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.1.tgz#d92f6545796579cabdcfc29579a2c977f7a96c6c"
87 integrity sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ==
87 dependencies: 88 dependencies:
88 ajv "~6.4.0" 89 ajv "6.7.0"
89 chokidar "^2.0.3" 90 chokidar "2.0.4"
90 rxjs "~6.2.0" 91 fast-json-stable-stringify "2.0.0"
91 source-map "^0.5.6" 92 rxjs "6.3.3"
93 source-map "0.7.3"
92 94
93"@angular-devkit/schematics@0.8.3": 95"@angular-devkit/schematics@7.3.1":
94 version "0.8.3" 96 version "7.3.1"
95 resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.8.3.tgz#32f2e99b43c39864ec63301963329c9190d7c5d2" 97 resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.1.tgz#7dc704005b966ea6c1ee62f380120183bb76eee6"
98 integrity sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==
96 dependencies: 99 dependencies:
97 "@angular-devkit/core" "0.8.3" 100 "@angular-devkit/core" "7.3.1"
98 rxjs "~6.2.0" 101 rxjs "6.3.3"
99 102
100"@angular/animations@~6.1.4": 103"@angular/animations@~7.2.4":
101 version "6.1.8" 104 version "7.2.4"
102 resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-6.1.8.tgz#a1861c7f63aca5bd18ba48e0c736ee7b1f2dac36" 105 resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.4.tgz#4d0a0b9f14d6bfc38ca773613b61729d020435e6"
106 integrity sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==
103 dependencies: 107 dependencies:
104 tslib "^1.9.0" 108 tslib "^1.9.0"
105 109
106"@angular/cli@~6.2.3": 110"@angular/cli@~7.3.1":
107 version "6.2.3" 111 version "7.3.1"
108 resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-6.2.3.tgz#212e11cd5e2eed994b33feb93c550a84a0e38ba8" 112 resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.1.tgz#a18acdec84deb03a1fae79cae415bbc8f9c87ffa"
109 dependencies: 113 integrity sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==
110 "@angular-devkit/architect" "0.8.3" 114 dependencies:
111 "@angular-devkit/core" "0.8.3" 115 "@angular-devkit/architect" "0.13.1"
112 "@angular-devkit/schematics" "0.8.3" 116 "@angular-devkit/core" "7.3.1"
113 "@schematics/angular" "0.8.3" 117 "@angular-devkit/schematics" "7.3.1"
114 "@schematics/update" "0.8.3" 118 "@schematics/angular" "7.3.1"
115 json-schema-traverse "^0.4.1" 119 "@schematics/update" "0.13.1"
116 opn "^5.3.0" 120 "@yarnpkg/lockfile" "1.1.0"
117 rxjs "~6.2.0" 121 ini "1.3.5"
118 semver "^5.1.0" 122 inquirer "6.2.1"
119 symbol-observable "^1.2.0" 123 npm-package-arg "6.1.0"
120 yargs-parser "^10.0.0" 124 opn "5.4.0"
121 125 pacote "9.4.0"
122"@angular/common@~6.1.4": 126 semver "5.6.0"
123 version "6.1.8" 127 symbol-observable "1.2.0"
124 resolved "https://registry.yarnpkg.com/@angular/common/-/common-6.1.8.tgz#e9106cecd448f24e3a553a6ea9431e113fe3becd" 128
129"@angular/common@~7.2.4":
130 version "7.2.4"
131 resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.4.tgz#9f1ed530e5dc7613a263e015c203ead390d50336"
132 integrity sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==
125 dependencies: 133 dependencies:
126 tslib "^1.9.0" 134 tslib "^1.9.0"
127 135
128"@angular/compiler-cli@~6.1.4": 136"@angular/compiler-cli@~7.2.4":
129 version "6.1.8" 137 version "7.2.4"
130 resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-6.1.8.tgz#b31842b42a6cee90d0f61f3849fbd15fc6f5ddbf" 138 resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz#3de23fd5f558a859a444c58dab18f2981c9c2937"
139 integrity sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==
131 dependencies: 140 dependencies:
141 canonical-path "1.0.0"
132 chokidar "^1.4.2" 142 chokidar "^1.4.2"
143 convert-source-map "^1.5.1"
144 dependency-graph "^0.7.2"
145 magic-string "^0.25.0"
133 minimist "^1.2.0" 146 minimist "^1.2.0"
134 reflect-metadata "^0.1.2" 147 reflect-metadata "^0.1.2"
135 tsickle "^0.32.1" 148 shelljs "^0.8.1"
149 source-map "^0.6.1"
150 tslib "^1.9.0"
151 yargs "9.0.1"
136 152
137"@angular/compiler@~6.1.4": 153"@angular/compiler@~7.2.4":
138 version "6.1.8" 154 version "7.2.4"
139 resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-6.1.8.tgz#bbbb70961724c6e5755e05fc5d7f4b39d3bb4a0c" 155 resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.4.tgz#133eb97fc3169ec9ff84f134eb9e3497fa37537e"
156 integrity sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==
140 dependencies: 157 dependencies:
141 tslib "^1.9.0" 158 tslib "^1.9.0"
142 159
143"@angular/core@~6.1.4": 160"@angular/core@~7.2.4":
144 version "6.1.8" 161 version "7.2.4"
145 resolved "https://registry.yarnpkg.com/@angular/core/-/core-6.1.8.tgz#2de584e184dc148a55ec153f8125acdf3e88eae6" 162 resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.4.tgz#a6c84940c8edcfa37158f666a1f99c6e4a97bf95"
163 integrity sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==
146 dependencies: 164 dependencies:
147 tslib "^1.9.0" 165 tslib "^1.9.0"
148 166
149"@angular/forms@~6.1.4": 167"@angular/forms@~7.2.4":
150 version "6.1.8" 168 version "7.2.4"
151 resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-6.1.8.tgz#058429b99fc4c6554fe4943a23d4d6221cb1d9ac" 169 resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.4.tgz#be89cf83ad16fa3c813c12e4cff85da5409cf7a0"
170 integrity sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==
152 dependencies: 171 dependencies:
153 tslib "^1.9.0" 172 tslib "^1.9.0"
154 173
155"@angular/http@~6.1.4": 174"@angular/http@~7.2.4":
156 version "6.1.8" 175 version "7.2.4"
157 resolved "https://registry.yarnpkg.com/@angular/http/-/http-6.1.8.tgz#8c627a879285a366e960edc15522006474f4ec6f" 176 resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.4.tgz#fc151ac15c8c7542cb7242a430ad2319655c2ff5"
177 integrity sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==
158 dependencies: 178 dependencies:
159 tslib "^1.9.0" 179 tslib "^1.9.0"
160 180
161"@angular/language-service@~6.1.4": 181"@angular/language-service@~7.2.4":
162 version "6.1.8" 182 version "7.2.4"
163 resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-6.1.8.tgz#2b076eca1e415204a4e2e8e4b066d258a7fe16fd" 183 resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.4.tgz#db72460040b070410cbff678410c142f4d682af8"
184 integrity sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw==
164 185
165"@angular/platform-browser-dynamic@~6.1.4": 186"@angular/platform-browser-dynamic@~7.2.4":
166 version "6.1.8" 187 version "7.2.4"
167 resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.8.tgz#a0c523857e9e55343e6e1747052141d870d4e870" 188 resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz#24dce1bb0d9dab541b3b1b3eda3084a732f11b64"
189 integrity sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==
168 dependencies: 190 dependencies:
169 tslib "^1.9.0" 191 tslib "^1.9.0"
170 192
171"@angular/platform-browser@~6.1.4": 193"@angular/platform-browser@~7.2.4":
172 version "6.1.8" 194 version "7.2.4"
173 resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-6.1.8.tgz#2a0340995ee4b67809f10e039a872afb7f228403" 195 resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.4.tgz#2cf5305878d0620d6b8c02eff00ac3ca8dbc5970"
196 integrity sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==
174 dependencies: 197 dependencies:
175 tslib "^1.9.0" 198 tslib "^1.9.0"
176 199
177"@angular/router@~6.1.4": 200"@angular/router@~7.2.4":
178 version "6.1.8" 201 version "7.2.4"
179 resolved "https://registry.yarnpkg.com/@angular/router/-/router-6.1.8.tgz#7106a55392e9f920358544f431dace2ef3715630" 202 resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.4.tgz#83f1997c2a4e6acda93b991b8d7f3dad2b3f91f0"
203 integrity sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==
180 dependencies: 204 dependencies:
181 tslib "^1.9.0" 205 tslib "^1.9.0"
182 206
183"@angular/service-worker@~6.1.4": 207"@angular/service-worker@~7.2.4":
184 version "6.1.8" 208 version "7.2.4"
185 resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-6.1.8.tgz#1f8be0db90d28a019cfeaa684ff00bfe739f3dda" 209 resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.4.tgz#d16d6d08c0d5c29c93e9f80cddc4013c9b8859fb"
210 integrity sha512-IYsHshkgCYYmWLwtP7wwk8tfwphE4IJrkUitEu+ST6x+er/K9LyLo09WQeEZHIwDaPm9icoqc3TJJdXI46mrmg==
186 dependencies: 211 dependencies:
187 tslib "^1.9.0" 212 tslib "^1.9.0"
188 213
189"@angularclass/hmr@^2.1.3": 214"@angularclass/hmr@^2.1.3":
190 version "2.1.3" 215 version "2.1.3"
191 resolved "https://registry.yarnpkg.com/@angularclass/hmr/-/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f" 216 resolved "https://registry.yarnpkg.com/@angularclass/hmr/-/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f"
217 integrity sha1-NOZY7T2jfyOwogDi2lqJvpK7IJ8=
192 218
193"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": 219"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35":
194 version "7.0.0" 220 version "7.0.0"
195 resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 221 resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
222 integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==
196 dependencies: 223 dependencies:
197 "@babel/highlight" "^7.0.0" 224 "@babel/highlight" "^7.0.0"
198 225
199"@babel/generator@^7.0.0": 226"@babel/generator@^7.0.0", "@babel/generator@^7.1.6":
200 version "7.0.0" 227 version "7.2.0"
201 resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" 228 resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c"
229 integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==
202 dependencies: 230 dependencies:
203 "@babel/types" "^7.0.0" 231 "@babel/types" "^7.2.0"
204 jsesc "^2.5.1" 232 jsesc "^2.5.1"
205 lodash "^4.17.10" 233 lodash "^4.17.10"
206 source-map "^0.5.0" 234 source-map "^0.5.0"
@@ -209,6 +237,7 @@
209"@babel/helper-function-name@^7.1.0": 237"@babel/helper-function-name@^7.1.0":
210 version "7.1.0" 238 version "7.1.0"
211 resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" 239 resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
240 integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
212 dependencies: 241 dependencies:
213 "@babel/helper-get-function-arity" "^7.0.0" 242 "@babel/helper-get-function-arity" "^7.0.0"
214 "@babel/template" "^7.1.0" 243 "@babel/template" "^7.1.0"
@@ -217,198 +246,255 @@
217"@babel/helper-get-function-arity@^7.0.0": 246"@babel/helper-get-function-arity@^7.0.0":
218 version "7.0.0" 247 version "7.0.0"
219 resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" 248 resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
249 integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
220 dependencies: 250 dependencies:
221 "@babel/types" "^7.0.0" 251 "@babel/types" "^7.0.0"
222 252
223"@babel/helper-split-export-declaration@^7.0.0": 253"@babel/helper-split-export-declaration@^7.0.0":
224 version "7.0.0" 254 version "7.0.0"
225 resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" 255 resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813"
256 integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==
226 dependencies: 257 dependencies:
227 "@babel/types" "^7.0.0" 258 "@babel/types" "^7.0.0"
228 259
229"@babel/highlight@^7.0.0": 260"@babel/highlight@^7.0.0":
230 version "7.0.0" 261 version "7.0.0"
231 resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 262 resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
263 integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
232 dependencies: 264 dependencies:
233 chalk "^2.0.0" 265 chalk "^2.0.0"
234 esutils "^2.0.2" 266 esutils "^2.0.2"
235 js-tokens "^4.0.0" 267 js-tokens "^4.0.0"
236 268
237"@babel/parser@^7.0.0", "@babel/parser@^7.1.0": 269"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.6":
238 version "7.1.0" 270 version "7.2.0"
239 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" 271 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.0.tgz#02d01dbc330b6cbf36b76ac93c50752c69027065"
272 integrity sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==
273
274"@babel/runtime@^7.0.0":
275 version "7.2.0"
276 resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f"
277 integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==
278 dependencies:
279 regenerator-runtime "^0.12.0"
240 280
241"@babel/template@^7.0.0", "@babel/template@^7.1.0": 281"@babel/template@^7.0.0", "@babel/template@^7.1.0":
242 version "7.1.0" 282 version "7.1.2"
243 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" 283 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644"
284 integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==
244 dependencies: 285 dependencies:
245 "@babel/code-frame" "^7.0.0" 286 "@babel/code-frame" "^7.0.0"
246 "@babel/parser" "^7.1.0" 287 "@babel/parser" "^7.1.2"
247 "@babel/types" "^7.0.0" 288 "@babel/types" "^7.1.2"
248 289
249"@babel/traverse@^7.0.0": 290"@babel/traverse@^7.0.0":
250 version "7.1.0" 291 version "7.1.6"
251 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" 292 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c"
293 integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==
252 dependencies: 294 dependencies:
253 "@babel/code-frame" "^7.0.0" 295 "@babel/code-frame" "^7.0.0"
254 "@babel/generator" "^7.0.0" 296 "@babel/generator" "^7.1.6"
255 "@babel/helper-function-name" "^7.1.0" 297 "@babel/helper-function-name" "^7.1.0"
256 "@babel/helper-split-export-declaration" "^7.0.0" 298 "@babel/helper-split-export-declaration" "^7.0.0"
257 "@babel/parser" "^7.1.0" 299 "@babel/parser" "^7.1.6"
258 "@babel/types" "^7.0.0" 300 "@babel/types" "^7.1.6"
259 debug "^3.1.0" 301 debug "^4.1.0"
260 globals "^11.1.0" 302 globals "^11.1.0"
261 lodash "^4.17.10" 303 lodash "^4.17.10"
262 304
263"@babel/types@^7.0.0": 305"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.6", "@babel/types@^7.2.0":
264 version "7.0.0" 306 version "7.2.0"
265 resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" 307 resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8"
308 integrity sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==
266 dependencies: 309 dependencies:
267 esutils "^2.0.2" 310 esutils "^2.0.2"
268 lodash "^4.17.10" 311 lodash "^4.17.10"
269 to-fast-properties "^2.0.0" 312 to-fast-properties "^2.0.0"
270 313
271"@neos21/bootstrap3-glyphicons@^1.0.1": 314"@neos21/bootstrap3-glyphicons@^1.0.1":
272 version "1.0.1" 315 version "1.0.2"
273 resolved "https://registry.yarnpkg.com/@neos21/bootstrap3-glyphicons/-/bootstrap3-glyphicons-1.0.1.tgz#e5eeec43e0153d4b51effd9ecb58cdf7029924d7" 316 resolved "https://registry.yarnpkg.com/@neos21/bootstrap3-glyphicons/-/bootstrap3-glyphicons-1.0.2.tgz#c86509a866258f645a9ed9428c10057e4c664245"
317 integrity sha512-ESM4L1GUdsDcuX+mrO6yR98ZSmlyx2RZ9X4GtcACjt6wGdGqNspwOR6o7sEinRx7oCIqcFbDVq7ls84fkSl3pw==
274 318
275"@ng-bootstrap/ng-bootstrap@^3.1.0": 319"@ng-bootstrap/ng-bootstrap@^4.0.0":
276 version "3.2.0" 320 version "4.0.0"
277 resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-3.2.0.tgz#d44b5ed18ad6f489125074b0f6099668cdce841d" 321 resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.0.0.tgz#e56aafc8e3ae900b88d528303a5962cc363088ed"
322 integrity sha512-jWVHRDUYppOSvzclP9d3lVWGUO+y0X9W6jdfyYehDkJCY0MFgtwefLYMtQ/NJ4niPzm2d/zZn+Bte48iIn0nKw==
278 dependencies: 323 dependencies:
279 tslib "^1.9.0" 324 tslib "^1.9.0"
280 325
281"@ngtools/webpack@6.2.3": 326"@ngtools/webpack@7.3.1":
282 version "6.2.3" 327 version "7.3.1"
283 resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-6.2.3.tgz#88313131079d14f6c7e07940e807bb445db6a0aa" 328 resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.3.1.tgz#4ff68007fd68fdc26f22e19115182f96fb6f7335"
329 integrity sha512-EGQRjgDf5XP+Fm1MdZNRFiPd9e1vhl11BhjkwqkAsewic4eoz6fqXfj/Osz1hQy8xU+2dPPf/byQ/+nY3E02Zg==
284 dependencies: 330 dependencies:
285 "@angular-devkit/core" "0.8.3" 331 "@angular-devkit/core" "7.3.1"
286 rxjs "~6.2.0" 332 enhanced-resolve "4.1.0"
287 tree-kill "^1.0.0" 333 rxjs "6.3.3"
288 webpack-sources "^1.1.0" 334 tree-kill "1.2.1"
335 webpack-sources "1.3.0"
289 336
290"@ngx-loading-bar/core@2.2.0", "@ngx-loading-bar/core@^2.2.0": 337"@ngx-loading-bar/core@3.0.0", "@ngx-loading-bar/core@^3.0.0":
291 version "2.2.0" 338 version "3.0.0"
292 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/core/-/core-2.2.0.tgz#ad313bbbd69e4c52cc2d6f0a8b5911272371d16a" 339 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/core/-/core-3.0.0.tgz#86c6d036b5ad50950b5ea526db585f39d44f396a"
340 integrity sha512-DBH+bKf8M9uSk2791HbtN/JvcEmBxEbUCiOJ6PYrjbginH6dUn2NsSxnv3myu0lpx+7K3MusXLNImkB5JUh2QA==
293 dependencies: 341 dependencies:
294 tslib "^1.7.1" 342 tslib "^1.7.1"
295 343
296"@ngx-loading-bar/http-client@^2.2.0": 344"@ngx-loading-bar/http-client@^3.0.0":
297 version "2.2.0" 345 version "3.0.0"
298 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/http-client/-/http-client-2.2.0.tgz#4b5443feed5c53bc5b5f06119f771edbe89799f4" 346 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/http-client/-/http-client-3.0.0.tgz#2fce2f60da37a48f2173ef4f08189eecf98d9215"
347 integrity sha512-7AHM3tmA2FDFXsKbL09vnRqqxdztpjilkP3U9zXB5Lkv3XtlJnZoQKFCSbmEusw30k3oAmY5id/ZE9X83uekZg==
299 dependencies: 348 dependencies:
300 "@ngx-loading-bar/core" "2.2.0" 349 "@ngx-loading-bar/core" "3.0.0"
301 tslib "^1.7.1" 350 tslib "^1.7.1"
302 351
303"@ngx-loading-bar/router@^2.2.0": 352"@ngx-loading-bar/router@^3.0.0":
304 version "2.2.0" 353 version "3.0.0"
305 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/router/-/router-2.2.0.tgz#c13c1a05c620a9da102102322685b671d3c9a1ba" 354 resolved "https://registry.yarnpkg.com/@ngx-loading-bar/router/-/router-3.0.0.tgz#627e73be406dfdff48175f75c110bebd4f6fa588"
355 integrity sha512-UL3GaFyFfHwgGeAdSEG800Rl3GuBfKydPp21lD/paqdsrUT2Z1cBLAiVFw7U4QdnSLaPzngYr9bzgDFdy4GqYQ==
306 dependencies: 356 dependencies:
307 "@ngx-loading-bar/core" "2.2.0" 357 "@ngx-loading-bar/core" "3.0.0"
308 tslib "^1.7.1" 358 tslib "^1.7.1"
309 359
310"@ngx-meta/core@^6.0.0-rc.1": 360"@ngx-meta/core@^6.0.0-rc.1":
311 version "6.0.0" 361 version "6.0.0"
312 resolved "https://registry.yarnpkg.com/@ngx-meta/core/-/core-6.0.0.tgz#3cdc176e810fbe7b9b2d0d09abc5c8606ec61023" 362 resolved "https://registry.yarnpkg.com/@ngx-meta/core/-/core-6.0.0.tgz#3cdc176e810fbe7b9b2d0d09abc5c8606ec61023"
363 integrity sha512-44BZrKeJsvAsnJHIgp2PG5RyM/GrkvPbE2HxFhMBgOpHBtNcsosbr3FmdhYMwKDim3fsd6HnNEE21nqEMI9+Nw==
313 dependencies: 364 dependencies:
314 tslib "~1.9.0" 365 tslib "~1.9.0"
315 366
316"@ngx-translate/i18n-polyfill@^1.0.0": 367"@ngx-translate/i18n-polyfill@^1.0.0":
317 version "1.0.0" 368 version "1.0.0"
318 resolved "https://registry.yarnpkg.com/@ngx-translate/i18n-polyfill/-/i18n-polyfill-1.0.0.tgz#145edb28bcfc1332e1bc25279eadf9d4ed0a20f8" 369 resolved "https://registry.yarnpkg.com/@ngx-translate/i18n-polyfill/-/i18n-polyfill-1.0.0.tgz#145edb28bcfc1332e1bc25279eadf9d4ed0a20f8"
370 integrity sha512-+UKmSr6cWBJiMDex6w2FwVjEeVnlEsINDGYvTgRaFRI3/IKZrsSVcfISDcBX2wWr6m4jumfOyCcimIl2TxcaoA==
319 dependencies: 371 dependencies:
320 glob "7.1.2" 372 glob "7.1.2"
321 tslib "^1.9.0" 373 tslib "^1.9.0"
322 yargs "10.0.3" 374 yargs "10.0.3"
323 375
324"@schematics/angular@0.8.3": 376"@schematics/angular@7.3.1":
325 version "0.8.3" 377 version "7.3.1"
326 resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.8.3.tgz#f4b661c5a196a06c050c0ae56809e6dbcfbf9f98" 378 resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.1.tgz#6fcd7004210fa9305310c3109c084df5c5521776"
327 dependencies: 379 integrity sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==
328 "@angular-devkit/core" "0.8.3" 380 dependencies:
329 "@angular-devkit/schematics" "0.8.3" 381 "@angular-devkit/core" "7.3.1"
330 typescript ">=2.6.2 <2.10" 382 "@angular-devkit/schematics" "7.3.1"
331 383 typescript "3.2.4"
332"@schematics/update@0.8.3": 384
333 version "0.8.3" 385"@schematics/update@0.13.1":
334 resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.8.3.tgz#e8ca76066fa14a9db732e20cf41ec540c8ee7a13" 386 version "0.13.1"
335 dependencies: 387 resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.1.tgz#481475aee18b4a9472a06512b2e4d6429af68231"
336 "@angular-devkit/core" "0.8.3" 388 integrity sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==
337 "@angular-devkit/schematics" "0.8.3" 389 dependencies:
338 npm-registry-client "^8.5.1" 390 "@angular-devkit/core" "7.3.1"
339 rxjs "~6.2.0" 391 "@angular-devkit/schematics" "7.3.1"
340 semver "^5.3.0" 392 "@yarnpkg/lockfile" "1.1.0"
341 semver-intersect "^1.1.2" 393 ini "1.3.5"
394 pacote "9.4.0"
395 rxjs "6.3.3"
396 semver "5.6.0"
397 semver-intersect "1.4.0"
398
399"@streamroot/videojs-hlsjs-plugin@^1.0.7":
400 version "1.0.7"
401 resolved "https://registry.yarnpkg.com/@streamroot/videojs-hlsjs-plugin/-/videojs-hlsjs-plugin-1.0.7.tgz#581aecdf6a966162b404c60bd3ab8264eb89d334"
402 integrity sha512-7oAIOhEFxkfLOYWDfg7Oh3+OrnoTElRvUE3Jblg2B+SHmnrw4YXQnAwYJ0AHjNIBKoHnQubzZGttLaHAFJVspQ==
342 403
343"@types/bittorrent-protocol@*": 404"@types/bittorrent-protocol@*":
344 version "2.2.2" 405 version "2.2.2"
345 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83" 406 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83"
407 integrity sha512-VAPyW8eGh8FjyGxBSKyPSH60Qkxo3r2W4sDYXCQJYfYD49UnA1SUP+5GQ/4MgbdiEDSp9YW4yuebpIR/vstD5Q==
346 dependencies: 408 dependencies:
347 "@types/node" "*" 409 "@types/node" "*"
348 410
349"@types/core-js@^2.5.0": 411"@types/core-js@^2.5.0":
350 version "2.5.0" 412 version "2.5.0"
351 resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47" 413 resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47"
414 integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ==
352 415
353"@types/jasmine@*", "@types/jasmine@^2.8.7": 416"@types/hls.js@^0.12.0":
354 version "2.8.8" 417 version "0.12.0"
355 resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" 418 resolved "https://registry.yarnpkg.com/@types/hls.js/-/hls.js-0.12.0.tgz#33f73e542201a766fa56792cb81fe9f97d7097ed"
419 integrity sha512-hJ7eJAQVEazAANK4Ay0YbXlZF36SDy9c8kcHTF7//77ylgV6hV/JrlwhVmobsSacr5aZcbw5MbZ2bSHbS36eOQ==
420
421"@types/jasmine@*":
422 version "3.3.1"
423 resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.1.tgz#b6c4f356013364e98b583647c7b3b6de6fccd2cc"
424 integrity sha512-JnKB+cEIFuQZXizZP6N0zxma+JlvowkjefWuL61otVmXN7Ebbs4ka3IbDVIz1pc+TCiT00q925jANz3gQJ9qXw==
425
426"@types/jasmine@^2.8.7":
427 version "2.8.12"
428 resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.12.tgz#dfe606b07686c977f54d17cb8ebe6cae2e26f8ff"
429 integrity sha512-eE+xeiGBPgQsNcyg61JBqQS6NtxC+s2yfOikMCnc0Z4NqKujzmSahmtjLCKVQU/AyrTEQ76TOwQBnr8wGP2bmA==
356 430
357"@types/jasminewd2@^2.0.3": 431"@types/jasminewd2@^2.0.3":
358 version "2.0.3" 432 version "2.0.6"
359 resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95" 433 resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.6.tgz#2f57a8d9875a6c9ef328a14bd070ba14a055ac39"
434 integrity sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==
360 dependencies: 435 dependencies:
361 "@types/jasmine" "*" 436 "@types/jasmine" "*"
362 437
363"@types/jest@^23.3.1": 438"@types/jest@^23.3.1":
364 version "23.3.2" 439 version "23.3.10"
365 resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.2.tgz#07b90f6adf75d42c34230c026a2529e56c249dbb" 440 resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.10.tgz#4897974cc317bf99d4fe6af1efa15957fa9c94de"
441 integrity sha512-DC8xTuW/6TYgvEg3HEXS7cu9OijFqprVDXXiOcdOKZCU/5PJNLZU37VVvmZHdtMiGOa8wAA/We+JzbdxFzQTRQ==
366 442
367"@types/jschannel@^1.0.0": 443"@types/jschannel@^1.0.0":
368 version "1.0.0" 444 version "1.0.1"
369 resolved "https://registry.yarnpkg.com/@types/jschannel/-/jschannel-1.0.0.tgz#2e25447f661de85e221647076e9d257d9fb76d0c" 445 resolved "https://registry.yarnpkg.com/@types/jschannel/-/jschannel-1.0.1.tgz#79d582ccf42554c8457230526a3054d018d559f0"
446 integrity sha512-S34NuOoOOKXbft3f9GDeLKp777ABCGArZaqUWOuu1Xn+1S75Osmk8kCeqmw5x2TuASyjE082DwDAuoaXNIRCTw==
370 447
371"@types/lodash-es@^4.17.0": 448"@types/lodash-es@^4.17.0":
372 version "4.17.1" 449 version "4.17.1"
373 resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.1.tgz#56745e5411558362aeca31def918f88f725dd29d" 450 resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.1.tgz#56745e5411558362aeca31def918f88f725dd29d"
451 integrity sha512-3EDZjphPfdjnsWvY11ufYImFMPyQJwIH1eFYRgWQsjOctce06fmNgVf5sfvXBRiaS1o0X50bAln1lfWs8ZO3BA==
374 dependencies: 452 dependencies:
375 "@types/lodash" "*" 453 "@types/lodash" "*"
376 454
377"@types/lodash@*": 455"@types/lodash@*":
378 version "4.14.116" 456 version "4.14.118"
379 resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" 457 resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27"
458 integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw==
380 459
381"@types/magnet-uri@*": 460"@types/magnet-uri@*":
382 version "5.1.1" 461 version "5.1.1"
383 resolved "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz#861aaf64c92a3137dd848fefc55cd352a8ea851a" 462 resolved "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz#861aaf64c92a3137dd848fefc55cd352a8ea851a"
463 integrity sha1-hhqvZMkqMTfdhI/vxVzTUqjqhRo=
384 dependencies: 464 dependencies:
385 "@types/node" "*" 465 "@types/node" "*"
386 466
387"@types/markdown-it@^0.0.5": 467"@types/markdown-it@^0.0.5":
388 version "0.0.5" 468 version "0.0.5"
389 resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.5.tgz#5cdcbe08e81075d5dbf15466b311359b02a30c2b" 469 resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.5.tgz#5cdcbe08e81075d5dbf15466b311359b02a30c2b"
470 integrity sha512-Bhc4jTJ3g+WU+dBvyhwwssHifjqapauyjV+0cTWVWRjwDAaK9PebZBFpLJmoOCp47qlkDeeT1Y9sV9LyyaG02w==
390 471
391"@types/mousetrap@^1.6.0": 472"@types/mousetrap@^1.6.0":
392 version "1.6.0" 473 version "1.6.0"
393 resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.0.tgz#c3951ab98b88ff6093cd0b1e4f8591af439141b8" 474 resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.0.tgz#c3951ab98b88ff6093cd0b1e4f8591af439141b8"
475 integrity sha512-Jn2cF8X6RAMiSmJaATGjf2r3GzIfpZQpvnQhKprQ5sAbMaNXc7hc9sA2XHdMl3bEMEQhTV79JVW7n4Pgg7sjtg==
394 476
395"@types/node@*", "@types/node@^10.9.2": 477"@types/node@*", "@types/node@^10.9.2":
396 version "10.10.1" 478 version "10.12.12"
397 resolved "https://registry.yarnpkg.com/@types/node/-/node-10.10.1.tgz#d5c96ca246a418404914d180b7fdd625ad18eca6" 479 resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47"
480 integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==
398 481
399"@types/node@^6.0.46": 482"@types/node@^6.0.46":
400 version "6.0.117" 483 version "6.14.2"
401 resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.117.tgz#ccfc2506001404708528d657aad9c1b931111646" 484 resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.2.tgz#40b3dbb1221c7d66802cbcc32fe3b85e54569c77"
485 integrity sha512-JWB3xaVfsfnFY8Ofc9rTB/op0fqqTSqy4vBcVk1LuRJvta7KTX+D//fCkiTMeLGhdr2EbFZzQjC97gvmPilk9Q==
402 486
403"@types/parse-torrent-file@*": 487"@types/parse-torrent-file@*":
404 version "4.0.1" 488 version "4.0.1"
405 resolved "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz#056a6c18f3fac0cd7c6c74540f00496a3225976b" 489 resolved "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz#056a6c18f3fac0cd7c6c74540f00496a3225976b"
490 integrity sha1-BWpsGPP6wM18bHRUDwBJajIll2s=
406 dependencies: 491 dependencies:
407 "@types/node" "*" 492 "@types/node" "*"
408 493
409"@types/parse-torrent@*": 494"@types/parse-torrent@*":
410 version "5.8.2" 495 version "5.8.2"
411 resolved "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.2.tgz#53ab880e38ced2005a79948f0df0c8762539323e" 496 resolved "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.2.tgz#53ab880e38ced2005a79948f0df0c8762539323e"
497 integrity sha512-wfXO0N2vNkk/W1CEiPbT+7GPiOe3fnRLecdFBw/HNxPyx6czOGqUYi8bw2dbjEmYqWSsqhMdrajEd6o5ry2p4w==
412 dependencies: 498 dependencies:
413 "@types/magnet-uri" "*" 499 "@types/magnet-uri" "*"
414 "@types/node" "*" 500 "@types/node" "*"
@@ -416,239 +502,304 @@
416 502
417"@types/q@^0.0.32": 503"@types/q@^0.0.32":
418 version "0.0.32" 504 version "0.0.32"
419 resolved "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" 505 resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
506 integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU=
420 507
421"@types/sanitize-html@1.18.0": 508"@types/sanitize-html@1.18.0":
422 version "1.18.0" 509 version "1.18.0"
423 resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-1.18.0.tgz#de5cb560a41308ea8474e93b9d10bbb4050692f5" 510 resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-1.18.0.tgz#de5cb560a41308ea8474e93b9d10bbb4050692f5"
511 integrity sha512-cGOcHB/CFqqu4l6b7yVGej6eQ/QsUSsgWHcJPCvfPgXx8Q7t602EdnZ6fZcM019dbdE9/7ecRipBwk8cCMgukw==
424 512
425"@types/selenium-webdriver@^3.0.0": 513"@types/selenium-webdriver@^3.0.0":
426 version "3.0.10" 514 version "3.0.13"
427 resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz#e98cc6f05b4b436277671c784ee2f9d05a634f9b" 515 resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.13.tgz#deb799c641773c5e367abafc92d1e733d62cddd7"
516 integrity sha512-rI0LGoMiZGUM+tjDakQpwZOvcmQoubiJ7hxqrYU12VRxBuGGvOThxrBOU/QmJKlKg1WG6FMzuvcEyLffvVSsmw==
428 517
429"@types/simple-peer@*": 518"@types/simple-peer@*":
430 version "6.1.5" 519 version "6.1.5"
431 resolved "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.5.tgz#9353f84cefd052a9684b9a5662c983fc2bcfab41" 520 resolved "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.5.tgz#9353f84cefd052a9684b9a5662c983fc2bcfab41"
521 integrity sha512-huXri3g0rQpIO5jkG630a2sBrh1WXgsd2Gsoc9MqWTRZ0AWqyMEcMCfLXmw5i8AvrZbjAT6BIxW2gEqvpqSYwA==
432 dependencies: 522 dependencies:
433 "@types/node" "*" 523 "@types/node" "*"
434 524
435"@types/video.js@6.2.7": 525"@types/socket.io-client@^1.4.32":
436 version "6.2.7" 526 version "1.4.32"
437 resolved "https://registry.yarnpkg.com/@types/video.js/-/video.js-6.2.7.tgz#ef6f965746c10928dd68c80ad8e50c433b35d49a" 527 resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14"
528 integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg==
529
530"@types/source-list-map@*":
531 version "0.1.2"
532 resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
533 integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
534
535"@types/video.js@^7.2.5":
536 version "7.2.5"
537 resolved "https://registry.yarnpkg.com/@types/video.js/-/video.js-7.2.5.tgz#20896c81141d3517c3a89bb6eb97c6a191aa5d4c"
538 integrity sha512-5WUDOme0q81d58nEqf7qnz7B2Jc4jlA7/MQGOgoqI5VE6oied0KUfk5x/XqPSZSAHNwDDREAkrcK8JXcB+iruQ==
539
540"@types/webpack-sources@^0.1.5":
541 version "0.1.5"
542 resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92"
543 integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==
544 dependencies:
545 "@types/node" "*"
546 "@types/source-list-map" "*"
547 source-map "^0.6.1"
438 548
439"@types/webtorrent@^0.98.4": 549"@types/webtorrent@^0.98.4":
440 version "0.98.4" 550 version "0.98.4"
441 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4" 551 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4"
552 integrity sha1-z42+IuPVz2kVMF9/lwtSvKAb+LQ=
442 dependencies: 553 dependencies:
443 "@types/bittorrent-protocol" "*" 554 "@types/bittorrent-protocol" "*"
444 "@types/node" "*" 555 "@types/node" "*"
445 "@types/parse-torrent" "*" 556 "@types/parse-torrent" "*"
446 "@types/simple-peer" "*" 557 "@types/simple-peer" "*"
447 558
448"@videojs/http-streaming@1.2.4": 559"@videojs/http-streaming@1.4.1":
449 version "1.2.4" 560 version "1.4.1"
450 resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-1.2.4.tgz#6245524b76203db5e6750153d4896d007cc7f7cd" 561 resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-1.4.1.tgz#0b9c5d1a271d72546ec77e9c3f3b75995102032f"
562 integrity sha512-Bb3aP/b81heFt98JzDm8zN+mkHel8Ehb/ZKAOECeL19zq/Gp12653cE4JmG7cUI6VPSQB60DYMp6us3/HqKs7Q==
451 dependencies: 563 dependencies:
452 aes-decrypter "3.0.0" 564 aes-decrypter "3.0.0"
453 global "^4.3.0" 565 global "^4.3.0"
454 m3u8-parser "4.2.0" 566 m3u8-parser "4.2.0"
455 mpd-parser "0.6.1" 567 mpd-parser "0.7.0"
456 mux.js "4.5.1" 568 mux.js "4.5.1"
457 url-toolkit "^2.1.3" 569 url-toolkit "^2.1.3"
458 video.js "^6.8.0 || ^7.0.0" 570 video.js "^6.8.0 || ^7.0.0"
459 571
460"@webassemblyjs/ast@1.7.6": 572"@webassemblyjs/ast@1.7.11":
461 version "1.7.6" 573 version "1.7.11"
462 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" 574 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
463 dependencies: 575 integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==
464 "@webassemblyjs/helper-module-context" "1.7.6" 576 dependencies:
465 "@webassemblyjs/helper-wasm-bytecode" "1.7.6" 577 "@webassemblyjs/helper-module-context" "1.7.11"
466 "@webassemblyjs/wast-parser" "1.7.6" 578 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
467 mamacro "^0.0.3" 579 "@webassemblyjs/wast-parser" "1.7.11"
468 580
469"@webassemblyjs/floating-point-hex-parser@1.7.6": 581"@webassemblyjs/floating-point-hex-parser@1.7.11":
470 version "1.7.6" 582 version "1.7.11"
471 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" 583 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
472 584 integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
473"@webassemblyjs/helper-api-error@1.7.6": 585
474 version "1.7.6" 586"@webassemblyjs/helper-api-error@1.7.11":
475 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" 587 version "1.7.11"
476 588 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
477"@webassemblyjs/helper-buffer@1.7.6": 589 integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
478 version "1.7.6" 590
479 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" 591"@webassemblyjs/helper-buffer@1.7.11":
480 592 version "1.7.11"
481"@webassemblyjs/helper-code-frame@1.7.6": 593 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
482 version "1.7.6" 594 integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
483 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" 595
484 dependencies: 596"@webassemblyjs/helper-code-frame@1.7.11":
485 "@webassemblyjs/wast-printer" "1.7.6" 597 version "1.7.11"
486 598 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
487"@webassemblyjs/helper-fsm@1.7.6": 599 integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==
488 version "1.7.6" 600 dependencies:
489 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" 601 "@webassemblyjs/wast-printer" "1.7.11"
490 602
491"@webassemblyjs/helper-module-context@1.7.6": 603"@webassemblyjs/helper-fsm@1.7.11":
492 version "1.7.6" 604 version "1.7.11"
493 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" 605 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
494 dependencies: 606 integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
495 mamacro "^0.0.3" 607
496 608"@webassemblyjs/helper-module-context@1.7.11":
497"@webassemblyjs/helper-wasm-bytecode@1.7.6": 609 version "1.7.11"
498 version "1.7.6" 610 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
499 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" 611 integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
500 612
501"@webassemblyjs/helper-wasm-section@1.7.6": 613"@webassemblyjs/helper-wasm-bytecode@1.7.11":
502 version "1.7.6" 614 version "1.7.11"
503 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" 615 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
504 dependencies: 616 integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
505 "@webassemblyjs/ast" "1.7.6" 617
506 "@webassemblyjs/helper-buffer" "1.7.6" 618"@webassemblyjs/helper-wasm-section@1.7.11":
507 "@webassemblyjs/helper-wasm-bytecode" "1.7.6" 619 version "1.7.11"
508 "@webassemblyjs/wasm-gen" "1.7.6" 620 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
509 621 integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==
510"@webassemblyjs/ieee754@1.7.6": 622 dependencies:
511 version "1.7.6" 623 "@webassemblyjs/ast" "1.7.11"
512 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" 624 "@webassemblyjs/helper-buffer" "1.7.11"
625 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
626 "@webassemblyjs/wasm-gen" "1.7.11"
627
628"@webassemblyjs/ieee754@1.7.11":
629 version "1.7.11"
630 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
631 integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==
513 dependencies: 632 dependencies:
514 "@xtuc/ieee754" "^1.2.0" 633 "@xtuc/ieee754" "^1.2.0"
515 634
516"@webassemblyjs/leb128@1.7.6": 635"@webassemblyjs/leb128@1.7.11":
517 version "1.7.6" 636 version "1.7.11"
518 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" 637 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
638 integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==
519 dependencies: 639 dependencies:
520 "@xtuc/long" "4.2.1" 640 "@xtuc/long" "4.2.1"
521 641
522"@webassemblyjs/utf8@1.7.6": 642"@webassemblyjs/utf8@1.7.11":
523 version "1.7.6" 643 version "1.7.11"
524 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" 644 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
525 645 integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
526"@webassemblyjs/wasm-edit@1.7.6": 646
527 version "1.7.6" 647"@webassemblyjs/wasm-edit@1.7.11":
528 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" 648 version "1.7.11"
529 dependencies: 649 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
530 "@webassemblyjs/ast" "1.7.6" 650 integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==
531 "@webassemblyjs/helper-buffer" "1.7.6" 651 dependencies:
532 "@webassemblyjs/helper-wasm-bytecode" "1.7.6" 652 "@webassemblyjs/ast" "1.7.11"
533 "@webassemblyjs/helper-wasm-section" "1.7.6" 653 "@webassemblyjs/helper-buffer" "1.7.11"
534 "@webassemblyjs/wasm-gen" "1.7.6" 654 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
535 "@webassemblyjs/wasm-opt" "1.7.6" 655 "@webassemblyjs/helper-wasm-section" "1.7.11"
536 "@webassemblyjs/wasm-parser" "1.7.6" 656 "@webassemblyjs/wasm-gen" "1.7.11"
537 "@webassemblyjs/wast-printer" "1.7.6" 657 "@webassemblyjs/wasm-opt" "1.7.11"
538 658 "@webassemblyjs/wasm-parser" "1.7.11"
539"@webassemblyjs/wasm-gen@1.7.6": 659 "@webassemblyjs/wast-printer" "1.7.11"
540 version "1.7.6" 660
541 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" 661"@webassemblyjs/wasm-gen@1.7.11":
542 dependencies: 662 version "1.7.11"
543 "@webassemblyjs/ast" "1.7.6" 663 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
544 "@webassemblyjs/helper-wasm-bytecode" "1.7.6" 664 integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==
545 "@webassemblyjs/ieee754" "1.7.6" 665 dependencies:
546 "@webassemblyjs/leb128" "1.7.6" 666 "@webassemblyjs/ast" "1.7.11"
547 "@webassemblyjs/utf8" "1.7.6" 667 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
548 668 "@webassemblyjs/ieee754" "1.7.11"
549"@webassemblyjs/wasm-opt@1.7.6": 669 "@webassemblyjs/leb128" "1.7.11"
550 version "1.7.6" 670 "@webassemblyjs/utf8" "1.7.11"
551 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" 671
552 dependencies: 672"@webassemblyjs/wasm-opt@1.7.11":
553 "@webassemblyjs/ast" "1.7.6" 673 version "1.7.11"
554 "@webassemblyjs/helper-buffer" "1.7.6" 674 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
555 "@webassemblyjs/wasm-gen" "1.7.6" 675 integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==
556 "@webassemblyjs/wasm-parser" "1.7.6" 676 dependencies:
557 677 "@webassemblyjs/ast" "1.7.11"
558"@webassemblyjs/wasm-parser@1.7.6": 678 "@webassemblyjs/helper-buffer" "1.7.11"
559 version "1.7.6" 679 "@webassemblyjs/wasm-gen" "1.7.11"
560 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" 680 "@webassemblyjs/wasm-parser" "1.7.11"
561 dependencies: 681
562 "@webassemblyjs/ast" "1.7.6" 682"@webassemblyjs/wasm-parser@1.7.11":
563 "@webassemblyjs/helper-api-error" "1.7.6" 683 version "1.7.11"
564 "@webassemblyjs/helper-wasm-bytecode" "1.7.6" 684 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
565 "@webassemblyjs/ieee754" "1.7.6" 685 integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==
566 "@webassemblyjs/leb128" "1.7.6" 686 dependencies:
567 "@webassemblyjs/utf8" "1.7.6" 687 "@webassemblyjs/ast" "1.7.11"
568 688 "@webassemblyjs/helper-api-error" "1.7.11"
569"@webassemblyjs/wast-parser@1.7.6": 689 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
570 version "1.7.6" 690 "@webassemblyjs/ieee754" "1.7.11"
571 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" 691 "@webassemblyjs/leb128" "1.7.11"
572 dependencies: 692 "@webassemblyjs/utf8" "1.7.11"
573 "@webassemblyjs/ast" "1.7.6" 693
574 "@webassemblyjs/floating-point-hex-parser" "1.7.6" 694"@webassemblyjs/wast-parser@1.7.11":
575 "@webassemblyjs/helper-api-error" "1.7.6" 695 version "1.7.11"
576 "@webassemblyjs/helper-code-frame" "1.7.6" 696 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
577 "@webassemblyjs/helper-fsm" "1.7.6" 697 integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==
698 dependencies:
699 "@webassemblyjs/ast" "1.7.11"
700 "@webassemblyjs/floating-point-hex-parser" "1.7.11"
701 "@webassemblyjs/helper-api-error" "1.7.11"
702 "@webassemblyjs/helper-code-frame" "1.7.11"
703 "@webassemblyjs/helper-fsm" "1.7.11"
578 "@xtuc/long" "4.2.1" 704 "@xtuc/long" "4.2.1"
579 mamacro "^0.0.3"
580 705
581"@webassemblyjs/wast-printer@1.7.6": 706"@webassemblyjs/wast-printer@1.7.11":
582 version "1.7.6" 707 version "1.7.11"
583 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" 708 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
709 integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==
584 dependencies: 710 dependencies:
585 "@webassemblyjs/ast" "1.7.6" 711 "@webassemblyjs/ast" "1.7.11"
586 "@webassemblyjs/wast-parser" "1.7.6" 712 "@webassemblyjs/wast-parser" "1.7.11"
587 "@xtuc/long" "4.2.1" 713 "@xtuc/long" "4.2.1"
588 714
589"@xtuc/ieee754@^1.2.0": 715"@xtuc/ieee754@^1.2.0":
590 version "1.2.0" 716 version "1.2.0"
591 resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 717 resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
718 integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
592 719
593"@xtuc/long@4.2.1": 720"@xtuc/long@4.2.1":
594 version "4.2.1" 721 version "4.2.1"
595 resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" 722 resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8"
723 integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==
724
725"@yarnpkg/lockfile@1.1.0":
726 version "1.1.0"
727 resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
728 integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
729
730JSONStream@^1.3.4:
731 version "1.3.5"
732 resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
733 integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
734 dependencies:
735 jsonparse "^1.2.0"
736 through ">=2.2.7 <3"
596 737
597abab@^2.0.0: 738abab@^2.0.0:
598 version "2.0.0" 739 version "2.0.0"
599 resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" 740 resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f"
741 integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==
600 742
601abbrev@1: 743abbrev@1:
602 version "1.1.1" 744 version "1.1.1"
603 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 745 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
604 746 integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
605abbrev@1.0.x:
606 version "1.0.9"
607 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
608 747
609accepts@~1.3.4, accepts@~1.3.5: 748accepts@~1.3.4, accepts@~1.3.5:
610 version "1.3.5" 749 version "1.3.5"
611 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 750 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
751 integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I=
612 dependencies: 752 dependencies:
613 mime-types "~2.1.18" 753 mime-types "~2.1.18"
614 negotiator "0.6.1" 754 negotiator "0.6.1"
615 755
616acorn-dynamic-import@^3.0.0: 756acorn-dynamic-import@^4.0.0:
617 version "3.0.0" 757 version "4.0.0"
618 resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" 758 resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
619 dependencies: 759 integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
620 acorn "^5.0.0"
621 760
622acorn-globals@^4.1.0: 761acorn-globals@^4.1.0:
623 version "4.3.0" 762 version "4.3.0"
624 resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" 763 resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103"
764 integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==
625 dependencies: 765 dependencies:
626 acorn "^6.0.1" 766 acorn "^6.0.1"
627 acorn-walk "^6.0.1" 767 acorn-walk "^6.0.1"
628 768
629acorn-walk@^6.0.1: 769acorn-walk@^6.0.1:
630 version "6.0.1" 770 version "6.1.1"
631 resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.0.1.tgz#c7827bdbb8e21aa97b609adfa225400d9ae348ba" 771 resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
772 integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
632 773
633acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2, acorn@^5.7.3: 774acorn@^5.5.3, acorn@^5.7.3:
634 version "5.7.3" 775 version "5.7.3"
635 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 776 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
777 integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
636 778
637acorn@^6.0.1: 779acorn@^6.0.1:
638 version "6.0.1" 780 version "6.0.4"
639 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.1.tgz#66e6147e1027704479dc6d9b20d884c572db3cc1" 781 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
782 integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==
783
784acorn@^6.0.5:
785 version "6.1.0"
786 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818"
787 integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==
640 788
641addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2: 789addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2:
642 version "1.5.1" 790 version "1.5.1"
643 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208" 791 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208"
792 integrity sha512-bA+dyydTNuQtrEDJ0g9eR7XabNhvrM5yZY0hvTbNK3yvoeC73ZqMES6E1cEqH9WPxs4uMtMsOjfwS4FmluhsAA==
644 793
645adm-zip@^0.4.9: 794adm-zip@^0.4.9:
646 version "0.4.11" 795 version "0.4.13"
647 resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" 796 resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a"
797 integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==
648 798
649aes-decrypter@3.0.0: 799aes-decrypter@3.0.0:
650 version "3.0.0" 800 version "3.0.0"
651 resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-3.0.0.tgz#7848a1c145b9fdbf57ae3e2b5b1bc7cf0644a8fb" 801 resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-3.0.0.tgz#7848a1c145b9fdbf57ae3e2b5b1bc7cf0644a8fb"
802 integrity sha1-eEihwUW5/b9Xrj4rWxvHzwZEqPs=
652 dependencies: 803 dependencies:
653 commander "^2.9.0" 804 commander "^2.9.0"
654 global "^4.3.2" 805 global "^4.3.2"
@@ -657,103 +808,129 @@ aes-decrypter@3.0.0:
657after@0.8.2: 808after@0.8.2:
658 version "0.8.2" 809 version "0.8.2"
659 resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 810 resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
811 integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
660 812
661agent-base@^4.1.0: 813agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0:
662 version "4.2.1" 814 version "4.2.1"
663 resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 815 resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
816 integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
664 dependencies: 817 dependencies:
665 es6-promisify "^5.0.0" 818 es6-promisify "^5.0.0"
666 819
820agentkeepalive@^3.4.1:
821 version "3.5.2"
822 resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
823 integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
824 dependencies:
825 humanize-ms "^1.2.1"
826
667ajv-errors@^1.0.0: 827ajv-errors@^1.0.0:
668 version "1.0.0" 828 version "1.0.0"
669 resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" 829 resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
830 integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=
670 831
671ajv-keywords@^3.1.0: 832ajv-keywords@^3.1.0:
672 version "3.2.0" 833 version "3.2.0"
673 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" 834 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
835 integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=
836
837ajv@6.7.0:
838 version "6.7.0"
839 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96"
840 integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==
841 dependencies:
842 fast-deep-equal "^2.0.1"
843 fast-json-stable-stringify "^2.0.0"
844 json-schema-traverse "^0.4.1"
845 uri-js "^4.2.2"
674 846
675ajv@^4.11.2: 847ajv@^4.11.2:
676 version "4.11.8" 848 version "4.11.8"
677 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 849 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
850 integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
678 dependencies: 851 dependencies:
679 co "^4.6.0" 852 co "^4.6.0"
680 json-stable-stringify "^1.0.1" 853 json-stable-stringify "^1.0.1"
681 854
682ajv@^5.0.0, ajv@^5.1.0, ajv@^5.3.0: 855ajv@^5.0.0:
683 version "5.5.2" 856 version "5.5.2"
684 resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 857 resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
858 integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
685 dependencies: 859 dependencies:
686 co "^4.6.0" 860 co "^4.6.0"
687 fast-deep-equal "^1.0.0" 861 fast-deep-equal "^1.0.0"
688 fast-json-stable-stringify "^2.0.0" 862 fast-json-stable-stringify "^2.0.0"
689 json-schema-traverse "^0.3.0" 863 json-schema-traverse "^0.3.0"
690 864
691ajv@^6.1.0: 865ajv@^6.1.0, ajv@^6.5.5:
692 version "6.5.3" 866 version "6.6.1"
693 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" 867 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
868 integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==
694 dependencies: 869 dependencies:
695 fast-deep-equal "^2.0.1" 870 fast-deep-equal "^2.0.1"
696 fast-json-stable-stringify "^2.0.0" 871 fast-json-stable-stringify "^2.0.0"
697 json-schema-traverse "^0.4.1" 872 json-schema-traverse "^0.4.1"
698 uri-js "^4.2.2" 873 uri-js "^4.2.2"
699 874
700ajv@~6.4.0:
701 version "6.4.0"
702 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6"
703 dependencies:
704 fast-deep-equal "^1.0.0"
705 fast-json-stable-stringify "^2.0.0"
706 json-schema-traverse "^0.3.0"
707 uri-js "^3.0.2"
708
709amdefine@>=0.0.4: 875amdefine@>=0.0.4:
710 version "1.0.1" 876 version "1.0.1"
711 resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 877 resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
878 integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
712 879
713angular2-hotkeys@^2.1.2: 880angular2-hotkeys@^2.1.2:
714 version "2.1.2" 881 version "2.1.4"
715 resolved "https://registry.yarnpkg.com/angular2-hotkeys/-/angular2-hotkeys-2.1.2.tgz#6693ecc2fbbf6f3874fb6715804e88ba6a584c0a" 882 resolved "https://registry.yarnpkg.com/angular2-hotkeys/-/angular2-hotkeys-2.1.4.tgz#7411601aea425fada77a6f1274018cb6b8961afe"
883 integrity sha512-/KzgsrFjodoeZosXqsx1IvUo3rWBalSJ3QyVz2EALj1C0Woz84iNtXPZnlzuPNHrCmHcfOu28BNvIGBa+9Ving==
716 dependencies: 884 dependencies:
717 "@types/mousetrap" "^1.6.0" 885 "@types/mousetrap" "^1.6.0"
718 mousetrap "^1.6.0" 886 mousetrap "^1.6.0"
719 887
720angular2-notifications@^1.0.2:
721 version "1.0.4"
722 resolved "https://registry.yarnpkg.com/angular2-notifications/-/angular2-notifications-1.0.4.tgz#7b3c449dbad45503965f8cd8ac00e998a4463544"
723
724ansi-colors@^3.0.0: 888ansi-colors@^3.0.0:
725 version "3.0.5" 889 version "3.2.2"
726 resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.0.5.tgz#cb9dc64993b64fd6945485f797fc3853137d9a7b" 890 resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.2.tgz#e49349137dbeb6d381b91e607c189915e53265ba"
891 integrity sha512-kJmcp4PrviBBEx95fC3dYRiC/QSN3EBd0GU1XoNEk/IuUa92rsB6o90zP3w5VAyNznR38Vkc9i8vk5zK6T7TxA==
727 892
728ansi-escapes@^3.0.0: 893ansi-escapes@^3.0.0:
729 version "3.1.0" 894 version "3.1.0"
730 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 895 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
896 integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==
731 897
732ansi-html@0.0.7: 898ansi-html@0.0.7:
733 version "0.0.7" 899 version "0.0.7"
734 resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" 900 resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
901 integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
735 902
736ansi-regex@^2.0.0: 903ansi-regex@^2.0.0:
737 version "2.1.1" 904 version "2.1.1"
738 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 905 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
906 integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
739 907
740ansi-regex@^3.0.0: 908ansi-regex@^3.0.0:
741 version "3.0.0" 909 version "3.0.0"
742 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 910 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
911 integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
912
913ansi-regex@^4.0.0:
914 version "4.0.0"
915 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
916 integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==
743 917
744ansi-styles@^2.2.1: 918ansi-styles@^2.2.1:
745 version "2.2.1" 919 version "2.2.1"
746 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 920 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
921 integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
747 922
748ansi-styles@^3.2.0, ansi-styles@^3.2.1: 923ansi-styles@^3.2.0, ansi-styles@^3.2.1:
749 version "3.2.1" 924 version "3.2.1"
750 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 925 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
926 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
751 dependencies: 927 dependencies:
752 color-convert "^1.9.0" 928 color-convert "^1.9.0"
753 929
754anymatch@^1.3.0: 930anymatch@^1.3.0:
755 version "1.3.2" 931 version "1.3.2"
756 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 932 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
933 integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==
757 dependencies: 934 dependencies:
758 micromatch "^2.1.5" 935 micromatch "^2.1.5"
759 normalize-path "^2.0.0" 936 normalize-path "^2.0.0"
@@ -761,6 +938,7 @@ anymatch@^1.3.0:
761anymatch@^2.0.0: 938anymatch@^2.0.0:
762 version "2.0.0" 939 version "2.0.0"
763 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 940 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
941 integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
764 dependencies: 942 dependencies:
765 micromatch "^3.1.4" 943 micromatch "^3.1.4"
766 normalize-path "^2.1.1" 944 normalize-path "^2.1.1"
@@ -768,26 +946,31 @@ anymatch@^2.0.0:
768app-root-path@^2.1.0: 946app-root-path@^2.1.0:
769 version "2.1.0" 947 version "2.1.0"
770 resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" 948 resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a"
949 integrity sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=
771 950
772append-transform@^0.4.0: 951append-transform@^0.4.0:
773 version "0.4.0" 952 version "0.4.0"
774 resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 953 resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
954 integrity sha1-126/jKlNJ24keja61EpLdKthGZE=
775 dependencies: 955 dependencies:
776 default-require-extensions "^1.0.0" 956 default-require-extensions "^1.0.0"
777 957
778append-transform@^1.0.0: 958append-transform@^1.0.0:
779 version "1.0.0" 959 version "1.0.0"
780 resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" 960 resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab"
961 integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==
781 dependencies: 962 dependencies:
782 default-require-extensions "^2.0.0" 963 default-require-extensions "^2.0.0"
783 964
784aproba@^1.0.3, aproba@^1.1.1: 965aproba@^1.0.3, aproba@^1.1.1:
785 version "1.2.0" 966 version "1.2.0"
786 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 967 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
968 integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
787 969
788are-we-there-yet@~1.1.2: 970are-we-there-yet@~1.1.2:
789 version "1.1.5" 971 version "1.1.5"
790 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 972 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
973 integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
791 dependencies: 974 dependencies:
792 delegates "^1.0.0" 975 delegates "^1.0.0"
793 readable-stream "^2.0.6" 976 readable-stream "^2.0.6"
@@ -795,80 +978,98 @@ are-we-there-yet@~1.1.2:
795argparse@^1.0.7: 978argparse@^1.0.7:
796 version "1.0.10" 979 version "1.0.10"
797 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 980 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
981 integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
798 dependencies: 982 dependencies:
799 sprintf-js "~1.0.2" 983 sprintf-js "~1.0.2"
800 984
801arr-diff@^2.0.0: 985arr-diff@^2.0.0:
802 version "2.0.0" 986 version "2.0.0"
803 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 987 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
988 integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
804 dependencies: 989 dependencies:
805 arr-flatten "^1.0.1" 990 arr-flatten "^1.0.1"
806 991
807arr-diff@^4.0.0: 992arr-diff@^4.0.0:
808 version "4.0.0" 993 version "4.0.0"
809 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 994 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
995 integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
810 996
811arr-flatten@^1.0.1, arr-flatten@^1.1.0: 997arr-flatten@^1.0.1, arr-flatten@^1.1.0:
812 version "1.1.0" 998 version "1.1.0"
813 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 999 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
1000 integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
814 1001
815arr-union@^3.1.0: 1002arr-union@^3.1.0:
816 version "3.1.0" 1003 version "3.1.0"
817 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 1004 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
1005 integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
818 1006
819array-equal@^1.0.0: 1007array-equal@^1.0.0:
820 version "1.0.0" 1008 version "1.0.0"
821 resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 1009 resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
1010 integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
822 1011
823array-find-index@^1.0.1: 1012array-find-index@^1.0.1:
824 version "1.0.2" 1013 version "1.0.2"
825 resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 1014 resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
1015 integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
826 1016
827array-flatten@1.1.1: 1017array-flatten@1.1.1:
828 version "1.1.1" 1018 version "1.1.1"
829 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 1019 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
1020 integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
830 1021
831array-flatten@^2.1.0: 1022array-flatten@^2.1.0:
832 version "2.1.1" 1023 version "2.1.2"
833 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" 1024 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
1025 integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
834 1026
835array-slice@^0.2.3: 1027array-slice@^0.2.3:
836 version "0.2.3" 1028 version "0.2.3"
837 resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" 1029 resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
1030 integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU=
838 1031
839array-union@^1.0.1: 1032array-union@^1.0.1:
840 version "1.0.2" 1033 version "1.0.2"
841 resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 1034 resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
1035 integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
842 dependencies: 1036 dependencies:
843 array-uniq "^1.0.1" 1037 array-uniq "^1.0.1"
844 1038
845array-uniq@^1.0.1, array-uniq@^1.0.2: 1039array-uniq@^1.0.1, array-uniq@^1.0.2:
846 version "1.0.3" 1040 version "1.0.3"
847 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 1041 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
1042 integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
848 1043
849array-unique@^0.2.1: 1044array-unique@^0.2.1:
850 version "0.2.1" 1045 version "0.2.1"
851 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 1046 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
1047 integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=
852 1048
853array-unique@^0.3.2: 1049array-unique@^0.3.2:
854 version "0.3.2" 1050 version "0.3.2"
855 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 1051 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
1052 integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
856 1053
857arraybuffer.slice@~0.0.7: 1054arraybuffer.slice@~0.0.7:
858 version "0.0.7" 1055 version "0.0.7"
859 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 1056 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
1057 integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
860 1058
861arrify@^1.0.0, arrify@^1.0.1: 1059arrify@^1.0.0, arrify@^1.0.1:
862 version "1.0.1" 1060 version "1.0.1"
863 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 1061 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
1062 integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
864 1063
865asap@~2.0.3: 1064asap@~2.0.3:
866 version "2.0.6" 1065 version "2.0.6"
867 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 1066 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
1067 integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
868 1068
869asn1.js@^4.0.0: 1069asn1.js@^4.0.0:
870 version "4.10.1" 1070 version "4.10.1"
871 resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" 1071 resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
1072 integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
872 dependencies: 1073 dependencies:
873 bn.js "^4.0.0" 1074 bn.js "^4.0.0"
874 inherits "^2.0.1" 1075 inherits "^2.0.1"
@@ -877,75 +1078,90 @@ asn1.js@^4.0.0:
877asn1@~0.2.3: 1078asn1@~0.2.3:
878 version "0.2.4" 1079 version "0.2.4"
879 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 1080 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
1081 integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
880 dependencies: 1082 dependencies:
881 safer-buffer "~2.1.0" 1083 safer-buffer "~2.1.0"
882 1084
883assert-plus@1.0.0, assert-plus@^1.0.0: 1085assert-plus@1.0.0, assert-plus@^1.0.0:
884 version "1.0.0" 1086 version "1.0.0"
885 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 1087 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
1088 integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
886 1089
887assert@^1.1.1: 1090assert@^1.1.1:
888 version "1.4.1" 1091 version "1.4.1"
889 resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" 1092 resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
1093 integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
890 dependencies: 1094 dependencies:
891 util "0.10.3" 1095 util "0.10.3"
892 1096
893assign-symbols@^1.0.0: 1097assign-symbols@^1.0.0:
894 version "1.0.0" 1098 version "1.0.0"
895 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 1099 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
1100 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
896 1101
897ast-types@0.9.6: 1102ast-types@0.9.6:
898 version "0.9.6" 1103 version "0.9.6"
899 resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" 1104 resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
1105 integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
900 1106
901astral-regex@^1.0.0: 1107astral-regex@^1.0.0:
902 version "1.0.0" 1108 version "1.0.0"
903 resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 1109 resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
1110 integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
904 1111
905async-each@^1.0.0: 1112async-each@^1.0.0:
906 version "1.0.1" 1113 version "1.0.1"
907 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 1114 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
1115 integrity sha1-GdOGodntxufByF04iu28xW0zYC0=
908 1116
909async-foreach@^0.1.3: 1117async-foreach@^0.1.3:
910 version "0.1.3" 1118 version "0.1.3"
911 resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" 1119 resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
1120 integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
912 1121
913async-limiter@~1.0.0: 1122async-limiter@~1.0.0:
914 version "1.0.0" 1123 version "1.0.0"
915 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 1124 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
1125 integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
916 1126
917async@1.x, async@^1.5.2: 1127async@^1.5.2:
918 version "1.5.2" 1128 version "1.5.2"
919 resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 1129 resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
1130 integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
920 1131
921async@^2.1.4, async@^2.4.1, async@^2.5.0, async@^2.6.1: 1132async@^2.1.4, async@^2.4.1, async@^2.5.0, async@^2.6.1:
922 version "2.6.1" 1133 version "2.6.1"
923 resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" 1134 resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
1135 integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
924 dependencies: 1136 dependencies:
925 lodash "^4.17.10" 1137 lodash "^4.17.10"
926 1138
927asynckit@^0.4.0: 1139asynckit@^0.4.0:
928 version "0.4.0" 1140 version "0.4.0"
929 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 1141 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
1142 integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
930 1143
931atob@^2.1.1: 1144atob@^2.1.1:
932 version "2.1.2" 1145 version "2.1.2"
933 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 1146 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
1147 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
934 1148
935autoprefixer@^8.4.1: 1149autoprefixer@9.4.6:
936 version "8.6.5" 1150 version "9.4.6"
937 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" 1151 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.6.tgz#0ace275e33b37de16b09a5547dbfe73a98c1d446"
1152 integrity sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==
938 dependencies: 1153 dependencies:
939 browserslist "^3.2.8" 1154 browserslist "^4.4.1"
940 caniuse-lite "^1.0.30000864" 1155 caniuse-lite "^1.0.30000929"
941 normalize-range "^0.1.2" 1156 normalize-range "^0.1.2"
942 num2fraction "^1.2.2" 1157 num2fraction "^1.2.2"
943 postcss "^6.0.23" 1158 postcss "^7.0.13"
944 postcss-value-parser "^3.2.3" 1159 postcss-value-parser "^3.3.1"
945 1160
946awesome-typescript-loader@5.2.1: 1161awesome-typescript-loader@5.2.1:
947 version "5.2.1" 1162 version "5.2.1"
948 resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz#a41daf7847515f4925cdbaa3075d61f289e913fc" 1163 resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz#a41daf7847515f4925cdbaa3075d61f289e913fc"
1164 integrity sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==
949 dependencies: 1165 dependencies:
950 chalk "^2.4.1" 1166 chalk "^2.4.1"
951 enhanced-resolve "^4.0.0" 1167 enhanced-resolve "^4.0.0"
@@ -959,14 +1175,17 @@ awesome-typescript-loader@5.2.1:
959aws-sign2@~0.7.0: 1175aws-sign2@~0.7.0:
960 version "0.7.0" 1176 version "0.7.0"
961 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 1177 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
1178 integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
962 1179
963aws4@^1.6.0, aws4@^1.8.0: 1180aws4@^1.8.0:
964 version "1.8.0" 1181 version "1.8.0"
965 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 1182 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
1183 integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
966 1184
967babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 1185babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
968 version "6.26.0" 1186 version "6.26.0"
969 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 1187 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
1188 integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
970 dependencies: 1189 dependencies:
971 chalk "^1.1.3" 1190 chalk "^1.1.3"
972 esutils "^2.0.2" 1191 esutils "^2.0.2"
@@ -975,6 +1194,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
975babel-core@^6.0.0, babel-core@^6.26.0: 1194babel-core@^6.0.0, babel-core@^6.26.0:
976 version "6.26.3" 1195 version "6.26.3"
977 resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" 1196 resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
1197 integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
978 dependencies: 1198 dependencies:
979 babel-code-frame "^6.26.0" 1199 babel-code-frame "^6.26.0"
980 babel-generator "^6.26.0" 1200 babel-generator "^6.26.0"
@@ -999,6 +1219,7 @@ babel-core@^6.0.0, babel-core@^6.26.0:
999babel-generator@^6.18.0, babel-generator@^6.26.0: 1219babel-generator@^6.18.0, babel-generator@^6.26.0:
1000 version "6.26.1" 1220 version "6.26.1"
1001 resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" 1221 resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
1222 integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
1002 dependencies: 1223 dependencies:
1003 babel-messages "^6.23.0" 1224 babel-messages "^6.23.0"
1004 babel-runtime "^6.26.0" 1225 babel-runtime "^6.26.0"
@@ -1012,6 +1233,7 @@ babel-generator@^6.18.0, babel-generator@^6.26.0:
1012babel-helpers@^6.24.1: 1233babel-helpers@^6.24.1:
1013 version "6.24.1" 1234 version "6.24.1"
1014 resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 1235 resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
1236 integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
1015 dependencies: 1237 dependencies:
1016 babel-runtime "^6.22.0" 1238 babel-runtime "^6.22.0"
1017 babel-template "^6.24.1" 1239 babel-template "^6.24.1"
@@ -1019,6 +1241,7 @@ babel-helpers@^6.24.1:
1019babel-jest@^23.6.0: 1241babel-jest@^23.6.0:
1020 version "23.6.0" 1242 version "23.6.0"
1021 resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" 1243 resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1"
1244 integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==
1022 dependencies: 1245 dependencies:
1023 babel-plugin-istanbul "^4.1.6" 1246 babel-plugin-istanbul "^4.1.6"
1024 babel-preset-jest "^23.2.0" 1247 babel-preset-jest "^23.2.0"
@@ -1026,12 +1249,14 @@ babel-jest@^23.6.0:
1026babel-messages@^6.23.0: 1249babel-messages@^6.23.0:
1027 version "6.23.0" 1250 version "6.23.0"
1028 resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 1251 resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
1252 integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
1029 dependencies: 1253 dependencies:
1030 babel-runtime "^6.22.0" 1254 babel-runtime "^6.22.0"
1031 1255
1032babel-plugin-istanbul@^4.1.6: 1256babel-plugin-istanbul@^4.1.6:
1033 version "4.1.6" 1257 version "4.1.6"
1034 resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" 1258 resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
1259 integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==
1035 dependencies: 1260 dependencies:
1036 babel-plugin-syntax-object-rest-spread "^6.13.0" 1261 babel-plugin-syntax-object-rest-spread "^6.13.0"
1037 find-up "^2.1.0" 1262 find-up "^2.1.0"
@@ -1041,14 +1266,17 @@ babel-plugin-istanbul@^4.1.6:
1041babel-plugin-jest-hoist@^23.2.0: 1266babel-plugin-jest-hoist@^23.2.0:
1042 version "23.2.0" 1267 version "23.2.0"
1043 resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" 1268 resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
1269 integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=
1044 1270
1045babel-plugin-syntax-object-rest-spread@^6.13.0: 1271babel-plugin-syntax-object-rest-spread@^6.13.0:
1046 version "6.13.0" 1272 version "6.13.0"
1047 resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 1273 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
1274 integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
1048 1275
1049babel-preset-jest@^23.2.0: 1276babel-preset-jest@^23.2.0:
1050 version "23.2.0" 1277 version "23.2.0"
1051 resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" 1278 resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
1279 integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY=
1052 dependencies: 1280 dependencies:
1053 babel-plugin-jest-hoist "^23.2.0" 1281 babel-plugin-jest-hoist "^23.2.0"
1054 babel-plugin-syntax-object-rest-spread "^6.13.0" 1282 babel-plugin-syntax-object-rest-spread "^6.13.0"
@@ -1056,6 +1284,7 @@ babel-preset-jest@^23.2.0:
1056babel-register@^6.26.0: 1284babel-register@^6.26.0:
1057 version "6.26.0" 1285 version "6.26.0"
1058 resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 1286 resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
1287 integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
1059 dependencies: 1288 dependencies:
1060 babel-core "^6.26.0" 1289 babel-core "^6.26.0"
1061 babel-runtime "^6.26.0" 1290 babel-runtime "^6.26.0"
@@ -1065,9 +1294,10 @@ babel-register@^6.26.0:
1065 mkdirp "^0.5.1" 1294 mkdirp "^0.5.1"
1066 source-map-support "^0.4.15" 1295 source-map-support "^0.4.15"
1067 1296
1068babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: 1297babel-runtime@^6.22.0, babel-runtime@^6.26.0:
1069 version "6.26.0" 1298 version "6.26.0"
1070 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 1299 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
1300 integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
1071 dependencies: 1301 dependencies:
1072 core-js "^2.4.0" 1302 core-js "^2.4.0"
1073 regenerator-runtime "^0.11.0" 1303 regenerator-runtime "^0.11.0"
@@ -1075,6 +1305,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
1075babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: 1305babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
1076 version "6.26.0" 1306 version "6.26.0"
1077 resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 1307 resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
1308 integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
1078 dependencies: 1309 dependencies:
1079 babel-runtime "^6.26.0" 1310 babel-runtime "^6.26.0"
1080 babel-traverse "^6.26.0" 1311 babel-traverse "^6.26.0"
@@ -1085,6 +1316,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
1085babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: 1316babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0:
1086 version "6.26.0" 1317 version "6.26.0"
1087 resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 1318 resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
1319 integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
1088 dependencies: 1320 dependencies:
1089 babel-code-frame "^6.26.0" 1321 babel-code-frame "^6.26.0"
1090 babel-messages "^6.23.0" 1322 babel-messages "^6.23.0"
@@ -1099,6 +1331,7 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0:
1099babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: 1331babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0:
1100 version "6.26.0" 1332 version "6.26.0"
1101 resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 1333 resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
1334 integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
1102 dependencies: 1335 dependencies:
1103 babel-runtime "^6.26.0" 1336 babel-runtime "^6.26.0"
1104 esutils "^2.0.2" 1337 esutils "^2.0.2"
@@ -1108,30 +1341,37 @@ babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0:
1108babylon@^6.18.0: 1341babylon@^6.18.0:
1109 version "6.18.0" 1342 version "6.18.0"
1110 resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 1343 resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
1344 integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
1111 1345
1112backo2@1.0.2: 1346backo2@1.0.2:
1113 version "1.0.2" 1347 version "1.0.2"
1114 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 1348 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
1349 integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
1115 1350
1116balanced-match@^1.0.0: 1351balanced-match@^1.0.0:
1117 version "1.0.0" 1352 version "1.0.0"
1118 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 1353 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
1354 integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
1119 1355
1120base64-arraybuffer@0.1.5: 1356base64-arraybuffer@0.1.5:
1121 version "0.1.5" 1357 version "0.1.5"
1122 resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 1358 resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
1359 integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
1123 1360
1124base64-js@^1.0.2: 1361base64-js@^1.0.2:
1125 version "1.3.0" 1362 version "1.3.0"
1126 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 1363 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
1364 integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
1127 1365
1128base64id@1.0.0: 1366base64id@1.0.0:
1129 version "1.0.0" 1367 version "1.0.0"
1130 resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 1368 resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
1369 integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=
1131 1370
1132base@^0.11.1: 1371base@^0.11.1:
1133 version "0.11.2" 1372 version "0.11.2"
1134 resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 1373 resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
1374 integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
1135 dependencies: 1375 dependencies:
1136 cache-base "^1.0.1" 1376 cache-base "^1.0.1"
1137 class-utils "^0.3.5" 1377 class-utils "^0.3.5"
@@ -1144,28 +1384,33 @@ base@^0.11.1:
1144batch@0.6.1: 1384batch@0.6.1:
1145 version "0.6.1" 1385 version "0.6.1"
1146 resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" 1386 resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
1387 integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
1147 1388
1148bcrypt-pbkdf@^1.0.0: 1389bcrypt-pbkdf@^1.0.0:
1149 version "1.0.2" 1390 version "1.0.2"
1150 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 1391 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
1392 integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
1151 dependencies: 1393 dependencies:
1152 tweetnacl "^0.14.3" 1394 tweetnacl "^0.14.3"
1153 1395
1154bencode@^2.0.0: 1396bencode@^2.0.0:
1155 version "2.0.0" 1397 version "2.0.0"
1156 resolved "https://registry.yarnpkg.com/bencode/-/bencode-2.0.0.tgz#e72e6b3691d824bd03ea7aa9d752cd1d49a50027" 1398 resolved "https://registry.yarnpkg.com/bencode/-/bencode-2.0.0.tgz#e72e6b3691d824bd03ea7aa9d752cd1d49a50027"
1399 integrity sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==
1157 dependencies: 1400 dependencies:
1158 safe-buffer "^5.1.1" 1401 safe-buffer "^5.1.1"
1159 1402
1160better-assert@~1.0.0: 1403better-assert@~1.0.0:
1161 version "1.0.2" 1404 version "1.0.2"
1162 resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 1405 resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
1406 integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
1163 dependencies: 1407 dependencies:
1164 callsite "1.0.0" 1408 callsite "1.0.0"
1165 1409
1166bfj@^6.1.1: 1410bfj@^6.1.1:
1167 version "6.1.1" 1411 version "6.1.1"
1168 resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" 1412 resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48"
1413 integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==
1169 dependencies: 1414 dependencies:
1170 bluebird "^3.5.1" 1415 bluebird "^3.5.1"
1171 check-types "^7.3.0" 1416 check-types "^7.3.0"
@@ -1175,22 +1420,32 @@ bfj@^6.1.1:
1175big.js@^3.1.3: 1420big.js@^3.1.3:
1176 version "3.2.0" 1421 version "3.2.0"
1177 resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 1422 resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
1423 integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
1424
1425big.js@^5.2.2:
1426 version "5.2.2"
1427 resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
1428 integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
1178 1429
1179binary-extensions@^1.0.0: 1430binary-extensions@^1.0.0:
1180 version "1.12.0" 1431 version "1.12.0"
1181 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" 1432 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
1433 integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
1182 1434
1183binary-search@^1.3.4: 1435binary-search@^1.3.4:
1184 version "1.3.4" 1436 version "1.3.4"
1185 resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.4.tgz#d15f44ff9226ef309d85247fa0dbfbf659955f56" 1437 resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.4.tgz#d15f44ff9226ef309d85247fa0dbfbf659955f56"
1438 integrity sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==
1186 1439
1187bitfield@^2.0.0: 1440bitfield@^2.0.0:
1188 version "2.0.0" 1441 version "2.0.0"
1189 resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837" 1442 resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837"
1443 integrity sha512-4xM4DYejOHQ/qWBfeqBXNA4mJ12PwcOibFYnH1kYh5U9BHciCqEJBqGNVnMJXUhm8mflujNRLSv7IiVQxovgjw==
1190 1444
1191bittorrent-dht@^9.0.0: 1445bittorrent-dht@^9.0.0:
1192 version "9.0.0" 1446 version "9.0.0"
1193 resolved "https://registry.yarnpkg.com/bittorrent-dht/-/bittorrent-dht-9.0.0.tgz#08d5ebb51ed91d7e3eea5c275554f4323fb523e5" 1447 resolved "https://registry.yarnpkg.com/bittorrent-dht/-/bittorrent-dht-9.0.0.tgz#08d5ebb51ed91d7e3eea5c275554f4323fb523e5"
1448 integrity sha512-X5ax4G/PLtEPfqOUjqDZ2nmPENndWRMK4sT2jcQ4sXor904zhR40r4KqTyTvWYAljh5/hPPqM9DCUUtqWzRXoQ==
1194 dependencies: 1449 dependencies:
1195 bencode "^2.0.0" 1450 bencode "^2.0.0"
1196 buffer-equals "^1.0.3" 1451 buffer-equals "^1.0.3"
@@ -1208,10 +1463,12 @@ bittorrent-dht@^9.0.0:
1208bittorrent-peerid@^1.0.2: 1463bittorrent-peerid@^1.0.2:
1209 version "1.3.0" 1464 version "1.3.0"
1210 resolved "https://registry.yarnpkg.com/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz#a435d3b267c887c586c528b53359845905d7c158" 1465 resolved "https://registry.yarnpkg.com/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz#a435d3b267c887c586c528b53359845905d7c158"
1466 integrity sha512-SYd5H3RbN1ex+TrWAKXkEkASFWxAR7Tk6iLt9tfAT9ehBvZb/Y3AQDVRVJynlrixcWpnmsLYKI7tkRWgp7ORoQ==
1211 1467
1212bittorrent-protocol@^3.0.0: 1468bittorrent-protocol@^3.0.0:
1213 version "3.0.1" 1469 version "3.0.1"
1214 resolved "https://registry.yarnpkg.com/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz#d3948f4d2b09d538095f7e5f93f64ba5df6b5c2a" 1470 resolved "https://registry.yarnpkg.com/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz#d3948f4d2b09d538095f7e5f93f64ba5df6b5c2a"
1471 integrity sha512-hnvOzAu9u+2H0OLLL5byoFdz6oz5f3bx5f7R+ItUohTHMq9TgUhEJfcjo7xWtQHSKOVciYWwYTJ4EjczF5RX2A==
1215 dependencies: 1472 dependencies:
1216 bencode "^2.0.0" 1473 bencode "^2.0.0"
1217 bitfield "^2.0.0" 1474 bitfield "^2.0.0"
@@ -1222,9 +1479,10 @@ bittorrent-protocol@^3.0.0:
1222 unordered-array-remove "^1.0.2" 1479 unordered-array-remove "^1.0.2"
1223 xtend "^4.0.0" 1480 xtend "^4.0.0"
1224 1481
1225bittorrent-tracker@^9.0.0: 1482bittorrent-tracker@^9.0.0, bittorrent-tracker@^9.10.1:
1226 version "9.10.1" 1483 version "9.10.1"
1227 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11" 1484 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11"
1485 integrity sha512-n5zTL/g6Wt0rb2EnkiyiaGYhth7I/N0/xMqGUpvGX/7g1scDGBVPhJnXR8lfp3/OMj681fv40o4q/otECMtZSA==
1228 dependencies: 1486 dependencies:
1229 bencode "^2.0.0" 1487 bencode "^2.0.0"
1230 bittorrent-peerid "^1.0.2" 1488 bittorrent-peerid "^1.0.2"
@@ -1256,14 +1514,17 @@ bittorrent-tracker@^9.0.0:
1256blob-to-buffer@^1.2.6: 1514blob-to-buffer@^1.2.6:
1257 version "1.2.8" 1515 version "1.2.8"
1258 resolved "https://registry.yarnpkg.com/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz#78eeeb332f1280ed0ca6fb2b60693a8c6d36903a" 1516 resolved "https://registry.yarnpkg.com/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz#78eeeb332f1280ed0ca6fb2b60693a8c6d36903a"
1517 integrity sha512-re0AIxakF504MgeMtIyJkVcZ8T5aUxtp/QmTMlmjyb3P44E1BEv5x3LATBGApWAJATyXHtkXRD+gWTmeyYLiQA==
1259 1518
1260blob@0.0.4: 1519blob@0.0.5:
1261 version "0.0.4" 1520 version "0.0.5"
1262 resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" 1521 resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
1522 integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
1263 1523
1264block-stream2@^1.0.0: 1524block-stream2@^1.0.0:
1265 version "1.1.0" 1525 version "1.1.0"
1266 resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz#c738e3a91ba977ebb5e1fef431e13ca11d8639e2" 1526 resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz#c738e3a91ba977ebb5e1fef431e13ca11d8639e2"
1527 integrity sha1-xzjjqRupd+u14f70MeE8oR2GOeI=
1267 dependencies: 1528 dependencies:
1268 defined "^1.0.0" 1529 defined "^1.0.0"
1269 inherits "^2.0.1" 1530 inherits "^2.0.1"
@@ -1272,41 +1533,31 @@ block-stream2@^1.0.0:
1272block-stream@*: 1533block-stream@*:
1273 version "0.0.9" 1534 version "0.0.9"
1274 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 1535 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
1536 integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
1275 dependencies: 1537 dependencies:
1276 inherits "~2.0.0" 1538 inherits "~2.0.0"
1277 1539
1278blocking-proxy@^1.0.0: 1540blocking-proxy@^1.0.0:
1279 version "1.0.1" 1541 version "1.0.1"
1280 resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" 1542 resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2"
1543 integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==
1281 dependencies: 1544 dependencies:
1282 minimist "^1.2.0" 1545 minimist "^1.2.0"
1283 1546
1284bluebird@^3.3.0, bluebird@^3.5.1: 1547bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3:
1285 version "3.5.2" 1548 version "3.5.3"
1286 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" 1549 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
1550 integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
1287 1551
1288bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: 1552bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
1289 version "4.11.8" 1553 version "4.11.8"
1290 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 1554 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
1555 integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
1291 1556
1292body-parser@1.18.2: 1557body-parser@1.18.3, body-parser@^1.16.1:
1293 version "1.18.2"
1294 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
1295 dependencies:
1296 bytes "3.0.0"
1297 content-type "~1.0.4"
1298 debug "2.6.9"
1299 depd "~1.1.1"
1300 http-errors "~1.6.2"
1301 iconv-lite "0.4.19"
1302 on-finished "~2.3.0"
1303 qs "6.5.1"
1304 raw-body "2.3.2"
1305 type-is "~1.6.15"
1306
1307body-parser@^1.16.1:
1308 version "1.18.3" 1558 version "1.18.3"
1309 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 1559 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
1560 integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=
1310 dependencies: 1561 dependencies:
1311 bytes "3.0.0" 1562 bytes "3.0.0"
1312 content-type "~1.0.4" 1563 content-type "~1.0.4"
@@ -1322,6 +1573,7 @@ body-parser@^1.16.1:
1322bonjour@^3.5.0: 1573bonjour@^3.5.0:
1323 version "3.5.0" 1574 version "3.5.0"
1324 resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" 1575 resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
1576 integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
1325 dependencies: 1577 dependencies:
1326 array-flatten "^2.1.0" 1578 array-flatten "^2.1.0"
1327 deep-equal "^1.0.1" 1579 deep-equal "^1.0.1"
@@ -1333,14 +1585,17 @@ bonjour@^3.5.0:
1333boolbase@~1.0.0: 1585boolbase@~1.0.0:
1334 version "1.0.0" 1586 version "1.0.0"
1335 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 1587 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
1588 integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
1336 1589
1337bootstrap@^4.1.3: 1590bootstrap@^4.1.3:
1338 version "4.1.3" 1591 version "4.1.3"
1339 resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz#0eb371af2c8448e8c210411d0cb824a6409a12be" 1592 resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz#0eb371af2c8448e8c210411d0cb824a6409a12be"
1593 integrity sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w==
1340 1594
1341brace-expansion@^1.1.7: 1595brace-expansion@^1.1.7:
1342 version "1.1.11" 1596 version "1.1.11"
1343 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 1597 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
1598 integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
1344 dependencies: 1599 dependencies:
1345 balanced-match "^1.0.0" 1600 balanced-match "^1.0.0"
1346 concat-map "0.0.1" 1601 concat-map "0.0.1"
@@ -1348,12 +1603,14 @@ brace-expansion@^1.1.7:
1348braces@^0.1.2: 1603braces@^0.1.2:
1349 version "0.1.5" 1604 version "0.1.5"
1350 resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" 1605 resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
1606 integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=
1351 dependencies: 1607 dependencies:
1352 expand-range "^0.1.0" 1608 expand-range "^0.1.0"
1353 1609
1354braces@^1.8.2: 1610braces@^1.8.2:
1355 version "1.8.5" 1611 version "1.8.5"
1356 resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 1612 resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
1613 integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
1357 dependencies: 1614 dependencies:
1358 expand-range "^1.8.1" 1615 expand-range "^1.8.1"
1359 preserve "^0.2.0" 1616 preserve "^0.2.0"
@@ -1362,6 +1619,7 @@ braces@^1.8.2:
1362braces@^2.3.0, braces@^2.3.1: 1619braces@^2.3.0, braces@^2.3.1:
1363 version "2.3.2" 1620 version "2.3.2"
1364 resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 1621 resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
1622 integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
1365 dependencies: 1623 dependencies:
1366 arr-flatten "^1.1.0" 1624 arr-flatten "^1.1.0"
1367 array-unique "^0.3.2" 1625 array-unique "^0.3.2"
@@ -1377,20 +1635,24 @@ braces@^2.3.0, braces@^2.3.1:
1377brorand@^1.0.1: 1635brorand@^1.0.1:
1378 version "1.1.0" 1636 version "1.1.0"
1379 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 1637 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
1638 integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
1380 1639
1381browser-process-hrtime@^0.1.2: 1640browser-process-hrtime@^0.1.2:
1382 version "0.1.2" 1641 version "0.1.3"
1383 resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" 1642 resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
1643 integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==
1384 1644
1385browser-resolve@^1.11.3: 1645browser-resolve@^1.11.3:
1386 version "1.11.3" 1646 version "1.11.3"
1387 resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" 1647 resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
1648 integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
1388 dependencies: 1649 dependencies:
1389 resolve "1.1.7" 1650 resolve "1.1.7"
1390 1651
1391browserify-aes@^1.0.0, browserify-aes@^1.0.4: 1652browserify-aes@^1.0.0, browserify-aes@^1.0.4:
1392 version "1.2.0" 1653 version "1.2.0"
1393 resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 1654 resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
1655 integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
1394 dependencies: 1656 dependencies:
1395 buffer-xor "^1.0.3" 1657 buffer-xor "^1.0.3"
1396 cipher-base "^1.0.0" 1658 cipher-base "^1.0.0"
@@ -1402,6 +1664,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4:
1402browserify-cipher@^1.0.0: 1664browserify-cipher@^1.0.0:
1403 version "1.0.1" 1665 version "1.0.1"
1404 resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 1666 resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
1667 integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
1405 dependencies: 1668 dependencies:
1406 browserify-aes "^1.0.4" 1669 browserify-aes "^1.0.4"
1407 browserify-des "^1.0.0" 1670 browserify-des "^1.0.0"
@@ -1410,6 +1673,7 @@ browserify-cipher@^1.0.0:
1410browserify-des@^1.0.0: 1673browserify-des@^1.0.0:
1411 version "1.0.2" 1674 version "1.0.2"
1412 resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 1675 resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
1676 integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
1413 dependencies: 1677 dependencies:
1414 cipher-base "^1.0.1" 1678 cipher-base "^1.0.1"
1415 des.js "^1.0.0" 1679 des.js "^1.0.0"
@@ -1419,10 +1683,12 @@ browserify-des@^1.0.0:
1419browserify-package-json@^1.0.0: 1683browserify-package-json@^1.0.0:
1420 version "1.0.1" 1684 version "1.0.1"
1421 resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea" 1685 resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea"
1686 integrity sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=
1422 1687
1423browserify-rsa@^4.0.0: 1688browserify-rsa@^4.0.0:
1424 version "4.0.1" 1689 version "4.0.1"
1425 resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 1690 resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
1691 integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
1426 dependencies: 1692 dependencies:
1427 bn.js "^4.1.0" 1693 bn.js "^4.1.0"
1428 randombytes "^2.0.1" 1694 randombytes "^2.0.1"
@@ -1430,6 +1696,7 @@ browserify-rsa@^4.0.0:
1430browserify-sign@^4.0.0: 1696browserify-sign@^4.0.0:
1431 version "4.0.4" 1697 version "4.0.4"
1432 resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 1698 resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
1699 integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
1433 dependencies: 1700 dependencies:
1434 bn.js "^4.1.1" 1701 bn.js "^4.1.1"
1435 browserify-rsa "^4.0.0" 1702 browserify-rsa "^4.0.0"
@@ -1442,41 +1709,49 @@ browserify-sign@^4.0.0:
1442browserify-zlib@^0.2.0: 1709browserify-zlib@^0.2.0:
1443 version "0.2.0" 1710 version "0.2.0"
1444 resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 1711 resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
1712 integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
1445 dependencies: 1713 dependencies:
1446 pako "~1.0.5" 1714 pako "~1.0.5"
1447 1715
1448browserslist@^3.2.8: 1716browserslist@^4.4.1:
1449 version "3.2.8" 1717 version "4.4.1"
1450 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" 1718 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062"
1719 integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==
1451 dependencies: 1720 dependencies:
1452 caniuse-lite "^1.0.30000844" 1721 caniuse-lite "^1.0.30000929"
1453 electron-to-chromium "^1.3.47" 1722 electron-to-chromium "^1.3.103"
1723 node-releases "^1.1.3"
1454 1724
1455browserstack@^1.5.1: 1725browserstack@^1.5.1:
1456 version "1.5.1" 1726 version "1.5.1"
1457 resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.1.tgz#e2dfa66ffee940ebad0a07f7e00fd4687c455d66" 1727 resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.1.tgz#e2dfa66ffee940ebad0a07f7e00fd4687c455d66"
1728 integrity sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==
1458 dependencies: 1729 dependencies:
1459 https-proxy-agent "^2.2.1" 1730 https-proxy-agent "^2.2.1"
1460 1731
1461bs-logger@0.x: 1732bs-logger@0.x:
1462 version "0.2.5" 1733 version "0.2.6"
1463 resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.5.tgz#1d82f0cf88864e1341cd9262237f8d0748a49b22" 1734 resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
1735 integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
1464 dependencies: 1736 dependencies:
1465 fast-json-stable-stringify "^2.0.0" 1737 fast-json-stable-stringify "2.x"
1466 1738
1467bser@^2.0.0: 1739bser@^2.0.0:
1468 version "2.0.0" 1740 version "2.0.0"
1469 resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" 1741 resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
1742 integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=
1470 dependencies: 1743 dependencies:
1471 node-int64 "^0.4.0" 1744 node-int64 "^0.4.0"
1472 1745
1473buffer-alloc-unsafe@^1.1.0: 1746buffer-alloc-unsafe@^1.1.0:
1474 version "1.1.0" 1747 version "1.1.0"
1475 resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 1748 resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
1749 integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
1476 1750
1477buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: 1751buffer-alloc@^1.1.0, buffer-alloc@^1.2.0:
1478 version "1.2.0" 1752 version "1.2.0"
1479 resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 1753 resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
1754 integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
1480 dependencies: 1755 dependencies:
1481 buffer-alloc-unsafe "^1.1.0" 1756 buffer-alloc-unsafe "^1.1.0"
1482 buffer-fill "^1.0.0" 1757 buffer-fill "^1.0.0"
@@ -1484,26 +1759,32 @@ buffer-alloc@^1.1.0, buffer-alloc@^1.2.0:
1484buffer-equals@^1.0.3, buffer-equals@^1.0.4: 1759buffer-equals@^1.0.3, buffer-equals@^1.0.4:
1485 version "1.0.4" 1760 version "1.0.4"
1486 resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" 1761 resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5"
1762 integrity sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=
1487 1763
1488buffer-fill@^1.0.0: 1764buffer-fill@^1.0.0:
1489 version "1.0.0" 1765 version "1.0.0"
1490 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 1766 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
1767 integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
1491 1768
1492buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.0: 1769buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.0:
1493 version "1.1.1" 1770 version "1.1.1"
1494 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 1771 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
1772 integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
1495 1773
1496buffer-indexof@^1.0.0: 1774buffer-indexof@^1.0.0:
1497 version "1.1.1" 1775 version "1.1.1"
1498 resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" 1776 resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
1777 integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
1499 1778
1500buffer-xor@^1.0.3: 1779buffer-xor@^1.0.3:
1501 version "1.0.3" 1780 version "1.0.3"
1502 resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 1781 resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
1782 integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
1503 1783
1504buffer@^4.3.0: 1784buffer@^4.3.0:
1505 version "4.9.1" 1785 version "4.9.1"
1506 resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 1786 resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
1787 integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
1507 dependencies: 1788 dependencies:
1508 base64-js "^1.0.2" 1789 base64-js "^1.0.2"
1509 ieee754 "^1.1.4" 1790 ieee754 "^1.1.4"
@@ -1512,6 +1793,7 @@ buffer@^4.3.0:
1512buffer@^5.1.0: 1793buffer@^5.1.0:
1513 version "5.2.1" 1794 version "5.2.1"
1514 resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" 1795 resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
1796 integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==
1515 dependencies: 1797 dependencies:
1516 base64-js "^1.0.2" 1798 base64-js "^1.0.2"
1517 ieee754 "^1.1.4" 1799 ieee754 "^1.1.4"
@@ -1519,28 +1801,34 @@ buffer@^5.1.0:
1519bufferutil@^4.0.0: 1801bufferutil@^4.0.0:
1520 version "4.0.0" 1802 version "4.0.0"
1521 resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.0.tgz#a5078160e443751a4e83b6f4d6d7e26c058326a0" 1803 resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.0.tgz#a5078160e443751a4e83b6f4d6d7e26c058326a0"
1804 integrity sha512-jpnqMVLo7sqfUY2W92RC4jjj9TuiOSkjB0k43TxPcrBSntZwXUOl8Krfd3eVEdApuScpSTwYKntm/dXU2T8gnw==
1522 dependencies: 1805 dependencies:
1523 node-gyp-build "~3.4.0" 1806 node-gyp-build "~3.4.0"
1524 1807
1525builtin-modules@^1.0.0, builtin-modules@^1.1.1: 1808builtin-modules@^1.0.0, builtin-modules@^1.1.1:
1526 version "1.1.1" 1809 version "1.1.1"
1527 resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 1810 resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
1811 integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
1528 1812
1529builtin-status-codes@^3.0.0: 1813builtin-status-codes@^3.0.0:
1530 version "3.0.0" 1814 version "3.0.0"
1531 resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 1815 resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
1816 integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
1532 1817
1533builtins@^1.0.3: 1818builtins@^1.0.3:
1534 version "1.0.3" 1819 version "1.0.3"
1535 resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" 1820 resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
1821 integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
1536 1822
1537bytes@3.0.0: 1823bytes@3.0.0:
1538 version "3.0.0" 1824 version "3.0.0"
1539 resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 1825 resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
1826 integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
1540 1827
1541cacache@^10.0.4: 1828cacache@^10.0.4:
1542 version "10.0.4" 1829 version "10.0.4"
1543 resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" 1830 resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
1831 integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
1544 dependencies: 1832 dependencies:
1545 bluebird "^3.5.1" 1833 bluebird "^3.5.1"
1546 chownr "^1.0.1" 1834 chownr "^1.0.1"
@@ -1556,9 +1844,10 @@ cacache@^10.0.4:
1556 unique-filename "^1.1.0" 1844 unique-filename "^1.1.0"
1557 y18n "^4.0.0" 1845 y18n "^4.0.0"
1558 1846
1559cacache@^11.0.2: 1847cacache@^11.0.1, cacache@^11.0.2:
1560 version "11.2.0" 1848 version "11.3.1"
1561 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" 1849 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f"
1850 integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==
1562 dependencies: 1851 dependencies:
1563 bluebird "^3.5.1" 1852 bluebird "^3.5.1"
1564 chownr "^1.0.1" 1853 chownr "^1.0.1"
@@ -1575,9 +1864,30 @@ cacache@^11.0.2:
1575 unique-filename "^1.1.0" 1864 unique-filename "^1.1.0"
1576 y18n "^4.0.0" 1865 y18n "^4.0.0"
1577 1866
1867cacache@^11.3.2:
1868 version "11.3.2"
1869 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
1870 integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
1871 dependencies:
1872 bluebird "^3.5.3"
1873 chownr "^1.1.1"
1874 figgy-pudding "^3.5.1"
1875 glob "^7.1.3"
1876 graceful-fs "^4.1.15"
1877 lru-cache "^5.1.1"
1878 mississippi "^3.0.0"
1879 mkdirp "^0.5.1"
1880 move-concurrently "^1.0.1"
1881 promise-inflight "^1.0.1"
1882 rimraf "^2.6.2"
1883 ssri "^6.0.1"
1884 unique-filename "^1.1.1"
1885 y18n "^4.0.0"
1886
1578cache-base@^1.0.1: 1887cache-base@^1.0.1:
1579 version "1.0.1" 1888 version "1.0.1"
1580 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 1889 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
1890 integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
1581 dependencies: 1891 dependencies:
1582 collection-visit "^1.0.0" 1892 collection-visit "^1.0.0"
1583 component-emitter "^1.2.1" 1893 component-emitter "^1.2.1"
@@ -1592,20 +1902,24 @@ cache-base@^1.0.1:
1592cache-chunk-store@^3.0.0: 1902cache-chunk-store@^3.0.0:
1593 version "3.0.0" 1903 version "3.0.0"
1594 resolved "https://registry.yarnpkg.com/cache-chunk-store/-/cache-chunk-store-3.0.0.tgz#49e28823ba4c2b2f8595e7dfa27d73b87939ee5c" 1904 resolved "https://registry.yarnpkg.com/cache-chunk-store/-/cache-chunk-store-3.0.0.tgz#49e28823ba4c2b2f8595e7dfa27d73b87939ee5c"
1905 integrity sha512-QNFKTFZo9LJGCZITlXDV44xe4N7AWjZwpbU4YTVAa0ShvKLhn7A/8uaQcZuY33b5lrMIPTLbGmd8uTebzH5T/A==
1595 dependencies: 1906 dependencies:
1596 lru "^3.1.0" 1907 lru "^3.1.0"
1597 1908
1598callsite@1.0.0: 1909callsite@1.0.0:
1599 version "1.0.0" 1910 version "1.0.0"
1600 resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 1911 resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
1912 integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
1601 1913
1602callsites@^2.0.0: 1914callsites@^2.0.0:
1603 version "2.0.0" 1915 version "2.0.0"
1604 resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 1916 resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
1917 integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
1605 1918
1606camel-case@3.0.x: 1919camel-case@3.0.x:
1607 version "3.0.0" 1920 version "3.0.0"
1608 resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" 1921 resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
1922 integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
1609 dependencies: 1923 dependencies:
1610 no-case "^2.2.0" 1924 no-case "^2.2.0"
1611 upper-case "^1.1.1" 1925 upper-case "^1.1.1"
@@ -1613,6 +1927,7 @@ camel-case@3.0.x:
1613camelcase-keys@^2.0.0: 1927camelcase-keys@^2.0.0:
1614 version "2.1.0" 1928 version "2.1.0"
1615 resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 1929 resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
1930 integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
1616 dependencies: 1931 dependencies:
1617 camelcase "^2.0.0" 1932 camelcase "^2.0.0"
1618 map-obj "^1.0.0" 1933 map-obj "^1.0.0"
@@ -1620,32 +1935,49 @@ camelcase-keys@^2.0.0:
1620camelcase@^2.0.0: 1935camelcase@^2.0.0:
1621 version "2.1.1" 1936 version "2.1.1"
1622 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 1937 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
1938 integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
1623 1939
1624camelcase@^3.0.0: 1940camelcase@^3.0.0:
1625 version "3.0.0" 1941 version "3.0.0"
1626 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 1942 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
1943 integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
1627 1944
1628camelcase@^4.1.0: 1945camelcase@^4.1.0:
1629 version "4.1.0" 1946 version "4.1.0"
1630 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 1947 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
1948 integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
1949
1950camelcase@^5.0.0:
1951 version "5.0.0"
1952 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
1953 integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
1954
1955caniuse-lite@^1.0.30000929:
1956 version "1.0.30000935"
1957 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59"
1958 integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==
1631 1959
1632caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: 1960canonical-path@1.0.0:
1633 version "1.0.30000885" 1961 version "1.0.0"
1634 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" 1962 resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d"
1963 integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==
1635 1964
1636capture-exit@^1.2.0: 1965capture-exit@^1.2.0:
1637 version "1.2.0" 1966 version "1.2.0"
1638 resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" 1967 resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f"
1968 integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=
1639 dependencies: 1969 dependencies:
1640 rsvp "^3.3.3" 1970 rsvp "^3.3.3"
1641 1971
1642caseless@~0.12.0: 1972caseless@~0.12.0:
1643 version "0.12.0" 1973 version "0.12.0"
1644 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 1974 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
1975 integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
1645 1976
1646chalk@^1.1.1, chalk@^1.1.3: 1977chalk@^1.1.1, chalk@^1.1.3:
1647 version "1.1.3" 1978 version "1.1.3"
1648 resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 1979 resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
1980 integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
1649 dependencies: 1981 dependencies:
1650 ansi-styles "^2.2.1" 1982 ansi-styles "^2.2.1"
1651 escape-string-regexp "^1.0.2" 1983 escape-string-regexp "^1.0.2"
@@ -1656,6 +1988,16 @@ chalk@^1.1.1, chalk@^1.1.3:
1656chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: 1988chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
1657 version "2.4.1" 1989 version "2.4.1"
1658 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 1990 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
1991 integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
1992 dependencies:
1993 ansi-styles "^3.2.1"
1994 escape-string-regexp "^1.0.5"
1995 supports-color "^5.3.0"
1996
1997chalk@^2.4.2:
1998 version "2.4.2"
1999 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
2000 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
1659 dependencies: 2001 dependencies:
1660 ansi-styles "^3.2.1" 2002 ansi-styles "^3.2.1"
1661 escape-string-regexp "^1.0.5" 2003 escape-string-regexp "^1.0.5"
@@ -1664,29 +2006,17 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
1664chardet@^0.7.0: 2006chardet@^0.7.0:
1665 version "0.7.0" 2007 version "0.7.0"
1666 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 2008 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
2009 integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
1667 2010
1668check-types@^7.3.0: 2011check-types@^7.3.0:
1669 version "7.4.0" 2012 version "7.4.0"
1670 resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" 2013 resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
2014 integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==
1671 2015
1672chokidar@^1.4.2: 2016chokidar@2.0.4, chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3:
1673 version "1.7.0"
1674 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
1675 dependencies:
1676 anymatch "^1.3.0"
1677 async-each "^1.0.0"
1678 glob-parent "^2.0.0"
1679 inherits "^2.0.1"
1680 is-binary-path "^1.0.0"
1681 is-glob "^2.0.0"
1682 path-is-absolute "^1.0.0"
1683 readdirp "^2.0.0"
1684 optionalDependencies:
1685 fsevents "^1.0.0"
1686
1687chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3:
1688 version "2.0.4" 2017 version "2.0.4"
1689 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 2018 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
2019 integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==
1690 dependencies: 2020 dependencies:
1691 anymatch "^2.0.0" 2021 anymatch "^2.0.0"
1692 async-each "^1.0.0" 2022 async-each "^1.0.0"
@@ -1703,19 +2033,38 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3:
1703 optionalDependencies: 2033 optionalDependencies:
1704 fsevents "^1.2.2" 2034 fsevents "^1.2.2"
1705 2035
1706chownr@^1.0.1: 2036chokidar@^1.4.2:
2037 version "1.7.0"
2038 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
2039 integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=
2040 dependencies:
2041 anymatch "^1.3.0"
2042 async-each "^1.0.0"
2043 glob-parent "^2.0.0"
2044 inherits "^2.0.1"
2045 is-binary-path "^1.0.0"
2046 is-glob "^2.0.0"
2047 path-is-absolute "^1.0.0"
2048 readdirp "^2.0.0"
2049 optionalDependencies:
2050 fsevents "^1.0.0"
2051
2052chownr@^1.0.1, chownr@^1.1.1:
1707 version "1.1.1" 2053 version "1.1.1"
1708 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 2054 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
2055 integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
1709 2056
1710chrome-trace-event@^1.0.0: 2057chrome-trace-event@^1.0.0:
1711 version "1.0.0" 2058 version "1.0.0"
1712 resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" 2059 resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
2060 integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==
1713 dependencies: 2061 dependencies:
1714 tslib "^1.9.0" 2062 tslib "^1.9.0"
1715 2063
1716chunk-store-stream@^3.0.1: 2064chunk-store-stream@^3.0.1:
1717 version "3.0.1" 2065 version "3.0.1"
1718 resolved "https://registry.yarnpkg.com/chunk-store-stream/-/chunk-store-stream-3.0.1.tgz#8e0d739226dcb386f44447b82a005b597a1d41d9" 2066 resolved "https://registry.yarnpkg.com/chunk-store-stream/-/chunk-store-stream-3.0.1.tgz#8e0d739226dcb386f44447b82a005b597a1d41d9"
2067 integrity sha512-GA1NIFDZKElhkjiO6QOyzfK1QbUt6M3gFhUU/aR05JYaDqXbU5d7U92cLvGKdItJEDfojky6NQefy5VL5PpDBA==
1719 dependencies: 2068 dependencies:
1720 block-stream2 "^1.0.0" 2069 block-stream2 "^1.0.0"
1721 readable-stream "^2.0.5" 2070 readable-stream "^2.0.5"
@@ -1723,50 +2072,59 @@ chunk-store-stream@^3.0.1:
1723ci-info@^1.5.0: 2072ci-info@^1.5.0:
1724 version "1.6.0" 2073 version "1.6.0"
1725 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 2074 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
2075 integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
1726 2076
1727cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 2077cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
1728 version "1.0.4" 2078 version "1.0.4"
1729 resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 2079 resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
2080 integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
1730 dependencies: 2081 dependencies:
1731 inherits "^2.0.1" 2082 inherits "^2.0.1"
1732 safe-buffer "^5.0.1" 2083 safe-buffer "^5.0.1"
1733 2084
1734circular-dependency-plugin@^5.0.2: 2085circular-dependency-plugin@5.0.2:
1735 version "5.0.2" 2086 version "5.0.2"
1736 resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef" 2087 resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef"
2088 integrity sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==
1737 2089
1738circular-json@^0.5.5: 2090circular-json@^0.5.5:
1739 version "0.5.7" 2091 version "0.5.9"
1740 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.7.tgz#b8be478d72ea58c7eeda26bf1cf1fba43d188842" 2092 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d"
2093 integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==
1741 2094
1742class-utils@^0.3.5: 2095class-utils@^0.3.5:
1743 version "0.3.6" 2096 version "0.3.6"
1744 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 2097 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
2098 integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
1745 dependencies: 2099 dependencies:
1746 arr-union "^3.1.0" 2100 arr-union "^3.1.0"
1747 define-property "^0.2.5" 2101 define-property "^0.2.5"
1748 isobject "^3.0.0" 2102 isobject "^3.0.0"
1749 static-extend "^0.1.1" 2103 static-extend "^0.1.1"
1750 2104
1751clean-css@4.2.x, clean-css@^4.0.12, clean-css@^4.1.11: 2105clean-css@4.2.1, clean-css@4.2.x, clean-css@^4.0.12:
1752 version "4.2.1" 2106 version "4.2.1"
1753 resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" 2107 resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
2108 integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
1754 dependencies: 2109 dependencies:
1755 source-map "~0.6.0" 2110 source-map "~0.6.0"
1756 2111
1757cli-cursor@^2.1.0: 2112cli-cursor@^2.1.0:
1758 version "2.1.0" 2113 version "2.1.0"
1759 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 2114 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
2115 integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
1760 dependencies: 2116 dependencies:
1761 restore-cursor "^2.0.0" 2117 restore-cursor "^2.0.0"
1762 2118
1763cli-width@^2.0.0: 2119cli-width@^2.0.0:
1764 version "2.2.0" 2120 version "2.2.0"
1765 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 2121 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
2122 integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
1766 2123
1767cliui@^3.2.0: 2124cliui@^3.2.0:
1768 version "3.2.0" 2125 version "3.2.0"
1769 resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 2126 resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
2127 integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
1770 dependencies: 2128 dependencies:
1771 string-width "^1.0.1" 2129 string-width "^1.0.1"
1772 strip-ansi "^3.0.1" 2130 strip-ansi "^3.0.1"
@@ -1775,6 +2133,7 @@ cliui@^3.2.0:
1775cliui@^4.0.0: 2133cliui@^4.0.0:
1776 version "4.1.0" 2134 version "4.1.0"
1777 resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 2135 resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
2136 integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
1778 dependencies: 2137 dependencies:
1779 string-width "^2.1.1" 2138 string-width "^2.1.1"
1780 strip-ansi "^4.0.0" 2139 strip-ansi "^4.0.0"
@@ -1783,6 +2142,7 @@ cliui@^4.0.0:
1783clone-deep@^2.0.1: 2142clone-deep@^2.0.1:
1784 version "2.0.2" 2143 version "2.0.2"
1785 resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" 2144 resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
2145 integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
1786 dependencies: 2146 dependencies:
1787 for-own "^1.0.0" 2147 for-own "^1.0.0"
1788 is-plain-object "^2.0.4" 2148 is-plain-object "^2.0.4"
@@ -1792,26 +2152,32 @@ clone-deep@^2.0.1:
1792clone@^2.1.1, clone@^2.1.2: 2152clone@^2.1.1, clone@^2.1.2:
1793 version "2.1.2" 2153 version "2.1.2"
1794 resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" 2154 resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
2155 integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
1795 2156
1796closest-file-data@^0.1.4: 2157closest-file-data@^0.1.4:
1797 version "0.1.4" 2158 version "0.1.4"
1798 resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a" 2159 resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a"
2160 integrity sha1-l1+HwTLymdJKA3W59jyj+4j3Kzo=
1799 2161
1800closest-to@~2.0.0: 2162closest-to@~2.0.0:
1801 version "2.0.0" 2163 version "2.0.0"
1802 resolved "https://registry.yarnpkg.com/closest-to/-/closest-to-2.0.0.tgz#bb2a860edb7769b62d04821748ae50da24dbefaa" 2164 resolved "https://registry.yarnpkg.com/closest-to/-/closest-to-2.0.0.tgz#bb2a860edb7769b62d04821748ae50da24dbefaa"
2165 integrity sha1-uyqGDtt3abYtBIIXSK5Q2iTb76o=
1803 2166
1804co@^4.6.0: 2167co@^4.6.0:
1805 version "4.6.0" 2168 version "4.6.0"
1806 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 2169 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
2170 integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
1807 2171
1808code-point-at@^1.0.0: 2172code-point-at@^1.0.0:
1809 version "1.1.0" 2173 version "1.1.0"
1810 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 2174 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
2175 integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
1811 2176
1812codelyzer@^4.4.4: 2177codelyzer@^4.4.4:
1813 version "4.4.4" 2178 version "4.5.0"
1814 resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.4.4.tgz#29b7dbb51ba9ecc45c7300d61280a6564765d402" 2179 resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.5.0.tgz#a65ddeeeca2894653253a89bfa229118ff9f59b1"
2180 integrity sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==
1815 dependencies: 2181 dependencies:
1816 app-root-path "^2.1.0" 2182 app-root-path "^2.1.0"
1817 css-selector-tokenizer "^0.7.0" 2183 css-selector-tokenizer "^0.7.0"
@@ -1823,6 +2189,7 @@ codelyzer@^4.4.4:
1823collection-visit@^1.0.0: 2189collection-visit@^1.0.0:
1824 version "1.0.0" 2190 version "1.0.0"
1825 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 2191 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
2192 integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
1826 dependencies: 2193 dependencies:
1827 map-visit "^1.0.0" 2194 map-visit "^1.0.0"
1828 object-visit "^1.0.0" 2195 object-visit "^1.0.0"
@@ -1830,86 +2197,92 @@ collection-visit@^1.0.0:
1830color-convert@^1.9.0: 2197color-convert@^1.9.0:
1831 version "1.9.3" 2198 version "1.9.3"
1832 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 2199 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
2200 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1833 dependencies: 2201 dependencies:
1834 color-name "1.1.3" 2202 color-name "1.1.3"
1835 2203
1836color-name@1.1.3: 2204color-name@1.1.3:
1837 version "1.1.3" 2205 version "1.1.3"
1838 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 2206 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
2207 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1839 2208
1840colors@*, colors@^1.1.0: 2209colors@*, colors@^1.1.0:
1841 version "1.3.2" 2210 version "1.3.2"
1842 resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" 2211 resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b"
2212 integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==
1843 2213
1844colors@1.1.2: 2214colors@1.1.2:
1845 version "1.1.2" 2215 version "1.1.2"
1846 resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 2216 resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
2217 integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
1847 2218
1848combine-lists@^1.0.0: 2219combine-lists@^1.0.0:
1849 version "1.0.1" 2220 version "1.0.1"
1850 resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" 2221 resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
2222 integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=
1851 dependencies: 2223 dependencies:
1852 lodash "^4.5.0" 2224 lodash "^4.5.0"
1853 2225
1854combined-stream@1.0.6: 2226combined-stream@^1.0.6, combined-stream@~1.0.6:
1855 version "1.0.6"
1856 resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
1857 dependencies:
1858 delayed-stream "~1.0.0"
1859
1860combined-stream@~1.0.5, combined-stream@~1.0.6:
1861 version "1.0.7" 2227 version "1.0.7"
1862 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 2228 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
2229 integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
1863 dependencies: 2230 dependencies:
1864 delayed-stream "~1.0.0" 2231 delayed-stream "~1.0.0"
1865 2232
1866commander@2.17.x, commander@~2.17.1: 2233commander@2.17.x, commander@~2.17.1:
1867 version "2.17.1" 2234 version "2.17.1"
1868 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" 2235 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
2236 integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
1869 2237
1870commander@^2.12.1, commander@^2.18.0, commander@^2.9.0: 2238commander@^2.12.1, commander@^2.18.0, commander@^2.9.0:
1871 version "2.18.0" 2239 version "2.19.0"
1872 resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" 2240 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
1873 2241 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
1874commander@~2.13.0:
1875 version "2.13.0"
1876 resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
1877 2242
1878commondir@^1.0.1: 2243commondir@^1.0.1:
1879 version "1.0.1" 2244 version "1.0.1"
1880 resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 2245 resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
2246 integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
1881 2247
1882compact2string@^1.2.0: 2248compact2string@^1.2.0:
1883 version "1.4.0" 2249 version "1.4.0"
1884 resolved "https://registry.yarnpkg.com/compact2string/-/compact2string-1.4.0.tgz#a99cd96ea000525684b269683ae2222d6eea7b49" 2250 resolved "https://registry.yarnpkg.com/compact2string/-/compact2string-1.4.0.tgz#a99cd96ea000525684b269683ae2222d6eea7b49"
2251 integrity sha1-qZzZbqAAUlaEsmloOuIiLW7qe0k=
1885 dependencies: 2252 dependencies:
1886 ipaddr.js ">= 0.1.5" 2253 ipaddr.js ">= 0.1.5"
1887 2254
1888compare-versions@^3.2.1: 2255compare-versions@^3.2.1:
1889 version "3.4.0" 2256 version "3.4.0"
1890 resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" 2257 resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26"
2258 integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==
1891 2259
1892component-bind@1.0.0: 2260component-bind@1.0.0:
1893 version "1.0.0" 2261 version "1.0.0"
1894 resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 2262 resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
2263 integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
1895 2264
1896component-emitter@1.2.1, component-emitter@^1.2.1: 2265component-emitter@1.2.1, component-emitter@^1.2.1:
1897 version "1.2.1" 2266 version "1.2.1"
1898 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 2267 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
2268 integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
1899 2269
1900component-inherit@0.0.3: 2270component-inherit@0.0.3:
1901 version "0.0.3" 2271 version "0.0.3"
1902 resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 2272 resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
2273 integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
1903 2274
1904compressible@~2.0.14: 2275compressible@~2.0.14:
1905 version "2.0.15" 2276 version "2.0.15"
1906 resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" 2277 resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212"
2278 integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==
1907 dependencies: 2279 dependencies:
1908 mime-db ">= 1.36.0 < 2" 2280 mime-db ">= 1.36.0 < 2"
1909 2281
1910compression@^1.5.2: 2282compression@^1.5.2:
1911 version "1.7.3" 2283 version "1.7.3"
1912 resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" 2284 resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
2285 integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==
1913 dependencies: 2286 dependencies:
1914 accepts "~1.3.5" 2287 accepts "~1.3.5"
1915 bytes "3.0.0" 2288 bytes "3.0.0"
@@ -1922,10 +2295,12 @@ compression@^1.5.2:
1922concat-map@0.0.1: 2295concat-map@0.0.1:
1923 version "0.0.1" 2296 version "0.0.1"
1924 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 2297 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
2298 integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
1925 2299
1926concat-stream@^1.5.0, concat-stream@^1.5.2: 2300concat-stream@^1.5.0:
1927 version "1.6.2" 2301 version "1.6.2"
1928 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 2302 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
2303 integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
1929 dependencies: 2304 dependencies:
1930 buffer-from "^1.0.0" 2305 buffer-from "^1.0.0"
1931 inherits "^2.0.3" 2306 inherits "^2.0.3"
@@ -1935,10 +2310,12 @@ concat-stream@^1.5.0, concat-stream@^1.5.2:
1935connect-history-api-fallback@^1.3.0: 2310connect-history-api-fallback@^1.3.0:
1936 version "1.5.0" 2311 version "1.5.0"
1937 resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" 2312 resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
2313 integrity sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=
1938 2314
1939connect@^3.6.0: 2315connect@^3.6.0:
1940 version "3.6.6" 2316 version "3.6.6"
1941 resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" 2317 resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
2318 integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=
1942 dependencies: 2319 dependencies:
1943 debug "2.6.9" 2320 debug "2.6.9"
1944 finalhandler "1.1.0" 2321 finalhandler "1.1.0"
@@ -1948,46 +2325,56 @@ connect@^3.6.0:
1948console-browserify@^1.1.0: 2325console-browserify@^1.1.0:
1949 version "1.1.0" 2326 version "1.1.0"
1950 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 2327 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
2328 integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
1951 dependencies: 2329 dependencies:
1952 date-now "^0.1.4" 2330 date-now "^0.1.4"
1953 2331
1954console-control-strings@^1.0.0, console-control-strings@~1.1.0: 2332console-control-strings@^1.0.0, console-control-strings@~1.1.0:
1955 version "1.1.0" 2333 version "1.1.0"
1956 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 2334 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
2335 integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
1957 2336
1958constants-browserify@^1.0.0: 2337constants-browserify@^1.0.0:
1959 version "1.0.0" 2338 version "1.0.0"
1960 resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 2339 resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
2340 integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
1961 2341
1962content-disposition@0.5.2: 2342content-disposition@0.5.2:
1963 version "0.5.2" 2343 version "0.5.2"
1964 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 2344 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
2345 integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=
1965 2346
1966content-type@~1.0.4: 2347content-type@~1.0.4:
1967 version "1.0.4" 2348 version "1.0.4"
1968 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 2349 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
2350 integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
1969 2351
1970convert-source-map@^0.3.3: 2352convert-source-map@^0.3.3:
1971 version "0.3.5" 2353 version "0.3.5"
1972 resolved "http://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" 2354 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
2355 integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA=
1973 2356
1974convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: 2357convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
1975 version "1.6.0" 2358 version "1.6.0"
1976 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" 2359 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
2360 integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
1977 dependencies: 2361 dependencies:
1978 safe-buffer "~5.1.1" 2362 safe-buffer "~5.1.1"
1979 2363
1980cookie-signature@1.0.6: 2364cookie-signature@1.0.6:
1981 version "1.0.6" 2365 version "1.0.6"
1982 resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 2366 resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
2367 integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
1983 2368
1984cookie@0.3.1: 2369cookie@0.3.1:
1985 version "0.3.1" 2370 version "0.3.1"
1986 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 2371 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
2372 integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
1987 2373
1988copy-concurrently@^1.0.0: 2374copy-concurrently@^1.0.0:
1989 version "1.0.5" 2375 version "1.0.5"
1990 resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 2376 resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
2377 integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
1991 dependencies: 2378 dependencies:
1992 aproba "^1.1.1" 2379 aproba "^1.1.1"
1993 fs-write-stream-atomic "^1.0.8" 2380 fs-write-stream-atomic "^1.0.8"
@@ -1999,10 +2386,12 @@ copy-concurrently@^1.0.0:
1999copy-descriptor@^0.1.0: 2386copy-descriptor@^0.1.0:
2000 version "0.1.1" 2387 version "0.1.1"
2001 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 2388 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
2389 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
2002 2390
2003copy-webpack-plugin@^4.5.2: 2391copy-webpack-plugin@4.6.0:
2004 version "4.5.2" 2392 version "4.6.0"
2005 resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" 2393 resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
2394 integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
2006 dependencies: 2395 dependencies:
2007 cacache "^10.0.4" 2396 cacache "^10.0.4"
2008 find-cache-dir "^1.0.0" 2397 find-cache-dir "^1.0.0"
@@ -2016,18 +2405,22 @@ copy-webpack-plugin@^4.5.2:
2016core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: 2405core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
2017 version "2.5.7" 2406 version "2.5.7"
2018 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" 2407 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
2408 integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
2019 2409
2020core-js@~2.3.0: 2410core-js@~2.3.0:
2021 version "2.3.0" 2411 version "2.3.0"
2022 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" 2412 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65"
2413 integrity sha1-+rg/uwstjchfpjbEudNMdUIMbWU=
2023 2414
2024core-util-is@1.0.2, core-util-is@~1.0.0: 2415core-util-is@1.0.2, core-util-is@~1.0.0:
2025 version "1.0.2" 2416 version "1.0.2"
2026 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 2417 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
2418 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
2027 2419
2028cosmiconfig@^4.0.0: 2420cosmiconfig@^4.0.0:
2029 version "4.0.0" 2421 version "4.0.0"
2030 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" 2422 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
2423 integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==
2031 dependencies: 2424 dependencies:
2032 is-directory "^0.3.1" 2425 is-directory "^0.3.1"
2033 js-yaml "^3.9.0" 2426 js-yaml "^3.9.0"
@@ -2037,13 +2430,15 @@ cosmiconfig@^4.0.0:
2037create-ecdh@^4.0.0: 2430create-ecdh@^4.0.0:
2038 version "4.0.3" 2431 version "4.0.3"
2039 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" 2432 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
2433 integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
2040 dependencies: 2434 dependencies:
2041 bn.js "^4.1.0" 2435 bn.js "^4.1.0"
2042 elliptic "^6.0.0" 2436 elliptic "^6.0.0"
2043 2437
2044create-hash@^1.1.0, create-hash@^1.1.2: 2438create-hash@^1.1.0, create-hash@^1.1.2:
2045 version "1.2.0" 2439 version "1.2.0"
2046 resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 2440 resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
2441 integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
2047 dependencies: 2442 dependencies:
2048 cipher-base "^1.0.1" 2443 cipher-base "^1.0.1"
2049 inherits "^2.0.1" 2444 inherits "^2.0.1"
@@ -2053,7 +2448,8 @@ create-hash@^1.1.0, create-hash@^1.1.2:
2053 2448
2054create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 2449create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
2055 version "1.1.7" 2450 version "1.1.7"
2056 resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 2451 resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
2452 integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
2057 dependencies: 2453 dependencies:
2058 cipher-base "^1.0.3" 2454 cipher-base "^1.0.3"
2059 create-hash "^1.1.0" 2455 create-hash "^1.1.0"
@@ -2065,6 +2461,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
2065create-torrent@^3.33.0: 2461create-torrent@^3.33.0:
2066 version "3.33.0" 2462 version "3.33.0"
2067 resolved "https://registry.yarnpkg.com/create-torrent/-/create-torrent-3.33.0.tgz#8a7a2aa2213a799c266c40e4c12f1468ede25105" 2463 resolved "https://registry.yarnpkg.com/create-torrent/-/create-torrent-3.33.0.tgz#8a7a2aa2213a799c266c40e4c12f1468ede25105"
2464 integrity sha512-KMd0KuvwVUg1grlRd5skG9ZkSbBYDDkAjDUMLnvxdRn0rL7ph3IwoOk7I8u1yLX4HYjGiLVlWYO55YWNNPjJFA==
2068 dependencies: 2465 dependencies:
2069 bencode "^2.0.0" 2466 bencode "^2.0.0"
2070 block-stream2 "^1.0.0" 2467 block-stream2 "^1.0.0"
@@ -2083,6 +2480,7 @@ create-torrent@^3.33.0:
2083cross-spawn@^3.0.0: 2480cross-spawn@^3.0.0:
2084 version "3.0.1" 2481 version "3.0.1"
2085 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" 2482 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
2483 integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
2086 dependencies: 2484 dependencies:
2087 lru-cache "^4.0.1" 2485 lru-cache "^4.0.1"
2088 which "^1.2.9" 2486 which "^1.2.9"
@@ -2090,6 +2488,7 @@ cross-spawn@^3.0.0:
2090cross-spawn@^5.0.1: 2488cross-spawn@^5.0.1:
2091 version "5.1.0" 2489 version "5.1.0"
2092 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 2490 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
2491 integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
2093 dependencies: 2492 dependencies:
2094 lru-cache "^4.0.1" 2493 lru-cache "^4.0.1"
2095 shebang-command "^1.2.0" 2494 shebang-command "^1.2.0"
@@ -2098,6 +2497,7 @@ cross-spawn@^5.0.1:
2098cross-spawn@^6.0.0, cross-spawn@^6.0.5: 2497cross-spawn@^6.0.0, cross-spawn@^6.0.5:
2099 version "6.0.5" 2498 version "6.0.5"
2100 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 2499 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
2500 integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
2101 dependencies: 2501 dependencies:
2102 nice-try "^1.0.4" 2502 nice-try "^1.0.4"
2103 path-key "^2.0.1" 2503 path-key "^2.0.1"
@@ -2108,6 +2508,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
2108crypto-browserify@^3.11.0: 2508crypto-browserify@^3.11.0:
2109 version "3.12.0" 2509 version "3.12.0"
2110 resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 2510 resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
2511 integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
2111 dependencies: 2512 dependencies:
2112 browserify-cipher "^1.0.0" 2513 browserify-cipher "^1.0.0"
2113 browserify-sign "^4.0.0" 2514 browserify-sign "^4.0.0"
@@ -2122,14 +2523,15 @@ crypto-browserify@^3.11.0:
2122 randomfill "^1.0.3" 2523 randomfill "^1.0.3"
2123 2524
2124css-loader@^1.0.0: 2525css-loader@^1.0.0:
2125 version "1.0.0" 2526 version "1.0.1"
2126 resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" 2527 resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
2528 integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==
2127 dependencies: 2529 dependencies:
2128 babel-code-frame "^6.26.0" 2530 babel-code-frame "^6.26.0"
2129 css-selector-tokenizer "^0.7.0" 2531 css-selector-tokenizer "^0.7.0"
2130 icss-utils "^2.1.0" 2532 icss-utils "^2.1.0"
2131 loader-utils "^1.0.2" 2533 loader-utils "^1.0.2"
2132 lodash.camelcase "^4.3.0" 2534 lodash "^4.17.11"
2133 postcss "^6.0.23" 2535 postcss "^6.0.23"
2134 postcss-modules-extract-imports "^1.2.0" 2536 postcss-modules-extract-imports "^1.2.0"
2135 postcss-modules-local-by-default "^1.2.0" 2537 postcss-modules-local-by-default "^1.2.0"
@@ -2141,10 +2543,12 @@ css-loader@^1.0.0:
2141css-parse@1.7.x: 2543css-parse@1.7.x:
2142 version "1.7.0" 2544 version "1.7.0"
2143 resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" 2545 resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
2546 integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=
2144 2547
2145css-select@^1.1.0: 2548css-select@^1.1.0:
2146 version "1.2.0" 2549 version "1.2.0"
2147 resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" 2550 resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
2551 integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
2148 dependencies: 2552 dependencies:
2149 boolbase "~1.0.0" 2553 boolbase "~1.0.0"
2150 css-what "2.1" 2554 css-what "2.1"
@@ -2152,20 +2556,31 @@ css-select@^1.1.0:
2152 nth-check "~1.0.1" 2556 nth-check "~1.0.1"
2153 2557
2154css-selector-tokenizer@^0.7.0: 2558css-selector-tokenizer@^0.7.0:
2155 version "0.7.0" 2559 version "0.7.1"
2156 resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" 2560 resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
2561 integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
2157 dependencies: 2562 dependencies:
2158 cssesc "^0.1.0" 2563 cssesc "^0.1.0"
2159 fastparse "^1.1.1" 2564 fastparse "^1.1.1"
2160 regexpu-core "^1.0.0" 2565 regexpu-core "^1.0.0"
2161 2566
2567css-tree@^1.0.0-alpha.29:
2568 version "1.0.0-alpha.29"
2569 resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
2570 integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==
2571 dependencies:
2572 mdn-data "~1.1.0"
2573 source-map "^0.5.3"
2574
2162css-what@2.1: 2575css-what@2.1:
2163 version "2.1.0" 2576 version "2.1.2"
2164 resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" 2577 resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d"
2578 integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==
2165 2579
2166css@^2.0.0: 2580css@^2.0.0:
2167 version "2.2.4" 2581 version "2.2.4"
2168 resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" 2582 resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
2583 integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
2169 dependencies: 2584 dependencies:
2170 inherits "^2.0.3" 2585 inherits "^2.0.3"
2171 source-map "^0.6.1" 2586 source-map "^0.6.1"
@@ -2175,128 +2590,155 @@ css@^2.0.0:
2175cssauron@^1.4.0: 2590cssauron@^1.4.0:
2176 version "1.4.0" 2591 version "1.4.0"
2177 resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" 2592 resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8"
2593 integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=
2178 dependencies: 2594 dependencies:
2179 through X.X.X 2595 through X.X.X
2180 2596
2181cssesc@^0.1.0: 2597cssesc@^0.1.0:
2182 version "0.1.0" 2598 version "0.1.0"
2183 resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" 2599 resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
2600 integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
2184 2601
2185cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 2602cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
2186 version "0.3.4" 2603 version "0.3.4"
2187 resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" 2604 resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797"
2605 integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==
2188 2606
2189cssstyle@^1.0.0: 2607cssstyle@^1.0.0:
2190 version "1.1.1" 2608 version "1.1.1"
2191 resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" 2609 resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb"
2610 integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==
2192 dependencies: 2611 dependencies:
2193 cssom "0.3.x" 2612 cssom "0.3.x"
2194 2613
2195cuint@^0.2.2:
2196 version "0.2.2"
2197 resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
2198
2199currently-unhandled@^0.4.1: 2614currently-unhandled@^0.4.1:
2200 version "0.4.1" 2615 version "0.4.1"
2201 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 2616 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
2617 integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
2202 dependencies: 2618 dependencies:
2203 array-find-index "^1.0.1" 2619 array-find-index "^1.0.1"
2204 2620
2205custom-event@~1.0.0: 2621custom-event@~1.0.0:
2206 version "1.0.1" 2622 version "1.0.1"
2207 resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" 2623 resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
2624 integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=
2208 2625
2209cyclist@~0.2.2: 2626cyclist@~0.2.2:
2210 version "0.2.2" 2627 version "0.2.2"
2211 resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" 2628 resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
2629 integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
2212 2630
2213d@1: 2631d@1:
2214 version "1.0.0" 2632 version "1.0.0"
2215 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 2633 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
2634 integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=
2216 dependencies: 2635 dependencies:
2217 es5-ext "^0.10.9" 2636 es5-ext "^0.10.9"
2218 2637
2219dashdash@^1.12.0: 2638dashdash@^1.12.0:
2220 version "1.14.1" 2639 version "1.14.1"
2221 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 2640 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
2641 integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
2222 dependencies: 2642 dependencies:
2223 assert-plus "^1.0.0" 2643 assert-plus "^1.0.0"
2224 2644
2225data-urls@^1.0.0: 2645data-urls@^1.0.0:
2226 version "1.0.1" 2646 version "1.1.0"
2227 resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.1.tgz#d416ac3896918f29ca84d81085bc3705834da579" 2647 resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
2648 integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
2228 dependencies: 2649 dependencies:
2229 abab "^2.0.0" 2650 abab "^2.0.0"
2230 whatwg-mimetype "^2.1.0" 2651 whatwg-mimetype "^2.2.0"
2231 whatwg-url "^7.0.0" 2652 whatwg-url "^7.0.0"
2232 2653
2233date-format@^1.2.0: 2654date-format@^1.2.0:
2234 version "1.2.0" 2655 version "1.2.0"
2235 resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" 2656 resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8"
2657 integrity sha1-YV6CjiM90aubua4JUODOzPpuytg=
2236 2658
2237date-now@^0.1.4: 2659date-now@^0.1.4:
2238 version "0.1.4" 2660 version "0.1.4"
2239 resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 2661 resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
2662 integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
2240 2663
2241debug@*: 2664debug@*, debug@^4.0.1, debug@^4.1.0:
2242 version "4.0.1" 2665 version "4.1.0"
2243 resolved "https://registry.yarnpkg.com/debug/-/debug-4.0.1.tgz#f9bb36d439b8d1f0dd52d8fb6b46e4ebb8c1cd5b" 2666 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87"
2667 integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==
2244 dependencies: 2668 dependencies:
2245 ms "^2.1.1" 2669 ms "^2.1.1"
2246 2670
2247debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: 2671debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
2248 version "2.6.9" 2672 version "2.6.9"
2249 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 2673 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
2674 integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
2250 dependencies: 2675 dependencies:
2251 ms "2.0.0" 2676 ms "2.0.0"
2252 2677
2253debug@=3.1.0, debug@~3.1.0: 2678debug@3.1.0, debug@=3.1.0, debug@~3.1.0:
2254 version "3.1.0" 2679 version "3.1.0"
2255 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 2680 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
2681 integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
2256 dependencies: 2682 dependencies:
2257 ms "2.0.0" 2683 ms "2.0.0"
2258 2684
2259debug@^3.1.0: 2685debug@^3.1.0, debug@^3.2.5:
2260 version "3.2.5" 2686 version "3.2.6"
2261 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" 2687 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
2688 integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
2262 dependencies: 2689 dependencies:
2263 ms "^2.1.1" 2690 ms "^2.1.1"
2264 2691
2265decamelize@^1.1.1, decamelize@^1.1.2: 2692debug@^4.1.1:
2693 version "4.1.1"
2694 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
2695 integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
2696 dependencies:
2697 ms "^2.1.1"
2698
2699decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
2266 version "1.2.0" 2700 version "1.2.0"
2267 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 2701 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
2702 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
2268 2703
2269decamelize@^2.0.0: 2704decamelize@^2.0.0:
2270 version "2.0.0" 2705 version "2.0.0"
2271 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" 2706 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
2707 integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==
2272 dependencies: 2708 dependencies:
2273 xregexp "4.0.0" 2709 xregexp "4.0.0"
2274 2710
2275decode-uri-component@^0.2.0: 2711decode-uri-component@^0.2.0:
2276 version "0.2.0" 2712 version "0.2.0"
2277 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 2713 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
2714 integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
2278 2715
2279decompress-response@^3.3.0: 2716decompress-response@^3.3.0:
2280 version "3.3.0" 2717 version "3.3.0"
2281 resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 2718 resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
2719 integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
2282 dependencies: 2720 dependencies:
2283 mimic-response "^1.0.0" 2721 mimic-response "^1.0.0"
2284 2722
2285deep-equal@^1.0.1: 2723deep-equal@^1.0.1:
2286 version "1.0.1" 2724 version "1.0.1"
2287 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 2725 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
2726 integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
2288 2727
2289deep-extend@^0.6.0: 2728deep-extend@^0.6.0:
2290 version "0.6.0" 2729 version "0.6.0"
2291 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 2730 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
2731 integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
2292 2732
2293deep-is@~0.1.3: 2733deep-is@~0.1.3:
2294 version "0.1.3" 2734 version "0.1.3"
2295 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 2735 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
2736 integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
2296 2737
2297default-gateway@^2.6.0: 2738default-gateway@^2.6.0:
2298 version "2.7.2" 2739 version "2.7.2"
2299 resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" 2740 resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f"
2741 integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==
2300 dependencies: 2742 dependencies:
2301 execa "^0.10.0" 2743 execa "^0.10.0"
2302 ip-regex "^2.1.0" 2744 ip-regex "^2.1.0"
@@ -2304,36 +2746,42 @@ default-gateway@^2.6.0:
2304default-require-extensions@^1.0.0: 2746default-require-extensions@^1.0.0:
2305 version "1.0.0" 2747 version "1.0.0"
2306 resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 2748 resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
2749 integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=
2307 dependencies: 2750 dependencies:
2308 strip-bom "^2.0.0" 2751 strip-bom "^2.0.0"
2309 2752
2310default-require-extensions@^2.0.0: 2753default-require-extensions@^2.0.0:
2311 version "2.0.0" 2754 version "2.0.0"
2312 resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" 2755 resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7"
2756 integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=
2313 dependencies: 2757 dependencies:
2314 strip-bom "^3.0.0" 2758 strip-bom "^3.0.0"
2315 2759
2316define-properties@^1.1.2: 2760define-properties@^1.1.2:
2317 version "1.1.3" 2761 version "1.1.3"
2318 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 2762 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
2763 integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
2319 dependencies: 2764 dependencies:
2320 object-keys "^1.0.12" 2765 object-keys "^1.0.12"
2321 2766
2322define-property@^0.2.5: 2767define-property@^0.2.5:
2323 version "0.2.5" 2768 version "0.2.5"
2324 resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 2769 resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
2770 integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
2325 dependencies: 2771 dependencies:
2326 is-descriptor "^0.1.0" 2772 is-descriptor "^0.1.0"
2327 2773
2328define-property@^1.0.0: 2774define-property@^1.0.0:
2329 version "1.0.0" 2775 version "1.0.0"
2330 resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 2776 resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
2777 integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
2331 dependencies: 2778 dependencies:
2332 is-descriptor "^1.0.0" 2779 is-descriptor "^1.0.0"
2333 2780
2334define-property@^2.0.2: 2781define-property@^2.0.2:
2335 version "2.0.2" 2782 version "2.0.2"
2336 resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 2783 resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
2784 integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
2337 dependencies: 2785 dependencies:
2338 is-descriptor "^1.0.2" 2786 is-descriptor "^1.0.2"
2339 isobject "^3.0.1" 2787 isobject "^3.0.1"
@@ -2341,10 +2789,12 @@ define-property@^2.0.2:
2341defined@^1.0.0: 2789defined@^1.0.0:
2342 version "1.0.0" 2790 version "1.0.0"
2343 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 2791 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
2792 integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
2344 2793
2345del@^2.2.0: 2794del@^2.2.0:
2346 version "2.2.2" 2795 version "2.2.2"
2347 resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 2796 resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
2797 integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=
2348 dependencies: 2798 dependencies:
2349 globby "^5.0.0" 2799 globby "^5.0.0"
2350 is-path-cwd "^1.0.0" 2800 is-path-cwd "^1.0.0"
@@ -2357,6 +2807,7 @@ del@^2.2.0:
2357del@^3.0.0: 2807del@^3.0.0:
2358 version "3.0.0" 2808 version "3.0.0"
2359 resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" 2809 resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
2810 integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=
2360 dependencies: 2811 dependencies:
2361 globby "^6.1.0" 2812 globby "^6.1.0"
2362 is-path-cwd "^1.0.0" 2813 is-path-cwd "^1.0.0"
@@ -2368,22 +2819,27 @@ del@^3.0.0:
2368delayed-stream@~1.0.0: 2819delayed-stream@~1.0.0:
2369 version "1.0.0" 2820 version "1.0.0"
2370 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 2821 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
2822 integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
2371 2823
2372delegates@^1.0.0: 2824delegates@^1.0.0:
2373 version "1.0.0" 2825 version "1.0.0"
2374 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 2826 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
2827 integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
2375 2828
2376depd@1.1.1: 2829depd@~1.1.2:
2377 version "1.1.1"
2378 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
2379
2380depd@~1.1.1, depd@~1.1.2:
2381 version "1.1.2" 2830 version "1.1.2"
2382 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 2831 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
2832 integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
2833
2834dependency-graph@^0.7.2:
2835 version "0.7.2"
2836 resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49"
2837 integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==
2383 2838
2384des.js@^1.0.0: 2839des.js@^1.0.0:
2385 version "1.0.0" 2840 version "1.0.0"
2386 resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" 2841 resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
2842 integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
2387 dependencies: 2843 dependencies:
2388 inherits "^2.0.1" 2844 inherits "^2.0.1"
2389 minimalistic-assert "^1.0.0" 2845 minimalistic-assert "^1.0.0"
@@ -2391,40 +2847,49 @@ des.js@^1.0.0:
2391destroy@~1.0.4: 2847destroy@~1.0.4:
2392 version "1.0.4" 2848 version "1.0.4"
2393 resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 2849 resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
2850 integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
2394 2851
2395detect-indent@^4.0.0: 2852detect-indent@^4.0.0:
2396 version "4.0.0" 2853 version "4.0.0"
2397 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 2854 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
2855 integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
2398 dependencies: 2856 dependencies:
2399 repeating "^2.0.0" 2857 repeating "^2.0.0"
2400 2858
2401detect-libc@^1.0.2: 2859detect-libc@^1.0.2:
2402 version "1.0.3" 2860 version "1.0.3"
2403 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 2861 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
2862 integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
2404 2863
2405detect-newline@^2.1.0: 2864detect-newline@^2.1.0:
2406 version "2.1.0" 2865 version "2.1.0"
2407 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" 2866 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
2867 integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
2408 2868
2409detect-node@^2.0.3: 2869detect-node@^2.0.4:
2410 version "2.0.4" 2870 version "2.0.4"
2411 resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" 2871 resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
2872 integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
2412 2873
2413dexie@^2.0.4: 2874dexie@^2.0.4:
2414 version "2.0.4" 2875 version "2.0.4"
2415 resolved "https://registry.yarnpkg.com/dexie/-/dexie-2.0.4.tgz#6027a5e05879424e8f9979d8c14e7420f27e3a11" 2876 resolved "https://registry.yarnpkg.com/dexie/-/dexie-2.0.4.tgz#6027a5e05879424e8f9979d8c14e7420f27e3a11"
2877 integrity sha512-aQ/s1U2wHxwBKRrt2Z/mwFNHMQWhESerFsMYzE+5P5OsIe5o1kgpFMWkzKTtkvkyyEni6mWr/T4HUJuY9xIHLA==
2416 2878
2417di@^0.0.1: 2879di@^0.0.1:
2418 version "0.0.1" 2880 version "0.0.1"
2419 resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" 2881 resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
2882 integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=
2420 2883
2421diff@^3.2.0: 2884diff@^3.2.0:
2422 version "3.5.0" 2885 version "3.5.0"
2423 resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 2886 resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
2887 integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
2424 2888
2425diffie-hellman@^5.0.0: 2889diffie-hellman@^5.0.0:
2426 version "5.0.3" 2890 version "5.0.3"
2427 resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 2891 resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
2892 integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
2428 dependencies: 2893 dependencies:
2429 bn.js "^4.1.0" 2894 bn.js "^4.1.0"
2430 miller-rabin "^4.0.0" 2895 miller-rabin "^4.0.0"
@@ -2433,10 +2898,12 @@ diffie-hellman@^5.0.0:
2433dijkstrajs@^1.0.1: 2898dijkstrajs@^1.0.1:
2434 version "1.0.1" 2899 version "1.0.1"
2435 resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" 2900 resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
2901 integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs=
2436 2902
2437dir-glob@^2.0.0: 2903dir-glob@^2.0.0:
2438 version "2.0.0" 2904 version "2.0.0"
2439 resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" 2905 resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034"
2906 integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==
2440 dependencies: 2907 dependencies:
2441 arrify "^1.0.1" 2908 arrify "^1.0.1"
2442 path-type "^3.0.0" 2909 path-type "^3.0.0"
@@ -2444,10 +2911,12 @@ dir-glob@^2.0.0:
2444dns-equal@^1.0.0: 2911dns-equal@^1.0.0:
2445 version "1.0.0" 2912 version "1.0.0"
2446 resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" 2913 resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
2914 integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
2447 2915
2448dns-packet@^1.3.1: 2916dns-packet@^1.3.1:
2449 version "1.3.1" 2917 version "1.3.1"
2450 resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" 2918 resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
2919 integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
2451 dependencies: 2920 dependencies:
2452 ip "^1.1.0" 2921 ip "^1.1.0"
2453 safe-buffer "^5.0.1" 2922 safe-buffer "^5.0.1"
@@ -2455,25 +2924,29 @@ dns-packet@^1.3.1:
2455dns-txt@^2.0.2: 2924dns-txt@^2.0.2:
2456 version "2.0.2" 2925 version "2.0.2"
2457 resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" 2926 resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
2927 integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
2458 dependencies: 2928 dependencies:
2459 buffer-indexof "^1.0.0" 2929 buffer-indexof "^1.0.0"
2460 2930
2461doctrine@0.7.2: 2931doctrine@0.7.2:
2462 version "0.7.2" 2932 version "0.7.2"
2463 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" 2933 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
2934 integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=
2464 dependencies: 2935 dependencies:
2465 esutils "^1.1.6" 2936 esutils "^1.1.6"
2466 isarray "0.0.1" 2937 isarray "0.0.1"
2467 2938
2468dom-converter@~0.1: 2939dom-converter@~0.2:
2469 version "0.1.4" 2940 version "0.2.0"
2470 resolved "http://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" 2941 resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
2942 integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
2471 dependencies: 2943 dependencies:
2472 utila "~0.3" 2944 utila "~0.4"
2473 2945
2474dom-serialize@^2.2.0: 2946dom-serialize@^2.2.0:
2475 version "2.2.1" 2947 version "2.2.1"
2476 resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" 2948 resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
2949 integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=
2477 dependencies: 2950 dependencies:
2478 custom-event "~1.0.0" 2951 custom-event "~1.0.0"
2479 ent "~2.2.0" 2952 ent "~2.2.0"
@@ -2483,6 +2956,7 @@ dom-serialize@^2.2.0:
2483dom-serializer@0: 2956dom-serializer@0:
2484 version "0.1.0" 2957 version "0.1.0"
2485 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" 2958 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
2959 integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=
2486 dependencies: 2960 dependencies:
2487 domelementtype "~1.1.1" 2961 domelementtype "~1.1.1"
2488 entities "~1.1.1" 2962 entities "~1.1.1"
@@ -2490,46 +2964,60 @@ dom-serializer@0:
2490dom-walk@^0.1.0: 2964dom-walk@^0.1.0:
2491 version "0.1.1" 2965 version "0.1.1"
2492 resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" 2966 resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
2967 integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
2493 2968
2494domain-browser@^1.1.1: 2969domain-browser@^1.1.1:
2495 version "1.2.0" 2970 version "1.2.0"
2496 resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 2971 resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
2972 integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
2497 2973
2498domelementtype@1, domelementtype@^1.3.0: 2974domelementtype@1:
2975 version "1.2.1"
2976 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479"
2977 integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==
2978
2979domelementtype@^1.3.0:
2499 version "1.3.0" 2980 version "1.3.0"
2500 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" 2981 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
2982 integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=
2501 2983
2502domelementtype@~1.1.1: 2984domelementtype@~1.1.1:
2503 version "1.1.3" 2985 version "1.1.3"
2504 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" 2986 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
2987 integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=
2505 2988
2506domexception@^1.0.1: 2989domexception@^1.0.1:
2507 version "1.0.1" 2990 version "1.0.1"
2508 resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" 2991 resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
2992 integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
2509 dependencies: 2993 dependencies:
2510 webidl-conversions "^4.0.2" 2994 webidl-conversions "^4.0.2"
2511 2995
2512domhandler@2.1: 2996domhandler@2.1:
2513 version "2.1.0" 2997 version "2.1.0"
2514 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" 2998 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
2999 integrity sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=
2515 dependencies: 3000 dependencies:
2516 domelementtype "1" 3001 domelementtype "1"
2517 3002
2518domhandler@^2.3.0: 3003domhandler@^2.3.0:
2519 version "2.4.2" 3004 version "2.4.2"
2520 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" 3005 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
3006 integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
2521 dependencies: 3007 dependencies:
2522 domelementtype "1" 3008 domelementtype "1"
2523 3009
2524domutils@1.1: 3010domutils@1.1:
2525 version "1.1.6" 3011 version "1.1.6"
2526 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" 3012 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
3013 integrity sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=
2527 dependencies: 3014 dependencies:
2528 domelementtype "1" 3015 domelementtype "1"
2529 3016
2530domutils@1.5.1: 3017domutils@1.5.1:
2531 version "1.5.1" 3018 version "1.5.1"
2532 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" 3019 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
3020 integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
2533 dependencies: 3021 dependencies:
2534 dom-serializer "0" 3022 dom-serializer "0"
2535 domelementtype "1" 3023 domelementtype "1"
@@ -2537,17 +3025,20 @@ domutils@1.5.1:
2537domutils@^1.5.1: 3025domutils@^1.5.1:
2538 version "1.7.0" 3026 version "1.7.0"
2539 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" 3027 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
3028 integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
2540 dependencies: 3029 dependencies:
2541 dom-serializer "0" 3030 dom-serializer "0"
2542 domelementtype "1" 3031 domelementtype "1"
2543 3032
2544duplexer@^0.1.1: 3033duplexer@^0.1.1:
2545 version "0.1.1" 3034 version "0.1.1"
2546 resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 3035 resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
3036 integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
2547 3037
2548duplexify@^3.4.2, duplexify@^3.6.0: 3038duplexify@^3.4.2, duplexify@^3.6.0:
2549 version "3.6.0" 3039 version "3.6.1"
2550 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" 3040 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125"
3041 integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==
2551 dependencies: 3042 dependencies:
2552 end-of-stream "^1.0.0" 3043 end-of-stream "^1.0.0"
2553 inherits "^2.0.1" 3044 inherits "^2.0.1"
@@ -2557,6 +3048,7 @@ duplexify@^3.4.2, duplexify@^3.6.0:
2557ecc-jsbn@~0.1.1: 3048ecc-jsbn@~0.1.1:
2558 version "0.1.2" 3049 version "0.1.2"
2559 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 3050 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
3051 integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
2560 dependencies: 3052 dependencies:
2561 jsbn "~0.1.0" 3053 jsbn "~0.1.0"
2562 safer-buffer "^2.1.0" 3054 safer-buffer "^2.1.0"
@@ -2564,18 +3056,22 @@ ecc-jsbn@~0.1.1:
2564ee-first@1.1.1: 3056ee-first@1.1.1:
2565 version "1.1.1" 3057 version "1.1.1"
2566 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 3058 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
3059 integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
2567 3060
2568ejs@^2.5.7, ejs@^2.6.1: 3061ejs@^2.6.1:
2569 version "2.6.1" 3062 version "2.6.1"
2570 resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" 3063 resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
3064 integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
2571 3065
2572electron-to-chromium@^1.3.47: 3066electron-to-chromium@^1.3.103:
2573 version "1.3.70" 3067 version "1.3.113"
2574 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.70.tgz#ded377256d92d81b4257d36c65aa890274afcfd2" 3068 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9"
3069 integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==
2575 3070
2576elliptic@^6.0.0: 3071elliptic@^6.0.0:
2577 version "6.4.1" 3072 version "6.4.1"
2578 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" 3073 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
3074 integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==
2579 dependencies: 3075 dependencies:
2580 bn.js "^4.4.0" 3076 bn.js "^4.4.0"
2581 brorand "^1.0.1" 3077 brorand "^1.0.1"
@@ -2588,20 +3084,31 @@ elliptic@^6.0.0:
2588emojis-list@^2.0.0: 3084emojis-list@^2.0.0:
2589 version "2.1.0" 3085 version "2.1.0"
2590 resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 3086 resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
3087 integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
2591 3088
2592encodeurl@~1.0.1, encodeurl@~1.0.2: 3089encodeurl@~1.0.1, encodeurl@~1.0.2:
2593 version "1.0.2" 3090 version "1.0.2"
2594 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 3091 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
3092 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
3093
3094encoding@^0.1.11:
3095 version "0.1.12"
3096 resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
3097 integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
3098 dependencies:
3099 iconv-lite "~0.4.13"
2595 3100
2596end-of-stream@^1.0.0, end-of-stream@^1.1.0: 3101end-of-stream@^1.0.0, end-of-stream@^1.1.0:
2597 version "1.4.1" 3102 version "1.4.1"
2598 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 3103 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
3104 integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
2599 dependencies: 3105 dependencies:
2600 once "^1.4.0" 3106 once "^1.4.0"
2601 3107
2602engine.io-client@~3.2.0: 3108engine.io-client@~3.2.0:
2603 version "3.2.1" 3109 version "3.2.1"
2604 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" 3110 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
3111 integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==
2605 dependencies: 3112 dependencies:
2606 component-emitter "1.2.1" 3113 component-emitter "1.2.1"
2607 component-inherit "0.0.3" 3114 component-inherit "0.0.3"
@@ -2615,19 +3122,38 @@ engine.io-client@~3.2.0:
2615 xmlhttprequest-ssl "~1.5.4" 3122 xmlhttprequest-ssl "~1.5.4"
2616 yeast "0.1.2" 3123 yeast "0.1.2"
2617 3124
3125engine.io-client@~3.3.1:
3126 version "3.3.1"
3127 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03"
3128 integrity sha512-q66JBFuQcy7CSlfAz9L3jH+v7DTT3i6ZEadYcVj2pOs8/0uJHLxKX3WBkGTvULJMdz0tUCyJag0aKT/dpXL9BQ==
3129 dependencies:
3130 component-emitter "1.2.1"
3131 component-inherit "0.0.3"
3132 debug "~3.1.0"
3133 engine.io-parser "~2.1.1"
3134 has-cors "1.1.0"
3135 indexof "0.0.1"
3136 parseqs "0.0.5"
3137 parseuri "0.0.5"
3138 ws "~6.1.0"
3139 xmlhttprequest-ssl "~1.5.4"
3140 yeast "0.1.2"
3141
2618engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: 3142engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
2619 version "2.1.2" 3143 version "2.1.3"
2620 resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" 3144 resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6"
3145 integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==
2621 dependencies: 3146 dependencies:
2622 after "0.8.2" 3147 after "0.8.2"
2623 arraybuffer.slice "~0.0.7" 3148 arraybuffer.slice "~0.0.7"
2624 base64-arraybuffer "0.1.5" 3149 base64-arraybuffer "0.1.5"
2625 blob "0.0.4" 3150 blob "0.0.5"
2626 has-binary2 "~1.0.2" 3151 has-binary2 "~1.0.2"
2627 3152
2628engine.io@~3.2.0: 3153engine.io@~3.2.0:
2629 version "3.2.0" 3154 version "3.2.1"
2630 resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" 3155 resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2"
3156 integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==
2631 dependencies: 3157 dependencies:
2632 accepts "~1.3.4" 3158 accepts "~1.3.4"
2633 base64id "1.0.0" 3159 base64id "1.0.0"
@@ -2636,9 +3162,10 @@ engine.io@~3.2.0:
2636 engine.io-parser "~2.1.0" 3162 engine.io-parser "~2.1.0"
2637 ws "~3.3.1" 3163 ws "~3.3.1"
2638 3164
2639enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: 3165enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
2640 version "4.1.0" 3166 version "4.1.0"
2641 resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" 3167 resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
3168 integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
2642 dependencies: 3169 dependencies:
2643 graceful-fs "^4.1.2" 3170 graceful-fs "^4.1.2"
2644 memory-fs "^0.4.0" 3171 memory-fs "^0.4.0"
@@ -2647,26 +3174,36 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
2647ent@~2.2.0: 3174ent@~2.2.0:
2648 version "2.2.0" 3175 version "2.2.0"
2649 resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" 3176 resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
3177 integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
2650 3178
2651entities@^1.1.1, entities@~1.1.1: 3179entities@^1.1.1, entities@~1.1.1:
2652 version "1.1.1" 3180 version "1.1.2"
2653 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" 3181 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
3182 integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
3183
3184err-code@^1.0.0:
3185 version "1.1.2"
3186 resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
3187 integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
2654 3188
2655errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: 3189errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
2656 version "0.1.7" 3190 version "0.1.7"
2657 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" 3191 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
3192 integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
2658 dependencies: 3193 dependencies:
2659 prr "~1.0.1" 3194 prr "~1.0.1"
2660 3195
2661error-ex@^1.2.0, error-ex@^1.3.1: 3196error-ex@^1.2.0, error-ex@^1.3.1:
2662 version "1.3.2" 3197 version "1.3.2"
2663 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 3198 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
3199 integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
2664 dependencies: 3200 dependencies:
2665 is-arrayish "^0.2.1" 3201 is-arrayish "^0.2.1"
2666 3202
2667es-abstract@^1.5.1: 3203es-abstract@^1.5.1:
2668 version "1.12.0" 3204 version "1.12.0"
2669 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" 3205 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
3206 integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==
2670 dependencies: 3207 dependencies:
2671 es-to-primitive "^1.1.1" 3208 es-to-primitive "^1.1.1"
2672 function-bind "^1.1.1" 3209 function-bind "^1.1.1"
@@ -2675,16 +3212,18 @@ es-abstract@^1.5.1:
2675 is-regex "^1.0.4" 3212 is-regex "^1.0.4"
2676 3213
2677es-to-primitive@^1.1.1: 3214es-to-primitive@^1.1.1:
2678 version "1.1.1" 3215 version "1.2.0"
2679 resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 3216 resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
3217 integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
2680 dependencies: 3218 dependencies:
2681 is-callable "^1.1.1" 3219 is-callable "^1.1.4"
2682 is-date-object "^1.0.1" 3220 is-date-object "^1.0.1"
2683 is-symbol "^1.0.1" 3221 is-symbol "^1.0.2"
2684 3222
2685es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: 3223es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
2686 version "0.10.46" 3224 version "0.10.46"
2687 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" 3225 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572"
3226 integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==
2688 dependencies: 3227 dependencies:
2689 es6-iterator "~2.0.3" 3228 es6-iterator "~2.0.3"
2690 es6-symbol "~3.1.1" 3229 es6-symbol "~3.1.1"
@@ -2693,6 +3232,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
2693es6-iterator@~2.0.3: 3232es6-iterator@~2.0.3:
2694 version "2.0.3" 3233 version "2.0.3"
2695 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 3234 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
3235 integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
2696 dependencies: 3236 dependencies:
2697 d "1" 3237 d "1"
2698 es5-ext "^0.10.35" 3238 es5-ext "^0.10.35"
@@ -2701,20 +3241,24 @@ es6-iterator@~2.0.3:
2701es6-promise@^4.0.3: 3241es6-promise@^4.0.3:
2702 version "4.2.5" 3242 version "4.2.5"
2703 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" 3243 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
3244 integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
2704 3245
2705es6-promise@~3.0.2: 3246es6-promise@~3.0.2:
2706 version "3.0.2" 3247 version "3.0.2"
2707 resolved "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" 3248 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6"
3249 integrity sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=
2708 3250
2709es6-promisify@^5.0.0: 3251es6-promisify@^5.0.0:
2710 version "5.0.0" 3252 version "5.0.0"
2711 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 3253 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
3254 integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
2712 dependencies: 3255 dependencies:
2713 es6-promise "^4.0.3" 3256 es6-promise "^4.0.3"
2714 3257
2715es6-symbol@^3.1.1, es6-symbol@~3.1.1: 3258es6-symbol@^3.1.1, es6-symbol@~3.1.1:
2716 version "3.1.1" 3259 version "3.1.1"
2717 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 3260 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
3261 integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
2718 dependencies: 3262 dependencies:
2719 d "1" 3263 d "1"
2720 es5-ext "~0.10.14" 3264 es5-ext "~0.10.14"
@@ -2722,6 +3266,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1:
2722es6-templates@^0.2.3: 3266es6-templates@^0.2.3:
2723 version "0.2.3" 3267 version "0.2.3"
2724 resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" 3268 resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4"
3269 integrity sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=
2725 dependencies: 3270 dependencies:
2726 recast "~0.11.12" 3271 recast "~0.11.12"
2727 through "~2.3.6" 3272 through "~2.3.6"
@@ -2729,25 +3274,17 @@ es6-templates@^0.2.3:
2729escape-html@~1.0.3: 3274escape-html@~1.0.3:
2730 version "1.0.3" 3275 version "1.0.3"
2731 resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 3276 resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
3277 integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
2732 3278
2733escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 3279escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
2734 version "1.0.5" 3280 version "1.0.5"
2735 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 3281 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
2736 3282 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
2737escodegen@1.8.x:
2738 version "1.8.1"
2739 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
2740 dependencies:
2741 esprima "^2.7.1"
2742 estraverse "^1.9.1"
2743 esutils "^2.0.2"
2744 optionator "^0.8.1"
2745 optionalDependencies:
2746 source-map "~0.2.0"
2747 3283
2748escodegen@^1.9.1: 3284escodegen@^1.9.1:
2749 version "1.11.0" 3285 version "1.11.0"
2750 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" 3286 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
3287 integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==
2751 dependencies: 3288 dependencies:
2752 esprima "^3.1.3" 3289 esprima "^3.1.3"
2753 estraverse "^4.2.0" 3290 estraverse "^4.2.0"
@@ -2759,65 +3296,74 @@ escodegen@^1.9.1:
2759eslint-scope@^4.0.0: 3296eslint-scope@^4.0.0:
2760 version "4.0.0" 3297 version "4.0.0"
2761 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 3298 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
3299 integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==
2762 dependencies: 3300 dependencies:
2763 esrecurse "^4.1.0" 3301 esrecurse "^4.1.0"
2764 estraverse "^4.1.1" 3302 estraverse "^4.1.1"
2765 3303
2766esprima@2.7.x, esprima@^2.7.1:
2767 version "2.7.3"
2768 resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
2769
2770esprima@^3.1.3, esprima@~3.1.0: 3304esprima@^3.1.3, esprima@~3.1.0:
2771 version "3.1.3" 3305 version "3.1.3"
2772 resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 3306 resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
3307 integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
2773 3308
2774esprima@^4.0.0: 3309esprima@^4.0.0:
2775 version "4.0.1" 3310 version "4.0.1"
2776 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 3311 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
3312 integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2777 3313
2778esrecurse@^4.1.0: 3314esrecurse@^4.1.0:
2779 version "4.2.1" 3315 version "4.2.1"
2780 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 3316 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
3317 integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
2781 dependencies: 3318 dependencies:
2782 estraverse "^4.1.0" 3319 estraverse "^4.1.0"
2783 3320
2784estraverse@^1.9.1:
2785 version "1.9.3"
2786 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
2787
2788estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 3321estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
2789 version "4.2.0" 3322 version "4.2.0"
2790 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 3323 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
3324 integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
2791 3325
2792esutils@^1.1.6: 3326esutils@^1.1.6:
2793 version "1.1.6" 3327 version "1.1.6"
2794 resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" 3328 resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
3329 integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=
2795 3330
2796esutils@^2.0.2: 3331esutils@^2.0.2:
2797 version "2.0.2" 3332 version "2.0.2"
2798 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 3333 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
3334 integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
2799 3335
2800etag@~1.8.1: 3336etag@~1.8.1:
2801 version "1.8.1" 3337 version "1.8.1"
2802 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 3338 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
3339 integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
2803 3340
2804eventemitter3@^3.0.0: 3341eventemitter3@3.1.0, eventemitter3@^3.0.0:
2805 version "3.1.0" 3342 version "3.1.0"
2806 resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" 3343 resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
3344 integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
2807 3345
2808events@^1.0.0: 3346events@^1.0.0:
2809 version "1.1.1" 3347 version "1.1.1"
2810 resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 3348 resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
3349 integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
2811 3350
2812eventsource@0.1.6: 3351events@^3.0.0:
2813 version "0.1.6" 3352 version "3.0.0"
2814 resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" 3353 resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
3354 integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
3355
3356eventsource@^1.0.7:
3357 version "1.0.7"
3358 resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
3359 integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
2815 dependencies: 3360 dependencies:
2816 original ">=0.0.5" 3361 original "^1.0.0"
2817 3362
2818evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 3363evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
2819 version "1.0.3" 3364 version "1.0.3"
2820 resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 3365 resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
3366 integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
2821 dependencies: 3367 dependencies:
2822 md5.js "^1.3.4" 3368 md5.js "^1.3.4"
2823 safe-buffer "^5.1.1" 3369 safe-buffer "^5.1.1"
@@ -2825,12 +3371,14 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
2825exec-sh@^0.2.0: 3371exec-sh@^0.2.0:
2826 version "0.2.2" 3372 version "0.2.2"
2827 resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" 3373 resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
3374 integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==
2828 dependencies: 3375 dependencies:
2829 merge "^1.2.0" 3376 merge "^1.2.0"
2830 3377
2831execa@^0.10.0: 3378execa@^0.10.0:
2832 version "0.10.0" 3379 version "0.10.0"
2833 resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" 3380 resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
3381 integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
2834 dependencies: 3382 dependencies:
2835 cross-spawn "^6.0.0" 3383 cross-spawn "^6.0.0"
2836 get-stream "^3.0.0" 3384 get-stream "^3.0.0"
@@ -2843,6 +3391,7 @@ execa@^0.10.0:
2843execa@^0.7.0: 3391execa@^0.7.0:
2844 version "0.7.0" 3392 version "0.7.0"
2845 resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 3393 resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
3394 integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
2846 dependencies: 3395 dependencies:
2847 cross-spawn "^5.0.1" 3396 cross-spawn "^5.0.1"
2848 get-stream "^3.0.0" 3397 get-stream "^3.0.0"
@@ -2855,10 +3404,12 @@ execa@^0.7.0:
2855exit@^0.1.2: 3404exit@^0.1.2:
2856 version "0.1.2" 3405 version "0.1.2"
2857 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 3406 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
3407 integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
2858 3408
2859expand-braces@^0.1.1: 3409expand-braces@^0.1.1:
2860 version "0.1.2" 3410 version "0.1.2"
2861 resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" 3411 resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
3412 integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o=
2862 dependencies: 3413 dependencies:
2863 array-slice "^0.2.3" 3414 array-slice "^0.2.3"
2864 array-unique "^0.2.1" 3415 array-unique "^0.2.1"
@@ -2867,12 +3418,14 @@ expand-braces@^0.1.1:
2867expand-brackets@^0.1.4: 3418expand-brackets@^0.1.4:
2868 version "0.1.5" 3419 version "0.1.5"
2869 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 3420 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
3421 integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
2870 dependencies: 3422 dependencies:
2871 is-posix-bracket "^0.1.0" 3423 is-posix-bracket "^0.1.0"
2872 3424
2873expand-brackets@^2.1.4: 3425expand-brackets@^2.1.4:
2874 version "2.1.4" 3426 version "2.1.4"
2875 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 3427 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
3428 integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
2876 dependencies: 3429 dependencies:
2877 debug "^2.3.3" 3430 debug "^2.3.3"
2878 define-property "^0.2.5" 3431 define-property "^0.2.5"
@@ -2885,6 +3438,7 @@ expand-brackets@^2.1.4:
2885expand-range@^0.1.0: 3438expand-range@^0.1.0:
2886 version "0.1.1" 3439 version "0.1.1"
2887 resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" 3440 resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
3441 integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=
2888 dependencies: 3442 dependencies:
2889 is-number "^0.1.1" 3443 is-number "^0.1.1"
2890 repeat-string "^0.2.2" 3444 repeat-string "^0.2.2"
@@ -2892,12 +3446,14 @@ expand-range@^0.1.0:
2892expand-range@^1.8.1: 3446expand-range@^1.8.1:
2893 version "1.8.2" 3447 version "1.8.2"
2894 resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 3448 resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
3449 integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
2895 dependencies: 3450 dependencies:
2896 fill-range "^2.1.0" 3451 fill-range "^2.1.0"
2897 3452
2898expect@^23.6.0: 3453expect@^23.6.0:
2899 version "23.6.0" 3454 version "23.6.0"
2900 resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" 3455 resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98"
3456 integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==
2901 dependencies: 3457 dependencies:
2902 ansi-styles "^3.2.0" 3458 ansi-styles "^3.2.0"
2903 jest-diff "^23.6.0" 3459 jest-diff "^23.6.0"
@@ -2907,12 +3463,13 @@ expect@^23.6.0:
2907 jest-regex-util "^23.3.0" 3463 jest-regex-util "^23.3.0"
2908 3464
2909express@^4.16.2, express@^4.16.3: 3465express@^4.16.2, express@^4.16.3:
2910 version "4.16.3" 3466 version "4.16.4"
2911 resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" 3467 resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
3468 integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
2912 dependencies: 3469 dependencies:
2913 accepts "~1.3.5" 3470 accepts "~1.3.5"
2914 array-flatten "1.1.1" 3471 array-flatten "1.1.1"
2915 body-parser "1.18.2" 3472 body-parser "1.18.3"
2916 content-disposition "0.5.2" 3473 content-disposition "0.5.2"
2917 content-type "~1.0.4" 3474 content-type "~1.0.4"
2918 cookie "0.3.1" 3475 cookie "0.3.1"
@@ -2929,10 +3486,10 @@ express@^4.16.2, express@^4.16.3:
2929 on-finished "~2.3.0" 3486 on-finished "~2.3.0"
2930 parseurl "~1.3.2" 3487 parseurl "~1.3.2"
2931 path-to-regexp "0.1.7" 3488 path-to-regexp "0.1.7"
2932 proxy-addr "~2.0.3" 3489 proxy-addr "~2.0.4"
2933 qs "6.5.1" 3490 qs "6.5.2"
2934 range-parser "~1.2.0" 3491 range-parser "~1.2.0"
2935 safe-buffer "5.1.1" 3492 safe-buffer "5.1.2"
2936 send "0.16.2" 3493 send "0.16.2"
2937 serve-static "1.13.2" 3494 serve-static "1.13.2"
2938 setprototypeof "1.1.0" 3495 setprototypeof "1.1.0"
@@ -2944,23 +3501,27 @@ express@^4.16.2, express@^4.16.3:
2944extend-shallow@^2.0.1: 3501extend-shallow@^2.0.1:
2945 version "2.0.1" 3502 version "2.0.1"
2946 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 3503 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
3504 integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
2947 dependencies: 3505 dependencies:
2948 is-extendable "^0.1.0" 3506 is-extendable "^0.1.0"
2949 3507
2950extend-shallow@^3.0.0, extend-shallow@^3.0.2: 3508extend-shallow@^3.0.0, extend-shallow@^3.0.2:
2951 version "3.0.2" 3509 version "3.0.2"
2952 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 3510 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
3511 integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
2953 dependencies: 3512 dependencies:
2954 assign-symbols "^1.0.0" 3513 assign-symbols "^1.0.0"
2955 is-extendable "^1.0.1" 3514 is-extendable "^1.0.1"
2956 3515
2957extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: 3516extend@^3.0.0, extend@~3.0.2:
2958 version "3.0.2" 3517 version "3.0.2"
2959 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 3518 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
3519 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
2960 3520
2961external-editor@^3.0.0: 3521external-editor@^3.0.0:
2962 version "3.0.3" 3522 version "3.0.3"
2963 resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 3523 resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27"
3524 integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==
2964 dependencies: 3525 dependencies:
2965 chardet "^0.7.0" 3526 chardet "^0.7.0"
2966 iconv-lite "^0.4.24" 3527 iconv-lite "^0.4.24"
@@ -2969,12 +3530,14 @@ external-editor@^3.0.0:
2969extglob@^0.3.1: 3530extglob@^0.3.1:
2970 version "0.3.2" 3531 version "0.3.2"
2971 resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 3532 resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
3533 integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
2972 dependencies: 3534 dependencies:
2973 is-extglob "^1.0.0" 3535 is-extglob "^1.0.0"
2974 3536
2975extglob@^2.0.4: 3537extglob@^2.0.4:
2976 version "2.0.4" 3538 version "2.0.4"
2977 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 3539 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
3540 integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
2978 dependencies: 3541 dependencies:
2979 array-unique "^0.3.2" 3542 array-unique "^0.3.2"
2980 define-property "^1.0.0" 3543 define-property "^1.0.0"
@@ -2988,6 +3551,7 @@ extglob@^2.0.4:
2988extract-text-webpack-plugin@4.0.0-beta.0: 3551extract-text-webpack-plugin@4.0.0-beta.0:
2989 version "4.0.0-beta.0" 3552 version "4.0.0-beta.0"
2990 resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz#f7361d7ff430b42961f8d1321ba8c1757b5d4c42" 3553 resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz#f7361d7ff430b42961f8d1321ba8c1757b5d4c42"
3554 integrity sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==
2991 dependencies: 3555 dependencies:
2992 async "^2.4.1" 3556 async "^2.4.1"
2993 loader-utils "^1.1.0" 3557 loader-utils "^1.1.0"
@@ -2997,69 +3561,83 @@ extract-text-webpack-plugin@4.0.0-beta.0:
2997extsprintf@1.3.0: 3561extsprintf@1.3.0:
2998 version "1.3.0" 3562 version "1.3.0"
2999 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 3563 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
3564 integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
3000 3565
3001extsprintf@^1.2.0: 3566extsprintf@^1.2.0:
3002 version "1.4.0" 3567 version "1.4.0"
3003 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 3568 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
3569 integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
3004 3570
3005fast-deep-equal@^1.0.0: 3571fast-deep-equal@^1.0.0:
3006 version "1.1.0" 3572 version "1.1.0"
3007 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 3573 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
3574 integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
3008 3575
3009fast-deep-equal@^2.0.1: 3576fast-deep-equal@^2.0.1:
3010 version "2.0.1" 3577 version "2.0.1"
3011 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 3578 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
3579 integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
3012 3580
3013fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: 3581fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
3014 version "2.0.0" 3582 version "2.0.0"
3015 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 3583 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
3584 integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
3016 3585
3017fast-levenshtein@~2.0.4: 3586fast-levenshtein@~2.0.4:
3018 version "2.0.6" 3587 version "2.0.6"
3019 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 3588 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
3589 integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
3020 3590
3021fastparse@^1.1.1: 3591fastparse@^1.1.1:
3022 version "1.1.1" 3592 version "1.1.2"
3023 resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" 3593 resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
3594 integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
3024 3595
3025faye-websocket@^0.10.0: 3596faye-websocket@^0.10.0:
3026 version "0.10.0" 3597 version "0.10.0"
3027 resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" 3598 resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
3599 integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
3028 dependencies: 3600 dependencies:
3029 websocket-driver ">=0.5.1" 3601 websocket-driver ">=0.5.1"
3030 3602
3031faye-websocket@~0.11.0: 3603faye-websocket@~0.11.1:
3032 version "0.11.1" 3604 version "0.11.1"
3033 resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" 3605 resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
3606 integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=
3034 dependencies: 3607 dependencies:
3035 websocket-driver ">=0.5.1" 3608 websocket-driver ">=0.5.1"
3036 3609
3037fb-watchman@^2.0.0: 3610fb-watchman@^2.0.0:
3038 version "2.0.0" 3611 version "2.0.0"
3039 resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" 3612 resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
3613 integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=
3040 dependencies: 3614 dependencies:
3041 bser "^2.0.0" 3615 bser "^2.0.0"
3042 3616
3043figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: 3617figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
3044 version "3.5.1" 3618 version "3.5.1"
3045 resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" 3619 resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
3620 integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
3046 3621
3047figures@^2.0.0: 3622figures@^2.0.0:
3048 version "2.0.0" 3623 version "2.0.0"
3049 resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 3624 resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
3625 integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
3050 dependencies: 3626 dependencies:
3051 escape-string-regexp "^1.0.5" 3627 escape-string-regexp "^1.0.5"
3052 3628
3053file-loader@^1.1.11: 3629file-loader@3.0.1:
3054 version "1.1.11" 3630 version "3.0.1"
3055 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" 3631 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
3632 integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
3056 dependencies: 3633 dependencies:
3057 loader-utils "^1.0.2" 3634 loader-utils "^1.0.2"
3058 schema-utils "^0.4.5" 3635 schema-utils "^1.0.0"
3059 3636
3060file-loader@^2.0.0: 3637file-loader@^2.0.0:
3061 version "2.0.0" 3638 version "2.0.0"
3062 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" 3639 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde"
3640 integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==
3063 dependencies: 3641 dependencies:
3064 loader-utils "^1.0.2" 3642 loader-utils "^1.0.2"
3065 schema-utils "^1.0.0" 3643 schema-utils "^1.0.0"
@@ -3067,10 +3645,12 @@ file-loader@^2.0.0:
3067filename-regex@^2.0.0: 3645filename-regex@^2.0.0:
3068 version "2.0.1" 3646 version "2.0.1"
3069 resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 3647 resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
3648 integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
3070 3649
3071fileset@^2.0.2, fileset@^2.0.3: 3650fileset@^2.0.2, fileset@^2.0.3:
3072 version "2.0.3" 3651 version "2.0.3"
3073 resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" 3652 resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
3653 integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=
3074 dependencies: 3654 dependencies:
3075 glob "^7.0.3" 3655 glob "^7.0.3"
3076 minimatch "^3.0.3" 3656 minimatch "^3.0.3"
@@ -3078,10 +3658,12 @@ fileset@^2.0.2, fileset@^2.0.3:
3078filesize@^3.6.1: 3658filesize@^3.6.1:
3079 version "3.6.1" 3659 version "3.6.1"
3080 resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" 3660 resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
3661 integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
3081 3662
3082filestream@^4.0.0: 3663filestream@^4.0.0:
3083 version "4.1.3" 3664 version "4.1.3"
3084 resolved "https://registry.yarnpkg.com/filestream/-/filestream-4.1.3.tgz#948fcaade8221f715f5ecaddc54862faaacc9325" 3665 resolved "https://registry.yarnpkg.com/filestream/-/filestream-4.1.3.tgz#948fcaade8221f715f5ecaddc54862faaacc9325"
3666 integrity sha1-lI/KregiH3FfXsrdxUhi+qrMkyU=
3085 dependencies: 3667 dependencies:
3086 inherits "^2.0.1" 3668 inherits "^2.0.1"
3087 readable-stream "^2.0.5" 3669 readable-stream "^2.0.5"
@@ -3091,6 +3673,7 @@ filestream@^4.0.0:
3091fill-range@^2.1.0: 3673fill-range@^2.1.0:
3092 version "2.2.4" 3674 version "2.2.4"
3093 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" 3675 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
3676 integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
3094 dependencies: 3677 dependencies:
3095 is-number "^2.1.0" 3678 is-number "^2.1.0"
3096 isobject "^2.0.0" 3679 isobject "^2.0.0"
@@ -3101,6 +3684,7 @@ fill-range@^2.1.0:
3101fill-range@^4.0.0: 3684fill-range@^4.0.0:
3102 version "4.0.0" 3685 version "4.0.0"
3103 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 3686 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
3687 integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
3104 dependencies: 3688 dependencies:
3105 extend-shallow "^2.0.1" 3689 extend-shallow "^2.0.1"
3106 is-number "^3.0.0" 3690 is-number "^3.0.0"
@@ -3110,6 +3694,7 @@ fill-range@^4.0.0:
3110finalhandler@1.1.0: 3694finalhandler@1.1.0:
3111 version "1.1.0" 3695 version "1.1.0"
3112 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" 3696 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
3697 integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=
3113 dependencies: 3698 dependencies:
3114 debug "2.6.9" 3699 debug "2.6.9"
3115 encodeurl "~1.0.1" 3700 encodeurl "~1.0.1"
@@ -3122,6 +3707,7 @@ finalhandler@1.1.0:
3122finalhandler@1.1.1: 3707finalhandler@1.1.1:
3123 version "1.1.1" 3708 version "1.1.1"
3124 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 3709 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
3710 integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==
3125 dependencies: 3711 dependencies:
3126 debug "2.6.9" 3712 debug "2.6.9"
3127 encodeurl "~1.0.2" 3713 encodeurl "~1.0.2"
@@ -3134,6 +3720,7 @@ finalhandler@1.1.1:
3134find-cache-dir@^1.0.0: 3720find-cache-dir@^1.0.0:
3135 version "1.0.0" 3721 version "1.0.0"
3136 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" 3722 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
3723 integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
3137 dependencies: 3724 dependencies:
3138 commondir "^1.0.1" 3725 commondir "^1.0.1"
3139 make-dir "^1.0.0" 3726 make-dir "^1.0.0"
@@ -3142,6 +3729,7 @@ find-cache-dir@^1.0.0:
3142find-cache-dir@^2.0.0: 3729find-cache-dir@^2.0.0:
3143 version "2.0.0" 3730 version "2.0.0"
3144 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" 3731 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d"
3732 integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==
3145 dependencies: 3733 dependencies:
3146 commondir "^1.0.1" 3734 commondir "^1.0.1"
3147 make-dir "^1.0.0" 3735 make-dir "^1.0.0"
@@ -3150,6 +3738,7 @@ find-cache-dir@^2.0.0:
3150find-up@^1.0.0: 3738find-up@^1.0.0:
3151 version "1.1.2" 3739 version "1.1.2"
3152 resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 3740 resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
3741 integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
3153 dependencies: 3742 dependencies:
3154 path-exists "^2.0.0" 3743 path-exists "^2.0.0"
3155 pinkie-promise "^2.0.0" 3744 pinkie-promise "^2.0.0"
@@ -3157,22 +3746,31 @@ find-up@^1.0.0:
3157find-up@^2.0.0, find-up@^2.1.0: 3746find-up@^2.0.0, find-up@^2.1.0:
3158 version "2.1.0" 3747 version "2.1.0"
3159 resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 3748 resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
3749 integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
3160 dependencies: 3750 dependencies:
3161 locate-path "^2.0.0" 3751 locate-path "^2.0.0"
3162 3752
3163find-up@^3.0.0: 3753find-up@^3.0.0:
3164 version "3.0.0" 3754 version "3.0.0"
3165 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 3755 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
3756 integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
3166 dependencies: 3757 dependencies:
3167 locate-path "^3.0.0" 3758 locate-path "^3.0.0"
3168 3759
3760flatted@^2.0.0:
3761 version "2.0.0"
3762 resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
3763 integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
3764
3169flatten@^1.0.2: 3765flatten@^1.0.2:
3170 version "1.0.2" 3766 version "1.0.2"
3171 resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 3767 resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
3768 integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
3172 3769
3173flush-write-stream@^1.0.0: 3770flush-write-stream@^1.0.0:
3174 version "1.0.3" 3771 version "1.0.3"
3175 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" 3772 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
3773 integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==
3176 dependencies: 3774 dependencies:
3177 inherits "^2.0.1" 3775 inherits "^2.0.1"
3178 readable-stream "^2.0.4" 3776 readable-stream "^2.0.4"
@@ -3180,68 +3778,81 @@ flush-write-stream@^1.0.0:
3180focus-visible@^4.1.5: 3778focus-visible@^4.1.5:
3181 version "4.1.5" 3779 version "4.1.5"
3182 resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-4.1.5.tgz#50b44e2e84c24b831ceca3cce84d57c2b311c855" 3780 resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-4.1.5.tgz#50b44e2e84c24b831ceca3cce84d57c2b311c855"
3781 integrity sha512-yo/njtk/BB4Z2euzaZe3CZrg4u5s5uEi7ZwbHBJS2quHx51N0mmcx9nTIiImUGlgy+vf26d0CcQluahBBBL/Fw==
3183 3782
3184follow-redirects@^1.0.0: 3783follow-redirects@^1.0.0:
3185 version "1.5.8" 3784 version "1.5.10"
3186 resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1" 3785 resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
3786 integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
3187 dependencies: 3787 dependencies:
3188 debug "=3.1.0" 3788 debug "=3.1.0"
3189 3789
3190for-each@^0.3.2: 3790for-each@^0.3.2:
3191 version "0.3.3" 3791 version "0.3.3"
3192 resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 3792 resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
3793 integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
3193 dependencies: 3794 dependencies:
3194 is-callable "^1.1.3" 3795 is-callable "^1.1.3"
3195 3796
3196for-in@^0.1.3: 3797for-in@^0.1.3:
3197 version "0.1.8" 3798 version "0.1.8"
3198 resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" 3799 resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
3800 integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
3199 3801
3200for-in@^1.0.1, for-in@^1.0.2: 3802for-in@^1.0.1, for-in@^1.0.2:
3201 version "1.0.2" 3803 version "1.0.2"
3202 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 3804 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
3805 integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
3203 3806
3204for-own@^0.1.4: 3807for-own@^0.1.4:
3205 version "0.1.5" 3808 version "0.1.5"
3206 resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 3809 resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
3810 integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
3207 dependencies: 3811 dependencies:
3208 for-in "^1.0.1" 3812 for-in "^1.0.1"
3209 3813
3210for-own@^1.0.0: 3814for-own@^1.0.0:
3211 version "1.0.0" 3815 version "1.0.0"
3212 resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 3816 resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
3817 integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
3213 dependencies: 3818 dependencies:
3214 for-in "^1.0.1" 3819 for-in "^1.0.1"
3215 3820
3216forever-agent@~0.6.1: 3821forever-agent@~0.6.1:
3217 version "0.6.1" 3822 version "0.6.1"
3218 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 3823 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
3824 integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
3219 3825
3220form-data@~2.3.1, form-data@~2.3.2: 3826form-data@~2.3.2:
3221 version "2.3.2" 3827 version "2.3.3"
3222 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 3828 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
3829 integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
3223 dependencies: 3830 dependencies:
3224 asynckit "^0.4.0" 3831 asynckit "^0.4.0"
3225 combined-stream "1.0.6" 3832 combined-stream "^1.0.6"
3226 mime-types "^2.1.12" 3833 mime-types "^2.1.12"
3227 3834
3228forwarded@~0.1.2: 3835forwarded@~0.1.2:
3229 version "0.1.2" 3836 version "0.1.2"
3230 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 3837 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
3838 integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
3231 3839
3232fragment-cache@^0.2.1: 3840fragment-cache@^0.2.1:
3233 version "0.2.1" 3841 version "0.2.1"
3234 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 3842 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
3843 integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
3235 dependencies: 3844 dependencies:
3236 map-cache "^0.2.2" 3845 map-cache "^0.2.2"
3237 3846
3238fresh@0.5.2: 3847fresh@0.5.2:
3239 version "0.5.2" 3848 version "0.5.2"
3240 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 3849 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
3850 integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
3241 3851
3242from2@^2.1.0: 3852from2@^2.1.0:
3243 version "2.3.0" 3853 version "2.3.0"
3244 resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 3854 resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
3855 integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
3245 dependencies: 3856 dependencies:
3246 inherits "^2.0.1" 3857 inherits "^2.0.1"
3247 readable-stream "^2.0.0" 3858 readable-stream "^2.0.0"
@@ -3249,12 +3860,14 @@ from2@^2.1.0:
3249fs-access@^1.0.0: 3860fs-access@^1.0.0:
3250 version "1.0.1" 3861 version "1.0.1"
3251 resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" 3862 resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
3863 integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=
3252 dependencies: 3864 dependencies:
3253 null-check "^1.0.0" 3865 null-check "^1.0.0"
3254 3866
3255fs-chunk-store@^1.6.2: 3867fs-chunk-store@^1.6.2:
3256 version "1.7.0" 3868 version "1.7.0"
3257 resolved "https://registry.yarnpkg.com/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz#1c4bcbe93c99af10aa04b65348f2bb27377a4010" 3869 resolved "https://registry.yarnpkg.com/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz#1c4bcbe93c99af10aa04b65348f2bb27377a4010"
3870 integrity sha512-KhjJmZAs2eqfhCb6PdPx4RcZtheGTz86tpTC5JTvqBn/xda+Nb+0C7dCyjOSN7T76H6a56LvH0SVXQMchLXDRw==
3258 dependencies: 3871 dependencies:
3259 mkdirp "^0.5.1" 3872 mkdirp "^0.5.1"
3260 random-access-file "^2.0.1" 3873 random-access-file "^2.0.1"
@@ -3266,6 +3879,7 @@ fs-chunk-store@^1.6.2:
3266fs-extra@6.0.1: 3879fs-extra@6.0.1:
3267 version "6.0.1" 3880 version "6.0.1"
3268 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" 3881 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
3882 integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==
3269 dependencies: 3883 dependencies:
3270 graceful-fs "^4.1.2" 3884 graceful-fs "^4.1.2"
3271 jsonfile "^4.0.0" 3885 jsonfile "^4.0.0"
@@ -3274,12 +3888,14 @@ fs-extra@6.0.1:
3274fs-minipass@^1.2.5: 3888fs-minipass@^1.2.5:
3275 version "1.2.5" 3889 version "1.2.5"
3276 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 3890 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
3891 integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
3277 dependencies: 3892 dependencies:
3278 minipass "^2.2.1" 3893 minipass "^2.2.1"
3279 3894
3280fs-write-stream-atomic@^1.0.8: 3895fs-write-stream-atomic@^1.0.8:
3281 version "1.0.10" 3896 version "1.0.10"
3282 resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 3897 resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
3898 integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
3283 dependencies: 3899 dependencies:
3284 graceful-fs "^4.1.2" 3900 graceful-fs "^4.1.2"
3285 iferr "^0.1.5" 3901 iferr "^0.1.5"
@@ -3289,10 +3905,12 @@ fs-write-stream-atomic@^1.0.8:
3289fs.realpath@^1.0.0: 3905fs.realpath@^1.0.0:
3290 version "1.0.0" 3906 version "1.0.0"
3291 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 3907 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
3908 integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
3292 3909
3293fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.3: 3910fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.3:
3294 version "1.2.4" 3911 version "1.2.4"
3295 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 3912 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
3913 integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==
3296 dependencies: 3914 dependencies:
3297 nan "^2.9.2" 3915 nan "^2.9.2"
3298 node-pre-gyp "^0.10.0" 3916 node-pre-gyp "^0.10.0"
@@ -3300,6 +3918,7 @@ fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.3:
3300fstream@^1.0.0, fstream@^1.0.2: 3918fstream@^1.0.0, fstream@^1.0.2:
3301 version "1.0.11" 3919 version "1.0.11"
3302 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 3920 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
3921 integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
3303 dependencies: 3922 dependencies:
3304 graceful-fs "^4.1.2" 3923 graceful-fs "^4.1.2"
3305 inherits "~2.0.0" 3924 inherits "~2.0.0"
@@ -3309,10 +3928,12 @@ fstream@^1.0.0, fstream@^1.0.2:
3309function-bind@^1.1.1: 3928function-bind@^1.1.1:
3310 version "1.1.1" 3929 version "1.1.1"
3311 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 3930 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
3931 integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
3312 3932
3313gauge@~2.7.3: 3933gauge@~2.7.3:
3314 version "2.7.4" 3934 version "2.7.4"
3315 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 3935 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
3936 integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
3316 dependencies: 3937 dependencies:
3317 aproba "^1.0.3" 3938 aproba "^1.0.3"
3318 console-control-strings "^1.0.0" 3939 console-control-strings "^1.0.0"
@@ -3326,42 +3947,63 @@ gauge@~2.7.3:
3326gaze@^1.0.0: 3947gaze@^1.0.0:
3327 version "1.1.3" 3948 version "1.1.3"
3328 resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" 3949 resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
3950 integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
3329 dependencies: 3951 dependencies:
3330 globule "^1.0.0" 3952 globule "^1.0.0"
3331 3953
3332get-browser-rtc@^1.0.0: 3954genfun@^5.0.0:
3955 version "5.0.0"
3956 resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
3957 integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
3958
3959get-browser-rtc@^1.0.0, get-browser-rtc@^1.0.2:
3333 version "1.0.2" 3960 version "1.0.2"
3334 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9" 3961 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9"
3962 integrity sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=
3335 3963
3336get-caller-file@^1.0.1: 3964get-caller-file@^1.0.1:
3337 version "1.0.3" 3965 version "1.0.3"
3338 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 3966 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
3967 integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
3339 3968
3340get-stdin@^4.0.1: 3969get-stdin@^4.0.1:
3341 version "4.0.1" 3970 version "4.0.1"
3342 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 3971 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
3972 integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
3343 3973
3344get-stdin@^6.0.0: 3974get-stdin@^6.0.0:
3345 version "6.0.0" 3975 version "6.0.0"
3346 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 3976 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
3977 integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
3347 3978
3348get-stream@^3.0.0: 3979get-stream@^3.0.0:
3349 version "3.0.0" 3980 version "3.0.0"
3350 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 3981 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
3982 integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
3983
3984get-stream@^4.1.0:
3985 version "4.1.0"
3986 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
3987 integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
3988 dependencies:
3989 pump "^3.0.0"
3351 3990
3352get-value@^2.0.3, get-value@^2.0.6: 3991get-value@^2.0.3, get-value@^2.0.6:
3353 version "2.0.6" 3992 version "2.0.6"
3354 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 3993 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
3994 integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
3355 3995
3356getpass@^0.1.1: 3996getpass@^0.1.1:
3357 version "0.1.7" 3997 version "0.1.7"
3358 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 3998 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
3999 integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
3359 dependencies: 4000 dependencies:
3360 assert-plus "^1.0.0" 4001 assert-plus "^1.0.0"
3361 4002
3362glob-base@^0.3.0: 4003glob-base@^0.3.0:
3363 version "0.3.0" 4004 version "0.3.0"
3364 resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 4005 resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
4006 integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
3365 dependencies: 4007 dependencies:
3366 glob-parent "^2.0.0" 4008 glob-parent "^2.0.0"
3367 is-glob "^2.0.0" 4009 is-glob "^2.0.0"
@@ -3369,12 +4011,14 @@ glob-base@^0.3.0:
3369glob-parent@^2.0.0: 4011glob-parent@^2.0.0:
3370 version "2.0.0" 4012 version "2.0.0"
3371 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 4013 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
4014 integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
3372 dependencies: 4015 dependencies:
3373 is-glob "^2.0.0" 4016 is-glob "^2.0.0"
3374 4017
3375glob-parent@^3.1.0: 4018glob-parent@^3.1.0:
3376 version "3.1.0" 4019 version "3.1.0"
3377 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 4020 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
4021 integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
3378 dependencies: 4022 dependencies:
3379 is-glob "^3.1.0" 4023 is-glob "^3.1.0"
3380 path-dirname "^1.0.0" 4024 path-dirname "^1.0.0"
@@ -3382,6 +4026,7 @@ glob-parent@^3.1.0:
3382glob@7.0.x: 4026glob@7.0.x:
3383 version "7.0.6" 4027 version "7.0.6"
3384 resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" 4028 resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
4029 integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
3385 dependencies: 4030 dependencies:
3386 fs.realpath "^1.0.0" 4031 fs.realpath "^1.0.0"
3387 inflight "^1.0.4" 4032 inflight "^1.0.4"
@@ -3393,6 +4038,7 @@ glob@7.0.x:
3393glob@7.1.2: 4038glob@7.1.2:
3394 version "7.1.2" 4039 version "7.1.2"
3395 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 4040 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
4041 integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
3396 dependencies: 4042 dependencies:
3397 fs.realpath "^1.0.0" 4043 fs.realpath "^1.0.0"
3398 inflight "^1.0.4" 4044 inflight "^1.0.4"
@@ -3401,19 +4047,10 @@ glob@7.1.2:
3401 once "^1.3.0" 4047 once "^1.3.0"
3402 path-is-absolute "^1.0.0" 4048 path-is-absolute "^1.0.0"
3403 4049
3404glob@^5.0.15: 4050glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
3405 version "5.0.15"
3406 resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
3407 dependencies:
3408 inflight "^1.0.4"
3409 inherits "2"
3410 minimatch "2 || 3"
3411 once "^1.3.0"
3412 path-is-absolute "^1.0.0"
3413
3414glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
3415 version "7.1.3" 4051 version "7.1.3"
3416 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 4052 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
4053 integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
3417 dependencies: 4054 dependencies:
3418 fs.realpath "^1.0.0" 4055 fs.realpath "^1.0.0"
3419 inflight "^1.0.4" 4056 inflight "^1.0.4"
@@ -3422,28 +4059,33 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, gl
3422 once "^1.3.0" 4059 once "^1.3.0"
3423 path-is-absolute "^1.0.0" 4060 path-is-absolute "^1.0.0"
3424 4061
3425global-modules-path@^2.1.0: 4062global-modules-path@^2.3.0:
3426 version "2.3.0" 4063 version "2.3.1"
3427 resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" 4064 resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931"
4065 integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==
3428 4066
3429global@4.3.2, global@^4.3.0, global@^4.3.1, global@^4.3.2, global@~4.3.0: 4067global@4.3.2, global@^4.3.0, global@^4.3.1, global@^4.3.2, global@~4.3.0:
3430 version "4.3.2" 4068 version "4.3.2"
3431 resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" 4069 resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
4070 integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
3432 dependencies: 4071 dependencies:
3433 min-document "^2.19.0" 4072 min-document "^2.19.0"
3434 process "~0.5.1" 4073 process "~0.5.1"
3435 4074
3436globals@^11.1.0: 4075globals@^11.1.0:
3437 version "11.7.0" 4076 version "11.9.0"
3438 resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 4077 resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
4078 integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==
3439 4079
3440globals@^9.18.0: 4080globals@^9.18.0:
3441 version "9.18.0" 4081 version "9.18.0"
3442 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 4082 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
4083 integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
3443 4084
3444globby@^5.0.0: 4085globby@^5.0.0:
3445 version "5.0.0" 4086 version "5.0.0"
3446 resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 4087 resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
4088 integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=
3447 dependencies: 4089 dependencies:
3448 array-union "^1.0.1" 4090 array-union "^1.0.1"
3449 arrify "^1.0.0" 4091 arrify "^1.0.0"
@@ -3455,6 +4097,7 @@ globby@^5.0.0:
3455globby@^6.1.0: 4097globby@^6.1.0:
3456 version "6.1.0" 4098 version "6.1.0"
3457 resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 4099 resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
4100 integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
3458 dependencies: 4101 dependencies:
3459 array-union "^1.0.1" 4102 array-union "^1.0.1"
3460 glob "^7.0.3" 4103 glob "^7.0.3"
@@ -3465,6 +4108,7 @@ globby@^6.1.0:
3465globby@^7.1.1: 4108globby@^7.1.1:
3466 version "7.1.1" 4109 version "7.1.1"
3467 resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" 4110 resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
4111 integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA=
3468 dependencies: 4112 dependencies:
3469 array-union "^1.0.1" 4113 array-union "^1.0.1"
3470 dir-glob "^2.0.0" 4114 dir-glob "^2.0.0"
@@ -3476,33 +4120,39 @@ globby@^7.1.1:
3476globule@^1.0.0: 4120globule@^1.0.0:
3477 version "1.2.1" 4121 version "1.2.1"
3478 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" 4122 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
4123 integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
3479 dependencies: 4124 dependencies:
3480 glob "~7.1.1" 4125 glob "~7.1.1"
3481 lodash "~4.17.10" 4126 lodash "~4.17.10"
3482 minimatch "~3.0.2" 4127 minimatch "~3.0.2"
3483 4128
3484graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 4129graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
3485 version "4.1.11" 4130 version "4.1.15"
3486 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 4131 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
4132 integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
3487 4133
3488growly@^1.3.0: 4134growly@^1.3.0:
3489 version "1.3.0" 4135 version "1.3.0"
3490 resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 4136 resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
4137 integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
3491 4138
3492gzip-size@^5.0.0: 4139gzip-size@^5.0.0:
3493 version "5.0.0" 4140 version "5.0.0"
3494 resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" 4141 resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80"
4142 integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==
3495 dependencies: 4143 dependencies:
3496 duplexer "^0.1.1" 4144 duplexer "^0.1.1"
3497 pify "^3.0.0" 4145 pify "^3.0.0"
3498 4146
3499handle-thing@^1.2.5: 4147handle-thing@^2.0.0:
3500 version "1.2.5" 4148 version "2.0.0"
3501 resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" 4149 resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
4150 integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
3502 4151
3503handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.3: 4152handlebars@^4.0.11, handlebars@^4.0.3:
3504 version "4.0.12" 4153 version "4.0.12"
3505 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" 4154 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
4155 integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==
3506 dependencies: 4156 dependencies:
3507 async "^2.5.0" 4157 async "^2.5.0"
3508 optimist "^0.6.1" 4158 optimist "^0.6.1"
@@ -3513,56 +4163,59 @@ handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.3:
3513har-schema@^2.0.0: 4163har-schema@^2.0.0:
3514 version "2.0.0" 4164 version "2.0.0"
3515 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 4165 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
3516 4166 integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
3517har-validator@~5.0.3:
3518 version "5.0.3"
3519 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
3520 dependencies:
3521 ajv "^5.1.0"
3522 har-schema "^2.0.0"
3523 4167
3524har-validator@~5.1.0: 4168har-validator@~5.1.0:
3525 version "5.1.0" 4169 version "5.1.3"
3526 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" 4170 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
4171 integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
3527 dependencies: 4172 dependencies:
3528 ajv "^5.3.0" 4173 ajv "^6.5.5"
3529 har-schema "^2.0.0" 4174 har-schema "^2.0.0"
3530 4175
3531has-ansi@^2.0.0: 4176has-ansi@^2.0.0:
3532 version "2.0.0" 4177 version "2.0.0"
3533 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 4178 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
4179 integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
3534 dependencies: 4180 dependencies:
3535 ansi-regex "^2.0.0" 4181 ansi-regex "^2.0.0"
3536 4182
3537has-binary2@~1.0.2: 4183has-binary2@~1.0.2:
3538 version "1.0.3" 4184 version "1.0.3"
3539 resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" 4185 resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
4186 integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
3540 dependencies: 4187 dependencies:
3541 isarray "2.0.1" 4188 isarray "2.0.1"
3542 4189
3543has-cors@1.1.0: 4190has-cors@1.1.0:
3544 version "1.1.0" 4191 version "1.1.0"
3545 resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 4192 resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
4193 integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
3546 4194
3547has-flag@^1.0.0: 4195has-flag@^1.0.0:
3548 version "1.0.0" 4196 version "1.0.0"
3549 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 4197 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
4198 integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
3550 4199
3551has-flag@^3.0.0: 4200has-flag@^3.0.0:
3552 version "3.0.0" 4201 version "3.0.0"
3553 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 4202 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
4203 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
3554 4204
3555has-symbols@^1.0.0: 4205has-symbols@^1.0.0:
3556 version "1.0.0" 4206 version "1.0.0"
3557 resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 4207 resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
4208 integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
3558 4209
3559has-unicode@^2.0.0: 4210has-unicode@^2.0.0:
3560 version "2.0.1" 4211 version "2.0.1"
3561 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 4212 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
4213 integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
3562 4214
3563has-value@^0.3.1: 4215has-value@^0.3.1:
3564 version "0.3.1" 4216 version "0.3.1"
3565 resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 4217 resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
4218 integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
3566 dependencies: 4219 dependencies:
3567 get-value "^2.0.3" 4220 get-value "^2.0.3"
3568 has-values "^0.1.4" 4221 has-values "^0.1.4"
@@ -3571,6 +4224,7 @@ has-value@^0.3.1:
3571has-value@^1.0.0: 4224has-value@^1.0.0:
3572 version "1.0.0" 4225 version "1.0.0"
3573 resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 4226 resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
4227 integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
3574 dependencies: 4228 dependencies:
3575 get-value "^2.0.6" 4229 get-value "^2.0.6"
3576 has-values "^1.0.0" 4230 has-values "^1.0.0"
@@ -3579,10 +4233,12 @@ has-value@^1.0.0:
3579has-values@^0.1.4: 4233has-values@^0.1.4:
3580 version "0.1.4" 4234 version "0.1.4"
3581 resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 4235 resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
4236 integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
3582 4237
3583has-values@^1.0.0: 4238has-values@^1.0.0:
3584 version "1.0.0" 4239 version "1.0.0"
3585 resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 4240 resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
4241 integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
3586 dependencies: 4242 dependencies:
3587 is-number "^3.0.0" 4243 is-number "^3.0.0"
3588 kind-of "^4.0.0" 4244 kind-of "^4.0.0"
@@ -3590,30 +4246,43 @@ has-values@^1.0.0:
3590has@^1.0.1: 4246has@^1.0.1:
3591 version "1.0.3" 4247 version "1.0.3"
3592 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 4248 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
4249 integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
3593 dependencies: 4250 dependencies:
3594 function-bind "^1.1.1" 4251 function-bind "^1.1.1"
3595 4252
3596hash-base@^3.0.0: 4253hash-base@^3.0.0:
3597 version "3.0.4" 4254 version "3.0.4"
3598 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 4255 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
4256 integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
3599 dependencies: 4257 dependencies:
3600 inherits "^2.0.1" 4258 inherits "^2.0.1"
3601 safe-buffer "^5.0.1" 4259 safe-buffer "^5.0.1"
3602 4260
3603hash.js@^1.0.0, hash.js@^1.0.3: 4261hash.js@^1.0.0, hash.js@^1.0.3:
3604 version "1.1.5" 4262 version "1.1.7"
3605 resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" 4263 resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
4264 integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
3606 dependencies: 4265 dependencies:
3607 inherits "^2.0.3" 4266 inherits "^2.0.3"
3608 minimalistic-assert "^1.0.1" 4267 minimalistic-assert "^1.0.1"
3609 4268
3610he@1.1.x: 4269he@1.2.x:
3611 version "1.1.1" 4270 version "1.2.0"
3612 resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 4271 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
4272 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
4273
4274hls.js@^0.12.2:
4275 version "0.12.2"
4276 resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.12.2.tgz#64a969a78cc25991ed5de19357b1dc3f178ac23b"
4277 integrity sha512-lQBSXggw9OzEuaUllUBoSxPcf7neFgnEiDRfCdCNdIPtUeV7vXZ0OeASx6EWtZTBiqSSPigoOX1Y+AR5dA1Feg==
4278 dependencies:
4279 eventemitter3 "3.1.0"
4280 url-toolkit "^2.1.6"
3613 4281
3614hmac-drbg@^1.0.0: 4282hmac-drbg@^1.0.0:
3615 version "1.0.1" 4283 version "1.0.1"
3616 resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 4284 resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
4285 integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
3617 dependencies: 4286 dependencies:
3618 hash.js "^1.0.3" 4287 hash.js "^1.0.3"
3619 minimalistic-assert "^1.0.0" 4288 minimalistic-assert "^1.0.0"
@@ -3622,6 +4291,7 @@ hmac-drbg@^1.0.0:
3622home-or-tmp@^2.0.0: 4291home-or-tmp@^2.0.0:
3623 version "2.0.0" 4292 version "2.0.0"
3624 resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 4293 resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
4294 integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
3625 dependencies: 4295 dependencies:
3626 os-homedir "^1.0.0" 4296 os-homedir "^1.0.0"
3627 os-tmpdir "^1.0.1" 4297 os-tmpdir "^1.0.1"
@@ -3629,14 +4299,17 @@ home-or-tmp@^2.0.0:
3629hoopy@^0.1.2: 4299hoopy@^0.1.2:
3630 version "0.1.4" 4300 version "0.1.4"
3631 resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" 4301 resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
4302 integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
3632 4303
3633hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: 4304hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
3634 version "2.7.1" 4305 version "2.7.1"
3635 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 4306 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
4307 integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
3636 4308
3637hpack.js@^2.1.6: 4309hpack.js@^2.1.6:
3638 version "2.1.6" 4310 version "2.1.6"
3639 resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" 4311 resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
4312 integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
3640 dependencies: 4313 dependencies:
3641 inherits "^2.0.1" 4314 inherits "^2.0.1"
3642 obuf "^1.0.0" 4315 obuf "^1.0.0"
@@ -3646,16 +4319,19 @@ hpack.js@^2.1.6:
3646html-encoding-sniffer@^1.0.2: 4319html-encoding-sniffer@^1.0.2:
3647 version "1.0.2" 4320 version "1.0.2"
3648 resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" 4321 resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
4322 integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
3649 dependencies: 4323 dependencies:
3650 whatwg-encoding "^1.0.1" 4324 whatwg-encoding "^1.0.1"
3651 4325
3652html-entities@^1.2.0: 4326html-entities@^1.2.0:
3653 version "1.2.1" 4327 version "1.2.1"
3654 resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" 4328 resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
4329 integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=
3655 4330
3656html-loader@^0.5.5: 4331html-loader@^0.5.5:
3657 version "0.5.5" 4332 version "0.5.5"
3658 resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" 4333 resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea"
4334 integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==
3659 dependencies: 4335 dependencies:
3660 es6-templates "^0.2.3" 4336 es6-templates "^0.2.3"
3661 fastparse "^1.1.1" 4337 fastparse "^1.1.1"
@@ -3664,20 +4340,22 @@ html-loader@^0.5.5:
3664 object-assign "^4.1.1" 4340 object-assign "^4.1.1"
3665 4341
3666html-minifier@^3.2.3, html-minifier@^3.5.8: 4342html-minifier@^3.2.3, html-minifier@^3.5.8:
3667 version "3.5.20" 4343 version "3.5.21"
3668 resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" 4344 resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
4345 integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
3669 dependencies: 4346 dependencies:
3670 camel-case "3.0.x" 4347 camel-case "3.0.x"
3671 clean-css "4.2.x" 4348 clean-css "4.2.x"
3672 commander "2.17.x" 4349 commander "2.17.x"
3673 he "1.1.x" 4350 he "1.2.x"
3674 param-case "2.1.x" 4351 param-case "2.1.x"
3675 relateurl "0.2.x" 4352 relateurl "0.2.x"
3676 uglify-js "3.4.x" 4353 uglify-js "3.4.x"
3677 4354
3678html-webpack-plugin@^3.0.6, html-webpack-plugin@^3.2.0: 4355html-webpack-plugin@^3.2.0:
3679 version "3.2.0" 4356 version "3.2.0"
3680 resolved "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" 4357 resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
4358 integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s=
3681 dependencies: 4359 dependencies:
3682 html-minifier "^3.2.3" 4360 html-minifier "^3.2.3"
3683 loader-utils "^0.2.16" 4361 loader-utils "^0.2.16"
@@ -3687,42 +4365,42 @@ html-webpack-plugin@^3.0.6, html-webpack-plugin@^3.2.0:
3687 toposort "^1.0.0" 4365 toposort "^1.0.0"
3688 util.promisify "1.0.0" 4366 util.promisify "1.0.0"
3689 4367
3690htmlparser2@^3.9.0: 4368htmlparser2@^3.10.0:
3691 version "3.9.2" 4369 version "3.10.0"
3692 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" 4370 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
4371 integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==
3693 dependencies: 4372 dependencies:
3694 domelementtype "^1.3.0" 4373 domelementtype "^1.3.0"
3695 domhandler "^2.3.0" 4374 domhandler "^2.3.0"
3696 domutils "^1.5.1" 4375 domutils "^1.5.1"
3697 entities "^1.1.1" 4376 entities "^1.1.1"
3698 inherits "^2.0.1" 4377 inherits "^2.0.1"
3699 readable-stream "^2.0.2" 4378 readable-stream "^3.0.6"
3700 4379
3701htmlparser2@~3.3.0: 4380htmlparser2@~3.3.0:
3702 version "3.3.0" 4381 version "3.3.0"
3703 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" 4382 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
4383 integrity sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=
3704 dependencies: 4384 dependencies:
3705 domelementtype "1" 4385 domelementtype "1"
3706 domhandler "2.1" 4386 domhandler "2.1"
3707 domutils "1.1" 4387 domutils "1.1"
3708 readable-stream "1.0" 4388 readable-stream "1.0"
3709 4389
4390http-cache-semantics@^3.8.1:
4391 version "3.8.1"
4392 resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
4393 integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
4394
3710http-deceiver@^1.2.7: 4395http-deceiver@^1.2.7:
3711 version "1.2.7" 4396 version "1.2.7"
3712 resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" 4397 resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
3713 4398 integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
3714http-errors@1.6.2:
3715 version "1.6.2"
3716 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
3717 dependencies:
3718 depd "1.1.1"
3719 inherits "2.0.3"
3720 setprototypeof "1.0.3"
3721 statuses ">= 1.3.1 < 2"
3722 4399
3723http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 4400http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
3724 version "1.6.3" 4401 version "1.6.3"
3725 resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 4402 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
4403 integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
3726 dependencies: 4404 dependencies:
3727 depd "~1.1.2" 4405 depd "~1.1.2"
3728 inherits "2.0.3" 4406 inherits "2.0.3"
@@ -3730,12 +4408,22 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
3730 statuses ">= 1.4.0 < 2" 4408 statuses ">= 1.4.0 < 2"
3731 4409
3732http-parser-js@>=0.4.0: 4410http-parser-js@>=0.4.0:
3733 version "0.4.13" 4411 version "0.5.0"
3734 resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" 4412 resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8"
4413 integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==
4414
4415http-proxy-agent@^2.1.0:
4416 version "2.1.0"
4417 resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
4418 integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
4419 dependencies:
4420 agent-base "4"
4421 debug "3.1.0"
3735 4422
3736http-proxy-middleware@~0.18.0: 4423http-proxy-middleware@~0.18.0:
3737 version "0.18.0" 4424 version "0.18.0"
3738 resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" 4425 resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab"
4426 integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==
3739 dependencies: 4427 dependencies:
3740 http-proxy "^1.16.2" 4428 http-proxy "^1.16.2"
3741 is-glob "^4.0.0" 4429 is-glob "^4.0.0"
@@ -3745,6 +4433,7 @@ http-proxy-middleware@~0.18.0:
3745http-proxy@^1.13.0, http-proxy@^1.16.2: 4433http-proxy@^1.13.0, http-proxy@^1.16.2:
3746 version "1.17.0" 4434 version "1.17.0"
3747 resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" 4435 resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
4436 integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==
3748 dependencies: 4437 dependencies:
3749 eventemitter3 "^3.0.0" 4438 eventemitter3 "^3.0.0"
3750 follow-redirects "^1.0.0" 4439 follow-redirects "^1.0.0"
@@ -3753,6 +4442,7 @@ http-proxy@^1.13.0, http-proxy@^1.16.2:
3753http-signature@~1.2.0: 4442http-signature@~1.2.0:
3754 version "1.2.0" 4443 version "1.2.0"
3755 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 4444 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
4445 integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
3756 dependencies: 4446 dependencies:
3757 assert-plus "^1.0.0" 4447 assert-plus "^1.0.0"
3758 jsprim "^1.2.2" 4448 jsprim "^1.2.2"
@@ -3761,85 +4451,104 @@ http-signature@~1.2.0:
3761https-browserify@^1.0.0: 4451https-browserify@^1.0.0:
3762 version "1.0.0" 4452 version "1.0.0"
3763 resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 4453 resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
4454 integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
3764 4455
3765https-proxy-agent@^2.2.1: 4456https-proxy-agent@^2.2.1:
3766 version "2.2.1" 4457 version "2.2.1"
3767 resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 4458 resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
4459 integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
3768 dependencies: 4460 dependencies:
3769 agent-base "^4.1.0" 4461 agent-base "^4.1.0"
3770 debug "^3.1.0" 4462 debug "^3.1.0"
3771 4463
3772iconv-lite@0.4.19: 4464humanize-ms@^1.2.1:
3773 version "0.4.19" 4465 version "1.2.1"
3774 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 4466 resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
4467 integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
4468 dependencies:
4469 ms "^2.0.0"
3775 4470
3776iconv-lite@0.4.23: 4471iconv-lite@0.4.23:
3777 version "0.4.23" 4472 version "0.4.23"
3778 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 4473 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
4474 integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==
3779 dependencies: 4475 dependencies:
3780 safer-buffer ">= 2.1.2 < 3" 4476 safer-buffer ">= 2.1.2 < 3"
3781 4477
3782iconv-lite@^0.4.24, iconv-lite@^0.4.4: 4478iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
3783 version "0.4.24" 4479 version "0.4.24"
3784 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 4480 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
4481 integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
3785 dependencies: 4482 dependencies:
3786 safer-buffer ">= 2.1.2 < 3" 4483 safer-buffer ">= 2.1.2 < 3"
3787 4484
3788icss-replace-symbols@^1.1.0: 4485icss-replace-symbols@^1.1.0:
3789 version "1.1.0" 4486 version "1.1.0"
3790 resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 4487 resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
4488 integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
3791 4489
3792icss-utils@^2.1.0: 4490icss-utils@^2.1.0:
3793 version "2.1.0" 4491 version "2.1.0"
3794 resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" 4492 resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
4493 integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
3795 dependencies: 4494 dependencies:
3796 postcss "^6.0.1" 4495 postcss "^6.0.1"
3797 4496
3798ieee754@^1.1.4: 4497ieee754@^1.1.4:
3799 version "1.1.12" 4498 version "1.1.12"
3800 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" 4499 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
4500 integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
3801 4501
3802iferr@^0.1.5: 4502iferr@^0.1.5:
3803 version "0.1.5" 4503 version "0.1.5"
3804 resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 4504 resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
4505 integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
3805 4506
3806ignore-walk@^3.0.1: 4507ignore-walk@^3.0.1:
3807 version "3.0.1" 4508 version "3.0.1"
3808 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 4509 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
4510 integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
3809 dependencies: 4511 dependencies:
3810 minimatch "^3.0.4" 4512 minimatch "^3.0.4"
3811 4513
3812ignore@^3.3.5: 4514ignore@^3.3.5:
3813 version "3.3.10" 4515 version "3.3.10"
3814 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 4516 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
4517 integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
3815 4518
3816image-size@~0.5.0: 4519image-size@~0.5.0:
3817 version "0.5.5" 4520 version "0.5.5"
3818 resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" 4521 resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
4522 integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
3819 4523
3820immediate-chunk-store@^2.0.0: 4524immediate-chunk-store@^2.0.0:
3821 version "2.0.0" 4525 version "2.0.0"
3822 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.0.0.tgz#f313fd0cc71396d8911ad031179e1cccfda3da18" 4526 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.0.0.tgz#f313fd0cc71396d8911ad031179e1cccfda3da18"
4527 integrity sha512-5s6NiCGbtWc+OQA60jrre54w12U7tynIyUNjO5LJjNA5lWwvCv6640roq8Wk/wIuaqnd4Pgtp453OyJ7hbONkQ==
3823 4528
3824immediate@~3.0.5: 4529immediate@~3.0.5:
3825 version "3.0.6" 4530 version "3.0.6"
3826 resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 4531 resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
4532 integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
3827 4533
3828import-cwd@^2.0.0: 4534import-cwd@^2.0.0:
3829 version "2.1.0" 4535 version "2.1.0"
3830 resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" 4536 resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
4537 integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
3831 dependencies: 4538 dependencies:
3832 import-from "^2.1.0" 4539 import-from "^2.1.0"
3833 4540
3834import-from@^2.1.0: 4541import-from@^2.1.0:
3835 version "2.1.0" 4542 version "2.1.0"
3836 resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" 4543 resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
4544 integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
3837 dependencies: 4545 dependencies:
3838 resolve-from "^3.0.0" 4546 resolve-from "^3.0.0"
3839 4547
3840import-local@^1.0.0: 4548import-local@^1.0.0:
3841 version "1.0.0" 4549 version "1.0.0"
3842 resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" 4550 resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
4551 integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==
3843 dependencies: 4552 dependencies:
3844 pkg-dir "^2.0.0" 4553 pkg-dir "^2.0.0"
3845 resolve-cwd "^2.0.0" 4554 resolve-cwd "^2.0.0"
@@ -3847,6 +4556,7 @@ import-local@^1.0.0:
3847import-local@^2.0.0: 4556import-local@^2.0.0:
3848 version "2.0.0" 4557 version "2.0.0"
3849 resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" 4558 resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
4559 integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
3850 dependencies: 4560 dependencies:
3851 pkg-dir "^3.0.0" 4561 pkg-dir "^3.0.0"
3852 resolve-cwd "^2.0.0" 4562 resolve-cwd "^2.0.0"
@@ -3854,28 +4564,34 @@ import-local@^2.0.0:
3854imurmurhash@^0.1.4: 4564imurmurhash@^0.1.4:
3855 version "0.1.4" 4565 version "0.1.4"
3856 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 4566 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
4567 integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
3857 4568
3858in-publish@^2.0.0: 4569in-publish@^2.0.0:
3859 version "2.0.0" 4570 version "2.0.0"
3860 resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" 4571 resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
4572 integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
3861 4573
3862indent-string@^2.1.0: 4574indent-string@^2.1.0:
3863 version "2.1.0" 4575 version "2.1.0"
3864 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 4576 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
4577 integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
3865 dependencies: 4578 dependencies:
3866 repeating "^2.0.0" 4579 repeating "^2.0.0"
3867 4580
3868indexof@0.0.1: 4581indexof@0.0.1:
3869 version "0.0.1" 4582 version "0.0.1"
3870 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 4583 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
4584 integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
3871 4585
3872individual@^2.0.0: 4586individual@^2.0.0:
3873 version "2.0.0" 4587 version "2.0.0"
3874 resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97" 4588 resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
4589 integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
3875 4590
3876inflight@^1.0.4: 4591inflight@^1.0.4:
3877 version "1.0.6" 4592 version "1.0.6"
3878 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 4593 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
4594 integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
3879 dependencies: 4595 dependencies:
3880 once "^1.3.0" 4596 once "^1.3.0"
3881 wrappy "1" 4597 wrappy "1"
@@ -3883,18 +4599,22 @@ inflight@^1.0.4:
3883inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 4599inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
3884 version "2.0.3" 4600 version "2.0.3"
3885 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 4601 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
4602 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3886 4603
3887inherits@2.0.1: 4604inherits@2.0.1:
3888 version "2.0.1" 4605 version "2.0.1"
3889 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 4606 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
4607 integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
3890 4608
3891ini@^1.3.4, ini@~1.3.0: 4609ini@1.3.5, ini@^1.3.4, ini@~1.3.0:
3892 version "1.3.5" 4610 version "1.3.5"
3893 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 4611 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
4612 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
3894 4613
3895inquirer@^6.0.0: 4614inquirer@6.2.1:
3896 version "6.2.0" 4615 version "6.2.1"
3897 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" 4616 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52"
4617 integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==
3898 dependencies: 4618 dependencies:
3899 ansi-escapes "^3.0.0" 4619 ansi-escapes "^3.0.0"
3900 chalk "^2.0.0" 4620 chalk "^2.0.0"
@@ -3907,121 +4627,144 @@ inquirer@^6.0.0:
3907 run-async "^2.2.0" 4627 run-async "^2.2.0"
3908 rxjs "^6.1.0" 4628 rxjs "^6.1.0"
3909 string-width "^2.1.0" 4629 string-width "^2.1.0"
3910 strip-ansi "^4.0.0" 4630 strip-ansi "^5.0.0"
3911 through "^2.3.6" 4631 through "^2.3.6"
3912 4632
3913internal-ip@^3.0.1: 4633internal-ip@^3.0.1:
3914 version "3.0.1" 4634 version "3.0.1"
3915 resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" 4635 resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27"
4636 integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==
3916 dependencies: 4637 dependencies:
3917 default-gateway "^2.6.0" 4638 default-gateway "^2.6.0"
3918 ipaddr.js "^1.5.2" 4639 ipaddr.js "^1.5.2"
3919 4640
3920interpret@^1.1.0: 4641interpret@^1.0.0, interpret@^1.1.0:
3921 version "1.1.0" 4642 version "1.1.0"
3922 resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" 4643 resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
4644 integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
3923 4645
3924invariant@^2.2.2, invariant@^2.2.4: 4646invariant@^2.2.2, invariant@^2.2.4:
3925 version "2.2.4" 4647 version "2.2.4"
3926 resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 4648 resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
4649 integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
3927 dependencies: 4650 dependencies:
3928 loose-envify "^1.0.0" 4651 loose-envify "^1.0.0"
3929 4652
3930invert-kv@^1.0.0: 4653invert-kv@^1.0.0:
3931 version "1.0.0" 4654 version "1.0.0"
3932 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 4655 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
4656 integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
3933 4657
3934invert-kv@^2.0.0: 4658invert-kv@^2.0.0:
3935 version "2.0.0" 4659 version "2.0.0"
3936 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 4660 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
4661 integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
3937 4662
3938ip-regex@^2.1.0: 4663ip-regex@^2.1.0:
3939 version "2.1.0" 4664 version "2.1.0"
3940 resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" 4665 resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
4666 integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
3941 4667
3942ip-set@^1.0.0: 4668ip-set@^1.0.0:
3943 version "1.0.1" 4669 version "1.0.1"
3944 resolved "https://registry.yarnpkg.com/ip-set/-/ip-set-1.0.1.tgz#633b66d0bd6c8d0de968d053263c9120d3b6727e" 4670 resolved "https://registry.yarnpkg.com/ip-set/-/ip-set-1.0.1.tgz#633b66d0bd6c8d0de968d053263c9120d3b6727e"
4671 integrity sha1-Yztm0L1sjQ3paNBTJjyRINO2cn4=
3945 dependencies: 4672 dependencies:
3946 ip "^1.1.3" 4673 ip "^1.1.3"
3947 4674
3948ip@^1.0.1, ip@^1.1.0, ip@^1.1.3, ip@^1.1.5: 4675ip@^1.0.1, ip@^1.1.0, ip@^1.1.3, ip@^1.1.5:
3949 version "1.1.5" 4676 version "1.1.5"
3950 resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" 4677 resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
4678 integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
3951 4679
3952ipaddr.js@1.8.0: 4680ipaddr.js@1.8.0:
3953 version "1.8.0" 4681 version "1.8.0"
3954 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 4682 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
4683 integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
3955 4684
3956"ipaddr.js@>= 0.1.5", ipaddr.js@^1.0.1, ipaddr.js@^1.5.2: 4685"ipaddr.js@>= 0.1.5", ipaddr.js@^1.0.1, ipaddr.js@^1.5.2:
3957 version "1.8.1" 4686 version "1.8.1"
3958 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" 4687 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427"
4688 integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc=
3959 4689
3960is-accessor-descriptor@^0.1.6: 4690is-accessor-descriptor@^0.1.6:
3961 version "0.1.6" 4691 version "0.1.6"
3962 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 4692 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
4693 integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
3963 dependencies: 4694 dependencies:
3964 kind-of "^3.0.2" 4695 kind-of "^3.0.2"
3965 4696
3966is-accessor-descriptor@^1.0.0: 4697is-accessor-descriptor@^1.0.0:
3967 version "1.0.0" 4698 version "1.0.0"
3968 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 4699 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
4700 integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
3969 dependencies: 4701 dependencies:
3970 kind-of "^6.0.0" 4702 kind-of "^6.0.0"
3971 4703
3972is-arrayish@^0.2.1: 4704is-arrayish@^0.2.1:
3973 version "0.2.1" 4705 version "0.2.1"
3974 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 4706 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
4707 integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
3975 4708
3976is-ascii@^1.0.0: 4709is-ascii@^1.0.0:
3977 version "1.0.0" 4710 version "1.0.0"
3978 resolved "https://registry.yarnpkg.com/is-ascii/-/is-ascii-1.0.0.tgz#f02ad0259a0921cd199ff21ce1b09e0f6b4e3929" 4711 resolved "https://registry.yarnpkg.com/is-ascii/-/is-ascii-1.0.0.tgz#f02ad0259a0921cd199ff21ce1b09e0f6b4e3929"
4712 integrity sha1-8CrQJZoJIc0Zn/Ic4bCeD2tOOSk=
3979 4713
3980is-binary-path@^1.0.0: 4714is-binary-path@^1.0.0:
3981 version "1.0.1" 4715 version "1.0.1"
3982 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 4716 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
4717 integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
3983 dependencies: 4718 dependencies:
3984 binary-extensions "^1.0.0" 4719 binary-extensions "^1.0.0"
3985 4720
3986is-buffer@^1.1.5: 4721is-buffer@^1.1.5:
3987 version "1.1.6" 4722 version "1.1.6"
3988 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 4723 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
4724 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
3989 4725
3990is-builtin-module@^1.0.0: 4726is-builtin-module@^1.0.0:
3991 version "1.0.0" 4727 version "1.0.0"
3992 resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 4728 resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
4729 integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74=
3993 dependencies: 4730 dependencies:
3994 builtin-modules "^1.0.0" 4731 builtin-modules "^1.0.0"
3995 4732
3996is-callable@^1.1.1, is-callable@^1.1.3: 4733is-callable@^1.1.3, is-callable@^1.1.4:
3997 version "1.1.4" 4734 version "1.1.4"
3998 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 4735 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
4736 integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
3999 4737
4000is-ci@^1.0.10: 4738is-ci@^1.0.10:
4001 version "1.2.1" 4739 version "1.2.1"
4002 resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 4740 resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
4741 integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
4003 dependencies: 4742 dependencies:
4004 ci-info "^1.5.0" 4743 ci-info "^1.5.0"
4005 4744
4006is-data-descriptor@^0.1.4: 4745is-data-descriptor@^0.1.4:
4007 version "0.1.4" 4746 version "0.1.4"
4008 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 4747 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
4748 integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
4009 dependencies: 4749 dependencies:
4010 kind-of "^3.0.2" 4750 kind-of "^3.0.2"
4011 4751
4012is-data-descriptor@^1.0.0: 4752is-data-descriptor@^1.0.0:
4013 version "1.0.0" 4753 version "1.0.0"
4014 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 4754 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
4755 integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
4015 dependencies: 4756 dependencies:
4016 kind-of "^6.0.0" 4757 kind-of "^6.0.0"
4017 4758
4018is-date-object@^1.0.1: 4759is-date-object@^1.0.1:
4019 version "1.0.1" 4760 version "1.0.1"
4020 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 4761 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
4762 integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
4021 4763
4022is-descriptor@^0.1.0: 4764is-descriptor@^0.1.0:
4023 version "0.1.6" 4765 version "0.1.6"
4024 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 4766 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
4767 integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
4025 dependencies: 4768 dependencies:
4026 is-accessor-descriptor "^0.1.6" 4769 is-accessor-descriptor "^0.1.6"
4027 is-data-descriptor "^0.1.4" 4770 is-data-descriptor "^0.1.4"
@@ -4030,6 +4773,7 @@ is-descriptor@^0.1.0:
4030is-descriptor@^1.0.0, is-descriptor@^1.0.2: 4773is-descriptor@^1.0.0, is-descriptor@^1.0.2:
4031 version "1.0.2" 4774 version "1.0.2"
4032 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 4775 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
4776 integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
4033 dependencies: 4777 dependencies:
4034 is-accessor-descriptor "^1.0.0" 4778 is-accessor-descriptor "^1.0.0"
4035 is-data-descriptor "^1.0.0" 4779 is-data-descriptor "^1.0.0"
@@ -4038,208 +4782,254 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
4038is-directory@^0.3.1: 4782is-directory@^0.3.1:
4039 version "0.3.1" 4783 version "0.3.1"
4040 resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 4784 resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
4785 integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
4041 4786
4042is-dotfile@^1.0.0: 4787is-dotfile@^1.0.0:
4043 version "1.0.3" 4788 version "1.0.3"
4044 resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 4789 resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
4790 integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=
4045 4791
4046is-equal-shallow@^0.1.3: 4792is-equal-shallow@^0.1.3:
4047 version "0.1.3" 4793 version "0.1.3"
4048 resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 4794 resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
4795 integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
4049 dependencies: 4796 dependencies:
4050 is-primitive "^2.0.0" 4797 is-primitive "^2.0.0"
4051 4798
4052is-extendable@^0.1.0, is-extendable@^0.1.1: 4799is-extendable@^0.1.0, is-extendable@^0.1.1:
4053 version "0.1.1" 4800 version "0.1.1"
4054 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 4801 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
4802 integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
4055 4803
4056is-extendable@^1.0.1: 4804is-extendable@^1.0.1:
4057 version "1.0.1" 4805 version "1.0.1"
4058 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 4806 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
4807 integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
4059 dependencies: 4808 dependencies:
4060 is-plain-object "^2.0.4" 4809 is-plain-object "^2.0.4"
4061 4810
4062is-extglob@^1.0.0: 4811is-extglob@^1.0.0:
4063 version "1.0.0" 4812 version "1.0.0"
4064 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 4813 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
4814 integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
4065 4815
4066is-extglob@^2.1.0, is-extglob@^2.1.1: 4816is-extglob@^2.1.0, is-extglob@^2.1.1:
4067 version "2.1.1" 4817 version "2.1.1"
4068 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 4818 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
4819 integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
4069 4820
4070is-file@^1.0.0: 4821is-file@^1.0.0:
4071 version "1.0.0" 4822 version "1.0.0"
4072 resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596" 4823 resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596"
4824 integrity sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=
4073 4825
4074is-finite@^1.0.0: 4826is-finite@^1.0.0:
4075 version "1.0.2" 4827 version "1.0.2"
4076 resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 4828 resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
4829 integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
4077 dependencies: 4830 dependencies:
4078 number-is-nan "^1.0.0" 4831 number-is-nan "^1.0.0"
4079 4832
4080is-fullwidth-code-point@^1.0.0: 4833is-fullwidth-code-point@^1.0.0:
4081 version "1.0.0" 4834 version "1.0.0"
4082 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 4835 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
4836 integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
4083 dependencies: 4837 dependencies:
4084 number-is-nan "^1.0.0" 4838 number-is-nan "^1.0.0"
4085 4839
4086is-fullwidth-code-point@^2.0.0: 4840is-fullwidth-code-point@^2.0.0:
4087 version "2.0.0" 4841 version "2.0.0"
4088 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 4842 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
4843 integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
4089 4844
4090is-function@^1.0.1: 4845is-function@^1.0.1:
4091 version "1.0.1" 4846 version "1.0.1"
4092 resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" 4847 resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
4848 integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
4093 4849
4094is-generator-fn@^1.0.0: 4850is-generator-fn@^1.0.0:
4095 version "1.0.0" 4851 version "1.0.0"
4096 resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" 4852 resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
4853 integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=
4097 4854
4098is-glob@^2.0.0, is-glob@^2.0.1: 4855is-glob@^2.0.0, is-glob@^2.0.1:
4099 version "2.0.1" 4856 version "2.0.1"
4100 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 4857 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
4858 integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
4101 dependencies: 4859 dependencies:
4102 is-extglob "^1.0.0" 4860 is-extglob "^1.0.0"
4103 4861
4104is-glob@^3.1.0: 4862is-glob@^3.1.0:
4105 version "3.1.0" 4863 version "3.1.0"
4106 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 4864 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
4865 integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
4107 dependencies: 4866 dependencies:
4108 is-extglob "^2.1.0" 4867 is-extglob "^2.1.0"
4109 4868
4110is-glob@^4.0.0: 4869is-glob@^4.0.0:
4111 version "4.0.0" 4870 version "4.0.0"
4112 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 4871 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
4872 integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=
4113 dependencies: 4873 dependencies:
4114 is-extglob "^2.1.1" 4874 is-extglob "^2.1.1"
4115 4875
4116is-number@^0.1.1: 4876is-number@^0.1.1:
4117 version "0.1.1" 4877 version "0.1.1"
4118 resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" 4878 resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
4879 integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=
4119 4880
4120is-number@^2.1.0: 4881is-number@^2.1.0:
4121 version "2.1.0" 4882 version "2.1.0"
4122 resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 4883 resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
4884 integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
4123 dependencies: 4885 dependencies:
4124 kind-of "^3.0.2" 4886 kind-of "^3.0.2"
4125 4887
4126is-number@^3.0.0: 4888is-number@^3.0.0:
4127 version "3.0.0" 4889 version "3.0.0"
4128 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 4890 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
4891 integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
4129 dependencies: 4892 dependencies:
4130 kind-of "^3.0.2" 4893 kind-of "^3.0.2"
4131 4894
4132is-number@^4.0.0: 4895is-number@^4.0.0:
4133 version "4.0.0" 4896 version "4.0.0"
4134 resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 4897 resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
4898 integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
4135 4899
4136is-path-cwd@^1.0.0: 4900is-path-cwd@^1.0.0:
4137 version "1.0.0" 4901 version "1.0.0"
4138 resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 4902 resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
4903 integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=
4139 4904
4140is-path-in-cwd@^1.0.0: 4905is-path-in-cwd@^1.0.0:
4141 version "1.0.1" 4906 version "1.0.1"
4142 resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 4907 resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
4908 integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==
4143 dependencies: 4909 dependencies:
4144 is-path-inside "^1.0.0" 4910 is-path-inside "^1.0.0"
4145 4911
4146is-path-inside@^1.0.0: 4912is-path-inside@^1.0.0:
4147 version "1.0.1" 4913 version "1.0.1"
4148 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 4914 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
4915 integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
4149 dependencies: 4916 dependencies:
4150 path-is-inside "^1.0.1" 4917 path-is-inside "^1.0.1"
4151 4918
4152is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 4919is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
4153 version "2.0.4" 4920 version "2.0.4"
4154 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 4921 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
4922 integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
4155 dependencies: 4923 dependencies:
4156 isobject "^3.0.1" 4924 isobject "^3.0.1"
4157 4925
4158is-posix-bracket@^0.1.0: 4926is-posix-bracket@^0.1.0:
4159 version "0.1.1" 4927 version "0.1.1"
4160 resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 4928 resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
4929 integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
4161 4930
4162is-primitive@^2.0.0: 4931is-primitive@^2.0.0:
4163 version "2.0.0" 4932 version "2.0.0"
4164 resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 4933 resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
4934 integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
4165 4935
4166is-promise@^2.1.0: 4936is-promise@^2.1.0:
4167 version "2.1.0" 4937 version "2.1.0"
4168 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 4938 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
4939 integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
4169 4940
4170is-regex@^1.0.4: 4941is-regex@^1.0.4:
4171 version "1.0.4" 4942 version "1.0.4"
4172 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 4943 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
4944 integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
4173 dependencies: 4945 dependencies:
4174 has "^1.0.1" 4946 has "^1.0.1"
4175 4947
4176is-stream@^1.1.0: 4948is-stream@^1.1.0:
4177 version "1.1.0" 4949 version "1.1.0"
4178 resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 4950 resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
4951 integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
4179 4952
4180is-symbol@^1.0.1: 4953is-symbol@^1.0.2:
4181 version "1.0.1" 4954 version "1.0.2"
4182 resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 4955 resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
4956 integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
4957 dependencies:
4958 has-symbols "^1.0.0"
4183 4959
4184is-typedarray@^1.0.0, is-typedarray@~1.0.0: 4960is-typedarray@^1.0.0, is-typedarray@~1.0.0:
4185 version "1.0.0" 4961 version "1.0.0"
4186 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 4962 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
4963 integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
4187 4964
4188is-utf8@^0.2.0: 4965is-utf8@^0.2.0:
4189 version "0.2.1" 4966 version "0.2.1"
4190 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 4967 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
4968 integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
4191 4969
4192is-windows@^1.0.2: 4970is-windows@^1.0.2:
4193 version "1.0.2" 4971 version "1.0.2"
4194 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 4972 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
4973 integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
4195 4974
4196is-wsl@^1.1.0: 4975is-wsl@^1.1.0:
4197 version "1.1.0" 4976 version "1.1.0"
4198 resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 4977 resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
4978 integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
4199 4979
4200isarray@0.0.1: 4980isarray@0.0.1:
4201 version "0.0.1" 4981 version "0.0.1"
4202 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 4982 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
4983 integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
4203 4984
4204isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 4985isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
4205 version "1.0.0" 4986 version "1.0.0"
4206 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 4987 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
4988 integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
4207 4989
4208isarray@2.0.1: 4990isarray@2.0.1:
4209 version "2.0.1" 4991 version "2.0.1"
4210 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 4992 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
4993 integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
4211 4994
4212isarray@^2.0.1: 4995isarray@^2.0.1:
4213 version "2.0.4" 4996 version "2.0.4"
4214 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" 4997 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
4998 integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==
4215 4999
4216isbinaryfile@^3.0.0: 5000isbinaryfile@^3.0.0:
4217 version "3.0.3" 5001 version "3.0.3"
4218 resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" 5002 resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
5003 integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
4219 dependencies: 5004 dependencies:
4220 buffer-alloc "^1.2.0" 5005 buffer-alloc "^1.2.0"
4221 5006
4222isexe@^2.0.0: 5007isexe@^2.0.0:
4223 version "2.0.0" 5008 version "2.0.0"
4224 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 5009 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
5010 integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
4225 5011
4226isobject@^2.0.0: 5012isobject@^2.0.0:
4227 version "2.1.0" 5013 version "2.1.0"
4228 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 5014 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
5015 integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
4229 dependencies: 5016 dependencies:
4230 isarray "1.0.0" 5017 isarray "1.0.0"
4231 5018
4232isobject@^3.0.0, isobject@^3.0.1: 5019isobject@^3.0.0, isobject@^3.0.1:
4233 version "3.0.1" 5020 version "3.0.1"
4234 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 5021 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
5022 integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
4235 5023
4236isstream@~0.1.2: 5024isstream@~0.1.2:
4237 version "0.1.2" 5025 version "0.1.2"
4238 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 5026 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
5027 integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
4239 5028
4240istanbul-api@^1.3.1: 5029istanbul-api@^1.3.1:
4241 version "1.3.7" 5030 version "1.3.7"
4242 resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" 5031 resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
5032 integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==
4243 dependencies: 5033 dependencies:
4244 async "^2.1.4" 5034 async "^2.1.4"
4245 fileset "^2.0.2" 5035 fileset "^2.0.2"
@@ -4256,6 +5046,7 @@ istanbul-api@^1.3.1:
4256istanbul-api@^2.0.5: 5046istanbul-api@^2.0.5:
4257 version "2.0.6" 5047 version "2.0.6"
4258 resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" 5048 resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc"
5049 integrity sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==
4259 dependencies: 5050 dependencies:
4260 async "^2.6.1" 5051 async "^2.6.1"
4261 compare-versions "^3.2.1" 5052 compare-versions "^3.2.1"
@@ -4270,9 +5061,10 @@ istanbul-api@^2.0.5:
4270 make-dir "^1.3.0" 5061 make-dir "^1.3.0"
4271 once "^1.4.0" 5062 once "^1.4.0"
4272 5063
4273istanbul-instrumenter-loader@^3.0.1: 5064istanbul-instrumenter-loader@3.0.1:
4274 version "3.0.1" 5065 version "3.0.1"
4275 resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" 5066 resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949"
5067 integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==
4276 dependencies: 5068 dependencies:
4277 convert-source-map "^1.5.0" 5069 convert-source-map "^1.5.0"
4278 istanbul-lib-instrument "^1.7.3" 5070 istanbul-lib-instrument "^1.7.3"
@@ -4282,26 +5074,31 @@ istanbul-instrumenter-loader@^3.0.1:
4282istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: 5074istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
4283 version "1.2.1" 5075 version "1.2.1"
4284 resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" 5076 resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
5077 integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
4285 5078
4286istanbul-lib-coverage@^2.0.1: 5079istanbul-lib-coverage@^2.0.1:
4287 version "2.0.1" 5080 version "2.0.1"
4288 resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" 5081 resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda"
5082 integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==
4289 5083
4290istanbul-lib-hook@^1.2.2: 5084istanbul-lib-hook@^1.2.2:
4291 version "1.2.2" 5085 version "1.2.2"
4292 resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" 5086 resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
5087 integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==
4293 dependencies: 5088 dependencies:
4294 append-transform "^0.4.0" 5089 append-transform "^0.4.0"
4295 5090
4296istanbul-lib-hook@^2.0.1: 5091istanbul-lib-hook@^2.0.1:
4297 version "2.0.1" 5092 version "2.0.1"
4298 resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" 5093 resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72"
5094 integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==
4299 dependencies: 5095 dependencies:
4300 append-transform "^1.0.0" 5096 append-transform "^1.0.0"
4301 5097
4302istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-instrument@^1.7.3: 5098istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-instrument@^1.7.3:
4303 version "1.10.2" 5099 version "1.10.2"
4304 resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" 5100 resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
5101 integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
4305 dependencies: 5102 dependencies:
4306 babel-generator "^6.18.0" 5103 babel-generator "^6.18.0"
4307 babel-template "^6.16.0" 5104 babel-template "^6.16.0"
@@ -4314,6 +5111,7 @@ istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-i
4314istanbul-lib-instrument@^3.0.0: 5111istanbul-lib-instrument@^3.0.0:
4315 version "3.0.0" 5112 version "3.0.0"
4316 resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" 5113 resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9"
5114 integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==
4317 dependencies: 5115 dependencies:
4318 "@babel/generator" "^7.0.0" 5116 "@babel/generator" "^7.0.0"
4319 "@babel/parser" "^7.0.0" 5117 "@babel/parser" "^7.0.0"
@@ -4326,6 +5124,7 @@ istanbul-lib-instrument@^3.0.0:
4326istanbul-lib-report@^1.1.5: 5124istanbul-lib-report@^1.1.5:
4327 version "1.1.5" 5125 version "1.1.5"
4328 resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" 5126 resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
5127 integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==
4329 dependencies: 5128 dependencies:
4330 istanbul-lib-coverage "^1.2.1" 5129 istanbul-lib-coverage "^1.2.1"
4331 mkdirp "^0.5.1" 5130 mkdirp "^0.5.1"
@@ -4335,6 +5134,7 @@ istanbul-lib-report@^1.1.5:
4335istanbul-lib-report@^2.0.2: 5134istanbul-lib-report@^2.0.2:
4336 version "2.0.2" 5135 version "2.0.2"
4337 resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" 5136 resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535"
5137 integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==
4338 dependencies: 5138 dependencies:
4339 istanbul-lib-coverage "^2.0.1" 5139 istanbul-lib-coverage "^2.0.1"
4340 make-dir "^1.3.0" 5140 make-dir "^1.3.0"
@@ -4343,6 +5143,7 @@ istanbul-lib-report@^2.0.2:
4343istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: 5143istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
4344 version "1.2.6" 5144 version "1.2.6"
4345 resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" 5145 resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
5146 integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==
4346 dependencies: 5147 dependencies:
4347 debug "^3.1.0" 5148 debug "^3.1.0"
4348 istanbul-lib-coverage "^1.2.1" 5149 istanbul-lib-coverage "^1.2.1"
@@ -4353,6 +5154,7 @@ istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
4353istanbul-lib-source-maps@^2.0.1: 5154istanbul-lib-source-maps@^2.0.1:
4354 version "2.0.1" 5155 version "2.0.1"
4355 resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" 5156 resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e"
5157 integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==
4356 dependencies: 5158 dependencies:
4357 debug "^3.1.0" 5159 debug "^3.1.0"
4358 istanbul-lib-coverage "^2.0.1" 5160 istanbul-lib-coverage "^2.0.1"
@@ -4363,57 +5165,38 @@ istanbul-lib-source-maps@^2.0.1:
4363istanbul-reports@^1.5.1: 5165istanbul-reports@^1.5.1:
4364 version "1.5.1" 5166 version "1.5.1"
4365 resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" 5167 resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
5168 integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==
4366 dependencies: 5169 dependencies:
4367 handlebars "^4.0.3" 5170 handlebars "^4.0.3"
4368 5171
4369istanbul-reports@^2.0.1: 5172istanbul-reports@^2.0.1:
4370 version "2.0.1" 5173 version "2.0.1"
4371 resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" 5174 resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7"
5175 integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==
4372 dependencies: 5176 dependencies:
4373 handlebars "^4.0.11" 5177 handlebars "^4.0.11"
4374 5178
4375istanbul@^0.4.5:
4376 version "0.4.5"
4377 resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
4378 dependencies:
4379 abbrev "1.0.x"
4380 async "1.x"
4381 escodegen "1.8.x"
4382 esprima "2.7.x"
4383 glob "^5.0.15"
4384 handlebars "^4.0.1"
4385 js-yaml "3.x"
4386 mkdirp "0.5.x"
4387 nopt "3.x"
4388 once "1.x"
4389 resolve "1.1.x"
4390 supports-color "^3.1.0"
4391 which "^1.1.1"
4392 wordwrap "^1.0.0"
4393
4394jasmine-core@^3.1.0: 5179jasmine-core@^3.1.0:
4395 version "3.2.1" 5180 version "3.3.0"
4396 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.2.1.tgz#8e4ff5b861603ee83343f2b49eee6a0ffe9650ce" 5181 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.3.0.tgz#dea1cdc634bc93c7e0d4ad27185df30fa971b10e"
5182 integrity sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==
4397 5183
4398jasmine-core@~2.8.0: 5184jasmine-core@~2.8.0:
4399 version "2.8.0" 5185 version "2.8.0"
4400 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" 5186 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
4401 5187 integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=
4402jasmine-diff@^0.1.3:
4403 version "0.1.3"
4404 resolved "https://registry.yarnpkg.com/jasmine-diff/-/jasmine-diff-0.1.3.tgz#93ccc2dcc41028c5ddd4606558074839f2deeaa8"
4405 dependencies:
4406 diff "^3.2.0"
4407 5188
4408jasmine-spec-reporter@^4.2.1: 5189jasmine-spec-reporter@^4.2.1:
4409 version "4.2.1" 5190 version "4.2.1"
4410 resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" 5191 resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22"
5192 integrity sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==
4411 dependencies: 5193 dependencies:
4412 colors "1.1.2" 5194 colors "1.1.2"
4413 5195
4414jasmine@2.8.0: 5196jasmine@2.8.0:
4415 version "2.8.0" 5197 version "2.8.0"
4416 resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" 5198 resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
5199 integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4=
4417 dependencies: 5200 dependencies:
4418 exit "^0.1.2" 5201 exit "^0.1.2"
4419 glob "^7.0.6" 5202 glob "^7.0.6"
@@ -4422,16 +5205,19 @@ jasmine@2.8.0:
4422jasminewd2@^2.1.0: 5205jasminewd2@^2.1.0:
4423 version "2.2.0" 5206 version "2.2.0"
4424 resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" 5207 resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e"
5208 integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=
4425 5209
4426jest-changed-files@^23.4.2: 5210jest-changed-files@^23.4.2:
4427 version "23.4.2" 5211 version "23.4.2"
4428 resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" 5212 resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
5213 integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==
4429 dependencies: 5214 dependencies:
4430 throat "^4.0.0" 5215 throat "^4.0.0"
4431 5216
4432jest-cli@^23.6.0: 5217jest-cli@^23.6.0:
4433 version "23.6.0" 5218 version "23.6.0"
4434 resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" 5219 resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4"
5220 integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==
4435 dependencies: 5221 dependencies:
4436 ansi-escapes "^3.0.0" 5222 ansi-escapes "^3.0.0"
4437 chalk "^2.0.1" 5223 chalk "^2.0.1"
@@ -4473,6 +5259,7 @@ jest-cli@^23.6.0:
4473jest-config@^23.6.0: 5259jest-config@^23.6.0:
4474 version "23.6.0" 5260 version "23.6.0"
4475 resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" 5261 resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d"
5262 integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==
4476 dependencies: 5263 dependencies:
4477 babel-core "^6.0.0" 5264 babel-core "^6.0.0"
4478 babel-jest "^23.6.0" 5265 babel-jest "^23.6.0"
@@ -4492,6 +5279,7 @@ jest-config@^23.6.0:
4492jest-diff@^23.6.0: 5279jest-diff@^23.6.0:
4493 version "23.6.0" 5280 version "23.6.0"
4494 resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" 5281 resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d"
5282 integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==
4495 dependencies: 5283 dependencies:
4496 chalk "^2.0.1" 5284 chalk "^2.0.1"
4497 diff "^3.2.0" 5285 diff "^3.2.0"
@@ -4501,12 +5289,14 @@ jest-diff@^23.6.0:
4501jest-docblock@^23.2.0: 5289jest-docblock@^23.2.0:
4502 version "23.2.0" 5290 version "23.2.0"
4503 resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" 5291 resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
5292 integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=
4504 dependencies: 5293 dependencies:
4505 detect-newline "^2.1.0" 5294 detect-newline "^2.1.0"
4506 5295
4507jest-each@^23.6.0: 5296jest-each@^23.6.0:
4508 version "23.6.0" 5297 version "23.6.0"
4509 resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" 5298 resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575"
5299 integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==
4510 dependencies: 5300 dependencies:
4511 chalk "^2.0.1" 5301 chalk "^2.0.1"
4512 pretty-format "^23.6.0" 5302 pretty-format "^23.6.0"
@@ -4514,6 +5304,7 @@ jest-each@^23.6.0:
4514jest-environment-jsdom@^23.4.0: 5304jest-environment-jsdom@^23.4.0:
4515 version "23.4.0" 5305 version "23.4.0"
4516 resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" 5306 resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
5307 integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM=
4517 dependencies: 5308 dependencies:
4518 jest-mock "^23.2.0" 5309 jest-mock "^23.2.0"
4519 jest-util "^23.4.0" 5310 jest-util "^23.4.0"
@@ -4522,6 +5313,7 @@ jest-environment-jsdom@^23.4.0:
4522jest-environment-node@^23.4.0: 5313jest-environment-node@^23.4.0:
4523 version "23.4.0" 5314 version "23.4.0"
4524 resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" 5315 resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
5316 integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=
4525 dependencies: 5317 dependencies:
4526 jest-mock "^23.2.0" 5318 jest-mock "^23.2.0"
4527 jest-util "^23.4.0" 5319 jest-util "^23.4.0"
@@ -4529,10 +5321,12 @@ jest-environment-node@^23.4.0:
4529jest-get-type@^22.1.0: 5321jest-get-type@^22.1.0:
4530 version "22.4.3" 5322 version "22.4.3"
4531 resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" 5323 resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
5324 integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==
4532 5325
4533jest-haste-map@^23.6.0: 5326jest-haste-map@^23.6.0:
4534 version "23.6.0" 5327 version "23.6.0"
4535 resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" 5328 resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16"
5329 integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==
4536 dependencies: 5330 dependencies:
4537 fb-watchman "^2.0.0" 5331 fb-watchman "^2.0.0"
4538 graceful-fs "^4.1.11" 5332 graceful-fs "^4.1.11"
@@ -4546,6 +5340,7 @@ jest-haste-map@^23.6.0:
4546jest-jasmine2@^23.6.0: 5340jest-jasmine2@^23.6.0:
4547 version "23.6.0" 5341 version "23.6.0"
4548 resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" 5342 resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0"
5343 integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==
4549 dependencies: 5344 dependencies:
4550 babel-traverse "^6.0.0" 5345 babel-traverse "^6.0.0"
4551 chalk "^2.0.1" 5346 chalk "^2.0.1"
@@ -4563,12 +5358,14 @@ jest-jasmine2@^23.6.0:
4563jest-leak-detector@^23.6.0: 5358jest-leak-detector@^23.6.0:
4564 version "23.6.0" 5359 version "23.6.0"
4565 resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" 5360 resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de"
5361 integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==
4566 dependencies: 5362 dependencies:
4567 pretty-format "^23.6.0" 5363 pretty-format "^23.6.0"
4568 5364
4569jest-matcher-utils@^23.6.0: 5365jest-matcher-utils@^23.6.0:
4570 version "23.6.0" 5366 version "23.6.0"
4571 resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" 5367 resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80"
5368 integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==
4572 dependencies: 5369 dependencies:
4573 chalk "^2.0.1" 5370 chalk "^2.0.1"
4574 jest-get-type "^22.1.0" 5371 jest-get-type "^22.1.0"
@@ -4577,6 +5374,7 @@ jest-matcher-utils@^23.6.0:
4577jest-message-util@^23.4.0: 5374jest-message-util@^23.4.0:
4578 version "23.4.0" 5375 version "23.4.0"
4579 resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" 5376 resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
5377 integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=
4580 dependencies: 5378 dependencies:
4581 "@babel/code-frame" "^7.0.0-beta.35" 5379 "@babel/code-frame" "^7.0.0-beta.35"
4582 chalk "^2.0.1" 5380 chalk "^2.0.1"
@@ -4587,10 +5385,12 @@ jest-message-util@^23.4.0:
4587jest-mock@^23.2.0: 5385jest-mock@^23.2.0:
4588 version "23.2.0" 5386 version "23.2.0"
4589 resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" 5387 resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
5388 integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=
4590 5389
4591jest-preset-angular@^6.0.0: 5390jest-preset-angular@^6.0.0:
4592 version "6.0.1" 5391 version "6.0.1"
4593 resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-6.0.1.tgz#40a6c16ca5bbf3ac83a8594ac190643d7c6e7a07" 5392 resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-6.0.1.tgz#40a6c16ca5bbf3ac83a8594ac190643d7c6e7a07"
5393 integrity sha512-7b54ZOntt8wtf39X838vZZmXWkZYVRtk9bCO66yQhkmFkmLaxULDHdbUobiD+f8sn5Zb2u9grhOQbZZ+/RaY0g==
4594 dependencies: 5394 dependencies:
4595 "@types/jest" "^23.3.1" 5395 "@types/jest" "^23.3.1"
4596 jest-zone-patch "^0.0.8" 5396 jest-zone-patch "^0.0.8"
@@ -4599,10 +5399,12 @@ jest-preset-angular@^6.0.0:
4599jest-regex-util@^23.3.0: 5399jest-regex-util@^23.3.0:
4600 version "23.3.0" 5400 version "23.3.0"
4601 resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" 5401 resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
5402 integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=
4602 5403
4603jest-resolve-dependencies@^23.6.0: 5404jest-resolve-dependencies@^23.6.0:
4604 version "23.6.0" 5405 version "23.6.0"
4605 resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" 5406 resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d"
5407 integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==
4606 dependencies: 5408 dependencies:
4607 jest-regex-util "^23.3.0" 5409 jest-regex-util "^23.3.0"
4608 jest-snapshot "^23.6.0" 5410 jest-snapshot "^23.6.0"
@@ -4610,6 +5412,7 @@ jest-resolve-dependencies@^23.6.0:
4610jest-resolve@^23.6.0: 5412jest-resolve@^23.6.0:
4611 version "23.6.0" 5413 version "23.6.0"
4612 resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" 5414 resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae"
5415 integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==
4613 dependencies: 5416 dependencies:
4614 browser-resolve "^1.11.3" 5417 browser-resolve "^1.11.3"
4615 chalk "^2.0.1" 5418 chalk "^2.0.1"
@@ -4618,6 +5421,7 @@ jest-resolve@^23.6.0:
4618jest-runner@^23.6.0: 5421jest-runner@^23.6.0:
4619 version "23.6.0" 5422 version "23.6.0"
4620 resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" 5423 resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38"
5424 integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==
4621 dependencies: 5425 dependencies:
4622 exit "^0.1.2" 5426 exit "^0.1.2"
4623 graceful-fs "^4.1.11" 5427 graceful-fs "^4.1.11"
@@ -4636,6 +5440,7 @@ jest-runner@^23.6.0:
4636jest-runtime@^23.6.0: 5440jest-runtime@^23.6.0:
4637 version "23.6.0" 5441 version "23.6.0"
4638 resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" 5442 resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082"
5443 integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==
4639 dependencies: 5444 dependencies:
4640 babel-core "^6.0.0" 5445 babel-core "^6.0.0"
4641 babel-plugin-istanbul "^4.1.6" 5446 babel-plugin-istanbul "^4.1.6"
@@ -4662,10 +5467,12 @@ jest-runtime@^23.6.0:
4662jest-serializer@^23.0.1: 5467jest-serializer@^23.0.1:
4663 version "23.0.1" 5468 version "23.0.1"
4664 resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" 5469 resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
5470 integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=
4665 5471
4666jest-snapshot@^23.6.0: 5472jest-snapshot@^23.6.0:
4667 version "23.6.0" 5473 version "23.6.0"
4668 resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" 5474 resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a"
5475 integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==
4669 dependencies: 5476 dependencies:
4670 babel-types "^6.0.0" 5477 babel-types "^6.0.0"
4671 chalk "^2.0.1" 5478 chalk "^2.0.1"
@@ -4681,6 +5488,7 @@ jest-snapshot@^23.6.0:
4681jest-util@^23.4.0: 5488jest-util@^23.4.0:
4682 version "23.4.0" 5489 version "23.4.0"
4683 resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" 5490 resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
5491 integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=
4684 dependencies: 5492 dependencies:
4685 callsites "^2.0.0" 5493 callsites "^2.0.0"
4686 chalk "^2.0.1" 5494 chalk "^2.0.1"
@@ -4694,6 +5502,7 @@ jest-util@^23.4.0:
4694jest-validate@^23.6.0: 5502jest-validate@^23.6.0:
4695 version "23.6.0" 5503 version "23.6.0"
4696 resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" 5504 resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474"
5505 integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==
4697 dependencies: 5506 dependencies:
4698 chalk "^2.0.1" 5507 chalk "^2.0.1"
4699 jest-get-type "^22.1.0" 5508 jest-get-type "^22.1.0"
@@ -4703,6 +5512,7 @@ jest-validate@^23.6.0:
4703jest-watcher@^23.4.0: 5512jest-watcher@^23.4.0:
4704 version "23.4.0" 5513 version "23.4.0"
4705 resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" 5514 resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
5515 integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=
4706 dependencies: 5516 dependencies:
4707 ansi-escapes "^3.0.0" 5517 ansi-escapes "^3.0.0"
4708 chalk "^2.0.1" 5518 chalk "^2.0.1"
@@ -4711,16 +5521,19 @@ jest-watcher@^23.4.0:
4711jest-worker@^23.2.0: 5521jest-worker@^23.2.0:
4712 version "23.2.0" 5522 version "23.2.0"
4713 resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" 5523 resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
5524 integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=
4714 dependencies: 5525 dependencies:
4715 merge-stream "^1.0.1" 5526 merge-stream "^1.0.1"
4716 5527
4717jest-zone-patch@^0.0.8: 5528jest-zone-patch@^0.0.8:
4718 version "0.0.8" 5529 version "0.0.8"
4719 resolved "https://registry.yarnpkg.com/jest-zone-patch/-/jest-zone-patch-0.0.8.tgz#90fa3b5b60e95ad3e624dd2c3eb59bb1dcabd371" 5530 resolved "https://registry.yarnpkg.com/jest-zone-patch/-/jest-zone-patch-0.0.8.tgz#90fa3b5b60e95ad3e624dd2c3eb59bb1dcabd371"
5531 integrity sha1-kPo7W2DpWtPmJN0sPrWbsdyr03E=
4720 5532
4721jest@^23.5.0: 5533jest@^23.5.0:
4722 version "23.6.0" 5534 version "23.6.0"
4723 resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" 5535 resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d"
5536 integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==
4724 dependencies: 5537 dependencies:
4725 import-local "^1.0.0" 5538 import-local "^1.0.0"
4726 jest-cli "^23.6.0" 5539 jest-cli "^23.6.0"
@@ -4728,22 +5541,27 @@ jest@^23.5.0:
4728jquery@^3.3.1: 5541jquery@^3.3.1:
4729 version "3.3.1" 5542 version "3.3.1"
4730 resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" 5543 resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
5544 integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==
4731 5545
4732js-base64@^2.1.8: 5546js-base64@^2.1.8:
4733 version "2.4.9" 5547 version "2.4.9"
4734 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" 5548 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
5549 integrity sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==
4735 5550
4736"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 5551"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
4737 version "4.0.0" 5552 version "4.0.0"
4738 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 5553 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
5554 integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
4739 5555
4740js-tokens@^3.0.2: 5556js-tokens@^3.0.2:
4741 version "3.0.2" 5557 version "3.0.2"
4742 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 5558 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
5559 integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
4743 5560
4744js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: 5561js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
4745 version "3.12.0" 5562 version "3.12.0"
4746 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 5563 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
5564 integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
4747 dependencies: 5565 dependencies:
4748 argparse "^1.0.7" 5566 argparse "^1.0.7"
4749 esprima "^4.0.0" 5567 esprima "^4.0.0"
@@ -4751,14 +5569,17 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
4751jsbn@~0.1.0: 5569jsbn@~0.1.0:
4752 version "0.1.1" 5570 version "0.1.1"
4753 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 5571 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
5572 integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
4754 5573
4755jschannel@^1.0.2: 5574jschannel@^1.0.2:
4756 version "1.0.2" 5575 version "1.0.2"
4757 resolved "https://registry.yarnpkg.com/jschannel/-/jschannel-1.0.2.tgz#8932010e9c6042a27bc93b918dac2e267976ae14" 5576 resolved "https://registry.yarnpkg.com/jschannel/-/jschannel-1.0.2.tgz#8932010e9c6042a27bc93b918dac2e267976ae14"
5577 integrity sha1-iTIBDpxgQqJ7yTuRjawuJnl2rhQ=
4758 5578
4759jsdom@^11.5.1: 5579jsdom@^11.5.1:
4760 version "11.12.0" 5580 version "11.12.0"
4761 resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" 5581 resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
5582 integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
4762 dependencies: 5583 dependencies:
4763 abab "^2.0.0" 5584 abab "^2.0.0"
4764 acorn "^5.5.3" 5585 acorn "^5.5.3"
@@ -4790,68 +5611,95 @@ jsdom@^11.5.1:
4790jsesc@^1.3.0: 5611jsesc@^1.3.0:
4791 version "1.3.0" 5612 version "1.3.0"
4792 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 5613 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
5614 integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
4793 5615
4794jsesc@^2.5.1: 5616jsesc@^2.5.1:
4795 version "2.5.1" 5617 version "2.5.2"
4796 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 5618 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
5619 integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
4797 5620
4798jsesc@~0.5.0: 5621jsesc@~0.5.0:
4799 version "0.5.0" 5622 version "0.5.0"
4800 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 5623 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
5624 integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
4801 5625
4802json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: 5626json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
4803 version "1.0.2" 5627 version "1.0.2"
4804 resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 5628 resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
5629 integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
4805 5630
4806json-schema-traverse@^0.3.0: 5631json-schema-traverse@^0.3.0:
4807 version "0.3.1" 5632 version "0.3.1"
4808 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 5633 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
5634 integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
4809 5635
4810json-schema-traverse@^0.4.1: 5636json-schema-traverse@^0.4.1:
4811 version "0.4.1" 5637 version "0.4.1"
4812 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 5638 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
5639 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
4813 5640
4814json-schema@0.2.3: 5641json-schema@0.2.3:
4815 version "0.2.3" 5642 version "0.2.3"
4816 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 5643 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
5644 integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
4817 5645
4818json-stable-stringify@^1.0.1: 5646json-stable-stringify@^1.0.1:
4819 version "1.0.1" 5647 version "1.0.1"
4820 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 5648 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
5649 integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
4821 dependencies: 5650 dependencies:
4822 jsonify "~0.0.0" 5651 jsonify "~0.0.0"
4823 5652
4824json-stringify-safe@~5.0.1: 5653json-stringify-safe@~5.0.1:
4825 version "5.0.1" 5654 version "5.0.1"
4826 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 5655 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
5656 integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
4827 5657
4828json3@^3.3.2: 5658json3@^3.3.2:
4829 version "3.3.2" 5659 version "3.3.2"
4830 resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 5660 resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
5661 integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=
4831 5662
4832json5@2.x: 5663json5@2.x:
4833 version "2.0.1" 5664 version "2.1.0"
4834 resolved "https://registry.yarnpkg.com/json5/-/json5-2.0.1.tgz#3d6d0d1066039eb50984e66a7840e4f4b7a2c660" 5665 resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
5666 integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
4835 dependencies: 5667 dependencies:
4836 minimist "^1.2.0" 5668 minimist "^1.2.0"
4837 5669
4838json5@^0.5.0, json5@^0.5.1: 5670json5@^0.5.0, json5@^0.5.1:
4839 version "0.5.1" 5671 version "0.5.1"
4840 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 5672 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
5673 integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
5674
5675json5@^1.0.1:
5676 version "1.0.1"
5677 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
5678 integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
5679 dependencies:
5680 minimist "^1.2.0"
4841 5681
4842jsonfile@^4.0.0: 5682jsonfile@^4.0.0:
4843 version "4.0.0" 5683 version "4.0.0"
4844 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 5684 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
5685 integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
4845 optionalDependencies: 5686 optionalDependencies:
4846 graceful-fs "^4.1.6" 5687 graceful-fs "^4.1.6"
4847 5688
4848jsonify@~0.0.0: 5689jsonify@~0.0.0:
4849 version "0.0.0" 5690 version "0.0.0"
4850 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 5691 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
5692 integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
5693
5694jsonparse@^1.2.0:
5695 version "1.3.1"
5696 resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
5697 integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
4851 5698
4852jsprim@^1.2.2: 5699jsprim@^1.2.2:
4853 version "1.4.1" 5700 version "1.4.1"
4854 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 5701 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
5702 integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
4855 dependencies: 5703 dependencies:
4856 assert-plus "1.0.0" 5704 assert-plus "1.0.0"
4857 extsprintf "1.3.0" 5705 extsprintf "1.3.0"
@@ -4861,6 +5709,7 @@ jsprim@^1.2.2:
4861jszip@^3.1.3: 5709jszip@^3.1.3:
4862 version "3.1.5" 5710 version "3.1.5"
4863 resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" 5711 resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37"
5712 integrity sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==
4864 dependencies: 5713 dependencies:
4865 core-js "~2.3.0" 5714 core-js "~2.3.0"
4866 es6-promise "~3.0.2" 5715 es6-promise "~3.0.2"
@@ -4871,10 +5720,12 @@ jszip@^3.1.3:
4871junk@^1, junk@^2.1.0: 5720junk@^1, junk@^2.1.0:
4872 version "1.0.3" 5721 version "1.0.3"
4873 resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" 5722 resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592"
5723 integrity sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=
4874 5724
4875k-bucket@^4.0.0: 5725k-bucket@^4.0.0:
4876 version "4.0.1" 5726 version "4.0.1"
4877 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542" 5727 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542"
5728 integrity sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==
4878 dependencies: 5729 dependencies:
4879 inherits "^2.0.1" 5730 inherits "^2.0.1"
4880 randombytes "^2.0.3" 5731 randombytes "^2.0.3"
@@ -4882,12 +5733,14 @@ k-bucket@^4.0.0:
4882k-bucket@^5.0.0: 5733k-bucket@^5.0.0:
4883 version "5.0.0" 5734 version "5.0.0"
4884 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.0.0.tgz#ef7a401fcd4c37cd31dceaa6ae4440ca91055e01" 5735 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.0.0.tgz#ef7a401fcd4c37cd31dceaa6ae4440ca91055e01"
5736 integrity sha512-r/q+wV/Kde62/tk+rqyttEJn6h0jR7x+incdMVSYTqK73zVxVrzJa70kJL49cIKen8XjIgUZKSvk8ktnrQbK4w==
4885 dependencies: 5737 dependencies:
4886 randombytes "^2.0.3" 5738 randombytes "^2.0.3"
4887 5739
4888k-rpc-socket@^1.7.2: 5740k-rpc-socket@^1.7.2:
4889 version "1.8.0" 5741 version "1.8.0"
4890 resolved "https://registry.yarnpkg.com/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz#9a4dd6a4f3795ed847ffa156579cc389990bd1f2" 5742 resolved "https://registry.yarnpkg.com/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz#9a4dd6a4f3795ed847ffa156579cc389990bd1f2"
5743 integrity sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==
4891 dependencies: 5744 dependencies:
4892 bencode "^2.0.0" 5745 bencode "^2.0.0"
4893 buffer-equals "^1.0.4" 5746 buffer-equals "^1.0.4"
@@ -4896,6 +5749,7 @@ k-rpc-socket@^1.7.2:
4896k-rpc@^5.0.0: 5749k-rpc@^5.0.0:
4897 version "5.0.0" 5750 version "5.0.0"
4898 resolved "https://registry.yarnpkg.com/k-rpc/-/k-rpc-5.0.0.tgz#a72651860c96db440579e4c9f38dce8a42b481a8" 5751 resolved "https://registry.yarnpkg.com/k-rpc/-/k-rpc-5.0.0.tgz#a72651860c96db440579e4c9f38dce8a42b481a8"
5752 integrity sha512-vCH2rQdfMOS+MlUuTSuar1pS2EMrltURf9LmAR9xR6Jik0XPlMX3vEixgqMn17wKmFVCublJqSJ4hJIP7oKZ3Q==
4899 dependencies: 5753 dependencies:
4900 buffer-equals "^1.0.3" 5754 buffer-equals "^1.0.3"
4901 k-bucket "^4.0.0" 5755 k-bucket "^4.0.0"
@@ -4906,6 +5760,7 @@ k-rpc@^5.0.0:
4906karma-chrome-launcher@^2.2.0: 5760karma-chrome-launcher@^2.2.0:
4907 version "2.2.0" 5761 version "2.2.0"
4908 resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" 5762 resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
5763 integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==
4909 dependencies: 5764 dependencies:
4910 fs-access "^1.0.0" 5765 fs-access "^1.0.0"
4911 which "^1.2.1" 5766 which "^1.2.1"
@@ -4913,27 +5768,32 @@ karma-chrome-launcher@^2.2.0:
4913karma-coverage-istanbul-reporter@^2.0.2: 5768karma-coverage-istanbul-reporter@^2.0.2:
4914 version "2.0.4" 5769 version "2.0.4"
4915 resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" 5770 resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a"
5771 integrity sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw==
4916 dependencies: 5772 dependencies:
4917 istanbul-api "^2.0.5" 5773 istanbul-api "^2.0.5"
4918 minimatch "^3.0.4" 5774 minimatch "^3.0.4"
4919 5775
4920karma-jasmine-html-reporter@^1.3.1: 5776karma-jasmine-html-reporter@^1.3.1:
4921 version "1.3.1" 5777 version "1.4.0"
4922 resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.3.1.tgz#17db92e76ecbce97b281c97c9ac3d8b1723848f9" 5778 resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.0.tgz#1abbd30d4509a8c82b96707ae7d2fa4da459ca19"
5779 integrity sha512-0wxhwA8PLPpICZ4o2GRnPi67hf3JhfQm5WCB8nElh4qsE6wRNOTtrqooyBPNqI087Xr2SBhxLg5fU+BJ/qxRrw==
4923 5780
4924karma-jasmine@^1.1.2: 5781karma-jasmine@^1.1.2:
4925 version "1.1.2" 5782 version "1.1.2"
4926 resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3" 5783 resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3"
5784 integrity sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=
4927 5785
4928karma-source-map-support@^1.2.0: 5786karma-source-map-support@1.3.0:
4929 version "1.3.0" 5787 version "1.3.0"
4930 resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde" 5788 resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde"
5789 integrity sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==
4931 dependencies: 5790 dependencies:
4932 source-map-support "^0.5.5" 5791 source-map-support "^0.5.5"
4933 5792
4934karma@^3.0.0: 5793karma@^3.0.0:
4935 version "3.0.0" 5794 version "3.1.3"
4936 resolved "https://registry.yarnpkg.com/karma/-/karma-3.0.0.tgz#6da83461a8a28d8224575c3b5b874e271b4730c3" 5795 resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.3.tgz#6e251648e3aff900927bc1126dbcbcb92d3edd61"
5796 integrity sha512-JU4FYUtFEGsLZd6ZJzLrivcPj0TkteBiIRDcXWFsltPMGgZMDtby/MIzNOzgyZv/9dahs9vHpSxerC/ZfeX9Qw==
4937 dependencies: 5797 dependencies:
4938 bluebird "^3.3.0" 5798 bluebird "^3.3.0"
4939 body-parser "^1.16.1" 5799 body-parser "^1.16.1"
@@ -4945,11 +5805,12 @@ karma@^3.0.0:
4945 di "^0.0.1" 5805 di "^0.0.1"
4946 dom-serialize "^2.2.0" 5806 dom-serialize "^2.2.0"
4947 expand-braces "^0.1.1" 5807 expand-braces "^0.1.1"
5808 flatted "^2.0.0"
4948 glob "^7.1.1" 5809 glob "^7.1.1"
4949 graceful-fs "^4.1.2" 5810 graceful-fs "^4.1.2"
4950 http-proxy "^1.13.0" 5811 http-proxy "^1.13.0"
4951 isbinaryfile "^3.0.0" 5812 isbinaryfile "^3.0.0"
4952 lodash "^4.17.4" 5813 lodash "^4.17.5"
4953 log4js "^3.0.0" 5814 log4js "^3.0.0"
4954 mime "^2.3.1" 5815 mime "^2.3.1"
4955 minimatch "^3.0.2" 5816 minimatch "^3.0.2"
@@ -4961,67 +5822,79 @@ karma@^3.0.0:
4961 socket.io "2.1.1" 5822 socket.io "2.1.1"
4962 source-map "^0.6.1" 5823 source-map "^0.6.1"
4963 tmp "0.0.33" 5824 tmp "0.0.33"
4964 useragent "2.2.1" 5825 useragent "2.3.0"
4965 5826
4966killable@^1.0.0: 5827killable@^1.0.0:
4967 version "1.0.1" 5828 version "1.0.1"
4968 resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" 5829 resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
5830 integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
4969 5831
4970kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 5832kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
4971 version "3.2.2" 5833 version "3.2.2"
4972 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 5834 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
5835 integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
4973 dependencies: 5836 dependencies:
4974 is-buffer "^1.1.5" 5837 is-buffer "^1.1.5"
4975 5838
4976kind-of@^4.0.0: 5839kind-of@^4.0.0:
4977 version "4.0.0" 5840 version "4.0.0"
4978 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 5841 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
5842 integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
4979 dependencies: 5843 dependencies:
4980 is-buffer "^1.1.5" 5844 is-buffer "^1.1.5"
4981 5845
4982kind-of@^5.0.0: 5846kind-of@^5.0.0:
4983 version "5.1.0" 5847 version "5.1.0"
4984 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 5848 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
5849 integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
4985 5850
4986kind-of@^6.0.0, kind-of@^6.0.2: 5851kind-of@^6.0.0, kind-of@^6.0.2:
4987 version "6.0.2" 5852 version "6.0.2"
4988 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 5853 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
5854 integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
4989 5855
4990kleur@^2.0.1: 5856kleur@^2.0.1:
4991 version "2.0.2" 5857 version "2.0.2"
4992 resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" 5858 resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300"
5859 integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==
4993 5860
4994last-one-wins@^1.0.4: 5861last-one-wins@^1.0.4:
4995 version "1.0.4" 5862 version "1.0.4"
4996 resolved "https://registry.yarnpkg.com/last-one-wins/-/last-one-wins-1.0.4.tgz#c1bfd0cbcb46790ec9156b8d1aee8fcb86cda22a" 5863 resolved "https://registry.yarnpkg.com/last-one-wins/-/last-one-wins-1.0.4.tgz#c1bfd0cbcb46790ec9156b8d1aee8fcb86cda22a"
5864 integrity sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=
4997 5865
4998lcid@^1.0.0: 5866lcid@^1.0.0:
4999 version "1.0.0" 5867 version "1.0.0"
5000 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 5868 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
5869 integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
5001 dependencies: 5870 dependencies:
5002 invert-kv "^1.0.0" 5871 invert-kv "^1.0.0"
5003 5872
5004lcid@^2.0.0: 5873lcid@^2.0.0:
5005 version "2.0.0" 5874 version "2.0.0"
5006 resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 5875 resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
5876 integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
5007 dependencies: 5877 dependencies:
5008 invert-kv "^2.0.0" 5878 invert-kv "^2.0.0"
5009 5879
5010left-pad@^1.3.0: 5880left-pad@^1.3.0:
5011 version "1.3.0" 5881 version "1.3.0"
5012 resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" 5882 resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
5883 integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
5013 5884
5014less-loader@^4.1.0: 5885less-loader@4.1.0:
5015 version "4.1.0" 5886 version "4.1.0"
5016 resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" 5887 resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e"
5888 integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==
5017 dependencies: 5889 dependencies:
5018 clone "^2.1.1" 5890 clone "^2.1.1"
5019 loader-utils "^1.1.0" 5891 loader-utils "^1.1.0"
5020 pify "^3.0.0" 5892 pify "^3.0.0"
5021 5893
5022less@^3.7.1: 5894less@3.9.0:
5023 version "3.8.1" 5895 version "3.9.0"
5024 resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" 5896 resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474"
5897 integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==
5025 dependencies: 5898 dependencies:
5026 clone "^2.1.2" 5899 clone "^2.1.2"
5027 optionalDependencies: 5900 optionalDependencies:
@@ -5037,35 +5910,42 @@ less@^3.7.1:
5037leven@^2.1.0: 5910leven@^2.1.0:
5038 version "2.1.0" 5911 version "2.1.0"
5039 resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 5912 resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
5913 integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
5040 5914
5041levn@~0.3.0: 5915levn@~0.3.0:
5042 version "0.3.0" 5916 version "0.3.0"
5043 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 5917 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
5918 integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
5044 dependencies: 5919 dependencies:
5045 prelude-ls "~1.1.2" 5920 prelude-ls "~1.1.2"
5046 type-check "~0.3.2" 5921 type-check "~0.3.2"
5047 5922
5048license-webpack-plugin@^1.3.1: 5923license-webpack-plugin@2.1.0:
5049 version "1.4.0" 5924 version "2.1.0"
5050 resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.4.0.tgz#be504a849ba7d736f1a6da4b133864f30af885fa" 5925 resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.0.tgz#83acaa6e89c3c5316effdd80cb4ec9c5cd8efc2f"
5926 integrity sha512-vDiBeMWxjE9n6TabQ9J4FH8urFdsRK0Nvxn1cit9biCiR9aq1zBR0X2BlAkEiIG6qPamLeU0GzvIgLkrFc398A==
5051 dependencies: 5927 dependencies:
5052 ejs "^2.5.7" 5928 "@types/webpack-sources" "^0.1.5"
5929 webpack-sources "^1.2.0"
5053 5930
5054lie@~3.1.0: 5931lie@~3.1.0:
5055 version "3.1.1" 5932 version "3.1.1"
5056 resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" 5933 resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
5934 integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
5057 dependencies: 5935 dependencies:
5058 immediate "~3.0.5" 5936 immediate "~3.0.5"
5059 5937
5060linkify-it@^2.0.0: 5938linkify-it@^2.0.0:
5061 version "2.0.3" 5939 version "2.1.0"
5062 resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" 5940 resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db"
5941 integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==
5063 dependencies: 5942 dependencies:
5064 uc.micro "^1.0.1" 5943 uc.micro "^1.0.1"
5065 5944
5066linkifyjs@^2.1.5: 5945linkifyjs@^2.1.5:
5067 version "2.1.7" 5946 version "2.1.7"
5068 resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.7.tgz#e5d68d2ae30b9c055e1d74cc40f9a31d3abb4012" 5947 resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.7.tgz#e5d68d2ae30b9c055e1d74cc40f9a31d3abb4012"
5948 integrity sha512-Cbn77BnYEslpAObZZoP6GVQHF1j5T6RsDydNq5RVxIy4eiZAiADRx7qHfWzfEMQecc1PtZFog1AsCGGX2WjQLA==
5069 optionalDependencies: 5949 optionalDependencies:
5070 jquery "^3.3.1" 5950 jquery "^3.3.1"
5071 react "^16.4.2" 5951 react "^16.4.2"
@@ -5074,6 +5954,7 @@ linkifyjs@^2.1.5:
5074load-ip-set@^2.1.0: 5954load-ip-set@^2.1.0:
5075 version "2.1.0" 5955 version "2.1.0"
5076 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b" 5956 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b"
5957 integrity sha512-taz7U6B+F7Zq90dfIKwqsB1CrFKelSEmMGC68OUqem8Cgd1QZygQBYb2Fk9i6muBSfH4xwF/Pjt4KKlAdOyWZw==
5077 dependencies: 5958 dependencies:
5078 ip-set "^1.0.0" 5959 ip-set "^1.0.0"
5079 netmask "^1.0.6" 5960 netmask "^1.0.6"
@@ -5083,7 +5964,8 @@ load-ip-set@^2.1.0:
5083 5964
5084load-json-file@^1.0.0: 5965load-json-file@^1.0.0:
5085 version "1.1.0" 5966 version "1.1.0"
5086 resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 5967 resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
5968 integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
5087 dependencies: 5969 dependencies:
5088 graceful-fs "^4.1.2" 5970 graceful-fs "^4.1.2"
5089 parse-json "^2.2.0" 5971 parse-json "^2.2.0"
@@ -5093,7 +5975,8 @@ load-json-file@^1.0.0:
5093 5975
5094load-json-file@^2.0.0: 5976load-json-file@^2.0.0:
5095 version "2.0.0" 5977 version "2.0.0"
5096 resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 5978 resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
5979 integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
5097 dependencies: 5980 dependencies:
5098 graceful-fs "^4.1.2" 5981 graceful-fs "^4.1.2"
5099 parse-json "^2.2.0" 5982 parse-json "^2.2.0"
@@ -5101,12 +5984,23 @@ load-json-file@^2.0.0:
5101 strip-bom "^3.0.0" 5984 strip-bom "^3.0.0"
5102 5985
5103loader-runner@^2.3.0: 5986loader-runner@^2.3.0:
5104 version "2.3.0" 5987 version "2.3.1"
5105 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" 5988 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979"
5989 integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==
5990
5991loader-utils@1.2.3:
5992 version "1.2.3"
5993 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
5994 integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
5995 dependencies:
5996 big.js "^5.2.2"
5997 emojis-list "^2.0.0"
5998 json5 "^1.0.1"
5106 5999
5107loader-utils@^0.2.16: 6000loader-utils@^0.2.16:
5108 version "0.2.17" 6001 version "0.2.17"
5109 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" 6002 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
6003 integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
5110 dependencies: 6004 dependencies:
5111 big.js "^3.1.3" 6005 big.js "^3.1.3"
5112 emojis-list "^2.0.0" 6006 emojis-list "^2.0.0"
@@ -5116,6 +6010,7 @@ loader-utils@^0.2.16:
5116loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0: 6010loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0:
5117 version "1.1.0" 6011 version "1.1.0"
5118 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 6012 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
6013 integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=
5119 dependencies: 6014 dependencies:
5120 big.js "^3.1.3" 6015 big.js "^3.1.3"
5121 emojis-list "^2.0.0" 6016 emojis-list "^2.0.0"
@@ -5124,6 +6019,7 @@ loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1
5124locate-path@^2.0.0: 6019locate-path@^2.0.0:
5125 version "2.0.0" 6020 version "2.0.0"
5126 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 6021 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
6022 integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
5127 dependencies: 6023 dependencies:
5128 p-locate "^2.0.0" 6024 p-locate "^2.0.0"
5129 path-exists "^3.0.0" 6025 path-exists "^3.0.0"
@@ -5131,6 +6027,7 @@ locate-path@^2.0.0:
5131locate-path@^3.0.0: 6027locate-path@^3.0.0:
5132 version "3.0.0" 6028 version "3.0.0"
5133 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 6029 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
6030 integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
5134 dependencies: 6031 dependencies:
5135 p-locate "^3.0.0" 6032 p-locate "^3.0.0"
5136 path-exists "^3.0.0" 6033 path-exists "^3.0.0"
@@ -5138,60 +6035,69 @@ locate-path@^3.0.0:
5138lodash-es@^4.17.4: 6035lodash-es@^4.17.4:
5139 version "4.17.11" 6036 version "4.17.11"
5140 resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" 6037 resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0"
6038 integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==
5141 6039
5142lodash.assign@^4.2.0: 6040lodash.assign@^4.2.0:
5143 version "4.2.0" 6041 version "4.2.0"
5144 resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 6042 resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
5145 6043 integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
5146lodash.camelcase@^4.3.0:
5147 version "4.3.0"
5148 resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
5149 6044
5150lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: 6045lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0:
5151 version "4.5.0" 6046 version "4.5.0"
5152 resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 6047 resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
6048 integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
5153 6049
5154lodash.debounce@^4.0.8: 6050lodash.debounce@^4.0.8:
5155 version "4.0.8" 6051 version "4.0.8"
5156 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 6052 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
6053 integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
5157 6054
5158lodash.escaperegexp@^4.1.2: 6055lodash.escaperegexp@^4.1.2:
5159 version "4.1.2" 6056 version "4.1.2"
5160 resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" 6057 resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
6058 integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
5161 6059
5162lodash.isplainobject@^4.0.6: 6060lodash.isplainobject@^4.0.6:
5163 version "4.0.6" 6061 version "4.0.6"
5164 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 6062 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
6063 integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
5165 6064
5166lodash.isstring@^4.0.1: 6065lodash.isstring@^4.0.1:
5167 version "4.0.1" 6066 version "4.0.1"
5168 resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 6067 resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
6068 integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
5169 6069
5170lodash.mergewith@^4.6.0: 6070lodash.mergewith@^4.6.0, lodash.mergewith@^4.6.1:
5171 version "4.6.1" 6071 version "4.6.1"
5172 resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" 6072 resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
6073 integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==
5173 6074
5174lodash.sortby@^4.7.0: 6075lodash.sortby@^4.7.0:
5175 version "4.7.0" 6076 version "4.7.0"
5176 resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 6077 resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
6078 integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
5177 6079
5178lodash.tail@^4.1.1: 6080lodash.tail@^4.1.1:
5179 version "4.1.1" 6081 version "4.1.1"
5180 resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" 6082 resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
6083 integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
5181 6084
5182lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@~4.17.10: 6085lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@~4.17.10:
5183 version "4.17.11" 6086 version "4.17.11"
5184 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 6087 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
6088 integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
5185 6089
5186log-symbols@^2.1.0: 6090log-symbols@^2.1.0:
5187 version "2.2.0" 6091 version "2.2.0"
5188 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 6092 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
6093 integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
5189 dependencies: 6094 dependencies:
5190 chalk "^2.0.1" 6095 chalk "^2.0.1"
5191 6096
5192log4js@^3.0.0: 6097log4js@^3.0.0:
5193 version "3.0.5" 6098 version "3.0.6"
5194 resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.5.tgz#b80146bfebad68b430d4f3569556d8a6edfef303" 6099 resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff"
6100 integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==
5195 dependencies: 6101 dependencies:
5196 circular-json "^0.5.5" 6102 circular-json "^0.5.5"
5197 date-format "^1.2.0" 6103 date-format "^1.2.0"
@@ -5202,10 +6108,12 @@ log4js@^3.0.0:
5202loglevel@^1.4.1: 6108loglevel@^1.4.1:
5203 version "1.6.1" 6109 version "1.6.1"
5204 resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" 6110 resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
6111 integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=
5205 6112
5206loglevelnext@^1.0.1: 6113loglevelnext@^1.0.1:
5207 version "1.0.5" 6114 version "1.0.5"
5208 resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" 6115 resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2"
6116 integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==
5209 dependencies: 6117 dependencies:
5210 es6-symbol "^3.1.1" 6118 es6-symbol "^3.1.1"
5211 object.assign "^4.1.0" 6119 object.assign "^4.1.0"
@@ -5213,12 +6121,14 @@ loglevelnext@^1.0.1:
5213loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 6121loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
5214 version "1.4.0" 6122 version "1.4.0"
5215 resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 6123 resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
6124 integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
5216 dependencies: 6125 dependencies:
5217 js-tokens "^3.0.0 || ^4.0.0" 6126 js-tokens "^3.0.0 || ^4.0.0"
5218 6127
5219loud-rejection@^1.0.0, loud-rejection@^1.6.0: 6128loud-rejection@^1.0.0:
5220 version "1.6.0" 6129 version "1.6.0"
5221 resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 6130 resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
6131 integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
5222 dependencies: 6132 dependencies:
5223 currently-unhandled "^0.4.1" 6133 currently-unhandled "^0.4.1"
5224 signal-exit "^3.0.0" 6134 signal-exit "^3.0.0"
@@ -5226,31 +6136,53 @@ loud-rejection@^1.0.0, loud-rejection@^1.6.0:
5226lower-case@^1.1.1: 6136lower-case@^1.1.1:
5227 version "1.1.4" 6137 version "1.1.4"
5228 resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" 6138 resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
6139 integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
5229 6140
5230lru-cache@2.2.x: 6141lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3:
5231 version "2.2.4" 6142 version "4.1.5"
5232 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" 6143 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
5233 6144 integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
5234lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3:
5235 version "4.1.3"
5236 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
5237 dependencies: 6145 dependencies:
5238 pseudomap "^1.0.2" 6146 pseudomap "^1.0.2"
5239 yallist "^2.1.2" 6147 yallist "^2.1.2"
5240 6148
6149lru-cache@^5.1.1:
6150 version "5.1.1"
6151 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
6152 integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
6153 dependencies:
6154 yallist "^3.0.2"
6155
5241lru@^3.0.0, lru@^3.1.0: 6156lru@^3.0.0, lru@^3.1.0:
5242 version "3.1.0" 6157 version "3.1.0"
5243 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5" 6158 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5"
6159 integrity sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=
5244 dependencies: 6160 dependencies:
5245 inherits "^2.0.1" 6161 inherits "^2.0.1"
5246 6162
5247m3u8-parser@4.2.0: 6163m3u8-parser@4.2.0:
5248 version "4.2.0" 6164 version "4.2.0"
5249 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.2.0.tgz#c8e0785fd17f741f4408b49466889274a9e36447" 6165 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.2.0.tgz#c8e0785fd17f741f4408b49466889274a9e36447"
6166 integrity sha512-LVHw0U6IPJjwk9i9f7Xe26NqaUHTNlIt4SSWoEfYFROeVKHN6MIjOhbRheI3dg8Jbq5WCuMFQ0QU3EgZpmzFPg==
6167
6168m3u8-parser@^4.3.0:
6169 version "4.3.0"
6170 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.3.0.tgz#4b4e988f87b6d8b2401d209a1d17798285a9da04"
6171 integrity sha512-bVbjuBMoVIgFL1vpXVIxjeaoB5TPDJRb0m5qiTdM738SGqv/LAmsnVVPlKjM4fulm/rr1XZsKM+owHm+zvqxYA==
6172 dependencies:
6173 global "^4.3.2"
6174
6175magic-string@^0.25.0:
6176 version "0.25.1"
6177 resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e"
6178 integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==
6179 dependencies:
6180 sourcemap-codec "^1.4.1"
5250 6181
5251magnet-uri@^5.1.3: 6182magnet-uri@^5.1.3:
5252 version "5.2.4" 6183 version "5.2.4"
5253 resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz#7afe5b736af04445aff744c93a890a3710077688" 6184 resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz#7afe5b736af04445aff744c93a890a3710077688"
6185 integrity sha512-VYaJMxhr8B9BrCiNINUsuhaEe40YnG+AQBwcqUKO66lSVaI9I3A1iH/6EmEwRI8OYUg5Gt+4lLE7achg676lrg==
5254 dependencies: 6186 dependencies:
5255 thirty-two "^1.0.1" 6187 thirty-two "^1.0.1"
5256 uniq "^1.0.1" 6188 uniq "^1.0.1"
@@ -5258,46 +6190,67 @@ magnet-uri@^5.1.3:
5258make-dir@^1.0.0, make-dir@^1.3.0: 6190make-dir@^1.0.0, make-dir@^1.3.0:
5259 version "1.3.0" 6191 version "1.3.0"
5260 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 6192 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
6193 integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
5261 dependencies: 6194 dependencies:
5262 pify "^3.0.0" 6195 pify "^3.0.0"
5263 6196
5264make-error@1.x: 6197make-error@1.x:
5265 version "1.3.5" 6198 version "1.3.5"
5266 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 6199 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
6200 integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
6201
6202make-fetch-happen@^4.0.1:
6203 version "4.0.1"
6204 resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083"
6205 integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==
6206 dependencies:
6207 agentkeepalive "^3.4.1"
6208 cacache "^11.0.1"
6209 http-cache-semantics "^3.8.1"
6210 http-proxy-agent "^2.1.0"
6211 https-proxy-agent "^2.2.1"
6212 lru-cache "^4.1.2"
6213 mississippi "^3.0.0"
6214 node-fetch-npm "^2.0.2"
6215 promise-retry "^1.1.1"
6216 socks-proxy-agent "^4.0.0"
6217 ssri "^6.0.0"
5267 6218
5268makeerror@1.0.x: 6219makeerror@1.0.x:
5269 version "1.0.11" 6220 version "1.0.11"
5270 resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" 6221 resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
6222 integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
5271 dependencies: 6223 dependencies:
5272 tmpl "1.0.x" 6224 tmpl "1.0.x"
5273 6225
5274mamacro@^0.0.3:
5275 version "0.0.3"
5276 resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
5277
5278map-age-cleaner@^0.1.1: 6226map-age-cleaner@^0.1.1:
5279 version "0.1.2" 6227 version "0.1.3"
5280 resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" 6228 resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
6229 integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
5281 dependencies: 6230 dependencies:
5282 p-defer "^1.0.0" 6231 p-defer "^1.0.0"
5283 6232
5284map-cache@^0.2.2: 6233map-cache@^0.2.2:
5285 version "0.2.2" 6234 version "0.2.2"
5286 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 6235 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
6236 integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
5287 6237
5288map-obj@^1.0.0, map-obj@^1.0.1: 6238map-obj@^1.0.0, map-obj@^1.0.1:
5289 version "1.0.1" 6239 version "1.0.1"
5290 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 6240 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
6241 integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
5291 6242
5292map-visit@^1.0.0: 6243map-visit@^1.0.0:
5293 version "1.0.0" 6244 version "1.0.0"
5294 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 6245 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
6246 integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
5295 dependencies: 6247 dependencies:
5296 object-visit "^1.0.0" 6248 object-visit "^1.0.0"
5297 6249
5298markdown-it@^8.4.0: 6250markdown-it@^8.4.0:
5299 version "8.4.2" 6251 version "8.4.2"
5300 resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" 6252 resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54"
6253 integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==
5301 dependencies: 6254 dependencies:
5302 argparse "^1.0.7" 6255 argparse "^1.0.7"
5303 entities "~1.1.1" 6256 entities "~1.1.1"
@@ -5308,25 +6261,36 @@ markdown-it@^8.4.0:
5308math-random@^1.0.1: 6261math-random@^1.0.1:
5309 version "1.0.1" 6262 version "1.0.1"
5310 resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" 6263 resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
6264 integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w=
5311 6265
5312md5.js@^1.3.4: 6266md5.js@^1.3.4:
5313 version "1.3.4" 6267 version "1.3.5"
5314 resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" 6268 resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
6269 integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
5315 dependencies: 6270 dependencies:
5316 hash-base "^3.0.0" 6271 hash-base "^3.0.0"
5317 inherits "^2.0.1" 6272 inherits "^2.0.1"
6273 safe-buffer "^5.1.2"
6274
6275mdn-data@~1.1.0:
6276 version "1.1.4"
6277 resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
6278 integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==
5318 6279
5319mdurl@^1.0.1: 6280mdurl@^1.0.1:
5320 version "1.0.1" 6281 version "1.0.1"
5321 resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 6282 resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
6283 integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
5322 6284
5323media-typer@0.3.0: 6285media-typer@0.3.0:
5324 version "0.3.0" 6286 version "0.3.0"
5325 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 6287 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
6288 integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
5326 6289
5327mediasource@^2.0.0, mediasource@^2.1.0: 6290mediasource@^2.1.0, mediasource@^2.2.2:
5328 version "2.2.2" 6291 version "2.2.2"
5329 resolved "https://registry.yarnpkg.com/mediasource/-/mediasource-2.2.2.tgz#2fe826f14e51da97fa4bf87be7b808a0b11d3a4c" 6292 resolved "https://registry.yarnpkg.com/mediasource/-/mediasource-2.2.2.tgz#2fe826f14e51da97fa4bf87be7b808a0b11d3a4c"
6293 integrity sha512-yIyAJMcu1mudTkxZ0jDAKnZJJba4eWPCxxtZRMpoaA4/AI7m7nqbRjmdxmi+x3hKTohb5vC9Yd3IBF/SUzp1vQ==
5330 dependencies: 6294 dependencies:
5331 inherits "^2.0.1" 6295 inherits "^2.0.1"
5332 readable-stream "^2.0.5" 6296 readable-stream "^2.0.5"
@@ -5335,12 +6299,14 @@ mediasource@^2.0.0, mediasource@^2.1.0:
5335mem@^1.1.0: 6299mem@^1.1.0:
5336 version "1.1.0" 6300 version "1.1.0"
5337 resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 6301 resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
6302 integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
5338 dependencies: 6303 dependencies:
5339 mimic-fn "^1.0.0" 6304 mimic-fn "^1.0.0"
5340 6305
5341mem@^4.0.0: 6306mem@^4.0.0:
5342 version "4.0.0" 6307 version "4.0.0"
5343 resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" 6308 resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf"
6309 integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==
5344 dependencies: 6310 dependencies:
5345 map-age-cleaner "^0.1.1" 6311 map-age-cleaner "^0.1.1"
5346 mimic-fn "^1.0.0" 6312 mimic-fn "^1.0.0"
@@ -5349,10 +6315,12 @@ mem@^4.0.0:
5349memory-chunk-store@^1.2.0: 6315memory-chunk-store@^1.2.0:
5350 version "1.3.0" 6316 version "1.3.0"
5351 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4" 6317 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4"
6318 integrity sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA==
5352 6319
5353memory-fs@^0.4.0, memory-fs@~0.4.1: 6320memory-fs@^0.4.0, memory-fs@~0.4.1:
5354 version "0.4.1" 6321 version "0.4.1"
5355 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" 6322 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
6323 integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
5356 dependencies: 6324 dependencies:
5357 errno "^0.1.3" 6325 errno "^0.1.3"
5358 readable-stream "^2.0.1" 6326 readable-stream "^2.0.1"
@@ -5360,6 +6328,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1:
5360meow@^3.7.0: 6328meow@^3.7.0:
5361 version "3.7.0" 6329 version "3.7.0"
5362 resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 6330 resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
6331 integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
5363 dependencies: 6332 dependencies:
5364 camelcase-keys "^2.0.0" 6333 camelcase-keys "^2.0.0"
5365 decamelize "^1.1.2" 6334 decamelize "^1.1.2"
@@ -5375,24 +6344,29 @@ meow@^3.7.0:
5375merge-descriptors@1.0.1: 6344merge-descriptors@1.0.1:
5376 version "1.0.1" 6345 version "1.0.1"
5377 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 6346 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
6347 integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
5378 6348
5379merge-stream@^1.0.1: 6349merge-stream@^1.0.1:
5380 version "1.0.1" 6350 version "1.0.1"
5381 resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" 6351 resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
6352 integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=
5382 dependencies: 6353 dependencies:
5383 readable-stream "^2.0.1" 6354 readable-stream "^2.0.1"
5384 6355
5385merge@^1.2.0: 6356merge@^1.2.0:
5386 version "1.2.0" 6357 version "1.2.1"
5387 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" 6358 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
6359 integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
5388 6360
5389methods@~1.1.2: 6361methods@~1.1.2:
5390 version "1.1.2" 6362 version "1.1.2"
5391 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 6363 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
6364 integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
5392 6365
5393micromatch@^2.1.5, micromatch@^2.3.11: 6366micromatch@^2.1.5, micromatch@^2.3.11:
5394 version "2.3.11" 6367 version "2.3.11"
5395 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 6368 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
6369 integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
5396 dependencies: 6370 dependencies:
5397 arr-diff "^2.0.0" 6371 arr-diff "^2.0.0"
5398 array-unique "^0.2.1" 6372 array-unique "^0.2.1"
@@ -5411,6 +6385,7 @@ micromatch@^2.1.5, micromatch@^2.3.11:
5411micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: 6385micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9:
5412 version "3.1.10" 6386 version "3.1.10"
5413 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 6387 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
6388 integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
5414 dependencies: 6389 dependencies:
5415 arr-diff "^4.0.0" 6390 arr-diff "^4.0.0"
5416 array-unique "^0.3.2" 6391 array-unique "^0.3.2"
@@ -5429,49 +6404,59 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9:
5429miller-rabin@^4.0.0: 6404miller-rabin@^4.0.0:
5430 version "4.0.1" 6405 version "4.0.1"
5431 resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 6406 resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
6407 integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
5432 dependencies: 6408 dependencies:
5433 bn.js "^4.0.0" 6409 bn.js "^4.0.0"
5434 brorand "^1.0.1" 6410 brorand "^1.0.1"
5435 6411
5436"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: 6412"mime-db@>= 1.36.0 < 2", mime-db@~1.37.0:
5437 version "1.36.0" 6413 version "1.37.0"
5438 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" 6414 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
6415 integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==
5439 6416
5440mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: 6417mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19:
5441 version "2.1.20" 6418 version "2.1.21"
5442 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" 6419 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
6420 integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==
5443 dependencies: 6421 dependencies:
5444 mime-db "~1.36.0" 6422 mime-db "~1.37.0"
5445 6423
5446mime@1.4.1: 6424mime@1.4.1:
5447 version "1.4.1" 6425 version "1.4.1"
5448 resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 6426 resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
6427 integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
5449 6428
5450mime@^1.4.1: 6429mime@^1.4.1:
5451 version "1.6.0" 6430 version "1.6.0"
5452 resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 6431 resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
6432 integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
5453 6433
5454mime@^2.0.3, mime@^2.2.0, mime@^2.3.1: 6434mime@^2.2.0, mime@^2.3.1:
5455 version "2.3.1" 6435 version "2.4.0"
5456 resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" 6436 resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
6437 integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==
5457 6438
5458mimic-fn@^1.0.0: 6439mimic-fn@^1.0.0:
5459 version "1.2.0" 6440 version "1.2.0"
5460 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 6441 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
6442 integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
5461 6443
5462mimic-response@^1.0.0: 6444mimic-response@^1.0.0:
5463 version "1.0.1" 6445 version "1.0.1"
5464 resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 6446 resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
6447 integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
5465 6448
5466min-document@^2.19.0: 6449min-document@^2.19.0:
5467 version "2.19.0" 6450 version "2.19.0"
5468 resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 6451 resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
6452 integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
5469 dependencies: 6453 dependencies:
5470 dom-walk "^0.1.0" 6454 dom-walk "^0.1.0"
5471 6455
5472mini-css-extract-plugin@~0.4.0: 6456mini-css-extract-plugin@0.5.0:
5473 version "0.4.3" 6457 version "0.5.0"
5474 resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" 6458 resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
6459 integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==
5475 dependencies: 6460 dependencies:
5476 loader-utils "^1.1.0" 6461 loader-utils "^1.1.0"
5477 schema-utils "^1.0.0" 6462 schema-utils "^1.0.0"
@@ -5480,45 +6465,54 @@ mini-css-extract-plugin@~0.4.0:
5480minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 6465minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
5481 version "1.0.1" 6466 version "1.0.1"
5482 resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 6467 resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
6468 integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
5483 6469
5484minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 6470minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
5485 version "1.0.1" 6471 version "1.0.1"
5486 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 6472 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
6473 integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
5487 6474
5488"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: 6475minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
5489 version "3.0.4" 6476 version "3.0.4"
5490 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 6477 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
6478 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
5491 dependencies: 6479 dependencies:
5492 brace-expansion "^1.1.7" 6480 brace-expansion "^1.1.7"
5493 6481
5494minimist@0.0.8: 6482minimist@0.0.8:
5495 version "0.0.8" 6483 version "0.0.8"
5496 resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 6484 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
6485 integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
5497 6486
5498minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: 6487minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
5499 version "1.2.0" 6488 version "1.2.0"
5500 resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 6489 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
6490 integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
5501 6491
5502minimist@~0.0.1: 6492minimist@~0.0.1:
5503 version "0.0.10" 6493 version "0.0.10"
5504 resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 6494 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
6495 integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
5505 6496
5506minipass@^2.2.1, minipass@^2.3.3: 6497minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5:
5507 version "2.3.4" 6498 version "2.3.5"
5508 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" 6499 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
6500 integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
5509 dependencies: 6501 dependencies:
5510 safe-buffer "^5.1.2" 6502 safe-buffer "^5.1.2"
5511 yallist "^3.0.0" 6503 yallist "^3.0.0"
5512 6504
5513minizlib@^1.1.0: 6505minizlib@^1.1.1:
5514 version "1.1.0" 6506 version "1.1.1"
5515 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 6507 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
6508 integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==
5516 dependencies: 6509 dependencies:
5517 minipass "^2.2.1" 6510 minipass "^2.2.1"
5518 6511
5519mississippi@^2.0.0: 6512mississippi@^2.0.0:
5520 version "2.0.0" 6513 version "2.0.0"
5521 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" 6514 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
6515 integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
5522 dependencies: 6516 dependencies:
5523 concat-stream "^1.5.0" 6517 concat-stream "^1.5.0"
5524 duplexify "^3.4.2" 6518 duplexify "^3.4.2"
@@ -5534,6 +6528,7 @@ mississippi@^2.0.0:
5534mississippi@^3.0.0: 6528mississippi@^3.0.0:
5535 version "3.0.0" 6529 version "3.0.0"
5536 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" 6530 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
6531 integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
5537 dependencies: 6532 dependencies:
5538 concat-stream "^1.5.0" 6533 concat-stream "^1.5.0"
5539 duplexify "^3.4.2" 6534 duplexify "^3.4.2"
@@ -5549,6 +6544,7 @@ mississippi@^3.0.0:
5549mixin-deep@^1.2.0: 6544mixin-deep@^1.2.0:
5550 version "1.3.1" 6545 version "1.3.1"
5551 resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 6546 resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
6547 integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
5552 dependencies: 6548 dependencies:
5553 for-in "^1.0.2" 6549 for-in "^1.0.2"
5554 is-extendable "^1.0.1" 6550 is-extendable "^1.0.1"
@@ -5556,23 +6552,27 @@ mixin-deep@^1.2.0:
5556mixin-object@^2.0.1: 6552mixin-object@^2.0.1:
5557 version "2.0.1" 6553 version "2.0.1"
5558 resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" 6554 resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
6555 integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
5559 dependencies: 6556 dependencies:
5560 for-in "^0.1.3" 6557 for-in "^0.1.3"
5561 is-extendable "^0.1.1" 6558 is-extendable "^0.1.1"
5562 6559
5563mkdirp@0.5.x, mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: 6560mkdirp@0.5.x, mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
5564 version "0.5.1" 6561 version "0.5.1"
5565 resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 6562 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
6563 integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
5566 dependencies: 6564 dependencies:
5567 minimist "0.0.8" 6565 minimist "0.0.8"
5568 6566
5569mousetrap@^1.6.0: 6567mousetrap@^1.6.0:
5570 version "1.6.2" 6568 version "1.6.2"
5571 resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.2.tgz#caadd9cf886db0986fb2fee59a82f6bd37527587" 6569 resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.2.tgz#caadd9cf886db0986fb2fee59a82f6bd37527587"
6570 integrity sha512-jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==
5572 6571
5573move-concurrently@^1.0.1: 6572move-concurrently@^1.0.1:
5574 version "1.0.1" 6573 version "1.0.1"
5575 resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" 6574 resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
6575 integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
5576 dependencies: 6576 dependencies:
5577 aproba "^1.1.1" 6577 aproba "^1.1.1"
5578 copy-concurrently "^1.0.0" 6578 copy-concurrently "^1.0.0"
@@ -5584,6 +6584,7 @@ move-concurrently@^1.0.1:
5584mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0: 6584mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0:
5585 version "1.3.0" 6585 version "1.3.0"
5586 resolved "https://registry.yarnpkg.com/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz#2a6f750947ff68c3a498fd76cd6424c53d995d48" 6586 resolved "https://registry.yarnpkg.com/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz#2a6f750947ff68c3a498fd76cd6424c53d995d48"
6587 integrity sha512-U4pMLpjT/UzB8d36dxj6Mf1bG9xypEvgbuRIa1fztRXNKKTCAtRxsnFZhNOd7YDFOKtjBgssYGvo4H/Q3ZY1MA==
5587 dependencies: 6588 dependencies:
5588 buffer-alloc "^1.2.0" 6589 buffer-alloc "^1.2.0"
5589 buffer-from "^1.1.0" 6590 buffer-from "^1.1.0"
@@ -5592,6 +6593,7 @@ mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0:
5592mp4-stream@^2.0.0: 6593mp4-stream@^2.0.0:
5593 version "2.0.3" 6594 version "2.0.3"
5594 resolved "https://registry.yarnpkg.com/mp4-stream/-/mp4-stream-2.0.3.tgz#30acee07709d323f8dcd87a07b3ce9c3c4bfb364" 6595 resolved "https://registry.yarnpkg.com/mp4-stream/-/mp4-stream-2.0.3.tgz#30acee07709d323f8dcd87a07b3ce9c3c4bfb364"
6596 integrity sha512-5NzgI0+bGakoZEwnIYINXqB3mnewkt3Y7jcvkXsTubnCNUSdM8cpP0Vemxf6FLg0qUN8fydTgNMVAc3QU8B92g==
5595 dependencies: 6597 dependencies:
5596 buffer-alloc "^1.1.0" 6598 buffer-alloc "^1.1.0"
5597 inherits "^2.0.1" 6599 inherits "^2.0.1"
@@ -5599,28 +6601,33 @@ mp4-stream@^2.0.0:
5599 next-event "^1.0.0" 6601 next-event "^1.0.0"
5600 readable-stream "^2.0.3" 6602 readable-stream "^2.0.3"
5601 6603
5602mpd-parser@0.6.1: 6604mpd-parser@0.7.0:
5603 version "0.6.1" 6605 version "0.7.0"
5604 resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-0.6.1.tgz#27e7aafe075817846ce55406ac03711df1ce0eb7" 6606 resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-0.7.0.tgz#d36e3322579fce23d657f71a3c2f3e6cc5ce4002"
6607 integrity sha512-nkzVIkecaDz3q7p4ToN3GR0FV2Odbh0w2sJ8ijsyw79JcBrJoUD3KHIiI8gL0hEDlex7mrVpTxXBsRHowUBmPw==
5605 dependencies: 6608 dependencies:
5606 global "^4.3.0" 6609 global "^4.3.2"
5607 url-toolkit "^2.1.1" 6610 url-toolkit "^2.1.1"
5608 6611
5609ms@2.0.0: 6612ms@2.0.0:
5610 version "2.0.0" 6613 version "2.0.0"
5611 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 6614 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
6615 integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
5612 6616
5613ms@^2.1.1: 6617ms@^2.0.0, ms@^2.1.1:
5614 version "2.1.1" 6618 version "2.1.1"
5615 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 6619 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
6620 integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
5616 6621
5617multicast-dns-service-types@^1.1.0: 6622multicast-dns-service-types@^1.1.0:
5618 version "1.1.0" 6623 version "1.1.0"
5619 resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" 6624 resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
6625 integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
5620 6626
5621multicast-dns@^6.0.1: 6627multicast-dns@^6.0.1:
5622 version "6.2.3" 6628 version "6.2.3"
5623 resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" 6629 resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
6630 integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
5624 dependencies: 6631 dependencies:
5625 dns-packet "^1.3.1" 6632 dns-packet "^1.3.1"
5626 thunky "^1.0.2" 6633 thunky "^1.0.2"
@@ -5628,6 +6635,7 @@ multicast-dns@^6.0.1:
5628multistream@^2.0.2, multistream@^2.0.5: 6635multistream@^2.0.2, multistream@^2.0.5:
5629 version "2.1.1" 6636 version "2.1.1"
5630 resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c" 6637 resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c"
6638 integrity sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==
5631 dependencies: 6639 dependencies:
5632 inherits "^2.0.1" 6640 inherits "^2.0.1"
5633 readable-stream "^2.0.5" 6641 readable-stream "^2.0.5"
@@ -5635,18 +6643,22 @@ multistream@^2.0.2, multistream@^2.0.5:
5635mute-stream@0.0.7: 6643mute-stream@0.0.7:
5636 version "0.0.7" 6644 version "0.0.7"
5637 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 6645 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
6646 integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
5638 6647
5639mux.js@4.5.1: 6648mux.js@4.5.1:
5640 version "4.5.1" 6649 version "4.5.1"
5641 resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-4.5.1.tgz#1d70f1ad9b951315e16390d47be8fc42fd080194" 6650 resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-4.5.1.tgz#1d70f1ad9b951315e16390d47be8fc42fd080194"
6651 integrity sha512-j4rEyZKCRinGaSiBxPx9YD9B782TMPHPOlKyaMY07vIGTNYg4ouCEBvL6zX9Hh1k1fKZ5ZF3S7c+XVk6PB+Igw==
5642 6652
5643nan@^2.10.0, nan@^2.9.2: 6653nan@^2.10.0, nan@^2.9.2:
5644 version "2.11.0" 6654 version "2.11.1"
5645 resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" 6655 resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
6656 integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==
5646 6657
5647nanomatch@^1.2.9: 6658nanomatch@^1.2.9:
5648 version "1.2.13" 6659 version "1.2.13"
5649 resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 6660 resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
6661 integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
5650 dependencies: 6662 dependencies:
5651 arr-diff "^4.0.0" 6663 arr-diff "^4.0.0"
5652 array-unique "^0.3.2" 6664 array-unique "^0.3.2"
@@ -5663,10 +6675,12 @@ nanomatch@^1.2.9:
5663natural-compare@^1.4.0: 6675natural-compare@^1.4.0:
5664 version "1.4.0" 6676 version "1.4.0"
5665 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 6677 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
6678 integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
5666 6679
5667needle@^2.2.1: 6680needle@^2.2.1:
5668 version "2.2.3" 6681 version "2.2.4"
5669 resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" 6682 resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
6683 integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==
5670 dependencies: 6684 dependencies:
5671 debug "^2.1.2" 6685 debug "^2.1.2"
5672 iconv-lite "^0.4.4" 6686 iconv-lite "^0.4.4"
@@ -5675,32 +6689,39 @@ needle@^2.2.1:
5675negotiator@0.6.1: 6689negotiator@0.6.1:
5676 version "0.6.1" 6690 version "0.6.1"
5677 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 6691 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
6692 integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
5678 6693
5679neo-async@^2.5.0: 6694neo-async@^2.5.0:
5680 version "2.5.2" 6695 version "2.6.0"
5681 resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" 6696 resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
6697 integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==
5682 6698
5683netmask@^1.0.6: 6699netmask@^1.0.6:
5684 version "1.0.6" 6700 version "1.0.6"
5685 resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" 6701 resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
6702 integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=
5686 6703
5687next-event@^1.0.0: 6704next-event@^1.0.0:
5688 version "1.0.0" 6705 version "1.0.0"
5689 resolved "https://registry.yarnpkg.com/next-event/-/next-event-1.0.0.tgz#e7778acde2e55802e0ad1879c39cf6f75eda61d8" 6706 resolved "https://registry.yarnpkg.com/next-event/-/next-event-1.0.0.tgz#e7778acde2e55802e0ad1879c39cf6f75eda61d8"
6707 integrity sha1-53eKzeLlWALgrRh5w5z2917aYdg=
5690 6708
5691next-tick@1: 6709next-tick@1:
5692 version "1.0.0" 6710 version "1.0.0"
5693 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 6711 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
6712 integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
5694 6713
5695ng2-material-dropdown@0.10.1: 6714ng2-material-dropdown@0.10.1:
5696 version "0.10.1" 6715 version "0.10.1"
5697 resolved "https://registry.yarnpkg.com/ng2-material-dropdown/-/ng2-material-dropdown-0.10.1.tgz#0120ce1bbabfb065c62610fe3b572cd09f61b1e1" 6716 resolved "https://registry.yarnpkg.com/ng2-material-dropdown/-/ng2-material-dropdown-0.10.1.tgz#0120ce1bbabfb065c62610fe3b572cd09f61b1e1"
6717 integrity sha512-dOmk4+T6Rbtk60Un7sxOOFU546z5JEYupSL+RiG0/rN4DmJvxPp297AvA2Qm9LSMNszUZMi55cRzj79zQYu85g==
5698 dependencies: 6718 dependencies:
5699 tslib "^1.9.0" 6719 tslib "^1.9.0"
5700 6720
5701ngx-chips@1.9.7: 6721ngx-chips@1.9.7:
5702 version "1.9.7" 6722 version "1.9.7"
5703 resolved "https://registry.yarnpkg.com/ngx-chips/-/ngx-chips-1.9.7.tgz#0f0f30df65566edb4cc129554e8e071cf78835a5" 6723 resolved "https://registry.yarnpkg.com/ngx-chips/-/ngx-chips-1.9.7.tgz#0f0f30df65566edb4cc129554e8e071cf78835a5"
6724 integrity sha512-AJyKJ24V5a19ANYTNgaftsv9zffpZgR4hNBJfrQ3Pct6zs545NPz5DVIiUBOTWbH4YMgcCpS2uDcbec+J1N06g==
5704 dependencies: 6725 dependencies:
5705 ng2-material-dropdown "0.10.1" 6726 ng2-material-dropdown "0.10.1"
5706 tslib "^1.9.0" 6727 tslib "^1.9.0"
@@ -5708,55 +6729,67 @@ ngx-chips@1.9.7:
5708ngx-clipboard@11.1.7: 6729ngx-clipboard@11.1.7:
5709 version "11.1.7" 6730 version "11.1.7"
5710 resolved "https://registry.yarnpkg.com/ngx-clipboard/-/ngx-clipboard-11.1.7.tgz#a880f82ab2dd17476d8fa9a48f7f524f37fdbef8" 6731 resolved "https://registry.yarnpkg.com/ngx-clipboard/-/ngx-clipboard-11.1.7.tgz#a880f82ab2dd17476d8fa9a48f7f524f37fdbef8"
6732 integrity sha512-84BMdd8h9TqI87CtEElj19B4AlDyqj9pz+Iy52jwnXereui774A8H7CT6OoDQ+JP6MGl0r+gpTjTfiKC0hhxIg==
5711 dependencies: 6733 dependencies:
5712 ngx-window-token "^1.0.0" 6734 ngx-window-token "^1.0.0"
5713 tslib "^1.9.0" 6735 tslib "^1.9.0"
5714 6736
5715ngx-pipes@^2.1.7: 6737ngx-pipes@^2.1.7:
5716 version "2.3.5" 6738 version "2.3.6"
5717 resolved "https://registry.yarnpkg.com/ngx-pipes/-/ngx-pipes-2.3.5.tgz#3a5663dcd540d04f1a7997db50b33bf4c2b1f03e" 6739 resolved "https://registry.yarnpkg.com/ngx-pipes/-/ngx-pipes-2.3.6.tgz#3c7ba04844f0191262165d89d3aecf1a45b9d410"
6740 integrity sha512-BLbZyqa7UjSp+qOmj5elPyMXedvgC5lI6W9kIDXaxE+4TIAPsbmLK3axo8NW22Bu73DgRYy8Ftepv3XV2dMqDg==
5718 dependencies: 6741 dependencies:
5719 tslib "^1.9.0" 6742 tslib "^1.9.0"
5720 6743
5721ngx-qrcode2@^0.0.9: 6744ngx-qrcode2@^0.0.9:
5722 version "0.0.9" 6745 version "0.0.9"
5723 resolved "https://registry.yarnpkg.com/ngx-qrcode2/-/ngx-qrcode2-0.0.9.tgz#8229783623b60f79cce155e763ac170d8ad1eae8" 6746 resolved "https://registry.yarnpkg.com/ngx-qrcode2/-/ngx-qrcode2-0.0.9.tgz#8229783623b60f79cce155e763ac170d8ad1eae8"
6747 integrity sha512-PsELe+37ktkD/xv3rodWb7r5viK4KNZP9BqxmluyI7MCruea48+PqKNKQOx6R+V+8zypbb7vWxXJxGRlrdAaBQ==
5724 dependencies: 6748 dependencies:
5725 qrcode "^0.8.2" 6749 qrcode "^0.8.2"
5726 6750
5727ngx-textarea-autosize@^2.0.0:
5728 version "2.0.0"
5729 resolved "https://registry.yarnpkg.com/ngx-textarea-autosize/-/ngx-textarea-autosize-2.0.0.tgz#70d0bf770ebd62b5609c6552233d29c304f92ab8"
5730 dependencies:
5731 tslib "^1.7.1"
5732
5733ngx-window-token@^1.0.0: 6751ngx-window-token@^1.0.0:
5734 version "1.0.0" 6752 version "1.0.2"
5735 resolved "https://registry.yarnpkg.com/ngx-window-token/-/ngx-window-token-1.0.0.tgz#12acb174fbbcffa5c60b3fea5a6ea78cc3304793" 6753 resolved "https://registry.yarnpkg.com/ngx-window-token/-/ngx-window-token-1.0.2.tgz#2ebadd300fee1f61eb8b851b0ad97b1f46f5e4cc"
6754 integrity sha512-bFgvi7MYSK1p4b3Mqvn9+biXaO8QDEbpP2sEMSwr0Zgrwh6zCO3F92a6SIIzusqpZBAhxyfVSqj3mO5qIxlM5Q==
5736 dependencies: 6755 dependencies:
5737 tslib "^1.9.0" 6756 tslib "^1.9.0"
5738 6757
5739nice-try@^1.0.4: 6758nice-try@^1.0.4:
5740 version "1.0.5" 6759 version "1.0.5"
5741 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 6760 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
6761 integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
5742 6762
5743no-case@^2.2.0: 6763no-case@^2.2.0:
5744 version "2.3.2" 6764 version "2.3.2"
5745 resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" 6765 resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
6766 integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
5746 dependencies: 6767 dependencies:
5747 lower-case "^1.1.1" 6768 lower-case "^1.1.1"
5748 6769
6770node-fetch-npm@^2.0.2:
6771 version "2.0.2"
6772 resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
6773 integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==
6774 dependencies:
6775 encoding "^0.1.11"
6776 json-parse-better-errors "^1.0.0"
6777 safe-buffer "^5.1.1"
6778
5749node-forge@0.7.5: 6779node-forge@0.7.5:
5750 version "0.7.5" 6780 version "0.7.5"
5751 resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" 6781 resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
6782 integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==
5752 6783
5753node-gyp-build@~3.4.0: 6784node-gyp-build@~3.4.0:
5754 version "3.4.0" 6785 version "3.4.0"
5755 resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.4.0.tgz#f8f62507e65f152488b28aac25d04b9d79748cf7" 6786 resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.4.0.tgz#f8f62507e65f152488b28aac25d04b9d79748cf7"
6787 integrity sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw==
5756 6788
5757node-gyp@^3.8.0: 6789node-gyp@^3.8.0:
5758 version "3.8.0" 6790 version "3.8.0"
5759 resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 6791 resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
6792 integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
5760 dependencies: 6793 dependencies:
5761 fstream "^1.0.0" 6794 fstream "^1.0.0"
5762 glob "^7.0.3" 6795 glob "^7.0.3"
@@ -5774,10 +6807,12 @@ node-gyp@^3.8.0:
5774node-int64@^0.4.0: 6807node-int64@^0.4.0:
5775 version "0.4.0" 6808 version "0.4.0"
5776 resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" 6809 resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
6810 integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
5777 6811
5778node-libs-browser@^2.0.0: 6812node-libs-browser@^2.0.0:
5779 version "2.1.0" 6813 version "2.1.0"
5780 resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" 6814 resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
6815 integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==
5781 dependencies: 6816 dependencies:
5782 assert "^1.1.1" 6817 assert "^1.1.1"
5783 browserify-zlib "^0.2.0" 6818 browserify-zlib "^0.2.0"
@@ -5804,17 +6839,19 @@ node-libs-browser@^2.0.0:
5804 vm-browserify "0.0.4" 6839 vm-browserify "0.0.4"
5805 6840
5806node-notifier@^5.2.1: 6841node-notifier@^5.2.1:
5807 version "5.2.1" 6842 version "5.3.0"
5808 resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" 6843 resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01"
6844 integrity sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==
5809 dependencies: 6845 dependencies:
5810 growly "^1.3.0" 6846 growly "^1.3.0"
5811 semver "^5.4.1" 6847 semver "^5.5.0"
5812 shellwords "^0.1.1" 6848 shellwords "^0.1.1"
5813 which "^1.3.0" 6849 which "^1.3.0"
5814 6850
5815node-pre-gyp@^0.10.0: 6851node-pre-gyp@^0.10.0:
5816 version "0.10.3" 6852 version "0.10.3"
5817 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 6853 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
6854 integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==
5818 dependencies: 6855 dependencies:
5819 detect-libc "^1.0.2" 6856 detect-libc "^1.0.2"
5820 mkdirp "^0.5.1" 6857 mkdirp "^0.5.1"
@@ -5827,9 +6864,42 @@ node-pre-gyp@^0.10.0:
5827 semver "^5.3.0" 6864 semver "^5.3.0"
5828 tar "^4" 6865 tar "^4"
5829 6866
6867node-releases@^1.1.3:
6868 version "1.1.7"
6869 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.7.tgz#b09a10394d0ed8f7778f72bb861dde68b146303b"
6870 integrity sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==
6871 dependencies:
6872 semver "^5.3.0"
6873
6874node-sass@4.11.0:
6875 version "4.11.0"
6876 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
6877 integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==
6878 dependencies:
6879 async-foreach "^0.1.3"
6880 chalk "^1.1.1"
6881 cross-spawn "^3.0.0"
6882 gaze "^1.0.0"
6883 get-stdin "^4.0.1"
6884 glob "^7.0.3"
6885 in-publish "^2.0.0"
6886 lodash.assign "^4.2.0"
6887 lodash.clonedeep "^4.3.2"
6888 lodash.mergewith "^4.6.0"
6889 meow "^3.7.0"
6890 mkdirp "^0.5.1"
6891 nan "^2.10.0"
6892 node-gyp "^3.8.0"
6893 npmlog "^4.0.0"
6894 request "^2.88.0"
6895 sass-graph "^2.2.4"
6896 stdout-stream "^1.4.0"
6897 "true-case-path" "^1.0.2"
6898
5830node-sass@^4.9.3: 6899node-sass@^4.9.3:
5831 version "4.9.3" 6900 version "4.10.0"
5832 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" 6901 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4"
6902 integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==
5833 dependencies: 6903 dependencies:
5834 async-foreach "^0.1.3" 6904 async-foreach "^0.1.3"
5835 chalk "^1.1.1" 6905 chalk "^1.1.1"
@@ -5846,27 +6916,30 @@ node-sass@^4.9.3:
5846 nan "^2.10.0" 6916 nan "^2.10.0"
5847 node-gyp "^3.8.0" 6917 node-gyp "^3.8.0"
5848 npmlog "^4.0.0" 6918 npmlog "^4.0.0"
5849 request "2.87.0" 6919 request "^2.88.0"
5850 sass-graph "^2.2.4" 6920 sass-graph "^2.2.4"
5851 stdout-stream "^1.4.0" 6921 stdout-stream "^1.4.0"
5852 "true-case-path" "^1.0.2" 6922 "true-case-path" "^1.0.2"
5853 6923
5854"nopt@2 || 3", nopt@3.x: 6924"nopt@2 || 3":
5855 version "3.0.6" 6925 version "3.0.6"
5856 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 6926 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
6927 integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
5857 dependencies: 6928 dependencies:
5858 abbrev "1" 6929 abbrev "1"
5859 6930
5860nopt@^4.0.1: 6931nopt@^4.0.1:
5861 version "4.0.1" 6932 version "4.0.1"
5862 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 6933 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
6934 integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
5863 dependencies: 6935 dependencies:
5864 abbrev "1" 6936 abbrev "1"
5865 osenv "^0.1.4" 6937 osenv "^0.1.4"
5866 6938
5867normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0": 6939normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0:
5868 version "2.4.0" 6940 version "2.4.0"
5869 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 6941 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
6942 integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==
5870 dependencies: 6943 dependencies:
5871 hosted-git-info "^2.1.4" 6944 hosted-git-info "^2.1.4"
5872 is-builtin-module "^1.0.0" 6945 is-builtin-module "^1.0.0"
@@ -5876,64 +6949,75 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package
5876normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: 6949normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
5877 version "2.1.1" 6950 version "2.1.1"
5878 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 6951 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
6952 integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
5879 dependencies: 6953 dependencies:
5880 remove-trailing-separator "^1.0.1" 6954 remove-trailing-separator "^1.0.1"
5881 6955
5882normalize-range@^0.1.2: 6956normalize-range@^0.1.2:
5883 version "0.1.2" 6957 version "0.1.2"
5884 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 6958 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
6959 integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
5885 6960
5886npm-bundled@^1.0.1: 6961npm-bundled@^1.0.1:
5887 version "1.0.5" 6962 version "1.0.5"
5888 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 6963 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
6964 integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==
5889 6965
5890npm-font-source-sans-pro@^1.0.2: 6966npm-font-source-sans-pro@^1.0.2:
5891 version "1.0.2" 6967 version "1.0.2"
5892 resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e" 6968 resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e"
6969 integrity sha1-xVyK42juvbysplQloNfh+aGSoD4=
5893 6970
5894"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0": 6971npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
5895 version "6.1.0" 6972 version "6.1.0"
5896 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" 6973 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
6974 integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==
5897 dependencies: 6975 dependencies:
5898 hosted-git-info "^2.6.0" 6976 hosted-git-info "^2.6.0"
5899 osenv "^0.1.5" 6977 osenv "^0.1.5"
5900 semver "^5.5.0" 6978 semver "^5.5.0"
5901 validate-npm-package-name "^3.0.0" 6979 validate-npm-package-name "^3.0.0"
5902 6980
5903npm-packlist@^1.1.6: 6981npm-packlist@^1.1.12, npm-packlist@^1.1.6:
5904 version "1.1.11" 6982 version "1.1.12"
5905 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" 6983 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
6984 integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==
5906 dependencies: 6985 dependencies:
5907 ignore-walk "^3.0.1" 6986 ignore-walk "^3.0.1"
5908 npm-bundled "^1.0.1" 6987 npm-bundled "^1.0.1"
5909 6988
5910npm-registry-client@^8.5.1: 6989npm-pick-manifest@^2.2.3:
5911 version "8.6.0" 6990 version "2.2.3"
5912 resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" 6991 resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40"
6992 integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==
5913 dependencies: 6993 dependencies:
5914 concat-stream "^1.5.2" 6994 figgy-pudding "^3.5.1"
5915 graceful-fs "^4.1.6" 6995 npm-package-arg "^6.0.0"
5916 normalize-package-data "~1.0.1 || ^2.0.0" 6996 semver "^5.4.1"
5917 npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 6997
5918 once "^1.3.3" 6998npm-registry-fetch@^3.8.0:
5919 request "^2.74.0" 6999 version "3.8.0"
5920 retry "^0.10.0" 7000 resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc"
5921 safe-buffer "^5.1.1" 7001 integrity sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==
5922 semver "2 >=2.2.1 || 3.x || 4 || 5" 7002 dependencies:
5923 slide "^1.1.3" 7003 JSONStream "^1.3.4"
5924 ssri "^5.2.4" 7004 bluebird "^3.5.1"
5925 optionalDependencies: 7005 figgy-pudding "^3.4.1"
5926 npmlog "2 || ^3.1.0 || ^4.0.0" 7006 lru-cache "^4.1.3"
7007 make-fetch-happen "^4.0.1"
7008 npm-package-arg "^6.1.0"
5927 7009
5928npm-run-path@^2.0.0: 7010npm-run-path@^2.0.0:
5929 version "2.0.2" 7011 version "2.0.2"
5930 resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 7012 resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
7013 integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
5931 dependencies: 7014 dependencies:
5932 path-key "^2.0.0" 7015 path-key "^2.0.0"
5933 7016
5934"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.0.2: 7017"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
5935 version "4.1.2" 7018 version "4.1.2"
5936 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 7019 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
7020 integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
5937 dependencies: 7021 dependencies:
5938 are-we-there-yet "~1.1.2" 7022 are-we-there-yet "~1.1.2"
5939 console-control-strings "~1.1.0" 7023 console-control-strings "~1.1.0"
@@ -5941,46 +7025,51 @@ npm-run-path@^2.0.0:
5941 set-blocking "~2.0.0" 7025 set-blocking "~2.0.0"
5942 7026
5943nth-check@~1.0.1: 7027nth-check@~1.0.1:
5944 version "1.0.1" 7028 version "1.0.2"
5945 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" 7029 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
7030 integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
5946 dependencies: 7031 dependencies:
5947 boolbase "~1.0.0" 7032 boolbase "~1.0.0"
5948 7033
5949null-check@^1.0.0: 7034null-check@^1.0.0:
5950 version "1.0.0" 7035 version "1.0.0"
5951 resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" 7036 resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
7037 integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=
5952 7038
5953num2fraction@^1.2.2: 7039num2fraction@^1.2.2:
5954 version "1.2.2" 7040 version "1.2.2"
5955 resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 7041 resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
7042 integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
5956 7043
5957number-is-nan@^1.0.0: 7044number-is-nan@^1.0.0:
5958 version "1.0.1" 7045 version "1.0.1"
5959 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 7046 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
7047 integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
5960 7048
5961nwsapi@^2.0.7: 7049nwsapi@^2.0.7:
5962 version "2.0.9" 7050 version "2.0.9"
5963 resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" 7051 resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016"
5964 7052 integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==
5965oauth-sign@~0.8.2:
5966 version "0.8.2"
5967 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
5968 7053
5969oauth-sign@~0.9.0: 7054oauth-sign@~0.9.0:
5970 version "0.9.0" 7055 version "0.9.0"
5971 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 7056 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
7057 integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
5972 7058
5973object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 7059object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
5974 version "4.1.1" 7060 version "4.1.1"
5975 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 7061 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
7062 integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
5976 7063
5977object-component@0.0.3: 7064object-component@0.0.3:
5978 version "0.0.3" 7065 version "0.0.3"
5979 resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 7066 resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
7067 integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
5980 7068
5981object-copy@^0.1.0: 7069object-copy@^0.1.0:
5982 version "0.1.0" 7070 version "0.1.0"
5983 resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 7071 resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
7072 integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
5984 dependencies: 7073 dependencies:
5985 copy-descriptor "^0.1.0" 7074 copy-descriptor "^0.1.0"
5986 define-property "^0.2.5" 7075 define-property "^0.2.5"
@@ -5989,16 +7078,19 @@ object-copy@^0.1.0:
5989object-keys@^1.0.11, object-keys@^1.0.12: 7078object-keys@^1.0.11, object-keys@^1.0.12:
5990 version "1.0.12" 7079 version "1.0.12"
5991 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" 7080 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
7081 integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==
5992 7082
5993object-visit@^1.0.0: 7083object-visit@^1.0.0:
5994 version "1.0.1" 7084 version "1.0.1"
5995 resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 7085 resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
7086 integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
5996 dependencies: 7087 dependencies:
5997 isobject "^3.0.0" 7088 isobject "^3.0.0"
5998 7089
5999object.assign@^4.1.0: 7090object.assign@^4.1.0:
6000 version "4.1.0" 7091 version "4.1.0"
6001 resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 7092 resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
7093 integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
6002 dependencies: 7094 dependencies:
6003 define-properties "^1.1.2" 7095 define-properties "^1.1.2"
6004 function-bind "^1.1.1" 7096 function-bind "^1.1.1"
@@ -6008,6 +7100,7 @@ object.assign@^4.1.0:
6008object.getownpropertydescriptors@^2.0.3: 7100object.getownpropertydescriptors@^2.0.3:
6009 version "2.0.3" 7101 version "2.0.3"
6010 resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 7102 resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
7103 integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
6011 dependencies: 7104 dependencies:
6012 define-properties "^1.1.2" 7105 define-properties "^1.1.2"
6013 es-abstract "^1.5.1" 7106 es-abstract "^1.5.1"
@@ -6015,6 +7108,7 @@ object.getownpropertydescriptors@^2.0.3:
6015object.omit@^2.0.0: 7108object.omit@^2.0.0:
6016 version "2.0.1" 7109 version "2.0.1"
6017 resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 7110 resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
7111 integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
6018 dependencies: 7112 dependencies:
6019 for-own "^0.1.4" 7113 for-own "^0.1.4"
6020 is-extendable "^0.1.1" 7114 is-extendable "^0.1.1"
@@ -6022,48 +7116,57 @@ object.omit@^2.0.0:
6022object.pick@^1.3.0: 7116object.pick@^1.3.0:
6023 version "1.3.0" 7117 version "1.3.0"
6024 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 7118 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
7119 integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
6025 dependencies: 7120 dependencies:
6026 isobject "^3.0.1" 7121 isobject "^3.0.1"
6027 7122
6028obuf@^1.0.0, obuf@^1.1.1: 7123obuf@^1.0.0, obuf@^1.1.2:
6029 version "1.1.2" 7124 version "1.1.2"
6030 resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" 7125 resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
7126 integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
6031 7127
6032on-finished@~2.3.0: 7128on-finished@~2.3.0:
6033 version "2.3.0" 7129 version "2.3.0"
6034 resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 7130 resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
7131 integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
6035 dependencies: 7132 dependencies:
6036 ee-first "1.1.1" 7133 ee-first "1.1.1"
6037 7134
6038on-headers@~1.0.1: 7135on-headers@~1.0.1:
6039 version "1.0.1" 7136 version "1.0.1"
6040 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 7137 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
7138 integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=
6041 7139
6042once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: 7140once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
6043 version "1.4.0" 7141 version "1.4.0"
6044 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 7142 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
7143 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
6045 dependencies: 7144 dependencies:
6046 wrappy "1" 7145 wrappy "1"
6047 7146
6048onetime@^2.0.0: 7147onetime@^2.0.0:
6049 version "2.0.1" 7148 version "2.0.1"
6050 resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 7149 resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
7150 integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
6051 dependencies: 7151 dependencies:
6052 mimic-fn "^1.0.0" 7152 mimic-fn "^1.0.0"
6053 7153
6054opener@^1.5.1: 7154opener@^1.5.1:
6055 version "1.5.1" 7155 version "1.5.1"
6056 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" 7156 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
7157 integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
6057 7158
6058opn@^5.1.0, opn@^5.3.0: 7159opn@5.4.0, opn@^5.1.0:
6059 version "5.4.0" 7160 version "5.4.0"
6060 resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" 7161 resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035"
7162 integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==
6061 dependencies: 7163 dependencies:
6062 is-wsl "^1.1.0" 7164 is-wsl "^1.1.0"
6063 7165
6064optimist@^0.6.1, optimist@~0.6.0: 7166optimist@^0.6.1, optimist@~0.6.0:
6065 version "0.6.1" 7167 version "0.6.1"
6066 resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 7168 resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
7169 integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
6067 dependencies: 7170 dependencies:
6068 minimist "~0.0.1" 7171 minimist "~0.0.1"
6069 wordwrap "~0.0.2" 7172 wordwrap "~0.0.2"
@@ -6071,6 +7174,7 @@ optimist@^0.6.1, optimist@~0.6.0:
6071optionator@^0.8.1: 7174optionator@^0.8.1:
6072 version "0.8.2" 7175 version "0.8.2"
6073 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 7176 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
7177 integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
6074 dependencies: 7178 dependencies:
6075 deep-is "~0.1.3" 7179 deep-is "~0.1.3"
6076 fast-levenshtein "~2.0.4" 7180 fast-levenshtein "~2.0.4"
@@ -6079,29 +7183,34 @@ optionator@^0.8.1:
6079 type-check "~0.3.2" 7183 type-check "~0.3.2"
6080 wordwrap "~1.0.0" 7184 wordwrap "~1.0.0"
6081 7185
6082original@>=0.0.5: 7186original@^1.0.0:
6083 version "1.0.2" 7187 version "1.0.2"
6084 resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" 7188 resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
7189 integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
6085 dependencies: 7190 dependencies:
6086 url-parse "^1.4.3" 7191 url-parse "^1.4.3"
6087 7192
6088os-browserify@^0.3.0: 7193os-browserify@^0.3.0:
6089 version "0.3.0" 7194 version "0.3.0"
6090 resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 7195 resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
7196 integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
6091 7197
6092os-homedir@^1.0.0: 7198os-homedir@^1.0.0:
6093 version "1.0.2" 7199 version "1.0.2"
6094 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 7200 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
7201 integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
6095 7202
6096os-locale@^1.4.0: 7203os-locale@^1.4.0:
6097 version "1.4.0" 7204 version "1.4.0"
6098 resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 7205 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
7206 integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
6099 dependencies: 7207 dependencies:
6100 lcid "^1.0.0" 7208 lcid "^1.0.0"
6101 7209
6102os-locale@^2.0.0: 7210os-locale@^2.0.0:
6103 version "2.1.0" 7211 version "2.1.0"
6104 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 7212 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
7213 integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
6105 dependencies: 7214 dependencies:
6106 execa "^0.7.0" 7215 execa "^0.7.0"
6107 lcid "^1.0.0" 7216 lcid "^1.0.0"
@@ -6110,6 +7219,7 @@ os-locale@^2.0.0:
6110os-locale@^3.0.0: 7219os-locale@^3.0.0:
6111 version "3.0.1" 7220 version "3.0.1"
6112 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" 7221 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620"
7222 integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==
6113 dependencies: 7223 dependencies:
6114 execa "^0.10.0" 7224 execa "^0.10.0"
6115 lcid "^2.0.0" 7225 lcid "^2.0.0"
@@ -6118,10 +7228,12 @@ os-locale@^3.0.0:
6118os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: 7228os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
6119 version "1.0.2" 7229 version "1.0.2"
6120 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 7230 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
7231 integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
6121 7232
6122osenv@0, osenv@^0.1.4, osenv@^0.1.5: 7233osenv@0, osenv@^0.1.4, osenv@^0.1.5:
6123 version "0.1.5" 7234 version "0.1.5"
6124 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 7235 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
7236 integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
6125 dependencies: 7237 dependencies:
6126 os-homedir "^1.0.0" 7238 os-homedir "^1.0.0"
6127 os-tmpdir "^1.0.0" 7239 os-tmpdir "^1.0.0"
@@ -6129,64 +7241,130 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5:
6129p-defer@^1.0.0: 7241p-defer@^1.0.0:
6130 version "1.0.0" 7242 version "1.0.0"
6131 resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 7243 resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
7244 integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
6132 7245
6133p-finally@^1.0.0: 7246p-finally@^1.0.0:
6134 version "1.0.0" 7247 version "1.0.0"
6135 resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 7248 resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
7249 integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
6136 7250
6137p-is-promise@^1.1.0: 7251p-is-promise@^1.1.0:
6138 version "1.1.0" 7252 version "1.1.0"
6139 resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" 7253 resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
7254 integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
6140 7255
6141p-limit@^1.0.0, p-limit@^1.1.0: 7256p-limit@^1.0.0, p-limit@^1.1.0:
6142 version "1.3.0" 7257 version "1.3.0"
6143 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 7258 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
7259 integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
6144 dependencies: 7260 dependencies:
6145 p-try "^1.0.0" 7261 p-try "^1.0.0"
6146 7262
6147p-limit@^2.0.0: 7263p-limit@^2.0.0:
6148 version "2.0.0" 7264 version "2.0.0"
6149 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" 7265 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
7266 integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==
6150 dependencies: 7267 dependencies:
6151 p-try "^2.0.0" 7268 p-try "^2.0.0"
6152 7269
6153p-locate@^2.0.0: 7270p-locate@^2.0.0:
6154 version "2.0.0" 7271 version "2.0.0"
6155 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 7272 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
7273 integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
6156 dependencies: 7274 dependencies:
6157 p-limit "^1.1.0" 7275 p-limit "^1.1.0"
6158 7276
6159p-locate@^3.0.0: 7277p-locate@^3.0.0:
6160 version "3.0.0" 7278 version "3.0.0"
6161 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 7279 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
7280 integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
6162 dependencies: 7281 dependencies:
6163 p-limit "^2.0.0" 7282 p-limit "^2.0.0"
6164 7283
6165p-map@^1.1.1: 7284p-map@^1.1.1:
6166 version "1.2.0" 7285 version "1.2.0"
6167 resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 7286 resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
7287 integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
6168 7288
6169p-try@^1.0.0: 7289p-try@^1.0.0:
6170 version "1.0.0" 7290 version "1.0.0"
6171 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 7291 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
7292 integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
6172 7293
6173p-try@^2.0.0: 7294p-try@^2.0.0:
6174 version "2.0.0" 7295 version "2.0.0"
6175 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" 7296 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
7297 integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
7298
7299p2p-media-loader-core@^0.4.0:
7300 version "0.4.0"
7301 resolved "https://registry.yarnpkg.com/p2p-media-loader-core/-/p2p-media-loader-core-0.4.0.tgz#767d56785545bc9c0d8c1a04eb7b67a33e40d0c8"
7302 integrity sha512-llcFqEDs19o916g2OSIPHPjZweO5caHUm/7P18Qu+qb3swYQYSPNwMLoHnpXROHiH5I+00K8w5enz31oUwiCgA==
7303 dependencies:
7304 bittorrent-tracker "^9.10.1"
7305 debug "^4.1.1"
7306 events "^3.0.0"
7307 get-browser-rtc "^1.0.2"
7308 sha.js "^2.4.11"
7309
7310p2p-media-loader-hlsjs@^0.4.0:
7311 version "0.4.0"
7312 resolved "https://registry.yarnpkg.com/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-0.4.0.tgz#1b90c88580503d4c3d8017c813abe41803b613ed"
7313 integrity sha512-IWRs/aGasKD//+dtQkYWAjD/cQx3LMaLkMn0EzLhLpeBj4SLNjlbwOPlbx36M4i39X04Y3WZe9YUeIciId3G5Q==
7314 dependencies:
7315 events "^3.0.0"
7316 m3u8-parser "^4.3.0"
7317 p2p-media-loader-core "^0.4.0"
6176 7318
6177package-json-versionify@^1.0.2: 7319package-json-versionify@^1.0.2:
6178 version "1.0.4" 7320 version "1.0.4"
6179 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17" 7321 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
7322 integrity sha1-WGBYepRIc6a35tJujlH/siMVvxc=
6180 dependencies: 7323 dependencies:
6181 browserify-package-json "^1.0.0" 7324 browserify-package-json "^1.0.0"
6182 7325
7326pacote@9.4.0:
7327 version "9.4.0"
7328 resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.4.0.tgz#af979abdeb175cd347c3e33be3241af1ed254807"
7329 integrity sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==
7330 dependencies:
7331 bluebird "^3.5.3"
7332 cacache "^11.3.2"
7333 figgy-pudding "^3.5.1"
7334 get-stream "^4.1.0"
7335 glob "^7.1.3"
7336 lru-cache "^5.1.1"
7337 make-fetch-happen "^4.0.1"
7338 minimatch "^3.0.4"
7339 minipass "^2.3.5"
7340 mississippi "^3.0.0"
7341 mkdirp "^0.5.1"
7342 normalize-package-data "^2.4.0"
7343 npm-package-arg "^6.1.0"
7344 npm-packlist "^1.1.12"
7345 npm-pick-manifest "^2.2.3"
7346 npm-registry-fetch "^3.8.0"
7347 osenv "^0.1.5"
7348 promise-inflight "^1.0.1"
7349 promise-retry "^1.1.1"
7350 protoduck "^5.0.1"
7351 rimraf "^2.6.2"
7352 safe-buffer "^5.1.2"
7353 semver "^5.6.0"
7354 ssri "^6.0.1"
7355 tar "^4.4.8"
7356 unique-filename "^1.1.1"
7357 which "^1.3.1"
7358
6183pako@~1.0.2, pako@~1.0.5: 7359pako@~1.0.2, pako@~1.0.5:
6184 version "1.0.6" 7360 version "1.0.7"
6185 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" 7361 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27"
7362 integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==
6186 7363
6187parallel-transform@^1.1.0: 7364parallel-transform@^1.1.0:
6188 version "1.1.0" 7365 version "1.1.0"
6189 resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" 7366 resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
7367 integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=
6190 dependencies: 7368 dependencies:
6191 cyclist "~0.2.2" 7369 cyclist "~0.2.2"
6192 inherits "^2.0.3" 7370 inherits "^2.0.3"
@@ -6195,12 +7373,14 @@ parallel-transform@^1.1.0:
6195param-case@2.1.x: 7373param-case@2.1.x:
6196 version "2.1.1" 7374 version "2.1.1"
6197 resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" 7375 resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
7376 integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
6198 dependencies: 7377 dependencies:
6199 no-case "^2.2.0" 7378 no-case "^2.2.0"
6200 7379
6201parse-asn1@^5.0.0: 7380parse-asn1@^5.0.0:
6202 version "5.1.1" 7381 version "5.1.1"
6203 resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" 7382 resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
7383 integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==
6204 dependencies: 7384 dependencies:
6205 asn1.js "^4.0.0" 7385 asn1.js "^4.0.0"
6206 browserify-aes "^1.0.0" 7386 browserify-aes "^1.0.0"
@@ -6211,6 +7391,7 @@ parse-asn1@^5.0.0:
6211parse-glob@^3.0.4: 7391parse-glob@^3.0.4:
6212 version "3.0.4" 7392 version "3.0.4"
6213 resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 7393 resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
7394 integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
6214 dependencies: 7395 dependencies:
6215 glob-base "^0.3.0" 7396 glob-base "^0.3.0"
6216 is-dotfile "^1.0.0" 7397 is-dotfile "^1.0.0"
@@ -6220,6 +7401,7 @@ parse-glob@^3.0.4:
6220parse-headers@^2.0.0: 7401parse-headers@^2.0.0:
6221 version "2.0.1" 7402 version "2.0.1"
6222 resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" 7403 resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536"
7404 integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY=
6223 dependencies: 7405 dependencies:
6224 for-each "^0.3.2" 7406 for-each "^0.3.2"
6225 trim "0.0.1" 7407 trim "0.0.1"
@@ -6227,12 +7409,14 @@ parse-headers@^2.0.0:
6227parse-json@^2.2.0: 7409parse-json@^2.2.0:
6228 version "2.2.0" 7410 version "2.2.0"
6229 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 7411 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
7412 integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
6230 dependencies: 7413 dependencies:
6231 error-ex "^1.2.0" 7414 error-ex "^1.2.0"
6232 7415
6233parse-json@^4.0.0: 7416parse-json@^4.0.0:
6234 version "4.0.0" 7417 version "4.0.0"
6235 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 7418 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
7419 integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
6236 dependencies: 7420 dependencies:
6237 error-ex "^1.3.1" 7421 error-ex "^1.3.1"
6238 json-parse-better-errors "^1.0.1" 7422 json-parse-better-errors "^1.0.1"
@@ -6240,10 +7424,12 @@ parse-json@^4.0.0:
6240parse-numeric-range@^0.0.2: 7424parse-numeric-range@^0.0.2:
6241 version "0.0.2" 7425 version "0.0.2"
6242 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz#b4f09d413c7adbcd987f6e9233c7b4b210c938e4" 7426 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz#b4f09d413c7adbcd987f6e9233c7b4b210c938e4"
7427 integrity sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=
6243 7428
6244parse-torrent@^6.1.2: 7429parse-torrent@^6.1.2:
6245 version "6.1.2" 7430 version "6.1.2"
6246 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-6.1.2.tgz#99da5bdd23435a1cb7e8e7a63847c4efb21b1956" 7431 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-6.1.2.tgz#99da5bdd23435a1cb7e8e7a63847c4efb21b1956"
7432 integrity sha512-Z/vig84sHwtrTEbOzisT4xnYTFlOgAaLQccPruMPgRahZUppVE/BUXzAos3jZM7c64o0lfukQdQ4ozWa5lN39w==
6247 dependencies: 7433 dependencies:
6248 bencode "^2.0.0" 7434 bencode "^2.0.0"
6249 blob-to-buffer "^1.2.6" 7435 blob-to-buffer "^1.2.6"
@@ -6253,75 +7439,91 @@ parse-torrent@^6.1.2:
6253 simple-sha1 "^2.0.0" 7439 simple-sha1 "^2.0.0"
6254 uniq "^1.0.1" 7440 uniq "^1.0.1"
6255 7441
6256parse5@4.0.0, parse5@^4.0.0: 7442parse5@4.0.0:
6257 version "4.0.0" 7443 version "4.0.0"
6258 resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" 7444 resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
7445 integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
6259 7446
6260parseqs@0.0.5: 7447parseqs@0.0.5:
6261 version "0.0.5" 7448 version "0.0.5"
6262 resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 7449 resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
7450 integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
6263 dependencies: 7451 dependencies:
6264 better-assert "~1.0.0" 7452 better-assert "~1.0.0"
6265 7453
6266parseuri@0.0.5: 7454parseuri@0.0.5:
6267 version "0.0.5" 7455 version "0.0.5"
6268 resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 7456 resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
7457 integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
6269 dependencies: 7458 dependencies:
6270 better-assert "~1.0.0" 7459 better-assert "~1.0.0"
6271 7460
6272parseurl@~1.3.2: 7461parseurl@~1.3.2:
6273 version "1.3.2" 7462 version "1.3.2"
6274 resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 7463 resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
7464 integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=
6275 7465
6276pascalcase@^0.1.1: 7466pascalcase@^0.1.1:
6277 version "0.1.1" 7467 version "0.1.1"
6278 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 7468 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
7469 integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
6279 7470
6280path-browserify@0.0.0: 7471path-browserify@0.0.0:
6281 version "0.0.0" 7472 version "0.0.0"
6282 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" 7473 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
7474 integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=
6283 7475
6284path-browserify@^1.0.0: 7476path-browserify@^1.0.0:
6285 version "1.0.0" 7477 version "1.0.0"
6286 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.0.tgz#40702a97af46ae00b0ea6fa8998c0b03c0af160d" 7478 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.0.tgz#40702a97af46ae00b0ea6fa8998c0b03c0af160d"
7479 integrity sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==
6287 7480
6288path-dirname@^1.0.0: 7481path-dirname@^1.0.0:
6289 version "1.0.2" 7482 version "1.0.2"
6290 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 7483 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
7484 integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
6291 7485
6292path-exists@^2.0.0: 7486path-exists@^2.0.0:
6293 version "2.1.0" 7487 version "2.1.0"
6294 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 7488 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
7489 integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
6295 dependencies: 7490 dependencies:
6296 pinkie-promise "^2.0.0" 7491 pinkie-promise "^2.0.0"
6297 7492
6298path-exists@^3.0.0: 7493path-exists@^3.0.0:
6299 version "3.0.0" 7494 version "3.0.0"
6300 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 7495 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
7496 integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
6301 7497
6302path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 7498path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
6303 version "1.0.1" 7499 version "1.0.1"
6304 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 7500 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
7501 integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
6305 7502
6306path-is-inside@^1.0.1: 7503path-is-inside@^1.0.1:
6307 version "1.0.2" 7504 version "1.0.2"
6308 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 7505 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
7506 integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
6309 7507
6310path-key@^2.0.0, path-key@^2.0.1: 7508path-key@^2.0.0, path-key@^2.0.1:
6311 version "2.0.1" 7509 version "2.0.1"
6312 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 7510 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
7511 integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
6313 7512
6314path-parse@^1.0.5: 7513path-parse@^1.0.5:
6315 version "1.0.6" 7514 version "1.0.6"
6316 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 7515 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
7516 integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
6317 7517
6318path-to-regexp@0.1.7: 7518path-to-regexp@0.1.7:
6319 version "0.1.7" 7519 version "0.1.7"
6320 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 7520 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
7521 integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
6321 7522
6322path-type@^1.0.0: 7523path-type@^1.0.0:
6323 version "1.1.0" 7524 version "1.1.0"
6324 resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 7525 resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
7526 integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
6325 dependencies: 7527 dependencies:
6326 graceful-fs "^4.1.2" 7528 graceful-fs "^4.1.2"
6327 pify "^2.0.0" 7529 pify "^2.0.0"
@@ -6330,18 +7532,21 @@ path-type@^1.0.0:
6330path-type@^2.0.0: 7532path-type@^2.0.0:
6331 version "2.0.0" 7533 version "2.0.0"
6332 resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 7534 resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
7535 integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
6333 dependencies: 7536 dependencies:
6334 pify "^2.0.0" 7537 pify "^2.0.0"
6335 7538
6336path-type@^3.0.0: 7539path-type@^3.0.0:
6337 version "3.0.0" 7540 version "3.0.0"
6338 resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 7541 resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
7542 integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
6339 dependencies: 7543 dependencies:
6340 pify "^3.0.0" 7544 pify "^3.0.0"
6341 7545
6342pbkdf2@^3.0.3: 7546pbkdf2@^3.0.3:
6343 version "3.0.16" 7547 version "3.0.17"
6344 resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" 7548 resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
7549 integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
6345 dependencies: 7550 dependencies:
6346 create-hash "^1.1.2" 7551 create-hash "^1.1.2"
6347 create-hmac "^1.1.4" 7552 create-hmac "^1.1.4"
@@ -6352,58 +7557,70 @@ pbkdf2@^3.0.3:
6352performance-now@^2.1.0: 7557performance-now@^2.1.0:
6353 version "2.1.0" 7558 version "2.1.0"
6354 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 7559 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
7560 integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
6355 7561
6356piece-length@^1.0.0: 7562piece-length@^1.0.0:
6357 version "1.0.0" 7563 version "1.0.0"
6358 resolved "https://registry.yarnpkg.com/piece-length/-/piece-length-1.0.0.tgz#4db7167157fd69fef14caf7262cd39f189b24508" 7564 resolved "https://registry.yarnpkg.com/piece-length/-/piece-length-1.0.0.tgz#4db7167157fd69fef14caf7262cd39f189b24508"
7565 integrity sha1-TbcWcVf9af7xTK9yYs058YmyRQg=
6359 dependencies: 7566 dependencies:
6360 closest-to "~2.0.0" 7567 closest-to "~2.0.0"
6361 7568
6362pify@^2.0.0, pify@^2.3.0: 7569pify@^2.0.0, pify@^2.3.0:
6363 version "2.3.0" 7570 version "2.3.0"
6364 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 7571 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
7572 integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
6365 7573
6366pify@^3.0.0: 7574pify@^3.0.0:
6367 version "3.0.0" 7575 version "3.0.0"
6368 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 7576 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
7577 integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
6369 7578
6370pinkie-promise@^2.0.0: 7579pinkie-promise@^2.0.0:
6371 version "2.0.1" 7580 version "2.0.1"
6372 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 7581 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
7582 integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
6373 dependencies: 7583 dependencies:
6374 pinkie "^2.0.0" 7584 pinkie "^2.0.0"
6375 7585
6376pinkie@^2.0.0: 7586pinkie@^2.0.0:
6377 version "2.0.4" 7587 version "2.0.4"
6378 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 7588 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
7589 integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
6379 7590
6380pkcs7@^1.0.2: 7591pkcs7@^1.0.2:
6381 version "1.0.2" 7592 version "1.0.2"
6382 resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.2.tgz#b6dba527528c2942bfc122ce2dafcdb5e59074e7" 7593 resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.2.tgz#b6dba527528c2942bfc122ce2dafcdb5e59074e7"
7594 integrity sha1-ttulJ1KMKUK/wSLOLa/NteWQdOc=
6383 7595
6384pkg-dir@^2.0.0: 7596pkg-dir@^2.0.0:
6385 version "2.0.0" 7597 version "2.0.0"
6386 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 7598 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
7599 integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
6387 dependencies: 7600 dependencies:
6388 find-up "^2.1.0" 7601 find-up "^2.1.0"
6389 7602
6390pkg-dir@^3.0.0: 7603pkg-dir@^3.0.0:
6391 version "3.0.0" 7604 version "3.0.0"
6392 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" 7605 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
7606 integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
6393 dependencies: 7607 dependencies:
6394 find-up "^3.0.0" 7608 find-up "^3.0.0"
6395 7609
6396pn@^1.1.0: 7610pn@^1.1.0:
6397 version "1.1.0" 7611 version "1.1.0"
6398 resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" 7612 resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
7613 integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
6399 7614
6400pngjs@^2.3.1: 7615pngjs@^2.3.1:
6401 version "2.3.1" 7616 version "2.3.1"
6402 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f" 7617 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f"
7618 integrity sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8=
6403 7619
6404portfinder@^1.0.13, portfinder@^1.0.9: 7620portfinder@^1.0.9:
6405 version "1.0.17" 7621 version "1.0.20"
6406 resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" 7622 resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
7623 integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
6407 dependencies: 7624 dependencies:
6408 async "^1.5.2" 7625 async "^1.5.2"
6409 debug "^2.2.0" 7626 debug "^2.2.0"
@@ -6412,12 +7629,14 @@ portfinder@^1.0.13, portfinder@^1.0.9:
6412posix-character-classes@^0.1.0: 7629posix-character-classes@^0.1.0:
6413 version "0.1.1" 7630 version "0.1.1"
6414 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 7631 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
7632 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
6415 7633
6416postcss-import@^11.1.0: 7634postcss-import@12.0.1:
6417 version "11.1.0" 7635 version "12.0.1"
6418 resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-11.1.0.tgz#55c9362c9192994ec68865d224419df1db2981f0" 7636 resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
7637 integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
6419 dependencies: 7638 dependencies:
6420 postcss "^6.0.1" 7639 postcss "^7.0.1"
6421 postcss-value-parser "^3.2.3" 7640 postcss-value-parser "^3.2.3"
6422 read-cache "^1.0.0" 7641 read-cache "^1.0.0"
6423 resolve "^1.1.7" 7642 resolve "^1.1.7"
@@ -6425,28 +7644,32 @@ postcss-import@^11.1.0:
6425postcss-load-config@^2.0.0: 7644postcss-load-config@^2.0.0:
6426 version "2.0.0" 7645 version "2.0.0"
6427 resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" 7646 resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
7647 integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==
6428 dependencies: 7648 dependencies:
6429 cosmiconfig "^4.0.0" 7649 cosmiconfig "^4.0.0"
6430 import-cwd "^2.0.0" 7650 import-cwd "^2.0.0"
6431 7651
6432postcss-loader@^2.1.5: 7652postcss-loader@3.0.0:
6433 version "2.1.6" 7653 version "3.0.0"
6434 resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" 7654 resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
7655 integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
6435 dependencies: 7656 dependencies:
6436 loader-utils "^1.1.0" 7657 loader-utils "^1.1.0"
6437 postcss "^6.0.0" 7658 postcss "^7.0.0"
6438 postcss-load-config "^2.0.0" 7659 postcss-load-config "^2.0.0"
6439 schema-utils "^0.4.0" 7660 schema-utils "^1.0.0"
6440 7661
6441postcss-modules-extract-imports@^1.2.0: 7662postcss-modules-extract-imports@^1.2.0:
6442 version "1.2.0" 7663 version "1.2.1"
6443 resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" 7664 resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
7665 integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
6444 dependencies: 7666 dependencies:
6445 postcss "^6.0.1" 7667 postcss "^6.0.1"
6446 7668
6447postcss-modules-local-by-default@^1.2.0: 7669postcss-modules-local-by-default@^1.2.0:
6448 version "1.2.0" 7670 version "1.2.0"
6449 resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" 7671 resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
7672 integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
6450 dependencies: 7673 dependencies:
6451 css-selector-tokenizer "^0.7.0" 7674 css-selector-tokenizer "^0.7.0"
6452 postcss "^6.0.1" 7675 postcss "^6.0.1"
@@ -6454,6 +7677,7 @@ postcss-modules-local-by-default@^1.2.0:
6454postcss-modules-scope@^1.1.0: 7677postcss-modules-scope@^1.1.0:
6455 version "1.1.0" 7678 version "1.1.0"
6456 resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" 7679 resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
7680 integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
6457 dependencies: 7681 dependencies:
6458 css-selector-tokenizer "^0.7.0" 7682 css-selector-tokenizer "^0.7.0"
6459 postcss "^6.0.1" 7683 postcss "^6.0.1"
@@ -6461,43 +7685,57 @@ postcss-modules-scope@^1.1.0:
6461postcss-modules-values@^1.3.0: 7685postcss-modules-values@^1.3.0:
6462 version "1.3.0" 7686 version "1.3.0"
6463 resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" 7687 resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
7688 integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
6464 dependencies: 7689 dependencies:
6465 icss-replace-symbols "^1.1.0" 7690 icss-replace-symbols "^1.1.0"
6466 postcss "^6.0.1" 7691 postcss "^6.0.1"
6467 7692
6468postcss-url@^7.3.2: 7693postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
6469 version "7.3.2" 7694 version "3.3.1"
6470 resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-7.3.2.tgz#5fea273807fb84b38c461c3c9a9e8abd235f7120" 7695 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
6471 dependencies: 7696 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
6472 mime "^1.4.1"
6473 minimatch "^3.0.4"
6474 mkdirp "^0.5.0"
6475 postcss "^6.0.1"
6476 xxhashjs "^0.2.1"
6477 7697
6478postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: 7698postcss@7.0.14, postcss@^7.0.13:
6479 version "3.3.0" 7699 version "7.0.14"
6480 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" 7700 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
7701 integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
7702 dependencies:
7703 chalk "^2.4.2"
7704 source-map "^0.6.1"
7705 supports-color "^6.1.0"
6481 7706
6482postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.22, postcss@^6.0.23: 7707postcss@^6.0.1, postcss@^6.0.23:
6483 version "6.0.23" 7708 version "6.0.23"
6484 resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" 7709 resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
7710 integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
6485 dependencies: 7711 dependencies:
6486 chalk "^2.4.1" 7712 chalk "^2.4.1"
6487 source-map "^0.6.1" 7713 source-map "^0.6.1"
6488 supports-color "^5.4.0" 7714 supports-color "^5.4.0"
6489 7715
7716postcss@^7.0.0, postcss@^7.0.1:
7717 version "7.0.6"
7718 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2"
7719 integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==
7720 dependencies:
7721 chalk "^2.4.1"
7722 source-map "^0.6.1"
7723 supports-color "^5.5.0"
7724
6490prelude-ls@~1.1.2: 7725prelude-ls@~1.1.2:
6491 version "1.1.2" 7726 version "1.1.2"
6492 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 7727 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
7728 integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
6493 7729
6494preserve@^0.2.0: 7730preserve@^0.2.0:
6495 version "0.2.0" 7731 version "0.2.0"
6496 resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 7732 resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
7733 integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
6497 7734
6498pretty-error@^2.0.2: 7735pretty-error@^2.0.2:
6499 version "2.1.1" 7736 version "2.1.1"
6500 resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" 7737 resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
7738 integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=
6501 dependencies: 7739 dependencies:
6502 renderkid "^2.0.1" 7740 renderkid "^2.0.1"
6503 utila "~0.4" 7741 utila "~0.4"
@@ -6505,47 +7743,65 @@ pretty-error@^2.0.2:
6505pretty-format@^23.6.0: 7743pretty-format@^23.6.0:
6506 version "23.6.0" 7744 version "23.6.0"
6507 resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" 7745 resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
7746 integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
6508 dependencies: 7747 dependencies:
6509 ansi-regex "^3.0.0" 7748 ansi-regex "^3.0.0"
6510 ansi-styles "^3.2.0" 7749 ansi-styles "^3.2.0"
6511 7750
6512primeng@^6.1.2: 7751primeng@^7.0.0:
6513 version "6.1.4" 7752 version "7.0.0"
6514 resolved "https://registry.yarnpkg.com/primeng/-/primeng-6.1.4.tgz#c4b92c1c9f8ba6cf717b122ed87c3701a5e1cf20" 7753 resolved "https://registry.yarnpkg.com/primeng/-/primeng-7.0.0.tgz#3a189568069a31544c9ed952328e221daad9b9b1"
7754 integrity sha512-PrEEnp0VPbzsUQdpB/4KtUdRxaWwpprHy+IpUi09C42OAI2zqdTVIC0AaW81gDAGQyW7XraCP9EFI8KT4nC9GA==
6515 7755
6516private@^0.1.8, private@~0.1.5: 7756private@^0.1.8, private@~0.1.5:
6517 version "0.1.8" 7757 version "0.1.8"
6518 resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 7758 resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
7759 integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
6519 7760
6520process-nextick-args@~1.0.6: 7761process-nextick-args@~1.0.6:
6521 version "1.0.7" 7762 version "1.0.7"
6522 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 7763 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
7764 integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
6523 7765
6524process-nextick-args@~2.0.0: 7766process-nextick-args@~2.0.0:
6525 version "2.0.0" 7767 version "2.0.0"
6526 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 7768 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
7769 integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
6527 7770
6528process@^0.11.10: 7771process@^0.11.10:
6529 version "0.11.10" 7772 version "0.11.10"
6530 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 7773 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
7774 integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
6531 7775
6532process@~0.5.1: 7776process@~0.5.1:
6533 version "0.5.2" 7777 version "0.5.2"
6534 resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" 7778 resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
7779 integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
6535 7780
6536promise-inflight@^1.0.1: 7781promise-inflight@^1.0.1:
6537 version "1.0.1" 7782 version "1.0.1"
6538 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 7783 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
7784 integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
7785
7786promise-retry@^1.1.1:
7787 version "1.1.1"
7788 resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
7789 integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
7790 dependencies:
7791 err-code "^1.0.0"
7792 retry "^0.10.0"
6539 7793
6540promise@^7.1.1: 7794promise@^7.1.1:
6541 version "7.3.1" 7795 version "7.3.1"
6542 resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 7796 resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
7797 integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
6543 dependencies: 7798 dependencies:
6544 asap "~2.0.3" 7799 asap "~2.0.3"
6545 7800
6546prompts@^0.1.9: 7801prompts@^0.1.9:
6547 version "0.1.14" 7802 version "0.1.14"
6548 resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" 7803 resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
7804 integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==
6549 dependencies: 7805 dependencies:
6550 kleur "^2.0.1" 7806 kleur "^2.0.1"
6551 sisteransi "^0.1.1" 7807 sisteransi "^0.1.1"
@@ -6553,13 +7809,22 @@ prompts@^0.1.9:
6553prop-types@^15.6.2: 7809prop-types@^15.6.2:
6554 version "15.6.2" 7810 version "15.6.2"
6555 resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" 7811 resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
7812 integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==
6556 dependencies: 7813 dependencies:
6557 loose-envify "^1.3.1" 7814 loose-envify "^1.3.1"
6558 object-assign "^4.1.1" 7815 object-assign "^4.1.1"
6559 7816
7817protoduck@^5.0.1:
7818 version "5.0.1"
7819 resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
7820 integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
7821 dependencies:
7822 genfun "^5.0.0"
7823
6560protractor@^5.3.2: 7824protractor@^5.3.2:
6561 version "5.4.1" 7825 version "5.4.1"
6562 resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.1.tgz#011a99e38df7aa45d22455b889ffbb13a6ce0bd9" 7826 resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.1.tgz#011a99e38df7aa45d22455b889ffbb13a6ce0bd9"
7827 integrity sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==
6563 dependencies: 7828 dependencies:
6564 "@types/node" "^6.0.46" 7829 "@types/node" "^6.0.46"
6565 "@types/q" "^0.0.32" 7830 "@types/q" "^0.0.32"
@@ -6578,9 +7843,10 @@ protractor@^5.3.2:
6578 webdriver-js-extender "2.1.0" 7843 webdriver-js-extender "2.1.0"
6579 webdriver-manager "^12.0.6" 7844 webdriver-manager "^12.0.6"
6580 7845
6581proxy-addr@~2.0.3: 7846proxy-addr@~2.0.4:
6582 version "2.0.4" 7847 version "2.0.4"
6583 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 7848 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
7849 integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==
6584 dependencies: 7850 dependencies:
6585 forwarded "~0.1.2" 7851 forwarded "~0.1.2"
6586 ipaddr.js "1.8.0" 7852 ipaddr.js "1.8.0"
@@ -6588,28 +7854,34 @@ proxy-addr@~2.0.3:
6588prr@~1.0.1: 7854prr@~1.0.1:
6589 version "1.0.1" 7855 version "1.0.1"
6590 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 7856 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
7857 integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
6591 7858
6592pseudomap@^1.0.2: 7859pseudomap@^1.0.2:
6593 version "1.0.2" 7860 version "1.0.2"
6594 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 7861 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
7862 integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
6595 7863
6596psl@^1.1.24: 7864psl@^1.1.24, psl@^1.1.28:
6597 version "1.1.29" 7865 version "1.1.29"
6598 resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 7866 resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
7867 integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==
6599 7868
6600public-encrypt@^4.0.0: 7869public-encrypt@^4.0.0:
6601 version "4.0.2" 7870 version "4.0.3"
6602 resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" 7871 resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
7872 integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
6603 dependencies: 7873 dependencies:
6604 bn.js "^4.1.0" 7874 bn.js "^4.1.0"
6605 browserify-rsa "^4.0.0" 7875 browserify-rsa "^4.0.0"
6606 create-hash "^1.1.0" 7876 create-hash "^1.1.0"
6607 parse-asn1 "^5.0.0" 7877 parse-asn1 "^5.0.0"
6608 randombytes "^2.0.1" 7878 randombytes "^2.0.1"
7879 safe-buffer "^5.1.2"
6609 7880
6610pump@^2.0.0, pump@^2.0.1: 7881pump@^2.0.0, pump@^2.0.1:
6611 version "2.0.1" 7882 version "2.0.1"
6612 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 7883 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
7884 integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
6613 dependencies: 7885 dependencies:
6614 end-of-stream "^1.1.0" 7886 end-of-stream "^1.1.0"
6615 once "^1.3.1" 7887 once "^1.3.1"
@@ -6617,6 +7889,7 @@ pump@^2.0.0, pump@^2.0.1:
6617pump@^3.0.0: 7889pump@^3.0.0:
6618 version "3.0.0" 7890 version "3.0.0"
6619 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 7891 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
7892 integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
6620 dependencies: 7893 dependencies:
6621 end-of-stream "^1.1.0" 7894 end-of-stream "^1.1.0"
6622 once "^1.3.1" 7895 once "^1.3.1"
@@ -6624,26 +7897,21 @@ pump@^3.0.0:
6624pumpify@^1.3.3: 7897pumpify@^1.3.3:
6625 version "1.5.1" 7898 version "1.5.1"
6626 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" 7899 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
7900 integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
6627 dependencies: 7901 dependencies:
6628 duplexify "^3.6.0" 7902 duplexify "^3.6.0"
6629 inherits "^2.0.3" 7903 inherits "^2.0.3"
6630 pump "^2.0.0" 7904 pump "^2.0.0"
6631 7905
6632punycode@1.3.2: 7906punycode@1.3.2, punycode@^1.2.4, punycode@^1.4.1, punycode@^2.1.0, punycode@^2.1.1:
6633 version "1.3.2"
6634 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
6635
6636punycode@^1.2.4, punycode@^1.4.1:
6637 version "1.4.1" 7907 version "1.4.1"
6638 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 7908 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
6639 7909 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
6640punycode@^2.1.0:
6641 version "2.1.1"
6642 resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
6643 7910
6644purify-css@^1.2.5: 7911purify-css@^1.2.5:
6645 version "1.2.5" 7912 version "1.2.5"
6646 resolved "https://registry.yarnpkg.com/purify-css/-/purify-css-1.2.5.tgz#c4b9ec90735765f3e247ba6a3b49f132f3482500" 7913 resolved "https://registry.yarnpkg.com/purify-css/-/purify-css-1.2.5.tgz#c4b9ec90735765f3e247ba6a3b49f132f3482500"
7914 integrity sha512-Vy4jRnV2w/kUjTyxzQOKbFkqwUe6RNLuZgIWR/IRQ8nCqRwiFgwC9XiO9+8poq5KL053uWAQnCSbsfihq77zPg==
6647 dependencies: 7915 dependencies:
6648 clean-css "^4.0.12" 7916 clean-css "^4.0.12"
6649 glob "^7.1.1" 7917 glob "^7.1.1"
@@ -6654,6 +7922,7 @@ purify-css@^1.2.5:
6654purifycss-webpack@^0.7.0: 7922purifycss-webpack@^0.7.0:
6655 version "0.7.0" 7923 version "0.7.0"
6656 resolved "https://registry.yarnpkg.com/purifycss-webpack/-/purifycss-webpack-0.7.0.tgz#07c9ce7988f608f1928102ed3ff19178ce38f0e0" 7924 resolved "https://registry.yarnpkg.com/purifycss-webpack/-/purifycss-webpack-0.7.0.tgz#07c9ce7988f608f1928102ed3ff19178ce38f0e0"
7925 integrity sha1-B8nOeYj2CPGSgQLtP/GReM448OA=
6657 dependencies: 7926 dependencies:
6658 ajv "^4.11.2" 7927 ajv "^4.11.2"
6659 webpack-sources "^0.1.4" 7928 webpack-sources "^0.1.4"
@@ -6661,47 +7930,52 @@ purifycss-webpack@^0.7.0:
6661q@1.4.1: 7930q@1.4.1:
6662 version "1.4.1" 7931 version "1.4.1"
6663 resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 7932 resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
7933 integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=
6664 7934
6665q@^1.4.1: 7935q@^1.4.1:
6666 version "1.5.1" 7936 version "1.5.1"
6667 resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 7937 resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
7938 integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
6668 7939
6669qjobs@^1.1.4: 7940qjobs@^1.1.4:
6670 version "1.2.0" 7941 version "1.2.0"
6671 resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" 7942 resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
7943 integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==
6672 7944
6673qrcode@^0.8.2: 7945qrcode@^0.8.2:
6674 version "0.8.2" 7946 version "0.8.2"
6675 resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-0.8.2.tgz#4a4b4dd74ae43b7b05d4cc598badc1c03837189c" 7947 resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-0.8.2.tgz#4a4b4dd74ae43b7b05d4cc598badc1c03837189c"
7948 integrity sha1-SktN10rkO3sF1MxZi63BwDg3GJw=
6676 dependencies: 7949 dependencies:
6677 colors "*" 7950 colors "*"
6678 dijkstrajs "^1.0.1" 7951 dijkstrajs "^1.0.1"
6679 isarray "^2.0.1" 7952 isarray "^2.0.1"
6680 pngjs "^2.3.1" 7953 pngjs "^2.3.1"
6681 7954
6682qs@6.5.1: 7955qs@6.5.2, qs@~6.5.2:
6683 version "6.5.1"
6684 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
6685
6686qs@6.5.2, qs@~6.5.1, qs@~6.5.2:
6687 version "6.5.2" 7956 version "6.5.2"
6688 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 7957 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
7958 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
6689 7959
6690querystring-es3@^0.2.0: 7960querystring-es3@^0.2.0:
6691 version "0.2.1" 7961 version "0.2.1"
6692 resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 7962 resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
7963 integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
6693 7964
6694querystring@0.2.0: 7965querystring@0.2.0:
6695 version "0.2.0" 7966 version "0.2.0"
6696 resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 7967 resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
7968 integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
6697 7969
6698querystringify@^2.0.0: 7970querystringify@^2.0.0:
6699 version "2.0.0" 7971 version "2.1.0"
6700 resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" 7972 resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef"
7973 integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==
6701 7974
6702random-access-file@^2.0.1: 7975random-access-file@^2.0.1:
6703 version "2.0.1" 7976 version "2.0.1"
6704 resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb" 7977 resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb"
7978 integrity sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==
6705 dependencies: 7979 dependencies:
6706 mkdirp "^0.5.1" 7980 mkdirp "^0.5.1"
6707 random-access-storage "^1.1.1" 7981 random-access-storage "^1.1.1"
@@ -6709,16 +7983,19 @@ random-access-file@^2.0.1:
6709random-access-storage@^1.1.1: 7983random-access-storage@^1.1.1:
6710 version "1.3.0" 7984 version "1.3.0"
6711 resolved "https://registry.yarnpkg.com/random-access-storage/-/random-access-storage-1.3.0.tgz#d27e4d897b79dc4358afc2bbe553044e5c8cfe35" 7985 resolved "https://registry.yarnpkg.com/random-access-storage/-/random-access-storage-1.3.0.tgz#d27e4d897b79dc4358afc2bbe553044e5c8cfe35"
7986 integrity sha512-pdS9Mcb9TB7oICypPRALlheaSuszuAKmLVEPKJMuYor7R/zDuHh5ALuQoS+ox31XRwQUL+tDwWH2GPdyspwelA==
6712 dependencies: 7987 dependencies:
6713 inherits "^2.0.3" 7988 inherits "^2.0.3"
6714 7989
6715random-iterate@^1.0.1: 7990random-iterate@^1.0.1:
6716 version "1.0.1" 7991 version "1.0.1"
6717 resolved "https://registry.yarnpkg.com/random-iterate/-/random-iterate-1.0.1.tgz#f7d97d92dee6665ec5f6da08c7f963cad4b2ac99" 7992 resolved "https://registry.yarnpkg.com/random-iterate/-/random-iterate-1.0.1.tgz#f7d97d92dee6665ec5f6da08c7f963cad4b2ac99"
7993 integrity sha1-99l9kt7mZl7F9toIx/ljytSyrJk=
6718 7994
6719randomatic@^3.0.0: 7995randomatic@^3.0.0:
6720 version "3.1.0" 7996 version "3.1.1"
6721 resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" 7997 resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
7998 integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
6722 dependencies: 7999 dependencies:
6723 is-number "^4.0.0" 8000 is-number "^4.0.0"
6724 kind-of "^6.0.0" 8001 kind-of "^6.0.0"
@@ -6727,12 +8004,14 @@ randomatic@^3.0.0:
6727randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.3, randombytes@^2.0.5: 8004randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.3, randombytes@^2.0.5:
6728 version "2.0.6" 8005 version "2.0.6"
6729 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" 8006 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
8007 integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==
6730 dependencies: 8008 dependencies:
6731 safe-buffer "^5.1.0" 8009 safe-buffer "^5.1.0"
6732 8010
6733randomfill@^1.0.3: 8011randomfill@^1.0.3:
6734 version "1.0.4" 8012 version "1.0.4"
6735 resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 8013 resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
8014 integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
6736 dependencies: 8015 dependencies:
6737 randombytes "^2.0.5" 8016 randombytes "^2.0.5"
6738 safe-buffer "^5.1.0" 8017 safe-buffer "^5.1.0"
@@ -6740,39 +8019,42 @@ randomfill@^1.0.3:
6740range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: 8019range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0:
6741 version "1.2.0" 8020 version "1.2.0"
6742 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 8021 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
8022 integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=
6743 8023
6744range-slice-stream@^1.2.0: 8024range-slice-stream@^2.0.0:
6745 version "1.2.0" 8025 version "2.0.0"
6746 resolved "https://registry.yarnpkg.com/range-slice-stream/-/range-slice-stream-1.2.0.tgz#01ba954276052b783900e63d6118d8fcf3875d7f" 8026 resolved "https://registry.yarnpkg.com/range-slice-stream/-/range-slice-stream-2.0.0.tgz#1f25fc7a2cacf9ccd140c46f9cf670a1a7fe3ce6"
6747 dependencies: 8027 integrity sha512-PPYLwZ63lXi6Tv2EZ8w3M4FzC0rVqvxivaOVS8pXSp5FMIHFnvi4MWHL3UdFLhwSy50aNtJsgjY0mBC6oFL26Q==
6748 inherits "^2.0.1"
6749 readable-stream "^2.0.5"
6750
6751raw-body@2.3.2:
6752 version "2.3.2"
6753 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
6754 dependencies: 8028 dependencies:
6755 bytes "3.0.0" 8029 readable-stream "^3.0.2"
6756 http-errors "1.6.2"
6757 iconv-lite "0.4.19"
6758 unpipe "1.0.0"
6759 8030
6760raw-body@2.3.3: 8031raw-body@2.3.3:
6761 version "2.3.3" 8032 version "2.3.3"
6762 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 8033 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
8034 integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==
6763 dependencies: 8035 dependencies:
6764 bytes "3.0.0" 8036 bytes "3.0.0"
6765 http-errors "1.6.3" 8037 http-errors "1.6.3"
6766 iconv-lite "0.4.23" 8038 iconv-lite "0.4.23"
6767 unpipe "1.0.0" 8039 unpipe "1.0.0"
6768 8040
8041raw-loader@1.0.0:
8042 version "1.0.0"
8043 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405"
8044 integrity sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==
8045 dependencies:
8046 loader-utils "^1.1.0"
8047 schema-utils "^1.0.0"
8048
6769raw-loader@^0.5.1: 8049raw-loader@^0.5.1:
6770 version "0.5.1" 8050 version "0.5.1"
6771 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" 8051 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
8052 integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
6772 8053
6773rc@^1.2.7: 8054rc@^1.2.7:
6774 version "1.2.8" 8055 version "1.2.8"
6775 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 8056 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
8057 integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
6776 dependencies: 8058 dependencies:
6777 deep-extend "^0.6.0" 8059 deep-extend "^0.6.0"
6778 ini "~1.3.0" 8060 ini "~1.3.0"
@@ -6780,32 +8062,36 @@ rc@^1.2.7:
6780 strip-json-comments "~2.0.1" 8062 strip-json-comments "~2.0.1"
6781 8063
6782react-dom@^16.4.2: 8064react-dom@^16.4.2:
6783 version "16.5.2" 8065 version "16.6.3"
6784 resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.5.2.tgz#b69ee47aa20bab5327b2b9d7c1fe2a30f2cfa9d7" 8066 resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0"
8067 integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==
6785 dependencies: 8068 dependencies:
6786 loose-envify "^1.1.0" 8069 loose-envify "^1.1.0"
6787 object-assign "^4.1.1" 8070 object-assign "^4.1.1"
6788 prop-types "^15.6.2" 8071 prop-types "^15.6.2"
6789 schedule "^0.5.0" 8072 scheduler "^0.11.2"
6790 8073
6791react@^16.4.2: 8074react@^16.4.2:
6792 version "16.5.2" 8075 version "16.6.3"
6793 resolved "https://registry.yarnpkg.com/react/-/react-16.5.2.tgz#19f6b444ed139baa45609eee6dc3d318b3895d42" 8076 resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c"
8077 integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==
6794 dependencies: 8078 dependencies:
6795 loose-envify "^1.1.0" 8079 loose-envify "^1.1.0"
6796 object-assign "^4.1.1" 8080 object-assign "^4.1.1"
6797 prop-types "^15.6.2" 8081 prop-types "^15.6.2"
6798 schedule "^0.5.0" 8082 scheduler "^0.11.2"
6799 8083
6800read-cache@^1.0.0: 8084read-cache@^1.0.0:
6801 version "1.0.0" 8085 version "1.0.0"
6802 resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" 8086 resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
8087 integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=
6803 dependencies: 8088 dependencies:
6804 pify "^2.3.0" 8089 pify "^2.3.0"
6805 8090
6806read-pkg-up@^1.0.1: 8091read-pkg-up@^1.0.1:
6807 version "1.0.1" 8092 version "1.0.1"
6808 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 8093 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
8094 integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
6809 dependencies: 8095 dependencies:
6810 find-up "^1.0.0" 8096 find-up "^1.0.0"
6811 read-pkg "^1.0.0" 8097 read-pkg "^1.0.0"
@@ -6813,6 +8099,7 @@ read-pkg-up@^1.0.1:
6813read-pkg-up@^2.0.0: 8099read-pkg-up@^2.0.0:
6814 version "2.0.0" 8100 version "2.0.0"
6815 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 8101 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
8102 integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
6816 dependencies: 8103 dependencies:
6817 find-up "^2.0.0" 8104 find-up "^2.0.0"
6818 read-pkg "^2.0.0" 8105 read-pkg "^2.0.0"
@@ -6820,6 +8107,7 @@ read-pkg-up@^2.0.0:
6820read-pkg@^1.0.0: 8107read-pkg@^1.0.0:
6821 version "1.1.0" 8108 version "1.1.0"
6822 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 8109 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
8110 integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
6823 dependencies: 8111 dependencies:
6824 load-json-file "^1.0.0" 8112 load-json-file "^1.0.0"
6825 normalize-package-data "^2.3.2" 8113 normalize-package-data "^2.3.2"
@@ -6828,14 +8116,16 @@ read-pkg@^1.0.0:
6828read-pkg@^2.0.0: 8116read-pkg@^2.0.0:
6829 version "2.0.0" 8117 version "2.0.0"
6830 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 8118 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
8119 integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
6831 dependencies: 8120 dependencies:
6832 load-json-file "^2.0.0" 8121 load-json-file "^2.0.0"
6833 normalize-package-data "^2.3.2" 8122 normalize-package-data "^2.3.2"
6834 path-type "^2.0.0" 8123 path-type "^2.0.0"
6835 8124
6836"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.3, readable-stream@^2.3.4, readable-stream@^2.3.6: 8125"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.3, readable-stream@^2.3.4, readable-stream@^2.3.6, readable-stream@~2.3.6:
6837 version "2.3.6" 8126 version "2.3.6"
6838 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 8127 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
8128 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
6839 dependencies: 8129 dependencies:
6840 core-util-is "~1.0.0" 8130 core-util-is "~1.0.0"
6841 inherits "~2.0.3" 8131 inherits "~2.0.3"
@@ -6847,16 +8137,18 @@ read-pkg@^2.0.0:
6847 8137
6848readable-stream@1.0: 8138readable-stream@1.0:
6849 version "1.0.34" 8139 version "1.0.34"
6850 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 8140 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
8141 integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
6851 dependencies: 8142 dependencies:
6852 core-util-is "~1.0.0" 8143 core-util-is "~1.0.0"
6853 inherits "~2.0.1" 8144 inherits "~2.0.1"
6854 isarray "0.0.1" 8145 isarray "0.0.1"
6855 string_decoder "~0.10.x" 8146 string_decoder "~0.10.x"
6856 8147
6857readable-stream@^3.0.2: 8148readable-stream@^3.0.2, readable-stream@^3.0.6:
6858 version "3.0.3" 8149 version "3.0.6"
6859 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.3.tgz#a4db8813e3e0b87abdc01d5d5dbae828e59744b5" 8150 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a"
8151 integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==
6860 dependencies: 8152 dependencies:
6861 inherits "^2.0.3" 8153 inherits "^2.0.3"
6862 string_decoder "^1.1.1" 8154 string_decoder "^1.1.1"
@@ -6864,7 +8156,8 @@ readable-stream@^3.0.2:
6864 8156
6865readable-stream@~2.0.6: 8157readable-stream@~2.0.6:
6866 version "2.0.6" 8158 version "2.0.6"
6867 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 8159 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
8160 integrity sha1-j5A0HmilPMySh4jaz80Rs265t44=
6868 dependencies: 8161 dependencies:
6869 core-util-is "~1.0.0" 8162 core-util-is "~1.0.0"
6870 inherits "~2.0.1" 8163 inherits "~2.0.1"
@@ -6876,6 +8169,7 @@ readable-stream@~2.0.6:
6876readdirp@^2.0.0: 8169readdirp@^2.0.0:
6877 version "2.2.1" 8170 version "2.2.1"
6878 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 8171 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
8172 integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
6879 dependencies: 8173 dependencies:
6880 graceful-fs "^4.1.11" 8174 graceful-fs "^4.1.11"
6881 micromatch "^3.1.10" 8175 micromatch "^3.1.10"
@@ -6884,25 +8178,36 @@ readdirp@^2.0.0:
6884realpath-native@^1.0.0: 8178realpath-native@^1.0.0:
6885 version "1.0.2" 8179 version "1.0.2"
6886 resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" 8180 resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560"
8181 integrity sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==
6887 dependencies: 8182 dependencies:
6888 util.promisify "^1.0.0" 8183 util.promisify "^1.0.0"
6889 8184
6890recast@~0.11.12: 8185recast@~0.11.12:
6891 version "0.11.23" 8186 version "0.11.23"
6892 resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" 8187 resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
8188 integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=
6893 dependencies: 8189 dependencies:
6894 ast-types "0.9.6" 8190 ast-types "0.9.6"
6895 esprima "~3.1.0" 8191 esprima "~3.1.0"
6896 private "~0.1.5" 8192 private "~0.1.5"
6897 source-map "~0.5.0" 8193 source-map "~0.5.0"
6898 8194
8195rechoir@^0.6.2:
8196 version "0.6.2"
8197 resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
8198 integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
8199 dependencies:
8200 resolve "^1.1.6"
8201
6899record-cache@^1.0.2: 8202record-cache@^1.0.2:
6900 version "1.1.0" 8203 version "1.1.0"
6901 resolved "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz#f8a467a691a469584b26e88d36b18afdb3932037" 8204 resolved "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz#f8a467a691a469584b26e88d36b18afdb3932037"
8205 integrity sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==
6902 8206
6903redent@^1.0.0: 8207redent@^1.0.0:
6904 version "1.0.0" 8208 version "1.0.0"
6905 resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 8209 resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
8210 integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
6906 dependencies: 8211 dependencies:
6907 indent-string "^2.1.0" 8212 indent-string "^2.1.0"
6908 strip-indent "^1.0.1" 8213 strip-indent "^1.0.1"
@@ -6910,24 +8215,34 @@ redent@^1.0.0:
6910reflect-metadata@^0.1.2: 8215reflect-metadata@^0.1.2:
6911 version "0.1.12" 8216 version "0.1.12"
6912 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 8217 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2"
8218 integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==
6913 8219
6914regenerate@^1.2.1: 8220regenerate@^1.2.1:
6915 version "1.4.0" 8221 version "1.4.0"
6916 resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" 8222 resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
8223 integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
6917 8224
6918regenerator-runtime@^0.11.0: 8225regenerator-runtime@^0.11.0:
6919 version "0.11.1" 8226 version "0.11.1"
6920 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 8227 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
8228 integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
8229
8230regenerator-runtime@^0.12.0:
8231 version "0.12.1"
8232 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
8233 integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
6921 8234
6922regex-cache@^0.4.2: 8235regex-cache@^0.4.2:
6923 version "0.4.4" 8236 version "0.4.4"
6924 resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 8237 resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
8238 integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
6925 dependencies: 8239 dependencies:
6926 is-equal-shallow "^0.1.3" 8240 is-equal-shallow "^0.1.3"
6927 8241
6928regex-not@^1.0.0, regex-not@^1.0.2: 8242regex-not@^1.0.0, regex-not@^1.0.2:
6929 version "1.0.2" 8243 version "1.0.2"
6930 resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 8244 resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
8245 integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
6931 dependencies: 8246 dependencies:
6932 extend-shallow "^3.0.2" 8247 extend-shallow "^3.0.2"
6933 safe-regex "^1.1.0" 8248 safe-regex "^1.1.0"
@@ -6935,6 +8250,7 @@ regex-not@^1.0.0, regex-not@^1.0.2:
6935regexpu-core@^1.0.0: 8250regexpu-core@^1.0.0:
6936 version "1.0.0" 8251 version "1.0.0"
6937 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 8252 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
8253 integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=
6938 dependencies: 8254 dependencies:
6939 regenerate "^1.2.1" 8255 regenerate "^1.2.1"
6940 regjsgen "^0.2.0" 8256 regjsgen "^0.2.0"
@@ -6943,24 +8259,29 @@ regexpu-core@^1.0.0:
6943regjsgen@^0.2.0: 8259regjsgen@^0.2.0:
6944 version "0.2.0" 8260 version "0.2.0"
6945 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 8261 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
8262 integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
6946 8263
6947regjsparser@^0.1.4: 8264regjsparser@^0.1.4:
6948 version "0.1.5" 8265 version "0.1.5"
6949 resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 8266 resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
8267 integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
6950 dependencies: 8268 dependencies:
6951 jsesc "~0.5.0" 8269 jsesc "~0.5.0"
6952 8270
6953relateurl@0.2.x: 8271relateurl@0.2.x:
6954 version "0.2.7" 8272 version "0.2.7"
6955 resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" 8273 resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
8274 integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
6956 8275
6957remove-trailing-separator@^1.0.1: 8276remove-trailing-separator@^1.0.1:
6958 version "1.1.0" 8277 version "1.1.0"
6959 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 8278 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
8279 integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
6960 8280
6961render-media@^3.0.0: 8281render-media@^3.0.0:
6962 version "3.1.3" 8282 version "3.1.3"
6963 resolved "https://registry.yarnpkg.com/render-media/-/render-media-3.1.3.tgz#aa8c8cd3f720049370067180709b551d3c566254" 8283 resolved "https://registry.yarnpkg.com/render-media/-/render-media-3.1.3.tgz#aa8c8cd3f720049370067180709b551d3c566254"
8284 integrity sha512-K7ziKKlIcgYpAovRsABDiSaNn7TzDDyyuFGpRwM52cloNcajInB6sCxFPUEzOuTJUeyvKCqT/k5INOjpKLCjhQ==
6964 dependencies: 8285 dependencies:
6965 debug "^3.1.0" 8286 debug "^3.1.0"
6966 is-ascii "^1.0.0" 8287 is-ascii "^1.0.0"
@@ -6969,75 +8290,58 @@ render-media@^3.0.0:
6969 videostream "^2.5.1" 8290 videostream "^2.5.1"
6970 8291
6971renderkid@^2.0.1: 8292renderkid@^2.0.1:
6972 version "2.0.1" 8293 version "2.0.2"
6973 resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" 8294 resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa"
8295 integrity sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==
6974 dependencies: 8296 dependencies:
6975 css-select "^1.1.0" 8297 css-select "^1.1.0"
6976 dom-converter "~0.1" 8298 dom-converter "~0.2"
6977 htmlparser2 "~3.3.0" 8299 htmlparser2 "~3.3.0"
6978 strip-ansi "^3.0.0" 8300 strip-ansi "^3.0.0"
6979 utila "~0.3" 8301 utila "^0.4.0"
6980 8302
6981repeat-element@^1.1.2: 8303repeat-element@^1.1.2:
6982 version "1.1.3" 8304 version "1.1.3"
6983 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 8305 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
8306 integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
6984 8307
6985repeat-string@^0.2.2: 8308repeat-string@^0.2.2:
6986 version "0.2.2" 8309 version "0.2.2"
6987 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" 8310 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
8311 integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4=
6988 8312
6989repeat-string@^1.5.2, repeat-string@^1.6.1: 8313repeat-string@^1.5.2, repeat-string@^1.6.1:
6990 version "1.6.1" 8314 version "1.6.1"
6991 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 8315 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
8316 integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
6992 8317
6993repeating@^2.0.0: 8318repeating@^2.0.0:
6994 version "2.0.1" 8319 version "2.0.1"
6995 resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 8320 resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
8321 integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
6996 dependencies: 8322 dependencies:
6997 is-finite "^1.0.0" 8323 is-finite "^1.0.0"
6998 8324
6999request-promise-core@1.1.1: 8325request-promise-core@1.1.1:
7000 version "1.1.1" 8326 version "1.1.1"
7001 resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 8327 resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
8328 integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=
7002 dependencies: 8329 dependencies:
7003 lodash "^4.13.1" 8330 lodash "^4.13.1"
7004 8331
7005request-promise-native@^1.0.5: 8332request-promise-native@^1.0.5:
7006 version "1.0.5" 8333 version "1.0.5"
7007 resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" 8334 resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
8335 integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=
7008 dependencies: 8336 dependencies:
7009 request-promise-core "1.1.1" 8337 request-promise-core "1.1.1"
7010 stealthy-require "^1.1.0" 8338 stealthy-require "^1.1.0"
7011 tough-cookie ">=2.3.3" 8339 tough-cookie ">=2.3.3"
7012 8340
7013request@2.87.0: 8341request@^2.83.0, request@^2.87.0, request@^2.88.0:
7014 version "2.87.0"
7015 resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
7016 dependencies:
7017 aws-sign2 "~0.7.0"
7018 aws4 "^1.6.0"
7019 caseless "~0.12.0"
7020 combined-stream "~1.0.5"
7021 extend "~3.0.1"
7022 forever-agent "~0.6.1"
7023 form-data "~2.3.1"
7024 har-validator "~5.0.3"
7025 http-signature "~1.2.0"
7026 is-typedarray "~1.0.0"
7027 isstream "~0.1.2"
7028 json-stringify-safe "~5.0.1"
7029 mime-types "~2.1.17"
7030 oauth-sign "~0.8.2"
7031 performance-now "^2.1.0"
7032 qs "~6.5.1"
7033 safe-buffer "^5.1.1"
7034 tough-cookie "~2.3.3"
7035 tunnel-agent "^0.6.0"
7036 uuid "^3.1.0"
7037
7038request@^2.74.0, request@^2.83.0, request@^2.87.0:
7039 version "2.88.0" 8342 version "2.88.0"
7040 resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 8343 resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
8344 integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
7041 dependencies: 8345 dependencies:
7042 aws-sign2 "~0.7.0" 8346 aws-sign2 "~0.7.0"
7043 aws4 "^1.8.0" 8347 aws4 "^1.8.0"
@@ -7063,46 +8367,56 @@ request@^2.74.0, request@^2.83.0, request@^2.87.0:
7063require-directory@^2.1.1: 8367require-directory@^2.1.1:
7064 version "2.1.1" 8368 version "2.1.1"
7065 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 8369 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
8370 integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
7066 8371
7067require-from-string@^2.0.1: 8372require-from-string@^2.0.1:
7068 version "2.0.2" 8373 version "2.0.2"
7069 resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 8374 resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
8375 integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
7070 8376
7071require-main-filename@^1.0.1: 8377require-main-filename@^1.0.1:
7072 version "1.0.1" 8378 version "1.0.1"
7073 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 8379 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
8380 integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
7074 8381
7075requires-port@^1.0.0: 8382requires-port@^1.0.0:
7076 version "1.0.0" 8383 version "1.0.0"
7077 resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 8384 resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
8385 integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
7078 8386
7079resolve-cwd@^2.0.0: 8387resolve-cwd@^2.0.0:
7080 version "2.0.0" 8388 version "2.0.0"
7081 resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" 8389 resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
8390 integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
7082 dependencies: 8391 dependencies:
7083 resolve-from "^3.0.0" 8392 resolve-from "^3.0.0"
7084 8393
7085resolve-from@^3.0.0: 8394resolve-from@^3.0.0:
7086 version "3.0.0" 8395 version "3.0.0"
7087 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 8396 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
8397 integrity sha1-six699nWiBvItuZTM17rywoYh0g=
7088 8398
7089resolve-url@^0.2.1: 8399resolve-url@^0.2.1:
7090 version "0.2.1" 8400 version "0.2.1"
7091 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 8401 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
8402 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
7092 8403
7093resolve@1.1.7, resolve@1.1.x: 8404resolve@1.1.7:
7094 version "1.1.7" 8405 version "1.1.7"
7095 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 8406 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
8407 integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
7096 8408
7097resolve@^1.1.7, resolve@^1.3.2: 8409resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
7098 version "1.8.1" 8410 version "1.8.1"
7099 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 8411 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
8412 integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==
7100 dependencies: 8413 dependencies:
7101 path-parse "^1.0.5" 8414 path-parse "^1.0.5"
7102 8415
7103restore-cursor@^2.0.0: 8416restore-cursor@^2.0.0:
7104 version "2.0.0" 8417 version "2.0.0"
7105 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 8418 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
8419 integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
7106 dependencies: 8420 dependencies:
7107 onetime "^2.0.0" 8421 onetime "^2.0.0"
7108 signal-exit "^3.0.2" 8422 signal-exit "^3.0.2"
@@ -7110,14 +8424,17 @@ restore-cursor@^2.0.0:
7110ret@~0.1.10: 8424ret@~0.1.10:
7111 version "0.1.15" 8425 version "0.1.15"
7112 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 8426 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
8427 integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
7113 8428
7114retry@^0.10.0: 8429retry@^0.10.0:
7115 version "0.10.1" 8430 version "0.10.1"
7116 resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" 8431 resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
8432 integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
7117 8433
7118rework@^1.0.1: 8434rework@^1.0.1:
7119 version "1.0.1" 8435 version "1.0.1"
7120 resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" 8436 resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7"
8437 integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=
7121 dependencies: 8438 dependencies:
7122 convert-source-map "^0.3.3" 8439 convert-source-map "^0.3.3"
7123 css "^2.0.0" 8440 css "^2.0.0"
@@ -7125,16 +8442,19 @@ rework@^1.0.1:
7125rfdc@^1.1.2: 8442rfdc@^1.1.2:
7126 version "1.1.2" 8443 version "1.1.2"
7127 resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" 8444 resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349"
8445 integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==
7128 8446
7129rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: 8447rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2:
7130 version "2.6.2" 8448 version "2.6.2"
7131 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 8449 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
8450 integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
7132 dependencies: 8451 dependencies:
7133 glob "^7.0.5" 8452 glob "^7.0.5"
7134 8453
7135ripemd160@^2.0.0, ripemd160@^2.0.1: 8454ripemd160@^2.0.0, ripemd160@^2.0.1:
7136 version "2.0.2" 8455 version "2.0.2"
7137 resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 8456 resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
8457 integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
7138 dependencies: 8458 dependencies:
7139 hash-base "^3.0.0" 8459 hash-base "^3.0.0"
7140 inherits "^2.0.1" 8460 inherits "^2.0.1"
@@ -7142,80 +8462,84 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
7142rsvp@^3.3.3: 8462rsvp@^3.3.3:
7143 version "3.6.2" 8463 version "3.6.2"
7144 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" 8464 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
8465 integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==
7145 8466
7146run-async@^2.2.0: 8467run-async@^2.2.0:
7147 version "2.3.0" 8468 version "2.3.0"
7148 resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 8469 resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
8470 integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
7149 dependencies: 8471 dependencies:
7150 is-promise "^2.1.0" 8472 is-promise "^2.1.0"
7151 8473
7152run-parallel-limit@^1.0.3: 8474run-parallel-limit@^1.0.3:
7153 version "1.0.5" 8475 version "1.0.5"
7154 resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz#c29a4fd17b4df358cb52a8a697811a63c984f1b7" 8476 resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz#c29a4fd17b4df358cb52a8a697811a63c984f1b7"
8477 integrity sha512-NsY+oDngvrvMxKB3G8ijBzIema6aYbQMD2bHOamvN52BysbIGTnEY2xsNyfrcr9GhY995/t/0nQN3R3oZvaDlg==
7155 8478
7156run-parallel@^1.0.0, run-parallel@^1.1.2, run-parallel@^1.1.6: 8479run-parallel@^1.0.0, run-parallel@^1.1.2, run-parallel@^1.1.6:
7157 version "1.1.9" 8480 version "1.1.9"
7158 resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" 8481 resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
8482 integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
7159 8483
7160run-queue@^1.0.0, run-queue@^1.0.3: 8484run-queue@^1.0.0, run-queue@^1.0.3:
7161 version "1.0.3" 8485 version "1.0.3"
7162 resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" 8486 resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
8487 integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
7163 dependencies: 8488 dependencies:
7164 aproba "^1.1.1" 8489 aproba "^1.1.1"
7165 8490
7166run-series@^1.0.2: 8491run-series@^1.0.2:
7167 version "1.1.8" 8492 version "1.1.8"
7168 resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36" 8493 resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36"
8494 integrity sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==
7169 8495
7170rusha@^0.8.1: 8496rusha@^0.8.1:
7171 version "0.8.13" 8497 version "0.8.13"
7172 resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a" 8498 resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a"
8499 integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=
7173 8500
7174rust-result@^1.0.0: 8501rust-result@^1.0.0:
7175 version "1.0.0" 8502 version "1.0.0"
7176 resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72" 8503 resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
8504 integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
7177 dependencies: 8505 dependencies:
7178 individual "^2.0.0" 8506 individual "^2.0.0"
7179 8507
7180rxjs@^6.1.0: 8508rxjs@6.3.3, rxjs@^6.1.0, rxjs@^6.3.3:
7181 version "6.3.2" 8509 version "6.3.3"
7182 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" 8510 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
7183 dependencies: 8511 integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==
7184 tslib "^1.9.0"
7185
7186rxjs@~6.2.0:
7187 version "6.2.2"
7188 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9"
7189 dependencies: 8512 dependencies:
7190 tslib "^1.9.0" 8513 tslib "^1.9.0"
7191 8514
7192safe-buffer@5.1.1:
7193 version "5.1.1"
7194 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
7195
7196safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 8515safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
7197 version "5.1.2" 8516 version "5.1.2"
7198 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 8517 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
8518 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
7199 8519
7200safe-json-parse@4.0.0: 8520safe-json-parse@4.0.0:
7201 version "4.0.0" 8521 version "4.0.0"
7202 resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac" 8522 resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
8523 integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
7203 dependencies: 8524 dependencies:
7204 rust-result "^1.0.0" 8525 rust-result "^1.0.0"
7205 8526
7206safe-regex@^1.1.0: 8527safe-regex@^1.1.0:
7207 version "1.1.0" 8528 version "1.1.0"
7208 resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 8529 resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
8530 integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
7209 dependencies: 8531 dependencies:
7210 ret "~0.1.10" 8532 ret "~0.1.10"
7211 8533
7212"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 8534"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
7213 version "2.1.2" 8535 version "2.1.2"
7214 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 8536 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
8537 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
7215 8538
7216sane@^2.0.0: 8539sane@^2.0.0:
7217 version "2.5.2" 8540 version "2.5.2"
7218 resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" 8541 resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
8542 integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o=
7219 dependencies: 8543 dependencies:
7220 anymatch "^2.0.0" 8544 anymatch "^2.0.0"
7221 capture-exit "^1.2.0" 8545 capture-exit "^1.2.0"
@@ -7229,32 +8553,35 @@ sane@^2.0.0:
7229 fsevents "^1.2.3" 8553 fsevents "^1.2.3"
7230 8554
7231sanitize-html@^1.18.4: 8555sanitize-html@^1.18.4:
7232 version "1.19.0" 8556 version "1.19.2"
7233 resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.19.0.tgz#34d8a4b864aba79602e4a32003f293fc242df0a9" 8557 resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.19.2.tgz#c03fffe2bf96cd582968ece9792cbca32e64dde0"
8558 integrity sha512-7fNb3/N0sZ/nkshMRBoxLz6K1dlMSVF/eQHX1Bof9sRT7cZJvmrDGfXEn544MXJnpY29vux1A599g9UrcHTBXA==
7234 dependencies: 8559 dependencies:
7235 chalk "^2.3.0" 8560 chalk "^2.4.1"
7236 htmlparser2 "^3.9.0" 8561 css-tree "^1.0.0-alpha.29"
8562 htmlparser2 "^3.10.0"
7237 lodash.clonedeep "^4.5.0" 8563 lodash.clonedeep "^4.5.0"
7238 lodash.escaperegexp "^4.1.2" 8564 lodash.escaperegexp "^4.1.2"
7239 lodash.isplainobject "^4.0.6" 8565 lodash.isplainobject "^4.0.6"
7240 lodash.isstring "^4.0.1" 8566 lodash.isstring "^4.0.1"
7241 lodash.mergewith "^4.6.0" 8567 lodash.mergewith "^4.6.1"
7242 postcss "^6.0.14"
7243 srcset "^1.0.0" 8568 srcset "^1.0.0"
7244 xtend "^4.0.0" 8569 xtend "^4.0.1"
7245 8570
7246sass-graph@^2.2.4: 8571sass-graph@^2.2.4:
7247 version "2.2.4" 8572 version "2.2.4"
7248 resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" 8573 resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
8574 integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
7249 dependencies: 8575 dependencies:
7250 glob "^7.0.0" 8576 glob "^7.0.0"
7251 lodash "^4.0.0" 8577 lodash "^4.0.0"
7252 scss-tokenizer "^0.2.3" 8578 scss-tokenizer "^0.2.3"
7253 yargs "^7.0.0" 8579 yargs "^7.0.0"
7254 8580
7255sass-loader@^7.1.0: 8581sass-loader@7.1.0, sass-loader@^7.1.0:
7256 version "7.1.0" 8582 version "7.1.0"
7257 resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" 8583 resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d"
8584 integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==
7258 dependencies: 8585 dependencies:
7259 clone-deep "^2.0.1" 8586 clone-deep "^2.0.1"
7260 loader-utils "^1.0.1" 8587 loader-utils "^1.0.1"
@@ -7263,9 +8590,10 @@ sass-loader@^7.1.0:
7263 pify "^3.0.0" 8590 pify "^3.0.0"
7264 semver "^5.5.0" 8591 semver "^5.5.0"
7265 8592
7266sass-resources-loader@^1.2.1: 8593sass-resources-loader@^2.0.0:
7267 version "1.3.3" 8594 version "2.0.0"
7268 resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-1.3.3.tgz#90f0e614c444f6dfb8f54ce3e1d5f64a18d31537" 8595 resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.0.0.tgz#88569c542fbf1f18f33a6578b77cc5b36c56911d"
8596 integrity sha512-I+5FfV+Hb29U5Nt8DbslWOBgRmTv1M/EwOn4/4rc6Aqy9yjygoa8UTnyCFXfTZV8FoQyIBZbEyKSBryhByqQbA==
7269 dependencies: 8597 dependencies:
7270 async "^2.1.4" 8598 async "^2.1.4"
7271 chalk "^1.1.3" 8599 chalk "^1.1.3"
@@ -7275,32 +8603,39 @@ sass-resources-loader@^1.2.1:
7275saucelabs@^1.5.0: 8603saucelabs@^1.5.0:
7276 version "1.5.0" 8604 version "1.5.0"
7277 resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" 8605 resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d"
8606 integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==
7278 dependencies: 8607 dependencies:
7279 https-proxy-agent "^2.2.1" 8608 https-proxy-agent "^2.2.1"
7280 8609
7281sax@0.5.x: 8610sax@0.5.x:
7282 version "0.5.8" 8611 version "0.5.8"
7283 resolved "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" 8612 resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
8613 integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=
7284 8614
7285sax@>=0.6.0, sax@^1.2.4: 8615sax@>=0.6.0, sax@^1.2.4:
7286 version "1.2.4" 8616 version "1.2.4"
7287 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 8617 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
8618 integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
7288 8619
7289schedule@^0.5.0: 8620scheduler@^0.11.2:
7290 version "0.5.0" 8621 version "0.11.3"
7291 resolved "https://registry.yarnpkg.com/schedule/-/schedule-0.5.0.tgz#c128fffa0b402488b08b55ae74bb9df55cc29cc8" 8622 resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b"
8623 integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ==
7292 dependencies: 8624 dependencies:
8625 loose-envify "^1.1.0"
7293 object-assign "^4.1.1" 8626 object-assign "^4.1.1"
7294 8627
7295schema-utils@^0.3.0: 8628schema-utils@^0.3.0:
7296 version "0.3.0" 8629 version "0.3.0"
7297 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" 8630 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
8631 integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=
7298 dependencies: 8632 dependencies:
7299 ajv "^5.0.0" 8633 ajv "^5.0.0"
7300 8634
7301schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5: 8635schema-utils@^0.4.4, schema-utils@^0.4.5:
7302 version "0.4.7" 8636 version "0.4.7"
7303 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" 8637 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
8638 integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
7304 dependencies: 8639 dependencies:
7305 ajv "^6.1.0" 8640 ajv "^6.1.0"
7306 ajv-keywords "^3.1.0" 8641 ajv-keywords "^3.1.0"
@@ -7308,6 +8643,7 @@ schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5:
7308schema-utils@^1.0.0: 8643schema-utils@^1.0.0:
7309 version "1.0.0" 8644 version "1.0.0"
7310 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" 8645 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
8646 integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
7311 dependencies: 8647 dependencies:
7312 ajv "^6.1.0" 8648 ajv "^6.1.0"
7313 ajv-errors "^1.0.0" 8649 ajv-errors "^1.0.0"
@@ -7316,6 +8652,7 @@ schema-utils@^1.0.0:
7316scss-tokenizer@^0.2.3: 8652scss-tokenizer@^0.2.3:
7317 version "0.2.3" 8653 version "0.2.3"
7318 resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" 8654 resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
8655 integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
7319 dependencies: 8656 dependencies:
7320 js-base64 "^2.1.8" 8657 js-base64 "^2.1.8"
7321 source-map "^0.4.2" 8658 source-map "^0.4.2"
@@ -7323,10 +8660,12 @@ scss-tokenizer@^0.2.3:
7323select-hose@^2.0.0: 8660select-hose@^2.0.0:
7324 version "2.0.0" 8661 version "2.0.0"
7325 resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" 8662 resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
8663 integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
7326 8664
7327selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: 8665selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1:
7328 version "3.6.0" 8666 version "3.6.0"
7329 resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" 8667 resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc"
8668 integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==
7330 dependencies: 8669 dependencies:
7331 jszip "^3.1.3" 8670 jszip "^3.1.3"
7332 rimraf "^2.5.4" 8671 rimraf "^2.5.4"
@@ -7334,34 +8673,40 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1:
7334 xml2js "^0.4.17" 8673 xml2js "^0.4.17"
7335 8674
7336selfsigned@^1.9.1: 8675selfsigned@^1.9.1:
7337 version "1.10.3" 8676 version "1.10.4"
7338 resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" 8677 resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd"
8678 integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==
7339 dependencies: 8679 dependencies:
7340 node-forge "0.7.5" 8680 node-forge "0.7.5"
7341 8681
7342semver-dsl@^1.0.1: 8682semver-dsl@^1.0.1:
7343 version "1.0.1" 8683 version "1.0.1"
7344 resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" 8684 resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0"
8685 integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=
7345 dependencies: 8686 dependencies:
7346 semver "^5.3.0" 8687 semver "^5.3.0"
7347 8688
7348semver-intersect@^1.1.2: 8689semver-intersect@1.4.0:
7349 version "1.4.0" 8690 version "1.4.0"
7350 resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" 8691 resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3"
8692 integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==
7351 dependencies: 8693 dependencies:
7352 semver "^5.0.0" 8694 semver "^5.0.0"
7353 8695
7354"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@5.x, semver@^5.0.0, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: 8696"semver@2 || 3 || 4 || 5", semver@5.6.0, semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0:
7355 version "5.5.1" 8697 version "5.6.0"
7356 resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 8698 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
8699 integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
7357 8700
7358semver@~5.3.0: 8701semver@~5.3.0:
7359 version "5.3.0" 8702 version "5.3.0"
7360 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 8703 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
8704 integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
7361 8705
7362send@0.16.2: 8706send@0.16.2:
7363 version "0.16.2" 8707 version "0.16.2"
7364 resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 8708 resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
8709 integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
7365 dependencies: 8710 dependencies:
7366 debug "2.6.9" 8711 debug "2.6.9"
7367 depd "~1.1.2" 8712 depd "~1.1.2"
@@ -7380,10 +8725,12 @@ send@0.16.2:
7380serialize-javascript@^1.4.0: 8725serialize-javascript@^1.4.0:
7381 version "1.5.0" 8726 version "1.5.0"
7382 resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" 8727 resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
8728 integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==
7383 8729
7384serve-index@^1.7.2: 8730serve-index@^1.7.2:
7385 version "1.9.1" 8731 version "1.9.1"
7386 resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" 8732 resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
8733 integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
7387 dependencies: 8734 dependencies:
7388 accepts "~1.3.4" 8735 accepts "~1.3.4"
7389 batch "0.6.1" 8736 batch "0.6.1"
@@ -7396,6 +8743,7 @@ serve-index@^1.7.2:
7396serve-static@1.13.2: 8743serve-static@1.13.2:
7397 version "1.13.2" 8744 version "1.13.2"
7398 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 8745 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
8746 integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
7399 dependencies: 8747 dependencies:
7400 encodeurl "~1.0.2" 8748 encodeurl "~1.0.2"
7401 escape-html "~1.0.3" 8749 escape-html "~1.0.3"
@@ -7405,10 +8753,12 @@ serve-static@1.13.2:
7405set-blocking@^2.0.0, set-blocking@~2.0.0: 8753set-blocking@^2.0.0, set-blocking@~2.0.0:
7406 version "2.0.0" 8754 version "2.0.0"
7407 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 8755 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
8756 integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
7408 8757
7409set-value@^0.4.3: 8758set-value@^0.4.3:
7410 version "0.4.3" 8759 version "0.4.3"
7411 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 8760 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
8761 integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
7412 dependencies: 8762 dependencies:
7413 extend-shallow "^2.0.1" 8763 extend-shallow "^2.0.1"
7414 is-extendable "^0.1.1" 8764 is-extendable "^0.1.1"
@@ -7418,6 +8768,7 @@ set-value@^0.4.3:
7418set-value@^2.0.0: 8768set-value@^2.0.0:
7419 version "2.0.0" 8769 version "2.0.0"
7420 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 8770 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
8771 integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
7421 dependencies: 8772 dependencies:
7422 extend-shallow "^2.0.1" 8773 extend-shallow "^2.0.1"
7423 is-extendable "^0.1.1" 8774 is-extendable "^0.1.1"
@@ -7427,18 +8778,17 @@ set-value@^2.0.0:
7427setimmediate@^1.0.4: 8778setimmediate@^1.0.4:
7428 version "1.0.5" 8779 version "1.0.5"
7429 resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 8780 resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
7430 8781 integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
7431setprototypeof@1.0.3:
7432 version "1.0.3"
7433 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
7434 8782
7435setprototypeof@1.1.0: 8783setprototypeof@1.1.0:
7436 version "1.1.0" 8784 version "1.1.0"
7437 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 8785 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
8786 integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
7438 8787
7439sha.js@^2.4.0, sha.js@^2.4.8: 8788sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
7440 version "2.4.11" 8789 version "2.4.11"
7441 resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 8790 resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
8791 integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
7442 dependencies: 8792 dependencies:
7443 inherits "^2.0.1" 8793 inherits "^2.0.1"
7444 safe-buffer "^5.0.1" 8794 safe-buffer "^5.0.1"
@@ -7446,6 +8796,7 @@ sha.js@^2.4.0, sha.js@^2.4.8:
7446shallow-clone@^1.0.0: 8796shallow-clone@^1.0.0:
7447 version "1.0.0" 8797 version "1.0.0"
7448 resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" 8798 resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
8799 integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
7449 dependencies: 8800 dependencies:
7450 is-extendable "^0.1.1" 8801 is-extendable "^0.1.1"
7451 kind-of "^5.0.0" 8802 kind-of "^5.0.0"
@@ -7454,28 +8805,43 @@ shallow-clone@^1.0.0:
7454shebang-command@^1.2.0: 8805shebang-command@^1.2.0:
7455 version "1.2.0" 8806 version "1.2.0"
7456 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 8807 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
8808 integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
7457 dependencies: 8809 dependencies:
7458 shebang-regex "^1.0.0" 8810 shebang-regex "^1.0.0"
7459 8811
7460shebang-regex@^1.0.0: 8812shebang-regex@^1.0.0:
7461 version "1.0.0" 8813 version "1.0.0"
7462 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 8814 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
8815 integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
8816
8817shelljs@^0.8.1:
8818 version "0.8.3"
8819 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097"
8820 integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==
8821 dependencies:
8822 glob "^7.0.0"
8823 interpret "^1.0.0"
8824 rechoir "^0.6.2"
7463 8825
7464shellwords@^0.1.1: 8826shellwords@^0.1.1:
7465 version "0.1.1" 8827 version "0.1.1"
7466 resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 8828 resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
8829 integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
7467 8830
7468signal-exit@^3.0.0, signal-exit@^3.0.2: 8831signal-exit@^3.0.0, signal-exit@^3.0.2:
7469 version "3.0.2" 8832 version "3.0.2"
7470 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 8833 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
8834 integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
7471 8835
7472simple-concat@^1.0.0: 8836simple-concat@^1.0.0:
7473 version "1.0.0" 8837 version "1.0.0"
7474 resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 8838 resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
8839 integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
7475 8840
7476simple-get@^2.8.1, simple-get@^3.0.0, simple-get@^3.0.1: 8841simple-get@^2.8.1, simple-get@^3.0.0, simple-get@^3.0.1:
7477 version "2.8.1" 8842 version "2.8.1"
7478 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" 8843 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
8844 integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
7479 dependencies: 8845 dependencies:
7480 decompress-response "^3.3.0" 8846 decompress-response "^3.3.0"
7481 once "^1.3.1" 8847 once "^1.3.1"
@@ -7484,6 +8850,7 @@ simple-get@^2.8.1, simple-get@^3.0.0, simple-get@^3.0.1:
7484simple-peer@^9.0.0: 8850simple-peer@^9.0.0:
7485 version "9.1.2" 8851 version "9.1.2"
7486 resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.1.2.tgz#f8afa5eb83f8a17d66e437e5ac54c1221eca4b39" 8852 resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.1.2.tgz#f8afa5eb83f8a17d66e437e5ac54c1221eca4b39"
8853 integrity sha512-MUWWno5o5cvISKOH4pYQ18PQJLpDaNWoKUbrPPKuspCLCkkh+zhtuQyTE8h2U2Ags+/OUN5wnUe92+9B8/Sm2Q==
7487 dependencies: 8854 dependencies:
7488 debug "^3.1.0" 8855 debug "^3.1.0"
7489 get-browser-rtc "^1.0.0" 8856 get-browser-rtc "^1.0.0"
@@ -7494,12 +8861,14 @@ simple-peer@^9.0.0:
7494simple-sha1@^2.0.0, simple-sha1@^2.0.8, simple-sha1@^2.1.0: 8861simple-sha1@^2.0.0, simple-sha1@^2.0.8, simple-sha1@^2.1.0:
7495 version "2.1.1" 8862 version "2.1.1"
7496 resolved "https://registry.yarnpkg.com/simple-sha1/-/simple-sha1-2.1.1.tgz#93f3b7f2e8dfdc056c32793e5d47b58d311b140d" 8863 resolved "https://registry.yarnpkg.com/simple-sha1/-/simple-sha1-2.1.1.tgz#93f3b7f2e8dfdc056c32793e5d47b58d311b140d"
8864 integrity sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==
7497 dependencies: 8865 dependencies:
7498 rusha "^0.8.1" 8866 rusha "^0.8.1"
7499 8867
7500simple-websocket@^7.0.1: 8868simple-websocket@^7.0.1:
7501 version "7.2.0" 8869 version "7.2.0"
7502 resolved "https://registry.yarnpkg.com/simple-websocket/-/simple-websocket-7.2.0.tgz#c3190555d74399372b96b51435f2d8c4b04611df" 8870 resolved "https://registry.yarnpkg.com/simple-websocket/-/simple-websocket-7.2.0.tgz#c3190555d74399372b96b51435f2d8c4b04611df"
8871 integrity sha512-wdxFg1fHw1yqFKWDcw+yNb4VIYqtl+vknZMlpLhvZSlR6l7/iVuwozqo+Qtl73mB1IH5QnXzonD1S+hAaLNTvQ==
7503 dependencies: 8872 dependencies:
7504 debug "^3.1.0" 8873 debug "^3.1.0"
7505 inherits "^2.0.1" 8874 inherits "^2.0.1"
@@ -7510,18 +8879,22 @@ simple-websocket@^7.0.1:
7510sisteransi@^0.1.1: 8879sisteransi@^0.1.1:
7511 version "0.1.1" 8880 version "0.1.1"
7512 resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" 8881 resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
8882 integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==
7513 8883
7514slash@^1.0.0: 8884slash@^1.0.0:
7515 version "1.0.0" 8885 version "1.0.0"
7516 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 8886 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
8887 integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
7517 8888
7518slide@^1.1.3: 8889smart-buffer@^4.0.1:
7519 version "1.1.6" 8890 version "4.0.1"
7520 resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 8891 resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3"
8892 integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==
7521 8893
7522snapdragon-node@^2.0.1: 8894snapdragon-node@^2.0.1:
7523 version "2.1.1" 8895 version "2.1.1"
7524 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 8896 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
8897 integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
7525 dependencies: 8898 dependencies:
7526 define-property "^1.0.0" 8899 define-property "^1.0.0"
7527 isobject "^3.0.0" 8900 isobject "^3.0.0"
@@ -7530,12 +8903,14 @@ snapdragon-node@^2.0.1:
7530snapdragon-util@^3.0.1: 8903snapdragon-util@^3.0.1:
7531 version "3.0.1" 8904 version "3.0.1"
7532 resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 8905 resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
8906 integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
7533 dependencies: 8907 dependencies:
7534 kind-of "^3.2.0" 8908 kind-of "^3.2.0"
7535 8909
7536snapdragon@^0.8.1: 8910snapdragon@^0.8.1:
7537 version "0.8.2" 8911 version "0.8.2"
7538 resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 8912 resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
8913 integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
7539 dependencies: 8914 dependencies:
7540 base "^0.11.1" 8915 base "^0.11.1"
7541 debug "^2.2.0" 8916 debug "^2.2.0"
@@ -7549,10 +8924,12 @@ snapdragon@^0.8.1:
7549socket.io-adapter@~1.1.0: 8924socket.io-adapter@~1.1.0:
7550 version "1.1.1" 8925 version "1.1.1"
7551 resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" 8926 resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
8927 integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=
7552 8928
7553socket.io-client@2.1.1: 8929socket.io-client@2.1.1:
7554 version "2.1.1" 8930 version "2.1.1"
7555 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" 8931 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f"
8932 integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==
7556 dependencies: 8933 dependencies:
7557 backo2 "1.0.2" 8934 backo2 "1.0.2"
7558 base64-arraybuffer "0.1.5" 8935 base64-arraybuffer "0.1.5"
@@ -7569,9 +8946,39 @@ socket.io-client@2.1.1:
7569 socket.io-parser "~3.2.0" 8946 socket.io-parser "~3.2.0"
7570 to-array "0.1.4" 8947 to-array "0.1.4"
7571 8948
8949socket.io-client@^2.2.0:
8950 version "2.2.0"
8951 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7"
8952 integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==
8953 dependencies:
8954 backo2 "1.0.2"
8955 base64-arraybuffer "0.1.5"
8956 component-bind "1.0.0"
8957 component-emitter "1.2.1"
8958 debug "~3.1.0"
8959 engine.io-client "~3.3.1"
8960 has-binary2 "~1.0.2"
8961 has-cors "1.1.0"
8962 indexof "0.0.1"
8963 object-component "0.0.3"
8964 parseqs "0.0.5"
8965 parseuri "0.0.5"
8966 socket.io-parser "~3.3.0"
8967 to-array "0.1.4"
8968
7572socket.io-parser@~3.2.0: 8969socket.io-parser@~3.2.0:
7573 version "3.2.0" 8970 version "3.2.0"
7574 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" 8971 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077"
8972 integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==
8973 dependencies:
8974 component-emitter "1.2.1"
8975 debug "~3.1.0"
8976 isarray "2.0.1"
8977
8978socket.io-parser@~3.3.0:
8979 version "3.3.0"
8980 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
8981 integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
7575 dependencies: 8982 dependencies:
7576 component-emitter "1.2.1" 8983 component-emitter "1.2.1"
7577 debug "~3.1.0" 8984 debug "~3.1.0"
@@ -7580,6 +8987,7 @@ socket.io-parser@~3.2.0:
7580socket.io@2.1.1: 8987socket.io@2.1.1:
7581 version "2.1.1" 8988 version "2.1.1"
7582 resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" 8989 resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980"
8990 integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==
7583 dependencies: 8991 dependencies:
7584 debug "~3.1.0" 8992 debug "~3.1.0"
7585 engine.io "~3.2.0" 8993 engine.io "~3.2.0"
@@ -7588,35 +8996,56 @@ socket.io@2.1.1:
7588 socket.io-client "2.1.1" 8996 socket.io-client "2.1.1"
7589 socket.io-parser "~3.2.0" 8997 socket.io-parser "~3.2.0"
7590 8998
7591sockjs-client@1.1.5: 8999sockjs-client@1.3.0:
7592 version "1.1.5" 9000 version "1.3.0"
7593 resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" 9001 resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177"
9002 integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==
7594 dependencies: 9003 dependencies:
7595 debug "^2.6.6" 9004 debug "^3.2.5"
7596 eventsource "0.1.6" 9005 eventsource "^1.0.7"
7597 faye-websocket "~0.11.0" 9006 faye-websocket "~0.11.1"
7598 inherits "^2.0.1" 9007 inherits "^2.0.3"
7599 json3 "^3.3.2" 9008 json3 "^3.3.2"
7600 url-parse "^1.1.8" 9009 url-parse "^1.4.3"
7601 9010
7602sockjs@0.3.19: 9011sockjs@0.3.19:
7603 version "0.3.19" 9012 version "0.3.19"
7604 resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" 9013 resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
9014 integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==
7605 dependencies: 9015 dependencies:
7606 faye-websocket "^0.10.0" 9016 faye-websocket "^0.10.0"
7607 uuid "^3.0.1" 9017 uuid "^3.0.1"
7608 9018
9019socks-proxy-agent@^4.0.0:
9020 version "4.0.1"
9021 resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473"
9022 integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==
9023 dependencies:
9024 agent-base "~4.2.0"
9025 socks "~2.2.0"
9026
9027socks@~2.2.0:
9028 version "2.2.2"
9029 resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.2.tgz#f061219fc2d4d332afb4af93e865c84d3fa26e2b"
9030 integrity sha512-g6wjBnnMOZpE0ym6e0uHSddz9p3a+WsBaaYQaBaSCJYvrC4IXykQR9MNGjLQf38e9iIIhp3b1/Zk8YZI3KGJ0Q==
9031 dependencies:
9032 ip "^1.1.5"
9033 smart-buffer "^4.0.1"
9034
7609source-list-map@^2.0.0: 9035source-list-map@^2.0.0:
7610 version "2.0.0" 9036 version "2.0.1"
7611 resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" 9037 resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
9038 integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
7612 9039
7613source-list-map@~0.1.7: 9040source-list-map@~0.1.7:
7614 version "0.1.8" 9041 version "0.1.8"
7615 resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" 9042 resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
9043 integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=
7616 9044
7617source-map-loader@^0.2.3: 9045source-map-loader@0.2.4:
7618 version "0.2.4" 9046 version "0.2.4"
7619 resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" 9047 resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271"
9048 integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==
7620 dependencies: 9049 dependencies:
7621 async "^2.5.0" 9050 async "^2.5.0"
7622 loader-utils "^1.1.0" 9051 loader-utils "^1.1.0"
@@ -7624,6 +9053,7 @@ source-map-loader@^0.2.3:
7624source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: 9053source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
7625 version "0.5.2" 9054 version "0.5.2"
7626 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 9055 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
9056 integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
7627 dependencies: 9057 dependencies:
7628 atob "^2.1.1" 9058 atob "^2.1.1"
7629 decode-uri-component "^0.2.0" 9059 decode-uri-component "^0.2.0"
@@ -7631,15 +9061,25 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
7631 source-map-url "^0.4.0" 9061 source-map-url "^0.4.0"
7632 urix "^0.1.0" 9062 urix "^0.1.0"
7633 9063
9064source-map-support@0.5.10, source-map-support@~0.5.9:
9065 version "0.5.10"
9066 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
9067 integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
9068 dependencies:
9069 buffer-from "^1.0.0"
9070 source-map "^0.6.0"
9071
7634source-map-support@^0.4.15, source-map-support@~0.4.0: 9072source-map-support@^0.4.15, source-map-support@~0.4.0:
7635 version "0.4.18" 9073 version "0.4.18"
7636 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 9074 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
9075 integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
7637 dependencies: 9076 dependencies:
7638 source-map "^0.5.6" 9077 source-map "^0.5.6"
7639 9078
7640source-map-support@^0.5.0, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6: 9079source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6:
7641 version "0.5.9" 9080 version "0.5.9"
7642 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 9081 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
9082 integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
7643 dependencies: 9083 dependencies:
7644 buffer-from "^1.0.0" 9084 buffer-from "^1.0.0"
7645 source-map "^0.6.0" 9085 source-map "^0.6.0"
@@ -7647,178 +9087,220 @@ source-map-support@^0.5.0, source-map-support@^0.5.3, source-map-support@^0.5.5,
7647source-map-url@^0.4.0: 9087source-map-url@^0.4.0:
7648 version "0.4.0" 9088 version "0.4.0"
7649 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 9089 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
9090 integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
7650 9091
7651source-map@0.1.x: 9092source-map@0.1.x:
7652 version "0.1.43" 9093 version "0.1.43"
7653 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" 9094 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
9095 integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
7654 dependencies: 9096 dependencies:
7655 amdefine ">=0.0.4" 9097 amdefine ">=0.0.4"
7656 9098
9099source-map@0.5.6:
9100 version "0.5.6"
9101 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
9102 integrity sha1-dc449SvwczxafwwRjYEzSiu19BI=
9103
9104source-map@0.7.3:
9105 version "0.7.3"
9106 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
9107 integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
9108
7657source-map@^0.4.2, source-map@~0.4.1: 9109source-map@^0.4.2, source-map@~0.4.1:
7658 version "0.4.4" 9110 version "0.4.4"
7659 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 9111 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
9112 integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
7660 dependencies: 9113 dependencies:
7661 amdefine ">=0.0.4" 9114 amdefine ">=0.0.4"
7662 9115
7663source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.3: 9116source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.3:
7664 version "0.5.7" 9117 version "0.5.7"
7665 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 9118 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
9119 integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
7666 9120
7667source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: 9121source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
7668 version "0.6.1" 9122 version "0.6.1"
7669 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 9123 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
9124 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
7670 9125
7671source-map@~0.2.0: 9126sourcemap-codec@^1.4.1:
7672 version "0.2.0" 9127 version "1.4.4"
7673 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 9128 resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f"
7674 dependencies: 9129 integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==
7675 amdefine ">=0.0.4"
7676 9130
7677spdx-correct@^3.0.0: 9131spdx-correct@^3.0.0:
7678 version "3.0.0" 9132 version "3.0.2"
7679 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 9133 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
9134 integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==
7680 dependencies: 9135 dependencies:
7681 spdx-expression-parse "^3.0.0" 9136 spdx-expression-parse "^3.0.0"
7682 spdx-license-ids "^3.0.0" 9137 spdx-license-ids "^3.0.0"
7683 9138
7684spdx-exceptions@^2.1.0: 9139spdx-exceptions@^2.1.0:
7685 version "2.1.0" 9140 version "2.2.0"
7686 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 9141 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
9142 integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
7687 9143
7688spdx-expression-parse@^3.0.0: 9144spdx-expression-parse@^3.0.0:
7689 version "3.0.0" 9145 version "3.0.0"
7690 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 9146 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
9147 integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
7691 dependencies: 9148 dependencies:
7692 spdx-exceptions "^2.1.0" 9149 spdx-exceptions "^2.1.0"
7693 spdx-license-ids "^3.0.0" 9150 spdx-license-ids "^3.0.0"
7694 9151
7695spdx-license-ids@^3.0.0: 9152spdx-license-ids@^3.0.0:
7696 version "3.0.1" 9153 version "3.0.2"
7697 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" 9154 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
9155 integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
7698 9156
7699spdy-transport@^2.0.18: 9157spdy-transport@^3.0.0:
7700 version "2.1.0" 9158 version "3.0.0"
7701 resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" 9159 resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
9160 integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
7702 dependencies: 9161 dependencies:
7703 debug "^2.6.8" 9162 debug "^4.1.0"
7704 detect-node "^2.0.3" 9163 detect-node "^2.0.4"
7705 hpack.js "^2.1.6" 9164 hpack.js "^2.1.6"
7706 obuf "^1.1.1" 9165 obuf "^1.1.2"
7707 readable-stream "^2.2.9" 9166 readable-stream "^3.0.6"
7708 safe-buffer "^5.0.1" 9167 wbuf "^1.7.3"
7709 wbuf "^1.7.2"
7710 9168
7711spdy@^3.4.1: 9169spdy@^4.0.0:
7712 version "3.4.7" 9170 version "4.0.0"
7713 resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" 9171 resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
9172 integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
7714 dependencies: 9173 dependencies:
7715 debug "^2.6.8" 9174 debug "^4.1.0"
7716 handle-thing "^1.2.5" 9175 handle-thing "^2.0.0"
7717 http-deceiver "^1.2.7" 9176 http-deceiver "^1.2.7"
7718 safe-buffer "^5.0.1"
7719 select-hose "^2.0.0" 9177 select-hose "^2.0.0"
7720 spdy-transport "^2.0.18" 9178 spdy-transport "^3.0.0"
9179
9180speed-measure-webpack-plugin@1.3.0:
9181 version "1.3.0"
9182 resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.0.tgz#c7ffafef513df3d63d5d546c8fc1986dfc4969aa"
9183 integrity sha512-b9Yd0TrzceMVYSbuamM1sFsGM1oVfyFTM22gOoyLhymNvBVApuYpkdFOgYkKJpN/KhTpcCYcTGHg7X+FJ33Vvw==
9184 dependencies:
9185 chalk "^2.0.1"
7721 9186
7722speedometer@^1.0.0: 9187speedometer@^1.0.0:
7723 version "1.1.0" 9188 version "1.1.0"
7724 resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.1.0.tgz#a30b13abda45687a1a76977012c060f2ac8a7934" 9189 resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.1.0.tgz#a30b13abda45687a1a76977012c060f2ac8a7934"
9190 integrity sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==
7725 9191
7726split-string@^3.0.1, split-string@^3.0.2: 9192split-string@^3.0.1, split-string@^3.0.2:
7727 version "3.1.0" 9193 version "3.1.0"
7728 resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 9194 resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
9195 integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
7729 dependencies: 9196 dependencies:
7730 extend-shallow "^3.0.0" 9197 extend-shallow "^3.0.0"
7731 9198
7732split@^1.0.0: 9199split@^1.0.0:
7733 version "1.0.1" 9200 version "1.0.1"
7734 resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 9201 resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
9202 integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
7735 dependencies: 9203 dependencies:
7736 through "2" 9204 through "2"
7737 9205
7738sprintf-js@^1.1.1: 9206sprintf-js@^1.1.1:
7739 version "1.1.1" 9207 version "1.1.1"
7740 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" 9208 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
9209 integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=
7741 9210
7742sprintf-js@~1.0.2: 9211sprintf-js@~1.0.2:
7743 version "1.0.3" 9212 version "1.0.3"
7744 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 9213 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
9214 integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
7745 9215
7746srcset@^1.0.0: 9216srcset@^1.0.0:
7747 version "1.0.0" 9217 version "1.0.0"
7748 resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef" 9218 resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef"
9219 integrity sha1-pWad4StC87HV6D7QPHEEb8SPQe8=
7749 dependencies: 9220 dependencies:
7750 array-uniq "^1.0.2" 9221 array-uniq "^1.0.2"
7751 number-is-nan "^1.0.0" 9222 number-is-nan "^1.0.0"
7752 9223
7753sshpk@^1.7.0: 9224sshpk@^1.7.0:
7754 version "1.14.2" 9225 version "1.15.2"
7755 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" 9226 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629"
9227 integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==
7756 dependencies: 9228 dependencies:
7757 asn1 "~0.2.3" 9229 asn1 "~0.2.3"
7758 assert-plus "^1.0.0" 9230 assert-plus "^1.0.0"
7759 dashdash "^1.12.0"
7760 getpass "^0.1.1"
7761 safer-buffer "^2.0.2"
7762 optionalDependencies:
7763 bcrypt-pbkdf "^1.0.0" 9231 bcrypt-pbkdf "^1.0.0"
9232 dashdash "^1.12.0"
7764 ecc-jsbn "~0.1.1" 9233 ecc-jsbn "~0.1.1"
9234 getpass "^0.1.1"
7765 jsbn "~0.1.0" 9235 jsbn "~0.1.0"
9236 safer-buffer "^2.0.2"
7766 tweetnacl "~0.14.0" 9237 tweetnacl "~0.14.0"
7767 9238
7768ssri@^5.2.4: 9239ssri@^5.2.4:
7769 version "5.3.0" 9240 version "5.3.0"
7770 resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" 9241 resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
9242 integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
7771 dependencies: 9243 dependencies:
7772 safe-buffer "^5.1.1" 9244 safe-buffer "^5.1.1"
7773 9245
7774ssri@^6.0.0: 9246ssri@^6.0.0, ssri@^6.0.1:
7775 version "6.0.1" 9247 version "6.0.1"
7776 resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" 9248 resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
9249 integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
7777 dependencies: 9250 dependencies:
7778 figgy-pudding "^3.5.1" 9251 figgy-pudding "^3.5.1"
7779 9252
7780stack-utils@^1.0.1: 9253stack-utils@^1.0.1:
7781 version "1.0.1" 9254 version "1.0.2"
7782 resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" 9255 resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
9256 integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
7783 9257
7784static-extend@^0.1.1: 9258static-extend@^0.1.1:
7785 version "0.1.2" 9259 version "0.1.2"
7786 resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 9260 resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
9261 integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
7787 dependencies: 9262 dependencies:
7788 define-property "^0.2.5" 9263 define-property "^0.2.5"
7789 object-copy "^0.1.0" 9264 object-copy "^0.1.0"
7790 9265
7791stats-webpack-plugin@^0.6.2: 9266stats-webpack-plugin@0.7.0:
7792 version "0.6.2" 9267 version "0.7.0"
7793 resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz#2c5949b531e07f87a88e6ea4dcfac53aa8c75a2b" 9268 resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06"
9269 integrity sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==
7794 dependencies: 9270 dependencies:
7795 lodash "^4.17.4" 9271 lodash "^4.17.4"
7796 9272
7797"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": 9273"statuses@>= 1.4.0 < 2":
7798 version "1.5.0" 9274 version "1.5.0"
7799 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 9275 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
9276 integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
7800 9277
7801statuses@~1.3.1: 9278statuses@~1.3.1:
7802 version "1.3.1" 9279 version "1.3.1"
7803 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 9280 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
9281 integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=
7804 9282
7805statuses@~1.4.0: 9283statuses@~1.4.0:
7806 version "1.4.0" 9284 version "1.4.0"
7807 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 9285 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
9286 integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
7808 9287
7809stdout-stream@^1.4.0: 9288stdout-stream@^1.4.0:
7810 version "1.4.1" 9289 version "1.4.1"
7811 resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" 9290 resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
9291 integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
7812 dependencies: 9292 dependencies:
7813 readable-stream "^2.0.1" 9293 readable-stream "^2.0.1"
7814 9294
7815stealthy-require@^1.1.0: 9295stealthy-require@^1.1.0:
7816 version "1.1.1" 9296 version "1.1.1"
7817 resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 9297 resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
9298 integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
7818 9299
7819stream-browserify@^2.0.1: 9300stream-browserify@^2.0.1:
7820 version "2.0.1" 9301 version "2.0.1"
7821 resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" 9302 resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
9303 integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=
7822 dependencies: 9304 dependencies:
7823 inherits "~2.0.1" 9305 inherits "~2.0.1"
7824 readable-stream "^2.0.2" 9306 readable-stream "^2.0.2"
@@ -7826,13 +9308,15 @@ stream-browserify@^2.0.1:
7826stream-each@^1.1.0: 9308stream-each@^1.1.0:
7827 version "1.2.3" 9309 version "1.2.3"
7828 resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" 9310 resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
9311 integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
7829 dependencies: 9312 dependencies:
7830 end-of-stream "^1.1.0" 9313 end-of-stream "^1.1.0"
7831 stream-shift "^1.0.0" 9314 stream-shift "^1.0.0"
7832 9315
7833stream-http@^2.7.2, stream-http@^2.8.3: 9316stream-http@^2.7.2:
7834 version "2.8.3" 9317 version "2.8.3"
7835 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" 9318 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
9319 integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
7836 dependencies: 9320 dependencies:
7837 builtin-status-codes "^3.0.0" 9321 builtin-status-codes "^3.0.0"
7838 inherits "^2.0.1" 9322 inherits "^2.0.1"
@@ -7840,31 +9324,46 @@ stream-http@^2.7.2, stream-http@^2.8.3:
7840 to-arraybuffer "^1.0.0" 9324 to-arraybuffer "^1.0.0"
7841 xtend "^4.0.0" 9325 xtend "^4.0.0"
7842 9326
9327stream-http@^3.0.0:
9328 version "3.0.0"
9329 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.0.0.tgz#bd6d3c52610098699e25eb2dfcd188e30e0d12e4"
9330 integrity sha512-JELJfd+btL9GHtxU3+XXhg9NLYrKFnhybfvRuDghtyVkOFydz3PKNT1df07AMr88qW03WHF+FSV0PySpXignCA==
9331 dependencies:
9332 builtin-status-codes "^3.0.0"
9333 inherits "^2.0.1"
9334 readable-stream "^3.0.6"
9335 xtend "^4.0.0"
9336
7843stream-shift@^1.0.0: 9337stream-shift@^1.0.0:
7844 version "1.0.0" 9338 version "1.0.0"
7845 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 9339 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
9340 integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
7846 9341
7847stream-to-blob-url@^2.0.0, stream-to-blob-url@^2.1.0: 9342stream-to-blob-url@^2.0.0, stream-to-blob-url@^2.1.0:
7848 version "2.1.1" 9343 version "2.1.1"
7849 resolved "https://registry.yarnpkg.com/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz#e1ac97f86ca8e9f512329a48e7830ce9a50beef2" 9344 resolved "https://registry.yarnpkg.com/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz#e1ac97f86ca8e9f512329a48e7830ce9a50beef2"
9345 integrity sha512-DKJPEmCmIZoBfGVle9IhSfERiWaN5cuOtmfPxP2dZbLDRZxkBWZ4QbYxEJOSALk1Kf+WjBgedAMO6qkkf7Lmrg==
7850 dependencies: 9346 dependencies:
7851 stream-to-blob "^1.0.0" 9347 stream-to-blob "^1.0.0"
7852 9348
7853stream-to-blob@^1.0.0: 9349stream-to-blob@^1.0.0:
7854 version "1.0.1" 9350 version "1.0.1"
7855 resolved "https://registry.yarnpkg.com/stream-to-blob/-/stream-to-blob-1.0.1.tgz#2dc1e09b71677a234d00445f8eb7ff70c4fe9948" 9351 resolved "https://registry.yarnpkg.com/stream-to-blob/-/stream-to-blob-1.0.1.tgz#2dc1e09b71677a234d00445f8eb7ff70c4fe9948"
9352 integrity sha512-aRy4neA4rf+qMtLT9fCRLPGWdrsIKtCx4kUdNTIPgPQ2hkHkdxbViVAvABMx9oRM6yCWfngHx6pwXfbYkVuPuw==
7856 dependencies: 9353 dependencies:
7857 once "^1.3.3" 9354 once "^1.3.3"
7858 9355
7859stream-with-known-length-to-buffer@^1.0.0: 9356stream-with-known-length-to-buffer@^1.0.0:
7860 version "1.0.2" 9357 version "1.0.2"
7861 resolved "https://registry.yarnpkg.com/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz#b8ea5a92086a1ed5d27fc4c529636682118c945b" 9358 resolved "https://registry.yarnpkg.com/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz#b8ea5a92086a1ed5d27fc4c529636682118c945b"
9359 integrity sha512-UxSISjxmguvfYzZdq6d4XAjc3gAocqTIOS1CjgwkDkkGT/LMTsIYiV8agIw42IHFFHf8k4lPOoroCCf4W9oqzg==
7862 dependencies: 9360 dependencies:
7863 once "^1.3.3" 9361 once "^1.3.3"
7864 9362
7865streamroller@0.7.0: 9363streamroller@0.7.0:
7866 version "0.7.0" 9364 version "0.7.0"
7867 resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" 9365 resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b"
9366 integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==
7868 dependencies: 9367 dependencies:
7869 date-format "^1.2.0" 9368 date-format "^1.2.0"
7870 debug "^3.1.0" 9369 debug "^3.1.0"
@@ -7874,6 +9373,7 @@ streamroller@0.7.0:
7874string-length@^2.0.0: 9373string-length@^2.0.0:
7875 version "2.0.0" 9374 version "2.0.0"
7876 resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" 9375 resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
9376 integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=
7877 dependencies: 9377 dependencies:
7878 astral-regex "^1.0.0" 9378 astral-regex "^1.0.0"
7879 strip-ansi "^4.0.0" 9379 strip-ansi "^4.0.0"
@@ -7881,6 +9381,7 @@ string-length@^2.0.0:
7881string-width@^1.0.1, string-width@^1.0.2: 9381string-width@^1.0.1, string-width@^1.0.2:
7882 version "1.0.2" 9382 version "1.0.2"
7883 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 9383 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
9384 integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
7884 dependencies: 9385 dependencies:
7885 code-point-at "^1.0.0" 9386 code-point-at "^1.0.0"
7886 is-fullwidth-code-point "^1.0.0" 9387 is-fullwidth-code-point "^1.0.0"
@@ -7889,6 +9390,7 @@ string-width@^1.0.1, string-width@^1.0.2:
7889"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: 9390"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
7890 version "2.1.1" 9391 version "2.1.1"
7891 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 9392 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
9393 integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
7892 dependencies: 9394 dependencies:
7893 is-fullwidth-code-point "^2.0.0" 9395 is-fullwidth-code-point "^2.0.0"
7894 strip-ansi "^4.0.0" 9396 strip-ansi "^4.0.0"
@@ -7896,74 +9398,101 @@ string-width@^1.0.1, string-width@^1.0.2:
7896string2compact@^1.1.1, string2compact@^1.2.5: 9398string2compact@^1.1.1, string2compact@^1.2.5:
7897 version "1.3.0" 9399 version "1.3.0"
7898 resolved "https://registry.yarnpkg.com/string2compact/-/string2compact-1.3.0.tgz#22d946127b082d1203c51316af60117a337423c3" 9400 resolved "https://registry.yarnpkg.com/string2compact/-/string2compact-1.3.0.tgz#22d946127b082d1203c51316af60117a337423c3"
9401 integrity sha512-004ulKKANDuQilQsNxy2lisrpMG0qUJxBU+2YCEF7KziRyNR0Nredm2qk0f1V82nva59H3y9GWeHXE63HzGRFw==
7899 dependencies: 9402 dependencies:
7900 addr-to-ip-port "^1.0.1" 9403 addr-to-ip-port "^1.0.1"
7901 ipaddr.js "^1.0.1" 9404 ipaddr.js "^1.0.1"
7902 9405
7903string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: 9406string_decoder@^1.0.0, string_decoder@^1.1.1:
7904 version "1.1.1" 9407 version "1.2.0"
7905 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 9408 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
9409 integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
7906 dependencies: 9410 dependencies:
7907 safe-buffer "~5.1.0" 9411 safe-buffer "~5.1.0"
7908 9412
7909string_decoder@~0.10.x: 9413string_decoder@~0.10.x:
7910 version "0.10.31" 9414 version "0.10.31"
7911 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 9415 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
9416 integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
9417
9418string_decoder@~1.1.1:
9419 version "1.1.1"
9420 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
9421 integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
9422 dependencies:
9423 safe-buffer "~5.1.0"
7912 9424
7913strip-ansi@^3.0.0, strip-ansi@^3.0.1: 9425strip-ansi@^3.0.0, strip-ansi@^3.0.1:
7914 version "3.0.1" 9426 version "3.0.1"
7915 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 9427 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
9428 integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
7916 dependencies: 9429 dependencies:
7917 ansi-regex "^2.0.0" 9430 ansi-regex "^2.0.0"
7918 9431
7919strip-ansi@^4.0.0: 9432strip-ansi@^4.0.0:
7920 version "4.0.0" 9433 version "4.0.0"
7921 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 9434 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
9435 integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
7922 dependencies: 9436 dependencies:
7923 ansi-regex "^3.0.0" 9437 ansi-regex "^3.0.0"
7924 9438
9439strip-ansi@^5.0.0:
9440 version "5.0.0"
9441 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f"
9442 integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==
9443 dependencies:
9444 ansi-regex "^4.0.0"
9445
7925strip-bom@3.0.0, strip-bom@^3.0.0: 9446strip-bom@3.0.0, strip-bom@^3.0.0:
7926 version "3.0.0" 9447 version "3.0.0"
7927 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 9448 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
9449 integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
7928 9450
7929strip-bom@^2.0.0: 9451strip-bom@^2.0.0:
7930 version "2.0.0" 9452 version "2.0.0"
7931 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 9453 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
9454 integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
7932 dependencies: 9455 dependencies:
7933 is-utf8 "^0.2.0" 9456 is-utf8 "^0.2.0"
7934 9457
7935strip-eof@^1.0.0: 9458strip-eof@^1.0.0:
7936 version "1.0.0" 9459 version "1.0.0"
7937 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 9460 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
9461 integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
7938 9462
7939strip-indent@^1.0.1: 9463strip-indent@^1.0.1:
7940 version "1.0.1" 9464 version "1.0.1"
7941 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 9465 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
9466 integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
7942 dependencies: 9467 dependencies:
7943 get-stdin "^4.0.1" 9468 get-stdin "^4.0.1"
7944 9469
7945strip-json-comments@~2.0.1: 9470strip-json-comments@~2.0.1:
7946 version "2.0.1" 9471 version "2.0.1"
7947 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 9472 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
9473 integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
7948 9474
7949style-loader@^0.21.0: 9475style-loader@0.23.1:
7950 version "0.21.0" 9476 version "0.23.1"
7951 resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" 9477 resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
9478 integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==
7952 dependencies: 9479 dependencies:
7953 loader-utils "^1.1.0" 9480 loader-utils "^1.1.0"
7954 schema-utils "^0.4.5" 9481 schema-utils "^1.0.0"
7955 9482
7956stylus-loader@^3.0.2: 9483stylus-loader@3.0.2:
7957 version "3.0.2" 9484 version "3.0.2"
7958 resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" 9485 resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
9486 integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==
7959 dependencies: 9487 dependencies:
7960 loader-utils "^1.0.2" 9488 loader-utils "^1.0.2"
7961 lodash.clonedeep "^4.5.0" 9489 lodash.clonedeep "^4.5.0"
7962 when "~3.6.x" 9490 when "~3.6.x"
7963 9491
7964stylus@^0.54.5: 9492stylus@0.54.5:
7965 version "0.54.5" 9493 version "0.54.5"
7966 resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" 9494 resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
9495 integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=
7967 dependencies: 9496 dependencies:
7968 css-parse "1.7.x" 9497 css-parse "1.7.x"
7969 debug "*" 9498 debug "*"
@@ -7975,54 +9504,84 @@ stylus@^0.54.5:
7975supports-color@^2.0.0: 9504supports-color@^2.0.0:
7976 version "2.0.0" 9505 version "2.0.0"
7977 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 9506 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
9507 integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
7978 9508
7979supports-color@^3.1.0, supports-color@^3.1.2: 9509supports-color@^3.1.2:
7980 version "3.2.3" 9510 version "3.2.3"
7981 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 9511 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
9512 integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
7982 dependencies: 9513 dependencies:
7983 has-flag "^1.0.0" 9514 has-flag "^1.0.0"
7984 9515
7985supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: 9516supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0:
7986 version "5.5.0" 9517 version "5.5.0"
7987 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 9518 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
9519 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
7988 dependencies: 9520 dependencies:
7989 has-flag "^3.0.0" 9521 has-flag "^3.0.0"
7990 9522
7991symbol-observable@^1.2.0: 9523supports-color@^6.1.0:
9524 version "6.1.0"
9525 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
9526 integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
9527 dependencies:
9528 has-flag "^3.0.0"
9529
9530symbol-observable@1.2.0:
7992 version "1.2.0" 9531 version "1.2.0"
7993 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 9532 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
9533 integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
7994 9534
7995symbol-tree@^3.2.2: 9535symbol-tree@^3.2.2:
7996 version "3.2.2" 9536 version "3.2.2"
7997 resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 9537 resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
9538 integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=
7998 9539
7999tapable@^1.0.0, tapable@^1.1.0: 9540tapable@^1.0.0, tapable@^1.1.0:
8000 version "1.1.0" 9541 version "1.1.1"
8001 resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" 9542 resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e"
9543 integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==
8002 9544
8003tar@^2.0.0: 9545tar@^2.0.0:
8004 version "2.2.1" 9546 version "2.2.1"
8005 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 9547 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
9548 integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=
8006 dependencies: 9549 dependencies:
8007 block-stream "*" 9550 block-stream "*"
8008 fstream "^1.0.2" 9551 fstream "^1.0.2"
8009 inherits "2" 9552 inherits "2"
8010 9553
8011tar@^4: 9554tar@^4, tar@^4.4.8:
8012 version "4.4.6" 9555 version "4.4.8"
8013 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 9556 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
9557 integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
8014 dependencies: 9558 dependencies:
8015 chownr "^1.0.1" 9559 chownr "^1.1.1"
8016 fs-minipass "^1.2.5" 9560 fs-minipass "^1.2.5"
8017 minipass "^2.3.3" 9561 minipass "^2.3.4"
8018 minizlib "^1.1.0" 9562 minizlib "^1.1.1"
8019 mkdirp "^0.5.0" 9563 mkdirp "^0.5.0"
8020 safe-buffer "^5.1.2" 9564 safe-buffer "^5.1.2"
8021 yallist "^3.0.2" 9565 yallist "^3.0.2"
8022 9566
9567terser-webpack-plugin@1.2.2:
9568 version "1.2.2"
9569 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz#9bff3a891ad614855a7dde0d707f7db5a927e3d9"
9570 integrity sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==
9571 dependencies:
9572 cacache "^11.0.2"
9573 find-cache-dir "^2.0.0"
9574 schema-utils "^1.0.0"
9575 serialize-javascript "^1.4.0"
9576 source-map "^0.6.1"
9577 terser "^3.16.1"
9578 webpack-sources "^1.1.0"
9579 worker-farm "^1.5.2"
9580
8023terser-webpack-plugin@^1.1.0: 9581terser-webpack-plugin@^1.1.0:
8024 version "1.1.0" 9582 version "1.1.0"
8025 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" 9583 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528"
9584 integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==
8026 dependencies: 9585 dependencies:
8027 cacache "^11.0.2" 9586 cacache "^11.0.2"
8028 find-cache-dir "^2.0.0" 9587 find-cache-dir "^2.0.0"
@@ -8033,9 +9592,19 @@ terser-webpack-plugin@^1.1.0:
8033 webpack-sources "^1.1.0" 9592 webpack-sources "^1.1.0"
8034 worker-farm "^1.5.2" 9593 worker-farm "^1.5.2"
8035 9594
9595terser@^3.16.1:
9596 version "3.16.1"
9597 resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493"
9598 integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==
9599 dependencies:
9600 commander "~2.17.1"
9601 source-map "~0.6.1"
9602 source-map-support "~0.5.9"
9603
8036terser@^3.8.1: 9604terser@^3.8.1:
8037 version "3.8.2" 9605 version "3.11.0"
8038 resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb" 9606 resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0"
9607 integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==
8039 dependencies: 9608 dependencies:
8040 commander "~2.17.1" 9609 commander "~2.17.1"
8041 source-map "~0.6.1" 9610 source-map "~0.6.1"
@@ -8044,6 +9613,7 @@ terser@^3.8.1:
8044test-exclude@^4.2.1: 9613test-exclude@^4.2.1:
8045 version "4.2.3" 9614 version "4.2.3"
8046 resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" 9615 resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
9616 integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==
8047 dependencies: 9617 dependencies:
8048 arrify "^1.0.1" 9618 arrify "^1.0.1"
8049 micromatch "^2.3.11" 9619 micromatch "^2.3.11"
@@ -8054,73 +9624,88 @@ test-exclude@^4.2.1:
8054thirty-two@^1.0.1: 9624thirty-two@^1.0.1:
8055 version "1.0.2" 9625 version "1.0.2"
8056 resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" 9626 resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a"
9627 integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno=
8057 9628
8058throat@^4.0.0: 9629throat@^4.0.0:
8059 version "4.1.0" 9630 version "4.1.0"
8060 resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" 9631 resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
9632 integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
8061 9633
8062through2@^2.0.0: 9634through2@^2.0.0:
8063 version "2.0.3" 9635 version "2.0.5"
8064 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 9636 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
9637 integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
8065 dependencies: 9638 dependencies:
8066 readable-stream "^2.1.5" 9639 readable-stream "~2.3.6"
8067 xtend "~4.0.1" 9640 xtend "~4.0.1"
8068 9641
8069through@2, through@X.X.X, through@^2.3.6, through@~2.3.6: 9642through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.6, through@~2.3.6:
8070 version "2.3.8" 9643 version "2.3.8"
8071 resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 9644 resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
9645 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
8072 9646
8073thunky@^1.0.1, thunky@^1.0.2: 9647thunky@^1.0.1, thunky@^1.0.2:
8074 version "1.0.2" 9648 version "1.0.3"
8075 resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" 9649 resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
9650 integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
8076 9651
8077timers-browserify@^2.0.4: 9652timers-browserify@^2.0.4:
8078 version "2.0.10" 9653 version "2.0.10"
8079 resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" 9654 resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
9655 integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==
8080 dependencies: 9656 dependencies:
8081 setimmediate "^1.0.4" 9657 setimmediate "^1.0.4"
8082 9658
8083tmp@0.0.30: 9659tmp@0.0.30:
8084 version "0.0.30" 9660 version "0.0.30"
8085 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" 9661 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed"
9662 integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=
8086 dependencies: 9663 dependencies:
8087 os-tmpdir "~1.0.1" 9664 os-tmpdir "~1.0.1"
8088 9665
8089tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: 9666tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33:
8090 version "0.0.33" 9667 version "0.0.33"
8091 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 9668 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
9669 integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
8092 dependencies: 9670 dependencies:
8093 os-tmpdir "~1.0.2" 9671 os-tmpdir "~1.0.2"
8094 9672
8095tmpl@1.0.x: 9673tmpl@1.0.x:
8096 version "1.0.4" 9674 version "1.0.4"
8097 resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" 9675 resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
9676 integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
8098 9677
8099to-array@0.1.4: 9678to-array@0.1.4:
8100 version "0.1.4" 9679 version "0.1.4"
8101 resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 9680 resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
9681 integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
8102 9682
8103to-arraybuffer@^1.0.0, to-arraybuffer@^1.0.1: 9683to-arraybuffer@^1.0.0, to-arraybuffer@^1.0.1:
8104 version "1.0.1" 9684 version "1.0.1"
8105 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 9685 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
9686 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
8106 9687
8107to-fast-properties@^1.0.3: 9688to-fast-properties@^1.0.3:
8108 version "1.0.3" 9689 version "1.0.3"
8109 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 9690 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
9691 integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
8110 9692
8111to-fast-properties@^2.0.0: 9693to-fast-properties@^2.0.0:
8112 version "2.0.0" 9694 version "2.0.0"
8113 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 9695 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
9696 integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
8114 9697
8115to-object-path@^0.3.0: 9698to-object-path@^0.3.0:
8116 version "0.3.0" 9699 version "0.3.0"
8117 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 9700 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
9701 integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
8118 dependencies: 9702 dependencies:
8119 kind-of "^3.0.2" 9703 kind-of "^3.0.2"
8120 9704
8121to-regex-range@^2.1.0: 9705to-regex-range@^2.1.0:
8122 version "2.1.1" 9706 version "2.1.1"
8123 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 9707 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
9708 integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
8124 dependencies: 9709 dependencies:
8125 is-number "^3.0.0" 9710 is-number "^3.0.0"
8126 repeat-string "^1.6.1" 9711 repeat-string "^1.6.1"
@@ -8128,6 +9713,7 @@ to-regex-range@^2.1.0:
8128to-regex@^3.0.1, to-regex@^3.0.2: 9713to-regex@^3.0.1, to-regex@^3.0.2:
8129 version "3.0.2" 9714 version "3.0.2"
8130 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 9715 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
9716 integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
8131 dependencies: 9717 dependencies:
8132 define-property "^2.0.2" 9718 define-property "^2.0.2"
8133 extend-shallow "^3.0.2" 9719 extend-shallow "^3.0.2"
@@ -8137,10 +9723,12 @@ to-regex@^3.0.1, to-regex@^3.0.2:
8137toposort@^1.0.0: 9723toposort@^1.0.0:
8138 version "1.0.7" 9724 version "1.0.7"
8139 resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" 9725 resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
9726 integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
8140 9727
8141torrent-discovery@^9.1.1: 9728torrent-discovery@^9.1.1:
8142 version "9.1.1" 9729 version "9.1.1"
8143 resolved "https://registry.yarnpkg.com/torrent-discovery/-/torrent-discovery-9.1.1.tgz#56704e6747b24fe00dbb75b442d202051f78d37d" 9730 resolved "https://registry.yarnpkg.com/torrent-discovery/-/torrent-discovery-9.1.1.tgz#56704e6747b24fe00dbb75b442d202051f78d37d"
9731 integrity sha512-3mHf+bxVCVLrlkPJdAoMbPMY1hpTZVeWw5hNc2pPFm+HCc2DS0HgVFTBTSWtB8vQPWA1hSEZpqJ+3QfdXxDE1g==
8144 dependencies: 9732 dependencies:
8145 bittorrent-dht "^9.0.0" 9733 bittorrent-dht "^9.0.0"
8146 bittorrent-tracker "^9.0.0" 9734 bittorrent-tracker "^9.0.0"
@@ -8150,55 +9738,67 @@ torrent-discovery@^9.1.1:
8150torrent-piece@^2.0.0: 9738torrent-piece@^2.0.0:
8151 version "2.0.0" 9739 version "2.0.0"
8152 resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz#6598ae67d93699e887f178db267ba16d89d7ec9b" 9740 resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz#6598ae67d93699e887f178db267ba16d89d7ec9b"
9741 integrity sha512-H/Z/yCuvZJj1vl1IQHI8dvF2QrUuXRJoptT5DW5967/dsLpXlCg+uyhFR5lfNj5mNaYePUbKtnL+qKWZGXv4Nw==
8153 9742
8154tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: 9743tough-cookie@>=2.3.3, tough-cookie@^2.3.4:
9744 version "2.5.0"
9745 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
9746 integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
9747 dependencies:
9748 psl "^1.1.28"
9749 punycode "^2.1.1"
9750
9751tough-cookie@~2.4.3:
8155 version "2.4.3" 9752 version "2.4.3"
8156 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 9753 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
9754 integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
8157 dependencies: 9755 dependencies:
8158 psl "^1.1.24" 9756 psl "^1.1.24"
8159 punycode "^1.4.1" 9757 punycode "^1.4.1"
8160 9758
8161tough-cookie@~2.3.3:
8162 version "2.3.4"
8163 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
8164 dependencies:
8165 punycode "^1.4.1"
8166
8167tr46@^1.0.1: 9759tr46@^1.0.1:
8168 version "1.0.1" 9760 version "1.0.1"
8169 resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 9761 resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
9762 integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
8170 dependencies: 9763 dependencies:
8171 punycode "^2.1.0" 9764 punycode "^2.1.0"
8172 9765
8173tree-kill@^1.0.0, tree-kill@^1.2.0: 9766tree-kill@1.2.1:
8174 version "1.2.0" 9767 version "1.2.1"
8175 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" 9768 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
9769 integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
8176 9770
8177trim-newlines@^1.0.0: 9771trim-newlines@^1.0.0:
8178 version "1.0.0" 9772 version "1.0.0"
8179 resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 9773 resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
9774 integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
8180 9775
8181trim-right@^1.0.1: 9776trim-right@^1.0.1:
8182 version "1.0.1" 9777 version "1.0.1"
8183 resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 9778 resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
9779 integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
8184 9780
8185trim@0.0.1: 9781trim@0.0.1:
8186 version "0.0.1" 9782 version "0.0.1"
8187 resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" 9783 resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
9784 integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
8188 9785
8189"true-case-path@^1.0.2": 9786"true-case-path@^1.0.2":
8190 version "1.0.3" 9787 version "1.0.3"
8191 resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" 9788 resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
9789 integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
8192 dependencies: 9790 dependencies:
8193 glob "^7.1.2" 9791 glob "^7.1.2"
8194 9792
8195tryer@^1.0.0: 9793tryer@^1.0.0:
8196 version "1.0.1" 9794 version "1.0.1"
8197 resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" 9795 resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
9796 integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
8198 9797
8199ts-jest@^23.1.4: 9798ts-jest@^23.1.4:
8200 version "23.10.0" 9799 version "23.10.5"
8201 resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.0.tgz#1b1ce1d795791dedf0229b7577b35eaed8565bbd" 9800 resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5"
9801 integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==
8202 dependencies: 9802 dependencies:
8203 bs-logger "0.x" 9803 bs-logger "0.x"
8204 buffer-from "1.x" 9804 buffer-from "1.x"
@@ -8206,45 +9806,41 @@ ts-jest@^23.1.4:
8206 json5 "2.x" 9806 json5 "2.x"
8207 make-error "1.x" 9807 make-error "1.x"
8208 mkdirp "0.x" 9808 mkdirp "0.x"
8209 semver "5.x" 9809 resolve "1.x"
9810 semver "^5.5"
8210 yargs-parser "10.x" 9811 yargs-parser "10.x"
8211 9812
8212ts-jest@~23.1.3: 9813ts-jest@~23.1.3:
8213 version "23.1.4" 9814 version "23.1.4"
8214 resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.4.tgz#66ac1d8d3fbf8f9a98432b11aa377aa850664b2b" 9815 resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.4.tgz#66ac1d8d3fbf8f9a98432b11aa377aa850664b2b"
9816 integrity sha512-9rCSxbWfoZxxeXnSoEIzRNr9hDIQ8iEJAWmSRsWhDHDT8OeuGfURhJQUE8jtJlkyEygs6rngH8RYtHz9cfjmEA==
8215 dependencies: 9817 dependencies:
8216 closest-file-data "^0.1.4" 9818 closest-file-data "^0.1.4"
8217 fs-extra "6.0.1" 9819 fs-extra "6.0.1"
8218 json5 "^0.5.0" 9820 json5 "^0.5.0"
8219 lodash "^4.17.10" 9821 lodash "^4.17.10"
8220 9822
8221tsickle@^0.32.1:
8222 version "0.32.1"
8223 resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.32.1.tgz#f16e94ba80b32fc9ebe320dc94fbc2ca7f3521a5"
8224 dependencies:
8225 jasmine-diff "^0.1.3"
8226 minimist "^1.2.0"
8227 mkdirp "^0.5.1"
8228 source-map "^0.6.0"
8229 source-map-support "^0.5.0"
8230
8231tslib@1.9.0: 9823tslib@1.9.0:
8232 version "1.9.0" 9824 version "1.9.0"
8233 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 9825 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
9826 integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
8234 9827
8235tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@~1.9.0: 9828tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@~1.9.0:
8236 version "1.9.3" 9829 version "1.9.3"
8237 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 9830 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
9831 integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
8238 9832
8239tslint-config-standard@^8.0.1: 9833tslint-config-standard@^8.0.1:
8240 version "8.0.1" 9834 version "8.0.1"
8241 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4" 9835 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4"
9836 integrity sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==
8242 dependencies: 9837 dependencies:
8243 tslint-eslint-rules "^5.3.1" 9838 tslint-eslint-rules "^5.3.1"
8244 9839
8245tslint-eslint-rules@^5.3.1: 9840tslint-eslint-rules@^5.3.1:
8246 version "5.4.0" 9841 version "5.4.0"
8247 resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" 9842 resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5"
9843 integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==
8248 dependencies: 9844 dependencies:
8249 doctrine "0.7.2" 9845 doctrine "0.7.2"
8250 tslib "1.9.0" 9846 tslib "1.9.0"
@@ -8253,6 +9849,7 @@ tslint-eslint-rules@^5.3.1:
8253tslint@^5.7.0: 9849tslint@^5.7.0:
8254 version "5.11.0" 9850 version "5.11.0"
8255 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 9851 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
9852 integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0=
8256 dependencies: 9853 dependencies:
8257 babel-code-frame "^6.22.0" 9854 babel-code-frame "^6.22.0"
8258 builtin-modules "^1.1.1" 9855 builtin-modules "^1.1.1"
@@ -8270,42 +9867,50 @@ tslint@^5.7.0:
8270tsml@1.0.1: 9867tsml@1.0.1:
8271 version "1.0.1" 9868 version "1.0.1"
8272 resolved "https://registry.yarnpkg.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3" 9869 resolved "https://registry.yarnpkg.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3"
9870 integrity sha1-ifghi52eJX9H1/a1bQHFpNLGj8M=
8273 9871
8274tsutils@^2.27.2: 9872tsutils@^2.27.2:
8275 version "2.29.0" 9873 version "2.29.0"
8276 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 9874 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
9875 integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
8277 dependencies: 9876 dependencies:
8278 tslib "^1.8.1" 9877 tslib "^1.8.1"
8279 9878
8280tsutils@^3.0.0: 9879tsutils@^3.0.0:
8281 version "3.0.0" 9880 version "3.5.2"
8282 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.0.0.tgz#0c5070a17a0503e056da038c48b5a1870a50a9ad" 9881 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.2.tgz#6fd3c2d5a731e83bb21b070a173ec0faf3a8f6d3"
9882 integrity sha512-qIlklNuI/1Dzfm+G+kJV5gg3gimZIX5haYtIVQe7qGyKd7eu8T1t1DY6pz4Sc2CGXAj9s1izycctm9Zfl9sRuQ==
8283 dependencies: 9883 dependencies:
8284 tslib "^1.8.1" 9884 tslib "^1.8.1"
8285 9885
8286tty-browserify@0.0.0: 9886tty-browserify@0.0.0:
8287 version "0.0.0" 9887 version "0.0.0"
8288 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 9888 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
9889 integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
8289 9890
8290tunnel-agent@^0.6.0: 9891tunnel-agent@^0.6.0:
8291 version "0.6.0" 9892 version "0.6.0"
8292 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 9893 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
9894 integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
8293 dependencies: 9895 dependencies:
8294 safe-buffer "^5.0.1" 9896 safe-buffer "^5.0.1"
8295 9897
8296tweetnacl@^0.14.3, tweetnacl@~0.14.0: 9898tweetnacl@^0.14.3, tweetnacl@~0.14.0:
8297 version "0.14.5" 9899 version "0.14.5"
8298 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 9900 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
9901 integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
8299 9902
8300type-check@~0.3.2: 9903type-check@~0.3.2:
8301 version "0.3.2" 9904 version "0.3.2"
8302 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 9905 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
9906 integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
8303 dependencies: 9907 dependencies:
8304 prelude-ls "~1.1.2" 9908 prelude-ls "~1.1.2"
8305 9909
8306type-is@~1.6.15, type-is@~1.6.16: 9910type-is@~1.6.16:
8307 version "1.6.16" 9911 version "1.6.16"
8308 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 9912 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
9913 integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==
8309 dependencies: 9914 dependencies:
8310 media-typer "0.3.0" 9915 media-typer "0.3.0"
8311 mime-types "~2.1.18" 9916 mime-types "~2.1.18"
@@ -8313,61 +9918,54 @@ type-is@~1.6.15, type-is@~1.6.16:
8313typedarray-to-buffer@^3.0.0: 9918typedarray-to-buffer@^3.0.0:
8314 version "3.1.5" 9919 version "3.1.5"
8315 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 9920 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
9921 integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
8316 dependencies: 9922 dependencies:
8317 is-typedarray "^1.0.0" 9923 is-typedarray "^1.0.0"
8318 9924
8319typedarray@^0.0.6: 9925typedarray@^0.0.6:
8320 version "0.0.6" 9926 version "0.0.6"
8321 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 9927 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
9928 integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
8322 9929
8323typescript@2.9, "typescript@>=2.6.2 <2.10", typescript@~2.9.2: 9930typescript@3.1.6:
8324 version "2.9.2" 9931 version "3.1.6"
8325 resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" 9932 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68"
9933 integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==
9934
9935typescript@3.2.4:
9936 version "3.2.4"
9937 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d"
9938 integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==
8326 9939
8327uc.micro@^1.0.1, uc.micro@^1.0.5: 9940uc.micro@^1.0.1, uc.micro@^1.0.5:
8328 version "1.0.5" 9941 version "1.0.5"
8329 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" 9942 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
8330 9943 integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==
8331uglify-es@^3.3.4:
8332 version "3.3.9"
8333 resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
8334 dependencies:
8335 commander "~2.13.0"
8336 source-map "~0.6.1"
8337 9944
8338uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4: 9945uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4:
8339 version "3.4.9" 9946 version "3.4.9"
8340 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" 9947 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
9948 integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==
8341 dependencies: 9949 dependencies:
8342 commander "~2.17.1" 9950 commander "~2.17.1"
8343 source-map "~0.6.1" 9951 source-map "~0.6.1"
8344 9952
8345uglifyjs-webpack-plugin@^1.2.4, uglifyjs-webpack-plugin@^1.2.5:
8346 version "1.3.0"
8347 resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
8348 dependencies:
8349 cacache "^10.0.4"
8350 find-cache-dir "^1.0.0"
8351 schema-utils "^0.4.5"
8352 serialize-javascript "^1.4.0"
8353 source-map "^0.6.1"
8354 uglify-es "^3.3.4"
8355 webpack-sources "^1.1.0"
8356 worker-farm "^1.5.2"
8357
8358uint64be@^2.0.2: 9953uint64be@^2.0.2:
8359 version "2.0.2" 9954 version "2.0.2"
8360 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5" 9955 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5"
9956 integrity sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==
8361 dependencies: 9957 dependencies:
8362 buffer-alloc "^1.1.0" 9958 buffer-alloc "^1.1.0"
8363 9959
8364ultron@~1.1.0: 9960ultron@~1.1.0:
8365 version "1.1.1" 9961 version "1.1.1"
8366 resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" 9962 resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
9963 integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
8367 9964
8368union-value@^1.0.0: 9965union-value@^1.0.0:
8369 version "1.0.0" 9966 version "1.0.0"
8370 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 9967 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
9968 integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
8371 dependencies: 9969 dependencies:
8372 arr-union "^3.1.0" 9970 arr-union "^3.1.0"
8373 get-value "^2.0.6" 9971 get-value "^2.0.6"
@@ -8377,34 +9975,41 @@ union-value@^1.0.0:
8377uniq@^1.0.1: 9975uniq@^1.0.1:
8378 version "1.0.1" 9976 version "1.0.1"
8379 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 9977 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
9978 integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
8380 9979
8381unique-filename@^1.1.0: 9980unique-filename@^1.1.0, unique-filename@^1.1.1:
8382 version "1.1.0" 9981 version "1.1.1"
8383 resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" 9982 resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
9983 integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
8384 dependencies: 9984 dependencies:
8385 unique-slug "^2.0.0" 9985 unique-slug "^2.0.0"
8386 9986
8387unique-slug@^2.0.0: 9987unique-slug@^2.0.0:
8388 version "2.0.0" 9988 version "2.0.1"
8389 resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" 9989 resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6"
9990 integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==
8390 dependencies: 9991 dependencies:
8391 imurmurhash "^0.1.4" 9992 imurmurhash "^0.1.4"
8392 9993
8393universalify@^0.1.0: 9994universalify@^0.1.0:
8394 version "0.1.2" 9995 version "0.1.2"
8395 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 9996 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
9997 integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
8396 9998
8397unordered-array-remove@^1.0.2: 9999unordered-array-remove@^1.0.2:
8398 version "1.0.2" 10000 version "1.0.2"
8399 resolved "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz#c546e8f88e317a0cf2644c97ecb57dba66d250ef" 10001 resolved "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz#c546e8f88e317a0cf2644c97ecb57dba66d250ef"
10002 integrity sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=
8400 10003
8401unpipe@1.0.0, unpipe@~1.0.0: 10004unpipe@1.0.0, unpipe@~1.0.0:
8402 version "1.0.0" 10005 version "1.0.0"
8403 resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 10006 resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
10007 integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
8404 10008
8405unset-value@^1.0.0: 10009unset-value@^1.0.0:
8406 version "1.0.0" 10010 version "1.0.0"
8407 resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 10011 resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
10012 integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
8408 dependencies: 10013 dependencies:
8409 has-value "^0.3.1" 10014 has-value "^0.3.1"
8410 isobject "^3.0.0" 10015 isobject "^3.0.0"
@@ -8412,53 +10017,42 @@ unset-value@^1.0.0:
8412upath@^1.0.5: 10017upath@^1.0.5:
8413 version "1.1.0" 10018 version "1.1.0"
8414 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" 10019 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
10020 integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==
8415 10021
8416upper-case@^1.1.1: 10022upper-case@^1.1.1:
8417 version "1.1.3" 10023 version "1.1.3"
8418 resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" 10024 resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
8419 10025 integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
8420uri-js@^3.0.2:
8421 version "3.0.2"
8422 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa"
8423 dependencies:
8424 punycode "^2.1.0"
8425 10026
8426uri-js@^4.2.2: 10027uri-js@^4.2.2:
8427 version "4.2.2" 10028 version "4.2.2"
8428 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 10029 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
10030 integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
8429 dependencies: 10031 dependencies:
8430 punycode "^2.1.0" 10032 punycode "^2.1.0"
8431 10033
8432urix@^0.1.0: 10034urix@^0.1.0:
8433 version "0.1.0" 10035 version "0.1.0"
8434 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 10036 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
10037 integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
8435 10038
8436url-join@^4.0.0: 10039url-parse@^1.4.3:
8437 version "4.0.0" 10040 version "1.4.4"
8438 resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" 10041 resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8"
8439 10042 integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==
8440url-loader@^1.0.1:
8441 version "1.1.1"
8442 resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1"
8443 dependencies:
8444 loader-utils "^1.1.0"
8445 mime "^2.0.3"
8446 schema-utils "^1.0.0"
8447
8448url-parse@^1.1.8, url-parse@^1.4.3:
8449 version "1.4.3"
8450 resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15"
8451 dependencies: 10043 dependencies:
8452 querystringify "^2.0.0" 10044 querystringify "^2.0.0"
8453 requires-port "^1.0.0" 10045 requires-port "^1.0.0"
8454 10046
8455url-toolkit@^2.1.1, url-toolkit@^2.1.3: 10047url-toolkit@^2.1.1, url-toolkit@^2.1.3, url-toolkit@^2.1.6:
8456 version "2.1.6" 10048 version "2.1.6"
8457 resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" 10049 resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2"
10050 integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw==
8458 10051
8459url@^0.11.0: 10052url@^0.11.0:
8460 version "0.11.0" 10053 version "0.11.0"
8461 resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 10054 resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
10055 integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
8462 dependencies: 10056 dependencies:
8463 punycode "1.3.2" 10057 punycode "1.3.2"
8464 querystring "0.2.0" 10058 querystring "0.2.0"
@@ -8466,17 +10060,20 @@ url@^0.11.0:
8466use@^3.1.0: 10060use@^3.1.0:
8467 version "3.1.1" 10061 version "3.1.1"
8468 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 10062 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
10063 integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
8469 10064
8470useragent@2.2.1: 10065useragent@2.3.0:
8471 version "2.2.1" 10066 version "2.3.0"
8472 resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" 10067 resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
10068 integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==
8473 dependencies: 10069 dependencies:
8474 lru-cache "2.2.x" 10070 lru-cache "4.1.x"
8475 tmp "0.0.x" 10071 tmp "0.0.x"
8476 10072
8477ut_metadata@^3.3.0: 10073ut_metadata@^3.3.0:
8478 version "3.3.0" 10074 version "3.3.0"
8479 resolved "https://registry.yarnpkg.com/ut_metadata/-/ut_metadata-3.3.0.tgz#a0e0e861ebc39ed96e506601d1463ade3b548a7e" 10075 resolved "https://registry.yarnpkg.com/ut_metadata/-/ut_metadata-3.3.0.tgz#a0e0e861ebc39ed96e506601d1463ade3b548a7e"
10076 integrity sha512-IK+ke9yL6a4oPLz/3oSW9TW7m9Wr4RG+5kW5aS2YulzEU1QDGAtago/NnOlno91fo3fSO7mnsqzn3NXNXdv8nA==
8480 dependencies: 10077 dependencies:
8481 bencode "^2.0.0" 10078 bencode "^2.0.0"
8482 bitfield "^2.0.0" 10079 bitfield "^2.0.0"
@@ -8486,6 +10083,7 @@ ut_metadata@^3.3.0:
8486ut_pex@^1.1.1: 10083ut_pex@^1.1.1:
8487 version "1.2.1" 10084 version "1.2.1"
8488 resolved "https://registry.yarnpkg.com/ut_pex/-/ut_pex-1.2.1.tgz#472ed0ea5e9bbc9148b833339d56d7b17cf3dad0" 10085 resolved "https://registry.yarnpkg.com/ut_pex/-/ut_pex-1.2.1.tgz#472ed0ea5e9bbc9148b833339d56d7b17cf3dad0"
10086 integrity sha512-ZrxMCbffYtxQDqvREN9kBXK2CB9tPnd5PylHoqQX9ai+3HV9/S39FnA5JnhLOC82dxIQQg0nTN2wmhtAdGNtOA==
8489 dependencies: 10087 dependencies:
8490 bencode "^2.0.0" 10088 bencode "^2.0.0"
8491 compact2string "^1.2.0" 10089 compact2string "^1.2.0"
@@ -8495,16 +10093,19 @@ ut_pex@^1.1.1:
8495utf-8-validate@^5.0.1: 10093utf-8-validate@^5.0.1:
8496 version "5.0.1" 10094 version "5.0.1"
8497 resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.1.tgz#cef1f9011ba4b216f4d7c6ddf5189d750599ff8b" 10095 resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.1.tgz#cef1f9011ba4b216f4d7c6ddf5189d750599ff8b"
10096 integrity sha512-Qef1AuiWWxQeZ1Oa4DTV3ArRafpZvsK+CLrlB8khLfsV+9mwhj58hNSGmel0ns5jYP+3yEwav6vxxW7Gz85bVw==
8498 dependencies: 10097 dependencies:
8499 node-gyp-build "~3.4.0" 10098 node-gyp-build "~3.4.0"
8500 10099
8501util-deprecate@^1.0.1, util-deprecate@~1.0.1: 10100util-deprecate@^1.0.1, util-deprecate@~1.0.1:
8502 version "1.0.2" 10101 version "1.0.2"
8503 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 10102 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
10103 integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
8504 10104
8505util.promisify@1.0.0, util.promisify@^1.0.0: 10105util.promisify@1.0.0, util.promisify@^1.0.0:
8506 version "1.0.0" 10106 version "1.0.0"
8507 resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" 10107 resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
10108 integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
8508 dependencies: 10109 dependencies:
8509 define-properties "^1.1.2" 10110 define-properties "^1.1.2"
8510 object.getownpropertydescriptors "^2.0.3" 10111 object.getownpropertydescriptors "^2.0.3"
@@ -8512,38 +10113,41 @@ util.promisify@1.0.0, util.promisify@^1.0.0:
8512util@0.10.3: 10113util@0.10.3:
8513 version "0.10.3" 10114 version "0.10.3"
8514 resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 10115 resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
10116 integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
8515 dependencies: 10117 dependencies:
8516 inherits "2.0.1" 10118 inherits "2.0.1"
8517 10119
8518util@^0.10.3: 10120util@^0.10.3:
8519 version "0.10.4" 10121 version "0.10.4"
8520 resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 10122 resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
10123 integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
8521 dependencies: 10124 dependencies:
8522 inherits "2.0.3" 10125 inherits "2.0.3"
8523 10126
8524utila@~0.3: 10127utila@^0.4.0, utila@~0.4:
8525 version "0.3.3"
8526 resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
8527
8528utila@~0.4:
8529 version "0.4.0" 10128 version "0.4.0"
8530 resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" 10129 resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
10130 integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
8531 10131
8532utils-merge@1.0.1: 10132utils-merge@1.0.1:
8533 version "1.0.1" 10133 version "1.0.1"
8534 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 10134 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
10135 integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
8535 10136
8536uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: 10137uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2:
8537 version "3.3.2" 10138 version "3.3.2"
8538 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 10139 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
10140 integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
8539 10141
8540v8-compile-cache@^2.0.0: 10142v8-compile-cache@^2.0.2:
8541 version "2.0.2" 10143 version "2.0.2"
8542 resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" 10144 resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c"
10145 integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==
8543 10146
8544validate-npm-package-license@^3.0.1: 10147validate-npm-package-license@^3.0.1:
8545 version "3.0.4" 10148 version "3.0.4"
8546 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 10149 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
10150 integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
8547 dependencies: 10151 dependencies:
8548 spdx-correct "^3.0.0" 10152 spdx-correct "^3.0.0"
8549 spdx-expression-parse "^3.0.0" 10153 spdx-expression-parse "^3.0.0"
@@ -8551,37 +10155,50 @@ validate-npm-package-license@^3.0.1:
8551validate-npm-package-name@^3.0.0: 10155validate-npm-package-name@^3.0.0:
8552 version "3.0.0" 10156 version "3.0.0"
8553 resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" 10157 resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
10158 integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
8554 dependencies: 10159 dependencies:
8555 builtins "^1.0.3" 10160 builtins "^1.0.3"
8556 10161
8557vary@~1.1.2: 10162vary@~1.1.2:
8558 version "1.1.2" 10163 version "1.1.2"
8559 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 10164 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
10165 integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
8560 10166
8561verror@1.10.0: 10167verror@1.10.0:
8562 version "1.10.0" 10168 version "1.10.0"
8563 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 10169 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
10170 integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
8564 dependencies: 10171 dependencies:
8565 assert-plus "^1.0.0" 10172 assert-plus "^1.0.0"
8566 core-util-is "1.0.2" 10173 core-util-is "1.0.2"
8567 extsprintf "^1.2.0" 10174 extsprintf "^1.2.0"
8568 10175
8569"video.js@^6 || ^7", "video.js@^6.8.0 || ^7.0.0", video.js@^7: 10176"video.js@^6 || ^7", "video.js@^6.8.0 || ^7.0.0", video.js@^7:
8570 version "7.2.2" 10177 version "7.3.0"
8571 resolved "https://registry.yarnpkg.com/video.js/-/video.js-7.2.2.tgz#4a1197b2f0c265a1e50d5cd4ff41cd030e22a423" 10178 resolved "https://registry.yarnpkg.com/video.js/-/video.js-7.3.0.tgz#780de68a163b4ee16dfcacd78971680f18c9a68d"
10179 integrity sha512-yJX8QlTIEpo2YN9G1RpKqIlLS9jqg8NNNN+IK2Z6vHhM6QUBzmaDFEr+BYGnvx8p7X90/SjRH1RHTPvKhghNUw==
8572 dependencies: 10180 dependencies:
8573 "@videojs/http-streaming" "1.2.4" 10181 "@babel/runtime" "^7.0.0"
8574 babel-runtime "^6.9.2" 10182 "@videojs/http-streaming" "1.4.1"
8575 global "4.3.2" 10183 global "4.3.2"
8576 safe-json-parse "4.0.0" 10184 safe-json-parse "4.0.0"
8577 tsml "1.0.1" 10185 tsml "1.0.1"
8578 videojs-font "3.0.0" 10186 videojs-font "3.1.0"
8579 videojs-vtt.js "0.14.1" 10187 videojs-vtt.js "0.14.1"
8580 xhr "2.4.0" 10188 xhr "2.4.0"
8581 10189
8582videojs-contextmenu-ui@^5.0.0: 10190videojs-contextmenu-ui@^5.0.0:
8583 version "5.0.0" 10191 version "5.1.0"
8584 resolved "https://registry.yarnpkg.com/videojs-contextmenu-ui/-/videojs-contextmenu-ui-5.0.0.tgz#6943527c9b3993f3fb83867c0d0348bcd58c924c" 10192 resolved "https://registry.yarnpkg.com/videojs-contextmenu-ui/-/videojs-contextmenu-ui-5.1.0.tgz#60834d94ce590a8dc3a31d82a301fd394379034a"
10193 integrity sha512-pDRPh+SJBnrCG7Q95JogbPRtfODMcteJ3lubEZmLkpMu1G0Nlw2igdBcHVH4HZ/ZaM+cX+EBPVl8kz6TEtZKTw==
10194 dependencies:
10195 global "^4.3.2"
10196 video.js "^6 || ^7"
10197
10198videojs-contrib-quality-levels@^2.0.9:
10199 version "2.0.9"
10200 resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.0.9.tgz#b5d533d5092a6fc7d29eae1b43e4597d89bd527b"
10201 integrity sha512-HJeaJJQdSufi9Y5T7jlyyhkeq+mWPCog86q6ypoTi66boBMMJTo2abiOSHS9KaOGAJjH72gfvrjVY5FRdjlxYA==
8585 dependencies: 10202 dependencies:
8586 global "^4.3.2" 10203 global "^4.3.2"
8587 video.js "^6 || ^7" 10204 video.js "^6 || ^7"
@@ -8589,62 +10206,72 @@ videojs-contextmenu-ui@^5.0.0:
8589videojs-dock@^2.0.2: 10206videojs-dock@^2.0.2:
8590 version "2.1.4" 10207 version "2.1.4"
8591 resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.4.tgz#0ebd198b5d48990e3523fdc87dbfdb9fe96f804c" 10208 resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.4.tgz#0ebd198b5d48990e3523fdc87dbfdb9fe96f804c"
10209 integrity sha512-ymWYOGOjBMqCv+/lvA1jmbCUbvr+1euwaqN7oBKV/sKcyeeisbxjBoF9yHJYd8LHkXTBtYp96AHYa6XAVeFHJg==
8592 dependencies: 10210 dependencies:
8593 global "^4.3.2" 10211 global "^4.3.2"
8594 video.js "^6 || ^7" 10212 video.js "^6 || ^7"
8595 10213
8596videojs-font@3.0.0: 10214videojs-font@3.1.0:
8597 version "3.0.0" 10215 version "3.1.0"
8598 resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-3.0.0.tgz#90eafddcf26b407448c833523f5ca4ad8d5cc1af" 10216 resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-3.1.0.tgz#ac33be9b517fe19299f61cccd2b3c7d75a1c6960"
10217 integrity sha512-rxB68SVgbHD+kSwoNWNCHicKJuR2ga3bGfvGxmB+8fupsiLbnyCwTBVtrZUq4bZnD64mrKP1DxHiutxwrs59pQ==
8599 10218
8600videojs-hotkeys@^0.2.21: 10219videojs-hotkeys@^0.2.21:
8601 version "0.2.22" 10220 version "0.2.22"
8602 resolved "https://registry.yarnpkg.com/videojs-hotkeys/-/videojs-hotkeys-0.2.22.tgz#76f917b1a70e7bf9da5f7f8cd33d5a032c0284be" 10221 resolved "https://registry.yarnpkg.com/videojs-hotkeys/-/videojs-hotkeys-0.2.22.tgz#76f917b1a70e7bf9da5f7f8cd33d5a032c0284be"
10222 integrity sha512-sl/D6blI+SY40uD9OJBBUZB4PzV5g4xpfV2aPqzYgYiO1GEdXFAZKXWj80Hz2VEmJ8tXj5ToIbVq+t4v3ckvNw==
8603 10223
8604videojs-vtt.js@0.14.1: 10224videojs-vtt.js@0.14.1:
8605 version "0.14.1" 10225 version "0.14.1"
8606 resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.14.1.tgz#da583eb1fc9c81c826a9432b706040e8dea49911" 10226 resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.14.1.tgz#da583eb1fc9c81c826a9432b706040e8dea49911"
10227 integrity sha512-YxOiywx6N9t3J5nqsE5WN2Sw4CSqVe3zV+AZm2T4syOc2buNJaD6ZoexSdeszx2sHLU/RRo2r4BJAXFDQ7Qo2Q==
8607 dependencies: 10228 dependencies:
8608 global "^4.3.1" 10229 global "^4.3.1"
8609 10230
8610videostream@^2.5.1: 10231videostream@^2.5.1:
8611 version "2.5.1" 10232 version "2.6.0"
8612 resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.5.1.tgz#993a8f3efe277e5c8d26a7814ba0c68f79b20688" 10233 resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.6.0.tgz#7f0b2b84bc457c12cfe599aa2345f5cc06241ab6"
10234 integrity sha512-nSsullx1BYClJxVSt4Fa+Ulsv0Cf7UwaHq+4LQdLkAUdmqNhY1DlGxXDWVY2gui5XV4FvDiSbXmSbGryMrrUCQ==
8613 dependencies: 10235 dependencies:
8614 binary-search "^1.3.4" 10236 binary-search "^1.3.4"
8615 inherits "^2.0.1" 10237 inherits "^2.0.1"
8616 mediasource "^2.0.0" 10238 mediasource "^2.2.2"
8617 mp4-box-encoding "^1.3.0" 10239 mp4-box-encoding "^1.3.0"
8618 mp4-stream "^2.0.0" 10240 mp4-stream "^2.0.0"
8619 multistream "^2.0.2" 10241 multistream "^2.0.2"
8620 pump "^3.0.0" 10242 pump "^3.0.0"
8621 range-slice-stream "^1.2.0" 10243 range-slice-stream "^2.0.0"
8622 10244
8623vm-browserify@0.0.4: 10245vm-browserify@0.0.4:
8624 version "0.0.4" 10246 version "0.0.4"
8625 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" 10247 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
10248 integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
8626 dependencies: 10249 dependencies:
8627 indexof "0.0.1" 10250 indexof "0.0.1"
8628 10251
8629void-elements@^2.0.0: 10252void-elements@^2.0.0:
8630 version "2.0.1" 10253 version "2.0.1"
8631 resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" 10254 resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
10255 integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
8632 10256
8633w3c-hr-time@^1.0.1: 10257w3c-hr-time@^1.0.1:
8634 version "1.0.1" 10258 version "1.0.1"
8635 resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" 10259 resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
10260 integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
8636 dependencies: 10261 dependencies:
8637 browser-process-hrtime "^0.1.2" 10262 browser-process-hrtime "^0.1.2"
8638 10263
8639walker@~1.0.5: 10264walker@~1.0.5:
8640 version "1.0.7" 10265 version "1.0.7"
8641 resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" 10266 resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
10267 integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
8642 dependencies: 10268 dependencies:
8643 makeerror "1.0.x" 10269 makeerror "1.0.x"
8644 10270
8645watch@~0.18.0: 10271watch@~0.18.0:
8646 version "0.18.0" 10272 version "0.18.0"
8647 resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" 10273 resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
10274 integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY=
8648 dependencies: 10275 dependencies:
8649 exec-sh "^0.2.0" 10276 exec-sh "^0.2.0"
8650 minimist "^1.2.0" 10277 minimist "^1.2.0"
@@ -8652,20 +10279,23 @@ watch@~0.18.0:
8652watchpack@^1.5.0: 10279watchpack@^1.5.0:
8653 version "1.6.0" 10280 version "1.6.0"
8654 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" 10281 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
10282 integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
8655 dependencies: 10283 dependencies:
8656 chokidar "^2.0.2" 10284 chokidar "^2.0.2"
8657 graceful-fs "^4.1.2" 10285 graceful-fs "^4.1.2"
8658 neo-async "^2.5.0" 10286 neo-async "^2.5.0"
8659 10287
8660wbuf@^1.1.0, wbuf@^1.7.2: 10288wbuf@^1.1.0, wbuf@^1.7.3:
8661 version "1.7.3" 10289 version "1.7.3"
8662 resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" 10290 resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
10291 integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
8663 dependencies: 10292 dependencies:
8664 minimalistic-assert "^1.0.0" 10293 minimalistic-assert "^1.0.0"
8665 10294
8666webdriver-js-extender@2.1.0: 10295webdriver-js-extender@2.1.0:
8667 version "2.1.0" 10296 version "2.1.0"
8668 resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" 10297 resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7"
10298 integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==
8669 dependencies: 10299 dependencies:
8670 "@types/selenium-webdriver" "^3.0.0" 10300 "@types/selenium-webdriver" "^3.0.0"
8671 selenium-webdriver "^3.0.1" 10301 selenium-webdriver "^3.0.1"
@@ -8673,6 +10303,7 @@ webdriver-js-extender@2.1.0:
8673webdriver-manager@^12.0.6: 10303webdriver-manager@^12.0.6:
8674 version "12.1.0" 10304 version "12.1.0"
8675 resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.0.tgz#f6601e52de5f0c97fc7024c889eeb2416f2f1d9d" 10305 resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.0.tgz#f6601e52de5f0c97fc7024c889eeb2416f2f1d9d"
10306 integrity sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==
8676 dependencies: 10307 dependencies:
8677 adm-zip "^0.4.9" 10308 adm-zip "^0.4.9"
8678 chalk "^1.1.1" 10309 chalk "^1.1.1"
@@ -8689,10 +10320,12 @@ webdriver-manager@^12.0.6:
8689webidl-conversions@^4.0.2: 10320webidl-conversions@^4.0.2:
8690 version "4.0.2" 10321 version "4.0.2"
8691 resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 10322 resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
10323 integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
8692 10324
8693webpack-bundle-analyzer@^3.0.2: 10325webpack-bundle-analyzer@^3.0.2:
8694 version "3.0.2" 10326 version "3.0.3"
8695 resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.2.tgz#22f19ea6d1b5a15fd7a90baae0bc0f39bd1e4d48" 10327 resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz#dbc7fff8f52058b6714a20fddf309d0790e3e0a0"
10328 integrity sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw==
8696 dependencies: 10329 dependencies:
8697 acorn "^5.7.3" 10330 acorn "^5.7.3"
8698 bfj "^6.1.1" 10331 bfj "^6.1.1"
@@ -8708,54 +10341,53 @@ webpack-bundle-analyzer@^3.0.2:
8708 ws "^6.0.0" 10341 ws "^6.0.0"
8709 10342
8710webpack-cli@^3.0.8: 10343webpack-cli@^3.0.8:
8711 version "3.1.0" 10344 version "3.1.2"
8712 resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" 10345 resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746"
10346 integrity sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==
8713 dependencies: 10347 dependencies:
8714 chalk "^2.4.1" 10348 chalk "^2.4.1"
8715 cross-spawn "^6.0.5" 10349 cross-spawn "^6.0.5"
8716 enhanced-resolve "^4.0.0" 10350 enhanced-resolve "^4.1.0"
8717 global-modules-path "^2.1.0" 10351 global-modules-path "^2.3.0"
8718 import-local "^1.0.0" 10352 import-local "^2.0.0"
8719 inquirer "^6.0.0"
8720 interpret "^1.1.0" 10353 interpret "^1.1.0"
8721 loader-utils "^1.1.0" 10354 loader-utils "^1.1.0"
8722 supports-color "^5.4.0" 10355 supports-color "^5.5.0"
8723 v8-compile-cache "^2.0.0" 10356 v8-compile-cache "^2.0.2"
8724 yargs "^12.0.1" 10357 yargs "^12.0.2"
8725 10358
8726webpack-core@^0.6.8: 10359webpack-core@^0.6.8:
8727 version "0.6.9" 10360 version "0.6.9"
8728 resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" 10361 resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
10362 integrity sha1-/FcViMhVjad76e+23r3Fo7FyvcI=
8729 dependencies: 10363 dependencies:
8730 source-list-map "~0.1.7" 10364 source-list-map "~0.1.7"
8731 source-map "~0.4.1" 10365 source-map "~0.4.1"
8732 10366
8733webpack-dev-middleware@3.2.0: 10367webpack-dev-middleware@3.4.0:
8734 version "3.2.0" 10368 version "3.4.0"
8735 resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz#a20ceef194873710052da678f3c6ee0aeed92552" 10369 resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890"
10370 integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==
8736 dependencies: 10371 dependencies:
8737 loud-rejection "^1.6.0"
8738 memory-fs "~0.4.1" 10372 memory-fs "~0.4.1"
8739 mime "^2.3.1" 10373 mime "^2.3.1"
8740 path-is-absolute "^1.0.0"
8741 range-parser "^1.0.3" 10374 range-parser "^1.0.3"
8742 url-join "^4.0.0"
8743 webpack-log "^2.0.0" 10375 webpack-log "^2.0.0"
8744 10376
8745webpack-dev-middleware@^3.1.3: 10377webpack-dev-middleware@3.5.1:
8746 version "3.3.0" 10378 version "3.5.1"
8747 resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.3.0.tgz#8104daf4d4f65defe06ee2eaaeea612a7c541462" 10379 resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.5.1.tgz#9265b7742ef50f54f54c1d9af022fc17c1be9b88"
10380 integrity sha512-4dwCh/AyMOYAybggUr8fiCkRnjVDp+Cqlr9c+aaNB3GJYgRGYQWJ1YX/WAKUNA9dPNHZ6QSN2lYDKqjKSI8Vqw==
8748 dependencies: 10381 dependencies:
8749 loud-rejection "^1.6.0"
8750 memory-fs "~0.4.1" 10382 memory-fs "~0.4.1"
8751 mime "^2.3.1" 10383 mime "^2.3.1"
8752 range-parser "^1.0.3" 10384 range-parser "^1.0.3"
8753 url-join "^4.0.0"
8754 webpack-log "^2.0.0" 10385 webpack-log "^2.0.0"
8755 10386
8756webpack-dev-server@^3.1.4: 10387webpack-dev-server@3.1.14:
8757 version "3.1.8" 10388 version "3.1.14"
8758 resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz#eb7a95945d1108170f902604fb3b939533d9daeb" 10389 resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469"
10390 integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==
8759 dependencies: 10391 dependencies:
8760 ansi-html "0.0.7" 10392 ansi-html "0.0.7"
8761 bonjour "^3.5.0" 10393 bonjour "^3.5.0"
@@ -8776,19 +10408,22 @@ webpack-dev-server@^3.1.4:
8776 portfinder "^1.0.9" 10408 portfinder "^1.0.9"
8777 schema-utils "^1.0.0" 10409 schema-utils "^1.0.0"
8778 selfsigned "^1.9.1" 10410 selfsigned "^1.9.1"
10411 semver "^5.6.0"
8779 serve-index "^1.7.2" 10412 serve-index "^1.7.2"
8780 sockjs "0.3.19" 10413 sockjs "0.3.19"
8781 sockjs-client "1.1.5" 10414 sockjs-client "1.3.0"
8782 spdy "^3.4.1" 10415 spdy "^4.0.0"
8783 strip-ansi "^3.0.0" 10416 strip-ansi "^3.0.0"
8784 supports-color "^5.1.0" 10417 supports-color "^5.1.0"
8785 webpack-dev-middleware "3.2.0" 10418 url "^0.11.0"
10419 webpack-dev-middleware "3.4.0"
8786 webpack-log "^2.0.0" 10420 webpack-log "^2.0.0"
8787 yargs "12.0.2" 10421 yargs "12.0.2"
8788 10422
8789webpack-log@^1.2.0: 10423webpack-log@^1.2.0:
8790 version "1.2.0" 10424 version "1.2.0"
8791 resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" 10425 resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d"
10426 integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==
8792 dependencies: 10427 dependencies:
8793 chalk "^2.1.0" 10428 chalk "^2.1.0"
8794 log-symbols "^2.1.0" 10429 log-symbols "^2.1.0"
@@ -8798,46 +10433,52 @@ webpack-log@^1.2.0:
8798webpack-log@^2.0.0: 10433webpack-log@^2.0.0:
8799 version "2.0.0" 10434 version "2.0.0"
8800 resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" 10435 resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
10436 integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
8801 dependencies: 10437 dependencies:
8802 ansi-colors "^3.0.0" 10438 ansi-colors "^3.0.0"
8803 uuid "^3.3.2" 10439 uuid "^3.3.2"
8804 10440
8805webpack-merge@^4.1.2: 10441webpack-merge@4.2.1:
8806 version "4.1.4" 10442 version "4.2.1"
8807 resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" 10443 resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
10444 integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==
8808 dependencies: 10445 dependencies:
8809 lodash "^4.17.5" 10446 lodash "^4.17.5"
8810 10447
10448webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0:
10449 version "1.3.0"
10450 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
10451 integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
10452 dependencies:
10453 source-list-map "^2.0.0"
10454 source-map "~0.6.1"
10455
8811webpack-sources@^0.1.4: 10456webpack-sources@^0.1.4:
8812 version "0.1.5" 10457 version "0.1.5"
8813 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" 10458 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750"
10459 integrity sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=
8814 dependencies: 10460 dependencies:
8815 source-list-map "~0.1.7" 10461 source-list-map "~0.1.7"
8816 source-map "~0.5.3" 10462 source-map "~0.5.3"
8817 10463
8818webpack-sources@^1.1.0, webpack-sources@^1.2.0: 10464webpack-subresource-integrity@1.1.0-rc.6:
8819 version "1.3.0"
8820 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
8821 dependencies:
8822 source-list-map "^2.0.0"
8823 source-map "~0.6.1"
8824
8825webpack-subresource-integrity@^1.1.0-rc.4:
8826 version "1.1.0-rc.6" 10465 version "1.1.0-rc.6"
8827 resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886" 10466 resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886"
10467 integrity sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==
8828 dependencies: 10468 dependencies:
8829 webpack-core "^0.6.8" 10469 webpack-core "^0.6.8"
8830 10470
8831webpack@^4.15.1, webpack@^4.17.1: 10471webpack@4.29.0:
8832 version "4.19.1" 10472 version "4.29.0"
8833 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.1.tgz#096674bc3b573f8756c762754366e5b333d6576f" 10473 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750"
8834 dependencies: 10474 integrity sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==
8835 "@webassemblyjs/ast" "1.7.6" 10475 dependencies:
8836 "@webassemblyjs/helper-module-context" "1.7.6" 10476 "@webassemblyjs/ast" "1.7.11"
8837 "@webassemblyjs/wasm-edit" "1.7.6" 10477 "@webassemblyjs/helper-module-context" "1.7.11"
8838 "@webassemblyjs/wasm-parser" "1.7.6" 10478 "@webassemblyjs/wasm-edit" "1.7.11"
8839 acorn "^5.6.2" 10479 "@webassemblyjs/wasm-parser" "1.7.11"
8840 acorn-dynamic-import "^3.0.0" 10480 acorn "^6.0.5"
10481 acorn-dynamic-import "^4.0.0"
8841 ajv "^6.1.0" 10482 ajv "^6.1.0"
8842 ajv-keywords "^3.1.0" 10483 ajv-keywords "^3.1.0"
8843 chrome-trace-event "^1.0.0" 10484 chrome-trace-event "^1.0.0"
@@ -8853,13 +10494,14 @@ webpack@^4.15.1, webpack@^4.17.1:
8853 node-libs-browser "^2.0.0" 10494 node-libs-browser "^2.0.0"
8854 schema-utils "^0.4.4" 10495 schema-utils "^0.4.4"
8855 tapable "^1.1.0" 10496 tapable "^1.1.0"
8856 uglifyjs-webpack-plugin "^1.2.4" 10497 terser-webpack-plugin "^1.1.0"
8857 watchpack "^1.5.0" 10498 watchpack "^1.5.0"
8858 webpack-sources "^1.2.0" 10499 webpack-sources "^1.3.0"
8859 10500
8860websocket-driver@>=0.5.1: 10501websocket-driver@>=0.5.1:
8861 version "0.7.0" 10502 version "0.7.0"
8862 resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" 10503 resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
10504 integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=
8863 dependencies: 10505 dependencies:
8864 http-parser-js ">=0.4.0" 10506 http-parser-js ">=0.4.0"
8865 websocket-extensions ">=0.1.1" 10507 websocket-extensions ">=0.1.1"
@@ -8867,10 +10509,11 @@ websocket-driver@>=0.5.1:
8867websocket-extensions@>=0.1.1: 10509websocket-extensions@>=0.1.1:
8868 version "0.1.3" 10510 version "0.1.3"
8869 resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" 10511 resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
10512 integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
8870 10513
8871webtorrent@^0.102.1: 10514"webtorrent@https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d":
8872 version "0.102.4" 10515 version "0.102.4"
8873 resolved "https://registry.yarnpkg.com/webtorrent/-/webtorrent-0.102.4.tgz#0902f5dddb244c4ca8137d5d678546b733adeb2f" 10516 resolved "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d"
8874 dependencies: 10517 dependencies:
8875 addr-to-ip-port "^1.4.2" 10518 addr-to-ip-port "^1.4.2"
8876 bitfield "^2.0.0" 10519 bitfield "^2.0.0"
@@ -8878,7 +10521,7 @@ webtorrent@^0.102.1:
8878 bittorrent-protocol "^3.0.0" 10521 bittorrent-protocol "^3.0.0"
8879 chunk-store-stream "^3.0.1" 10522 chunk-store-stream "^3.0.1"
8880 create-torrent "^3.33.0" 10523 create-torrent "^3.33.0"
8881 debug "^3.1.0" 10524 debug "^4.0.1"
8882 end-of-stream "^1.1.0" 10525 end-of-stream "^1.1.0"
8883 fs-chunk-store "^1.6.2" 10526 fs-chunk-store "^1.6.2"
8884 immediate-chunk-store "^2.0.0" 10527 immediate-chunk-store "^2.0.0"
@@ -8914,22 +10557,26 @@ webtorrent@^0.102.1:
8914 ut_pex "^1.1.1" 10557 ut_pex "^1.1.1"
8915 10558
8916whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: 10559whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
8917 version "1.0.4" 10560 version "1.0.5"
8918 resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" 10561 resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
10562 integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
8919 dependencies: 10563 dependencies:
8920 iconv-lite "0.4.23" 10564 iconv-lite "0.4.24"
8921 10565
8922whatwg-fetch@^3.0.0: 10566whatwg-fetch@^3.0.0:
8923 version "3.0.0" 10567 version "3.0.0"
8924 resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" 10568 resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
10569 integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
8925 10570
8926whatwg-mimetype@^2.1.0: 10571whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
8927 version "2.2.0" 10572 version "2.3.0"
8928 resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" 10573 resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
10574 integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
8929 10575
8930whatwg-url@^6.4.1: 10576whatwg-url@^6.4.1:
8931 version "6.5.0" 10577 version "6.5.0"
8932 resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" 10578 resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
10579 integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
8933 dependencies: 10580 dependencies:
8934 lodash.sortby "^4.7.0" 10581 lodash.sortby "^4.7.0"
8935 tr46 "^1.0.1" 10582 tr46 "^1.0.1"
@@ -8938,6 +10585,7 @@ whatwg-url@^6.4.1:
8938whatwg-url@^7.0.0: 10585whatwg-url@^7.0.0:
8939 version "7.0.0" 10586 version "7.0.0"
8940 resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" 10587 resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
10588 integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
8941 dependencies: 10589 dependencies:
8942 lodash.sortby "^4.7.0" 10590 lodash.sortby "^4.7.0"
8943 tr46 "^1.0.1" 10591 tr46 "^1.0.1"
@@ -8946,44 +10594,53 @@ whatwg-url@^7.0.0:
8946when@~3.6.x: 10594when@~3.6.x:
8947 version "3.6.4" 10595 version "3.6.4"
8948 resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" 10596 resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
10597 integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=
8949 10598
8950which-module@^1.0.0: 10599which-module@^1.0.0:
8951 version "1.0.0" 10600 version "1.0.0"
8952 resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 10601 resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
10602 integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
8953 10603
8954which-module@^2.0.0: 10604which-module@^2.0.0:
8955 version "2.0.0" 10605 version "2.0.0"
8956 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 10606 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
10607 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
8957 10608
8958which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0: 10609which@1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1:
8959 version "1.3.1" 10610 version "1.3.1"
8960 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 10611 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
10612 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
8961 dependencies: 10613 dependencies:
8962 isexe "^2.0.0" 10614 isexe "^2.0.0"
8963 10615
8964wide-align@^1.1.0: 10616wide-align@^1.1.0:
8965 version "1.1.3" 10617 version "1.1.3"
8966 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 10618 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
10619 integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
8967 dependencies: 10620 dependencies:
8968 string-width "^1.0.2 || 2" 10621 string-width "^1.0.2 || 2"
8969 10622
8970wordwrap@^1.0.0, wordwrap@~1.0.0:
8971 version "1.0.0"
8972 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
8973
8974wordwrap@~0.0.2: 10623wordwrap@~0.0.2:
8975 version "0.0.3" 10624 version "0.0.3"
8976 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 10625 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
10626 integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
10627
10628wordwrap@~1.0.0:
10629 version "1.0.0"
10630 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
10631 integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
8977 10632
8978worker-farm@^1.5.2: 10633worker-farm@^1.5.2:
8979 version "1.6.0" 10634 version "1.6.0"
8980 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" 10635 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
10636 integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==
8981 dependencies: 10637 dependencies:
8982 errno "~0.1.7" 10638 errno "~0.1.7"
8983 10639
8984wrap-ansi@^2.0.0: 10640wrap-ansi@^2.0.0:
8985 version "2.1.0" 10641 version "2.1.0"
8986 resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 10642 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
10643 integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
8987 dependencies: 10644 dependencies:
8988 string-width "^1.0.1" 10645 string-width "^1.0.1"
8989 strip-ansi "^3.0.1" 10646 strip-ansi "^3.0.1"
@@ -8991,10 +10648,12 @@ wrap-ansi@^2.0.0:
8991wrappy@1: 10648wrappy@1:
8992 version "1.0.2" 10649 version "1.0.2"
8993 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 10650 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
10651 integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
8994 10652
8995write-file-atomic@^2.1.0: 10653write-file-atomic@^2.1.0:
8996 version "2.3.0" 10654 version "2.3.0"
8997 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" 10655 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
10656 integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
8998 dependencies: 10657 dependencies:
8999 graceful-fs "^4.1.11" 10658 graceful-fs "^4.1.11"
9000 imurmurhash "^0.1.4" 10659 imurmurhash "^0.1.4"
@@ -9003,18 +10662,21 @@ write-file-atomic@^2.1.0:
9003ws@^5.2.0: 10662ws@^5.2.0:
9004 version "5.2.2" 10663 version "5.2.2"
9005 resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 10664 resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
10665 integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
9006 dependencies: 10666 dependencies:
9007 async-limiter "~1.0.0" 10667 async-limiter "~1.0.0"
9008 10668
9009ws@^6.0.0: 10669ws@^6.0.0, ws@~6.1.0:
9010 version "6.0.0" 10670 version "6.1.2"
9011 resolved "https://registry.yarnpkg.com/ws/-/ws-6.0.0.tgz#eaa494aded00ac4289d455bac8d84c7c651cef35" 10671 resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
10672 integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
9012 dependencies: 10673 dependencies:
9013 async-limiter "~1.0.0" 10674 async-limiter "~1.0.0"
9014 10675
9015ws@~3.3.1: 10676ws@~3.3.1:
9016 version "3.3.3" 10677 version "3.3.3"
9017 resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" 10678 resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
10679 integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
9018 dependencies: 10680 dependencies:
9019 async-limiter "~1.0.0" 10681 async-limiter "~1.0.0"
9020 safe-buffer "~5.1.0" 10682 safe-buffer "~5.1.0"
@@ -9023,6 +10685,7 @@ ws@~3.3.1:
9023xhr@2.4.0: 10685xhr@2.4.0:
9024 version "2.4.0" 10686 version "2.4.0"
9025 resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993" 10687 resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
10688 integrity sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=
9026 dependencies: 10689 dependencies:
9027 global "~4.3.0" 10690 global "~4.3.0"
9028 is-function "^1.0.1" 10691 is-function "^1.0.1"
@@ -9032,10 +10695,12 @@ xhr@2.4.0:
9032xml-name-validator@^3.0.0: 10695xml-name-validator@^3.0.0:
9033 version "3.0.0" 10696 version "3.0.0"
9034 resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" 10697 resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
10698 integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
9035 10699
9036xml2js@^0.4.17: 10700xml2js@^0.4.17:
9037 version "0.4.19" 10701 version "0.4.19"
9038 resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 10702 resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
10703 integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
9039 dependencies: 10704 dependencies:
9040 sax ">=0.6.0" 10705 sax ">=0.6.0"
9041 xmlbuilder "~9.0.1" 10706 xmlbuilder "~9.0.1"
@@ -9043,74 +10708,90 @@ xml2js@^0.4.17:
9043xmlbuilder@~9.0.1: 10708xmlbuilder@~9.0.1:
9044 version "9.0.7" 10709 version "9.0.7"
9045 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 10710 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
10711 integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
9046 10712
9047xmlhttprequest-ssl@~1.5.4: 10713xmlhttprequest-ssl@~1.5.4:
9048 version "1.5.5" 10714 version "1.5.5"
9049 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 10715 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
10716 integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
9050 10717
9051xregexp@4.0.0: 10718xregexp@4.0.0:
9052 version "4.0.0" 10719 version "4.0.0"
9053 resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" 10720 resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
10721 integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==
9054 10722
9055xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: 10723xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
9056 version "4.0.1" 10724 version "4.0.1"
9057 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 10725 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
9058 10726 integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
9059xxhashjs@^0.2.1:
9060 version "0.2.2"
9061 resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8"
9062 dependencies:
9063 cuint "^0.2.2"
9064 10727
9065y18n@^3.2.1: 10728y18n@^3.2.1:
9066 version "3.2.1" 10729 version "3.2.1"
9067 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 10730 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
10731 integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
9068 10732
9069"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: 10733"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
9070 version "4.0.0" 10734 version "4.0.0"
9071 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 10735 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
10736 integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
9072 10737
9073yallist@^2.1.2: 10738yallist@^2.1.2:
9074 version "2.1.2" 10739 version "2.1.2"
9075 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 10740 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
10741 integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
9076 10742
9077yallist@^3.0.0, yallist@^3.0.2: 10743yallist@^3.0.0, yallist@^3.0.2:
9078 version "3.0.2" 10744 version "3.0.3"
9079 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 10745 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
10746 integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
9080 10747
9081yargs-parser@10.x, yargs-parser@^10.0.0, yargs-parser@^10.1.0: 10748yargs-parser@10.x, yargs-parser@^10.1.0:
9082 version "10.1.0" 10749 version "10.1.0"
9083 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" 10750 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
10751 integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==
9084 dependencies: 10752 dependencies:
9085 camelcase "^4.1.0" 10753 camelcase "^4.1.0"
9086 10754
10755yargs-parser@^11.1.1:
10756 version "11.1.1"
10757 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
10758 integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
10759 dependencies:
10760 camelcase "^5.0.0"
10761 decamelize "^1.2.0"
10762
9087yargs-parser@^5.0.0: 10763yargs-parser@^5.0.0:
9088 version "5.0.0" 10764 version "5.0.0"
9089 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 10765 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
10766 integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
9090 dependencies: 10767 dependencies:
9091 camelcase "^3.0.0" 10768 camelcase "^3.0.0"
9092 10769
9093yargs-parser@^7.0.0: 10770yargs-parser@^7.0.0:
9094 version "7.0.0" 10771 version "7.0.0"
9095 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 10772 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
10773 integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k=
9096 dependencies: 10774 dependencies:
9097 camelcase "^4.1.0" 10775 camelcase "^4.1.0"
9098 10776
9099yargs-parser@^8.0.0: 10777yargs-parser@^8.0.0:
9100 version "8.1.0" 10778 version "8.1.0"
9101 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" 10779 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
10780 integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
9102 dependencies: 10781 dependencies:
9103 camelcase "^4.1.0" 10782 camelcase "^4.1.0"
9104 10783
9105yargs-parser@^9.0.2: 10784yargs-parser@^9.0.2:
9106 version "9.0.2" 10785 version "9.0.2"
9107 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" 10786 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
10787 integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
9108 dependencies: 10788 dependencies:
9109 camelcase "^4.1.0" 10789 camelcase "^4.1.0"
9110 10790
9111yargs@10.0.3: 10791yargs@10.0.3:
9112 version "10.0.3" 10792 version "10.0.3"
9113 resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" 10793 resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae"
10794 integrity sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==
9114 dependencies: 10795 dependencies:
9115 cliui "^3.2.0" 10796 cliui "^3.2.0"
9116 decamelize "^1.1.1" 10797 decamelize "^1.1.1"
@@ -9125,9 +10806,10 @@ yargs@10.0.3:
9125 y18n "^3.2.1" 10806 y18n "^3.2.1"
9126 yargs-parser "^8.0.0" 10807 yargs-parser "^8.0.0"
9127 10808
9128yargs@12.0.2, yargs@^12.0.1: 10809yargs@12.0.2:
9129 version "12.0.2" 10810 version "12.0.2"
9130 resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" 10811 resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc"
10812 integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==
9131 dependencies: 10813 dependencies:
9132 cliui "^4.0.0" 10814 cliui "^4.0.0"
9133 decamelize "^2.0.0" 10815 decamelize "^2.0.0"
@@ -9142,9 +10824,29 @@ yargs@12.0.2, yargs@^12.0.1:
9142 y18n "^3.2.1 || ^4.0.0" 10824 y18n "^3.2.1 || ^4.0.0"
9143 yargs-parser "^10.1.0" 10825 yargs-parser "^10.1.0"
9144 10826
10827yargs@9.0.1:
10828 version "9.0.1"
10829 resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"
10830 integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=
10831 dependencies:
10832 camelcase "^4.1.0"
10833 cliui "^3.2.0"
10834 decamelize "^1.1.1"
10835 get-caller-file "^1.0.1"
10836 os-locale "^2.0.0"
10837 read-pkg-up "^2.0.0"
10838 require-directory "^2.1.1"
10839 require-main-filename "^1.0.1"
10840 set-blocking "^2.0.0"
10841 string-width "^2.0.0"
10842 which-module "^2.0.0"
10843 y18n "^3.2.1"
10844 yargs-parser "^7.0.0"
10845
9145yargs@^11.0.0: 10846yargs@^11.0.0:
9146 version "11.1.0" 10847 version "11.1.0"
9147 resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" 10848 resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
10849 integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
9148 dependencies: 10850 dependencies:
9149 cliui "^4.0.0" 10851 cliui "^4.0.0"
9150 decamelize "^1.1.1" 10852 decamelize "^1.1.1"
@@ -9159,9 +10861,28 @@ yargs@^11.0.0:
9159 y18n "^3.2.1" 10861 y18n "^3.2.1"
9160 yargs-parser "^9.0.2" 10862 yargs-parser "^9.0.2"
9161 10863
10864yargs@^12.0.2:
10865 version "12.0.5"
10866 resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
10867 integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
10868 dependencies:
10869 cliui "^4.0.0"
10870 decamelize "^1.2.0"
10871 find-up "^3.0.0"
10872 get-caller-file "^1.0.1"
10873 os-locale "^3.0.0"
10874 require-directory "^2.1.1"
10875 require-main-filename "^1.0.1"
10876 set-blocking "^2.0.0"
10877 string-width "^2.0.0"
10878 which-module "^2.0.0"
10879 y18n "^3.2.1 || ^4.0.0"
10880 yargs-parser "^11.1.1"
10881
9162yargs@^7.0.0: 10882yargs@^7.0.0:
9163 version "7.1.0" 10883 version "7.1.0"
9164 resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 10884 resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
10885 integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
9165 dependencies: 10886 dependencies:
9166 camelcase "^3.0.0" 10887 camelcase "^3.0.0"
9167 cliui "^3.2.0" 10888 cliui "^3.2.0"
@@ -9180,6 +10901,7 @@ yargs@^7.0.0:
9180yargs@^8.0.1: 10901yargs@^8.0.1:
9181 version "8.0.2" 10902 version "8.0.2"
9182 resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" 10903 resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
10904 integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
9183 dependencies: 10905 dependencies:
9184 camelcase "^4.1.0" 10906 camelcase "^4.1.0"
9185 cliui "^3.2.0" 10907 cliui "^3.2.0"
@@ -9198,7 +10920,9 @@ yargs@^8.0.1:
9198yeast@0.1.2: 10920yeast@0.1.2:
9199 version "0.1.2" 10921 version "0.1.2"
9200 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 10922 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
10923 integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
9201 10924
9202zone.js@~0.8.5: 10925zone.js@~0.8.5:
9203 version "0.8.26" 10926 version "0.8.26"
9204 resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d" 10927 resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d"
10928 integrity sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==
diff --git a/config/default.yaml b/config/default.yaml
index 0d7d948c2..5a83b271e 100644
--- a/config/default.yaml
+++ b/config/default.yaml
@@ -45,8 +45,11 @@ smtp:
45 45
46# From the project root directory 46# From the project root directory
47storage: 47storage:
48 tmp: 'storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
48 avatars: 'storage/avatars/' 49 avatars: 'storage/avatars/'
49 videos: 'storage/videos/' 50 videos: 'storage/videos/'
51 playlists: 'storage/playlists/'
52 redundancy: 'storage/redundancy/'
50 logs: 'storage/logs/' 53 logs: 'storage/logs/'
51 previews: 'storage/previews/' 54 previews: 'storage/previews/'
52 thumbnails: 'storage/thumbnails/' 55 thumbnails: 'storage/thumbnails/'
@@ -58,7 +61,10 @@ log:
58 level: 'info' # debug/info/warning/error 61 level: 'info' # debug/info/warning/error
59 62
60search: 63search:
61 remote_uri: # Add ability to fetch remote videos/actors by their URI, that may not be federated with your instance 64 # Add ability to fetch remote videos/actors by their URI, that may not be federated with your instance
65 # If enabled, the associated group will be able to "escape" from the instance follows
66 # That means they will be able to follow channels, watch videos, list videos of non followed instances
67 remote_uri:
62 users: true 68 users: true
63 anonymous: false 69 anonymous: false
64 70
@@ -72,7 +78,7 @@ trending:
72redundancy: 78redundancy:
73 videos: 79 videos:
74 check_interval: '1 hour' # How often you want to check new videos to cache 80 check_interval: '1 hour' # How often you want to check new videos to cache
75 strategies: 81 strategies: # Just uncomment strategies you want
76# - 82# -
77# size: '10GB' 83# size: '10GB'
78# # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances) 84# # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances)
@@ -97,7 +103,12 @@ cache:
97 size: 500 # Max number of video captions/subtitles you want to cache 103 size: 500 # Max number of video captions/subtitles you want to cache
98 104
99admin: 105admin:
100 email: 'admin@example.com' # Your personal email as administrator 106 # Used to generate the root user at first startup
107 # And to receive emails from the contact form
108 email: 'admin@example.com'
109
110contact_form:
111 enabled: true
101 112
102signup: 113signup:
103 enabled: false 114 enabled: false
@@ -119,6 +130,8 @@ user:
119# Please, do not disable transcoding since many uploaded videos will not work 130# Please, do not disable transcoding since many uploaded videos will not work
120transcoding: 131transcoding:
121 enabled: true 132 enabled: true
133 # Allow your users to upload .mkv, .mov, .avi, .flv videos
134 allow_additional_extensions: true
122 threads: 1 135 threads: 1
123 resolutions: # Only created if the original video has a higher resolution, uses more storage! 136 resolutions: # Only created if the original video has a higher resolution, uses more storage!
124 240p: false 137 240p: false
@@ -126,6 +139,15 @@ transcoding:
126 480p: false 139 480p: false
127 720p: false 140 720p: false
128 1080p: false 141 1080p: false
142 # /!\ EXPERIMENTAL /!\
143 # /!\ Requires ffmpeg >= 3.4
144 # Generate HLS playlist/segments. Better playback than with WebTorrent:
145 # * Resolution change is smoother
146 # * Faster playback in particular with long videos
147 # * More stable playback (less bugs/infinite loading)
148 # /!\ Multiply videos storage by two /!\
149 hls:
150 enabled: false
129 151
130import: 152import:
131 # Add ability for your users to import remote videos (from YouTube, torrent...) 153 # Add ability for your users to import remote videos (from YouTube, torrent...)
@@ -156,6 +178,8 @@ instance:
156 "# If you would like to report a security issue\n# you may report it to:\nContact: https://github.com/Chocobozzz/PeerTube/blob/develop/SECURITY.md\nContact: mailto:" 178 "# If you would like to report a security issue\n# you may report it to:\nContact: https://github.com/Chocobozzz/PeerTube/blob/develop/SECURITY.md\nContact: mailto:"
157 179
158services: 180services:
181 # You can provide a reporting endpoint for Content Security Policy violations
182 csp-logger:
159 # Cards configuration to format video in Twitter 183 # Cards configuration to format video in Twitter
160 twitter: 184 twitter:
161 username: '@Chocobozzz' # Indicates the Twitter account for the website or platform on which the content was published 185 username: '@Chocobozzz' # Indicates the Twitter account for the website or platform on which the content was published
diff --git a/config/production.yaml.example b/config/production.yaml.example
index f9da8e0dd..c54e1a516 100644
--- a/config/production.yaml.example
+++ b/config/production.yaml.example
@@ -46,8 +46,11 @@ smtp:
46 46
47# From the project root directory 47# From the project root directory
48storage: 48storage:
49 tmp: '/var/www/peertube/storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
49 avatars: '/var/www/peertube/storage/avatars/' 50 avatars: '/var/www/peertube/storage/avatars/'
50 videos: '/var/www/peertube/storage/videos/' 51 videos: '/var/www/peertube/storage/videos/'
52 playlists: '/var/www/peertube/storage/playlists/'
53 redundancy: '/var/www/peertube/storage/videos/'
51 logs: '/var/www/peertube/storage/logs/' 54 logs: '/var/www/peertube/storage/logs/'
52 previews: '/var/www/peertube/storage/previews/' 55 previews: '/var/www/peertube/storage/previews/'
53 thumbnails: '/var/www/peertube/storage/thumbnails/' 56 thumbnails: '/var/www/peertube/storage/thumbnails/'
@@ -59,7 +62,10 @@ log:
59 level: 'info' # debug/info/warning/error 62 level: 'info' # debug/info/warning/error
60 63
61search: 64search:
62 remote_uri: # Add ability to search remote videos/actors by URI, that may not be federated with your instance 65 # Add ability to fetch remote videos/actors by their URI, that may not be federated with your instance
66 # If enabled, the associated group will be able to "escape" from the instance follows
67 # That means they will be able to follow channels, watch videos, list videos of non followed instances
68 remote_uri:
63 users: true 69 users: true
64 anonymous: false 70 anonymous: false
65 71
@@ -73,7 +79,7 @@ trending:
73redundancy: 79redundancy:
74 videos: 80 videos:
75 check_interval: '1 hour' # How often you want to check new videos to cache 81 check_interval: '1 hour' # How often you want to check new videos to cache
76 strategies: 82 strategies: # Just uncomment strategies you want
77# - 83# -
78# size: '10GB' 84# size: '10GB'
79# # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances) 85# # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances)
@@ -110,8 +116,13 @@ cache:
110 size: 500 # Max number of video captions/subtitles you want to cache 116 size: 500 # Max number of video captions/subtitles you want to cache
111 117
112admin: 118admin:
119 # Used to generate the root user at first startup
120 # And to receive emails from the contact form
113 email: 'admin@example.com' 121 email: 'admin@example.com'
114 122
123contact_form:
124 enabled: true
125
115signup: 126signup:
116 enabled: false 127 enabled: false
117 limit: 10 # When the limit is reached, registrations are disabled. -1 == unlimited 128 limit: 10 # When the limit is reached, registrations are disabled. -1 == unlimited
@@ -132,6 +143,8 @@ user:
132# Please, do not disable transcoding since many uploaded videos will not work 143# Please, do not disable transcoding since many uploaded videos will not work
133transcoding: 144transcoding:
134 enabled: true 145 enabled: true
146 # Allow your users to upload .mkv, .mov, .avi, .flv videos
147 allow_additional_extensions: true
135 threads: 1 148 threads: 1
136 resolutions: # Only created if the original video has a higher resolution, uses more storage! 149 resolutions: # Only created if the original video has a higher resolution, uses more storage!
137 240p: false 150 240p: false
@@ -139,6 +152,15 @@ transcoding:
139 480p: false 152 480p: false
140 720p: false 153 720p: false
141 1080p: false 154 1080p: false
155 # /!\ EXPERIMENTAL /!\
156 # /!\ Requires ffmpeg >= 3.4
157 # Generate HLS playlist/segments. Better playback than with WebTorrent:
158 # * Resolution change is smoother
159 # * Faster playback in particular with long videos
160 # * More stable playback (less bugs/infinite loading)
161 # /!\ Multiply videos storage by two /!\
162 hls:
163 enabled: false
142 164
143import: 165import:
144 # Add ability for your users to import remote videos (from YouTube, torrent...) 166 # Add ability for your users to import remote videos (from YouTube, torrent...)
@@ -170,6 +192,8 @@ instance:
170 "# If you would like to report a security issue\n# you may report it to:\nContact: https://github.com/Chocobozzz/PeerTube/blob/develop/SECURITY.md\nContact: mailto:" 192 "# If you would like to report a security issue\n# you may report it to:\nContact: https://github.com/Chocobozzz/PeerTube/blob/develop/SECURITY.md\nContact: mailto:"
171 193
172services: 194services:
195 # You can provide a reporting endpoint for Content Security Policy violations
196 csp-logger:
173 # Cards configuration to format video in Twitter 197 # Cards configuration to format video in Twitter
174 twitter: 198 twitter:
175 username: '@Chocobozzz' # Indicates the Twitter account for the website or platform on which the content was published 199 username: '@Chocobozzz' # Indicates the Twitter account for the website or platform on which the content was published
diff --git a/config/test-1.yaml b/config/test-1.yaml
index 503bbc661..fb69818f3 100644
--- a/config/test-1.yaml
+++ b/config/test-1.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test1/tmp/'
13 avatars: 'test1/avatars/' 14 avatars: 'test1/avatars/'
14 videos: 'test1/videos/' 15 videos: 'test1/videos/'
16 playlists: 'test1/playlists/'
17 redundancy: 'test1/redundancy/'
15 logs: 'test1/logs/' 18 logs: 'test1/logs/'
16 previews: 'test1/previews/' 19 previews: 'test1/previews/'
17 thumbnails: 'test1/thumbnails/' 20 thumbnails: 'test1/thumbnails/'
diff --git a/config/test-2.yaml b/config/test-2.yaml
index 8c77bf581..5caddaaa8 100644
--- a/config/test-2.yaml
+++ b/config/test-2.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test2/tmp/'
13 avatars: 'test2/avatars/' 14 avatars: 'test2/avatars/'
14 videos: 'test2/videos/' 15 videos: 'test2/videos/'
16 playlists: 'test2/playlists/'
17 redundancy: 'test2/redundancy/'
15 logs: 'test2/logs/' 18 logs: 'test2/logs/'
16 previews: 'test2/previews/' 19 previews: 'test2/previews/'
17 thumbnails: 'test2/thumbnails/' 20 thumbnails: 'test2/thumbnails/'
@@ -27,3 +30,4 @@ signup:
27 30
28transcoding: 31transcoding:
29 enabled: true 32 enabled: true
33 allow_additional_extensions: true
diff --git a/config/test-3.yaml b/config/test-3.yaml
index 82d89567a..fac7ebee1 100644
--- a/config/test-3.yaml
+++ b/config/test-3.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test3/tmp/'
13 avatars: 'test3/avatars/' 14 avatars: 'test3/avatars/'
14 videos: 'test3/videos/' 15 videos: 'test3/videos/'
16 playlists: 'test3/playlists/'
17 redundancy: 'test3/redundancy/'
15 logs: 'test3/logs/' 18 logs: 'test3/logs/'
16 previews: 'test3/previews/' 19 previews: 'test3/previews/'
17 thumbnails: 'test3/thumbnails/' 20 thumbnails: 'test3/thumbnails/'
diff --git a/config/test-4.yaml b/config/test-4.yaml
index 1aa56d041..33033773a 100644
--- a/config/test-4.yaml
+++ b/config/test-4.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test4/tmp/'
13 avatars: 'test4/avatars/' 14 avatars: 'test4/avatars/'
14 videos: 'test4/videos/' 15 videos: 'test4/videos/'
16 playlists: 'test4/playlists/'
17 redundancy: 'test4/redundancy/'
15 logs: 'test4/logs/' 18 logs: 'test4/logs/'
16 previews: 'test4/previews/' 19 previews: 'test4/previews/'
17 thumbnails: 'test4/thumbnails/' 20 thumbnails: 'test4/thumbnails/'
diff --git a/config/test-5.yaml b/config/test-5.yaml
index 5f1c2f583..d365b6f2b 100644
--- a/config/test-5.yaml
+++ b/config/test-5.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test5/tmp/'
13 avatars: 'test5/avatars/' 14 avatars: 'test5/avatars/'
14 videos: 'test5/videos/' 15 videos: 'test5/videos/'
16 playlists: 'test5/playlists/'
17 redundancy: 'test5/redundancy/'
15 logs: 'test5/logs/' 18 logs: 'test5/logs/'
16 previews: 'test5/previews/' 19 previews: 'test5/previews/'
17 thumbnails: 'test5/thumbnails/' 20 thumbnails: 'test5/thumbnails/'
diff --git a/config/test-6.yaml b/config/test-6.yaml
index 719629844..44541c003 100644
--- a/config/test-6.yaml
+++ b/config/test-6.yaml
@@ -10,8 +10,11 @@ database:
10 10
11# From the project root directory 11# From the project root directory
12storage: 12storage:
13 tmp: 'test6/tmp/'
13 avatars: 'test6/avatars/' 14 avatars: 'test6/avatars/'
14 videos: 'test6/videos/' 15 videos: 'test6/videos/'
16 playlists: 'test6/playlists/'
17 redundancy: 'test6/redundancy/'
15 logs: 'test6/logs/' 18 logs: 'test6/logs/'
16 previews: 'test6/previews/' 19 previews: 'test6/previews/'
17 thumbnails: 'test6/thumbnails/' 20 thumbnails: 'test6/thumbnails/'
diff --git a/config/test.yaml b/config/test.yaml
index 04c999966..682530840 100644
--- a/config/test.yaml
+++ b/config/test.yaml
@@ -1,5 +1,5 @@
1listen: 1listen:
2 listen: '0.0.0.0' 2 hostname: '0.0.0.0'
3 port: 9000 3 port: 9000
4 4
5webserver: 5webserver:
@@ -21,6 +21,9 @@ smtp:
21log: 21log:
22 level: 'debug' 22 level: 'debug'
23 23
24contact_form:
25 enabled: true
26
24redundancy: 27redundancy:
25 videos: 28 videos:
26 check_interval: '10 minutes' 29 check_interval: '10 minutes'
@@ -51,6 +54,7 @@ signup:
51 54
52transcoding: 55transcoding:
53 enabled: true 56 enabled: true
57 allow_additional_extensions: false
54 threads: 2 58 threads: 2
55 resolutions: 59 resolutions:
56 240p: true 60 240p: true
@@ -58,6 +62,8 @@ transcoding:
58 480p: true 62 480p: true
59 720p: true 63 720p: true
60 1080p: true 64 1080p: true
65 hls:
66 enabled: true
61 67
62import: 68import:
63 videos: 69 videos:
@@ -67,4 +73,4 @@ import:
67 enabled: true 73 enabled: true
68 74
69instance: 75instance:
70 default_nsfw_policy: 'display' \ No newline at end of file 76 default_nsfw_policy: 'display'
diff --git a/package.json b/package.json
index 80d5a04ac..0cf39c7ee 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
1{ 1{
2 "name": "peertube", 2 "name": "peertube",
3 "description": "Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.", 3 "description": "Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.",
4 "version": "1.0.0-rc.2", 4 "version": "1.2.0",
5 "private": true, 5 "private": true,
6 "licence": "AGPLv3", 6 "licence": "AGPLv3",
7 "engines": { 7 "engines": {
@@ -43,17 +43,18 @@
43 "dev:server": "scripty", 43 "dev:server": "scripty",
44 "dev:client": "scripty", 44 "dev:client": "scripty",
45 "start": "node dist/server", 45 "start": "node dist/server",
46 "start:server": "node dist/server --no-client",
46 "update-host": "node ./dist/scripts/update-host.js", 47 "update-host": "node ./dist/scripts/update-host.js",
47 "create-transcoding-job": "node ./dist/scripts/create-transcoding-job.js", 48 "create-transcoding-job": "node ./dist/scripts/create-transcoding-job.js",
48 "create-import-video-file-job": "node ./dist/scripts/create-import-video-file-job.js", 49 "create-import-video-file-job": "node ./dist/scripts/create-import-video-file-job.js",
49 "test": "scripty", 50 "test": "scripty",
50 "help": "scripty", 51 "help": "scripty",
51 "generate-api-doc": "scripty", 52 "generate-cli-doc": "scripty",
52 "parse-log": "node ./dist/scripts/parse-log.js", 53 "parse-log": "node ./dist/scripts/parse-log.js",
53 "prune-storage": "node ./dist/scripts/prune-storage.js", 54 "prune-storage": "node ./dist/scripts/prune-storage.js",
55 "optimize-old-videos": "node ./dist/scripts/optimize-old-videos.js",
54 "postinstall": "cd client && yarn install --pure-lockfile", 56 "postinstall": "cd client && yarn install --pure-lockfile",
55 "tsc": "tsc", 57 "tsc": "tsc",
56 "spectacle-docs": "node_modules/spectacle-docs/bin/spectacle.js",
57 "commander": "commander", 58 "commander": "commander",
58 "ng": "ng", 59 "ng": "ng",
59 "nodemon": "nodemon", 60 "nodemon": "nodemon",
@@ -76,6 +77,14 @@
76 "*.scss": [ 77 "*.scss": [
77 "sass-lint -c client/.sass-lint.yml", 78 "sass-lint -c client/.sass-lint.yml",
78 "git add" 79 "git add"
80 ],
81 "support/doc/api/*.yaml": [
82 "node ./node_modules/swagger-cli/bin/swagger-cli.js validate support/doc/api/openapi.yaml",
83 "git add"
84 ],
85 "server/tools/README.md": [
86 "npm run generate-cli-doc",
87 "git add"
79 ] 88 ]
80 }, 89 },
81 "resolutions": { 90 "resolutions": {
@@ -86,7 +95,7 @@
86 "async": "^2.0.0", 95 "async": "^2.0.0",
87 "async-lock": "^1.1.2", 96 "async-lock": "^1.1.2",
88 "async-lru": "^1.1.1", 97 "async-lru": "^1.1.1",
89 "bcrypt": "2", 98 "bcrypt": "3.0.2",
90 "bittorrent-tracker": "^9.0.0", 99 "bittorrent-tracker": "^9.0.0",
91 "bluebird": "^3.5.0", 100 "bluebird": "^3.5.0",
92 "body-parser": "^1.12.4", 101 "body-parser": "^1.12.4",
@@ -95,7 +104,7 @@
95 "cli-table": "^0.3.1", 104 "cli-table": "^0.3.1",
96 "commander": "^2.13.0", 105 "commander": "^2.13.0",
97 "concurrently": "^4.0.1", 106 "concurrently": "^4.0.1",
98 "config": "^2.0.1", 107 "config": "^3.0.0",
99 "cookie-parser": "^1.4.3", 108 "cookie-parser": "^1.4.3",
100 "cors": "^2.8.1", 109 "cors": "^2.8.1",
101 "create-torrent": "^3.24.5", 110 "create-torrent": "^3.24.5",
@@ -108,9 +117,10 @@
108 "fluent-ffmpeg": "^2.1.0", 117 "fluent-ffmpeg": "^2.1.0",
109 "fs-extra": "^7.0.0", 118 "fs-extra": "^7.0.0",
110 "helmet": "^3.12.1", 119 "helmet": "^3.12.1",
120 "http-signature": "^1.2.0",
111 "ip-anonymize": "^0.0.6", 121 "ip-anonymize": "^0.0.6",
112 "ipaddr.js": "1.8.1", 122 "ipaddr.js": "1.8.1",
113 "is-cidr": "^2.0.5", 123 "is-cidr": "^3.0.0",
114 "iso-639-3": "^1.0.1", 124 "iso-639-3": "^1.0.1",
115 "js-yaml": "^3.5.4", 125 "js-yaml": "^3.5.4",
116 "jsonld": "^1.0.1", 126 "jsonld": "^1.0.1",
@@ -127,16 +137,16 @@
127 "pem": "^1.12.3", 137 "pem": "^1.12.3",
128 "pfeed": "^1.1.6", 138 "pfeed": "^1.1.6",
129 "pg": "^7.4.1", 139 "pg": "^7.4.1",
130 "pg-hstore": "^2.3.2",
131 "prompt": "^1.0.0", 140 "prompt": "^1.0.0",
132 "redis": "^2.8.0", 141 "redis": "^2.8.0",
133 "reflect-metadata": "^0.1.10", 142 "reflect-metadata": "^0.1.12",
134 "request": "^2.81.0", 143 "request": "^2.81.0",
135 "safe-buffer": "^5.0.1",
136 "scripty": "^1.5.0", 144 "scripty": "^1.5.0",
137 "sequelize": "4.38.0", 145 "sequelize": "4.41.2",
138 "sequelize-typescript": "0.6.6", 146 "sequelize-typescript": "0.6.6",
139 "sharp": "^0.20.0", 147 "sharp": "^0.21.0",
148 "sitemap": "^2.1.0",
149 "socket.io": "^2.2.0",
140 "srt-to-vtt": "^1.1.2", 150 "srt-to-vtt": "^1.1.2",
141 "summon-install": "^0.4.3", 151 "summon-install": "^0.4.3",
142 "useragent": "^2.3.0", 152 "useragent": "^2.3.0",
@@ -151,10 +161,10 @@
151 "devDependencies": { 161 "devDependencies": {
152 "@types/async": "^2.0.40", 162 "@types/async": "^2.0.40",
153 "@types/async-lock": "^1.1.0", 163 "@types/async-lock": "^1.1.0",
154 "@types/bcrypt": "^2.0.0", 164 "@types/bcrypt": "^3.0.0",
155 "@types/bluebird": "3.5.21", 165 "@types/bluebird": "3.5.21",
156 "@types/body-parser": "^1.16.3", 166 "@types/body-parser": "^1.16.3",
157 "@types/bull": "^3.3.12", 167 "@types/bull": "3.4.0",
158 "@types/bytes": "^3.0.0", 168 "@types/bytes": "^3.0.0",
159 "@types/chai": "^4.0.4", 169 "@types/chai": "^4.0.4",
160 "@types/chai-json-schema": "^1.4.3", 170 "@types/chai-json-schema": "^1.4.3",
@@ -162,6 +172,7 @@
162 "@types/config": "^0.0.34", 172 "@types/config": "^0.0.34",
163 "@types/express": "^4.0.35", 173 "@types/express": "^4.0.35",
164 "@types/express-rate-limit": "^2.9.3", 174 "@types/express-rate-limit": "^2.9.3",
175 "@types/fluent-ffmpeg": "^2.1.8",
165 "@types/fs-extra": "^5.0.4", 176 "@types/fs-extra": "^5.0.4",
166 "@types/libxmljs": "^0.18.0", 177 "@types/libxmljs": "^0.18.0",
167 "@types/lodash": "^4.14.64", 178 "@types/lodash": "^4.14.64",
@@ -178,7 +189,8 @@
178 "@types/pem": "^1.9.3", 189 "@types/pem": "^1.9.3",
179 "@types/redis": "^2.8.5", 190 "@types/redis": "^2.8.5",
180 "@types/request": "^2.0.3", 191 "@types/request": "^2.0.3",
181 "@types/sharp": "^0.17.6", 192 "@types/sharp": "^0.21.0",
193 "@types/socket.io": "^2.1.2",
182 "@types/supertest": "^2.0.3", 194 "@types/supertest": "^2.0.3",
183 "@types/validator": "^9.4.0", 195 "@types/validator": "^9.4.0",
184 "@types/webtorrent": "^0.98.4", 196 "@types/webtorrent": "^0.98.4",
@@ -187,19 +199,20 @@
187 "chai-json-schema": "^1.5.0", 199 "chai-json-schema": "^1.5.0",
188 "chai-xml": "^0.3.2", 200 "chai-xml": "^0.3.2",
189 "husky": "^1.0.0-rc.4", 201 "husky": "^1.0.0-rc.4",
190 "libxmljs": "0.19.3", 202 "libxmljs": "0.19.5",
191 "lint-staged": "^7.1.0", 203 "lint-staged": "^8.0.4",
192 "maildev": "^1.0.0-rc3", 204 "maildev": "^1.0.0-rc3",
205 "marked-man": "^0.2.1",
193 "mocha": "^5.0.0", 206 "mocha": "^5.0.0",
194 "nodemon": "^1.11.0", 207 "nodemon": "^1.18.6",
195 "sass-lint": "^1.12.1", 208 "sass-lint": "^1.12.1",
196 "source-map-support": "^0.5.0", 209 "source-map-support": "^0.5.0",
197 "spectacle-docs": "^1.0.2",
198 "supertest": "^3.0.0", 210 "supertest": "^3.0.0",
211 "swagger-cli": "^2.2.0",
199 "ts-node": "7.0.1", 212 "ts-node": "7.0.1",
200 "tslint": "^5.7.0", 213 "tslint": "^5.7.0",
201 "tslint-config-standard": "^8.0.1", 214 "tslint-config-standard": "^8.0.1",
202 "typescript": "^2.5.2", 215 "typescript": "^3.1.6",
203 "xliff": "^4.0.0" 216 "xliff": "^4.0.0"
204 }, 217 },
205 "scripty": { 218 "scripty": {
diff --git a/scripts/build/client.sh b/scripts/build/client.sh
index 62daf98cf..be3eef802 100755
--- a/scripts/build/client.sh
+++ b/scripts/build/client.sh
@@ -41,7 +41,7 @@ if [ -z ${1+x} ] || [ "$1" != "--light" ]; then
41 languages=("fr_FR") 41 languages=("fr_FR")
42 else 42 else
43 # Supported languages 43 # Supported languages
44 languages=("fr_FR" "pt_BR" "sv_SE" "eu_ES" "ca_ES" "cs_CZ" "eo" "zh_Hant_TW" "de_DE" "es_ES" "oc" "zh_Hans_CN") 44 languages=("pl_PL" "it_IT" "ru_RU" "fr_FR" "pt_BR" "sv_SE" "eu_ES" "ca_ES" "cs_CZ" "eo" "zh_Hant_TW" "de_DE" "es_ES" "oc" "zh_Hans_CN")
45 fi 45 fi
46 46
47 for lang in "${languages[@]}"; do 47 for lang in "${languages[@]}"; do
diff --git a/scripts/clean/server/test.sh b/scripts/clean/server/test.sh
index 235ff52cc..b897c30ba 100755
--- a/scripts/clean/server/test.sh
+++ b/scripts/clean/server/test.sh
@@ -18,6 +18,7 @@ removeFiles () {
18 18
19dropRedis () { 19dropRedis () {
20 redis-cli KEYS "bull-localhost:900$1*" | grep -v empty | xargs --no-run-if-empty redis-cli DEL 20 redis-cli KEYS "bull-localhost:900$1*" | grep -v empty | xargs --no-run-if-empty redis-cli DEL
21 redis-cli KEYS "redis-localhost:900$1*" | grep -v empty | xargs --no-run-if-empty redis-cli DEL
21} 22}
22 23
23for i in $(seq 1 6); do 24for i in $(seq 1 6); do
diff --git a/scripts/dev/server.sh b/scripts/dev/server.sh
index 9b8fddac6..b4675c57f 100755
--- a/scripts/dev/server.sh
+++ b/scripts/dev/server.sh
@@ -4,7 +4,7 @@ set -eu
4 4
5if [ ! -f "./client/dist/en_US/index.html" ]; then 5if [ ! -f "./client/dist/en_US/index.html" ]; then
6 echo "client/dist/en_US/index.html does not exist, compile client files..." 6 echo "client/dist/en_US/index.html does not exist, compile client files..."
7 npm run build:client 7 npm run build:client -- --light
8fi 8fi
9 9
10npm run watch:server 10npm run watch:server
diff --git a/scripts/generate-api-doc.sh b/scripts/generate-api-doc.sh
deleted file mode 100755
index 7d48db7a5..000000000
--- a/scripts/generate-api-doc.sh
+++ /dev/null
@@ -1,5 +0,0 @@
1#!/bin/sh
2
3set -eu
4
5npm run spectacle-docs -- -t support/doc/api/html support/doc/api/openapi.yaml
diff --git a/scripts/generate-cli-doc.sh b/scripts/generate-cli-doc.sh
new file mode 100755
index 000000000..0d00f183b
--- /dev/null
+++ b/scripts/generate-cli-doc.sh
@@ -0,0 +1,5 @@
1#!/bin/sh
2
3set -eu
4
5node_modules/marked-man/bin/marked-man server/tools/README.md > dist/server/tools/peertube.8
diff --git a/scripts/generate-code-contributors.ts b/scripts/generate-code-contributors.ts
index 3d37372d1..96110307a 100755
--- a/scripts/generate-code-contributors.ts
+++ b/scripts/generate-code-contributors.ts
@@ -41,7 +41,7 @@ async function run () {
41} 41}
42 42
43function get (url: string, headers: any = {}) { 43function get (url: string, headers: any = {}) {
44 return doRequest({ 44 return doRequest<any>({
45 uri: url, 45 uri: url,
46 json: true, 46 json: true,
47 headers: Object.assign(headers, { 47 headers: Object.assign(headers, {
@@ -70,11 +70,17 @@ async function fetchGithub (url: string) {
70 70
71async function fetchZanata (zanataUsername: string, zanataPassword: string) { 71async function fetchZanata (zanataUsername: string, zanataPassword: string) {
72 const today = new Date().toISOString().split('T')[0] 72 const today = new Date().toISOString().split('T')[0]
73 const url = `https://trad.framasoft.org/zanata/rest/project/peertube/version/develop/contributors/2018-01-01..${today}` 73 const year2018 = `https://trad.framasoft.org/zanata/rest/project/peertube/version/develop/contributors/2018-01-01..2019-01-01`
74 const year2019 = `https://trad.framasoft.org/zanata/rest/project/peertube/version/develop/contributors/2019-01-01..${today}`
74 75
75 const headers = { 76 const headers = {
76 'X-Auth-User': zanataUsername, 77 'X-Auth-User': zanataUsername,
77 'X-Auth-Token': zanataPassword 78 'X-Auth-Token': zanataPassword
78 } 79 }
79 return get(url, headers) 80 const [ results2018, results2019 ] = await Promise.all([
81 get(year2018, headers),
82 get(year2019, headers)
83 ])
84
85 return results2018.concat(results2019)
80} 86}
diff --git a/scripts/help.sh b/scripts/help.sh
index 8ac090139..bc38bdb40 100755
--- a/scripts/help.sh
+++ b/scripts/help.sh
@@ -18,6 +18,7 @@ printf " reset-password -- -u [user] -> Reset the password of user [user]\n"
18printf " create-transcoding-job -- -v [video UUID] \n" 18printf " create-transcoding-job -- -v [video UUID] \n"
19printf " -> Create a transcoding job for a particular video\n" 19printf " -> Create a transcoding job for a particular video\n"
20printf " prune-storage -> Delete (after confirmation) unknown video files/thumbnails/previews... (due to a bad video deletion, transcoding job not finished...)\n" 20printf " prune-storage -> Delete (after confirmation) unknown video files/thumbnails/previews... (due to a bad video deletion, transcoding job not finished...)\n"
21printf " optimize-old-videos -> Re-transcode videos that have a high bitrate, to make them suitable for streaming over slow connections"
21printf " dev -> Watch, run the livereload and run the server so that you can develop the application\n" 22printf " dev -> Watch, run the livereload and run the server so that you can develop the application\n"
22printf " start -> Run the server\n" 23printf " start -> Run the server\n"
23printf " update-host -> Upgrade scheme/host in torrent files according to the webserver configuration (config/ folder)\n" 24printf " update-host -> Upgrade scheme/host in torrent files according to the webserver configuration (config/ folder)\n"
diff --git a/scripts/i18n/create-custom-files.ts b/scripts/i18n/create-custom-files.ts
index eed3182a6..664207e1c 100755
--- a/scripts/i18n/create-custom-files.ts
+++ b/scripts/i18n/create-custom-files.ts
@@ -23,12 +23,15 @@ const playerKeys = {
23 'Speed': 'Speed', 23 'Speed': 'Speed',
24 'Subtitles/CC': 'Subtitles/CC', 24 'Subtitles/CC': 'Subtitles/CC',
25 'peers': 'peers', 25 'peers': 'peers',
26 'peer': 'peer',
26 'Go to the video page': 'Go to the video page', 27 'Go to the video page': 'Go to the video page',
27 'Settings': 'Settings', 28 'Settings': 'Settings',
28 'Uses P2P, others may know you are watching this video.': 'Uses P2P, others may know you are watching this video.', 29 'Uses P2P, others may know you are watching this video.': 'Uses P2P, others may know you are watching this video.',
29 'Copy the video URL': 'Copy the video URL', 30 'Copy the video URL': 'Copy the video URL',
30 'Copy the video URL at the current time': 'Copy the video URL at the current time', 31 'Copy the video URL at the current time': 'Copy the video URL at the current time',
31 'Copy embed code': 'Copy embed code' 32 'Copy embed code': 'Copy embed code',
33 'Total downloaded: ': 'Total downloaded: ',
34 'Total uploaded: ': 'Total uploaded: '
32} 35}
33const playerTranslations = { 36const playerTranslations = {
34 target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'), 37 target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'),
@@ -42,6 +45,12 @@ values(VIDEO_CATEGORIES)
42 .concat(values(VIDEO_PRIVACIES)) 45 .concat(values(VIDEO_PRIVACIES))
43 .concat(values(VIDEO_STATES)) 46 .concat(values(VIDEO_STATES))
44 .concat(values(VIDEO_IMPORT_STATES)) 47 .concat(values(VIDEO_IMPORT_STATES))
48 .concat([
49 'This video does not exist.',
50 'We cannot fetch the video. Please try again later.',
51 'Sorry',
52 'This video is not available because the remote instance is not responding.'
53 ])
45 .forEach(v => serverKeys[v] = v) 54 .forEach(v => serverKeys[v] = v)
46 55
47// More keys 56// More keys
@@ -103,4 +112,4 @@ function saveToXliffFile (jsonTranslations: TranslationType, cb: Function) {
103function handleError (err: any) { 112function handleError (err: any) {
104 console.error(err) 113 console.error(err)
105 process.exit(-1) 114 process.exit(-1)
106} \ No newline at end of file 115}
diff --git a/scripts/i18n/pull-hook.sh b/scripts/i18n/pull-hook.sh
index 3a8394110..b0668436d 100755
--- a/scripts/i18n/pull-hook.sh
+++ b/scripts/i18n/pull-hook.sh
@@ -7,6 +7,7 @@ set -eu
7 7
8for i in 1 2 3; do 8for i in 1 2 3; do
9 perl -pi -e 's|&lt;x id=(.+?)/&gt;([^"])|<x id=\1/>\2|g' client/src/locale/target/*.xml 9 perl -pi -e 's|&lt;x id=(.+?)/&gt;([^"])|<x id=\1/>\2|g' client/src/locale/target/*.xml
10 perl -0pi -e 's|<source>(.+?)</source>\s*<context-group |<source>\1</source><target>\1</target><context-group |g' client/src/locale/target/angular_*.xml
10done 11done
11 12
12npm run i18n:xliff2json 13npm run i18n:xliff2json
diff --git a/scripts/openapi-peertube-version.sh b/scripts/openapi-peertube-version.sh
new file mode 100755
index 000000000..4eb481e64
--- /dev/null
+++ b/scripts/openapi-peertube-version.sh
@@ -0,0 +1,6 @@
1#!/usr/bin/env bash
2
3# Version key/value should be on his own line
4PACKAGE_VERSION=$(node -p "require('./package.json').version")
5
6sed -i "s/\(^\s*\)version: .*/\1version: $PACKAGE_VERSION/" ./support/doc/api/openapi.yaml
diff --git a/scripts/optimize-old-videos.ts b/scripts/optimize-old-videos.ts
new file mode 100644
index 000000000..1bee1b0f3
--- /dev/null
+++ b/scripts/optimize-old-videos.ts
@@ -0,0 +1,67 @@
1import { CONFIG, VIDEO_TRANSCODING_FPS } from '../server/initializers/constants'
2import { getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution, getDurationFromVideoFile } from '../server/helpers/ffmpeg-utils'
3import { getMaxBitrate } from '../shared/models/videos'
4import { VideoModel } from '../server/models/video/video'
5import { optimizeVideofile } from '../server/lib/video-transcoding'
6import { initDatabaseModels } from '../server/initializers'
7import { join, basename, dirname } from 'path'
8import { copy, remove, move } from 'fs-extra'
9
10run()
11 .then(() => process.exit(0))
12 .catch(err => {
13 console.error(err)
14 process.exit(-1)
15 })
16
17let currentVideoId = null
18let currentFile = null
19
20process.on('SIGINT', async function () {
21 console.log('Cleaning up temp files')
22 await remove(`${currentFile}_backup`)
23 await remove(`${dirname(currentFile)}/${currentVideoId}-transcoded.mp4`)
24 process.exit(0)
25})
26
27async function run () {
28 await initDatabaseModels(true)
29
30 const localVideos = await VideoModel.listLocal()
31
32 for (const video of localVideos) {
33 currentVideoId = video.id
34 for (const file of video.VideoFiles) {
35 currentFile = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(file))
36
37 const [ videoBitrate, fps, resolution ] = await Promise.all([
38 getVideoFileBitrate(currentFile),
39 getVideoFileFPS(currentFile),
40 getVideoFileResolution(currentFile)
41 ])
42
43 const maxBitrate = getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)
44 const isMaxBitrateExceeded = videoBitrate > maxBitrate
45 if (isMaxBitrateExceeded) {
46 console.log('Optimizing video file %s with bitrate %s kbps (max: %s kbps)',
47 basename(currentFile), videoBitrate / 1000, maxBitrate / 1000)
48 const backupFile = `${currentFile}_backup`
49 await copy(currentFile, backupFile)
50 await optimizeVideofile(video, file)
51 const originalDuration = await getDurationFromVideoFile(backupFile)
52 const newDuration = await getDurationFromVideoFile(currentFile)
53 if (originalDuration === newDuration) {
54 console.log('Finished optimizing %s', basename(currentFile))
55 await remove(backupFile)
56 } else {
57 console.log('Failed to optimize %s, restoring original', basename(currentFile))
58 move(backupFile, currentFile, { overwrite: true })
59 await video.createTorrentAndSetInfoHash(file)
60 await file.save()
61 }
62 }
63 }
64 }
65
66 console.log('Finished optimizing videos')
67}
diff --git a/scripts/prune-storage.ts b/scripts/prune-storage.ts
index 4088fa700..c9e4dbd4b 100755
--- a/scripts/prune-storage.ts
+++ b/scripts/prune-storage.ts
@@ -5,6 +5,7 @@ import { VideoModel } from '../server/models/video/video'
5import { initDatabaseModels } from '../server/initializers' 5import { initDatabaseModels } from '../server/initializers'
6import { remove, readdir } from 'fs-extra' 6import { remove, readdir } from 'fs-extra'
7import { VideoRedundancyModel } from '../server/models/redundancy/video-redundancy' 7import { VideoRedundancyModel } from '../server/models/redundancy/video-redundancy'
8import { getUUIDFromFilename } from '../server/helpers/utils'
8 9
9run() 10run()
10 .then(() => process.exit(0)) 11 .then(() => process.exit(0))
@@ -18,7 +19,8 @@ async function run () {
18 19
19 const storageOnlyOwnedToPrune = [ 20 const storageOnlyOwnedToPrune = [
20 CONFIG.STORAGE.VIDEOS_DIR, 21 CONFIG.STORAGE.VIDEOS_DIR,
21 CONFIG.STORAGE.TORRENTS_DIR 22 CONFIG.STORAGE.TORRENTS_DIR,
23 CONFIG.STORAGE.REDUNDANCY_DIR
22 ] 24 ]
23 25
24 const storageForAllToPrune = [ 26 const storageForAllToPrune = [
@@ -35,6 +37,9 @@ async function run () {
35 toDelete = toDelete.concat(await pruneDirectory(directory, false)) 37 toDelete = toDelete.concat(await pruneDirectory(directory, false))
36 } 38 }
37 39
40 const tmpFiles = await readdir(CONFIG.STORAGE.TMP_DIR)
41 toDelete = toDelete.concat(tmpFiles.map(t => join(CONFIG.STORAGE.TMP_DIR, t)))
42
38 if (toDelete.length === 0) { 43 if (toDelete.length === 0) {
39 console.log('No files to delete.') 44 console.log('No files to delete.')
40 return 45 return
@@ -82,15 +87,6 @@ async function pruneDirectory (directory: string, onlyOwned = false) {
82 return toDelete 87 return toDelete
83} 88}
84 89
85function getUUIDFromFilename (filename: string) {
86 const regex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
87 const result = filename.match(regex)
88
89 if (!result || Array.isArray(result) === false) return null
90
91 return result[0]
92}
93
94async function askConfirmation () { 90async function askConfirmation () {
95 return new Promise((res, rej) => { 91 return new Promise((res, rej) => {
96 prompt.start() 92 prompt.start()
@@ -99,6 +95,7 @@ async function askConfirmation () {
99 confirm: { 95 confirm: {
100 type: 'string', 96 type: 'string',
101 description: 'These following unused files can be deleted, but please check your backups first (bugs happen).' + 97 description: 'These following unused files can be deleted, but please check your backups first (bugs happen).' +
98 ' Notice PeerTube must have been stopped when your ran this script.' +
102 ' Can we delete these files?', 99 ' Can we delete these files?',
103 default: 'n', 100 default: 'n',
104 required: true 101 required: true
diff --git a/scripts/release.sh b/scripts/release.sh
index 7b577ef35..08061fe6f 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -27,15 +27,15 @@ fi
27maintainer_public_key=${MAINTAINER_GPG:-"583A612D890159BE"} 27maintainer_public_key=${MAINTAINER_GPG:-"583A612D890159BE"}
28 28
29branch=$(git symbolic-ref --short -q HEAD) 29branch=$(git symbolic-ref --short -q HEAD)
30if [ "$branch" != "develop" ] && [[ "$branch" != feature/* ]]; then 30if [ "$branch" != "develop" ] && [[ "$branch" != release/* ]]; then
31 echo "Need to be on develop or release branch." 31 echo "Need to be on develop or release branch."
32 exit -1 32 exit -1
33fi 33fi
34 34
35version="v$1" 35version="v$1"
36github_prerelease_option="" 36github_prerelease_option=""
37if [[ "$version" = *".pre."* ]]; then 37if [[ "$version" = *"-alpha."* ]] || [[ "$version" = *"-beta."* ]] || [[ "$version" = *"-rc."* ]]; then
38 echo "This is a pre-release." 38 echo -e "This is a pre-release.\n"
39 github_prerelease_option="--pre-release" 39 github_prerelease_option="--pre-release"
40fi 40fi
41 41
@@ -43,9 +43,9 @@ directory_name="peertube-$version"
43zip_name="peertube-$version.zip" 43zip_name="peertube-$version.zip"
44tar_name="peertube-$version.tar.xz" 44tar_name="peertube-$version.tar.xz"
45 45
46changelog=$(awk -v version="$version" '/## v/ { printit = $2 == version }; printit;' CHANGELOG.md | grep -v "$version" | sed '1{/^$/d}') 46changelog=$(awk -v version="$version" '/## v/ { printit = $2 == version }; printit;' CHANGELOG.md | grep -v "## $version" | sed '1{/^$/d}')
47 47
48printf "Changelog will be:\\n%s\\n" "$changelog" 48printf "Changelog will be:\\n\\n%s\\n\\n" "$changelog"
49 49
50read -p "Are you sure to release? " -n 1 -r 50read -p "Are you sure to release? " -n 1 -r
51echo 51echo
@@ -60,7 +60,9 @@ fi
60 60
61npm version -f --no-git-tag-version --no-commit-hooks "$1" 61npm version -f --no-git-tag-version --no-commit-hooks "$1"
62 62
63git commit package.json client/package.json -m "Bumped to version $version" 63./scripts/openapi-peertube-version.sh
64
65git commit package.json client/package.json ./support/doc/api/openapi.yaml -m "Bumped to version $version"
64git tag -s -a "$version" -m "$version" 66git tag -s -a "$version" -m "$version"
65 67
66npm run build 68npm run build
diff --git a/scripts/travis.sh b/scripts/travis.sh
index 5d195f902..509b40d87 100755
--- a/scripts/travis.sh
+++ b/scripts/travis.sh
@@ -11,23 +11,25 @@ killall -q peertube || true
11 11
12if [ "$1" = "misc" ]; then 12if [ "$1" = "misc" ]; then
13 npm run build -- --light-fr 13 npm run build -- --light-fr
14 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/client.ts server/tests/activitypub.ts \ 14 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/client.ts \
15 server/tests/feeds/index.ts server/tests/misc-endpoints.ts 15 server/tests/feeds/index.ts \
16elif [ "$1" = "api" ]; then 16 server/tests/misc-endpoints.ts \
17 npm run build:server 17 server/tests/helpers/index.ts
18 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index.ts
19elif [ "$1" = "cli" ]; then 18elif [ "$1" = "cli" ]; then
20 npm run build:server 19 npm run build:server
21 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/cli/index.ts 20 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/cli/index.ts
22elif [ "$1" = "api-1" ]; then 21elif [ "$1" = "api-1" ]; then
23 npm run build:server 22 npm run build:server
24 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-1.ts 23 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-1.ts
25elif [ "$1" = "api-2" ]; then 24elif [ "$1" = "api-2" ]; then
26 npm run build:server 25 npm run build:server
27 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-2.ts 26 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-2.ts
28elif [ "$1" = "api-3" ]; then 27elif [ "$1" = "api-3" ]; then
29 npm run build:server 28 npm run build:server
30 mocha --timeout 5000 --exit --require ts-node/register/type-check --bail server/tests/api/index-3.ts 29 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-3.ts
30elif [ "$1" = "api-4" ]; then
31 npm run build:server
32 mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/api/index-4.ts
31elif [ "$1" = "lint" ]; then 33elif [ "$1" = "lint" ]; then
32 npm run tslint -- --project ./tsconfig.json -c ./tslint.json server.ts "server/**/*.ts" "shared/**/*.ts" 34 npm run tslint -- --project ./tsconfig.json -c ./tslint.json server.ts "server/**/*.ts" "shared/**/*.ts"
33 35
diff --git a/scripts/update-host.ts b/scripts/update-host.ts
index 1dc19664d..64eba867a 100755
--- a/scripts/update-host.ts
+++ b/scripts/update-host.ts
@@ -4,7 +4,7 @@ import { VideoModel } from '../server/models/video/video'
4import { ActorModel } from '../server/models/activitypub/actor' 4import { ActorModel } from '../server/models/activitypub/actor'
5import { 5import {
6 getAccountActivityPubUrl, 6 getAccountActivityPubUrl,
7 getAnnounceActivityPubUrl, 7 getVideoAnnounceActivityPubUrl,
8 getVideoActivityPubUrl, getVideoChannelActivityPubUrl, 8 getVideoActivityPubUrl, getVideoChannelActivityPubUrl,
9 getVideoCommentActivityPubUrl 9 getVideoCommentActivityPubUrl
10} from '../server/lib/activitypub' 10} from '../server/lib/activitypub'
@@ -13,6 +13,7 @@ import { VideoCommentModel } from '../server/models/video/video-comment'
13import { getServerActor } from '../server/helpers/utils' 13import { getServerActor } from '../server/helpers/utils'
14import { AccountModel } from '../server/models/account/account' 14import { AccountModel } from '../server/models/account/account'
15import { VideoChannelModel } from '../server/models/video/video-channel' 15import { VideoChannelModel } from '../server/models/video/video-channel'
16import { VideoStreamingPlaylistModel } from '../server/models/video/video-streaming-playlist'
16 17
17run() 18run()
18 .then(() => process.exit(0)) 19 .then(() => process.exit(0))
@@ -78,7 +79,7 @@ async function run () {
78 79
79 console.log('Updating video share ' + videoShare.url) 80 console.log('Updating video share ' + videoShare.url)
80 81
81 videoShare.url = getAnnounceActivityPubUrl(videoShare.Video.url, videoShare.Actor) 82 videoShare.url = getVideoAnnounceActivityPubUrl(videoShare.Actor, videoShare.Video)
82 await videoShare.save() 83 await videoShare.save()
83 } 84 }
84 85
@@ -109,11 +110,9 @@ async function run () {
109 110
110 console.log('Updating video and torrent files.') 111 console.log('Updating video and torrent files.')
111 112
112 const videos = await VideoModel.list() 113 const videos = await VideoModel.listLocal()
113 for (const video of videos) { 114 for (const video of videos) {
114 if (video.isOwned() === false) continue 115 console.log('Updating video ' + video.uuid)
115
116 console.log('Updated video ' + video.uuid)
117 116
118 video.url = getVideoActivityPubUrl(video) 117 video.url = getVideoActivityPubUrl(video)
119 await video.save() 118 await video.save()
@@ -122,5 +121,12 @@ async function run () {
122 console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid) 121 console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid)
123 await video.createTorrentAndSetInfoHash(file) 122 await video.createTorrentAndSetInfoHash(file)
124 } 123 }
124
125 for (const playlist of video.VideoStreamingPlaylists) {
126 playlist.playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
127 playlist.segmentsSha256Url = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid)
128
129 await playlist.save()
130 }
125 } 131 }
126} 132}
diff --git a/scripts/upgrade.sh b/scripts/upgrade.sh
index b29615fb1..4f7c58edd 100755
--- a/scripts/upgrade.sh
+++ b/scripts/upgrade.sh
@@ -20,11 +20,26 @@ if [ ! -e "$PEERTUBE_PATH/versions" -o ! -e "$PEERTUBE_PATH/config/production.ya
20 exit 1 20 exit 1
21fi 21fi
22 22
23if [ -x "$(command -v awk)" ] && [ -x "$(command -v sed)" ] ; then
24 REMAINING=$(df -k $PEERTUBE_PATH | awk '{ print $4}' | sed -n 2p)
25 ONE_GB=$((1024 * 1024))
26 if [ "$REMAINING" -lt "$ONE_GB" ]; then
27 echo "Error - not enough free space for upgrading"
28 echo ""
29 echo "Make sure you have at least 1 GB of free space in $PEERTUBE_PATH"
30 exit 1
31 fi
32fi
23 33
24# Backup database 34# Backup database
25SQL_BACKUP_PATH="$PEERTUBE_PATH/backup/sql-peertube_prod-$(date +"%Y%m%d-%H%M").bak" 35SQL_BACKUP_PATH="$PEERTUBE_PATH/backup/sql-peertube_prod-$(date +"%Y%m%d-%H%M").bak"
36DB_USER=$(node -e "console.log(require('js-yaml').safeLoad(fs.readFileSync('$PEERTUBE_PATH/config/production.yaml', 'utf8'))['database']['username'])")
37DB_PASS=$(node -e "console.log(require('js-yaml').safeLoad(fs.readFileSync('$PEERTUBE_PATH/config/production.yaml', 'utf8'))['database']['password'])")
38DB_HOST=$(node -e "console.log(require('js-yaml').safeLoad(fs.readFileSync('$PEERTUBE_PATH/config/production.yaml', 'utf8'))['database']['hostname'])")
39DB_SUFFIX=$(node -e "console.log(require('js-yaml').safeLoad(fs.readFileSync('$PEERTUBE_PATH/config/production.yaml', 'utf8'))['database']['suffix'])")
26mkdir -p $PEERTUBE_PATH/backup 40mkdir -p $PEERTUBE_PATH/backup
27pg_dump -U peertube -W -h localhost -F c peertube_prod -f "$SQL_BACKUP_PATH" 41
42PGPASSWORD=$DB_PASS pg_dump -U $DB_USER -h $DB_HOST -F c "peertube${DB_SUFFIX}" -f "$SQL_BACKUP_PATH"
28 43
29# If there is a pre-release, give the user a choice which one to install. 44# If there is a pre-release, give the user a choice which one to install.
30RELEASE_VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) 45RELEASE_VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4)
diff --git a/server.ts b/server.ts
index 59fb820b4..b50151859 100644
--- a/server.ts
+++ b/server.ts
@@ -16,6 +16,7 @@ import * as cookieParser from 'cookie-parser'
16import * as helmet from 'helmet' 16import * as helmet from 'helmet'
17import * as useragent from 'useragent' 17import * as useragent from 'useragent'
18import * as anonymize from 'ip-anonymize' 18import * as anonymize from 'ip-anonymize'
19import * as cli from 'commander'
19 20
20process.title = 'peertube' 21process.title = 'peertube'
21 22
@@ -52,6 +53,9 @@ if (errorMessage !== null) {
52app.set('trust proxy', CONFIG.TRUST_PROXY) 53app.set('trust proxy', CONFIG.TRUST_PROXY)
53 54
54// Security middleware 55// Security middleware
56import { baseCSP } from './server/middlewares'
57
58app.use(baseCSP)
55app.use(helmet({ 59app.use(helmet({
56 frameguard: { 60 frameguard: {
57 action: 'deny' // we only allow it for /videos/embed, see server/controllers/client.ts 61 action: 'deny' // we only allow it for /videos/embed, see server/controllers/client.ts
@@ -86,18 +90,24 @@ import {
86 servicesRouter, 90 servicesRouter,
87 webfingerRouter, 91 webfingerRouter,
88 trackerRouter, 92 trackerRouter,
89 createWebsocketServer 93 createWebsocketTrackerServer, botsRouter
90} from './server/controllers' 94} from './server/controllers'
91import { advertiseDoNotTrack } from './server/middlewares/dnt' 95import { advertiseDoNotTrack } from './server/middlewares/dnt'
92import { Redis } from './server/lib/redis' 96import { Redis } from './server/lib/redis'
93import { BadActorFollowScheduler } from './server/lib/schedulers/bad-actor-follow-scheduler' 97import { ActorFollowScheduler } from './server/lib/schedulers/actor-follow-scheduler'
94import { RemoveOldJobsScheduler } from './server/lib/schedulers/remove-old-jobs-scheduler' 98import { RemoveOldJobsScheduler } from './server/lib/schedulers/remove-old-jobs-scheduler'
95import { UpdateVideosScheduler } from './server/lib/schedulers/update-videos-scheduler' 99import { UpdateVideosScheduler } from './server/lib/schedulers/update-videos-scheduler'
96import { YoutubeDlUpdateScheduler } from './server/lib/schedulers/youtube-dl-update-scheduler' 100import { YoutubeDlUpdateScheduler } from './server/lib/schedulers/youtube-dl-update-scheduler'
97import { VideosRedundancyScheduler } from './server/lib/schedulers/videos-redundancy-scheduler' 101import { VideosRedundancyScheduler } from './server/lib/schedulers/videos-redundancy-scheduler'
102import { isHTTPSignatureDigestValid } from './server/helpers/peertube-crypto'
103import { PeerTubeSocket } from './server/lib/peertube-socket'
98 104
99// ----------- Command line ----------- 105// ----------- Command line -----------
100 106
107cli
108 .option('--no-client', 'Start PeerTube without client interface')
109 .parse(process.argv)
110
101// ----------- App ----------- 111// ----------- App -----------
102 112
103// Enable CORS for develop 113// Enable CORS for develop
@@ -126,7 +136,11 @@ app.use(morgan('combined', {
126app.use(bodyParser.urlencoded({ extended: false })) 136app.use(bodyParser.urlencoded({ extended: false }))
127app.use(bodyParser.json({ 137app.use(bodyParser.json({
128 type: [ 'application/json', 'application/*+json' ], 138 type: [ 'application/json', 'application/*+json' ],
129 limit: '500kb' 139 limit: '500kb',
140 verify: (req: express.Request, _, buf: Buffer) => {
141 const valid = isHTTPSignatureDigestValid(buf, req)
142 if (valid !== true) throw new Error('Invalid digest')
143 }
130})) 144}))
131// Cookies 145// Cookies
132app.use(cookieParser()) 146app.use(cookieParser())
@@ -146,12 +160,13 @@ app.use('/', activityPubRouter)
146app.use('/', feedsRouter) 160app.use('/', feedsRouter)
147app.use('/', webfingerRouter) 161app.use('/', webfingerRouter)
148app.use('/', trackerRouter) 162app.use('/', trackerRouter)
163app.use('/', botsRouter)
149 164
150// Static files 165// Static files
151app.use('/', staticRouter) 166app.use('/', staticRouter)
152 167
153// Client files, last valid routes! 168// Client files, last valid routes!
154app.use('/', clientsRouter) 169if (cli.client) app.use('/', clientsRouter)
155 170
156// ----------- Errors ----------- 171// ----------- Errors -----------
157 172
@@ -175,7 +190,7 @@ app.use(function (err, req, res, next) {
175 return res.status(err.status || 500).end() 190 return res.status(err.status || 500).end()
176}) 191})
177 192
178const server = createWebsocketServer(app) 193const server = createWebsocketTrackerServer(app)
179 194
180// ----------- Run ----------- 195// ----------- Run -----------
181 196
@@ -194,16 +209,18 @@ async function startApplication () {
194 209
195 // Email initialization 210 // Email initialization
196 Emailer.Instance.init() 211 Emailer.Instance.init()
197 await Emailer.Instance.checkConnectionOrDie()
198 212
199 await JobQueue.Instance.init() 213 await Promise.all([
214 Emailer.Instance.checkConnectionOrDie(),
215 JobQueue.Instance.init()
216 ])
200 217
201 // Caches initializations 218 // Caches initializations
202 VideosPreviewCache.Instance.init(CONFIG.CACHE.PREVIEWS.SIZE, CACHE.PREVIEWS.MAX_AGE) 219 VideosPreviewCache.Instance.init(CONFIG.CACHE.PREVIEWS.SIZE, CACHE.PREVIEWS.MAX_AGE)
203 VideosCaptionCache.Instance.init(CONFIG.CACHE.VIDEO_CAPTIONS.SIZE, CACHE.VIDEO_CAPTIONS.MAX_AGE) 220 VideosCaptionCache.Instance.init(CONFIG.CACHE.VIDEO_CAPTIONS.SIZE, CACHE.VIDEO_CAPTIONS.MAX_AGE)
204 221
205 // Enable Schedulers 222 // Enable Schedulers
206 BadActorFollowScheduler.Instance.enable() 223 ActorFollowScheduler.Instance.enable()
207 RemoveOldJobsScheduler.Instance.enable() 224 RemoveOldJobsScheduler.Instance.enable()
208 UpdateVideosScheduler.Instance.enable() 225 UpdateVideosScheduler.Instance.enable()
209 YoutubeDlUpdateScheduler.Instance.enable() 226 YoutubeDlUpdateScheduler.Instance.enable()
@@ -212,6 +229,8 @@ async function startApplication () {
212 // Redis initialization 229 // Redis initialization
213 Redis.Instance.init() 230 Redis.Instance.init()
214 231
232 PeerTubeSocket.Instance.init(server)
233
215 // Make server listening 234 // Make server listening
216 server.listen(port, hostname, () => { 235 server.listen(port, hostname, () => {
217 logger.info('Server listening on %s:%d', hostname, port) 236 logger.info('Server listening on %s:%d', hostname, port)
diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts
index 433186179..31c0a5fbd 100644
--- a/server/controllers/activitypub/client.ts
+++ b/server/controllers/activitypub/client.ts
@@ -3,7 +3,7 @@ import * as express from 'express'
3import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos' 3import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos'
4import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' 4import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub'
5import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers' 5import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers'
6import { buildAnnounceWithVideoAudience } from '../../lib/activitypub/send' 6import { buildAnnounceWithVideoAudience, buildLikeActivity } from '../../lib/activitypub/send'
7import { audiencify, getAudience } from '../../lib/activitypub/audience' 7import { audiencify, getAudience } from '../../lib/activitypub/audience'
8import { buildCreateActivity } from '../../lib/activitypub/send/send-create' 8import { buildCreateActivity } from '../../lib/activitypub/send/send-create'
9import { 9import {
@@ -11,9 +11,10 @@ import {
11 executeIfActivityPub, 11 executeIfActivityPub,
12 localAccountValidator, 12 localAccountValidator,
13 localVideoChannelValidator, 13 localVideoChannelValidator,
14 videosCustomGetValidator 14 videosCustomGetValidator,
15 videosShareValidator
15} from '../../middlewares' 16} from '../../middlewares'
16import { videoCommentGetValidator, videosGetValidator, videosShareValidator } from '../../middlewares/validators' 17import { getAccountVideoRateValidator, videoCommentGetValidator, videosGetValidator } from '../../middlewares/validators'
17import { AccountModel } from '../../models/account/account' 18import { AccountModel } from '../../models/account/account'
18import { ActorModel } from '../../models/activitypub/actor' 19import { ActorModel } from '../../models/activitypub/actor'
19import { ActorFollowModel } from '../../models/activitypub/actor-follow' 20import { ActorFollowModel } from '../../models/activitypub/actor-follow'
@@ -25,14 +26,17 @@ import { cacheRoute } from '../../middlewares/cache'
25import { activityPubResponse } from './utils' 26import { activityPubResponse } from './utils'
26import { AccountVideoRateModel } from '../../models/account/account-video-rate' 27import { AccountVideoRateModel } from '../../models/account/account-video-rate'
27import { 28import {
29 getRateUrl,
28 getVideoCommentsActivityPubUrl, 30 getVideoCommentsActivityPubUrl,
29 getVideoDislikesActivityPubUrl, 31 getVideoDislikesActivityPubUrl,
30 getVideoLikesActivityPubUrl, 32 getVideoLikesActivityPubUrl,
31 getVideoSharesActivityPubUrl 33 getVideoSharesActivityPubUrl
32} from '../../lib/activitypub' 34} from '../../lib/activitypub'
33import { VideoCaptionModel } from '../../models/video/video-caption' 35import { VideoCaptionModel } from '../../models/video/video-caption'
34import { videoRedundancyGetValidator } from '../../middlewares/validators/redundancy' 36import { videoFileRedundancyGetValidator, videoPlaylistRedundancyGetValidator } from '../../middlewares/validators/redundancy'
35import { getServerActor } from '../../helpers/utils' 37import { getServerActor } from '../../helpers/utils'
38import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
39import { buildDislikeActivity } from '../../lib/activitypub/send/send-dislike'
36 40
37const activityPubClientRouter = express.Router() 41const activityPubClientRouter = express.Router()
38 42
@@ -48,21 +52,29 @@ activityPubClientRouter.get('/accounts?/:name/following',
48 executeIfActivityPub(asyncMiddleware(localAccountValidator)), 52 executeIfActivityPub(asyncMiddleware(localAccountValidator)),
49 executeIfActivityPub(asyncMiddleware(accountFollowingController)) 53 executeIfActivityPub(asyncMiddleware(accountFollowingController))
50) 54)
55activityPubClientRouter.get('/accounts?/:name/likes/:videoId',
56 executeIfActivityPub(asyncMiddleware(getAccountVideoRateValidator('like'))),
57 executeIfActivityPub(getAccountVideoRate('like'))
58)
59activityPubClientRouter.get('/accounts?/:name/dislikes/:videoId',
60 executeIfActivityPub(asyncMiddleware(getAccountVideoRateValidator('dislike'))),
61 executeIfActivityPub(getAccountVideoRate('dislike'))
62)
51 63
52activityPubClientRouter.get('/videos/watch/:id', 64activityPubClientRouter.get('/videos/watch/:id',
53 executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))), 65 executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))),
54 executeIfActivityPub(asyncMiddleware(videosGetValidator)), 66 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
55 executeIfActivityPub(asyncMiddleware(videoController)) 67 executeIfActivityPub(asyncMiddleware(videoController))
56) 68)
57activityPubClientRouter.get('/videos/watch/:id/activity', 69activityPubClientRouter.get('/videos/watch/:id/activity',
58 executeIfActivityPub(asyncMiddleware(videosGetValidator)), 70 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
59 executeIfActivityPub(asyncMiddleware(videoController)) 71 executeIfActivityPub(asyncMiddleware(videoController))
60) 72)
61activityPubClientRouter.get('/videos/watch/:id/announces', 73activityPubClientRouter.get('/videos/watch/:id/announces',
62 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video'))), 74 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video'))),
63 executeIfActivityPub(asyncMiddleware(videoAnnouncesController)) 75 executeIfActivityPub(asyncMiddleware(videoAnnouncesController))
64) 76)
65activityPubClientRouter.get('/videos/watch/:id/announces/:accountId', 77activityPubClientRouter.get('/videos/watch/:id/announces/:actorId',
66 executeIfActivityPub(asyncMiddleware(videosShareValidator)), 78 executeIfActivityPub(asyncMiddleware(videosShareValidator)),
67 executeIfActivityPub(asyncMiddleware(videoAnnounceController)) 79 executeIfActivityPub(asyncMiddleware(videoAnnounceController))
68) 80)
@@ -101,7 +113,11 @@ activityPubClientRouter.get('/video-channels/:name/following',
101) 113)
102 114
103activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?', 115activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?',
104 executeIfActivityPub(asyncMiddleware(videoRedundancyGetValidator)), 116 executeIfActivityPub(asyncMiddleware(videoFileRedundancyGetValidator)),
117 executeIfActivityPub(asyncMiddleware(videoRedundancyController))
118)
119activityPubClientRouter.get('/redundancy/video-playlists/:streamingPlaylistType/:videoId',
120 executeIfActivityPub(asyncMiddleware(videoPlaylistRedundancyGetValidator)),
105 executeIfActivityPub(asyncMiddleware(videoRedundancyController)) 121 executeIfActivityPub(asyncMiddleware(videoRedundancyController))
106) 122)
107 123
@@ -133,8 +149,25 @@ async function accountFollowingController (req: express.Request, res: express.Re
133 return activityPubResponse(activityPubContextify(activityPubResult), res) 149 return activityPubResponse(activityPubContextify(activityPubResult), res)
134} 150}
135 151
136async function videoController (req: express.Request, res: express.Response, next: express.NextFunction) { 152function getAccountVideoRate (rateType: VideoRateType) {
137 const video: VideoModel = res.locals.video 153 return (req: express.Request, res: express.Response) => {
154 const accountVideoRate: AccountVideoRateModel = res.locals.accountVideoRate
155
156 const byActor = accountVideoRate.Account.Actor
157 const url = getRateUrl(rateType, byActor, accountVideoRate.Video)
158 const APObject = rateType === 'like'
159 ? buildLikeActivity(url, byActor, accountVideoRate.Video)
160 : buildDislikeActivity(url, byActor, accountVideoRate.Video)
161
162 return activityPubResponse(activityPubContextify(APObject), res)
163 }
164}
165
166async function videoController (req: express.Request, res: express.Response) {
167 // We need more attributes
168 const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id)
169
170 if (video.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(video.url)
138 171
139 // We need captions to render AP object 172 // We need captions to render AP object
140 video.VideoCaptions = await VideoCaptionModel.listVideoCaptions(video.id) 173 video.VideoCaptions = await VideoCaptionModel.listVideoCaptions(video.id)
@@ -150,14 +183,17 @@ async function videoController (req: express.Request, res: express.Response, nex
150 return activityPubResponse(activityPubContextify(videoObject), res) 183 return activityPubResponse(activityPubContextify(videoObject), res)
151} 184}
152 185
153async function videoAnnounceController (req: express.Request, res: express.Response, next: express.NextFunction) { 186async function videoAnnounceController (req: express.Request, res: express.Response) {
154 const share = res.locals.videoShare as VideoShareModel 187 const share = res.locals.videoShare as VideoShareModel
188
189 if (share.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(share.url)
190
155 const { activity } = await buildAnnounceWithVideoAudience(share.Actor, share, res.locals.video, undefined) 191 const { activity } = await buildAnnounceWithVideoAudience(share.Actor, share, res.locals.video, undefined)
156 192
157 return activityPubResponse(activityPubContextify(activity), res) 193 return activityPubResponse(activityPubContextify(activity), res)
158} 194}
159 195
160async function videoAnnouncesController (req: express.Request, res: express.Response, next: express.NextFunction) { 196async function videoAnnouncesController (req: express.Request, res: express.Response) {
161 const video: VideoModel = res.locals.video 197 const video: VideoModel = res.locals.video
162 198
163 const handler = async (start: number, count: number) => { 199 const handler = async (start: number, count: number) => {
@@ -172,21 +208,21 @@ async function videoAnnouncesController (req: express.Request, res: express.Resp
172 return activityPubResponse(activityPubContextify(json), res) 208 return activityPubResponse(activityPubContextify(json), res)
173} 209}
174 210
175async function videoLikesController (req: express.Request, res: express.Response, next: express.NextFunction) { 211async function videoLikesController (req: express.Request, res: express.Response) {
176 const video: VideoModel = res.locals.video 212 const video: VideoModel = res.locals.video
177 const json = await videoRates(req, 'like', video, getVideoLikesActivityPubUrl(video)) 213 const json = await videoRates(req, 'like', video, getVideoLikesActivityPubUrl(video))
178 214
179 return activityPubResponse(activityPubContextify(json), res) 215 return activityPubResponse(activityPubContextify(json), res)
180} 216}
181 217
182async function videoDislikesController (req: express.Request, res: express.Response, next: express.NextFunction) { 218async function videoDislikesController (req: express.Request, res: express.Response) {
183 const video: VideoModel = res.locals.video 219 const video: VideoModel = res.locals.video
184 const json = await videoRates(req, 'dislike', video, getVideoDislikesActivityPubUrl(video)) 220 const json = await videoRates(req, 'dislike', video, getVideoDislikesActivityPubUrl(video))
185 221
186 return activityPubResponse(activityPubContextify(json), res) 222 return activityPubResponse(activityPubContextify(json), res)
187} 223}
188 224
189async function videoCommentsController (req: express.Request, res: express.Response, next: express.NextFunction) { 225async function videoCommentsController (req: express.Request, res: express.Response) {
190 const video: VideoModel = res.locals.video 226 const video: VideoModel = res.locals.video
191 227
192 const handler = async (start: number, count: number) => { 228 const handler = async (start: number, count: number) => {
@@ -201,29 +237,31 @@ async function videoCommentsController (req: express.Request, res: express.Respo
201 return activityPubResponse(activityPubContextify(json), res) 237 return activityPubResponse(activityPubContextify(json), res)
202} 238}
203 239
204async function videoChannelController (req: express.Request, res: express.Response, next: express.NextFunction) { 240async function videoChannelController (req: express.Request, res: express.Response) {
205 const videoChannel: VideoChannelModel = res.locals.videoChannel 241 const videoChannel: VideoChannelModel = res.locals.videoChannel
206 242
207 return activityPubResponse(activityPubContextify(videoChannel.toActivityPubObject()), res) 243 return activityPubResponse(activityPubContextify(videoChannel.toActivityPubObject()), res)
208} 244}
209 245
210async function videoChannelFollowersController (req: express.Request, res: express.Response, next: express.NextFunction) { 246async function videoChannelFollowersController (req: express.Request, res: express.Response) {
211 const videoChannel: VideoChannelModel = res.locals.videoChannel 247 const videoChannel: VideoChannelModel = res.locals.videoChannel
212 const activityPubResult = await actorFollowers(req, videoChannel.Actor) 248 const activityPubResult = await actorFollowers(req, videoChannel.Actor)
213 249
214 return activityPubResponse(activityPubContextify(activityPubResult), res) 250 return activityPubResponse(activityPubContextify(activityPubResult), res)
215} 251}
216 252
217async function videoChannelFollowingController (req: express.Request, res: express.Response, next: express.NextFunction) { 253async function videoChannelFollowingController (req: express.Request, res: express.Response) {
218 const videoChannel: VideoChannelModel = res.locals.videoChannel 254 const videoChannel: VideoChannelModel = res.locals.videoChannel
219 const activityPubResult = await actorFollowing(req, videoChannel.Actor) 255 const activityPubResult = await actorFollowing(req, videoChannel.Actor)
220 256
221 return activityPubResponse(activityPubContextify(activityPubResult), res) 257 return activityPubResponse(activityPubContextify(activityPubResult), res)
222} 258}
223 259
224async function videoCommentController (req: express.Request, res: express.Response, next: express.NextFunction) { 260async function videoCommentController (req: express.Request, res: express.Response) {
225 const videoComment: VideoCommentModel = res.locals.videoComment 261 const videoComment: VideoCommentModel = res.locals.videoComment
226 262
263 if (videoComment.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(videoComment.url)
264
227 const threadParentComments = await VideoCommentModel.listThreadParentComments(videoComment, undefined) 265 const threadParentComments = await VideoCommentModel.listThreadParentComments(videoComment, undefined)
228 const isPublic = true // Comments are always public 266 const isPublic = true // Comments are always public
229 const audience = getAudience(videoComment.Account.Actor, isPublic) 267 const audience = getAudience(videoComment.Account.Actor, isPublic)
@@ -239,7 +277,9 @@ async function videoCommentController (req: express.Request, res: express.Respon
239} 277}
240 278
241async function videoRedundancyController (req: express.Request, res: express.Response) { 279async function videoRedundancyController (req: express.Request, res: express.Response) {
242 const videoRedundancy = res.locals.videoRedundancy 280 const videoRedundancy: VideoRedundancyModel = res.locals.videoRedundancy
281 if (videoRedundancy.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(videoRedundancy.url)
282
243 const serverActor = await getServerActor() 283 const serverActor = await getServerActor()
244 284
245 const audience = getAudience(serverActor) 285 const audience = getAudience(serverActor)
@@ -260,7 +300,7 @@ async function actorFollowing (req: express.Request, actor: ActorModel) {
260 return ActorFollowModel.listAcceptedFollowingUrlsForApi([ actor.id ], undefined, start, count) 300 return ActorFollowModel.listAcceptedFollowingUrlsForApi([ actor.id ], undefined, start, count)
261 } 301 }
262 302
263 return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, handler, req.query.page) 303 return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.path, handler, req.query.page)
264} 304}
265 305
266async function actorFollowers (req: express.Request, actor: ActorModel) { 306async function actorFollowers (req: express.Request, actor: ActorModel) {
@@ -268,7 +308,7 @@ async function actorFollowers (req: express.Request, actor: ActorModel) {
268 return ActorFollowModel.listAcceptedFollowerUrlsForApi([ actor.id ], undefined, start, count) 308 return ActorFollowModel.listAcceptedFollowerUrlsForApi([ actor.id ], undefined, start, count)
269 } 309 }
270 310
271 return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.url, handler, req.query.page) 311 return activityPubCollectionPagination(CONFIG.WEBSERVER.URL + req.path, handler, req.query.page)
272} 312}
273 313
274function videoRates (req: express.Request, rateType: VideoRateType, video: VideoModel, url: string) { 314function videoRates (req: express.Request, rateType: VideoRateType, video: VideoModel, url: string) {
@@ -276,7 +316,7 @@ function videoRates (req: express.Request, rateType: VideoRateType, video: Video
276 const result = await AccountVideoRateModel.listAndCountAccountUrlsByVideoId(rateType, video.id, start, count) 316 const result = await AccountVideoRateModel.listAndCountAccountUrlsByVideoId(rateType, video.id, start, count)
277 return { 317 return {
278 total: result.count, 318 total: result.count,
279 data: result.rows.map(r => r.Account.Actor.url) 319 data: result.rows.map(r => r.url)
280 } 320 }
281 } 321 }
282 return activityPubCollectionPagination(url, handler, req.query.page) 322 return activityPubCollectionPagination(url, handler, req.query.page)
diff --git a/server/controllers/activitypub/inbox.ts b/server/controllers/activitypub/inbox.ts
index 738d155eb..f0e65015b 100644
--- a/server/controllers/activitypub/inbox.ts
+++ b/server/controllers/activitypub/inbox.ts
@@ -43,11 +43,13 @@ export {
43// --------------------------------------------------------------------------- 43// ---------------------------------------------------------------------------
44 44
45const inboxQueue = queue<{ activities: Activity[], signatureActor?: ActorModel, inboxActor?: ActorModel }, Error>((task, cb) => { 45const inboxQueue = queue<{ activities: Activity[], signatureActor?: ActorModel, inboxActor?: ActorModel }, Error>((task, cb) => {
46 processActivities(task.activities, task.signatureActor, task.inboxActor) 46 const options = { signatureActor: task.signatureActor, inboxActor: task.inboxActor }
47
48 processActivities(task.activities, options)
47 .then(() => cb()) 49 .then(() => cb())
48}) 50})
49 51
50function inboxController (req: express.Request, res: express.Response, next: express.NextFunction) { 52function inboxController (req: express.Request, res: express.Response) {
51 const rootActivity: RootActivity = req.body 53 const rootActivity: RootActivity = req.body
52 let activities: Activity[] = [] 54 let activities: Activity[] = []
53 55
diff --git a/server/controllers/api/accounts.ts b/server/controllers/api/accounts.ts
index b7691ccba..8c0237203 100644
--- a/server/controllers/api/accounts.ts
+++ b/server/controllers/api/accounts.ts
@@ -1,7 +1,8 @@
1import * as express from 'express' 1import * as express from 'express'
2import { getFormattedObjects } from '../../helpers/utils' 2import { getFormattedObjects } from '../../helpers/utils'
3import { 3import {
4 asyncMiddleware, commonVideosFiltersValidator, 4 asyncMiddleware,
5 commonVideosFiltersValidator,
5 listVideoAccountChannelsValidator, 6 listVideoAccountChannelsValidator,
6 optionalAuthenticate, 7 optionalAuthenticate,
7 paginationValidator, 8 paginationValidator,
@@ -13,6 +14,8 @@ import { AccountModel } from '../../models/account/account'
13import { VideoModel } from '../../models/video/video' 14import { VideoModel } from '../../models/video/video'
14import { buildNSFWFilter, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils' 15import { buildNSFWFilter, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
15import { VideoChannelModel } from '../../models/video/video-channel' 16import { VideoChannelModel } from '../../models/video/video-channel'
17import { JobQueue } from '../../lib/job-queue'
18import { logger } from '../../helpers/logger'
16 19
17const accountsRouter = express.Router() 20const accountsRouter = express.Router()
18 21
@@ -56,6 +59,11 @@ export {
56function getAccount (req: express.Request, res: express.Response, next: express.NextFunction) { 59function getAccount (req: express.Request, res: express.Response, next: express.NextFunction) {
57 const account: AccountModel = res.locals.account 60 const account: AccountModel = res.locals.account
58 61
62 if (account.isOutdated()) {
63 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: account.Actor.url } })
64 .catch(err => logger.error('Cannot create AP refresher job for actor %s.', account.Actor.url, { err }))
65 }
66
59 return res.json(account.toFormattedJSON()) 67 return res.json(account.toFormattedJSON())
60} 68}
61 69
@@ -73,10 +81,10 @@ async function listVideoAccountChannels (req: express.Request, res: express.Resp
73 81
74async function listAccountVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 82async function listAccountVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
75 const account: AccountModel = res.locals.account 83 const account: AccountModel = res.locals.account
76 const actorId = isUserAbleToSearchRemoteURI(res) ? null : undefined 84 const followerActorId = isUserAbleToSearchRemoteURI(res) ? null : undefined
77 85
78 const resultList = await VideoModel.listForApi({ 86 const resultList = await VideoModel.listForApi({
79 actorId, 87 followerActorId,
80 start: req.query.start, 88 start: req.query.start,
81 count: req.query.count, 89 count: req.query.count,
82 sort: req.query.sort, 90 sort: req.query.sort,
@@ -86,9 +94,11 @@ async function listAccountVideos (req: express.Request, res: express.Response, n
86 languageOneOf: req.query.languageOneOf, 94 languageOneOf: req.query.languageOneOf,
87 tagsOneOf: req.query.tagsOneOf, 95 tagsOneOf: req.query.tagsOneOf,
88 tagsAllOf: req.query.tagsAllOf, 96 tagsAllOf: req.query.tagsAllOf,
97 filter: req.query.filter,
89 nsfw: buildNSFWFilter(res, req.query.nsfw), 98 nsfw: buildNSFWFilter(res, req.query.nsfw),
90 withFiles: false, 99 withFiles: false,
91 accountId: account.id 100 accountId: account.id,
101 user: res.locals.oauth ? res.locals.oauth.token.User : undefined
92 }) 102 })
93 103
94 return res.json(getFormattedObjects(resultList.data, resultList.total)) 104 return res.json(getFormattedObjects(resultList.data, resultList.total))
diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts
index 03c1cec7b..1f3341bc0 100644
--- a/server/controllers/api/config.ts
+++ b/server/controllers/api/config.ts
@@ -1,5 +1,5 @@
1import * as express from 'express' 1import * as express from 'express'
2import { omit } from 'lodash' 2import { snakeCase } from 'lodash'
3import { ServerConfig, UserRight } from '../../../shared' 3import { ServerConfig, UserRight } from '../../../shared'
4import { About } from '../../../shared/models/server/about.model' 4import { About } from '../../../shared/models/server/about.model'
5import { CustomConfig } from '../../../shared/models/server/custom-config.model' 5import { CustomConfig } from '../../../shared/models/server/custom-config.model'
@@ -10,7 +10,10 @@ import { customConfigUpdateValidator } from '../../middlewares/validators/config
10import { ClientHtml } from '../../lib/client-html' 10import { ClientHtml } from '../../lib/client-html'
11import { auditLoggerFactory, CustomConfigAuditView, getAuditIdFromRes } from '../../helpers/audit-logger' 11import { auditLoggerFactory, CustomConfigAuditView, getAuditIdFromRes } from '../../helpers/audit-logger'
12import { remove, writeJSON } from 'fs-extra' 12import { remove, writeJSON } from 'fs-extra'
13import { getVersion } from '../../helpers/utils' 13import { getServerCommit } from '../../helpers/utils'
14import { Emailer } from '../../lib/emailer'
15import { isNumeric } from 'validator'
16import { objectConverter } from '../../helpers/core-utils'
14 17
15const packageJSON = require('../../../../package.json') 18const packageJSON = require('../../../../package.json')
16const configRouter = express.Router() 19const configRouter = express.Router()
@@ -40,11 +43,11 @@ configRouter.delete('/custom',
40) 43)
41 44
42let serverCommit: string 45let serverCommit: string
43async function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) { 46async function getConfig (req: express.Request, res: express.Response) {
44 const allowed = await isSignupAllowed() 47 const allowed = await isSignupAllowed()
45 const allowedForCurrentIP = isSignupAllowedForCurrentIP(req.ip) 48 const allowedForCurrentIP = isSignupAllowedForCurrentIP(req.ip)
46 serverCommit = (serverCommit) ? serverCommit : await getVersion() 49
47 if (serverCommit === packageJSON.version) serverCommit = '' 50 if (serverCommit === undefined) serverCommit = await getServerCommit()
48 51
49 const enabledResolutions = Object.keys(CONFIG.TRANSCODING.RESOLUTIONS) 52 const enabledResolutions = Object.keys(CONFIG.TRANSCODING.RESOLUTIONS)
50 .filter(key => CONFIG.TRANSCODING.ENABLED === CONFIG.TRANSCODING.RESOLUTIONS[key] === true) 53 .filter(key => CONFIG.TRANSCODING.ENABLED === CONFIG.TRANSCODING.RESOLUTIONS[key] === true)
@@ -61,6 +64,12 @@ async function getConfig (req: express.Request, res: express.Response, next: exp
61 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS 64 css: CONFIG.INSTANCE.CUSTOMIZATIONS.CSS
62 } 65 }
63 }, 66 },
67 email: {
68 enabled: Emailer.isEnabled()
69 },
70 contactForm: {
71 enabled: CONFIG.CONTACT_FORM.ENABLED
72 },
64 serverVersion: packageJSON.version, 73 serverVersion: packageJSON.version,
65 serverCommit, 74 serverCommit,
66 signup: { 75 signup: {
@@ -69,6 +78,9 @@ async function getConfig (req: express.Request, res: express.Response, next: exp
69 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION 78 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
70 }, 79 },
71 transcoding: { 80 transcoding: {
81 hls: {
82 enabled: CONFIG.TRANSCODING.HLS.ENABLED
83 },
72 enabledResolutions 84 enabledResolutions
73 }, 85 },
74 import: { 86 import: {
@@ -111,6 +123,11 @@ async function getConfig (req: express.Request, res: express.Response, next: exp
111 user: { 123 user: {
112 videoQuota: CONFIG.USER.VIDEO_QUOTA, 124 videoQuota: CONFIG.USER.VIDEO_QUOTA,
113 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY 125 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
126 },
127 trending: {
128 videos: {
129 intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS
130 }
114 } 131 }
115 } 132 }
116 133
@@ -150,32 +167,10 @@ async function deleteCustomConfig (req: express.Request, res: express.Response,
150} 167}
151 168
152async function updateCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) { 169async function updateCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
153 const toUpdate: CustomConfig = req.body
154 const oldCustomConfigAuditKeys = new CustomConfigAuditView(customConfig()) 170 const oldCustomConfigAuditKeys = new CustomConfigAuditView(customConfig())
155 171
156 // Force number conversion 172 // camelCase to snake_case key + Force number conversion
157 toUpdate.cache.previews.size = parseInt('' + toUpdate.cache.previews.size, 10) 173 const toUpdateJSON = convertCustomConfigBody(req.body)
158 toUpdate.cache.captions.size = parseInt('' + toUpdate.cache.captions.size, 10)
159 toUpdate.signup.limit = parseInt('' + toUpdate.signup.limit, 10)
160 toUpdate.user.videoQuota = parseInt('' + toUpdate.user.videoQuota, 10)
161 toUpdate.user.videoQuotaDaily = parseInt('' + toUpdate.user.videoQuotaDaily, 10)
162 toUpdate.transcoding.threads = parseInt('' + toUpdate.transcoding.threads, 10)
163
164 // camelCase to snake_case key
165 const toUpdateJSON = omit(
166 toUpdate,
167 'user.videoQuota',
168 'instance.defaultClientRoute',
169 'instance.shortDescription',
170 'cache.videoCaptions',
171 'signup.requiresEmailVerification'
172 )
173 toUpdateJSON.user['video_quota'] = toUpdate.user.videoQuota
174 toUpdateJSON.user['video_quota_daily'] = toUpdate.user.videoQuotaDaily
175 toUpdateJSON.instance['default_client_route'] = toUpdate.instance.defaultClientRoute
176 toUpdateJSON.instance['short_description'] = toUpdate.instance.shortDescription
177 toUpdateJSON.instance['default_nsfw_policy'] = toUpdate.instance.defaultNSFWPolicy
178 toUpdateJSON.signup['requires_email_verification'] = toUpdate.signup.requiresEmailVerification
179 174
180 await writeJSON(CONFIG.CUSTOM_FILE, toUpdateJSON, { spaces: 2 }) 175 await writeJSON(CONFIG.CUSTOM_FILE, toUpdateJSON, { spaces: 2 })
181 176
@@ -237,12 +232,16 @@ function customConfig (): CustomConfig {
237 admin: { 232 admin: {
238 email: CONFIG.ADMIN.EMAIL 233 email: CONFIG.ADMIN.EMAIL
239 }, 234 },
235 contactForm: {
236 enabled: CONFIG.CONTACT_FORM.ENABLED
237 },
240 user: { 238 user: {
241 videoQuota: CONFIG.USER.VIDEO_QUOTA, 239 videoQuota: CONFIG.USER.VIDEO_QUOTA,
242 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY 240 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
243 }, 241 },
244 transcoding: { 242 transcoding: {
245 enabled: CONFIG.TRANSCODING.ENABLED, 243 enabled: CONFIG.TRANSCODING.ENABLED,
244 allowAdditionalExtensions: CONFIG.TRANSCODING.ALLOW_ADDITIONAL_EXTENSIONS,
246 threads: CONFIG.TRANSCODING.THREADS, 245 threads: CONFIG.TRANSCODING.THREADS,
247 resolutions: { 246 resolutions: {
248 '240p': CONFIG.TRANSCODING.RESOLUTIONS[ '240p' ], 247 '240p': CONFIG.TRANSCODING.RESOLUTIONS[ '240p' ],
@@ -250,6 +249,9 @@ function customConfig (): CustomConfig {
250 '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ], 249 '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ],
251 '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ], 250 '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ],
252 '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ] 251 '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ]
252 },
253 hls: {
254 enabled: CONFIG.TRANSCODING.HLS.ENABLED
253 } 255 }
254 }, 256 },
255 import: { 257 import: {
@@ -264,3 +266,20 @@ function customConfig (): CustomConfig {
264 } 266 }
265 } 267 }
266} 268}
269
270function convertCustomConfigBody (body: CustomConfig) {
271 function keyConverter (k: string) {
272 // Transcoding resolutions exception
273 if (/^\d{3,4}p$/.exec(k)) return k
274
275 return snakeCase(k)
276 }
277
278 function valueConverter (v: any) {
279 if (isNumeric(v + '')) return parseInt('' + v, 10)
280
281 return v
282 }
283
284 return objectConverter(body, keyConverter, valueConverter)
285}
diff --git a/server/controllers/api/search.ts b/server/controllers/api/search.ts
index 4be2b5ef7..534305ba6 100644
--- a/server/controllers/api/search.ts
+++ b/server/controllers/api/search.ts
@@ -118,7 +118,8 @@ async function searchVideosDB (query: VideosSearchQuery, res: express.Response)
118 const options = Object.assign(query, { 118 const options = Object.assign(query, {
119 includeLocalVideos: true, 119 includeLocalVideos: true,
120 nsfw: buildNSFWFilter(res, query.nsfw), 120 nsfw: buildNSFWFilter(res, query.nsfw),
121 userId: res.locals.oauth ? res.locals.oauth.token.User.id : undefined 121 filter: query.filter,
122 user: res.locals.oauth ? res.locals.oauth.token.User : undefined
122 }) 123 })
123 const resultList = await VideoModel.searchAndPopulateAccountAndServer(options) 124 const resultList = await VideoModel.searchAndPopulateAccountAndServer(options)
124 125
diff --git a/server/controllers/api/server/contact.ts b/server/controllers/api/server/contact.ts
new file mode 100644
index 000000000..b1144c94e
--- /dev/null
+++ b/server/controllers/api/server/contact.ts
@@ -0,0 +1,28 @@
1import * as express from 'express'
2import { asyncMiddleware, contactAdministratorValidator } from '../../../middlewares'
3import { Redis } from '../../../lib/redis'
4import { Emailer } from '../../../lib/emailer'
5import { ContactForm } from '../../../../shared/models/server'
6
7const contactRouter = express.Router()
8
9contactRouter.post('/contact',
10 asyncMiddleware(contactAdministratorValidator),
11 asyncMiddleware(contactAdministrator)
12)
13
14async function contactAdministrator (req: express.Request, res: express.Response) {
15 const data = req.body as ContactForm
16
17 await Emailer.Instance.addContactFormJob(data.fromEmail, data.fromName, data.body)
18
19 await Redis.Instance.setContactFormIp(req.ip)
20
21 return res.status(204).end()
22}
23
24// ---------------------------------------------------------------------------
25
26export {
27 contactRouter
28}
diff --git a/server/controllers/api/server/follows.ts b/server/controllers/api/server/follows.ts
index d62400e42..9fa6c34ba 100644
--- a/server/controllers/api/server/follows.ts
+++ b/server/controllers/api/server/follows.ts
@@ -61,14 +61,26 @@ export {
61 61
62async function listFollowing (req: express.Request, res: express.Response, next: express.NextFunction) { 62async function listFollowing (req: express.Request, res: express.Response, next: express.NextFunction) {
63 const serverActor = await getServerActor() 63 const serverActor = await getServerActor()
64 const resultList = await ActorFollowModel.listFollowingForApi(serverActor.id, req.query.start, req.query.count, req.query.sort) 64 const resultList = await ActorFollowModel.listFollowingForApi(
65 serverActor.id,
66 req.query.start,
67 req.query.count,
68 req.query.sort,
69 req.query.search
70 )
65 71
66 return res.json(getFormattedObjects(resultList.data, resultList.total)) 72 return res.json(getFormattedObjects(resultList.data, resultList.total))
67} 73}
68 74
69async function listFollowers (req: express.Request, res: express.Response, next: express.NextFunction) { 75async function listFollowers (req: express.Request, res: express.Response, next: express.NextFunction) {
70 const serverActor = await getServerActor() 76 const serverActor = await getServerActor()
71 const resultList = await ActorFollowModel.listFollowersForApi(serverActor.id, req.query.start, req.query.count, req.query.sort) 77 const resultList = await ActorFollowModel.listFollowersForApi(
78 serverActor.id,
79 req.query.start,
80 req.query.count,
81 req.query.sort,
82 req.query.search
83 )
72 84
73 return res.json(getFormattedObjects(resultList.data, resultList.total)) 85 return res.json(getFormattedObjects(resultList.data, resultList.total))
74} 86}
diff --git a/server/controllers/api/server/index.ts b/server/controllers/api/server/index.ts
index 43bca2c10..814248e5f 100644
--- a/server/controllers/api/server/index.ts
+++ b/server/controllers/api/server/index.ts
@@ -2,12 +2,16 @@ import * as express from 'express'
2import { serverFollowsRouter } from './follows' 2import { serverFollowsRouter } from './follows'
3import { statsRouter } from './stats' 3import { statsRouter } from './stats'
4import { serverRedundancyRouter } from './redundancy' 4import { serverRedundancyRouter } from './redundancy'
5import { serverBlocklistRouter } from './server-blocklist'
6import { contactRouter } from './contact'
5 7
6const serverRouter = express.Router() 8const serverRouter = express.Router()
7 9
8serverRouter.use('/', serverFollowsRouter) 10serverRouter.use('/', serverFollowsRouter)
9serverRouter.use('/', serverRedundancyRouter) 11serverRouter.use('/', serverRedundancyRouter)
10serverRouter.use('/', statsRouter) 12serverRouter.use('/', statsRouter)
13serverRouter.use('/', serverBlocklistRouter)
14serverRouter.use('/', contactRouter)
11 15
12// --------------------------------------------------------------------------- 16// ---------------------------------------------------------------------------
13 17
diff --git a/server/controllers/api/server/server-blocklist.ts b/server/controllers/api/server/server-blocklist.ts
new file mode 100644
index 000000000..3cb3a96e2
--- /dev/null
+++ b/server/controllers/api/server/server-blocklist.ts
@@ -0,0 +1,132 @@
1import * as express from 'express'
2import 'multer'
3import { getFormattedObjects, getServerActor } from '../../../helpers/utils'
4import {
5 asyncMiddleware,
6 asyncRetryTransactionMiddleware,
7 authenticate,
8 ensureUserHasRight,
9 paginationValidator,
10 setDefaultPagination,
11 setDefaultSort
12} from '../../../middlewares'
13import {
14 accountsBlocklistSortValidator,
15 blockAccountValidator,
16 blockServerValidator,
17 serversBlocklistSortValidator,
18 unblockAccountByServerValidator,
19 unblockServerByServerValidator
20} from '../../../middlewares/validators'
21import { AccountModel } from '../../../models/account/account'
22import { AccountBlocklistModel } from '../../../models/account/account-blocklist'
23import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../../../lib/blocklist'
24import { ServerBlocklistModel } from '../../../models/server/server-blocklist'
25import { ServerModel } from '../../../models/server/server'
26import { UserRight } from '../../../../shared/models/users'
27
28const serverBlocklistRouter = express.Router()
29
30serverBlocklistRouter.get('/blocklist/accounts',
31 authenticate,
32 ensureUserHasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST),
33 paginationValidator,
34 accountsBlocklistSortValidator,
35 setDefaultSort,
36 setDefaultPagination,
37 asyncMiddleware(listBlockedAccounts)
38)
39
40serverBlocklistRouter.post('/blocklist/accounts',
41 authenticate,
42 ensureUserHasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST),
43 asyncMiddleware(blockAccountValidator),
44 asyncRetryTransactionMiddleware(blockAccount)
45)
46
47serverBlocklistRouter.delete('/blocklist/accounts/:accountName',
48 authenticate,
49 ensureUserHasRight(UserRight.MANAGE_ACCOUNTS_BLOCKLIST),
50 asyncMiddleware(unblockAccountByServerValidator),
51 asyncRetryTransactionMiddleware(unblockAccount)
52)
53
54serverBlocklistRouter.get('/blocklist/servers',
55 authenticate,
56 ensureUserHasRight(UserRight.MANAGE_SERVERS_BLOCKLIST),
57 paginationValidator,
58 serversBlocklistSortValidator,
59 setDefaultSort,
60 setDefaultPagination,
61 asyncMiddleware(listBlockedServers)
62)
63
64serverBlocklistRouter.post('/blocklist/servers',
65 authenticate,
66 ensureUserHasRight(UserRight.MANAGE_SERVERS_BLOCKLIST),
67 asyncMiddleware(blockServerValidator),
68 asyncRetryTransactionMiddleware(blockServer)
69)
70
71serverBlocklistRouter.delete('/blocklist/servers/:host',
72 authenticate,
73 ensureUserHasRight(UserRight.MANAGE_SERVERS_BLOCKLIST),
74 asyncMiddleware(unblockServerByServerValidator),
75 asyncRetryTransactionMiddleware(unblockServer)
76)
77
78export {
79 serverBlocklistRouter
80}
81
82// ---------------------------------------------------------------------------
83
84async function listBlockedAccounts (req: express.Request, res: express.Response) {
85 const serverActor = await getServerActor()
86
87 const resultList = await AccountBlocklistModel.listForApi(serverActor.Account.id, req.query.start, req.query.count, req.query.sort)
88
89 return res.json(getFormattedObjects(resultList.data, resultList.total))
90}
91
92async function blockAccount (req: express.Request, res: express.Response) {
93 const serverActor = await getServerActor()
94 const accountToBlock: AccountModel = res.locals.account
95
96 await addAccountInBlocklist(serverActor.Account.id, accountToBlock.id)
97
98 return res.status(204).end()
99}
100
101async function unblockAccount (req: express.Request, res: express.Response) {
102 const accountBlock: AccountBlocklistModel = res.locals.accountBlock
103
104 await removeAccountFromBlocklist(accountBlock)
105
106 return res.status(204).end()
107}
108
109async function listBlockedServers (req: express.Request, res: express.Response) {
110 const serverActor = await getServerActor()
111
112 const resultList = await ServerBlocklistModel.listForApi(serverActor.Account.id, req.query.start, req.query.count, req.query.sort)
113
114 return res.json(getFormattedObjects(resultList.data, resultList.total))
115}
116
117async function blockServer (req: express.Request, res: express.Response) {
118 const serverActor = await getServerActor()
119 const serverToBlock: ServerModel = res.locals.server
120
121 await addServerInBlocklist(serverActor.Account.id, serverToBlock.id)
122
123 return res.status(204).end()
124}
125
126async function unblockServer (req: express.Request, res: express.Response) {
127 const serverBlock: ServerBlocklistModel = res.locals.serverBlock
128
129 await removeServerFromBlocklist(serverBlock)
130
131 return res.status(204).end()
132}
diff --git a/server/controllers/api/server/stats.ts b/server/controllers/api/server/stats.ts
index 85803f69e..89ffd1717 100644
--- a/server/controllers/api/server/stats.ts
+++ b/server/controllers/api/server/stats.ts
@@ -8,6 +8,7 @@ import { VideoCommentModel } from '../../../models/video/video-comment'
8import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' 8import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
9import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../../initializers/constants' 9import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../../initializers/constants'
10import { cacheRoute } from '../../../middlewares/cache' 10import { cacheRoute } from '../../../middlewares/cache'
11import { VideoFileModel } from '../../../models/video/video-file'
11 12
12const statsRouter = express.Router() 13const statsRouter = express.Router()
13 14
@@ -16,11 +17,12 @@ statsRouter.get('/stats',
16 asyncMiddleware(getStats) 17 asyncMiddleware(getStats)
17) 18)
18 19
19async function getStats (req: express.Request, res: express.Response, next: express.NextFunction) { 20async function getStats (req: express.Request, res: express.Response) {
20 const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats() 21 const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats()
21 const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats() 22 const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats()
22 const { totalUsers } = await UserModel.getStats() 23 const { totalUsers } = await UserModel.getStats()
23 const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats() 24 const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats()
25 const { totalLocalVideoFilesSize } = await VideoFileModel.getStats()
24 26
25 const videosRedundancyStats = await Promise.all( 27 const videosRedundancyStats = await Promise.all(
26 CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.map(r => { 28 CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.map(r => {
@@ -32,8 +34,9 @@ async function getStats (req: express.Request, res: express.Response, next: expr
32 const data: ServerStats = { 34 const data: ServerStats = {
33 totalLocalVideos, 35 totalLocalVideos,
34 totalLocalVideoViews, 36 totalLocalVideoViews,
35 totalVideos, 37 totalLocalVideoFilesSize,
36 totalLocalVideoComments, 38 totalLocalVideoComments,
39 totalVideos,
37 totalVideoComments, 40 totalVideoComments,
38 totalUsers, 41 totalUsers,
39 totalInstanceFollowers, 42 totalInstanceFollowers,
diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts
index 0b0081520..e3533a7f6 100644
--- a/server/controllers/api/users/index.ts
+++ b/server/controllers/api/users/index.ts
@@ -37,6 +37,11 @@ import { UserModel } from '../../../models/account/user'
37import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger' 37import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
38import { meRouter } from './me' 38import { meRouter } from './me'
39import { deleteUserToken } from '../../../lib/oauth-model' 39import { deleteUserToken } from '../../../lib/oauth-model'
40import { myBlocklistRouter } from './my-blocklist'
41import { myVideosHistoryRouter } from './my-history'
42import { myNotificationsRouter } from './my-notifications'
43import { Notifier } from '../../../lib/notifier'
44import { mySubscriptionsRouter } from './my-subscriptions'
40 45
41const auditLogger = auditLoggerFactory('users') 46const auditLogger = auditLoggerFactory('users')
42 47
@@ -53,6 +58,10 @@ const askSendEmailLimiter = new RateLimit({
53}) 58})
54 59
55const usersRouter = express.Router() 60const usersRouter = express.Router()
61usersRouter.use('/', myNotificationsRouter)
62usersRouter.use('/', mySubscriptionsRouter)
63usersRouter.use('/', myBlocklistRouter)
64usersRouter.use('/', myVideosHistoryRouter)
56usersRouter.use('/', meRouter) 65usersRouter.use('/', meRouter)
57 66
58usersRouter.get('/autocomplete', 67usersRouter.get('/autocomplete',
@@ -207,6 +216,8 @@ async function registerUser (req: express.Request, res: express.Response) {
207 await sendVerifyUserEmail(user) 216 await sendVerifyUserEmail(user)
208 } 217 }
209 218
219 Notifier.Instance.notifyOnNewUserRegistration(user)
220
210 return res.type('json').status(204).end() 221 return res.type('json').status(204).end()
211} 222}
212 223
@@ -218,7 +229,7 @@ async function unblockUser (req: express.Request, res: express.Response, next: e
218 return res.status(204).end() 229 return res.status(204).end()
219} 230}
220 231
221async function blockUser (req: express.Request, res: express.Response, next: express.NextFunction) { 232async function blockUser (req: express.Request, res: express.Response) {
222 const user: UserModel = res.locals.user 233 const user: UserModel = res.locals.user
223 const reason = req.body.reason 234 const reason = req.body.reason
224 235
@@ -227,23 +238,23 @@ async function blockUser (req: express.Request, res: express.Response, next: exp
227 return res.status(204).end() 238 return res.status(204).end()
228} 239}
229 240
230function getUser (req: express.Request, res: express.Response, next: express.NextFunction) { 241function getUser (req: express.Request, res: express.Response) {
231 return res.json((res.locals.user as UserModel).toFormattedJSON()) 242 return res.json((res.locals.user as UserModel).toFormattedJSON())
232} 243}
233 244
234async function autocompleteUsers (req: express.Request, res: express.Response, next: express.NextFunction) { 245async function autocompleteUsers (req: express.Request, res: express.Response) {
235 const resultList = await UserModel.autoComplete(req.query.search as string) 246 const resultList = await UserModel.autoComplete(req.query.search as string)
236 247
237 return res.json(resultList) 248 return res.json(resultList)
238} 249}
239 250
240async function listUsers (req: express.Request, res: express.Response, next: express.NextFunction) { 251async function listUsers (req: express.Request, res: express.Response) {
241 const resultList = await UserModel.listForApi(req.query.start, req.query.count, req.query.sort) 252 const resultList = await UserModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.search)
242 253
243 return res.json(getFormattedObjects(resultList.data, resultList.total)) 254 return res.json(getFormattedObjects(resultList.data, resultList.total))
244} 255}
245 256
246async function removeUser (req: express.Request, res: express.Response, next: express.NextFunction) { 257async function removeUser (req: express.Request, res: express.Response) {
247 const user: UserModel = res.locals.user 258 const user: UserModel = res.locals.user
248 259
249 await user.destroy() 260 await user.destroy()
@@ -253,13 +264,15 @@ async function removeUser (req: express.Request, res: express.Response, next: ex
253 return res.sendStatus(204) 264 return res.sendStatus(204)
254} 265}
255 266
256async function updateUser (req: express.Request, res: express.Response, next: express.NextFunction) { 267async function updateUser (req: express.Request, res: express.Response) {
257 const body: UserUpdate = req.body 268 const body: UserUpdate = req.body
258 const userToUpdate = res.locals.user as UserModel 269 const userToUpdate = res.locals.user as UserModel
259 const oldUserAuditView = new UserAuditView(userToUpdate.toFormattedJSON()) 270 const oldUserAuditView = new UserAuditView(userToUpdate.toFormattedJSON())
260 const roleChanged = body.role !== undefined && body.role !== userToUpdate.role 271 const roleChanged = body.role !== undefined && body.role !== userToUpdate.role
261 272
273 if (body.password !== undefined) userToUpdate.password = body.password
262 if (body.email !== undefined) userToUpdate.email = body.email 274 if (body.email !== undefined) userToUpdate.email = body.email
275 if (body.emailVerified !== undefined) userToUpdate.emailVerified = body.emailVerified
263 if (body.videoQuota !== undefined) userToUpdate.videoQuota = body.videoQuota 276 if (body.videoQuota !== undefined) userToUpdate.videoQuota = body.videoQuota
264 if (body.videoQuotaDaily !== undefined) userToUpdate.videoQuotaDaily = body.videoQuotaDaily 277 if (body.videoQuotaDaily !== undefined) userToUpdate.videoQuotaDaily = body.videoQuotaDaily
265 if (body.role !== undefined) userToUpdate.role = body.role 278 if (body.role !== undefined) userToUpdate.role = body.role
@@ -267,11 +280,11 @@ async function updateUser (req: express.Request, res: express.Response, next: ex
267 const user = await userToUpdate.save() 280 const user = await userToUpdate.save()
268 281
269 // Destroy user token to refresh rights 282 // Destroy user token to refresh rights
270 if (roleChanged) await deleteUserToken(userToUpdate.id) 283 if (roleChanged || body.password !== undefined) await deleteUserToken(userToUpdate.id)
271 284
272 auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) 285 auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView)
273 286
274 // Don't need to send this update to followers, these attributes are not propagated 287 // Don't need to send this update to followers, these attributes are not federated
275 288
276 return res.sendStatus(204) 289 return res.sendStatus(204)
277} 290}
@@ -281,7 +294,7 @@ async function askResetUserPassword (req: express.Request, res: express.Response
281 294
282 const verificationString = await Redis.Instance.setResetPasswordVerificationString(user.id) 295 const verificationString = await Redis.Instance.setResetPasswordVerificationString(user.id)
283 const url = CONFIG.WEBSERVER.URL + '/reset-password?userId=' + user.id + '&verificationString=' + verificationString 296 const url = CONFIG.WEBSERVER.URL + '/reset-password?userId=' + user.id + '&verificationString=' + verificationString
284 await Emailer.Instance.addForgetPasswordEmailJob(user.email, url) 297 await Emailer.Instance.addPasswordResetEmailJob(user.email, url)
285 298
286 return res.status(204).end() 299 return res.status(204).end()
287} 300}
diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts
index 591ec6b25..d5e154869 100644
--- a/server/controllers/api/users/me.ts
+++ b/server/controllers/api/users/me.ts
@@ -2,47 +2,34 @@ import * as express from 'express'
2import 'multer' 2import 'multer'
3import { UserUpdateMe, UserVideoRate as FormattedUserVideoRate } from '../../../../shared' 3import { UserUpdateMe, UserVideoRate as FormattedUserVideoRate } from '../../../../shared'
4import { getFormattedObjects } from '../../../helpers/utils' 4import { getFormattedObjects } from '../../../helpers/utils'
5import { CONFIG, IMAGE_MIMETYPE_EXT, sequelizeTypescript } from '../../../initializers' 5import { CONFIG, MIMETYPES, sequelizeTypescript } from '../../../initializers'
6import { sendUpdateActor } from '../../../lib/activitypub/send' 6import { sendUpdateActor } from '../../../lib/activitypub/send'
7import { 7import {
8 asyncMiddleware, 8 asyncMiddleware,
9 asyncRetryTransactionMiddleware, 9 asyncRetryTransactionMiddleware,
10 authenticate, 10 authenticate,
11 commonVideosFiltersValidator,
12 paginationValidator, 11 paginationValidator,
13 setDefaultPagination, 12 setDefaultPagination,
14 setDefaultSort, 13 setDefaultSort,
15 userSubscriptionAddValidator,
16 userSubscriptionGetValidator,
17 usersUpdateMeValidator, 14 usersUpdateMeValidator,
18 usersVideoRatingValidator 15 usersVideoRatingValidator
19} from '../../../middlewares' 16} from '../../../middlewares'
20import { 17import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators'
21 areSubscriptionsExistValidator,
22 deleteMeValidator,
23 userSubscriptionsSortValidator,
24 videoImportsSortValidator,
25 videosSortValidator
26} from '../../../middlewares/validators'
27import { AccountVideoRateModel } from '../../../models/account/account-video-rate' 18import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
28import { UserModel } from '../../../models/account/user' 19import { UserModel } from '../../../models/account/user'
29import { VideoModel } from '../../../models/video/video' 20import { VideoModel } from '../../../models/video/video'
30import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type' 21import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type'
31import { buildNSFWFilter, createReqFiles } from '../../../helpers/express-utils' 22import { createReqFiles } from '../../../helpers/express-utils'
32import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model' 23import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model'
33import { updateAvatarValidator } from '../../../middlewares/validators/avatar' 24import { updateAvatarValidator } from '../../../middlewares/validators/avatar'
34import { updateActorAvatarFile } from '../../../lib/avatar' 25import { updateActorAvatarFile } from '../../../lib/avatar'
35import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger' 26import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
36import { VideoImportModel } from '../../../models/video/video-import' 27import { VideoImportModel } from '../../../models/video/video-import'
37import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
38import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
39import { JobQueue } from '../../../lib/job-queue'
40import { logger } from '../../../helpers/logger'
41import { AccountModel } from '../../../models/account/account' 28import { AccountModel } from '../../../models/account/account'
42 29
43const auditLogger = auditLoggerFactory('users-me') 30const auditLogger = auditLoggerFactory('users-me')
44 31
45const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) 32const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR })
46 33
47const meRouter = express.Router() 34const meRouter = express.Router()
48 35
@@ -98,51 +85,6 @@ meRouter.post('/me/avatar/pick',
98 asyncRetryTransactionMiddleware(updateMyAvatar) 85 asyncRetryTransactionMiddleware(updateMyAvatar)
99) 86)
100 87
101// ##### Subscriptions part #####
102
103meRouter.get('/me/subscriptions/videos',
104 authenticate,
105 paginationValidator,
106 videosSortValidator,
107 setDefaultSort,
108 setDefaultPagination,
109 commonVideosFiltersValidator,
110 asyncMiddleware(getUserSubscriptionVideos)
111)
112
113meRouter.get('/me/subscriptions/exist',
114 authenticate,
115 areSubscriptionsExistValidator,
116 asyncMiddleware(areSubscriptionsExist)
117)
118
119meRouter.get('/me/subscriptions',
120 authenticate,
121 paginationValidator,
122 userSubscriptionsSortValidator,
123 setDefaultSort,
124 setDefaultPagination,
125 asyncMiddleware(getUserSubscriptions)
126)
127
128meRouter.post('/me/subscriptions',
129 authenticate,
130 userSubscriptionAddValidator,
131 asyncMiddleware(addUserSubscription)
132)
133
134meRouter.get('/me/subscriptions/:uri',
135 authenticate,
136 userSubscriptionGetValidator,
137 getUserSubscription
138)
139
140meRouter.delete('/me/subscriptions/:uri',
141 authenticate,
142 userSubscriptionGetValidator,
143 asyncRetryTransactionMiddleware(deleteUserSubscription)
144)
145
146// --------------------------------------------------------------------------- 88// ---------------------------------------------------------------------------
147 89
148export { 90export {
@@ -151,99 +93,6 @@ export {
151 93
152// --------------------------------------------------------------------------- 94// ---------------------------------------------------------------------------
153 95
154async function areSubscriptionsExist (req: express.Request, res: express.Response) {
155 const uris = req.query.uris as string[]
156 const user = res.locals.oauth.token.User as UserModel
157
158 const handles = uris.map(u => {
159 let [ name, host ] = u.split('@')
160 if (host === CONFIG.WEBSERVER.HOST) host = null
161
162 return { name, host, uri: u }
163 })
164
165 const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
166
167 const existObject: { [id: string ]: boolean } = {}
168 for (const handle of handles) {
169 const obj = results.find(r => {
170 const server = r.ActorFollowing.Server
171
172 return r.ActorFollowing.preferredUsername === handle.name &&
173 (
174 (!server && !handle.host) ||
175 (server.host === handle.host)
176 )
177 })
178
179 existObject[handle.uri] = obj !== undefined
180 }
181
182 return res.json(existObject)
183}
184
185async function addUserSubscription (req: express.Request, res: express.Response) {
186 const user = res.locals.oauth.token.User as UserModel
187 const [ name, host ] = req.body.uri.split('@')
188
189 const payload = {
190 name,
191 host,
192 followerActorId: user.Account.Actor.id
193 }
194
195 JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
196 .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
197
198 return res.status(204).end()
199}
200
201function getUserSubscription (req: express.Request, res: express.Response) {
202 const subscription: ActorFollowModel = res.locals.subscription
203
204 return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
205}
206
207async function deleteUserSubscription (req: express.Request, res: express.Response) {
208 const subscription: ActorFollowModel = res.locals.subscription
209
210 await sequelizeTypescript.transaction(async t => {
211 return subscription.destroy({ transaction: t })
212 })
213
214 return res.type('json').status(204).end()
215}
216
217async function getUserSubscriptions (req: express.Request, res: express.Response) {
218 const user = res.locals.oauth.token.User as UserModel
219 const actorId = user.Account.Actor.id
220
221 const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
222
223 return res.json(getFormattedObjects(resultList.data, resultList.total))
224}
225
226async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
227 const user = res.locals.oauth.token.User as UserModel
228 const resultList = await VideoModel.listForApi({
229 start: req.query.start,
230 count: req.query.count,
231 sort: req.query.sort,
232 includeLocalVideos: false,
233 categoryOneOf: req.query.categoryOneOf,
234 licenceOneOf: req.query.licenceOneOf,
235 languageOneOf: req.query.languageOneOf,
236 tagsOneOf: req.query.tagsOneOf,
237 tagsAllOf: req.query.tagsAllOf,
238 nsfw: buildNSFWFilter(res, req.query.nsfw),
239 filter: req.query.filter as VideoFilter,
240 withFiles: false,
241 actorId: user.Account.Actor.id
242 })
243
244 return res.json(getFormattedObjects(resultList.data, resultList.total))
245}
246
247async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 96async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
248 const user = res.locals.oauth.token.User as UserModel 97 const user = res.locals.oauth.token.User as UserModel
249 const resultList = await VideoModel.listUserVideosForApi( 98 const resultList = await VideoModel.listUserVideosForApi(
@@ -318,7 +167,7 @@ async function deleteMe (req: express.Request, res: express.Response) {
318 return res.sendStatus(204) 167 return res.sendStatus(204)
319} 168}
320 169
321async function updateMe (req: express.Request, res: express.Response, next: express.NextFunction) { 170async function updateMe (req: express.Request, res: express.Response) {
322 const body: UserUpdateMe = req.body 171 const body: UserUpdateMe = req.body
323 172
324 const user: UserModel = res.locals.oauth.token.user 173 const user: UserModel = res.locals.oauth.token.user
@@ -327,7 +176,9 @@ async function updateMe (req: express.Request, res: express.Response, next: expr
327 if (body.password !== undefined) user.password = body.password 176 if (body.password !== undefined) user.password = body.password
328 if (body.email !== undefined) user.email = body.email 177 if (body.email !== undefined) user.email = body.email
329 if (body.nsfwPolicy !== undefined) user.nsfwPolicy = body.nsfwPolicy 178 if (body.nsfwPolicy !== undefined) user.nsfwPolicy = body.nsfwPolicy
179 if (body.webTorrentEnabled !== undefined) user.webTorrentEnabled = body.webTorrentEnabled
330 if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo 180 if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo
181 if (body.videosHistoryEnabled !== undefined) user.videosHistoryEnabled = body.videosHistoryEnabled
331 182
332 await sequelizeTypescript.transaction(async t => { 183 await sequelizeTypescript.transaction(async t => {
333 const userAccount = await AccountModel.load(user.Account.id) 184 const userAccount = await AccountModel.load(user.Account.id)
@@ -346,7 +197,7 @@ async function updateMe (req: express.Request, res: express.Response, next: expr
346 return res.sendStatus(204) 197 return res.sendStatus(204)
347} 198}
348 199
349async function updateMyAvatar (req: express.Request, res: express.Response, next: express.NextFunction) { 200async function updateMyAvatar (req: express.Request, res: express.Response) {
350 const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ] 201 const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ]
351 const user: UserModel = res.locals.oauth.token.user 202 const user: UserModel = res.locals.oauth.token.user
352 const oldUserAuditView = new UserAuditView(user.toFormattedJSON()) 203 const oldUserAuditView = new UserAuditView(user.toFormattedJSON())
diff --git a/server/controllers/api/users/my-blocklist.ts b/server/controllers/api/users/my-blocklist.ts
new file mode 100644
index 000000000..9575eab46
--- /dev/null
+++ b/server/controllers/api/users/my-blocklist.ts
@@ -0,0 +1,125 @@
1import * as express from 'express'
2import 'multer'
3import { getFormattedObjects } from '../../../helpers/utils'
4import {
5 asyncMiddleware,
6 asyncRetryTransactionMiddleware,
7 authenticate,
8 paginationValidator,
9 setDefaultPagination,
10 setDefaultSort,
11 unblockAccountByAccountValidator
12} from '../../../middlewares'
13import {
14 accountsBlocklistSortValidator,
15 blockAccountValidator,
16 blockServerValidator,
17 serversBlocklistSortValidator,
18 unblockServerByAccountValidator
19} from '../../../middlewares/validators'
20import { UserModel } from '../../../models/account/user'
21import { AccountModel } from '../../../models/account/account'
22import { AccountBlocklistModel } from '../../../models/account/account-blocklist'
23import { addAccountInBlocklist, addServerInBlocklist, removeAccountFromBlocklist, removeServerFromBlocklist } from '../../../lib/blocklist'
24import { ServerBlocklistModel } from '../../../models/server/server-blocklist'
25import { ServerModel } from '../../../models/server/server'
26
27const myBlocklistRouter = express.Router()
28
29myBlocklistRouter.get('/me/blocklist/accounts',
30 authenticate,
31 paginationValidator,
32 accountsBlocklistSortValidator,
33 setDefaultSort,
34 setDefaultPagination,
35 asyncMiddleware(listBlockedAccounts)
36)
37
38myBlocklistRouter.post('/me/blocklist/accounts',
39 authenticate,
40 asyncMiddleware(blockAccountValidator),
41 asyncRetryTransactionMiddleware(blockAccount)
42)
43
44myBlocklistRouter.delete('/me/blocklist/accounts/:accountName',
45 authenticate,
46 asyncMiddleware(unblockAccountByAccountValidator),
47 asyncRetryTransactionMiddleware(unblockAccount)
48)
49
50myBlocklistRouter.get('/me/blocklist/servers',
51 authenticate,
52 paginationValidator,
53 serversBlocklistSortValidator,
54 setDefaultSort,
55 setDefaultPagination,
56 asyncMiddleware(listBlockedServers)
57)
58
59myBlocklistRouter.post('/me/blocklist/servers',
60 authenticate,
61 asyncMiddleware(blockServerValidator),
62 asyncRetryTransactionMiddleware(blockServer)
63)
64
65myBlocklistRouter.delete('/me/blocklist/servers/:host',
66 authenticate,
67 asyncMiddleware(unblockServerByAccountValidator),
68 asyncRetryTransactionMiddleware(unblockServer)
69)
70
71export {
72 myBlocklistRouter
73}
74
75// ---------------------------------------------------------------------------
76
77async function listBlockedAccounts (req: express.Request, res: express.Response) {
78 const user: UserModel = res.locals.oauth.token.User
79
80 const resultList = await AccountBlocklistModel.listForApi(user.Account.id, req.query.start, req.query.count, req.query.sort)
81
82 return res.json(getFormattedObjects(resultList.data, resultList.total))
83}
84
85async function blockAccount (req: express.Request, res: express.Response) {
86 const user: UserModel = res.locals.oauth.token.User
87 const accountToBlock: AccountModel = res.locals.account
88
89 await addAccountInBlocklist(user.Account.id, accountToBlock.id)
90
91 return res.status(204).end()
92}
93
94async function unblockAccount (req: express.Request, res: express.Response) {
95 const accountBlock: AccountBlocklistModel = res.locals.accountBlock
96
97 await removeAccountFromBlocklist(accountBlock)
98
99 return res.status(204).end()
100}
101
102async function listBlockedServers (req: express.Request, res: express.Response) {
103 const user: UserModel = res.locals.oauth.token.User
104
105 const resultList = await ServerBlocklistModel.listForApi(user.Account.id, req.query.start, req.query.count, req.query.sort)
106
107 return res.json(getFormattedObjects(resultList.data, resultList.total))
108}
109
110async function blockServer (req: express.Request, res: express.Response) {
111 const user: UserModel = res.locals.oauth.token.User
112 const serverToBlock: ServerModel = res.locals.server
113
114 await addServerInBlocklist(user.Account.id, serverToBlock.id)
115
116 return res.status(204).end()
117}
118
119async function unblockServer (req: express.Request, res: express.Response) {
120 const serverBlock: ServerBlocklistModel = res.locals.serverBlock
121
122 await removeServerFromBlocklist(serverBlock)
123
124 return res.status(204).end()
125}
diff --git a/server/controllers/api/users/my-history.ts b/server/controllers/api/users/my-history.ts
new file mode 100644
index 000000000..6cd782c47
--- /dev/null
+++ b/server/controllers/api/users/my-history.ts
@@ -0,0 +1,57 @@
1import * as express from 'express'
2import {
3 asyncMiddleware,
4 asyncRetryTransactionMiddleware,
5 authenticate,
6 paginationValidator,
7 setDefaultPagination,
8 userHistoryRemoveValidator
9} from '../../../middlewares'
10import { UserModel } from '../../../models/account/user'
11import { getFormattedObjects } from '../../../helpers/utils'
12import { UserVideoHistoryModel } from '../../../models/account/user-video-history'
13import { sequelizeTypescript } from '../../../initializers'
14
15const myVideosHistoryRouter = express.Router()
16
17myVideosHistoryRouter.get('/me/history/videos',
18 authenticate,
19 paginationValidator,
20 setDefaultPagination,
21 asyncMiddleware(listMyVideosHistory)
22)
23
24myVideosHistoryRouter.post('/me/history/videos/remove',
25 authenticate,
26 userHistoryRemoveValidator,
27 asyncRetryTransactionMiddleware(removeUserHistory)
28)
29
30// ---------------------------------------------------------------------------
31
32export {
33 myVideosHistoryRouter
34}
35
36// ---------------------------------------------------------------------------
37
38async function listMyVideosHistory (req: express.Request, res: express.Response) {
39 const user: UserModel = res.locals.oauth.token.User
40
41 const resultList = await UserVideoHistoryModel.listForApi(user, req.query.start, req.query.count)
42
43 return res.json(getFormattedObjects(resultList.data, resultList.total))
44}
45
46async function removeUserHistory (req: express.Request, res: express.Response) {
47 const user: UserModel = res.locals.oauth.token.User
48 const beforeDate = req.body.beforeDate || null
49
50 await sequelizeTypescript.transaction(t => {
51 return UserVideoHistoryModel.removeHistoryBefore(user, beforeDate, t)
52 })
53
54 // Do not send the delete to other instances, we delete OUR copy of this video abuse
55
56 return res.type('json').status(204).end()
57}
diff --git a/server/controllers/api/users/my-notifications.ts b/server/controllers/api/users/my-notifications.ts
new file mode 100644
index 000000000..76cf97587
--- /dev/null
+++ b/server/controllers/api/users/my-notifications.ts
@@ -0,0 +1,108 @@
1import * as express from 'express'
2import 'multer'
3import {
4 asyncMiddleware,
5 asyncRetryTransactionMiddleware,
6 authenticate,
7 paginationValidator,
8 setDefaultPagination,
9 setDefaultSort,
10 userNotificationsSortValidator
11} from '../../../middlewares'
12import { UserModel } from '../../../models/account/user'
13import { getFormattedObjects } from '../../../helpers/utils'
14import { UserNotificationModel } from '../../../models/account/user-notification'
15import { meRouter } from './me'
16import {
17 listUserNotificationsValidator,
18 markAsReadUserNotificationsValidator,
19 updateNotificationSettingsValidator
20} from '../../../middlewares/validators/user-notifications'
21import { UserNotificationSetting } from '../../../../shared/models/users'
22import { UserNotificationSettingModel } from '../../../models/account/user-notification-setting'
23
24const myNotificationsRouter = express.Router()
25
26meRouter.put('/me/notification-settings',
27 authenticate,
28 updateNotificationSettingsValidator,
29 asyncRetryTransactionMiddleware(updateNotificationSettings)
30)
31
32myNotificationsRouter.get('/me/notifications',
33 authenticate,
34 paginationValidator,
35 userNotificationsSortValidator,
36 setDefaultSort,
37 setDefaultPagination,
38 listUserNotificationsValidator,
39 asyncMiddleware(listUserNotifications)
40)
41
42myNotificationsRouter.post('/me/notifications/read',
43 authenticate,
44 markAsReadUserNotificationsValidator,
45 asyncMiddleware(markAsReadUserNotifications)
46)
47
48myNotificationsRouter.post('/me/notifications/read-all',
49 authenticate,
50 asyncMiddleware(markAsReadAllUserNotifications)
51)
52
53export {
54 myNotificationsRouter
55}
56
57// ---------------------------------------------------------------------------
58
59async function updateNotificationSettings (req: express.Request, res: express.Response) {
60 const user: UserModel = res.locals.oauth.token.User
61 const body = req.body
62
63 const query = {
64 where: {
65 userId: user.id
66 }
67 }
68
69 const values: UserNotificationSetting = {
70 newVideoFromSubscription: body.newVideoFromSubscription,
71 newCommentOnMyVideo: body.newCommentOnMyVideo,
72 videoAbuseAsModerator: body.videoAbuseAsModerator,
73 blacklistOnMyVideo: body.blacklistOnMyVideo,
74 myVideoPublished: body.myVideoPublished,
75 myVideoImportFinished: body.myVideoImportFinished,
76 newFollow: body.newFollow,
77 newUserRegistration: body.newUserRegistration,
78 commentMention: body.commentMention
79 }
80
81 await UserNotificationSettingModel.update(values, query)
82
83 return res.status(204).end()
84}
85
86async function listUserNotifications (req: express.Request, res: express.Response) {
87 const user: UserModel = res.locals.oauth.token.User
88
89 const resultList = await UserNotificationModel.listForApi(user.id, req.query.start, req.query.count, req.query.sort, req.query.unread)
90
91 return res.json(getFormattedObjects(resultList.data, resultList.total))
92}
93
94async function markAsReadUserNotifications (req: express.Request, res: express.Response) {
95 const user: UserModel = res.locals.oauth.token.User
96
97 await UserNotificationModel.markAsRead(user.id, req.body.ids)
98
99 return res.status(204).end()
100}
101
102async function markAsReadAllUserNotifications (req: express.Request, res: express.Response) {
103 const user: UserModel = res.locals.oauth.token.User
104
105 await UserNotificationModel.markAllAsRead(user.id)
106
107 return res.status(204).end()
108}
diff --git a/server/controllers/api/users/my-subscriptions.ts b/server/controllers/api/users/my-subscriptions.ts
new file mode 100644
index 000000000..accca6d52
--- /dev/null
+++ b/server/controllers/api/users/my-subscriptions.ts
@@ -0,0 +1,170 @@
1import * as express from 'express'
2import 'multer'
3import { getFormattedObjects } from '../../../helpers/utils'
4import { CONFIG, sequelizeTypescript } from '../../../initializers'
5import {
6 asyncMiddleware,
7 asyncRetryTransactionMiddleware,
8 authenticate,
9 commonVideosFiltersValidator,
10 paginationValidator,
11 setDefaultPagination,
12 setDefaultSort,
13 userSubscriptionAddValidator,
14 userSubscriptionGetValidator
15} from '../../../middlewares'
16import { areSubscriptionsExistValidator, userSubscriptionsSortValidator, videosSortValidator } from '../../../middlewares/validators'
17import { UserModel } from '../../../models/account/user'
18import { VideoModel } from '../../../models/video/video'
19import { buildNSFWFilter } from '../../../helpers/express-utils'
20import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
21import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
22import { JobQueue } from '../../../lib/job-queue'
23import { logger } from '../../../helpers/logger'
24
25const mySubscriptionsRouter = express.Router()
26
27mySubscriptionsRouter.get('/me/subscriptions/videos',
28 authenticate,
29 paginationValidator,
30 videosSortValidator,
31 setDefaultSort,
32 setDefaultPagination,
33 commonVideosFiltersValidator,
34 asyncMiddleware(getUserSubscriptionVideos)
35)
36
37mySubscriptionsRouter.get('/me/subscriptions/exist',
38 authenticate,
39 areSubscriptionsExistValidator,
40 asyncMiddleware(areSubscriptionsExist)
41)
42
43mySubscriptionsRouter.get('/me/subscriptions',
44 authenticate,
45 paginationValidator,
46 userSubscriptionsSortValidator,
47 setDefaultSort,
48 setDefaultPagination,
49 asyncMiddleware(getUserSubscriptions)
50)
51
52mySubscriptionsRouter.post('/me/subscriptions',
53 authenticate,
54 userSubscriptionAddValidator,
55 asyncMiddleware(addUserSubscription)
56)
57
58mySubscriptionsRouter.get('/me/subscriptions/:uri',
59 authenticate,
60 userSubscriptionGetValidator,
61 getUserSubscription
62)
63
64mySubscriptionsRouter.delete('/me/subscriptions/:uri',
65 authenticate,
66 userSubscriptionGetValidator,
67 asyncRetryTransactionMiddleware(deleteUserSubscription)
68)
69
70// ---------------------------------------------------------------------------
71
72export {
73 mySubscriptionsRouter
74}
75
76// ---------------------------------------------------------------------------
77
78async function areSubscriptionsExist (req: express.Request, res: express.Response) {
79 const uris = req.query.uris as string[]
80 const user = res.locals.oauth.token.User as UserModel
81
82 const handles = uris.map(u => {
83 let [ name, host ] = u.split('@')
84 if (host === CONFIG.WEBSERVER.HOST) host = null
85
86 return { name, host, uri: u }
87 })
88
89 const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
90
91 const existObject: { [id: string ]: boolean } = {}
92 for (const handle of handles) {
93 const obj = results.find(r => {
94 const server = r.ActorFollowing.Server
95
96 return r.ActorFollowing.preferredUsername === handle.name &&
97 (
98 (!server && !handle.host) ||
99 (server.host === handle.host)
100 )
101 })
102
103 existObject[handle.uri] = obj !== undefined
104 }
105
106 return res.json(existObject)
107}
108
109async function addUserSubscription (req: express.Request, res: express.Response) {
110 const user = res.locals.oauth.token.User as UserModel
111 const [ name, host ] = req.body.uri.split('@')
112
113 const payload = {
114 name,
115 host,
116 followerActorId: user.Account.Actor.id
117 }
118
119 JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
120 .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
121
122 return res.status(204).end()
123}
124
125function getUserSubscription (req: express.Request, res: express.Response) {
126 const subscription: ActorFollowModel = res.locals.subscription
127
128 return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
129}
130
131async function deleteUserSubscription (req: express.Request, res: express.Response) {
132 const subscription: ActorFollowModel = res.locals.subscription
133
134 await sequelizeTypescript.transaction(async t => {
135 return subscription.destroy({ transaction: t })
136 })
137
138 return res.type('json').status(204).end()
139}
140
141async function getUserSubscriptions (req: express.Request, res: express.Response) {
142 const user = res.locals.oauth.token.User as UserModel
143 const actorId = user.Account.Actor.id
144
145 const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
146
147 return res.json(getFormattedObjects(resultList.data, resultList.total))
148}
149
150async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
151 const user = res.locals.oauth.token.User as UserModel
152 const resultList = await VideoModel.listForApi({
153 start: req.query.start,
154 count: req.query.count,
155 sort: req.query.sort,
156 includeLocalVideos: false,
157 categoryOneOf: req.query.categoryOneOf,
158 licenceOneOf: req.query.licenceOneOf,
159 languageOneOf: req.query.languageOneOf,
160 tagsOneOf: req.query.tagsOneOf,
161 tagsAllOf: req.query.tagsAllOf,
162 nsfw: buildNSFWFilter(res, req.query.nsfw),
163 filter: req.query.filter as VideoFilter,
164 withFiles: false,
165 followerActorId: user.Account.Actor.id,
166 user
167 })
168
169 return res.json(getFormattedObjects(resultList.data, resultList.total))
170}
diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts
index 1fa842d9c..db7602139 100644
--- a/server/controllers/api/video-channel.ts
+++ b/server/controllers/api/video-channel.ts
@@ -22,7 +22,7 @@ import { createVideoChannel } from '../../lib/video-channel'
22import { buildNSFWFilter, createReqFiles, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils' 22import { buildNSFWFilter, createReqFiles, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
23import { setAsyncActorKeys } from '../../lib/activitypub' 23import { setAsyncActorKeys } from '../../lib/activitypub'
24import { AccountModel } from '../../models/account/account' 24import { AccountModel } from '../../models/account/account'
25import { CONFIG, IMAGE_MIMETYPE_EXT, sequelizeTypescript } from '../../initializers' 25import { CONFIG, MIMETYPES, sequelizeTypescript } from '../../initializers'
26import { logger } from '../../helpers/logger' 26import { logger } from '../../helpers/logger'
27import { VideoModel } from '../../models/video/video' 27import { VideoModel } from '../../models/video/video'
28import { updateAvatarValidator } from '../../middlewares/validators/avatar' 28import { updateAvatarValidator } from '../../middlewares/validators/avatar'
@@ -30,9 +30,10 @@ import { updateActorAvatarFile } from '../../lib/avatar'
30import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger' 30import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger'
31import { resetSequelizeInstance } from '../../helpers/database-utils' 31import { resetSequelizeInstance } from '../../helpers/database-utils'
32import { UserModel } from '../../models/account/user' 32import { UserModel } from '../../models/account/user'
33import { JobQueue } from '../../lib/job-queue'
33 34
34const auditLogger = auditLoggerFactory('channels') 35const auditLogger = auditLoggerFactory('channels')
35const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) 36const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR })
36 37
37const videoChannelRouter = express.Router() 38const videoChannelRouter = express.Router()
38 39
@@ -197,15 +198,20 @@ async function removeVideoChannel (req: express.Request, res: express.Response)
197async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) { 198async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) {
198 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id) 199 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id)
199 200
201 if (videoChannelWithVideos.isOutdated()) {
202 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: videoChannelWithVideos.Actor.url } })
203 .catch(err => logger.error('Cannot create AP refresher job for actor %s.', videoChannelWithVideos.Actor.url, { err }))
204 }
205
200 return res.json(videoChannelWithVideos.toFormattedJSON()) 206 return res.json(videoChannelWithVideos.toFormattedJSON())
201} 207}
202 208
203async function listVideoChannelVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 209async function listVideoChannelVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
204 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel 210 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel
205 const actorId = isUserAbleToSearchRemoteURI(res) ? null : undefined 211 const followerActorId = isUserAbleToSearchRemoteURI(res) ? null : undefined
206 212
207 const resultList = await VideoModel.listForApi({ 213 const resultList = await VideoModel.listForApi({
208 actorId, 214 followerActorId,
209 start: req.query.start, 215 start: req.query.start,
210 count: req.query.count, 216 count: req.query.count,
211 sort: req.query.sort, 217 sort: req.query.sort,
@@ -215,9 +221,11 @@ async function listVideoChannelVideos (req: express.Request, res: express.Respon
215 languageOneOf: req.query.languageOneOf, 221 languageOneOf: req.query.languageOneOf,
216 tagsOneOf: req.query.tagsOneOf, 222 tagsOneOf: req.query.tagsOneOf,
217 tagsAllOf: req.query.tagsAllOf, 223 tagsAllOf: req.query.tagsAllOf,
224 filter: req.query.filter,
218 nsfw: buildNSFWFilter(res, req.query.nsfw), 225 nsfw: buildNSFWFilter(res, req.query.nsfw),
219 withFiles: false, 226 withFiles: false,
220 videoChannelId: videoChannelInstance.id 227 videoChannelId: videoChannelInstance.id,
228 user: res.locals.oauth ? res.locals.oauth.token.User : undefined
221 }) 229 })
222 230
223 return res.json(getFormattedObjects(resultList.data, resultList.total)) 231 return res.json(getFormattedObjects(resultList.data, resultList.total))
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts
index d0c81804b..32f9c4793 100644
--- a/server/controllers/api/videos/abuse.ts
+++ b/server/controllers/api/videos/abuse.ts
@@ -3,7 +3,6 @@ import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { getFormattedObjects } from '../../../helpers/utils' 4import { getFormattedObjects } from '../../../helpers/utils'
5import { sequelizeTypescript } from '../../../initializers' 5import { sequelizeTypescript } from '../../../initializers'
6import { sendVideoAbuse } from '../../../lib/activitypub/send'
7import { 6import {
8 asyncMiddleware, 7 asyncMiddleware,
9 asyncRetryTransactionMiddleware, 8 asyncRetryTransactionMiddleware,
@@ -22,6 +21,8 @@ import { VideoModel } from '../../../models/video/video'
22import { VideoAbuseModel } from '../../../models/video/video-abuse' 21import { VideoAbuseModel } from '../../../models/video/video-abuse'
23import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger' 22import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger'
24import { UserModel } from '../../../models/account/user' 23import { UserModel } from '../../../models/account/user'
24import { Notifier } from '../../../lib/notifier'
25import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag'
25 26
26const auditLogger = auditLoggerFactory('abuse') 27const auditLogger = auditLoggerFactory('abuse')
27const abuseVideoRouter = express.Router() 28const abuseVideoRouter = express.Router()
@@ -117,6 +118,8 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) {
117 await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance) 118 await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance)
118 } 119 }
119 120
121 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
122
120 auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON())) 123 auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON()))
121 124
122 return videoAbuseInstance 125 return videoAbuseInstance
diff --git a/server/controllers/api/videos/blacklist.ts b/server/controllers/api/videos/blacklist.ts
index 7f803c8e9..43b0516e7 100644
--- a/server/controllers/api/videos/blacklist.ts
+++ b/server/controllers/api/videos/blacklist.ts
@@ -16,6 +16,10 @@ import {
16} from '../../../middlewares' 16} from '../../../middlewares'
17import { VideoBlacklistModel } from '../../../models/video/video-blacklist' 17import { VideoBlacklistModel } from '../../../models/video/video-blacklist'
18import { sequelizeTypescript } from '../../../initializers' 18import { sequelizeTypescript } from '../../../initializers'
19import { Notifier } from '../../../lib/notifier'
20import { VideoModel } from '../../../models/video/video'
21import { sendCreateVideo, sendDeleteVideo, sendUpdateVideo } from '../../../lib/activitypub/send'
22import { federateVideoIfNeeded } from '../../../lib/activitypub'
19 23
20const blacklistRouter = express.Router() 24const blacklistRouter = express.Router()
21 25
@@ -64,16 +68,26 @@ async function addVideoToBlacklist (req: express.Request, res: express.Response)
64 68
65 const toCreate = { 69 const toCreate = {
66 videoId: videoInstance.id, 70 videoId: videoInstance.id,
71 unfederated: body.unfederate === true,
67 reason: body.reason 72 reason: body.reason
68 } 73 }
69 74
70 await VideoBlacklistModel.create(toCreate) 75 const blacklist = await VideoBlacklistModel.create(toCreate)
76 blacklist.Video = videoInstance
77
78 if (body.unfederate === true) {
79 await sendDeleteVideo(videoInstance, undefined)
80 }
81
82 Notifier.Instance.notifyOnVideoBlacklist(blacklist)
83
84 logger.info('Video %s blacklisted.', res.locals.video.uuid)
85
71 return res.type('json').status(204).end() 86 return res.type('json').status(204).end()
72} 87}
73 88
74async function updateVideoBlacklistController (req: express.Request, res: express.Response) { 89async function updateVideoBlacklistController (req: express.Request, res: express.Response) {
75 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel 90 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel
76 logger.info(videoBlacklist)
77 91
78 if (req.body.reason !== undefined) videoBlacklist.reason = req.body.reason 92 if (req.body.reason !== undefined) videoBlacklist.reason = req.body.reason
79 93
@@ -92,11 +106,20 @@ async function listBlacklist (req: express.Request, res: express.Response, next:
92 106
93async function removeVideoFromBlacklistController (req: express.Request, res: express.Response, next: express.NextFunction) { 107async function removeVideoFromBlacklistController (req: express.Request, res: express.Response, next: express.NextFunction) {
94 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel 108 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel
109 const video: VideoModel = res.locals.video
95 110
96 await sequelizeTypescript.transaction(t => { 111 await sequelizeTypescript.transaction(async t => {
97 return videoBlacklist.destroy({ transaction: t }) 112 const unfederated = videoBlacklist.unfederated
113 await videoBlacklist.destroy({ transaction: t })
114
115 // Re federate the video
116 if (unfederated === true) {
117 await federateVideoIfNeeded(video, true, t)
118 }
98 }) 119 })
99 120
121 Notifier.Instance.notifyOnVideoUnblacklist(video)
122
100 logger.info('Video %s removed from blacklist.', res.locals.video.uuid) 123 logger.info('Video %s removed from blacklist.', res.locals.video.uuid)
101 124
102 return res.type('json').status(204).end() 125 return res.type('json').status(204).end()
diff --git a/server/controllers/api/videos/captions.ts b/server/controllers/api/videos/captions.ts
index 3ba918189..9b3661368 100644
--- a/server/controllers/api/videos/captions.ts
+++ b/server/controllers/api/videos/captions.ts
@@ -2,7 +2,7 @@ import * as express from 'express'
2import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate } from '../../../middlewares' 2import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate } from '../../../middlewares'
3import { addVideoCaptionValidator, deleteVideoCaptionValidator, listVideoCaptionsValidator } from '../../../middlewares/validators' 3import { addVideoCaptionValidator, deleteVideoCaptionValidator, listVideoCaptionsValidator } from '../../../middlewares/validators'
4import { createReqFiles } from '../../../helpers/express-utils' 4import { createReqFiles } from '../../../helpers/express-utils'
5import { CONFIG, sequelizeTypescript, VIDEO_CAPTIONS_MIMETYPE_EXT } from '../../../initializers' 5import { CONFIG, MIMETYPES, sequelizeTypescript } from '../../../initializers'
6import { getFormattedObjects } from '../../../helpers/utils' 6import { getFormattedObjects } from '../../../helpers/utils'
7import { VideoCaptionModel } from '../../../models/video/video-caption' 7import { VideoCaptionModel } from '../../../models/video/video-caption'
8import { VideoModel } from '../../../models/video/video' 8import { VideoModel } from '../../../models/video/video'
@@ -12,7 +12,7 @@ import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
12 12
13const reqVideoCaptionAdd = createReqFiles( 13const reqVideoCaptionAdd = createReqFiles(
14 [ 'captionfile' ], 14 [ 'captionfile' ],
15 VIDEO_CAPTIONS_MIMETYPE_EXT, 15 MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT,
16 { 16 {
17 captionfile: CONFIG.STORAGE.CAPTIONS_DIR 17 captionfile: CONFIG.STORAGE.CAPTIONS_DIR
18 } 18 }
diff --git a/server/controllers/api/videos/comment.ts b/server/controllers/api/videos/comment.ts
index 4f2b4faee..70c1148ba 100644
--- a/server/controllers/api/videos/comment.ts
+++ b/server/controllers/api/videos/comment.ts
@@ -8,7 +8,7 @@ import { buildFormattedCommentTree, createVideoComment } from '../../../lib/vide
8import { 8import {
9 asyncMiddleware, 9 asyncMiddleware,
10 asyncRetryTransactionMiddleware, 10 asyncRetryTransactionMiddleware,
11 authenticate, 11 authenticate, optionalAuthenticate,
12 paginationValidator, 12 paginationValidator,
13 setDefaultPagination, 13 setDefaultPagination,
14 setDefaultSort 14 setDefaultSort
@@ -26,6 +26,7 @@ import { VideoCommentModel } from '../../../models/video/video-comment'
26import { auditLoggerFactory, CommentAuditView, getAuditIdFromRes } from '../../../helpers/audit-logger' 26import { auditLoggerFactory, CommentAuditView, getAuditIdFromRes } from '../../../helpers/audit-logger'
27import { AccountModel } from '../../../models/account/account' 27import { AccountModel } from '../../../models/account/account'
28import { UserModel } from '../../../models/account/user' 28import { UserModel } from '../../../models/account/user'
29import { Notifier } from '../../../lib/notifier'
29 30
30const auditLogger = auditLoggerFactory('comments') 31const auditLogger = auditLoggerFactory('comments')
31const videoCommentRouter = express.Router() 32const videoCommentRouter = express.Router()
@@ -36,10 +37,12 @@ videoCommentRouter.get('/:videoId/comment-threads',
36 setDefaultSort, 37 setDefaultSort,
37 setDefaultPagination, 38 setDefaultPagination,
38 asyncMiddleware(listVideoCommentThreadsValidator), 39 asyncMiddleware(listVideoCommentThreadsValidator),
40 optionalAuthenticate,
39 asyncMiddleware(listVideoThreads) 41 asyncMiddleware(listVideoThreads)
40) 42)
41videoCommentRouter.get('/:videoId/comment-threads/:threadId', 43videoCommentRouter.get('/:videoId/comment-threads/:threadId',
42 asyncMiddleware(listVideoThreadCommentsValidator), 44 asyncMiddleware(listVideoThreadCommentsValidator),
45 optionalAuthenticate,
43 asyncMiddleware(listVideoThreadComments) 46 asyncMiddleware(listVideoThreadComments)
44) 47)
45 48
@@ -69,10 +72,12 @@ export {
69 72
70async function listVideoThreads (req: express.Request, res: express.Response, next: express.NextFunction) { 73async function listVideoThreads (req: express.Request, res: express.Response, next: express.NextFunction) {
71 const video = res.locals.video as VideoModel 74 const video = res.locals.video as VideoModel
75 const user: UserModel = res.locals.oauth ? res.locals.oauth.token.User : undefined
76
72 let resultList: ResultList<VideoCommentModel> 77 let resultList: ResultList<VideoCommentModel>
73 78
74 if (video.commentsEnabled === true) { 79 if (video.commentsEnabled === true) {
75 resultList = await VideoCommentModel.listThreadsForApi(video.id, req.query.start, req.query.count, req.query.sort) 80 resultList = await VideoCommentModel.listThreadsForApi(video.id, req.query.start, req.query.count, req.query.sort, user)
76 } else { 81 } else {
77 resultList = { 82 resultList = {
78 total: 0, 83 total: 0,
@@ -85,10 +90,12 @@ async function listVideoThreads (req: express.Request, res: express.Response, ne
85 90
86async function listVideoThreadComments (req: express.Request, res: express.Response, next: express.NextFunction) { 91async function listVideoThreadComments (req: express.Request, res: express.Response, next: express.NextFunction) {
87 const video = res.locals.video as VideoModel 92 const video = res.locals.video as VideoModel
93 const user: UserModel = res.locals.oauth ? res.locals.oauth.token.User : undefined
94
88 let resultList: ResultList<VideoCommentModel> 95 let resultList: ResultList<VideoCommentModel>
89 96
90 if (video.commentsEnabled === true) { 97 if (video.commentsEnabled === true) {
91 resultList = await VideoCommentModel.listThreadCommentsForApi(video.id, res.locals.videoCommentThread.id) 98 resultList = await VideoCommentModel.listThreadCommentsForApi(video.id, res.locals.videoCommentThread.id, user)
92 } else { 99 } else {
93 resultList = { 100 resultList = {
94 total: 0, 101 total: 0,
@@ -113,6 +120,7 @@ async function addVideoCommentThread (req: express.Request, res: express.Respons
113 }, t) 120 }, t)
114 }) 121 })
115 122
123 Notifier.Instance.notifyOnNewComment(comment)
116 auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON())) 124 auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON()))
117 125
118 return res.json({ 126 return res.json({
@@ -134,6 +142,7 @@ async function addVideoCommentReply (req: express.Request, res: express.Response
134 }, t) 142 }, t)
135 }) 143 })
136 144
145 Notifier.Instance.notifyOnNewComment(comment)
137 auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON())) 146 auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON()))
138 147
139 return res.json({ comment: comment.toFormattedJSON() }).end() 148 return res.json({ comment: comment.toFormattedJSON() }).end()
diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts
index 9e51e2000..7053d5253 100644
--- a/server/controllers/api/videos/import.ts
+++ b/server/controllers/api/videos/import.ts
@@ -3,14 +3,7 @@ import * as magnetUtil from 'magnet-uri'
3import 'multer' 3import 'multer'
4import { auditLoggerFactory, getAuditIdFromRes, VideoImportAuditView } from '../../../helpers/audit-logger' 4import { auditLoggerFactory, getAuditIdFromRes, VideoImportAuditView } from '../../../helpers/audit-logger'
5import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoImportAddValidator } from '../../../middlewares' 5import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoImportAddValidator } from '../../../middlewares'
6import { 6import { CONFIG, MIMETYPES, PREVIEWS_SIZE, sequelizeTypescript, THUMBNAILS_SIZE } from '../../../initializers'
7 CONFIG,
8 IMAGE_MIMETYPE_EXT,
9 PREVIEWS_SIZE,
10 sequelizeTypescript,
11 THUMBNAILS_SIZE,
12 TORRENT_MIMETYPE_EXT
13} from '../../../initializers'
14import { getYoutubeDLInfo, YoutubeDLInfo } from '../../../helpers/youtube-dl' 7import { getYoutubeDLInfo, YoutubeDLInfo } from '../../../helpers/youtube-dl'
15import { createReqFiles } from '../../../helpers/express-utils' 8import { createReqFiles } from '../../../helpers/express-utils'
16import { logger } from '../../../helpers/logger' 9import { logger } from '../../../helpers/logger'
@@ -28,18 +21,18 @@ import { VideoChannelModel } from '../../../models/video/video-channel'
28import * as Bluebird from 'bluebird' 21import * as Bluebird from 'bluebird'
29import * as parseTorrent from 'parse-torrent' 22import * as parseTorrent from 'parse-torrent'
30import { getSecureTorrentName } from '../../../helpers/utils' 23import { getSecureTorrentName } from '../../../helpers/utils'
31import { readFile, rename } from 'fs-extra' 24import { readFile, move } from 'fs-extra'
32 25
33const auditLogger = auditLoggerFactory('video-imports') 26const auditLogger = auditLoggerFactory('video-imports')
34const videoImportsRouter = express.Router() 27const videoImportsRouter = express.Router()
35 28
36const reqVideoFileImport = createReqFiles( 29const reqVideoFileImport = createReqFiles(
37 [ 'thumbnailfile', 'previewfile', 'torrentfile' ], 30 [ 'thumbnailfile', 'previewfile', 'torrentfile' ],
38 Object.assign({}, TORRENT_MIMETYPE_EXT, IMAGE_MIMETYPE_EXT), 31 Object.assign({}, MIMETYPES.TORRENT.MIMETYPE_EXT, MIMETYPES.IMAGE.MIMETYPE_EXT),
39 { 32 {
40 thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, 33 thumbnailfile: CONFIG.STORAGE.TMP_DIR,
41 previewfile: CONFIG.STORAGE.PREVIEWS_DIR, 34 previewfile: CONFIG.STORAGE.TMP_DIR,
42 torrentfile: CONFIG.STORAGE.TORRENTS_DIR 35 torrentfile: CONFIG.STORAGE.TMP_DIR
43 } 36 }
44) 37)
45 38
@@ -78,7 +71,7 @@ async function addTorrentImport (req: express.Request, res: express.Response, to
78 71
79 // Rename the torrent to a secured name 72 // Rename the torrent to a secured name
80 const newTorrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, getSecureTorrentName(torrentName)) 73 const newTorrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, getSecureTorrentName(torrentName))
81 await rename(torrentfile.path, newTorrentPath) 74 await move(torrentfile.path, newTorrentPath)
82 torrentfile.path = newTorrentPath 75 torrentfile.path = newTorrentPath
83 76
84 const buf = await readFile(torrentfile.path) 77 const buf = await readFile(torrentfile.path)
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts
index 7d55f06b6..76a318d13 100644
--- a/server/controllers/api/videos/index.ts
+++ b/server/controllers/api/videos/index.ts
@@ -8,14 +8,13 @@ import { auditLoggerFactory, getAuditIdFromRes, VideoAuditView } from '../../../
8import { getFormattedObjects, getServerActor } from '../../../helpers/utils' 8import { getFormattedObjects, getServerActor } from '../../../helpers/utils'
9import { 9import {
10 CONFIG, 10 CONFIG,
11 IMAGE_MIMETYPE_EXT, 11 MIMETYPES,
12 PREVIEWS_SIZE, 12 PREVIEWS_SIZE,
13 sequelizeTypescript, 13 sequelizeTypescript,
14 THUMBNAILS_SIZE, 14 THUMBNAILS_SIZE,
15 VIDEO_CATEGORIES, 15 VIDEO_CATEGORIES,
16 VIDEO_LANGUAGES, 16 VIDEO_LANGUAGES,
17 VIDEO_LICENCES, 17 VIDEO_LICENCES,
18 VIDEO_MIMETYPE_EXT,
19 VIDEO_PRIVACIES 18 VIDEO_PRIVACIES
20} from '../../../initializers' 19} from '../../../initializers'
21import { 20import {
@@ -24,19 +23,20 @@ import {
24 fetchRemoteVideoDescription, 23 fetchRemoteVideoDescription,
25 getVideoActivityPubUrl 24 getVideoActivityPubUrl
26} from '../../../lib/activitypub' 25} from '../../../lib/activitypub'
27import { sendCreateView } from '../../../lib/activitypub/send'
28import { JobQueue } from '../../../lib/job-queue' 26import { JobQueue } from '../../../lib/job-queue'
29import { Redis } from '../../../lib/redis' 27import { Redis } from '../../../lib/redis'
30import { 28import {
31 asyncMiddleware, 29 asyncMiddleware,
32 asyncRetryTransactionMiddleware, 30 asyncRetryTransactionMiddleware,
33 authenticate, 31 authenticate,
32 checkVideoFollowConstraints,
34 commonVideosFiltersValidator, 33 commonVideosFiltersValidator,
35 optionalAuthenticate, 34 optionalAuthenticate,
36 paginationValidator, 35 paginationValidator,
37 setDefaultPagination, 36 setDefaultPagination,
38 setDefaultSort, 37 setDefaultSort,
39 videosAddValidator, 38 videosAddValidator,
39 videosCustomGetValidator,
40 videosGetValidator, 40 videosGetValidator,
41 videosRemoveValidator, 41 videosRemoveValidator,
42 videosSortValidator, 42 videosSortValidator,
@@ -56,27 +56,29 @@ import { ScheduleVideoUpdateModel } from '../../../models/video/schedule-video-u
56import { videoCaptionsRouter } from './captions' 56import { videoCaptionsRouter } from './captions'
57import { videoImportsRouter } from './import' 57import { videoImportsRouter } from './import'
58import { resetSequelizeInstance } from '../../../helpers/database-utils' 58import { resetSequelizeInstance } from '../../../helpers/database-utils'
59import { rename } from 'fs-extra' 59import { move } from 'fs-extra'
60import { watchingRouter } from './watching' 60import { watchingRouter } from './watching'
61import { Notifier } from '../../../lib/notifier'
62import { sendView } from '../../../lib/activitypub/send/send-view'
61 63
62const auditLogger = auditLoggerFactory('videos') 64const auditLogger = auditLoggerFactory('videos')
63const videosRouter = express.Router() 65const videosRouter = express.Router()
64 66
65const reqVideoFileAdd = createReqFiles( 67const reqVideoFileAdd = createReqFiles(
66 [ 'videofile', 'thumbnailfile', 'previewfile' ], 68 [ 'videofile', 'thumbnailfile', 'previewfile' ],
67 Object.assign({}, VIDEO_MIMETYPE_EXT, IMAGE_MIMETYPE_EXT), 69 Object.assign({}, MIMETYPES.VIDEO.MIMETYPE_EXT, MIMETYPES.IMAGE.MIMETYPE_EXT),
68 { 70 {
69 videofile: CONFIG.STORAGE.VIDEOS_DIR, 71 videofile: CONFIG.STORAGE.TMP_DIR,
70 thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, 72 thumbnailfile: CONFIG.STORAGE.TMP_DIR,
71 previewfile: CONFIG.STORAGE.PREVIEWS_DIR 73 previewfile: CONFIG.STORAGE.TMP_DIR
72 } 74 }
73) 75)
74const reqVideoFileUpdate = createReqFiles( 76const reqVideoFileUpdate = createReqFiles(
75 [ 'thumbnailfile', 'previewfile' ], 77 [ 'thumbnailfile', 'previewfile' ],
76 IMAGE_MIMETYPE_EXT, 78 MIMETYPES.IMAGE.MIMETYPE_EXT,
77 { 79 {
78 thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, 80 thumbnailfile: CONFIG.STORAGE.TMP_DIR,
79 previewfile: CONFIG.STORAGE.PREVIEWS_DIR 81 previewfile: CONFIG.STORAGE.TMP_DIR
80 } 82 }
81) 83)
82 84
@@ -122,8 +124,9 @@ videosRouter.get('/:id/description',
122) 124)
123videosRouter.get('/:id', 125videosRouter.get('/:id',
124 optionalAuthenticate, 126 optionalAuthenticate,
125 asyncMiddleware(videosGetValidator), 127 asyncMiddleware(videosCustomGetValidator('only-video-with-rights')),
126 getVideo 128 asyncMiddleware(checkVideoFollowConstraints),
129 asyncMiddleware(getVideo)
127) 130)
128videosRouter.post('/:id/views', 131videosRouter.post('/:id/views',
129 asyncMiddleware(videosGetValidator), 132 asyncMiddleware(videosGetValidator),
@@ -207,7 +210,7 @@ async function addVideo (req: express.Request, res: express.Response) {
207 // Move physical file 210 // Move physical file
208 const videoDir = CONFIG.STORAGE.VIDEOS_DIR 211 const videoDir = CONFIG.STORAGE.VIDEOS_DIR
209 const destination = join(videoDir, video.getVideoFilename(videoFile)) 212 const destination = join(videoDir, video.getVideoFilename(videoFile))
210 await rename(videoPhysicalFile.path, destination) 213 await move(videoPhysicalFile.path, destination)
211 // This is important in case if there is another attempt in the retry process 214 // This is important in case if there is another attempt in the retry process
212 videoPhysicalFile.filename = video.getVideoFilename(videoFile) 215 videoPhysicalFile.filename = video.getVideoFilename(videoFile)
213 videoPhysicalFile.path = destination 216 videoPhysicalFile.path = destination
@@ -270,6 +273,8 @@ async function addVideo (req: express.Request, res: express.Response) {
270 return videoCreated 273 return videoCreated
271 }) 274 })
272 275
276 Notifier.Instance.notifyOnNewVideo(videoCreated)
277
273 if (video.state === VideoState.TO_TRANSCODE) { 278 if (video.state === VideoState.TO_TRANSCODE) {
274 // Put uuid because we don't have id auto incremented for now 279 // Put uuid because we don't have id auto incremented for now
275 const dataInput = { 280 const dataInput = {
@@ -294,6 +299,7 @@ async function updateVideo (req: express.Request, res: express.Response) {
294 const oldVideoAuditView = new VideoAuditView(videoInstance.toFormattedDetailsJSON()) 299 const oldVideoAuditView = new VideoAuditView(videoInstance.toFormattedDetailsJSON())
295 const videoInfoToUpdate: VideoUpdate = req.body 300 const videoInfoToUpdate: VideoUpdate = req.body
296 const wasPrivateVideo = videoInstance.privacy === VideoPrivacy.PRIVATE 301 const wasPrivateVideo = videoInstance.privacy === VideoPrivacy.PRIVATE
302 const wasUnlistedVideo = videoInstance.privacy === VideoPrivacy.UNLISTED
297 303
298 // Process thumbnail or create it from the video 304 // Process thumbnail or create it from the video
299 if (req.files && req.files['thumbnailfile']) { 305 if (req.files && req.files['thumbnailfile']) {
@@ -308,10 +314,8 @@ async function updateVideo (req: express.Request, res: express.Response) {
308 } 314 }
309 315
310 try { 316 try {
311 await sequelizeTypescript.transaction(async t => { 317 const videoInstanceUpdated = await sequelizeTypescript.transaction(async t => {
312 const sequelizeOptions = { 318 const sequelizeOptions = { transaction: t }
313 transaction: t
314 }
315 const oldVideoChannel = videoInstance.VideoChannel 319 const oldVideoChannel = videoInstance.VideoChannel
316 320
317 if (videoInfoToUpdate.name !== undefined) videoInstance.set('name', videoInfoToUpdate.name) 321 if (videoInfoToUpdate.name !== undefined) videoInstance.set('name', videoInfoToUpdate.name)
@@ -363,7 +367,11 @@ async function updateVideo (req: express.Request, res: express.Response) {
363 } 367 }
364 368
365 const isNewVideo = wasPrivateVideo && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE 369 const isNewVideo = wasPrivateVideo && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE
366 await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t) 370
371 // Don't send update if the video was unfederated
372 if (!videoInstanceUpdated.VideoBlacklist || videoInstanceUpdated.VideoBlacklist.unfederated === false) {
373 await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t)
374 }
367 375
368 auditLogger.update( 376 auditLogger.update(
369 getAuditIdFromRes(res), 377 getAuditIdFromRes(res),
@@ -371,7 +379,13 @@ async function updateVideo (req: express.Request, res: express.Response) {
371 oldVideoAuditView 379 oldVideoAuditView
372 ) 380 )
373 logger.info('Video with name %s and uuid %s updated.', videoInstance.name, videoInstance.uuid) 381 logger.info('Video with name %s and uuid %s updated.', videoInstance.name, videoInstance.uuid)
382
383 return videoInstanceUpdated
374 }) 384 })
385
386 if (wasUnlistedVideo || wasPrivateVideo) {
387 Notifier.Instance.notifyOnNewVideo(videoInstanceUpdated)
388 }
375 } catch (err) { 389 } catch (err) {
376 // Force fields we want to update 390 // Force fields we want to update
377 // If the transaction is retried, sequelize will think the object has not changed 391 // If the transaction is retried, sequelize will think the object has not changed
@@ -384,10 +398,17 @@ async function updateVideo (req: express.Request, res: express.Response) {
384 return res.type('json').status(204).end() 398 return res.type('json').status(204).end()
385} 399}
386 400
387function getVideo (req: express.Request, res: express.Response) { 401async function getVideo (req: express.Request, res: express.Response) {
388 const videoInstance = res.locals.video 402 // We need more attributes
403 const userId: number = res.locals.oauth ? res.locals.oauth.token.User.id : null
404 const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id, undefined, userId)
389 405
390 return res.json(videoInstance.toFormattedDetailsJSON()) 406 if (video.isOutdated()) {
407 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: video.url } })
408 .catch(err => logger.error('Cannot create AP refresher job for video %s.', video.url, { err }))
409 }
410
411 return res.json(video.toFormattedDetailsJSON())
391} 412}
392 413
393async function viewVideo (req: express.Request, res: express.Response) { 414async function viewVideo (req: express.Request, res: express.Response) {
@@ -406,8 +427,7 @@ async function viewVideo (req: express.Request, res: express.Response) {
406 ]) 427 ])
407 428
408 const serverActor = await getServerActor() 429 const serverActor = await getServerActor()
409 430 await sendView(serverActor, videoInstance, undefined)
410 await sendCreateView(serverActor, videoInstance, undefined)
411 431
412 return res.status(204).end() 432 return res.status(204).end()
413} 433}
@@ -425,7 +445,7 @@ async function getVideoDescription (req: express.Request, res: express.Response)
425 return res.json({ description }) 445 return res.json({ description })
426} 446}
427 447
428async function listVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 448async function listVideos (req: express.Request, res: express.Response) {
429 const resultList = await VideoModel.listForApi({ 449 const resultList = await VideoModel.listForApi({
430 start: req.query.start, 450 start: req.query.start,
431 count: req.query.count, 451 count: req.query.count,
@@ -439,7 +459,7 @@ async function listVideos (req: express.Request, res: express.Response, next: ex
439 nsfw: buildNSFWFilter(res, req.query.nsfw), 459 nsfw: buildNSFWFilter(res, req.query.nsfw),
440 filter: req.query.filter as VideoFilter, 460 filter: req.query.filter as VideoFilter,
441 withFiles: false, 461 withFiles: false,
442 userId: res.locals.oauth ? res.locals.oauth.token.User.id : undefined 462 user: res.locals.oauth ? res.locals.oauth.token.User : undefined
443 }) 463 })
444 464
445 return res.json(getFormattedObjects(resultList.data, resultList.total)) 465 return res.json(getFormattedObjects(resultList.data, resultList.total))
diff --git a/server/controllers/api/videos/rate.ts b/server/controllers/api/videos/rate.ts
index dc322bb0c..53952a0a2 100644
--- a/server/controllers/api/videos/rate.ts
+++ b/server/controllers/api/videos/rate.ts
@@ -2,8 +2,8 @@ import * as express from 'express'
2import { UserVideoRateUpdate } from '../../../../shared' 2import { UserVideoRateUpdate } from '../../../../shared'
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { sequelizeTypescript, VIDEO_RATE_TYPES } from '../../../initializers' 4import { sequelizeTypescript, VIDEO_RATE_TYPES } from '../../../initializers'
5import { sendVideoRateChange } from '../../../lib/activitypub' 5import { getRateUrl, sendVideoRateChange } from '../../../lib/activitypub'
6import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoRateValidator } from '../../../middlewares' 6import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoUpdateRateValidator } from '../../../middlewares'
7import { AccountModel } from '../../../models/account/account' 7import { AccountModel } from '../../../models/account/account'
8import { AccountVideoRateModel } from '../../../models/account/account-video-rate' 8import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
9import { VideoModel } from '../../../models/video/video' 9import { VideoModel } from '../../../models/video/video'
@@ -12,7 +12,7 @@ const rateVideoRouter = express.Router()
12 12
13rateVideoRouter.put('/:id/rate', 13rateVideoRouter.put('/:id/rate',
14 authenticate, 14 authenticate,
15 asyncMiddleware(videoRateValidator), 15 asyncMiddleware(videoUpdateRateValidator),
16 asyncRetryTransactionMiddleware(rateVideo) 16 asyncRetryTransactionMiddleware(rateVideo)
17) 17)
18 18
@@ -28,11 +28,12 @@ async function rateVideo (req: express.Request, res: express.Response) {
28 const body: UserVideoRateUpdate = req.body 28 const body: UserVideoRateUpdate = req.body
29 const rateType = body.rating 29 const rateType = body.rating
30 const videoInstance: VideoModel = res.locals.video 30 const videoInstance: VideoModel = res.locals.video
31 const userAccount: AccountModel = res.locals.oauth.token.User.Account
31 32
32 await sequelizeTypescript.transaction(async t => { 33 await sequelizeTypescript.transaction(async t => {
33 const sequelizeOptions = { transaction: t } 34 const sequelizeOptions = { transaction: t }
34 35
35 const accountInstance = await AccountModel.load(res.locals.oauth.token.User.Account.id, t) 36 const accountInstance = await AccountModel.load(userAccount.id, t)
36 const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t) 37 const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t)
37 38
38 let likesToIncrement = 0 39 let likesToIncrement = 0
@@ -44,20 +45,22 @@ async function rateVideo (req: express.Request, res: express.Response) {
44 // There was a previous rate, update it 45 // There was a previous rate, update it
45 if (previousRate) { 46 if (previousRate) {
46 // We will remove the previous rate, so we will need to update the video count attribute 47 // We will remove the previous rate, so we will need to update the video count attribute
47 if (previousRate.type === VIDEO_RATE_TYPES.LIKE) likesToIncrement-- 48 if (previousRate.type === 'like') likesToIncrement--
48 else if (previousRate.type === VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement-- 49 else if (previousRate.type === 'dislike') dislikesToIncrement--
49 50
50 if (rateType === 'none') { // Destroy previous rate 51 if (rateType === 'none') { // Destroy previous rate
51 await previousRate.destroy(sequelizeOptions) 52 await previousRate.destroy(sequelizeOptions)
52 } else { // Update previous rate 53 } else { // Update previous rate
53 previousRate.type = rateType 54 previousRate.type = rateType
55 previousRate.url = getRateUrl(rateType, userAccount.Actor, videoInstance)
54 await previousRate.save(sequelizeOptions) 56 await previousRate.save(sequelizeOptions)
55 } 57 }
56 } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate 58 } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate
57 const query = { 59 const query = {
58 accountId: accountInstance.id, 60 accountId: accountInstance.id,
59 videoId: videoInstance.id, 61 videoId: videoInstance.id,
60 type: rateType 62 type: rateType,
63 url: getRateUrl(rateType, userAccount.Actor, videoInstance)
61 } 64 }
62 65
63 await AccountVideoRateModel.create(query, sequelizeOptions) 66 await AccountVideoRateModel.create(query, sequelizeOptions)
diff --git a/server/controllers/bots.ts b/server/controllers/bots.ts
new file mode 100644
index 000000000..2db86a2d8
--- /dev/null
+++ b/server/controllers/bots.ts
@@ -0,0 +1,101 @@
1import * as express from 'express'
2import { asyncMiddleware } from '../middlewares'
3import { CONFIG, ROUTE_CACHE_LIFETIME } from '../initializers'
4import * as sitemapModule from 'sitemap'
5import { logger } from '../helpers/logger'
6import { VideoModel } from '../models/video/video'
7import { VideoChannelModel } from '../models/video/video-channel'
8import { AccountModel } from '../models/account/account'
9import { cacheRoute } from '../middlewares/cache'
10import { buildNSFWFilter } from '../helpers/express-utils'
11import { truncate } from 'lodash'
12
13const botsRouter = express.Router()
14
15// Special route that add OpenGraph and oEmbed tags
16// Do not use a template engine for a so little thing
17botsRouter.use('/sitemap.xml',
18 asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.SITEMAP)),
19 asyncMiddleware(getSitemap)
20)
21
22// ---------------------------------------------------------------------------
23
24export {
25 botsRouter
26}
27
28// ---------------------------------------------------------------------------
29
30async function getSitemap (req: express.Request, res: express.Response) {
31 let urls = getSitemapBasicUrls()
32
33 urls = urls.concat(await getSitemapLocalVideoUrls())
34 urls = urls.concat(await getSitemapVideoChannelUrls())
35 urls = urls.concat(await getSitemapAccountUrls())
36
37 const sitemap = sitemapModule.createSitemap({
38 hostname: CONFIG.WEBSERVER.URL,
39 urls: urls
40 })
41
42 sitemap.toXML((err, xml) => {
43 if (err) {
44 logger.error('Cannot generate sitemap.', { err })
45 return res.sendStatus(500)
46 }
47
48 res.header('Content-Type', 'application/xml')
49 res.send(xml)
50 })
51}
52
53async function getSitemapVideoChannelUrls () {
54 const rows = await VideoChannelModel.listLocalsForSitemap('createdAt')
55
56 return rows.map(channel => ({
57 url: CONFIG.WEBSERVER.URL + '/video-channels/' + channel.Actor.preferredUsername
58 }))
59}
60
61async function getSitemapAccountUrls () {
62 const rows = await AccountModel.listLocalsForSitemap('createdAt')
63
64 return rows.map(channel => ({
65 url: CONFIG.WEBSERVER.URL + '/accounts/' + channel.Actor.preferredUsername
66 }))
67}
68
69async function getSitemapLocalVideoUrls () {
70 const resultList = await VideoModel.listForApi({
71 start: 0,
72 count: undefined,
73 sort: 'createdAt',
74 includeLocalVideos: true,
75 nsfw: buildNSFWFilter(),
76 filter: 'local',
77 withFiles: false
78 })
79
80 return resultList.data.map(v => ({
81 url: CONFIG.WEBSERVER.URL + '/videos/watch/' + v.uuid,
82 video: [
83 {
84 title: v.name,
85 // Sitemap description should be < 2000 characters
86 description: truncate(v.description || v.name, { length: 2000, omission: '...' }),
87 player_loc: CONFIG.WEBSERVER.URL + '/videos/embed/' + v.uuid,
88 thumbnail_loc: CONFIG.WEBSERVER.URL + v.getThumbnailStaticPath()
89 }
90 ]
91 }))
92}
93
94function getSitemapBasicUrls () {
95 const paths = [
96 '/about/instance',
97 '/videos/local'
98 ]
99
100 return paths.map(p => ({ url: CONFIG.WEBSERVER.URL + p }))
101}
diff --git a/server/controllers/client.ts b/server/controllers/client.ts
index 73b40cf65..f17f2a5d2 100644
--- a/server/controllers/client.ts
+++ b/server/controllers/client.ts
@@ -2,7 +2,7 @@ import * as express from 'express'
2import { join } from 'path' 2import { join } from 'path'
3import { root } from '../helpers/core-utils' 3import { root } from '../helpers/core-utils'
4import { ACCEPT_HEADERS, STATIC_MAX_AGE } from '../initializers' 4import { ACCEPT_HEADERS, STATIC_MAX_AGE } from '../initializers'
5import { asyncMiddleware } from '../middlewares' 5import { asyncMiddleware, embedCSP } from '../middlewares'
6import { buildFileLocale, getCompleteLocale, is18nLocale, LOCALE_FILES } from '../../shared/models/i18n/i18n' 6import { buildFileLocale, getCompleteLocale, is18nLocale, LOCALE_FILES } from '../../shared/models/i18n/i18n'
7import { ClientHtml } from '../lib/client-html' 7import { ClientHtml } from '../lib/client-html'
8import { logger } from '../helpers/logger' 8import { logger } from '../helpers/logger'
@@ -16,21 +16,20 @@ const testEmbedPath = join(distPath, 'standalone', 'videos', 'test-embed.html')
16 16
17// Special route that add OpenGraph and oEmbed tags 17// Special route that add OpenGraph and oEmbed tags
18// Do not use a template engine for a so little thing 18// Do not use a template engine for a so little thing
19clientsRouter.use('/videos/watch/:id', 19clientsRouter.use('/videos/watch/:id', asyncMiddleware(generateWatchHtmlPage))
20 asyncMiddleware(generateWatchHtmlPage)
21)
22 20
23clientsRouter.use('' + 21clientsRouter.use(
24 '/videos/embed', 22 '/videos/embed',
25 (req: express.Request, res: express.Response, next: express.NextFunction) => { 23 embedCSP,
24 (req: express.Request, res: express.Response) => {
26 res.removeHeader('X-Frame-Options') 25 res.removeHeader('X-Frame-Options')
27 res.sendFile(embedPath) 26 res.sendFile(embedPath)
28 } 27 }
29) 28)
30clientsRouter.use('' + 29clientsRouter.use(
31 '/videos/test-embed', (req: express.Request, res: express.Response, next: express.NextFunction) => { 30 '/videos/test-embed',
32 res.sendFile(testEmbedPath) 31 (req: express.Request, res: express.Response) => res.sendFile(testEmbedPath)
33}) 32)
34 33
35// Static HTML/CSS/JS client files 34// Static HTML/CSS/JS client files
36 35
@@ -89,7 +88,7 @@ export {
89// --------------------------------------------------------------------------- 88// ---------------------------------------------------------------------------
90 89
91async function generateHTMLPage (req: express.Request, res: express.Response, paramLang?: string) { 90async function generateHTMLPage (req: express.Request, res: express.Response, paramLang?: string) {
92 const html = await ClientHtml.getIndexHTML(req, res, paramLang) 91 const html = await ClientHtml.getDefaultHTMLPage(req, res, paramLang)
93 92
94 return sendHTML(html, res) 93 return sendHTML(html, res)
95} 94}
diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts
index b30ad8e8d..960085af1 100644
--- a/server/controllers/feeds.ts
+++ b/server/controllers/feeds.ts
@@ -1,7 +1,14 @@
1import * as express from 'express' 1import * as express from 'express'
2import { CONFIG, FEEDS, ROUTE_CACHE_LIFETIME } from '../initializers/constants' 2import { CONFIG, FEEDS, ROUTE_CACHE_LIFETIME } from '../initializers/constants'
3import { THUMBNAILS_SIZE } from '../initializers' 3import { THUMBNAILS_SIZE } from '../initializers'
4import { asyncMiddleware, setDefaultSort, videoCommentsFeedsValidator, videoFeedsValidator, videosSortValidator } from '../middlewares' 4import {
5 asyncMiddleware,
6 commonVideosFiltersValidator,
7 setDefaultSort,
8 videoCommentsFeedsValidator,
9 videoFeedsValidator,
10 videosSortValidator
11} from '../middlewares'
5import { VideoModel } from '../models/video/video' 12import { VideoModel } from '../models/video/video'
6import * as Feed from 'pfeed' 13import * as Feed from 'pfeed'
7import { AccountModel } from '../models/account/account' 14import { AccountModel } from '../models/account/account'
@@ -22,6 +29,7 @@ feedsRouter.get('/feeds/videos.:format',
22 videosSortValidator, 29 videosSortValidator,
23 setDefaultSort, 30 setDefaultSort,
24 asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)), 31 asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)),
32 commonVideosFiltersValidator,
25 asyncMiddleware(videoFeedsValidator), 33 asyncMiddleware(videoFeedsValidator),
26 asyncMiddleware(generateVideoFeed) 34 asyncMiddleware(generateVideoFeed)
27) 35)
@@ -48,7 +56,7 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res
48 56
49 // Adding video items to the feed, one at a time 57 // Adding video items to the feed, one at a time
50 comments.forEach(comment => { 58 comments.forEach(comment => {
51 const link = CONFIG.WEBSERVER.URL + '/videos/watch/' + comment.Video.uuid + ';threadId=' + comment.getThreadId() 59 const link = CONFIG.WEBSERVER.URL + comment.getCommentStaticPath()
52 60
53 feed.addItem({ 61 feed.addItem({
54 title: `${comment.Video.name} - ${comment.Account.getDisplayName()}`, 62 title: `${comment.Video.name} - ${comment.Account.getDisplayName()}`,
diff --git a/server/controllers/index.ts b/server/controllers/index.ts
index 197fa897a..a88a03c79 100644
--- a/server/controllers/index.ts
+++ b/server/controllers/index.ts
@@ -6,3 +6,4 @@ export * from './services'
6export * from './static' 6export * from './static'
7export * from './webfinger' 7export * from './webfinger'
8export * from './tracker' 8export * from './tracker'
9export * from './bots'
diff --git a/server/controllers/static.ts b/server/controllers/static.ts
index 75e30353c..b21f9da00 100644
--- a/server/controllers/static.ts
+++ b/server/controllers/static.ts
@@ -1,6 +1,6 @@
1import * as cors from 'cors' 1import * as cors from 'cors'
2import * as express from 'express' 2import * as express from 'express'
3import { CONFIG, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers' 3import { CONFIG, HLS_PLAYLIST_DIRECTORY, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers'
4import { VideosPreviewCache } from '../lib/cache' 4import { VideosPreviewCache } from '../lib/cache'
5import { cacheRoute } from '../middlewares/cache' 5import { cacheRoute } from '../middlewares/cache'
6import { asyncMiddleware, videosGetValidator } from '../middlewares' 6import { asyncMiddleware, videosGetValidator } from '../middlewares'
@@ -34,18 +34,30 @@ staticRouter.use(
34) 34)
35 35
36// Videos path for webseeding 36// Videos path for webseeding
37const videosPhysicalPath = CONFIG.STORAGE.VIDEOS_DIR
38staticRouter.use( 37staticRouter.use(
39 STATIC_PATHS.WEBSEED, 38 STATIC_PATHS.WEBSEED,
40 cors(), 39 cors(),
41 express.static(videosPhysicalPath) 40 express.static(CONFIG.STORAGE.VIDEOS_DIR, { fallthrough: false }) // 404 because we don't have this video
42) 41)
43staticRouter.use( 42staticRouter.use(
43 STATIC_PATHS.REDUNDANCY,
44 cors(),
45 express.static(CONFIG.STORAGE.REDUNDANCY_DIR, { fallthrough: false }) // 404 because we don't have this video
46)
47
48staticRouter.use(
44 STATIC_DOWNLOAD_PATHS.VIDEOS + ':id-:resolution([0-9]+).:extension', 49 STATIC_DOWNLOAD_PATHS.VIDEOS + ':id-:resolution([0-9]+).:extension',
45 asyncMiddleware(videosGetValidator), 50 asyncMiddleware(videosGetValidator),
46 asyncMiddleware(downloadVideoFile) 51 asyncMiddleware(downloadVideoFile)
47) 52)
48 53
54// HLS
55staticRouter.use(
56 STATIC_PATHS.PLAYLISTS.HLS,
57 cors(),
58 express.static(HLS_PLAYLIST_DIRECTORY, { fallthrough: false }) // 404 if the file does not exist
59)
60
49// Thumbnails path for express 61// Thumbnails path for express
50const thumbnailsPhysicalPath = CONFIG.STORAGE.THUMBNAILS_DIR 62const thumbnailsPhysicalPath = CONFIG.STORAGE.THUMBNAILS_DIR
51staticRouter.use( 63staticRouter.use(
@@ -131,6 +143,12 @@ staticRouter.use('/.well-known/dnt/',
131 } 143 }
132) 144)
133 145
146staticRouter.use('/.well-known/change-password',
147 (_, res: express.Response) => {
148 res.redirect('/my-account/settings')
149 }
150)
151
134// --------------------------------------------------------------------------- 152// ---------------------------------------------------------------------------
135 153
136export { 154export {
diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts
index 9bc7586d1..8b77d9de7 100644
--- a/server/controllers/tracker.ts
+++ b/server/controllers/tracker.ts
@@ -6,6 +6,8 @@ import * as proxyAddr from 'proxy-addr'
6import { Server as WebSocketServer } from 'ws' 6import { Server as WebSocketServer } from 'ws'
7import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants' 7import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
8import { VideoFileModel } from '../models/video/video-file' 8import { VideoFileModel } from '../models/video/video-file'
9import { parse } from 'url'
10import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
9 11
10const TrackerServer = bitTorrentTracker.Server 12const TrackerServer = bitTorrentTracker.Server
11 13
@@ -20,7 +22,7 @@ const trackerServer = new TrackerServer({
20 udp: false, 22 udp: false,
21 ws: false, 23 ws: false,
22 dht: false, 24 dht: false,
23 filter: function (infoHash, params, cb) { 25 filter: async function (infoHash, params, cb) {
24 let ip: string 26 let ip: string
25 27
26 if (params.type === 'ws') { 28 if (params.type === 'ws') {
@@ -31,19 +33,25 @@ const trackerServer = new TrackerServer({
31 33
32 const key = ip + '-' + infoHash 34 const key = ip + '-' + infoHash
33 35
34 peersIps[ip] = peersIps[ip] ? peersIps[ip] + 1 : 1 36 peersIps[ ip ] = peersIps[ ip ] ? peersIps[ ip ] + 1 : 1
35 peersIpInfoHash[key] = peersIpInfoHash[key] ? peersIpInfoHash[key] + 1 : 1 37 peersIpInfoHash[ key ] = peersIpInfoHash[ key ] ? peersIpInfoHash[ key ] + 1 : 1
36 38
37 if (peersIpInfoHash[key] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) { 39 if (peersIpInfoHash[ key ] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) {
38 return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`)) 40 return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`))
39 } 41 }
40 42
41 VideoFileModel.isInfohashExists(infoHash) 43 try {
42 .then(exists => { 44 const videoFileExists = await VideoFileModel.doesInfohashExist(infoHash)
43 if (exists === false) return cb(new Error(`Unknown infoHash ${infoHash}`)) 45 if (videoFileExists === true) return cb()
44 46
45 return cb() 47 const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExist(infoHash)
46 }) 48 if (playlistExists === true) return cb()
49
50 return cb(new Error(`Unknown infoHash ${infoHash}`))
51 } catch (err) {
52 logger.error('Error in tracker filter.', { err })
53 return cb(err)
54 }
47 } 55 }
48}) 56})
49 57
@@ -59,16 +67,26 @@ const onHttpRequest = trackerServer.onHttpRequest.bind(trackerServer)
59trackerRouter.get('/tracker/announce', (req, res) => onHttpRequest(req, res, { action: 'announce' })) 67trackerRouter.get('/tracker/announce', (req, res) => onHttpRequest(req, res, { action: 'announce' }))
60trackerRouter.get('/tracker/scrape', (req, res) => onHttpRequest(req, res, { action: 'scrape' })) 68trackerRouter.get('/tracker/scrape', (req, res) => onHttpRequest(req, res, { action: 'scrape' }))
61 69
62function createWebsocketServer (app: express.Application) { 70function createWebsocketTrackerServer (app: express.Application) {
63 const server = http.createServer(app) 71 const server = http.createServer(app)
64 const wss = new WebSocketServer({ server: server, path: '/tracker/socket' }) 72 const wss = new WebSocketServer({ noServer: true })
73
65 wss.on('connection', function (ws, req) { 74 wss.on('connection', function (ws, req) {
66 const ip = proxyAddr(req, CONFIG.TRUST_PROXY) 75 ws['ip'] = proxyAddr(req, CONFIG.TRUST_PROXY)
67 ws['ip'] = ip
68 76
69 trackerServer.onWebSocketConnection(ws) 77 trackerServer.onWebSocketConnection(ws)
70 }) 78 })
71 79
80 server.on('upgrade', (request, socket, head) => {
81 const pathname = parse(request.url).pathname
82
83 if (pathname === '/tracker/socket') {
84 wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws, request))
85 }
86
87 // Don't destroy socket, we have Socket.IO too
88 })
89
72 return server 90 return server
73} 91}
74 92
@@ -76,7 +94,7 @@ function createWebsocketServer (app: express.Application) {
76 94
77export { 95export {
78 trackerRouter, 96 trackerRouter,
79 createWebsocketServer 97 createWebsocketTrackerServer
80} 98}
81 99
82// --------------------------------------------------------------------------- 100// ---------------------------------------------------------------------------
diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts
index 2469b37b1..62d78373e 100644
--- a/server/helpers/activitypub.ts
+++ b/server/helpers/activitypub.ts
@@ -1,11 +1,12 @@
1import * as Bluebird from 'bluebird' 1import * as Bluebird from 'bluebird'
2import * as validator from 'validator' 2import * as validator from 'validator'
3import { ResultList } from '../../shared/models' 3import { ResultList } from '../../shared/models'
4import { Activity, ActivityPubActor } from '../../shared/models/activitypub' 4import { Activity } from '../../shared/models/activitypub'
5import { ACTIVITY_PUB } from '../initializers' 5import { ACTIVITY_PUB } from '../initializers'
6import { ActorModel } from '../models/activitypub/actor' 6import { ActorModel } from '../models/activitypub/actor'
7import { signObject } from './peertube-crypto' 7import { signJsonLDObject } from './peertube-crypto'
8import { pageToStartAndCount } from './core-utils' 8import { pageToStartAndCount } from './core-utils'
9import { parse } from 'url'
9 10
10function activityPubContextify <T> (data: T) { 11function activityPubContextify <T> (data: T) {
11 return Object.assign(data, { 12 return Object.assign(data, {
@@ -14,25 +15,26 @@ function activityPubContextify <T> (data: T) {
14 'https://w3id.org/security/v1', 15 'https://w3id.org/security/v1',
15 { 16 {
16 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017', 17 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017',
17 pt: 'https://joinpeertube.org/ns', 18 pt: 'https://joinpeertube.org/ns#',
18 schema: 'http://schema.org#', 19 sc: 'http://schema.org#',
19 Hashtag: 'as:Hashtag', 20 Hashtag: 'as:Hashtag',
20 uuid: 'schema:identifier', 21 uuid: 'sc:identifier',
21 category: 'schema:category', 22 category: 'sc:category',
22 licence: 'schema:license', 23 licence: 'sc:license',
23 subtitleLanguage: 'schema:subtitleLanguage', 24 subtitleLanguage: 'sc:subtitleLanguage',
24 sensitive: 'as:sensitive', 25 sensitive: 'as:sensitive',
25 language: 'schema:inLanguage', 26 language: 'sc:inLanguage',
26 views: 'schema:Number', 27 views: 'sc:Number',
27 stats: 'schema:Number', 28 state: 'sc:Number',
28 size: 'schema:Number', 29 size: 'sc:Number',
29 fps: 'schema:Number', 30 fps: 'sc:Number',
30 commentsEnabled: 'schema:Boolean', 31 commentsEnabled: 'sc:Boolean',
31 downloadEnabled: 'schema:Boolean', 32 downloadEnabled: 'sc:Boolean',
32 waitTranscoding: 'schema:Boolean', 33 waitTranscoding: 'sc:Boolean',
33 expires: 'schema:expires', 34 expires: 'sc:expires',
34 support: 'schema:Text', 35 support: 'sc:Text',
35 CacheFile: 'pt:CacheFile' 36 CacheFile: 'pt:CacheFile',
37 Infohash: 'pt:Infohash'
36 }, 38 },
37 { 39 {
38 likes: { 40 likes: {
@@ -57,16 +59,16 @@ function activityPubContextify <T> (data: T) {
57} 59}
58 60
59type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>> 61type ActivityPubCollectionPaginationHandler = (start: number, count: number) => Bluebird<ResultList<any>> | Promise<ResultList<any>>
60async function activityPubCollectionPagination (url: string, handler: ActivityPubCollectionPaginationHandler, page?: any) { 62async function activityPubCollectionPagination (baseUrl: string, handler: ActivityPubCollectionPaginationHandler, page?: any) {
61 if (!page || !validator.isInt(page)) { 63 if (!page || !validator.isInt(page)) {
62 // We just display the first page URL, we only need the total items 64 // We just display the first page URL, we only need the total items
63 const result = await handler(0, 1) 65 const result = await handler(0, 1)
64 66
65 return { 67 return {
66 id: url, 68 id: baseUrl,
67 type: 'OrderedCollection', 69 type: 'OrderedCollection',
68 totalItems: result.total, 70 totalItems: result.total,
69 first: url + '?page=1' 71 first: baseUrl + '?page=1'
70 } 72 }
71 } 73 }
72 74
@@ -81,19 +83,19 @@ async function activityPubCollectionPagination (url: string, handler: ActivityPu
81 83
82 // There are more results 84 // There are more results
83 if (result.total > page * ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE) { 85 if (result.total > page * ACTIVITY_PUB.COLLECTION_ITEMS_PER_PAGE) {
84 next = url + '?page=' + (page + 1) 86 next = baseUrl + '?page=' + (page + 1)
85 } 87 }
86 88
87 if (page > 1) { 89 if (page > 1) {
88 prev = url + '?page=' + (page - 1) 90 prev = baseUrl + '?page=' + (page - 1)
89 } 91 }
90 92
91 return { 93 return {
92 id: url + '?page=' + page, 94 id: baseUrl + '?page=' + page,
93 type: 'OrderedCollectionPage', 95 type: 'OrderedCollectionPage',
94 prev, 96 prev,
95 next, 97 next,
96 partOf: url, 98 partOf: baseUrl,
97 orderedItems: result.data, 99 orderedItems: result.data,
98 totalItems: result.total 100 totalItems: result.total
99 } 101 }
@@ -103,19 +105,27 @@ async function activityPubCollectionPagination (url: string, handler: ActivityPu
103function buildSignedActivity (byActor: ActorModel, data: Object) { 105function buildSignedActivity (byActor: ActorModel, data: Object) {
104 const activity = activityPubContextify(data) 106 const activity = activityPubContextify(data)
105 107
106 return signObject(byActor, activity) as Promise<Activity> 108 return signJsonLDObject(byActor, activity) as Promise<Activity>
107} 109}
108 110
109function getActorUrl (activityActor: string | ActivityPubActor) { 111function getAPId (activity: string | { id: string }) {
110 if (typeof activityActor === 'string') return activityActor 112 if (typeof activity === 'string') return activity
111 113
112 return activityActor.id 114 return activity.id
115}
116
117function checkUrlsSameHost (url1: string, url2: string) {
118 const idHost = parse(url1).host
119 const actorHost = parse(url2).host
120
121 return idHost && actorHost && idHost.toLowerCase() === actorHost.toLowerCase()
113} 122}
114 123
115// --------------------------------------------------------------------------- 124// ---------------------------------------------------------------------------
116 125
117export { 126export {
118 getActorUrl, 127 checkUrlsSameHost,
128 getAPId,
119 activityPubContextify, 129 activityPubContextify,
120 activityPubCollectionPagination, 130 activityPubCollectionPagination,
121 buildSignedActivity 131 buildSignedActivity
diff --git a/server/helpers/captions-utils.ts b/server/helpers/captions-utils.ts
index 660dce65c..0fb11a125 100644
--- a/server/helpers/captions-utils.ts
+++ b/server/helpers/captions-utils.ts
@@ -2,7 +2,7 @@ import { join } from 'path'
2import { CONFIG } from '../initializers' 2import { CONFIG } from '../initializers'
3import { VideoCaptionModel } from '../models/video/video-caption' 3import { VideoCaptionModel } from '../models/video/video-caption'
4import * as srt2vtt from 'srt-to-vtt' 4import * as srt2vtt from 'srt-to-vtt'
5import { createReadStream, createWriteStream, remove, rename } from 'fs-extra' 5import { createReadStream, createWriteStream, remove, move } from 'fs-extra'
6 6
7async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: VideoCaptionModel) { 7async function moveAndProcessCaptionFile (physicalFile: { filename: string, path: string }, videoCaption: VideoCaptionModel) {
8 const videoCaptionsDir = CONFIG.STORAGE.CAPTIONS_DIR 8 const videoCaptionsDir = CONFIG.STORAGE.CAPTIONS_DIR
@@ -13,7 +13,7 @@ async function moveAndProcessCaptionFile (physicalFile: { filename: string, path
13 await convertSrtToVtt(physicalFile.path, destination) 13 await convertSrtToVtt(physicalFile.path, destination)
14 await remove(physicalFile.path) 14 await remove(physicalFile.path)
15 } else { // Just move the vtt file 15 } else { // Just move the vtt file
16 await rename(physicalFile.path, destination) 16 await move(physicalFile.path, destination, { overwrite: true })
17 } 17 }
18 18
19 // This is important in case if there is another attempt in the retry process 19 // This is important in case if there is another attempt in the retry process
diff --git a/server/helpers/core-utils.ts b/server/helpers/core-utils.ts
index 00bc0bdda..f38b82d97 100644
--- a/server/helpers/core-utils.ts
+++ b/server/helpers/core-utils.ts
@@ -5,12 +5,31 @@
5 5
6import * as bcrypt from 'bcrypt' 6import * as bcrypt from 'bcrypt'
7import * as createTorrent from 'create-torrent' 7import * as createTorrent from 'create-torrent'
8import { createHash, pseudoRandomBytes } from 'crypto' 8import { createHash, HexBase64Latin1Encoding, pseudoRandomBytes } from 'crypto'
9import { isAbsolute, join } from 'path' 9import { isAbsolute, join } from 'path'
10import * as pem from 'pem' 10import * as pem from 'pem'
11import { URL } from 'url' 11import { URL } from 'url'
12import { truncate } from 'lodash' 12import { truncate } from 'lodash'
13import { exec } from 'child_process' 13import { exec } from 'child_process'
14import { isArray } from './custom-validators/misc'
15
16const objectConverter = (oldObject: any, keyConverter: (e: string) => string, valueConverter: (e: any) => any) => {
17 if (!oldObject || typeof oldObject !== 'object') {
18 return valueConverter(oldObject)
19 }
20
21 if (isArray(oldObject)) {
22 return oldObject.map(e => objectConverter(e, keyConverter, valueConverter))
23 }
24
25 const newObject = {}
26 Object.keys(oldObject).forEach(oldKey => {
27 const newKey = keyConverter(oldKey)
28 newObject[ newKey ] = objectConverter(oldObject[ oldKey ], keyConverter, valueConverter)
29 })
30
31 return newObject
32}
14 33
15const timeTable = { 34const timeTable = {
16 ms: 1, 35 ms: 1,
@@ -21,6 +40,7 @@ const timeTable = {
21 week: 3600000 * 24 * 7, 40 week: 3600000 * 24 * 7,
22 month: 3600000 * 24 * 30 41 month: 3600000 * 24 * 30
23} 42}
43
24export function parseDuration (duration: number | string): number { 44export function parseDuration (duration: number | string): number {
25 if (typeof duration === 'number') return duration 45 if (typeof duration === 'number') return duration
26 46
@@ -41,6 +61,53 @@ export function parseDuration (duration: number | string): number {
41 throw new Error('Duration could not be properly parsed') 61 throw new Error('Duration could not be properly parsed')
42} 62}
43 63
64export function parseBytes (value: string | number): number {
65 if (typeof value === 'number') return value
66
67 const tgm = /^(\d+)\s*TB\s*(\d+)\s*GB\s*(\d+)\s*MB$/
68 const tg = /^(\d+)\s*TB\s*(\d+)\s*GB$/
69 const tm = /^(\d+)\s*TB\s*(\d+)\s*MB$/
70 const gm = /^(\d+)\s*GB\s*(\d+)\s*MB$/
71 const t = /^(\d+)\s*TB$/
72 const g = /^(\d+)\s*GB$/
73 const m = /^(\d+)\s*MB$/
74 const b = /^(\d+)\s*B$/
75 let match
76
77 if (value.match(tgm)) {
78 match = value.match(tgm)
79 return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024
80 + parseInt(match[2], 10) * 1024 * 1024 * 1024
81 + parseInt(match[3], 10) * 1024 * 1024
82 } else if (value.match(tg)) {
83 match = value.match(tg)
84 return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024
85 + parseInt(match[2], 10) * 1024 * 1024 * 1024
86 } else if (value.match(tm)) {
87 match = value.match(tm)
88 return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024
89 + parseInt(match[2], 10) * 1024 * 1024
90 } else if (value.match(gm)) {
91 match = value.match(gm)
92 return parseInt(match[1], 10) * 1024 * 1024 * 1024
93 + parseInt(match[2], 10) * 1024 * 1024
94 } else if (value.match(t)) {
95 match = value.match(t)
96 return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024
97 } else if (value.match(g)) {
98 match = value.match(g)
99 return parseInt(match[1], 10) * 1024 * 1024 * 1024
100 } else if (value.match(m)) {
101 match = value.match(m)
102 return parseInt(match[1], 10) * 1024 * 1024
103 } else if (value.match(b)) {
104 match = value.match(b)
105 return parseInt(match[1], 10) * 1024
106 } else {
107 return parseInt(value, 10)
108 }
109}
110
44function sanitizeUrl (url: string) { 111function sanitizeUrl (url: string) {
45 const urlObject = new URL(url) 112 const urlObject = new URL(url)
46 113
@@ -126,8 +193,12 @@ function peertubeTruncate (str: string, maxLength: number) {
126 return truncate(str, options) 193 return truncate(str, options)
127} 194}
128 195
129function sha256 (str: string) { 196function sha256 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
130 return createHash('sha256').update(str).digest('hex') 197 return createHash('sha256').update(str).digest(encoding)
198}
199
200function sha1 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
201 return createHash('sha1').update(str).digest(encoding)
131} 202}
132 203
133function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { 204function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
@@ -187,6 +258,7 @@ export {
187 isTestInstance, 258 isTestInstance,
188 isProdInstance, 259 isProdInstance,
189 260
261 objectConverter,
190 root, 262 root,
191 escapeHTML, 263 escapeHTML,
192 pageToStartAndCount, 264 pageToStartAndCount,
@@ -194,7 +266,9 @@ export {
194 sanitizeHost, 266 sanitizeHost,
195 buildPath, 267 buildPath,
196 peertubeTruncate, 268 peertubeTruncate,
269
197 sha256, 270 sha256,
271 sha1,
198 272
199 promisify0, 273 promisify0,
200 promisify1, 274 promisify1,
diff --git a/server/helpers/custom-jsonld-signature.ts b/server/helpers/custom-jsonld-signature.ts
index e4f28018e..27a187db1 100644
--- a/server/helpers/custom-jsonld-signature.ts
+++ b/server/helpers/custom-jsonld-signature.ts
@@ -1,5 +1,5 @@
1import * as AsyncLRU from 'async-lru' 1import * as AsyncLRU from 'async-lru'
2import * as jsonld from 'jsonld/' 2import * as jsonld from 'jsonld'
3import * as jsig from 'jsonld-signatures' 3import * as jsig from 'jsonld-signatures'
4 4
5const nodeDocumentLoader = jsonld.documentLoaders.node() 5const nodeDocumentLoader = jsonld.documentLoaders.node()
@@ -17,4 +17,4 @@ jsonld.documentLoader = (url, cb) => {
17 17
18jsig.use('jsonld', jsonld) 18jsig.use('jsonld', jsonld)
19 19
20export { jsig } 20export { jsig, jsonld }
diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts
index 2562ead9b..b24590d9d 100644
--- a/server/helpers/custom-validators/activitypub/activity.ts
+++ b/server/helpers/custom-validators/activitypub/activity.ts
@@ -1,26 +1,14 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import { Activity, ActivityType } from '../../../../shared/models/activitypub' 2import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3import { 3import { sanitizeAndCheckActorObject } from './actor'
4 isActorAcceptActivityValid, 4import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
5 isActorDeleteActivityValid, 5import { isDislikeActivityValid } from './rate'
6 isActorFollowActivityValid, 6import { sanitizeAndCheckVideoCommentObject } from './video-comments'
7 isActorRejectActivityValid, 7import { sanitizeAndCheckVideoTorrentObject } from './videos'
8 isActorUpdateActivityValid
9} from './actor'
10import { isAnnounceActivityValid } from './announce'
11import { isActivityPubUrlValid } from './misc'
12import { isDislikeActivityValid, isLikeActivityValid } from './rate'
13import { isUndoActivityValid } from './undo'
14import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
15import {
16 isVideoFlagValid,
17 isVideoTorrentDeleteActivityValid,
18 sanitizeAndCheckVideoTorrentCreateActivity,
19 sanitizeAndCheckVideoTorrentUpdateActivity
20} from './videos'
21import { isViewActivityValid } from './view' 8import { isViewActivityValid } from './view'
22import { exists } from '../misc' 9import { exists } from '../misc'
23import { isCacheFileCreateActivityValid, isCacheFileUpdateActivityValid } from './cache-file' 10import { isCacheFileObjectValid } from './cache-file'
11import { isFlagActivityValid } from './flag'
24 12
25function isRootActivityValid (activity: any) { 13function isRootActivityValid (activity: any) {
26 return Array.isArray(activity['@context']) && ( 14 return Array.isArray(activity['@context']) && (
@@ -46,7 +34,10 @@ const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean
46 Reject: checkRejectActivity, 34 Reject: checkRejectActivity,
47 Announce: checkAnnounceActivity, 35 Announce: checkAnnounceActivity,
48 Undo: checkUndoActivity, 36 Undo: checkUndoActivity,
49 Like: checkLikeActivity 37 Like: checkLikeActivity,
38 View: checkViewActivity,
39 Flag: checkFlagActivity,
40 Dislike: checkDislikeActivity
50} 41}
51 42
52function isActivityValid (activity: any) { 43function isActivityValid (activity: any) {
@@ -66,47 +57,79 @@ export {
66 57
67// --------------------------------------------------------------------------- 58// ---------------------------------------------------------------------------
68 59
60function checkViewActivity (activity: any) {
61 return isBaseActivityValid(activity, 'View') &&
62 isViewActivityValid(activity)
63}
64
65function checkFlagActivity (activity: any) {
66 return isBaseActivityValid(activity, 'Flag') &&
67 isFlagActivityValid(activity)
68}
69
70function checkDislikeActivity (activity: any) {
71 return isBaseActivityValid(activity, 'Dislike') &&
72 isDislikeActivityValid(activity)
73}
74
69function checkCreateActivity (activity: any) { 75function checkCreateActivity (activity: any) {
70 return isViewActivityValid(activity) || 76 return isBaseActivityValid(activity, 'Create') &&
71 isDislikeActivityValid(activity) || 77 (
72 sanitizeAndCheckVideoTorrentCreateActivity(activity) || 78 isViewActivityValid(activity.object) ||
73 isVideoFlagValid(activity) || 79 isDislikeActivityValid(activity.object) ||
74 isVideoCommentCreateActivityValid(activity) || 80 isFlagActivityValid(activity.object) ||
75 isCacheFileCreateActivityValid(activity) 81
82 isCacheFileObjectValid(activity.object) ||
83 sanitizeAndCheckVideoCommentObject(activity.object) ||
84 sanitizeAndCheckVideoTorrentObject(activity.object)
85 )
76} 86}
77 87
78function checkUpdateActivity (activity: any) { 88function checkUpdateActivity (activity: any) {
79 return isCacheFileUpdateActivityValid(activity) || 89 return isBaseActivityValid(activity, 'Update') &&
80 sanitizeAndCheckVideoTorrentUpdateActivity(activity) || 90 (
81 isActorUpdateActivityValid(activity) 91 isCacheFileObjectValid(activity.object) ||
92 sanitizeAndCheckVideoTorrentObject(activity.object) ||
93 sanitizeAndCheckActorObject(activity.object)
94 )
82} 95}
83 96
84function checkDeleteActivity (activity: any) { 97function checkDeleteActivity (activity: any) {
85 return isVideoTorrentDeleteActivityValid(activity) || 98 // We don't really check objects
86 isActorDeleteActivityValid(activity) || 99 return isBaseActivityValid(activity, 'Delete') &&
87 isVideoCommentDeleteActivityValid(activity) 100 isObjectValid(activity.object)
88} 101}
89 102
90function checkFollowActivity (activity: any) { 103function checkFollowActivity (activity: any) {
91 return isActorFollowActivityValid(activity) 104 return isBaseActivityValid(activity, 'Follow') &&
105 isObjectValid(activity.object)
92} 106}
93 107
94function checkAcceptActivity (activity: any) { 108function checkAcceptActivity (activity: any) {
95 return isActorAcceptActivityValid(activity) 109 return isBaseActivityValid(activity, 'Accept')
96} 110}
97 111
98function checkRejectActivity (activity: any) { 112function checkRejectActivity (activity: any) {
99 return isActorRejectActivityValid(activity) 113 return isBaseActivityValid(activity, 'Reject')
100} 114}
101 115
102function checkAnnounceActivity (activity: any) { 116function checkAnnounceActivity (activity: any) {
103 return isAnnounceActivityValid(activity) 117 return isBaseActivityValid(activity, 'Announce') &&
118 isObjectValid(activity.object)
104} 119}
105 120
106function checkUndoActivity (activity: any) { 121function checkUndoActivity (activity: any) {
107 return isUndoActivityValid(activity) 122 return isBaseActivityValid(activity, 'Undo') &&
123 (
124 checkFollowActivity(activity.object) ||
125 checkLikeActivity(activity.object) ||
126 checkDislikeActivity(activity.object) ||
127 checkAnnounceActivity(activity.object) ||
128 checkCreateActivity(activity.object)
129 )
108} 130}
109 131
110function checkLikeActivity (activity: any) { 132function checkLikeActivity (activity: any) {
111 return isLikeActivityValid(activity) 133 return isBaseActivityValid(activity, 'Like') &&
134 isObjectValid(activity.object)
112} 135}
diff --git a/server/helpers/custom-validators/activitypub/actor.ts b/server/helpers/custom-validators/activitypub/actor.ts
index 77c003cdf..c05f60f14 100644
--- a/server/helpers/custom-validators/activitypub/actor.ts
+++ b/server/helpers/custom-validators/activitypub/actor.ts
@@ -27,7 +27,8 @@ function isActorPublicKeyValid (publicKey: string) {
27 validator.isLength(publicKey, CONSTRAINTS_FIELDS.ACTORS.PUBLIC_KEY) 27 validator.isLength(publicKey, CONSTRAINTS_FIELDS.ACTORS.PUBLIC_KEY)
28} 28}
29 29
30const actorNameRegExp = new RegExp('^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\-_\.]+$') 30const actorNameAlphabet = '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\-_.]'
31const actorNameRegExp = new RegExp(`^${actorNameAlphabet}+$`)
31function isActorPreferredUsernameValid (preferredUsername: string) { 32function isActorPreferredUsernameValid (preferredUsername: string) {
32 return exists(preferredUsername) && validator.matches(preferredUsername, actorNameRegExp) 33 return exists(preferredUsername) && validator.matches(preferredUsername, actorNameRegExp)
33} 34}
@@ -72,24 +73,10 @@ function isActorDeleteActivityValid (activity: any) {
72 return isBaseActivityValid(activity, 'Delete') 73 return isBaseActivityValid(activity, 'Delete')
73} 74}
74 75
75function isActorFollowActivityValid (activity: any) { 76function sanitizeAndCheckActorObject (object: any) {
76 return isBaseActivityValid(activity, 'Follow') && 77 normalizeActor(object)
77 isActivityPubUrlValid(activity.object)
78}
79
80function isActorAcceptActivityValid (activity: any) {
81 return isBaseActivityValid(activity, 'Accept')
82}
83
84function isActorRejectActivityValid (activity: any) {
85 return isBaseActivityValid(activity, 'Reject')
86}
87
88function isActorUpdateActivityValid (activity: any) {
89 normalizeActor(activity.object)
90 78
91 return isBaseActivityValid(activity, 'Update') && 79 return isActorObjectValid(object)
92 isActorObjectValid(activity.object)
93} 80}
94 81
95function normalizeActor (actor: any) { 82function normalizeActor (actor: any) {
@@ -127,6 +114,7 @@ function areValidActorHandles (handles: string[]) {
127 114
128export { 115export {
129 normalizeActor, 116 normalizeActor,
117 actorNameAlphabet,
130 areValidActorHandles, 118 areValidActorHandles,
131 isActorEndpointsObjectValid, 119 isActorEndpointsObjectValid,
132 isActorPublicKeyObjectValid, 120 isActorPublicKeyObjectValid,
@@ -137,10 +125,7 @@ export {
137 isActorObjectValid, 125 isActorObjectValid,
138 isActorFollowingCountValid, 126 isActorFollowingCountValid,
139 isActorFollowersCountValid, 127 isActorFollowersCountValid,
140 isActorFollowActivityValid,
141 isActorAcceptActivityValid,
142 isActorRejectActivityValid,
143 isActorDeleteActivityValid, 128 isActorDeleteActivityValid,
144 isActorUpdateActivityValid, 129 sanitizeAndCheckActorObject,
145 isValidActorHandle 130 isValidActorHandle
146} 131}
diff --git a/server/helpers/custom-validators/activitypub/announce.ts b/server/helpers/custom-validators/activitypub/announce.ts
deleted file mode 100644
index 0519c6026..000000000
--- a/server/helpers/custom-validators/activitypub/announce.ts
+++ /dev/null
@@ -1,13 +0,0 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
2
3function isAnnounceActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Announce') &&
5 (
6 isActivityPubUrlValid(activity.object) ||
7 (activity.object && isActivityPubUrlValid(activity.object.id))
8 )
9}
10
11export {
12 isAnnounceActivityValid
13}
diff --git a/server/helpers/custom-validators/activitypub/cache-file.ts b/server/helpers/custom-validators/activitypub/cache-file.ts
index bd70934c8..21d5c53ca 100644
--- a/server/helpers/custom-validators/activitypub/cache-file.ts
+++ b/server/helpers/custom-validators/activitypub/cache-file.ts
@@ -1,28 +1,26 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid } from './misc'
2import { isRemoteVideoUrlValid } from './videos' 2import { isRemoteVideoUrlValid } from './videos'
3import { isDateValid, exists } from '../misc' 3import { exists, isDateValid } from '../misc'
4import { CacheFileObject } from '../../../../shared/models/activitypub/objects' 4import { CacheFileObject } from '../../../../shared/models/activitypub/objects'
5 5
6function isCacheFileCreateActivityValid (activity: any) {
7 return isBaseActivityValid(activity, 'Create') &&
8 isCacheFileObjectValid(activity.object)
9}
10
11function isCacheFileUpdateActivityValid (activity: any) {
12 return isBaseActivityValid(activity, 'Update') &&
13 isCacheFileObjectValid(activity.object)
14}
15
16function isCacheFileObjectValid (object: CacheFileObject) { 6function isCacheFileObjectValid (object: CacheFileObject) {
17 return exists(object) && 7 return exists(object) &&
18 object.type === 'CacheFile' && 8 object.type === 'CacheFile' &&
19 isDateValid(object.expires) && 9 isDateValid(object.expires) &&
20 isActivityPubUrlValid(object.object) && 10 isActivityPubUrlValid(object.object) &&
21 isRemoteVideoUrlValid(object.url) 11 (isRemoteVideoUrlValid(object.url) || isPlaylistRedundancyUrlValid(object.url))
22} 12}
23 13
14// ---------------------------------------------------------------------------
15
24export { 16export {
25 isCacheFileUpdateActivityValid,
26 isCacheFileCreateActivityValid,
27 isCacheFileObjectValid 17 isCacheFileObjectValid
28} 18}
19
20// ---------------------------------------------------------------------------
21
22function isPlaylistRedundancyUrlValid (url: any) {
23 return url.type === 'Link' &&
24 (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
25 isActivityPubUrlValid(url.href)
26}
diff --git a/server/helpers/custom-validators/activitypub/flag.ts b/server/helpers/custom-validators/activitypub/flag.ts
new file mode 100644
index 000000000..6452e297c
--- /dev/null
+++ b/server/helpers/custom-validators/activitypub/flag.ts
@@ -0,0 +1,14 @@
1import { isActivityPubUrlValid } from './misc'
2import { isVideoAbuseReasonValid } from '../video-abuses'
3
4function isFlagActivityValid (activity: any) {
5 return activity.type === 'Flag' &&
6 isVideoAbuseReasonValid(activity.content) &&
7 isActivityPubUrlValid(activity.object)
8}
9
10// ---------------------------------------------------------------------------
11
12export {
13 isFlagActivityValid
14}
diff --git a/server/helpers/custom-validators/activitypub/misc.ts b/server/helpers/custom-validators/activitypub/misc.ts
index 4e2c57f04..f1762d11c 100644
--- a/server/helpers/custom-validators/activitypub/misc.ts
+++ b/server/helpers/custom-validators/activitypub/misc.ts
@@ -28,15 +28,20 @@ function isBaseActivityValid (activity: any, type: string) {
28 return (activity['@context'] === undefined || Array.isArray(activity['@context'])) && 28 return (activity['@context'] === undefined || Array.isArray(activity['@context'])) &&
29 activity.type === type && 29 activity.type === type &&
30 isActivityPubUrlValid(activity.id) && 30 isActivityPubUrlValid(activity.id) &&
31 exists(activity.actor) && 31 isObjectValid(activity.actor) &&
32 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) && 32 isUrlCollectionValid(activity.to) &&
33 ( 33 isUrlCollectionValid(activity.cc)
34 activity.to === undefined || 34}
35 (Array.isArray(activity.to) && activity.to.every(t => isActivityPubUrlValid(t))) 35
36 ) && 36function isUrlCollectionValid (collection: any) {
37 return collection === undefined ||
38 (Array.isArray(collection) && collection.every(t => isActivityPubUrlValid(t)))
39}
40
41function isObjectValid (object: any) {
42 return exists(object) &&
37 ( 43 (
38 activity.cc === undefined || 44 isActivityPubUrlValid(object) || isActivityPubUrlValid(object.id)
39 (Array.isArray(activity.cc) && activity.cc.every(t => isActivityPubUrlValid(t)))
40 ) 45 )
41} 46}
42 47
@@ -57,5 +62,6 @@ export {
57 isUrlValid, 62 isUrlValid,
58 isActivityPubUrlValid, 63 isActivityPubUrlValid,
59 isBaseActivityValid, 64 isBaseActivityValid,
60 setValidAttributedTo 65 setValidAttributedTo,
66 isObjectValid
61} 67}
diff --git a/server/helpers/custom-validators/activitypub/rate.ts b/server/helpers/custom-validators/activitypub/rate.ts
index e70bd94b8..ba68e8074 100644
--- a/server/helpers/custom-validators/activitypub/rate.ts
+++ b/server/helpers/custom-validators/activitypub/rate.ts
@@ -1,20 +1,13 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid, isObjectValid } from './misc'
2
3function isLikeActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Like') &&
5 isActivityPubUrlValid(activity.object)
6}
7 2
8function isDislikeActivityValid (activity: any) { 3function isDislikeActivityValid (activity: any) {
9 return isBaseActivityValid(activity, 'Create') && 4 return activity.type === 'Dislike' &&
10 activity.object.type === 'Dislike' && 5 isActivityPubUrlValid(activity.actor) &&
11 isActivityPubUrlValid(activity.object.actor) && 6 isObjectValid(activity.object)
12 isActivityPubUrlValid(activity.object.object)
13} 7}
14 8
15// --------------------------------------------------------------------------- 9// ---------------------------------------------------------------------------
16 10
17export { 11export {
18 isLikeActivityValid,
19 isDislikeActivityValid 12 isDislikeActivityValid
20} 13}
diff --git a/server/helpers/custom-validators/activitypub/undo.ts b/server/helpers/custom-validators/activitypub/undo.ts
deleted file mode 100644
index 578035893..000000000
--- a/server/helpers/custom-validators/activitypub/undo.ts
+++ /dev/null
@@ -1,20 +0,0 @@
1import { isActorFollowActivityValid } from './actor'
2import { isBaseActivityValid } from './misc'
3import { isDislikeActivityValid, isLikeActivityValid } from './rate'
4import { isAnnounceActivityValid } from './announce'
5import { isCacheFileCreateActivityValid } from './cache-file'
6
7function isUndoActivityValid (activity: any) {
8 return isBaseActivityValid(activity, 'Undo') &&
9 (
10 isActorFollowActivityValid(activity.object) ||
11 isLikeActivityValid(activity.object) ||
12 isDislikeActivityValid(activity.object) ||
13 isAnnounceActivityValid(activity.object) ||
14 isCacheFileCreateActivityValid(activity.object)
15 )
16}
17
18export {
19 isUndoActivityValid
20}
diff --git a/server/helpers/custom-validators/activitypub/video-comments.ts b/server/helpers/custom-validators/activitypub/video-comments.ts
index 051c4565a..0415db21c 100644
--- a/server/helpers/custom-validators/activitypub/video-comments.ts
+++ b/server/helpers/custom-validators/activitypub/video-comments.ts
@@ -3,11 +3,6 @@ import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
3import { exists, isArray, isDateValid } from '../misc' 3import { exists, isArray, isDateValid } from '../misc'
4import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 4import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
5 5
6function isVideoCommentCreateActivityValid (activity: any) {
7 return isBaseActivityValid(activity, 'Create') &&
8 sanitizeAndCheckVideoCommentObject(activity.object)
9}
10
11function sanitizeAndCheckVideoCommentObject (comment: any) { 6function sanitizeAndCheckVideoCommentObject (comment: any) {
12 if (!comment || comment.type !== 'Note') return false 7 if (!comment || comment.type !== 'Note') return false
13 8
@@ -25,15 +20,9 @@ function sanitizeAndCheckVideoCommentObject (comment: any) {
25 ) // Only accept public comments 20 ) // Only accept public comments
26} 21}
27 22
28function isVideoCommentDeleteActivityValid (activity: any) {
29 return isBaseActivityValid(activity, 'Delete')
30}
31
32// --------------------------------------------------------------------------- 23// ---------------------------------------------------------------------------
33 24
34export { 25export {
35 isVideoCommentCreateActivityValid,
36 isVideoCommentDeleteActivityValid,
37 sanitizeAndCheckVideoCommentObject 26 sanitizeAndCheckVideoCommentObject
38} 27}
39 28
diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts
index 5015c59dd..53ad0588d 100644
--- a/server/helpers/custom-validators/activitypub/videos.ts
+++ b/server/helpers/custom-validators/activitypub/videos.ts
@@ -1,7 +1,7 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers' 2import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
3import { peertubeTruncate } from '../../core-utils' 3import { peertubeTruncate } from '../../core-utils'
4import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc' 4import { exists, isArray, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
5import { 5import {
6 isVideoDurationValid, 6 isVideoDurationValid,
7 isVideoNameValid, 7 isVideoNameValid,
@@ -12,29 +12,12 @@ import {
12} from '../videos' 12} from '../videos'
13import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc' 13import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc'
14import { VideoState } from '../../../../shared/models/videos' 14import { VideoState } from '../../../../shared/models/videos'
15import { isVideoAbuseReasonValid } from '../video-abuses'
16
17function sanitizeAndCheckVideoTorrentCreateActivity (activity: any) {
18 return isBaseActivityValid(activity, 'Create') &&
19 sanitizeAndCheckVideoTorrentObject(activity.object)
20}
21 15
22function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) { 16function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) {
23 return isBaseActivityValid(activity, 'Update') && 17 return isBaseActivityValid(activity, 'Update') &&
24 sanitizeAndCheckVideoTorrentObject(activity.object) 18 sanitizeAndCheckVideoTorrentObject(activity.object)
25} 19}
26 20
27function isVideoTorrentDeleteActivityValid (activity: any) {
28 return isBaseActivityValid(activity, 'Delete')
29}
30
31function isVideoFlagValid (activity: any) {
32 return isBaseActivityValid(activity, 'Create') &&
33 activity.object.type === 'Flag' &&
34 isVideoAbuseReasonValid(activity.object.content) &&
35 isActivityPubUrlValid(activity.object.object)
36}
37
38function isActivityPubVideoDurationValid (value: string) { 21function isActivityPubVideoDurationValid (value: string) {
39 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration 22 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
40 return exists(value) && 23 return exists(value) &&
@@ -83,32 +66,35 @@ function isRemoteVideoUrlValid (url: any) {
83 66
84 return url.type === 'Link' && 67 return url.type === 'Link' &&
85 ( 68 (
86 ACTIVITY_PUB.URL_MIME_TYPES.VIDEO.indexOf(url.mimeType) !== -1 && 69 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
70 ACTIVITY_PUB.URL_MIME_TYPES.VIDEO.indexOf(url.mediaType || url.mimeType) !== -1 &&
87 isActivityPubUrlValid(url.href) && 71 isActivityPubUrlValid(url.href) &&
88 validator.isInt(url.height + '', { min: 0 }) && 72 validator.isInt(url.height + '', { min: 0 }) &&
89 validator.isInt(url.size + '', { min: 0 }) && 73 validator.isInt(url.size + '', { min: 0 }) &&
90 (!url.fps || validator.isInt(url.fps + '', { min: -1 })) 74 (!url.fps || validator.isInt(url.fps + '', { min: -1 }))
91 ) || 75 ) ||
92 ( 76 (
93 ACTIVITY_PUB.URL_MIME_TYPES.TORRENT.indexOf(url.mimeType) !== -1 && 77 ACTIVITY_PUB.URL_MIME_TYPES.TORRENT.indexOf(url.mediaType || url.mimeType) !== -1 &&
94 isActivityPubUrlValid(url.href) && 78 isActivityPubUrlValid(url.href) &&
95 validator.isInt(url.height + '', { min: 0 }) 79 validator.isInt(url.height + '', { min: 0 })
96 ) || 80 ) ||
97 ( 81 (
98 ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mimeType) !== -1 && 82 ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mediaType || url.mimeType) !== -1 &&
99 validator.isLength(url.href, { min: 5 }) && 83 validator.isLength(url.href, { min: 5 }) &&
100 validator.isInt(url.height + '', { min: 0 }) 84 validator.isInt(url.height + '', { min: 0 })
85 ) ||
86 (
87 (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
88 isActivityPubUrlValid(url.href) &&
89 isArray(url.tag)
101 ) 90 )
102} 91}
103 92
104// --------------------------------------------------------------------------- 93// ---------------------------------------------------------------------------
105 94
106export { 95export {
107 sanitizeAndCheckVideoTorrentCreateActivity,
108 sanitizeAndCheckVideoTorrentUpdateActivity, 96 sanitizeAndCheckVideoTorrentUpdateActivity,
109 isVideoTorrentDeleteActivityValid,
110 isRemoteStringIdentifierValid, 97 isRemoteStringIdentifierValid,
111 isVideoFlagValid,
112 sanitizeAndCheckVideoTorrentObject, 98 sanitizeAndCheckVideoTorrentObject,
113 isRemoteVideoUrlValid 99 isRemoteVideoUrlValid
114} 100}
diff --git a/server/helpers/custom-validators/activitypub/view.ts b/server/helpers/custom-validators/activitypub/view.ts
index 7a3aca6f5..41d16469f 100644
--- a/server/helpers/custom-validators/activitypub/view.ts
+++ b/server/helpers/custom-validators/activitypub/view.ts
@@ -1,11 +1,11 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid } from './misc'
2 2
3function isViewActivityValid (activity: any) { 3function isViewActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Create') && 4 return activity.type === 'View' &&
5 activity.object.type === 'View' && 5 isActivityPubUrlValid(activity.actor) &&
6 isActivityPubUrlValid(activity.object.actor) && 6 isActivityPubUrlValid(activity.object)
7 isActivityPubUrlValid(activity.object.object)
8} 7}
8
9// --------------------------------------------------------------------------- 9// ---------------------------------------------------------------------------
10 10
11export { 11export {
diff --git a/server/helpers/custom-validators/misc.ts b/server/helpers/custom-validators/misc.ts
index 6d10a65a8..76647fea2 100644
--- a/server/helpers/custom-validators/misc.ts
+++ b/server/helpers/custom-validators/misc.ts
@@ -9,6 +9,14 @@ function isArray (value: any) {
9 return Array.isArray(value) 9 return Array.isArray(value)
10} 10}
11 11
12function isNotEmptyIntArray (value: any) {
13 return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
14}
15
16function isArrayOf (value: any, validator: (value: any) => boolean) {
17 return isArray(value) && value.every(v => validator(v))
18}
19
12function isDateValid (value: string) { 20function isDateValid (value: string) {
13 return exists(value) && validator.isISO8601(value) 21 return exists(value) && validator.isISO8601(value)
14} 22}
@@ -78,6 +86,8 @@ function isFileValid (
78 86
79export { 87export {
80 exists, 88 exists,
89 isArrayOf,
90 isNotEmptyIntArray,
81 isArray, 91 isArray,
82 isIdValid, 92 isIdValid,
83 isUUIDValid, 93 isUUIDValid,
diff --git a/server/helpers/custom-validators/servers.ts b/server/helpers/custom-validators/servers.ts
index d5021bf38..18c80ec8f 100644
--- a/server/helpers/custom-validators/servers.ts
+++ b/server/helpers/custom-validators/servers.ts
@@ -3,6 +3,7 @@ import 'express-validator'
3 3
4import { isArray, exists } from './misc' 4import { isArray, exists } from './misc'
5import { isTestInstance } from '../core-utils' 5import { isTestInstance } from '../core-utils'
6import { CONSTRAINTS_FIELDS } from '../../initializers'
6 7
7function isHostValid (host: string) { 8function isHostValid (host: string) {
8 const isURLOptions = { 9 const isURLOptions = {
@@ -26,9 +27,19 @@ function isEachUniqueHostValid (hosts: string[]) {
26 }) 27 })
27} 28}
28 29
30function isValidContactBody (value: any) {
31 return exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.CONTACT_FORM.BODY)
32}
33
34function isValidContactFromName (value: any) {
35 return exists(value) && validator.isLength(value, CONSTRAINTS_FIELDS.CONTACT_FORM.FROM_NAME)
36}
37
29// --------------------------------------------------------------------------- 38// ---------------------------------------------------------------------------
30 39
31export { 40export {
41 isValidContactBody,
42 isValidContactFromName,
32 isEachUniqueHostValid, 43 isEachUniqueHostValid,
33 isHostValid 44 isHostValid
34} 45}
diff --git a/server/helpers/custom-validators/user-notifications.ts b/server/helpers/custom-validators/user-notifications.ts
new file mode 100644
index 000000000..02ea3bbc2
--- /dev/null
+++ b/server/helpers/custom-validators/user-notifications.ts
@@ -0,0 +1,23 @@
1import { exists } from './misc'
2import * as validator from 'validator'
3import { UserNotificationType } from '../../../shared/models/users'
4import { UserNotificationSettingValue } from '../../../shared/models/users/user-notification-setting.model'
5
6function isUserNotificationTypeValid (value: any) {
7 return exists(value) && validator.isInt('' + value) && UserNotificationType[value] !== undefined
8}
9
10function isUserNotificationSettingValid (value: any) {
11 return exists(value) &&
12 validator.isInt('' + value) && (
13 value === UserNotificationSettingValue.NONE ||
14 value === UserNotificationSettingValue.WEB ||
15 value === UserNotificationSettingValue.EMAIL ||
16 value === (UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL)
17 )
18}
19
20export {
21 isUserNotificationSettingValid,
22 isUserNotificationTypeValid
23}
diff --git a/server/helpers/custom-validators/users.ts b/server/helpers/custom-validators/users.ts
index 90fc74a48..80652b479 100644
--- a/server/helpers/custom-validators/users.ts
+++ b/server/helpers/custom-validators/users.ts
@@ -42,6 +42,14 @@ function isUserNSFWPolicyValid (value: any) {
42 return exists(value) && nsfwPolicies.indexOf(value) !== -1 42 return exists(value) && nsfwPolicies.indexOf(value) !== -1
43} 43}
44 44
45function isUserWebTorrentEnabledValid (value: any) {
46 return isBooleanValid(value)
47}
48
49function isUserVideosHistoryEnabledValid (value: any) {
50 return isBooleanValid(value)
51}
52
45function isUserAutoPlayVideoValid (value: any) { 53function isUserAutoPlayVideoValid (value: any) {
46 return isBooleanValid(value) 54 return isBooleanValid(value)
47} 55}
@@ -69,6 +77,7 @@ function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } |
69// --------------------------------------------------------------------------- 77// ---------------------------------------------------------------------------
70 78
71export { 79export {
80 isUserVideosHistoryEnabledValid,
72 isUserBlockedValid, 81 isUserBlockedValid,
73 isUserPasswordValid, 82 isUserPasswordValid,
74 isUserBlockedReasonValid, 83 isUserBlockedReasonValid,
@@ -78,6 +87,7 @@ export {
78 isUserUsernameValid, 87 isUserUsernameValid,
79 isUserEmailVerifiedValid, 88 isUserEmailVerifiedValid,
80 isUserNSFWPolicyValid, 89 isUserNSFWPolicyValid,
90 isUserWebTorrentEnabledValid,
81 isUserAutoPlayVideoValid, 91 isUserAutoPlayVideoValid,
82 isUserDisplayNameValid, 92 isUserDisplayNameValid,
83 isUserDescriptionValid, 93 isUserDescriptionValid,
diff --git a/server/helpers/custom-validators/video-captions.ts b/server/helpers/custom-validators/video-captions.ts
index 177e9e86e..b33d90e18 100644
--- a/server/helpers/custom-validators/video-captions.ts
+++ b/server/helpers/custom-validators/video-captions.ts
@@ -1,4 +1,4 @@
1import { CONSTRAINTS_FIELDS, VIDEO_CAPTIONS_MIMETYPE_EXT, VIDEO_LANGUAGES } from '../../initializers' 1import { CONSTRAINTS_FIELDS, MIMETYPES, VIDEO_LANGUAGES } from '../../initializers'
2import { exists, isFileValid } from './misc' 2import { exists, isFileValid } from './misc'
3import { Response } from 'express' 3import { Response } from 'express'
4import { VideoModel } from '../../models/video/video' 4import { VideoModel } from '../../models/video/video'
@@ -8,7 +8,7 @@ function isVideoCaptionLanguageValid (value: any) {
8 return exists(value) && VIDEO_LANGUAGES[ value ] !== undefined 8 return exists(value) && VIDEO_LANGUAGES[ value ] !== undefined
9} 9}
10 10
11const videoCaptionTypes = Object.keys(VIDEO_CAPTIONS_MIMETYPE_EXT) 11const videoCaptionTypes = Object.keys(MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT)
12 .concat([ 'application/octet-stream' ]) // MacOS sends application/octet-stream >< 12 .concat([ 'application/octet-stream' ]) // MacOS sends application/octet-stream ><
13 .map(m => `(${m})`) 13 .map(m => `(${m})`)
14const videoCaptionTypesRegex = videoCaptionTypes.join('|') 14const videoCaptionTypesRegex = videoCaptionTypes.join('|')
diff --git a/server/helpers/custom-validators/video-imports.ts b/server/helpers/custom-validators/video-imports.ts
index 4d6ab1fa4..ce9e9193c 100644
--- a/server/helpers/custom-validators/video-imports.ts
+++ b/server/helpers/custom-validators/video-imports.ts
@@ -1,7 +1,7 @@
1import 'express-validator' 1import 'express-validator'
2import 'multer' 2import 'multer'
3import * as validator from 'validator' 3import * as validator from 'validator'
4import { CONSTRAINTS_FIELDS, TORRENT_MIMETYPE_EXT, VIDEO_IMPORT_STATES } from '../../initializers' 4import { CONSTRAINTS_FIELDS, MIMETYPES, VIDEO_IMPORT_STATES } from '../../initializers'
5import { exists, isFileValid } from './misc' 5import { exists, isFileValid } from './misc'
6import * as express from 'express' 6import * as express from 'express'
7import { VideoImportModel } from '../../models/video/video-import' 7import { VideoImportModel } from '../../models/video/video-import'
@@ -24,7 +24,7 @@ function isVideoImportStateValid (value: any) {
24 return exists(value) && VIDEO_IMPORT_STATES[ value ] !== undefined 24 return exists(value) && VIDEO_IMPORT_STATES[ value ] !== undefined
25} 25}
26 26
27const videoTorrentImportTypes = Object.keys(TORRENT_MIMETYPE_EXT).map(m => `(${m})`) 27const videoTorrentImportTypes = Object.keys(MIMETYPES.TORRENT.MIMETYPE_EXT).map(m => `(${m})`)
28const videoTorrentImportRegex = videoTorrentImportTypes.join('|') 28const videoTorrentImportRegex = videoTorrentImportTypes.join('|')
29function isVideoImportTorrentFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { 29function isVideoImportTorrentFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
30 return isFileValid(files, videoTorrentImportRegex, 'torrentfile', CONSTRAINTS_FIELDS.VIDEO_IMPORTS.TORRENT_FILE.FILE_SIZE.max, true) 30 return isFileValid(files, videoTorrentImportRegex, 'torrentfile', CONSTRAINTS_FIELDS.VIDEO_IMPORTS.TORRENT_FILE.FILE_SIZE.max, true)
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts
index 714f7ac95..95e256b8f 100644
--- a/server/helpers/custom-validators/videos.ts
+++ b/server/helpers/custom-validators/videos.ts
@@ -3,12 +3,11 @@ import 'express-validator'
3import { values } from 'lodash' 3import { values } from 'lodash'
4import 'multer' 4import 'multer'
5import * as validator from 'validator' 5import * as validator from 'validator'
6import { UserRight, VideoPrivacy, VideoRateType } from '../../../shared' 6import { UserRight, VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
7import { 7import {
8 CONSTRAINTS_FIELDS, 8 CONSTRAINTS_FIELDS, MIMETYPES,
9 VIDEO_CATEGORIES, 9 VIDEO_CATEGORIES,
10 VIDEO_LICENCES, 10 VIDEO_LICENCES,
11 VIDEO_MIMETYPE_EXT,
12 VIDEO_PRIVACIES, 11 VIDEO_PRIVACIES,
13 VIDEO_RATE_TYPES, 12 VIDEO_RATE_TYPES,
14 VIDEO_STATES 13 VIDEO_STATES
@@ -22,6 +21,10 @@ import { fetchVideo, VideoFetchType } from '../video'
22 21
23const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS 22const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
24 23
24function isVideoFilterValid (filter: VideoFilter) {
25 return filter === 'local' || filter === 'all-local'
26}
27
25function isVideoCategoryValid (value: any) { 28function isVideoCategoryValid (value: any) {
26 return value === null || VIDEO_CATEGORIES[ value ] !== undefined 29 return value === null || VIDEO_CATEGORIES[ value ] !== undefined
27} 30}
@@ -79,10 +82,15 @@ function isVideoRatingTypeValid (value: string) {
79 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1 82 return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
80} 83}
81 84
82const videoFileTypes = Object.keys(VIDEO_MIMETYPE_EXT).map(m => `(${m})`) 85function isVideoFileExtnameValid (value: string) {
83const videoFileTypesRegex = videoFileTypes.join('|') 86 return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
87}
84 88
85function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { 89function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
90 const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
91 .map(m => `(${m})`)
92 .join('|')
93
86 return isFileValid(files, videoFileTypesRegex, 'videofile', null) 94 return isFileValid(files, videoFileTypesRegex, 'videofile', null)
87} 95}
88 96
@@ -217,6 +225,7 @@ export {
217 isVideoStateValid, 225 isVideoStateValid,
218 isVideoViewsValid, 226 isVideoViewsValid,
219 isVideoRatingTypeValid, 227 isVideoRatingTypeValid,
228 isVideoFileExtnameValid,
220 isVideoDurationValid, 229 isVideoDurationValid,
221 isVideoTagValid, 230 isVideoTagValid,
222 isVideoPrivacyValid, 231 isVideoPrivacyValid,
@@ -225,5 +234,6 @@ export {
225 isVideoExist, 234 isVideoExist,
226 isVideoImage, 235 isVideoImage,
227 isVideoChannelOfAccountExist, 236 isVideoChannelOfAccountExist,
228 isVideoSupportValid 237 isVideoSupportValid,
238 isVideoFilterValid
229} 239}
diff --git a/server/helpers/express-utils.ts b/server/helpers/express-utils.ts
index 8a9cee8c5..9a72ee96d 100644
--- a/server/helpers/express-utils.ts
+++ b/server/helpers/express-utils.ts
@@ -2,18 +2,17 @@ import * as express from 'express'
2import * as multer from 'multer' 2import * as multer from 'multer'
3import { CONFIG, REMOTE_SCHEME } from '../initializers' 3import { CONFIG, REMOTE_SCHEME } from '../initializers'
4import { logger } from './logger' 4import { logger } from './logger'
5import { User } from '../../shared/models/users'
6import { deleteFileAsync, generateRandomString } from './utils' 5import { deleteFileAsync, generateRandomString } from './utils'
7import { extname } from 'path' 6import { extname } from 'path'
8import { isArray } from './custom-validators/misc' 7import { isArray } from './custom-validators/misc'
9import { UserModel } from '../models/account/user' 8import { UserModel } from '../models/account/user'
10 9
11function buildNSFWFilter (res: express.Response, paramNSFW?: string) { 10function buildNSFWFilter (res?: express.Response, paramNSFW?: string) {
12 if (paramNSFW === 'true') return true 11 if (paramNSFW === 'true') return true
13 if (paramNSFW === 'false') return false 12 if (paramNSFW === 'false') return false
14 if (paramNSFW === 'both') return undefined 13 if (paramNSFW === 'both') return undefined
15 14
16 if (res.locals.oauth) { 15 if (res && res.locals.oauth) {
17 const user: UserModel = res.locals.oauth.token.User 16 const user: UserModel = res.locals.oauth.token.User
18 17
19 // User does not want NSFW videos 18 // User does not want NSFW videos
@@ -101,7 +100,7 @@ function createReqFiles (
101} 100}
102 101
103function isUserAbleToSearchRemoteURI (res: express.Response) { 102function isUserAbleToSearchRemoteURI (res: express.Response) {
104 const user: User = res.locals.oauth ? res.locals.oauth.token.User : undefined 103 const user: UserModel = res.locals.oauth ? res.locals.oauth.token.User : undefined
105 104
106 return CONFIG.SEARCH.REMOTE_URI.ANONYMOUS === true || 105 return CONFIG.SEARCH.REMOTE_URI.ANONYMOUS === true ||
107 (CONFIG.SEARCH.REMOTE_URI.USERS === true && user !== undefined) 106 (CONFIG.SEARCH.REMOTE_URI.USERS === true && user !== undefined)
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts
index 22bc25476..133b1b03b 100644
--- a/server/helpers/ffmpeg-utils.ts
+++ b/server/helpers/ffmpeg-utils.ts
@@ -1,7 +1,7 @@
1import * as ffmpeg from 'fluent-ffmpeg' 1import * as ffmpeg from 'fluent-ffmpeg'
2import { join } from 'path' 2import { dirname, join } from 'path'
3import { VideoResolution } from '../../shared/models/videos' 3import { getTargetBitrate, VideoResolution } from '../../shared/models/videos'
4import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers' 4import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers/constants'
5import { processImage } from './image-utils' 5import { processImage } from './image-utils'
6import { logger } from './logger' 6import { logger } from './logger'
7import { checkFFmpegEncoders } from '../initializers/checker-before-init' 7import { checkFFmpegEncoders } from '../initializers/checker-before-init'
@@ -29,19 +29,28 @@ function computeResolutionsToTranscode (videoFileHeight: number) {
29 return resolutionsEnabled 29 return resolutionsEnabled
30} 30}
31 31
32async function getVideoFileResolution (path: string) { 32async function getVideoFileSize (path: string) {
33 const videoStream = await getVideoFileStream(path) 33 const videoStream = await getVideoFileStream(path)
34 34
35 return { 35 return {
36 videoFileResolution: Math.min(videoStream.height, videoStream.width), 36 width: videoStream.width,
37 isPortraitMode: videoStream.height > videoStream.width 37 height: videoStream.height
38 }
39}
40
41async function getVideoFileResolution (path: string) {
42 const size = await getVideoFileSize(path)
43
44 return {
45 videoFileResolution: Math.min(size.height, size.width),
46 isPortraitMode: size.height > size.width
38 } 47 }
39} 48}
40 49
41async function getVideoFileFPS (path: string) { 50async function getVideoFileFPS (path: string) {
42 const videoStream = await getVideoFileStream(path) 51 const videoStream = await getVideoFileStream(path)
43 52
44 for (const key of [ 'r_frame_rate' , 'avg_frame_rate' ]) { 53 for (const key of [ 'avg_frame_rate', 'r_frame_rate' ]) {
45 const valuesText: string = videoStream[key] 54 const valuesText: string = videoStream[key]
46 if (!valuesText) continue 55 if (!valuesText) continue
47 56
@@ -55,6 +64,16 @@ async function getVideoFileFPS (path: string) {
55 return 0 64 return 0
56} 65}
57 66
67async function getVideoFileBitrate (path: string) {
68 return new Promise<number>((res, rej) => {
69 ffmpeg.ffprobe(path, (err, metadata) => {
70 if (err) return rej(err)
71
72 return res(metadata.format.bit_rate)
73 })
74 })
75}
76
58function getDurationFromVideoFile (path: string) { 77function getDurationFromVideoFile (path: string) {
59 return new Promise<number>((res, rej) => { 78 return new Promise<number>((res, rej) => {
60 ffmpeg.ffprobe(path, (err, metadata) => { 79 ffmpeg.ffprobe(path, (err, metadata) => {
@@ -100,64 +119,87 @@ async function generateImageFromVideoFile (fromPath: string, folder: string, ima
100type TranscodeOptions = { 119type TranscodeOptions = {
101 inputPath: string 120 inputPath: string
102 outputPath: string 121 outputPath: string
103 resolution?: VideoResolution 122 resolution: VideoResolution
104 isPortraitMode?: boolean 123 isPortraitMode?: boolean
124
125 hlsPlaylist?: {
126 videoFilename: string
127 }
105} 128}
106 129
107function transcode (options: TranscodeOptions) { 130function transcode (options: TranscodeOptions) {
108 return new Promise<void>(async (res, rej) => { 131 return new Promise<void>(async (res, rej) => {
109 let command = ffmpeg(options.inputPath, { niceness: FFMPEG_NICE.TRANSCODING }) 132 try {
110 .output(options.outputPath) 133 let fps = await getVideoFileFPS(options.inputPath)
111 .preset(standard)
112
113 if (CONFIG.TRANSCODING.THREADS > 0) {
114 // if we don't set any threads ffmpeg will chose automatically
115 command = command.outputOption('-threads ' + CONFIG.TRANSCODING.THREADS)
116 }
117
118 let fps = await getVideoFileFPS(options.inputPath)
119 if (options.resolution !== undefined) {
120 // '?x720' or '720x?' for example
121 const size = options.isPortraitMode === true ? `${options.resolution}x?` : `?x${options.resolution}`
122 command = command.size(size)
123
124 // On small/medium resolutions, limit FPS 134 // On small/medium resolutions, limit FPS
125 if ( 135 if (
136 options.resolution !== undefined &&
126 options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN && 137 options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN &&
127 fps > VIDEO_TRANSCODING_FPS.AVERAGE 138 fps > VIDEO_TRANSCODING_FPS.AVERAGE
128 ) { 139 ) {
129 fps = VIDEO_TRANSCODING_FPS.AVERAGE 140 fps = VIDEO_TRANSCODING_FPS.AVERAGE
130 } 141 }
131 }
132 142
133 if (fps) { 143 let command = ffmpeg(options.inputPath, { niceness: FFMPEG_NICE.TRANSCODING })
134 // Hard FPS limits 144 .output(options.outputPath)
135 if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = VIDEO_TRANSCODING_FPS.MAX 145 command = await presetH264(command, options.resolution, fps)
136 else if (fps < VIDEO_TRANSCODING_FPS.MIN) fps = VIDEO_TRANSCODING_FPS.MIN
137 146
138 command = command.withFPS(fps) 147 if (CONFIG.TRANSCODING.THREADS > 0) {
139 } 148 // if we don't set any threads ffmpeg will chose automatically
149 command = command.outputOption('-threads ' + CONFIG.TRANSCODING.THREADS)
150 }
151
152 if (options.resolution !== undefined) {
153 // '?x720' or '720x?' for example
154 const size = options.isPortraitMode === true ? `${options.resolution}x?` : `?x${options.resolution}`
155 command = command.size(size)
156 }
157
158 if (fps) {
159 // Hard FPS limits
160 if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = VIDEO_TRANSCODING_FPS.MAX
161 else if (fps < VIDEO_TRANSCODING_FPS.MIN) fps = VIDEO_TRANSCODING_FPS.MIN
162
163 command = command.withFPS(fps)
164 }
165
166 if (options.hlsPlaylist) {
167 const videoPath = `${dirname(options.outputPath)}/${options.hlsPlaylist.videoFilename}`
168
169 command = command.outputOption('-hls_time 4')
170 .outputOption('-hls_list_size 0')
171 .outputOption('-hls_playlist_type vod')
172 .outputOption('-hls_segment_filename ' + videoPath)
173 .outputOption('-hls_segment_type fmp4')
174 .outputOption('-f hls')
175 .outputOption('-hls_flags single_file')
176 }
140 177
141 command 178 command
142 .on('error', (err, stdout, stderr) => { 179 .on('error', (err, stdout, stderr) => {
143 logger.error('Error in transcoding job.', { stdout, stderr }) 180 logger.error('Error in transcoding job.', { stdout, stderr })
144 return rej(err) 181 return rej(err)
145 }) 182 })
146 .on('end', res) 183 .on('end', res)
147 .run() 184 .run()
185 } catch (err) {
186 return rej(err)
187 }
148 }) 188 })
149} 189}
150 190
151// --------------------------------------------------------------------------- 191// ---------------------------------------------------------------------------
152 192
153export { 193export {
194 getVideoFileSize,
154 getVideoFileResolution, 195 getVideoFileResolution,
155 getDurationFromVideoFile, 196 getDurationFromVideoFile,
156 generateImageFromVideoFile, 197 generateImageFromVideoFile,
157 transcode, 198 transcode,
158 getVideoFileFPS, 199 getVideoFileFPS,
159 computeResolutionsToTranscode, 200 computeResolutionsToTranscode,
160 audio 201 audio,
202 getVideoFileBitrate
161} 203}
162 204
163// --------------------------------------------------------------------------- 205// ---------------------------------------------------------------------------
@@ -168,7 +210,7 @@ function getVideoFileStream (path: string) {
168 if (err) return rej(err) 210 if (err) return rej(err)
169 211
170 const videoStream = metadata.streams.find(s => s.codec_type === 'video') 212 const videoStream = metadata.streams.find(s => s.codec_type === 'video')
171 if (!videoStream) throw new Error('Cannot find video stream of ' + path) 213 if (!videoStream) return rej(new Error('Cannot find video stream of ' + path))
172 214
173 return res(videoStream) 215 return res(videoStream)
174 }) 216 })
@@ -182,11 +224,10 @@ function getVideoFileStream (path: string) {
182 * and quality. Superfast and ultrafast will give you better 224 * and quality. Superfast and ultrafast will give you better
183 * performance, but then quality is noticeably worse. 225 * performance, but then quality is noticeably worse.
184 */ 226 */
185function veryfast (_ffmpeg) { 227async function presetH264VeryFast (command: ffmpeg.FfmpegCommand, resolution: VideoResolution, fps: number): Promise<ffmpeg.FfmpegCommand> {
186 _ffmpeg 228 let localCommand = await presetH264(command, resolution, fps)
187 .preset(standard) 229 localCommand = localCommand.outputOption('-preset:v veryfast')
188 .outputOption('-preset:v veryfast') 230 .outputOption([ '--aq-mode=2', '--aq-strength=1.3' ])
189 .outputOption(['--aq-mode=2', '--aq-strength=1.3'])
190 /* 231 /*
191 MAIN reference: https://slhck.info/video/2017/03/01/rate-control.html 232 MAIN reference: https://slhck.info/video/2017/03/01/rate-control.html
192 Our target situation is closer to a livestream than a stream, 233 Our target situation is closer to a livestream than a stream,
@@ -198,31 +239,39 @@ function veryfast (_ffmpeg) {
198 Make up for most of the loss of grain and macroblocking 239 Make up for most of the loss of grain and macroblocking
199 with less computing power. 240 with less computing power.
200 */ 241 */
242
243 return localCommand
201} 244}
202 245
203/** 246/**
204 * A preset optimised for a stillimage audio video 247 * A preset optimised for a stillimage audio video
205 */ 248 */
206function audio (_ffmpeg) { 249async function presetStillImageWithAudio (
207 _ffmpeg 250 command: ffmpeg.FfmpegCommand,
208 .preset(veryfast) 251 resolution: VideoResolution,
209 .outputOption('-tune stillimage') 252 fps: number
253): Promise<ffmpeg.FfmpegCommand> {
254 let localCommand = await presetH264VeryFast(command, resolution, fps)
255 localCommand = localCommand.outputOption('-tune stillimage')
256
257 return localCommand
210} 258}
211 259
212/** 260/**
213 * A toolbox to play with audio 261 * A toolbox to play with audio
214 */ 262 */
215namespace audio { 263namespace audio {
216 export const get = (_ffmpeg, pos: number | string = 0) => { 264 export const get = (option: ffmpeg.FfmpegCommand | string) => {
217 // without position, ffprobe considers the last input only 265 // without position, ffprobe considers the last input only
218 // we make it consider the first input only 266 // we make it consider the first input only
219 // if you pass a file path to pos, then ffprobe acts on that file directly 267 // if you pass a file path to pos, then ffprobe acts on that file directly
220 return new Promise<{ absolutePath: string, audioStream?: any }>((res, rej) => { 268 return new Promise<{ absolutePath: string, audioStream?: any }>((res, rej) => {
221 _ffmpeg.ffprobe(pos, (err,data) => { 269
270 function parseFfprobe (err: any, data: ffmpeg.FfprobeData) {
222 if (err) return rej(err) 271 if (err) return rej(err)
223 272
224 if ('streams' in data) { 273 if ('streams' in data) {
225 const audioStream = data['streams'].find(stream => stream['codec_type'] === 'audio') 274 const audioStream = data.streams.find(stream => stream['codec_type'] === 'audio')
226 if (audioStream) { 275 if (audioStream) {
227 return res({ 276 return res({
228 absolutePath: data.format.filename, 277 absolutePath: data.format.filename,
@@ -230,8 +279,15 @@ namespace audio {
230 }) 279 })
231 } 280 }
232 } 281 }
282
233 return res({ absolutePath: data.format.filename }) 283 return res({ absolutePath: data.format.filename })
234 }) 284 }
285
286 if (typeof option === 'string') {
287 return ffmpeg.ffprobe(option, parseFfprobe)
288 }
289
290 return option.ffprobe(parseFfprobe)
235 }) 291 })
236 } 292 }
237 293
@@ -273,39 +329,48 @@ namespace audio {
273 * As for the audio, quality '5' is the highest and ensures 96-112kbps/channel 329 * As for the audio, quality '5' is the highest and ensures 96-112kbps/channel
274 * See https://trac.ffmpeg.org/wiki/Encode/AAC#fdk_vbr 330 * See https://trac.ffmpeg.org/wiki/Encode/AAC#fdk_vbr
275 */ 331 */
276async function standard (_ffmpeg) { 332async function presetH264 (command: ffmpeg.FfmpegCommand, resolution: VideoResolution, fps: number): Promise<ffmpeg.FfmpegCommand> {
277 let localFfmpeg = _ffmpeg 333 let localCommand = command
278 .format('mp4') 334 .format('mp4')
279 .videoCodec('libx264') 335 .videoCodec('libx264')
280 .outputOption('-level 3.1') // 3.1 is the minimal ressource allocation for our highest supported resolution 336 .outputOption('-level 3.1') // 3.1 is the minimal ressource allocation for our highest supported resolution
281 .outputOption('-b_strategy 1') // NOTE: b-strategy 1 - heuristic algorythm, 16 is optimal B-frames for it 337 .outputOption('-b_strategy 1') // NOTE: b-strategy 1 - heuristic algorythm, 16 is optimal B-frames for it
282 .outputOption('-bf 16') // NOTE: Why 16: https://github.com/Chocobozzz/PeerTube/pull/774. b-strategy 2 -> B-frames<16 338 .outputOption('-bf 16') // NOTE: Why 16: https://github.com/Chocobozzz/PeerTube/pull/774. b-strategy 2 -> B-frames<16
339 .outputOption('-pix_fmt yuv420p') // allows import of source material with incompatible pixel formats (e.g. MJPEG video)
283 .outputOption('-map_metadata -1') // strip all metadata 340 .outputOption('-map_metadata -1') // strip all metadata
284 .outputOption('-movflags faststart') 341 .outputOption('-movflags faststart')
285 const _audio = await audio.get(localFfmpeg)
286 342
287 if (!_audio.audioStream) { 343 const parsedAudio = await audio.get(localCommand)
288 return localFfmpeg.noAudio()
289 }
290 344
291 // we favor VBR, if a good AAC encoder is available 345 if (!parsedAudio.audioStream) {
292 if ((await checkFFmpegEncoders()).get('libfdk_aac')) { 346 localCommand = localCommand.noAudio()
293 return localFfmpeg 347 } else if ((await checkFFmpegEncoders()).get('libfdk_aac')) { // we favor VBR, if a good AAC encoder is available
348 localCommand = localCommand
294 .audioCodec('libfdk_aac') 349 .audioCodec('libfdk_aac')
295 .audioQuality(5) 350 .audioQuality(5)
351 } else {
352 // we try to reduce the ceiling bitrate by making rough correspondances of bitrates
353 // of course this is far from perfect, but it might save some space in the end
354 const audioCodecName = parsedAudio.audioStream[ 'codec_name' ]
355 let bitrate: number
356 if (audio.bitrate[ audioCodecName ]) {
357 localCommand = localCommand.audioCodec('aac')
358
359 bitrate = audio.bitrate[ audioCodecName ](parsedAudio.audioStream[ 'bit_rate' ])
360 if (bitrate !== undefined && bitrate !== -1) localCommand = localCommand.audioBitrate(bitrate)
361 }
296 } 362 }
297 363
298 // we try to reduce the ceiling bitrate by making rough correspondances of bitrates 364 // Constrained Encoding (VBV)
299 // of course this is far from perfect, but it might save some space in the end 365 // https://slhck.info/video/2017/03/01/rate-control.html
300 const audioCodecName = _audio.audioStream['codec_name'] 366 // https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
301 let bitrate: number 367 const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
302 if (audio.bitrate[audioCodecName]) { 368 localCommand = localCommand.outputOptions([`-maxrate ${ targetBitrate }`, `-bufsize ${ targetBitrate * 2 }`])
303 bitrate = audio.bitrate[audioCodecName](_audio.audioStream['bit_rate'])
304
305 if (bitrate === -1) return localFfmpeg.audioCodec('copy')
306 }
307 369
308 if (bitrate !== undefined) return localFfmpeg.audioBitrate(bitrate) 370 // Keyframe interval of 2 seconds for faster seeking and resolution switching.
371 // https://streaminglearningcenter.com/blogs/whats-the-right-keyframe-interval.html
372 // https://superuser.com/a/908325
373 localCommand = localCommand.outputOption(`-g ${ fps * 2 }`)
309 374
310 return localFfmpeg 375 return localCommand
311} 376}
diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts
index 3eaa674ed..e43ea3f1d 100644
--- a/server/helpers/image-utils.ts
+++ b/server/helpers/image-utils.ts
@@ -1,13 +1,26 @@
1import 'multer' 1import 'multer'
2import * as sharp from 'sharp' 2import * as sharp from 'sharp'
3import { remove } from 'fs-extra' 3import { readFile, remove } from 'fs-extra'
4import { logger } from './logger'
4 5
5async function processImage ( 6async function processImage (
6 physicalFile: { path: string }, 7 physicalFile: { path: string },
7 destination: string, 8 destination: string,
8 newSize: { width: number, height: number } 9 newSize: { width: number, height: number }
9) { 10) {
10 await sharp(physicalFile.path) 11 if (physicalFile.path === destination) {
12 throw new Error('Sharp needs an input path different that the output path.')
13 }
14
15 logger.debug('Processing image %s to %s.', physicalFile.path, destination)
16
17 // Avoid sharp cache
18 const buf = await readFile(physicalFile.path)
19 const sharpInstance = sharp(buf)
20
21 await remove(destination)
22
23 await sharpInstance
11 .resize(newSize.width, newSize.height) 24 .resize(newSize.width, newSize.height)
12 .toFile(destination) 25 .toFile(destination)
13 26
diff --git a/server/helpers/peertube-crypto.ts b/server/helpers/peertube-crypto.ts
index 5c182961d..ab9ec077e 100644
--- a/server/helpers/peertube-crypto.ts
+++ b/server/helpers/peertube-crypto.ts
@@ -1,8 +1,14 @@
1import { BCRYPT_SALT_SIZE, PRIVATE_RSA_KEY_SIZE } from '../initializers' 1import { Request } from 'express'
2import { BCRYPT_SALT_SIZE, HTTP_SIGNATURE, PRIVATE_RSA_KEY_SIZE } from '../initializers'
2import { ActorModel } from '../models/activitypub/actor' 3import { ActorModel } from '../models/activitypub/actor'
3import { bcryptComparePromise, bcryptGenSaltPromise, bcryptHashPromise, createPrivateKey, getPublicKey } from './core-utils' 4import { bcryptComparePromise, bcryptGenSaltPromise, bcryptHashPromise, createPrivateKey, getPublicKey, sha256 } from './core-utils'
4import { jsig } from './custom-jsonld-signature' 5import { jsig, jsonld } from './custom-jsonld-signature'
5import { logger } from './logger' 6import { logger } from './logger'
7import { cloneDeep } from 'lodash'
8import { createVerify } from 'crypto'
9import { buildDigest } from '../lib/job-queue/handlers/utils/activitypub-http-utils'
10
11const httpSignature = require('http-signature')
6 12
7async function createPrivateAndPublicKeys () { 13async function createPrivateAndPublicKeys () {
8 logger.info('Generating a RSA key...') 14 logger.info('Generating a RSA key...')
@@ -13,18 +19,57 @@ async function createPrivateAndPublicKeys () {
13 return { privateKey: key, publicKey } 19 return { privateKey: key, publicKey }
14} 20}
15 21
16function isSignatureVerified (fromActor: ActorModel, signedDocument: object) { 22// User password checks
23
24function comparePassword (plainPassword: string, hashPassword: string) {
25 return bcryptComparePromise(plainPassword, hashPassword)
26}
27
28async function cryptPassword (password: string) {
29 const salt = await bcryptGenSaltPromise(BCRYPT_SALT_SIZE)
30
31 return bcryptHashPromise(password, salt)
32}
33
34// HTTP Signature
35
36function isHTTPSignatureDigestValid (rawBody: Buffer, req: Request): boolean {
37 if (req.headers[HTTP_SIGNATURE.HEADER_NAME] && req.headers['digest']) {
38 return buildDigest(rawBody.toString()) === req.headers['digest']
39 }
40
41 return true
42}
43
44function isHTTPSignatureVerified (httpSignatureParsed: any, actor: ActorModel): boolean {
45 return httpSignature.verifySignature(httpSignatureParsed, actor.publicKey) === true
46}
47
48function parseHTTPSignature (req: Request, clockSkew?: number) {
49 return httpSignature.parse(req, { authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME, clockSkew })
50}
51
52// JSONLD
53
54async function isJsonLDSignatureVerified (fromActor: ActorModel, signedDocument: any): Promise<boolean> {
55 if (signedDocument.signature.type === 'RsaSignature2017') {
56 // Mastodon algorithm
57 const res = await isJsonLDRSA2017Verified(fromActor, signedDocument)
58 // Success? If no, try with our library
59 if (res === true) return true
60 }
61
17 const publicKeyObject = { 62 const publicKeyObject = {
18 '@context': jsig.SECURITY_CONTEXT_URL, 63 '@context': jsig.SECURITY_CONTEXT_URL,
19 '@id': fromActor.url, 64 id: fromActor.url,
20 '@type': 'CryptographicKey', 65 type: 'CryptographicKey',
21 owner: fromActor.url, 66 owner: fromActor.url,
22 publicKeyPem: fromActor.publicKey 67 publicKeyPem: fromActor.publicKey
23 } 68 }
24 69
25 const publicKeyOwnerObject = { 70 const publicKeyOwnerObject = {
26 '@context': jsig.SECURITY_CONTEXT_URL, 71 '@context': jsig.SECURITY_CONTEXT_URL,
27 '@id': fromActor.url, 72 id: fromActor.url,
28 publicKey: [ publicKeyObject ] 73 publicKey: [ publicKeyObject ]
29 } 74 }
30 75
@@ -33,14 +78,54 @@ function isSignatureVerified (fromActor: ActorModel, signedDocument: object) {
33 publicKeyOwner: publicKeyOwnerObject 78 publicKeyOwner: publicKeyOwnerObject
34 } 79 }
35 80
36 return jsig.promises.verify(signedDocument, options) 81 return jsig.promises
37 .catch(err => { 82 .verify(signedDocument, options)
38 logger.error('Cannot check signature.', { err }) 83 .then((result: { verified: boolean }) => result.verified)
39 return false 84 .catch(err => {
40 }) 85 logger.error('Cannot check signature.', { err })
86 return false
87 })
88}
89
90// Backward compatibility with "other" implementations
91async function isJsonLDRSA2017Verified (fromActor: ActorModel, signedDocument: any) {
92 function hash (obj: any): Promise<any> {
93 return jsonld.promises
94 .normalize(obj, {
95 algorithm: 'URDNA2015',
96 format: 'application/n-quads'
97 })
98 .then(res => sha256(res))
99 }
100
101 const signatureCopy = cloneDeep(signedDocument.signature)
102 Object.assign(signatureCopy, {
103 '@context': [
104 'https://w3id.org/security/v1',
105 { RsaSignature2017: 'https://w3id.org/security#RsaSignature2017' }
106 ]
107 })
108 delete signatureCopy.type
109 delete signatureCopy.id
110 delete signatureCopy.signatureValue
111
112 const docWithoutSignature = cloneDeep(signedDocument)
113 delete docWithoutSignature.signature
114
115 const [ documentHash, optionsHash ] = await Promise.all([
116 hash(docWithoutSignature),
117 hash(signatureCopy)
118 ])
119
120 const toVerify = optionsHash + documentHash
121
122 const verify = createVerify('RSA-SHA256')
123 verify.update(toVerify, 'utf8')
124
125 return verify.verify(fromActor.publicKey, signedDocument.signature.signatureValue, 'base64')
41} 126}
42 127
43function signObject (byActor: ActorModel, data: any) { 128function signJsonLDObject (byActor: ActorModel, data: any) {
44 const options = { 129 const options = {
45 privateKeyPem: byActor.privateKey, 130 privateKeyPem: byActor.privateKey,
46 creator: byActor.url, 131 creator: byActor.url,
@@ -50,22 +135,15 @@ function signObject (byActor: ActorModel, data: any) {
50 return jsig.promises.sign(data, options) 135 return jsig.promises.sign(data, options)
51} 136}
52 137
53function comparePassword (plainPassword: string, hashPassword: string) {
54 return bcryptComparePromise(plainPassword, hashPassword)
55}
56
57async function cryptPassword (password: string) {
58 const salt = await bcryptGenSaltPromise(BCRYPT_SALT_SIZE)
59
60 return bcryptHashPromise(password, salt)
61}
62
63// --------------------------------------------------------------------------- 138// ---------------------------------------------------------------------------
64 139
65export { 140export {
66 isSignatureVerified, 141 isHTTPSignatureDigestValid,
142 parseHTTPSignature,
143 isHTTPSignatureVerified,
144 isJsonLDSignatureVerified,
67 comparePassword, 145 comparePassword,
68 createPrivateAndPublicKeys, 146 createPrivateAndPublicKeys,
69 cryptPassword, 147 cryptPassword,
70 signObject 148 signJsonLDObject
71} 149}
diff --git a/server/helpers/regexp.ts b/server/helpers/regexp.ts
new file mode 100644
index 000000000..2336654b0
--- /dev/null
+++ b/server/helpers/regexp.ts
@@ -0,0 +1,23 @@
1// Thanks to https://regex101.com
2function regexpCapture (str: string, regex: RegExp, maxIterations = 100) {
3 let m: RegExpExecArray
4 let i = 0
5 let result: RegExpExecArray[] = []
6
7 // tslint:disable:no-conditional-assignment
8 while ((m = regex.exec(str)) !== null && i < maxIterations) {
9 // This is necessary to avoid infinite loops with zero-width matches
10 if (m.index === regex.lastIndex) {
11 regex.lastIndex++
12 }
13
14 result.push(m)
15 i++
16 }
17
18 return result
19}
20
21export {
22 regexpCapture
23}
diff --git a/server/helpers/requests.ts b/server/helpers/requests.ts
index ee9e80404..5c6dc5e19 100644
--- a/server/helpers/requests.ts
+++ b/server/helpers/requests.ts
@@ -1,17 +1,19 @@
1import * as Bluebird from 'bluebird' 1import * as Bluebird from 'bluebird'
2import { createWriteStream } from 'fs-extra' 2import { createWriteStream } from 'fs-extra'
3import * as request from 'request' 3import * as request from 'request'
4import { ACTIVITY_PUB } from '../initializers' 4import { ACTIVITY_PUB, CONFIG } from '../initializers'
5import { processImage } from './image-utils'
6import { join } from 'path'
5 7
6function doRequest ( 8function doRequest <T> (
7 requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean } 9 requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean }
8): Bluebird<{ response: request.RequestResponse, body: any }> { 10): Bluebird<{ response: request.RequestResponse, body: T }> {
9 if (requestOptions.activityPub === true) { 11 if (requestOptions.activityPub === true) {
10 if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {} 12 if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {}
11 requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER 13 requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER
12 } 14 }
13 15
14 return new Bluebird<{ response: request.RequestResponse, body: any }>((res, rej) => { 16 return new Bluebird<{ response: request.RequestResponse, body: T }>((res, rej) => {
15 request(requestOptions, (err, response, body) => err ? rej(err) : res({ response, body })) 17 request(requestOptions, (err, response, body) => err ? rej(err) : res({ response, body }))
16 }) 18 })
17} 19}
@@ -27,9 +29,18 @@ function doRequestAndSaveToFile (requestOptions: request.CoreOptions & request.U
27 }) 29 })
28} 30}
29 31
32async function downloadImage (url: string, destDir: string, destName: string, size: { width: number, height: number }) {
33 const tmpPath = join(CONFIG.STORAGE.TMP_DIR, 'pending-' + destName)
34 await doRequestAndSaveToFile({ method: 'GET', uri: url }, tmpPath)
35
36 const destPath = join(destDir, destName)
37 await processImage({ path: tmpPath }, destPath, size)
38}
39
30// --------------------------------------------------------------------------- 40// ---------------------------------------------------------------------------
31 41
32export { 42export {
33 doRequest, 43 doRequest,
34 doRequestAndSaveToFile 44 doRequestAndSaveToFile,
45 downloadImage
35} 46}
diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts
index 6228fec04..cb0e823c5 100644
--- a/server/helpers/utils.ts
+++ b/server/helpers/utils.ts
@@ -19,10 +19,7 @@ async function generateRandomString (size: number) {
19 return raw.toString('hex') 19 return raw.toString('hex')
20} 20}
21 21
22interface FormattableToJSON { 22interface FormattableToJSON { toFormattedJSON (args?: any) }
23 toFormattedJSON (args?: any)
24}
25
26function getFormattedObjects<U, T extends FormattableToJSON> (objects: T[], objectsTotal: number, formattedArg?: any) { 23function getFormattedObjects<U, T extends FormattableToJSON> (objects: T[], objectsTotal: number, formattedArg?: any) {
27 const formattedObjects: U[] = [] 24 const formattedObjects: U[] = []
28 25
@@ -40,21 +37,24 @@ const getServerActor = memoizee(async function () {
40 const application = await ApplicationModel.load() 37 const application = await ApplicationModel.load()
41 if (!application) throw Error('Could not load Application from database.') 38 if (!application) throw Error('Could not load Application from database.')
42 39
43 return application.Account.Actor 40 const actor = application.Account.Actor
41 actor.Account = application.Account
42
43 return actor
44}) 44})
45 45
46function generateVideoTmpPath (target: string | ParseTorrent) { 46function generateVideoImportTmpPath (target: string | ParseTorrent) {
47 const id = typeof target === 'string' ? target : target.infoHash 47 const id = typeof target === 'string' ? target : target.infoHash
48 48
49 const hash = sha256(id) 49 const hash = sha256(id)
50 return join(CONFIG.STORAGE.VIDEOS_DIR, hash + '-import.mp4') 50 return join(CONFIG.STORAGE.TMP_DIR, hash + '-import.mp4')
51} 51}
52 52
53function getSecureTorrentName (originalName: string) { 53function getSecureTorrentName (originalName: string) {
54 return sha256(originalName) + '.torrent' 54 return sha256(originalName) + '.torrent'
55} 55}
56 56
57async function getVersion () { 57async function getServerCommit () {
58 try { 58 try {
59 const tag = await execPromise2( 59 const tag = await execPromise2(
60 '[ ! -d .git ] || git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || true', 60 '[ ! -d .git ] || git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || true',
@@ -74,7 +74,21 @@ async function getVersion () {
74 logger.debug('Cannot get version from git HEAD.', { err }) 74 logger.debug('Cannot get version from git HEAD.', { err })
75 } 75 }
76 76
77 return require('../../../package.json').version 77 return ''
78}
79
80/**
81 * From a filename like "ede4cba5-742b-46fa-a388-9a6eb3a3aeb3.mp4", returns
82 * only the "ede4cba5-742b-46fa-a388-9a6eb3a3aeb3" part. If the filename does
83 * not contain a UUID, returns null.
84 */
85function getUUIDFromFilename (filename: string) {
86 const regex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
87 const result = filename.match(regex)
88
89 if (!result || Array.isArray(result) === false) return null
90
91 return result[0]
78} 92}
79 93
80// --------------------------------------------------------------------------- 94// ---------------------------------------------------------------------------
@@ -85,6 +99,7 @@ export {
85 getFormattedObjects, 99 getFormattedObjects,
86 getSecureTorrentName, 100 getSecureTorrentName,
87 getServerActor, 101 getServerActor,
88 getVersion, 102 getServerCommit,
89 generateVideoTmpPath 103 generateVideoImportTmpPath,
104 getUUIDFromFilename
90} 105}
diff --git a/server/helpers/video.ts b/server/helpers/video.ts
index 1bd21467d..c90fe06c7 100644
--- a/server/helpers/video.ts
+++ b/server/helpers/video.ts
@@ -1,10 +1,12 @@
1import { VideoModel } from '../models/video/video' 1import { VideoModel } from '../models/video/video'
2 2
3type VideoFetchType = 'all' | 'only-video' | 'id' | 'none' 3type VideoFetchType = 'all' | 'only-video' | 'only-video-with-rights' | 'id' | 'none'
4 4
5function fetchVideo (id: number | string, fetchType: VideoFetchType, userId?: number) { 5function fetchVideo (id: number | string, fetchType: VideoFetchType, userId?: number) {
6 if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId) 6 if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId)
7 7
8 if (fetchType === 'only-video-with-rights') return VideoModel.loadWithRights(id)
9
8 if (fetchType === 'only-video') return VideoModel.load(id) 10 if (fetchType === 'only-video') return VideoModel.load(id)
9 11
10 if (fetchType === 'id' || fetchType === 'none') return VideoModel.loadOnlyId(id) 12 if (fetchType === 'id' || fetchType === 'none') return VideoModel.loadOnlyId(id)
diff --git a/server/helpers/webtorrent.ts b/server/helpers/webtorrent.ts
index ce35b87da..3c9a0b96a 100644
--- a/server/helpers/webtorrent.ts
+++ b/server/helpers/webtorrent.ts
@@ -1,5 +1,5 @@
1import { logger } from './logger' 1import { logger } from './logger'
2import { generateVideoTmpPath } from './utils' 2import { generateVideoImportTmpPath } from './utils'
3import * as WebTorrent from 'webtorrent' 3import * as WebTorrent from 'webtorrent'
4import { createWriteStream, ensureDir, remove } from 'fs-extra' 4import { createWriteStream, ensureDir, remove } from 'fs-extra'
5import { CONFIG } from '../initializers' 5import { CONFIG } from '../initializers'
@@ -9,10 +9,10 @@ async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName
9 const id = target.magnetUri || target.torrentName 9 const id = target.magnetUri || target.torrentName
10 let timer 10 let timer
11 11
12 const path = generateVideoTmpPath(id) 12 const path = generateVideoImportTmpPath(id)
13 logger.info('Importing torrent video %s', id) 13 logger.info('Importing torrent video %s', id)
14 14
15 const directoryPath = join(CONFIG.STORAGE.VIDEOS_DIR, 'import') 15 const directoryPath = join(CONFIG.STORAGE.TMP_DIR, 'webtorrent')
16 await ensureDir(directoryPath) 16 await ensureDir(directoryPath)
17 17
18 return new Promise<string>((res, rej) => { 18 return new Promise<string>((res, rej) => {
diff --git a/server/helpers/youtube-dl.ts b/server/helpers/youtube-dl.ts
index 70b4e1b78..b74351b42 100644
--- a/server/helpers/youtube-dl.ts
+++ b/server/helpers/youtube-dl.ts
@@ -1,7 +1,7 @@
1import { truncate } from 'lodash' 1import { truncate } from 'lodash'
2import { CONSTRAINTS_FIELDS, VIDEO_CATEGORIES } from '../initializers' 2import { CONSTRAINTS_FIELDS, VIDEO_CATEGORIES } from '../initializers'
3import { logger } from './logger' 3import { logger } from './logger'
4import { generateVideoTmpPath } from './utils' 4import { generateVideoImportTmpPath } from './utils'
5import { join } from 'path' 5import { join } from 'path'
6import { root } from './core-utils' 6import { root } from './core-utils'
7import { ensureDir, writeFile, remove } from 'fs-extra' 7import { ensureDir, writeFile, remove } from 'fs-extra'
@@ -24,10 +24,10 @@ const processOptions = {
24 24
25function getYoutubeDLInfo (url: string, opts?: string[]): Promise<YoutubeDLInfo> { 25function getYoutubeDLInfo (url: string, opts?: string[]): Promise<YoutubeDLInfo> {
26 return new Promise<YoutubeDLInfo>(async (res, rej) => { 26 return new Promise<YoutubeDLInfo>(async (res, rej) => {
27 const options = opts || [ '-j', '--flat-playlist' ] 27 const args = opts || [ '-j', '--flat-playlist' ]
28 28
29 const youtubeDL = await safeGetYoutubeDL() 29 const youtubeDL = await safeGetYoutubeDL()
30 youtubeDL.getInfo(url, options, (err, info) => { 30 youtubeDL.getInfo(url, args, processOptions, (err, info) => {
31 if (err) return rej(err) 31 if (err) return rej(err)
32 if (info.is_live === true) return rej(new Error('Cannot download a live streaming.')) 32 if (info.is_live === true) return rej(new Error('Cannot download a live streaming.'))
33 33
@@ -40,7 +40,7 @@ function getYoutubeDLInfo (url: string, opts?: string[]): Promise<YoutubeDLInfo>
40} 40}
41 41
42function downloadYoutubeDLVideo (url: string, timeout: number) { 42function downloadYoutubeDLVideo (url: string, timeout: number) {
43 const path = generateVideoTmpPath(url) 43 const path = generateVideoImportTmpPath(url)
44 let timer 44 let timer
45 45
46 logger.info('Importing youtubeDL video %s', url) 46 logger.info('Importing youtubeDL video %s', url)
diff --git a/server/initializers/checker-after-init.ts b/server/initializers/checker-after-init.ts
index 72d846957..955d55206 100644
--- a/server/initializers/checker-after-init.ts
+++ b/server/initializers/checker-after-init.ts
@@ -10,6 +10,7 @@ import { getServerActor } from '../helpers/utils'
10import { RecentlyAddedStrategy } from '../../shared/models/redundancy' 10import { RecentlyAddedStrategy } from '../../shared/models/redundancy'
11import { isArray } from '../helpers/custom-validators/misc' 11import { isArray } from '../helpers/custom-validators/misc'
12import { uniq } from 'lodash' 12import { uniq } from 'lodash'
13import { Emailer } from '../lib/emailer'
13 14
14async function checkActivityPubUrls () { 15async function checkActivityPubUrls () {
15 const actor = await getServerActor() 16 const actor = await getServerActor()
@@ -32,9 +33,19 @@ async function checkActivityPubUrls () {
32// Some checks on configuration files 33// Some checks on configuration files
33// Return an error message, or null if everything is okay 34// Return an error message, or null if everything is okay
34function checkConfig () { 35function checkConfig () {
35 const defaultNSFWPolicy = CONFIG.INSTANCE.DEFAULT_NSFW_POLICY 36
37 if (!Emailer.isEnabled()) {
38 if (CONFIG.SIGNUP.ENABLED && CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION) {
39 return 'Emailer is disabled but you require signup email verification.'
40 }
41
42 if (CONFIG.CONTACT_FORM.ENABLED) {
43 logger.warn('Emailer is disabled so the contact form will not work.')
44 }
45 }
36 46
37 // NSFW policy 47 // NSFW policy
48 const defaultNSFWPolicy = CONFIG.INSTANCE.DEFAULT_NSFW_POLICY
38 { 49 {
39 const available = [ 'do_not_list', 'blur', 'display' ] 50 const available = [ 'do_not_list', 'blur', 'display' ]
40 if (available.indexOf(defaultNSFWPolicy) === -1) { 51 if (available.indexOf(defaultNSFWPolicy) === -1) {
@@ -68,6 +79,7 @@ function checkConfig () {
68 } 79 }
69 } 80 }
70 81
82 // Check storage directory locations
71 if (isProdInstance()) { 83 if (isProdInstance()) {
72 const configStorage = config.get('storage') 84 const configStorage = config.get('storage')
73 for (const key of Object.keys(configStorage)) { 85 for (const key of Object.keys(configStorage)) {
diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts
index 4f46d406a..29fdb263e 100644
--- a/server/initializers/checker-before-init.ts
+++ b/server/initializers/checker-before-init.ts
@@ -12,13 +12,14 @@ function checkMissedConfig () {
12 'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max', 12 'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max',
13 'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address', 13 'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address',
14 'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache', 14 'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache',
15 'storage.redundancy', 'storage.tmp', 'storage.playlists',
15 'log.level', 16 'log.level',
16 'user.video_quota', 'user.video_quota_daily', 17 'user.video_quota', 'user.video_quota_daily',
17 'cache.previews.size', 'admin.email', 18 'cache.previews.size', 'admin.email', 'contact_form.enabled',
18 'signup.enabled', 'signup.limit', 'signup.requires_email_verification', 19 'signup.enabled', 'signup.limit', 'signup.requires_email_verification',
19 'signup.filters.cidr.whitelist', 'signup.filters.cidr.blacklist', 20 'signup.filters.cidr.whitelist', 'signup.filters.cidr.blacklist',
20 'redundancy.videos.strategies', 'redundancy.videos.check_interval', 21 'redundancy.videos.strategies', 'redundancy.videos.check_interval',
21 'transcoding.enabled', 'transcoding.threads', 22 'transcoding.enabled', 'transcoding.threads', 'transcoding.allow_additional_extensions',
22 'import.videos.http.enabled', 'import.videos.torrent.enabled', 23 'import.videos.http.enabled', 'import.videos.torrent.enabled',
23 'trending.videos.interval_days', 24 'trending.videos.interval_days',
24 'instance.name', 'instance.short_description', 'instance.description', 'instance.terms', 'instance.default_client_route', 25 'instance.name', 'instance.short_description', 'instance.description', 'instance.terms', 'instance.default_client_route',
@@ -77,7 +78,7 @@ async function checkFFmpeg (CONFIG: { TRANSCODING: { ENABLED: boolean } }) {
77 } 78 }
78 } 79 }
79 80
80 checkFFmpegEncoders() 81 return checkFFmpegEncoders()
81} 82}
82 83
83// Optional encoders, if present, can be used to improve transcoding 84// Optional encoders, if present, can be used to improve transcoding
@@ -95,10 +96,10 @@ async function checkFFmpegEncoders (): Promise<Map<string, boolean>> {
95 supportedOptionalEncoders = new Map<string, boolean>() 96 supportedOptionalEncoders = new Map<string, boolean>()
96 97
97 for (const encoder of optionalEncoders) { 98 for (const encoder of optionalEncoders) {
98 supportedOptionalEncoders.set(encoder, 99 supportedOptionalEncoders.set(encoder, encoders[encoder] !== undefined)
99 encoders[encoder] !== undefined
100 )
101 } 100 }
101
102 return supportedOptionalEncoders
102} 103}
103 104
104// --------------------------------------------------------------------------- 105// ---------------------------------------------------------------------------
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 1a3b52015..e5c4c4e63 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -3,9 +3,9 @@ import { dirname, join } from 'path'
3import { JobType, VideoRateType, VideoState, VideosRedundancy } from '../../shared/models' 3import { JobType, VideoRateType, VideoState, VideosRedundancy } from '../../shared/models'
4import { ActivityPubActorType } from '../../shared/models/activitypub' 4import { ActivityPubActorType } from '../../shared/models/activitypub'
5import { FollowState } from '../../shared/models/actors' 5import { FollowState } from '../../shared/models/actors'
6import { VideoAbuseState, VideoImportState, VideoPrivacy } from '../../shared/models/videos' 6import { VideoAbuseState, VideoImportState, VideoPrivacy, VideoTranscodingFPS } from '../../shared/models/videos'
7// Do not use barrels, remain constants as independent as possible 7// Do not use barrels, remain constants as independent as possible
8import { buildPath, isTestInstance, parseDuration, root, sanitizeHost, sanitizeUrl } from '../helpers/core-utils' 8import { buildPath, isTestInstance, parseDuration, parseBytes, root, sanitizeHost, sanitizeUrl } from '../helpers/core-utils'
9import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type' 9import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type'
10import { invert } from 'lodash' 10import { invert } from 'lodash'
11import { CronRepeatOptions, EveryRepeatOptions } from 'bull' 11import { CronRepeatOptions, EveryRepeatOptions } from 'bull'
@@ -16,7 +16,7 @@ let config: IConfig = require('config')
16 16
17// --------------------------------------------------------------------------- 17// ---------------------------------------------------------------------------
18 18
19const LAST_MIGRATION_VERSION = 275 19const LAST_MIGRATION_VERSION = 330
20 20
21// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
22 22
@@ -47,7 +47,12 @@ const SORTABLE_COLUMNS = {
47 VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'trending' ], 47 VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'trending' ],
48 48
49 VIDEOS_SEARCH: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'match' ], 49 VIDEOS_SEARCH: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'match' ],
50 VIDEO_CHANNELS_SEARCH: [ 'match', 'displayName', 'createdAt' ] 50 VIDEO_CHANNELS_SEARCH: [ 'match', 'displayName', 'createdAt' ],
51
52 ACCOUNTS_BLOCKLIST: [ 'createdAt' ],
53 SERVERS_BLOCKLIST: [ 'createdAt' ],
54
55 USER_NOTIFICATIONS: [ 'createdAt' ]
51} 56}
52 57
53const OAUTH_LIFETIME = { 58const OAUTH_LIFETIME = {
@@ -58,6 +63,7 @@ const OAUTH_LIFETIME = {
58const ROUTE_CACHE_LIFETIME = { 63const ROUTE_CACHE_LIFETIME = {
59 FEEDS: '15 minutes', 64 FEEDS: '15 minutes',
60 ROBOTS: '2 hours', 65 ROBOTS: '2 hours',
66 SITEMAP: '1 day',
61 SECURITYTXT: '2 hours', 67 SECURITYTXT: '2 hours',
62 NODEINFO: '10 minutes', 68 NODEINFO: '10 minutes',
63 DNT_POLICY: '1 week', 69 DNT_POLICY: '1 week',
@@ -99,7 +105,8 @@ const JOB_ATTEMPTS: { [ id in JobType ]: number } = {
99 'video-file': 1, 105 'video-file': 1,
100 'video-import': 1, 106 'video-import': 1,
101 'email': 5, 107 'email': 5,
102 'videos-views': 1 108 'videos-views': 1,
109 'activitypub-refresher': 1
103} 110}
104const JOB_CONCURRENCY: { [ id in JobType ]: number } = { 111const JOB_CONCURRENCY: { [ id in JobType ]: number } = {
105 'activitypub-http-broadcast': 1, 112 'activitypub-http-broadcast': 1,
@@ -110,7 +117,8 @@ const JOB_CONCURRENCY: { [ id in JobType ]: number } = {
110 'video-file': 1, 117 'video-file': 1,
111 'video-import': 1, 118 'video-import': 1,
112 'email': 5, 119 'email': 5,
113 'videos-views': 1 120 'videos-views': 1,
121 'activitypub-refresher': 1
114} 122}
115const JOB_TTL: { [ id in JobType ]: number } = { 123const JOB_TTL: { [ id in JobType ]: number } = {
116 'activitypub-http-broadcast': 60000 * 10, // 10 minutes 124 'activitypub-http-broadcast': 60000 * 10, // 10 minutes
@@ -121,11 +129,12 @@ const JOB_TTL: { [ id in JobType ]: number } = {
121 'video-file': 1000 * 3600 * 48, // 2 days, transcoding could be long 129 'video-file': 1000 * 3600 * 48, // 2 days, transcoding could be long
122 'video-import': 1000 * 3600 * 2, // hours 130 'video-import': 1000 * 3600 * 2, // hours
123 'email': 60000 * 10, // 10 minutes 131 'email': 60000 * 10, // 10 minutes
124 'videos-views': undefined // Unlimited 132 'videos-views': undefined, // Unlimited
133 'activitypub-refresher': 60000 * 10 // 10 minutes
125} 134}
126const REPEAT_JOBS: { [ id: string ]: EveryRepeatOptions | CronRepeatOptions } = { 135const REPEAT_JOBS: { [ id: string ]: EveryRepeatOptions | CronRepeatOptions } = {
127 'videos-views': { 136 'videos-views': {
128 cron: '1 * * * *' // At 1 minutes past the hour 137 cron: '1 * * * *' // At 1 minute past the hour
129 } 138 }
130} 139}
131 140
@@ -137,7 +146,7 @@ const VIDEO_IMPORT_TIMEOUT = 1000 * 3600 // 1 hour
137 146
138// 1 hour 147// 1 hour
139let SCHEDULER_INTERVALS_MS = { 148let SCHEDULER_INTERVALS_MS = {
140 badActorFollow: 60000 * 60, // 1 hour 149 actorFollowScores: 60000 * 60, // 1 hour
141 removeOldJobs: 60000 * 60, // 1 hour 150 removeOldJobs: 60000 * 60, // 1 hour
142 updateVideos: 60000, // 1 minute 151 updateVideos: 60000, // 1 minute
143 youtubeDLUpdate: 60000 * 60 * 24 // 1 day 152 youtubeDLUpdate: 60000 * 60 * 24 // 1 day
@@ -179,9 +188,12 @@ const CONFIG = {
179 FROM_ADDRESS: config.get<string>('smtp.from_address') 188 FROM_ADDRESS: config.get<string>('smtp.from_address')
180 }, 189 },
181 STORAGE: { 190 STORAGE: {
191 TMP_DIR: buildPath(config.get<string>('storage.tmp')),
182 AVATARS_DIR: buildPath(config.get<string>('storage.avatars')), 192 AVATARS_DIR: buildPath(config.get<string>('storage.avatars')),
183 LOG_DIR: buildPath(config.get<string>('storage.logs')), 193 LOG_DIR: buildPath(config.get<string>('storage.logs')),
184 VIDEOS_DIR: buildPath(config.get<string>('storage.videos')), 194 VIDEOS_DIR: buildPath(config.get<string>('storage.videos')),
195 PLAYLISTS_DIR: buildPath(config.get<string>('storage.playlists')),
196 REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')),
185 THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')), 197 THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')),
186 PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')), 198 PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')),
187 CAPTIONS_DIR: buildPath(config.get<string>('storage.captions')), 199 CAPTIONS_DIR: buildPath(config.get<string>('storage.captions')),
@@ -220,6 +232,9 @@ const CONFIG = {
220 ADMIN: { 232 ADMIN: {
221 get EMAIL () { return config.get<string>('admin.email') } 233 get EMAIL () { return config.get<string>('admin.email') }
222 }, 234 },
235 CONTACT_FORM: {
236 get ENABLED () { return config.get<boolean>('contact_form.enabled') }
237 },
223 SIGNUP: { 238 SIGNUP: {
224 get ENABLED () { return config.get<boolean>('signup.enabled') }, 239 get ENABLED () { return config.get<boolean>('signup.enabled') },
225 get LIMIT () { return config.get<number>('signup.limit') }, 240 get LIMIT () { return config.get<number>('signup.limit') },
@@ -232,11 +247,12 @@ const CONFIG = {
232 } 247 }
233 }, 248 },
234 USER: { 249 USER: {
235 get VIDEO_QUOTA () { return config.get<number>('user.video_quota') }, 250 get VIDEO_QUOTA () { return parseBytes(config.get<number>('user.video_quota')) },
236 get VIDEO_QUOTA_DAILY () { return config.get<number>('user.video_quota_daily') } 251 get VIDEO_QUOTA_DAILY () { return parseBytes(config.get<number>('user.video_quota_daily')) }
237 }, 252 },
238 TRANSCODING: { 253 TRANSCODING: {
239 get ENABLED () { return config.get<boolean>('transcoding.enabled') }, 254 get ENABLED () { return config.get<boolean>('transcoding.enabled') },
255 get ALLOW_ADDITIONAL_EXTENSIONS () { return config.get<boolean>('transcoding.allow_additional_extensions') },
240 get THREADS () { return config.get<number>('transcoding.threads') }, 256 get THREADS () { return config.get<number>('transcoding.threads') },
241 RESOLUTIONS: { 257 RESOLUTIONS: {
242 get '240p' () { return config.get<boolean>('transcoding.resolutions.240p') }, 258 get '240p' () { return config.get<boolean>('transcoding.resolutions.240p') },
@@ -244,6 +260,9 @@ const CONFIG = {
244 get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') }, 260 get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') },
245 get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') }, 261 get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') },
246 get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') } 262 get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') }
263 },
264 HLS: {
265 get ENABLED () { return config.get<boolean>('transcoding.hls.enabled') }
247 } 266 }
248 }, 267 },
249 IMPORT: { 268 IMPORT: {
@@ -280,6 +299,7 @@ const CONFIG = {
280 get SECURITYTXT_CONTACT () { return config.get<string>('admin.email') } 299 get SECURITYTXT_CONTACT () { return config.get<string>('admin.email') }
281 }, 300 },
282 SERVICES: { 301 SERVICES: {
302 get 'CSP-LOGGER' () { return config.get<string>('services.csp-logger') },
283 TWITTER: { 303 TWITTER: {
284 get USERNAME () { return config.get<string>('services.twitter.username') }, 304 get USERNAME () { return config.get<string>('services.twitter.username') },
285 get WHITELISTED () { return config.get<boolean>('services.twitter.whitelisted') } 305 get WHITELISTED () { return config.get<boolean>('services.twitter.whitelisted') }
@@ -289,27 +309,27 @@ const CONFIG = {
289 309
290// --------------------------------------------------------------------------- 310// ---------------------------------------------------------------------------
291 311
292const CONSTRAINTS_FIELDS = { 312let CONSTRAINTS_FIELDS = {
293 USERS: { 313 USERS: {
294 NAME: { min: 3, max: 120 }, // Length 314 NAME: { min: 1, max: 120 }, // Length
295 DESCRIPTION: { min: 3, max: 250 }, // Length 315 DESCRIPTION: { min: 3, max: 1000 }, // Length
296 USERNAME: { min: 3, max: 20 }, // Length 316 USERNAME: { min: 1, max: 50 }, // Length
297 PASSWORD: { min: 6, max: 255 }, // Length 317 PASSWORD: { min: 6, max: 255 }, // Length
298 VIDEO_QUOTA: { min: -1 }, 318 VIDEO_QUOTA: { min: -1 },
299 VIDEO_QUOTA_DAILY: { min: -1 }, 319 VIDEO_QUOTA_DAILY: { min: -1 },
300 BLOCKED_REASON: { min: 3, max: 250 } // Length 320 BLOCKED_REASON: { min: 3, max: 250 } // Length
301 }, 321 },
302 VIDEO_ABUSES: { 322 VIDEO_ABUSES: {
303 REASON: { min: 2, max: 300 }, // Length 323 REASON: { min: 2, max: 3000 }, // Length
304 MODERATION_COMMENT: { min: 2, max: 300 } // Length 324 MODERATION_COMMENT: { min: 2, max: 3000 } // Length
305 }, 325 },
306 VIDEO_BLACKLIST: { 326 VIDEO_BLACKLIST: {
307 REASON: { min: 2, max: 300 } // Length 327 REASON: { min: 2, max: 300 } // Length
308 }, 328 },
309 VIDEO_CHANNELS: { 329 VIDEO_CHANNELS: {
310 NAME: { min: 3, max: 120 }, // Length 330 NAME: { min: 1, max: 120 }, // Length
311 DESCRIPTION: { min: 3, max: 500 }, // Length 331 DESCRIPTION: { min: 3, max: 1000 }, // Length
312 SUPPORT: { min: 3, max: 500 }, // Length 332 SUPPORT: { min: 3, max: 1000 }, // Length
313 URL: { min: 3, max: 2000 } // Length 333 URL: { min: 3, max: 2000 } // Length
314 }, 334 },
315 VIDEO_CAPTIONS: { 335 VIDEO_CAPTIONS: {
@@ -333,19 +353,22 @@ const CONSTRAINTS_FIELDS = {
333 VIDEOS_REDUNDANCY: { 353 VIDEOS_REDUNDANCY: {
334 URL: { min: 3, max: 2000 } // Length 354 URL: { min: 3, max: 2000 } // Length
335 }, 355 },
356 VIDEO_RATES: {
357 URL: { min: 3, max: 2000 } // Length
358 },
336 VIDEOS: { 359 VIDEOS: {
337 NAME: { min: 3, max: 120 }, // Length 360 NAME: { min: 3, max: 120 }, // Length
338 LANGUAGE: { min: 1, max: 10 }, // Length 361 LANGUAGE: { min: 1, max: 10 }, // Length
339 TRUNCATED_DESCRIPTION: { min: 3, max: 250 }, // Length 362 TRUNCATED_DESCRIPTION: { min: 3, max: 250 }, // Length
340 DESCRIPTION: { min: 3, max: 10000 }, // Length 363 DESCRIPTION: { min: 3, max: 10000 }, // Length
341 SUPPORT: { min: 3, max: 500 }, // Length 364 SUPPORT: { min: 3, max: 1000 }, // Length
342 IMAGE: { 365 IMAGE: {
343 EXTNAME: [ '.jpg', '.jpeg' ], 366 EXTNAME: [ '.jpg', '.jpeg' ],
344 FILE_SIZE: { 367 FILE_SIZE: {
345 max: 2 * 1024 * 1024 // 2MB 368 max: 2 * 1024 * 1024 // 2MB
346 } 369 }
347 }, 370 },
348 EXTNAME: [ '.mp4', '.ogv', '.webm' ], 371 EXTNAME: buildVideosExtname(),
349 INFO_HASH: { min: 40, max: 40 }, // Length, info hash is 20 bytes length but we represent it in hexadecimal so 20 * 2 372 INFO_HASH: { min: 40, max: 40 }, // Length, info hash is 20 bytes length but we represent it in hexadecimal so 20 * 2
350 DURATION: { min: 0 }, // Number 373 DURATION: { min: 0 }, // Number
351 TAGS: { min: 0, max: 5 }, // Number of total tags 374 TAGS: { min: 0, max: 5 }, // Number of total tags
@@ -378,6 +401,10 @@ const CONSTRAINTS_FIELDS = {
378 }, 401 },
379 VIDEO_SHARE: { 402 VIDEO_SHARE: {
380 URL: { min: 3, max: 2000 } // Length 403 URL: { min: 3, max: 2000 } // Length
404 },
405 CONTACT_FORM: {
406 FROM_NAME: { min: 1, max: 120 }, // Length
407 BODY: { min: 3, max: 5000 } // Length
381 } 408 }
382} 409}
383 410
@@ -393,7 +420,9 @@ const RATES_LIMIT = {
393} 420}
394 421
395let VIDEO_VIEW_LIFETIME = 60000 * 60 // 1 hour 422let VIDEO_VIEW_LIFETIME = 60000 * 60 // 1 hour
396const VIDEO_TRANSCODING_FPS = { 423let CONTACT_FORM_LIFETIME = 60000 * 60 // 1 hour
424
425const VIDEO_TRANSCODING_FPS: VideoTranscodingFPS = {
397 MIN: 10, 426 MIN: 10,
398 AVERAGE: 30, 427 AVERAGE: 30,
399 MAX: 60, 428 MAX: 60,
@@ -421,7 +450,7 @@ const VIDEO_CATEGORIES = {
421 8: 'People', 450 8: 'People',
422 9: 'Comedy', 451 9: 'Comedy',
423 10: 'Entertainment', 452 10: 'Entertainment',
424 11: 'News', 453 11: 'News & Politics',
425 12: 'How To', 454 12: 'How To',
426 13: 'Education', 455 13: 'Education',
427 14: 'Activism', 456 14: 'Activism',
@@ -468,27 +497,31 @@ const VIDEO_ABUSE_STATES = {
468 [VideoAbuseState.ACCEPTED]: 'Accepted' 497 [VideoAbuseState.ACCEPTED]: 'Accepted'
469} 498}
470 499
471const VIDEO_MIMETYPE_EXT = { 500const MIMETYPES = {
472 'video/webm': '.webm', 501 VIDEO: {
473 'video/ogg': '.ogv', 502 MIMETYPE_EXT: buildVideoMimetypeExt(),
474 'video/mp4': '.mp4' 503 EXT_MIMETYPE: null as { [ id: string ]: string }
475} 504 },
476const VIDEO_EXT_MIMETYPE = invert(VIDEO_MIMETYPE_EXT) 505 IMAGE: {
477 506 MIMETYPE_EXT: {
478const IMAGE_MIMETYPE_EXT = { 507 'image/png': '.png',
479 'image/png': '.png', 508 'image/jpg': '.jpg',
480 'image/jpg': '.jpg', 509 'image/jpeg': '.jpg'
481 'image/jpeg': '.jpg' 510 }
482} 511 },
483 512 VIDEO_CAPTIONS: {
484const VIDEO_CAPTIONS_MIMETYPE_EXT = { 513 MIMETYPE_EXT: {
485 'text/vtt': '.vtt', 514 'text/vtt': '.vtt',
486 'application/x-subrip': '.srt' 515 'application/x-subrip': '.srt'
487} 516 }
488 517 },
489const TORRENT_MIMETYPE_EXT = { 518 TORRENT: {
490 'application/x-bittorrent': '.torrent' 519 MIMETYPE_EXT: {
520 'application/x-bittorrent': '.torrent'
521 }
522 }
491} 523}
524MIMETYPES.VIDEO.EXT_MIMETYPE = invert(MIMETYPES.VIDEO.MIMETYPE_EXT)
492 525
493// --------------------------------------------------------------------------- 526// ---------------------------------------------------------------------------
494 527
@@ -514,7 +547,7 @@ const ACTIVITY_PUB = {
514 COLLECTION_ITEMS_PER_PAGE: 10, 547 COLLECTION_ITEMS_PER_PAGE: 10,
515 FETCH_PAGE_LIMIT: 100, 548 FETCH_PAGE_LIMIT: 100,
516 URL_MIME_TYPES: { 549 URL_MIME_TYPES: {
517 VIDEO: Object.keys(VIDEO_MIMETYPE_EXT), 550 VIDEO: Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT),
518 TORRENT: [ 'application/x-bittorrent' ], 551 TORRENT: [ 'application/x-bittorrent' ],
519 MAGNET: [ 'application/x-bittorrent;x-scheme-handler/magnet' ] 552 MAGNET: [ 'application/x-bittorrent;x-scheme-handler/magnet' ]
520 }, 553 },
@@ -529,9 +562,15 @@ const ACTIVITY_PUB_ACTOR_TYPES: { [ id: string ]: ActivityPubActorType } = {
529 APPLICATION: 'Application' 562 APPLICATION: 'Application'
530} 563}
531 564
565const HTTP_SIGNATURE = {
566 HEADER_NAME: 'signature',
567 ALGORITHM: 'rsa-sha256',
568 HEADERS_TO_SIGN: [ '(request-target)', 'host', 'date', 'digest' ]
569}
570
532// --------------------------------------------------------------------------- 571// ---------------------------------------------------------------------------
533 572
534const PRIVATE_RSA_KEY_SIZE = 2048 573let PRIVATE_RSA_KEY_SIZE = 2048
535 574
536// Password encryption 575// Password encryption
537const BCRYPT_SALT_SIZE = 10 576const BCRYPT_SALT_SIZE = 10
@@ -554,6 +593,10 @@ const STATIC_PATHS = {
554 THUMBNAILS: '/static/thumbnails/', 593 THUMBNAILS: '/static/thumbnails/',
555 TORRENTS: '/static/torrents/', 594 TORRENTS: '/static/torrents/',
556 WEBSEED: '/static/webseed/', 595 WEBSEED: '/static/webseed/',
596 REDUNDANCY: '/static/redundancy/',
597 PLAYLISTS: {
598 HLS: '/static/playlists/hls'
599 },
557 AVATARS: '/static/avatars/', 600 AVATARS: '/static/avatars/',
558 VIDEO_CAPTIONS: '/static/video-captions/' 601 VIDEO_CAPTIONS: '/static/video-captions/'
559} 602}
@@ -596,6 +639,9 @@ const CACHE = {
596 } 639 }
597} 640}
598 641
642const HLS_PLAYLIST_DIRECTORY = join(CONFIG.STORAGE.PLAYLISTS_DIR, 'hls')
643const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls')
644
599const MEMOIZE_TTL = { 645const MEMOIZE_TTL = {
600 OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours 646 OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours
601} 647}
@@ -635,6 +681,8 @@ const TRACKER_RATE_LIMITS = {
635 681
636// Special constants for a test instance 682// Special constants for a test instance
637if (isTestInstance() === true) { 683if (isTestInstance() === true) {
684 PRIVATE_RSA_KEY_SIZE = 1024
685
638 ACTOR_FOLLOW_SCORE.BASE = 20 686 ACTOR_FOLLOW_SCORE.BASE = 20
639 687
640 REMOTE_SCHEME.HTTP = 'http' 688 REMOTE_SCHEME.HTTP = 'http'
@@ -648,7 +696,7 @@ if (isTestInstance() === true) {
648 696
649 CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max = 100 * 1024 // 100KB 697 CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max = 100 * 1024 // 100KB
650 698
651 SCHEDULER_INTERVALS_MS.badActorFollow = 10000 699 SCHEDULER_INTERVALS_MS.actorFollowScores = 1000
652 SCHEDULER_INTERVALS_MS.removeOldJobs = 10000 700 SCHEDULER_INTERVALS_MS.removeOldJobs = 10000
653 SCHEDULER_INTERVALS_MS.updateVideos = 5000 701 SCHEDULER_INTERVALS_MS.updateVideos = 5000
654 REPEAT_JOBS['videos-views'] = { every: 5000 } 702 REPEAT_JOBS['videos-views'] = { every: 5000 }
@@ -656,21 +704,24 @@ if (isTestInstance() === true) {
656 REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1 704 REDUNDANCY.VIDEOS.RANDOMIZED_FACTOR = 1
657 705
658 VIDEO_VIEW_LIFETIME = 1000 // 1 second 706 VIDEO_VIEW_LIFETIME = 1000 // 1 second
707 CONTACT_FORM_LIFETIME = 1000 // 1 second
659 708
660 JOB_ATTEMPTS['email'] = 1 709 JOB_ATTEMPTS['email'] = 1
661 710
662 CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000 711 CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000
663 MEMOIZE_TTL.OVERVIEWS_SAMPLE = 1 712 MEMOIZE_TTL.OVERVIEWS_SAMPLE = 1
664 ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms' 713 ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms'
714
715 RATES_LIMIT.LOGIN.MAX = 20
665} 716}
666 717
667updateWebserverConfig() 718updateWebserverUrls()
668 719
669// --------------------------------------------------------------------------- 720// ---------------------------------------------------------------------------
670 721
671export { 722export {
672 API_VERSION, 723 API_VERSION,
673 VIDEO_CAPTIONS_MIMETYPE_EXT, 724 HLS_REDUNDANCY_DIRECTORY,
674 AVATARS_SIZE, 725 AVATARS_SIZE,
675 ACCEPT_HEADERS, 726 ACCEPT_HEADERS,
676 BCRYPT_SALT_SIZE, 727 BCRYPT_SALT_SIZE,
@@ -695,10 +746,10 @@ export {
695 PRIVATE_RSA_KEY_SIZE, 746 PRIVATE_RSA_KEY_SIZE,
696 ROUTE_CACHE_LIFETIME, 747 ROUTE_CACHE_LIFETIME,
697 SORTABLE_COLUMNS, 748 SORTABLE_COLUMNS,
749 HLS_PLAYLIST_DIRECTORY,
698 FEEDS, 750 FEEDS,
699 JOB_TTL, 751 JOB_TTL,
700 NSFW_POLICY_TYPES, 752 NSFW_POLICY_TYPES,
701 TORRENT_MIMETYPE_EXT,
702 STATIC_MAX_AGE, 753 STATIC_MAX_AGE,
703 STATIC_PATHS, 754 STATIC_PATHS,
704 VIDEO_IMPORT_TIMEOUT, 755 VIDEO_IMPORT_TIMEOUT,
@@ -711,7 +762,6 @@ export {
711 VIDEO_LICENCES, 762 VIDEO_LICENCES,
712 VIDEO_STATES, 763 VIDEO_STATES,
713 VIDEO_RATE_TYPES, 764 VIDEO_RATE_TYPES,
714 VIDEO_MIMETYPE_EXT,
715 VIDEO_TRANSCODING_FPS, 765 VIDEO_TRANSCODING_FPS,
716 FFMPEG_NICE, 766 FFMPEG_NICE,
717 VIDEO_ABUSE_STATES, 767 VIDEO_ABUSE_STATES,
@@ -719,17 +769,18 @@ export {
719 USER_PASSWORD_RESET_LIFETIME, 769 USER_PASSWORD_RESET_LIFETIME,
720 MEMOIZE_TTL, 770 MEMOIZE_TTL,
721 USER_EMAIL_VERIFY_LIFETIME, 771 USER_EMAIL_VERIFY_LIFETIME,
722 IMAGE_MIMETYPE_EXT,
723 OVERVIEWS, 772 OVERVIEWS,
724 SCHEDULER_INTERVALS_MS, 773 SCHEDULER_INTERVALS_MS,
725 REPEAT_JOBS, 774 REPEAT_JOBS,
726 STATIC_DOWNLOAD_PATHS, 775 STATIC_DOWNLOAD_PATHS,
727 RATES_LIMIT, 776 RATES_LIMIT,
728 VIDEO_EXT_MIMETYPE, 777 MIMETYPES,
729 CRAWL_REQUEST_CONCURRENCY, 778 CRAWL_REQUEST_CONCURRENCY,
730 JOB_COMPLETED_LIFETIME, 779 JOB_COMPLETED_LIFETIME,
780 HTTP_SIGNATURE,
731 VIDEO_IMPORT_STATES, 781 VIDEO_IMPORT_STATES,
732 VIDEO_VIEW_LIFETIME, 782 VIDEO_VIEW_LIFETIME,
783 CONTACT_FORM_LIFETIME,
733 buildLanguages 784 buildLanguages
734} 785}
735 786
@@ -746,16 +797,50 @@ function getLocalConfigFilePath () {
746 return join(dirname(configSources[ 0 ].name), filename + '.json') 797 return join(dirname(configSources[ 0 ].name), filename + '.json')
747} 798}
748 799
749function updateWebserverConfig () { 800function buildVideoMimetypeExt () {
801 const data = {
802 'video/webm': '.webm',
803 'video/ogg': '.ogv',
804 'video/mp4': '.mp4'
805 }
806
807 if (CONFIG.TRANSCODING.ENABLED && CONFIG.TRANSCODING.ALLOW_ADDITIONAL_EXTENSIONS) {
808 Object.assign(data, {
809 'video/quicktime': '.mov',
810 'video/x-msvideo': '.avi',
811 'video/x-flv': '.flv',
812 'video/x-matroska': '.mkv',
813 'application/octet-stream': '.mkv',
814 'video/avi': '.avi'
815 })
816 }
817
818 return data
819}
820
821function updateWebserverUrls () {
750 CONFIG.WEBSERVER.URL = sanitizeUrl(CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT) 822 CONFIG.WEBSERVER.URL = sanitizeUrl(CONFIG.WEBSERVER.SCHEME + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT)
751 CONFIG.WEBSERVER.HOST = sanitizeHost(CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT, REMOTE_SCHEME.HTTP) 823 CONFIG.WEBSERVER.HOST = sanitizeHost(CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT, REMOTE_SCHEME.HTTP)
752} 824}
753 825
826function updateWebserverConfig () {
827 CONSTRAINTS_FIELDS.VIDEOS.EXTNAME = buildVideosExtname()
828
829 MIMETYPES.VIDEO.MIMETYPE_EXT = buildVideoMimetypeExt()
830 MIMETYPES.VIDEO.EXT_MIMETYPE = invert(MIMETYPES.VIDEO.MIMETYPE_EXT)
831}
832
833function buildVideosExtname () {
834 return CONFIG.TRANSCODING.ENABLED && CONFIG.TRANSCODING.ALLOW_ADDITIONAL_EXTENSIONS
835 ? [ '.mp4', '.ogv', '.webm', '.mkv', '.mov', '.avi', '.flv' ]
836 : [ '.mp4', '.ogv', '.webm' ]
837}
838
754function buildVideosRedundancy (objs: any[]): VideosRedundancy[] { 839function buildVideosRedundancy (objs: any[]): VideosRedundancy[] {
755 if (!objs) return [] 840 if (!objs) return []
756 841
757 return objs.map(obj => { 842 return objs.map(obj => {
758 return Object.assign(obj, { 843 return Object.assign({}, obj, {
759 minLifetime: parseDuration(obj.min_lifetime), 844 minLifetime: parseDuration(obj.min_lifetime),
760 size: bytes.parse(obj.size), 845 size: bytes.parse(obj.size),
761 minViews: obj.min_views 846 minViews: obj.min_views
@@ -832,4 +917,5 @@ export function reloadConfig () {
832 config = require('config') 917 config = require('config')
833 918
834 updateWebserverConfig() 919 updateWebserverConfig()
920 updateWebserverUrls()
835} 921}
diff --git a/server/initializers/database.ts b/server/initializers/database.ts
index 482c03b31..fe296142d 100644
--- a/server/initializers/database.ts
+++ b/server/initializers/database.ts
@@ -29,6 +29,11 @@ import { VideoViewModel } from '../models/video/video-views'
29import { VideoChangeOwnershipModel } from '../models/video/video-change-ownership' 29import { VideoChangeOwnershipModel } from '../models/video/video-change-ownership'
30import { VideoRedundancyModel } from '../models/redundancy/video-redundancy' 30import { VideoRedundancyModel } from '../models/redundancy/video-redundancy'
31import { UserVideoHistoryModel } from '../models/account/user-video-history' 31import { UserVideoHistoryModel } from '../models/account/user-video-history'
32import { AccountBlocklistModel } from '../models/account/account-blocklist'
33import { ServerBlocklistModel } from '../models/server/server-blocklist'
34import { UserNotificationModel } from '../models/account/user-notification'
35import { UserNotificationSettingModel } from '../models/account/user-notification-setting'
36import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
32 37
33require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string 38require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
34 39
@@ -91,7 +96,12 @@ async function initDatabaseModels (silent: boolean) {
91 VideoImportModel, 96 VideoImportModel,
92 VideoViewModel, 97 VideoViewModel,
93 VideoRedundancyModel, 98 VideoRedundancyModel,
94 UserVideoHistoryModel 99 UserVideoHistoryModel,
100 AccountBlocklistModel,
101 ServerBlocklistModel,
102 UserNotificationModel,
103 UserNotificationSettingModel,
104 VideoStreamingPlaylistModel
95 ]) 105 ])
96 106
97 // Check extensions exist in the database 107 // Check extensions exist in the database
@@ -115,25 +125,27 @@ export {
115// --------------------------------------------------------------------------- 125// ---------------------------------------------------------------------------
116 126
117async function checkPostgresExtensions () { 127async function checkPostgresExtensions () {
118 const extensions = [ 128 const promises = [
119 'pg_trgm', 129 checkPostgresExtension('pg_trgm'),
120 'unaccent' 130 checkPostgresExtension('unaccent')
121 ] 131 ]
122 132
123 for (const extension of extensions) { 133 return Promise.all(promises)
124 const query = `SELECT true AS enabled FROM pg_available_extensions WHERE name = '${extension}' AND installed_version IS NOT NULL;` 134}
125 const [ res ] = await sequelizeTypescript.query(query, { raw: true }) 135
136async function checkPostgresExtension (extension: string) {
137 const query = `SELECT true AS enabled FROM pg_available_extensions WHERE name = '${extension}' AND installed_version IS NOT NULL;`
138 const [ res ] = await sequelizeTypescript.query(query, { raw: true })
126 139
127 if (!res || res.length === 0 || res[ 0 ][ 'enabled' ] !== true) { 140 if (!res || res.length === 0 || res[ 0 ][ 'enabled' ] !== true) {
128 // Try to create the extension ourself 141 // Try to create the extension ourself
129 try { 142 try {
130 await sequelizeTypescript.query(`CREATE EXTENSION ${extension};`, { raw: true }) 143 await sequelizeTypescript.query(`CREATE EXTENSION ${extension};`, { raw: true })
131 144
132 } catch { 145 } catch {
133 const errorMessage = `You need to enable ${extension} extension in PostgreSQL. ` + 146 const errorMessage = `You need to enable ${extension} extension in PostgreSQL. ` +
134 `You can do so by running 'CREATE EXTENSION ${extension};' as a PostgreSQL super user in ${CONFIG.DATABASE.DBNAME} database.` 147 `You can do so by running 'CREATE EXTENSION ${extension};' as a PostgreSQL super user in ${CONFIG.DATABASE.DBNAME} database.`
135 throw new Error(errorMessage) 148 throw new Error(errorMessage)
136 }
137 } 149 }
138 } 150 }
139} 151}
diff --git a/server/initializers/installer.ts b/server/initializers/installer.ts
index c952ad46c..2b22e16fe 100644
--- a/server/initializers/installer.ts
+++ b/server/initializers/installer.ts
@@ -6,18 +6,27 @@ import { UserModel } from '../models/account/user'
6import { ApplicationModel } from '../models/application/application' 6import { ApplicationModel } from '../models/application/application'
7import { OAuthClientModel } from '../models/oauth/oauth-client' 7import { OAuthClientModel } from '../models/oauth/oauth-client'
8import { applicationExist, clientsExist, usersExist } from './checker-after-init' 8import { applicationExist, clientsExist, usersExist } from './checker-after-init'
9import { CACHE, CONFIG, LAST_MIGRATION_VERSION } from './constants' 9import { CACHE, CONFIG, HLS_PLAYLIST_DIRECTORY, LAST_MIGRATION_VERSION } from './constants'
10import { sequelizeTypescript } from './database' 10import { sequelizeTypescript } from './database'
11import { remove, ensureDir } from 'fs-extra' 11import { remove, ensureDir } from 'fs-extra'
12 12
13async function installApplication () { 13async function installApplication () {
14 try { 14 try {
15 await sequelizeTypescript.sync() 15 await Promise.all([
16 await removeCacheDirectories() 16 // Database related
17 await createDirectoriesIfNotExist() 17 sequelizeTypescript.sync()
18 await createApplicationIfNotExist() 18 .then(() => {
19 await createOAuthClientIfNotExist() 19 return Promise.all([
20 await createOAuthAdminIfNotExist() 20 createApplicationIfNotExist(),
21 createOAuthClientIfNotExist(),
22 createOAuthAdminIfNotExist()
23 ])
24 }),
25
26 // Directories
27 removeCacheDirectories()
28 .then(() => createDirectoriesIfNotExist())
29 ])
21 } catch (err) { 30 } catch (err) {
22 logger.error('Cannot install application.', { err }) 31 logger.error('Cannot install application.', { err })
23 process.exit(-1) 32 process.exit(-1)
@@ -64,6 +73,9 @@ function createDirectoriesIfNotExist () {
64 tasks.push(ensureDir(dir)) 73 tasks.push(ensureDir(dir))
65 } 74 }
66 75
76 // Playlist directories
77 tasks.push(ensureDir(HLS_PLAYLIST_DIRECTORY))
78
67 return Promise.all(tasks) 79 return Promise.all(tasks)
68} 80}
69 81
diff --git a/server/initializers/migrations/0120-video-null.ts b/server/initializers/migrations/0120-video-null.ts
index 63f3984dd..6d253f04f 100644
--- a/server/initializers/migrations/0120-video-null.ts
+++ b/server/initializers/migrations/0120-video-null.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../constants'
3 2
4async function up (utils: { 3async function up (utils: {
5 transaction: Sequelize.Transaction, 4 transaction: Sequelize.Transaction,
@@ -28,7 +27,7 @@ async function up (utils: {
28 27
29 { 28 {
30 const data = { 29 const data = {
31 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max), 30 type: Sequelize.STRING(10000),
32 allowNull: true, 31 allowNull: true,
33 defaultValue: null 32 defaultValue: null
34 } 33 }
diff --git a/server/initializers/migrations/0195-support.ts b/server/initializers/migrations/0195-support.ts
index 8722a5f22..3b9eabe79 100644
--- a/server/initializers/migrations/0195-support.ts
+++ b/server/initializers/migrations/0195-support.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../index'
3 2
4async function up (utils: { 3async function up (utils: {
5 transaction: Sequelize.Transaction, 4 transaction: Sequelize.Transaction,
@@ -8,7 +7,7 @@ async function up (utils: {
8}): Promise<void> { 7}): Promise<void> {
9 { 8 {
10 const data = { 9 const data = {
11 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.SUPPORT.max), 10 type: Sequelize.STRING(500),
12 allowNull: true, 11 allowNull: true,
13 defaultValue: null 12 defaultValue: null
14 } 13 }
@@ -17,7 +16,7 @@ async function up (utils: {
17 16
18 { 17 {
19 const data = { 18 const data = {
20 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_CHANNELS.SUPPORT.max), 19 type: Sequelize.STRING(500),
21 allowNull: true, 20 allowNull: true,
22 defaultValue: null 21 defaultValue: null
23 } 22 }
@@ -26,7 +25,7 @@ async function up (utils: {
26 25
27 { 26 {
28 const data = { 27 const data = {
29 type: Sequelize.STRING(CONSTRAINTS_FIELDS.USERS.DESCRIPTION.max), 28 type: Sequelize.STRING(250),
30 allowNull: true, 29 allowNull: true,
31 defaultValue: null 30 defaultValue: null
32 } 31 }
@@ -35,7 +34,7 @@ async function up (utils: {
35 34
36 { 35 {
37 const data = { 36 const data = {
38 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max), 37 type: Sequelize.STRING(10000),
39 allowNull: true, 38 allowNull: true,
40 defaultValue: null 39 defaultValue: null
41 } 40 }
diff --git a/server/initializers/migrations/0245-user-blocked.ts b/server/initializers/migrations/0245-user-blocked.ts
index 5a04ecd2b..19c7d5b9c 100644
--- a/server/initializers/migrations/0245-user-blocked.ts
+++ b/server/initializers/migrations/0245-user-blocked.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../constants'
3 2
4async function up (utils: { 3async function up (utils: {
5 transaction: Sequelize.Transaction 4 transaction: Sequelize.Transaction
@@ -31,7 +30,7 @@ async function up (utils: {
31 30
32 { 31 {
33 const data = { 32 const data = {
34 type: Sequelize.STRING(CONSTRAINTS_FIELDS.USERS.BLOCKED_REASON.max), 33 type: Sequelize.STRING(250),
35 allowNull: true, 34 allowNull: true,
36 defaultValue: null 35 defaultValue: null
37 } 36 }
diff --git a/server/initializers/migrations/0250-video-abuse-state.ts b/server/initializers/migrations/0250-video-abuse-state.ts
index acb668ae1..50de25182 100644
--- a/server/initializers/migrations/0250-video-abuse-state.ts
+++ b/server/initializers/migrations/0250-video-abuse-state.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../constants'
3import { VideoAbuseState } from '../../../shared/models/videos' 2import { VideoAbuseState } from '../../../shared/models/videos'
4 3
5async function up (utils: { 4async function up (utils: {
@@ -32,7 +31,7 @@ async function up (utils: {
32 31
33 { 32 {
34 const data = { 33 const data = {
35 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.MODERATION_COMMENT.max), 34 type: Sequelize.STRING(300),
36 allowNull: true, 35 allowNull: true,
37 defaultValue: null 36 defaultValue: null
38 } 37 }
diff --git a/server/initializers/migrations/0255-video-blacklist-reason.ts b/server/initializers/migrations/0255-video-blacklist-reason.ts
index a380e620e..69d6efb9e 100644
--- a/server/initializers/migrations/0255-video-blacklist-reason.ts
+++ b/server/initializers/migrations/0255-video-blacklist-reason.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../constants'
3import { VideoAbuseState } from '../../../shared/models/videos' 2import { VideoAbuseState } from '../../../shared/models/videos'
4 3
5async function up (utils: { 4async function up (utils: {
@@ -10,7 +9,7 @@ async function up (utils: {
10 9
11 { 10 {
12 const data = { 11 const data = {
13 type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max), 12 type: Sequelize.STRING(300),
14 allowNull: true, 13 allowNull: true,
15 defaultValue: null 14 defaultValue: null
16 } 15 }
diff --git a/server/initializers/migrations/0260-upload-quota-daily.ts b/server/initializers/migrations/0260-upload-quota-daily.ts
index d25154ba6..cbbe391ef 100644
--- a/server/initializers/migrations/0260-upload-quota-daily.ts
+++ b/server/initializers/migrations/0260-upload-quota-daily.ts
@@ -1,5 +1,4 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { CONSTRAINTS_FIELDS } from '../constants'
3 2
4async function up (utils: { 3async function up (utils: {
5 transaction: Sequelize.Transaction 4 transaction: Sequelize.Transaction
diff --git a/server/initializers/migrations/0275-video-file-unique.ts b/server/initializers/migrations/0275-video-file-unique.ts
index fd89188c0..e321ecb04 100644
--- a/server/initializers/migrations/0275-video-file-unique.ts
+++ b/server/initializers/migrations/0275-video-file-unique.ts
@@ -5,6 +5,12 @@ async function up (utils: {
5 queryInterface: Sequelize.QueryInterface 5 queryInterface: Sequelize.QueryInterface
6 sequelize: Sequelize.Sequelize 6 sequelize: Sequelize.Sequelize
7}): Promise<any> { 7}): Promise<any> {
8 // Delete duplicated keys
9 {
10 const query = 'DELETE FROM "server" s1 USING "server" s2 WHERE s1.id < s2.id AND s1."host" = s2."host"'
11 await utils.sequelize.query(query)
12 }
13
8 { 14 {
9 const query = 'DELETE FROM "videoFile" vf1 USING "videoFile" vf2 WHERE vf1.id < vf2.id ' + 15 const query = 'DELETE FROM "videoFile" vf1 USING "videoFile" vf2 WHERE vf1.id < vf2.id ' +
10 'AND vf1."videoId" = vf2."videoId" AND vf1.resolution = vf2.resolution AND vf1.fps IS NULL' 16 'AND vf1."videoId" = vf2."videoId" AND vf1.resolution = vf2.resolution AND vf1.fps IS NULL'
diff --git a/server/initializers/migrations/0280-webtorrent-policy-user.ts b/server/initializers/migrations/0280-webtorrent-policy-user.ts
new file mode 100644
index 000000000..e6488356a
--- /dev/null
+++ b/server/initializers/migrations/0280-webtorrent-policy-user.ts
@@ -0,0 +1,28 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction
5 queryInterface: Sequelize.QueryInterface
6 sequelize: Sequelize.Sequelize
7}): Promise<any> {
8 {
9 const data = {
10 type: Sequelize.BOOLEAN,
11 allowNull: false,
12 defaultValue: true
13 }
14
15 await utils.queryInterface.addColumn('user', 'webTorrentEnabled', data)
16 }
17
18}
19
20async function down (utils: {
21 transaction: Sequelize.Transaction
22 queryInterface: Sequelize.QueryInterface
23 sequelize: Sequelize.Sequelize
24}): Promise<any> {
25 await utils.queryInterface.removeColumn('user', 'webTorrentEnabled')
26}
27
28export { up, down }
diff --git a/server/initializers/migrations/0285-description-support.ts b/server/initializers/migrations/0285-description-support.ts
new file mode 100644
index 000000000..85ef4ef39
--- /dev/null
+++ b/server/initializers/migrations/0285-description-support.ts
@@ -0,0 +1,53 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 {
10 const data = {
11 type: Sequelize.STRING(1000),
12 allowNull: true,
13 defaultValue: null
14 }
15 await utils.queryInterface.changeColumn('video', 'support', data)
16 }
17
18 {
19 const data = {
20 type: Sequelize.STRING(1000),
21 allowNull: true,
22 defaultValue: null
23 }
24 await utils.queryInterface.changeColumn('videoChannel', 'support', data)
25 }
26
27 {
28 const data = {
29 type: Sequelize.STRING(1000),
30 allowNull: true,
31 defaultValue: null
32 }
33 await utils.queryInterface.changeColumn('videoChannel', 'description', data)
34 }
35
36 {
37 const data = {
38 type: Sequelize.STRING(1000),
39 allowNull: true,
40 defaultValue: null
41 }
42 await utils.queryInterface.changeColumn('account', 'description', data)
43 }
44}
45
46function down (options) {
47 throw new Error('Not implemented.')
48}
49
50export {
51 up,
52 down
53}
diff --git a/server/initializers/migrations/0290-account-video-rate-url.ts b/server/initializers/migrations/0290-account-video-rate-url.ts
new file mode 100644
index 000000000..bdabf2929
--- /dev/null
+++ b/server/initializers/migrations/0290-account-video-rate-url.ts
@@ -0,0 +1,46 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 {
10 const data = {
11 type: Sequelize.STRING(2000),
12 allowNull: true
13 }
14
15 await utils.queryInterface.addColumn('accountVideoRate', 'url', data)
16 }
17
18 {
19 const builtUrlQuery = `SELECT "actor"."url" || '/' || "accountVideoRate"."type" || 's/' || "videoId" ` +
20 'FROM "accountVideoRate" ' +
21 'INNER JOIN account ON account.id = "accountVideoRate"."accountId" ' +
22 'INNER JOIN actor ON actor.id = account."actorId" ' +
23 'WHERE "base".id = "accountVideoRate".id'
24
25 const query = 'UPDATE "accountVideoRate" base SET "url" = (' + builtUrlQuery + ') WHERE "url" IS NULL'
26 await utils.sequelize.query(query)
27 }
28
29 {
30 const data = {
31 type: Sequelize.STRING(2000),
32 allowNull: false,
33 defaultValue: null
34 }
35 await utils.queryInterface.changeColumn('accountVideoRate', 'url', data)
36 }
37}
38
39function down (options) {
40 throw new Error('Not implemented.')
41}
42
43export {
44 up,
45 down
46}
diff --git a/server/initializers/migrations/0295-video-file-extname.ts b/server/initializers/migrations/0295-video-file-extname.ts
new file mode 100644
index 000000000..dbf249f66
--- /dev/null
+++ b/server/initializers/migrations/0295-video-file-extname.ts
@@ -0,0 +1,49 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 {
10 await utils.queryInterface.renameColumn('videoFile', 'extname', 'extname_old')
11 }
12
13 {
14 const data = {
15 type: Sequelize.STRING,
16 defaultValue: null,
17 allowNull: true
18 }
19
20 await utils.queryInterface.addColumn('videoFile', 'extname', data)
21 }
22
23 {
24 const query = 'UPDATE "videoFile" SET "extname" = "extname_old"::text'
25 await utils.sequelize.query(query)
26 }
27
28 {
29 const data = {
30 type: Sequelize.STRING,
31 defaultValue: null,
32 allowNull: false
33 }
34 await utils.queryInterface.changeColumn('videoFile', 'extname', data)
35 }
36
37 {
38 await utils.queryInterface.removeColumn('videoFile', 'extname_old')
39 }
40}
41
42function down (options) {
43 throw new Error('Not implemented.')
44}
45
46export {
47 up,
48 down
49}
diff --git a/server/initializers/migrations/0300-user-videos-history-enabled.ts b/server/initializers/migrations/0300-user-videos-history-enabled.ts
new file mode 100644
index 000000000..aa5fc21fb
--- /dev/null
+++ b/server/initializers/migrations/0300-user-videos-history-enabled.ts
@@ -0,0 +1,27 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 {
10 const data = {
11 type: Sequelize.BOOLEAN,
12 allowNull: false,
13 defaultValue: true
14 }
15
16 await utils.queryInterface.addColumn('user', 'videosHistoryEnabled', data)
17 }
18}
19
20function down (options) {
21 throw new Error('Not implemented.')
22}
23
24export {
25 up,
26 down
27}
diff --git a/server/initializers/migrations/0305-fix-unfederated-videos.ts b/server/initializers/migrations/0305-fix-unfederated-videos.ts
new file mode 100644
index 000000000..be206601f
--- /dev/null
+++ b/server/initializers/migrations/0305-fix-unfederated-videos.ts
@@ -0,0 +1,52 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 {
10 const query = `INSERT INTO "videoShare" (url, "actorId", "videoId", "createdAt", "updatedAt") ` +
11 `(` +
12 `SELECT ` +
13 `video.url || '/announces/' || "videoChannel"."actorId" as url, ` +
14 `"videoChannel"."actorId" AS "actorId", ` +
15 `"video"."id" AS "videoId", ` +
16 `NOW() AS "createdAt", ` +
17 `NOW() AS "updatedAt" ` +
18 `FROM video ` +
19 `INNER JOIN "videoChannel" ON "video"."channelId" = "videoChannel"."id" ` +
20 `WHERE "video"."remote" = false AND "video"."privacy" != 3 AND "video"."state" = 1` +
21 `) ` +
22 `ON CONFLICT DO NOTHING`
23
24 await utils.sequelize.query(query)
25 }
26
27 {
28 const query = `INSERT INTO "videoShare" (url, "actorId", "videoId", "createdAt", "updatedAt") ` +
29 `(` +
30 `SELECT ` +
31 `video.url || '/announces/' || (SELECT id FROM actor WHERE "preferredUsername" = 'peertube' ORDER BY id ASC LIMIT 1) as url, ` +
32 `(SELECT id FROM actor WHERE "preferredUsername" = 'peertube' ORDER BY id ASC LIMIT 1) AS "actorId", ` +
33 `"video"."id" AS "videoId", ` +
34 `NOW() AS "createdAt", ` +
35 `NOW() AS "updatedAt" ` +
36 `FROM video ` +
37 `WHERE "video"."remote" = false AND "video"."privacy" != 3 AND "video"."state" = 1` +
38 `) ` +
39 `ON CONFLICT DO NOTHING`
40
41 await utils.sequelize.query(query)
42 }
43}
44
45function down (options) {
46 throw new Error('Not implemented.')
47}
48
49export {
50 up,
51 down
52}
diff --git a/server/initializers/migrations/0310-drop-unused-video-indexes.ts b/server/initializers/migrations/0310-drop-unused-video-indexes.ts
new file mode 100644
index 000000000..d51f430c0
--- /dev/null
+++ b/server/initializers/migrations/0310-drop-unused-video-indexes.ts
@@ -0,0 +1,32 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize,
7 db: any
8}): Promise<void> {
9 const indexNames = [
10 'video_category',
11 'video_licence',
12 'video_nsfw',
13 'video_language',
14 'video_wait_transcoding',
15 'video_state',
16 'video_remote',
17 'video_likes'
18 ]
19
20 for (const indexName of indexNames) {
21 await utils.sequelize.query('DROP INDEX IF EXISTS "' + indexName + '";')
22 }
23}
24
25function down (options) {
26 throw new Error('Not implemented.')
27}
28
29export {
30 up,
31 down
32}
diff --git a/server/initializers/migrations/0315-user-notifications.ts b/server/initializers/migrations/0315-user-notifications.ts
new file mode 100644
index 000000000..8284c58a0
--- /dev/null
+++ b/server/initializers/migrations/0315-user-notifications.ts
@@ -0,0 +1,47 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const query = `
11CREATE TABLE IF NOT EXISTS "userNotificationSetting" ("id" SERIAL,
12"newVideoFromSubscription" INTEGER NOT NULL DEFAULT NULL,
13"newCommentOnMyVideo" INTEGER NOT NULL DEFAULT NULL,
14"videoAbuseAsModerator" INTEGER NOT NULL DEFAULT NULL,
15"blacklistOnMyVideo" INTEGER NOT NULL DEFAULT NULL,
16"myVideoPublished" INTEGER NOT NULL DEFAULT NULL,
17"myVideoImportFinished" INTEGER NOT NULL DEFAULT NULL,
18"newUserRegistration" INTEGER NOT NULL DEFAULT NULL,
19"newFollow" INTEGER NOT NULL DEFAULT NULL,
20"commentMention" INTEGER NOT NULL DEFAULT NULL,
21"userId" INTEGER REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
22"createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
23"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
24PRIMARY KEY ("id"))
25`
26 await utils.sequelize.query(query)
27 }
28
29 {
30 const query = 'INSERT INTO "userNotificationSetting" ' +
31 '("newVideoFromSubscription", "newCommentOnMyVideo", "videoAbuseAsModerator", "blacklistOnMyVideo", ' +
32 '"myVideoPublished", "myVideoImportFinished", "newUserRegistration", "newFollow", "commentMention", ' +
33 '"userId", "createdAt", "updatedAt") ' +
34 '(SELECT 1, 1, 3, 3, 1, 1, 1, 1, 1, id, NOW(), NOW() FROM "user")'
35
36 await utils.sequelize.query(query)
37 }
38}
39
40function down (options) {
41 throw new Error('Not implemented.')
42}
43
44export {
45 up,
46 down
47}
diff --git a/server/initializers/migrations/0320-blacklist-unfederate.ts b/server/initializers/migrations/0320-blacklist-unfederate.ts
new file mode 100644
index 000000000..6fb7bbb90
--- /dev/null
+++ b/server/initializers/migrations/0320-blacklist-unfederate.ts
@@ -0,0 +1,27 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const data = {
11 type: Sequelize.BOOLEAN,
12 allowNull: false,
13 defaultValue: false
14 }
15
16 await utils.queryInterface.addColumn('videoBlacklist', 'unfederated', data)
17 }
18}
19
20function down (options) {
21 throw new Error('Not implemented.')
22}
23
24export {
25 up,
26 down
27}
diff --git a/server/initializers/migrations/0325-video-abuse-fields.ts b/server/initializers/migrations/0325-video-abuse-fields.ts
new file mode 100644
index 000000000..fca6d666f
--- /dev/null
+++ b/server/initializers/migrations/0325-video-abuse-fields.ts
@@ -0,0 +1,37 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const data = {
11 type: Sequelize.STRING(3000),
12 allowNull: false,
13 defaultValue: null
14 }
15
16 await utils.queryInterface.changeColumn('videoAbuse', 'reason', data)
17 }
18
19 {
20 const data = {
21 type: Sequelize.STRING(3000),
22 allowNull: true,
23 defaultValue: null
24 }
25
26 await utils.queryInterface.changeColumn('videoAbuse', 'moderationComment', data)
27 }
28}
29
30function down (options) {
31 throw new Error('Not implemented.')
32}
33
34export {
35 up,
36 down
37}
diff --git a/server/initializers/migrations/0330-video-streaming-playlist.ts b/server/initializers/migrations/0330-video-streaming-playlist.ts
new file mode 100644
index 000000000..c85a762ab
--- /dev/null
+++ b/server/initializers/migrations/0330-video-streaming-playlist.ts
@@ -0,0 +1,51 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const query = `
11 CREATE TABLE IF NOT EXISTS "videoStreamingPlaylist"
12(
13 "id" SERIAL,
14 "type" INTEGER NOT NULL,
15 "playlistUrl" VARCHAR(2000) NOT NULL,
16 "p2pMediaLoaderInfohashes" VARCHAR(255)[] NOT NULL,
17 "segmentsSha256Url" VARCHAR(255) NOT NULL,
18 "videoId" INTEGER NOT NULL REFERENCES "video" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
19 "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
20 "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
21 PRIMARY KEY ("id")
22);`
23 await utils.sequelize.query(query)
24 }
25
26 {
27 const data = {
28 type: Sequelize.INTEGER,
29 allowNull: true,
30 defaultValue: null
31 }
32
33 await utils.queryInterface.changeColumn('videoRedundancy', 'videoFileId', data)
34 }
35
36 {
37 const query = 'ALTER TABLE "videoRedundancy" ADD COLUMN "videoStreamingPlaylistId" INTEGER NULL ' +
38 'REFERENCES "videoStreamingPlaylist" ("id") ON DELETE CASCADE ON UPDATE CASCADE'
39
40 await utils.sequelize.query(query)
41 }
42}
43
44function down (options) {
45 throw new Error('Not implemented.')
46}
47
48export {
49 up,
50 down
51}
diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts
index 45dd4443d..a3f379b76 100644
--- a/server/lib/activitypub/actor.ts
+++ b/server/lib/activitypub/actor.ts
@@ -1,19 +1,18 @@
1import * as Bluebird from 'bluebird' 1import * as Bluebird from 'bluebird'
2import { join } from 'path'
3import { Transaction } from 'sequelize' 2import { Transaction } from 'sequelize'
4import * as url from 'url' 3import * as url from 'url'
5import * as uuidv4 from 'uuid/v4' 4import * as uuidv4 from 'uuid/v4'
6import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub' 5import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub'
7import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects' 6import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects'
8import { getActorUrl } from '../../helpers/activitypub' 7import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
9import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor' 8import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor'
10import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' 9import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
11import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils' 10import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils'
12import { logger } from '../../helpers/logger' 11import { logger } from '../../helpers/logger'
13import { createPrivateAndPublicKeys } from '../../helpers/peertube-crypto' 12import { createPrivateAndPublicKeys } from '../../helpers/peertube-crypto'
14import { doRequest, doRequestAndSaveToFile } from '../../helpers/requests' 13import { doRequest, downloadImage } from '../../helpers/requests'
15import { getUrlFromWebfinger } from '../../helpers/webfinger' 14import { getUrlFromWebfinger } from '../../helpers/webfinger'
16import { CONFIG, IMAGE_MIMETYPE_EXT, sequelizeTypescript } from '../../initializers' 15import { AVATARS_SIZE, CONFIG, MIMETYPES, sequelizeTypescript } from '../../initializers'
17import { AccountModel } from '../../models/account/account' 16import { AccountModel } from '../../models/account/account'
18import { ActorModel } from '../../models/activitypub/actor' 17import { ActorModel } from '../../models/activitypub/actor'
19import { AvatarModel } from '../../models/avatar/avatar' 18import { AvatarModel } from '../../models/avatar/avatar'
@@ -43,7 +42,7 @@ async function getOrCreateActorAndServerAndModel (
43 recurseIfNeeded = true, 42 recurseIfNeeded = true,
44 updateCollections = false 43 updateCollections = false
45) { 44) {
46 const actorUrl = getActorUrl(activityActor) 45 const actorUrl = getAPId(activityActor)
47 let created = false 46 let created = false
48 47
49 let actor = await fetchActorByUrl(actorUrl, fetchType) 48 let actor = await fetchActorByUrl(actorUrl, fetchType)
@@ -65,8 +64,12 @@ async function getOrCreateActorAndServerAndModel (
65 const accountAttributedTo = result.attributedTo.find(a => a.type === 'Person') 64 const accountAttributedTo = result.attributedTo.find(a => a.type === 'Person')
66 if (!accountAttributedTo) throw new Error('Cannot find account attributed to video channel ' + actor.url) 65 if (!accountAttributedTo) throw new Error('Cannot find account attributed to video channel ' + actor.url)
67 66
67 if (checkUrlsSameHost(accountAttributedTo.id, actorUrl) !== true) {
68 throw new Error(`Account attributed to ${accountAttributedTo.id} does not have the same host than actor url ${actorUrl}`)
69 }
70
68 try { 71 try {
69 // Assert we don't recurse another time 72 // Don't recurse another time
70 ownerActor = await getOrCreateActorAndServerAndModel(accountAttributedTo.id, 'all', false) 73 ownerActor = await getOrCreateActorAndServerAndModel(accountAttributedTo.id, 'all', false)
71 } catch (err) { 74 } catch (err) {
72 logger.error('Cannot get or create account attributed to video channel ' + actor.url) 75 logger.error('Cannot get or create account attributed to video channel ' + actor.url)
@@ -168,18 +171,13 @@ async function fetchActorTotalItems (url: string) {
168 171
169async function fetchAvatarIfExists (actorJSON: ActivityPubActor) { 172async function fetchAvatarIfExists (actorJSON: ActivityPubActor) {
170 if ( 173 if (
171 actorJSON.icon && actorJSON.icon.type === 'Image' && IMAGE_MIMETYPE_EXT[actorJSON.icon.mediaType] !== undefined && 174 actorJSON.icon && actorJSON.icon.type === 'Image' && MIMETYPES.IMAGE.MIMETYPE_EXT[actorJSON.icon.mediaType] !== undefined &&
172 isActivityPubUrlValid(actorJSON.icon.url) 175 isActivityPubUrlValid(actorJSON.icon.url)
173 ) { 176 ) {
174 const extension = IMAGE_MIMETYPE_EXT[actorJSON.icon.mediaType] 177 const extension = MIMETYPES.IMAGE.MIMETYPE_EXT[actorJSON.icon.mediaType]
175 178
176 const avatarName = uuidv4() + extension 179 const avatarName = uuidv4() + extension
177 const destPath = join(CONFIG.STORAGE.AVATARS_DIR, avatarName) 180 await downloadImage(actorJSON.icon.url, CONFIG.STORAGE.AVATARS_DIR, avatarName, AVATARS_SIZE)
178
179 await doRequestAndSaveToFile({
180 method: 'GET',
181 uri: actorJSON.icon.url
182 }, destPath)
183 181
184 return avatarName 182 return avatarName
185 } 183 }
@@ -203,6 +201,69 @@ async function addFetchOutboxJob (actor: ActorModel) {
203 return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload }) 201 return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
204} 202}
205 203
204async function refreshActorIfNeeded (
205 actorArg: ActorModel,
206 fetchedType: ActorFetchByUrlType
207): Promise<{ actor: ActorModel, refreshed: boolean }> {
208 if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
209
210 // We need more attributes
211 const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
212
213 try {
214 let actorUrl: string
215 try {
216 actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
217 } catch (err) {
218 logger.warn('Cannot get actor URL from webfinger, keeping the old one.', err)
219 actorUrl = actor.url
220 }
221
222 const { result, statusCode } = await fetchRemoteActor(actorUrl)
223
224 if (statusCode === 404) {
225 logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
226 actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
227 return { actor: undefined, refreshed: false }
228 }
229
230 if (result === undefined) {
231 logger.warn('Cannot fetch remote actor in refresh actor.')
232 return { actor, refreshed: false }
233 }
234
235 return sequelizeTypescript.transaction(async t => {
236 updateInstanceWithAnother(actor, result.actor)
237
238 if (result.avatarName !== undefined) {
239 await updateActorAvatarInstance(actor, result.avatarName, t)
240 }
241
242 // Force update
243 actor.setDataValue('updatedAt', new Date())
244 await actor.save({ transaction: t })
245
246 if (actor.Account) {
247 actor.Account.set('name', result.name)
248 actor.Account.set('description', result.summary)
249
250 await actor.Account.save({ transaction: t })
251 } else if (actor.VideoChannel) {
252 actor.VideoChannel.set('name', result.name)
253 actor.VideoChannel.set('description', result.summary)
254 actor.VideoChannel.set('support', result.support)
255
256 await actor.VideoChannel.save({ transaction: t })
257 }
258
259 return { refreshed: true, actor }
260 })
261 } catch (err) {
262 logger.warn('Cannot refresh actor.', { err })
263 return { actor, refreshed: false }
264 }
265}
266
206export { 267export {
207 getOrCreateActorAndServerAndModel, 268 getOrCreateActorAndServerAndModel,
208 buildActorInstance, 269 buildActorInstance,
@@ -210,6 +271,7 @@ export {
210 fetchActorTotalItems, 271 fetchActorTotalItems,
211 fetchAvatarIfExists, 272 fetchAvatarIfExists,
212 updateActorInstance, 273 updateActorInstance,
274 refreshActorIfNeeded,
213 updateActorAvatarInstance, 275 updateActorAvatarInstance,
214 addFetchOutboxJob 276 addFetchOutboxJob
215} 277}
@@ -293,16 +355,19 @@ async function fetchRemoteActor (actorUrl: string): Promise<{ statusCode?: numbe
293 355
294 logger.info('Fetching remote actor %s.', actorUrl) 356 logger.info('Fetching remote actor %s.', actorUrl)
295 357
296 const requestResult = await doRequest(options) 358 const requestResult = await doRequest<ActivityPubActor>(options)
297 normalizeActor(requestResult.body) 359 normalizeActor(requestResult.body)
298 360
299 const actorJSON: ActivityPubActor = requestResult.body 361 const actorJSON = requestResult.body
300
301 if (isActorObjectValid(actorJSON) === false) { 362 if (isActorObjectValid(actorJSON) === false) {
302 logger.debug('Remote actor JSON is not valid.', { actorJSON: actorJSON }) 363 logger.debug('Remote actor JSON is not valid.', { actorJSON })
303 return { result: undefined, statusCode: requestResult.response.statusCode } 364 return { result: undefined, statusCode: requestResult.response.statusCode }
304 } 365 }
305 366
367 if (checkUrlsSameHost(actorJSON.id, actorUrl) !== true) {
368 throw new Error('Actor url ' + actorUrl + ' has not the same host than its AP id ' + actorJSON.id)
369 }
370
306 const followersCount = await fetchActorTotalItems(actorJSON.followers) 371 const followersCount = await fetchActorTotalItems(actorJSON.followers)
307 const followingCount = await fetchActorTotalItems(actorJSON.following) 372 const followingCount = await fetchActorTotalItems(actorJSON.following)
308 373
@@ -371,59 +436,3 @@ async function saveVideoChannel (actor: ActorModel, result: FetchRemoteActorResu
371 436
372 return videoChannelCreated 437 return videoChannelCreated
373} 438}
374
375async function refreshActorIfNeeded (
376 actorArg: ActorModel,
377 fetchedType: ActorFetchByUrlType
378): Promise<{ actor: ActorModel, refreshed: boolean }> {
379 if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
380
381 // We need more attributes
382 const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
383
384 try {
385 const actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
386 const { result, statusCode } = await fetchRemoteActor(actorUrl)
387
388 if (statusCode === 404) {
389 logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
390 actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
391 return { actor: undefined, refreshed: false }
392 }
393
394 if (result === undefined) {
395 logger.warn('Cannot fetch remote actor in refresh actor.')
396 return { actor, refreshed: false }
397 }
398
399 return sequelizeTypescript.transaction(async t => {
400 updateInstanceWithAnother(actor, result.actor)
401
402 if (result.avatarName !== undefined) {
403 await updateActorAvatarInstance(actor, result.avatarName, t)
404 }
405
406 // Force update
407 actor.setDataValue('updatedAt', new Date())
408 await actor.save({ transaction: t })
409
410 if (actor.Account) {
411 actor.Account.set('name', result.name)
412 actor.Account.set('description', result.summary)
413
414 await actor.Account.save({ transaction: t })
415 } else if (actor.VideoChannel) {
416 actor.VideoChannel.set('name', result.name)
417 actor.VideoChannel.set('description', result.summary)
418 actor.VideoChannel.set('support', result.support)
419
420 await actor.VideoChannel.save({ transaction: t })
421 }
422
423 return { refreshed: true, actor }
424 })
425 } catch (err) {
426 logger.warn('Cannot refresh actor.', { err })
427 return { actor, refreshed: false }
428 }
429}
diff --git a/server/lib/activitypub/cache-file.ts b/server/lib/activitypub/cache-file.ts
index f6f068b45..9a40414bb 100644
--- a/server/lib/activitypub/cache-file.ts
+++ b/server/lib/activitypub/cache-file.ts
@@ -1,11 +1,28 @@
1import { CacheFileObject } from '../../../shared/index' 1import { ActivityPlaylistUrlObject, ActivityVideoUrlObject, CacheFileObject } from '../../../shared/index'
2import { VideoModel } from '../../models/video/video' 2import { VideoModel } from '../../models/video/video'
3import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' 3import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
4import { Transaction } from 'sequelize' 4import { Transaction } from 'sequelize'
5import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
5 6
6function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) { 7function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) {
7 const url = cacheFileObject.url
8 8
9 if (cacheFileObject.url.mediaType === 'application/x-mpegURL') {
10 const url = cacheFileObject.url
11
12 const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS)
13 if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url)
14
15 return {
16 expiresOn: new Date(cacheFileObject.expires),
17 url: cacheFileObject.id,
18 fileUrl: url.href,
19 strategy: null,
20 videoStreamingPlaylistId: playlist.id,
21 actorId: byActor.id
22 }
23 }
24
25 const url = cacheFileObject.url
9 const videoFile = video.VideoFiles.find(f => { 26 const videoFile = video.VideoFiles.find(f => {
10 return f.resolution === url.height && f.fps === url.fps 27 return f.resolution === url.height && f.fps === url.fps
11 }) 28 })
@@ -15,7 +32,7 @@ function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject
15 return { 32 return {
16 expiresOn: new Date(cacheFileObject.expires), 33 expiresOn: new Date(cacheFileObject.expires),
17 url: cacheFileObject.id, 34 url: cacheFileObject.id,
18 fileUrl: cacheFileObject.url.href, 35 fileUrl: url.href,
19 strategy: null, 36 strategy: null,
20 videoFileId: videoFile.id, 37 videoFileId: videoFile.id,
21 actorId: byActor.id 38 actorId: byActor.id
diff --git a/server/lib/activitypub/crawl.ts b/server/lib/activitypub/crawl.ts
index 55912341c..1b9b14c2e 100644
--- a/server/lib/activitypub/crawl.ts
+++ b/server/lib/activitypub/crawl.ts
@@ -1,7 +1,8 @@
1import { ACTIVITY_PUB, JOB_REQUEST_TIMEOUT } from '../../initializers' 1import { ACTIVITY_PUB, JOB_REQUEST_TIMEOUT } from '../../initializers'
2import { doRequest } from '../../helpers/requests' 2import { doRequest } from '../../helpers/requests'
3import { logger } from '../../helpers/logger' 3import { logger } from '../../helpers/logger'
4import Bluebird = require('bluebird') 4import * as Bluebird from 'bluebird'
5import { ActivityPubOrderedCollection } from '../../../shared/models/activitypub'
5 6
6async function crawlCollectionPage <T> (uri: string, handler: (items: T[]) => Promise<any> | Bluebird<any>) { 7async function crawlCollectionPage <T> (uri: string, handler: (items: T[]) => Promise<any> | Bluebird<any>) {
7 logger.info('Crawling ActivityPub data on %s.', uri) 8 logger.info('Crawling ActivityPub data on %s.', uri)
@@ -14,7 +15,7 @@ async function crawlCollectionPage <T> (uri: string, handler: (items: T[]) => Pr
14 timeout: JOB_REQUEST_TIMEOUT 15 timeout: JOB_REQUEST_TIMEOUT
15 } 16 }
16 17
17 const response = await doRequest(options) 18 const response = await doRequest<ActivityPubOrderedCollection<T>>(options)
18 const firstBody = response.body 19 const firstBody = response.body
19 20
20 let limit = ACTIVITY_PUB.FETCH_PAGE_LIMIT 21 let limit = ACTIVITY_PUB.FETCH_PAGE_LIMIT
@@ -23,7 +24,7 @@ async function crawlCollectionPage <T> (uri: string, handler: (items: T[]) => Pr
23 while (nextLink && i < limit) { 24 while (nextLink && i < limit) {
24 options.uri = nextLink 25 options.uri = nextLink
25 26
26 const { body } = await doRequest(options) 27 const { body } = await doRequest<ActivityPubOrderedCollection<T>>(options)
27 nextLink = body.next 28 nextLink = body.next
28 i++ 29 i++
29 30
diff --git a/server/lib/activitypub/process/index.ts b/server/lib/activitypub/process/index.ts
index db4980a72..5466739c1 100644
--- a/server/lib/activitypub/process/index.ts
+++ b/server/lib/activitypub/process/index.ts
@@ -1,9 +1 @@
1export * from './process' export * from './process'
2export * from './process-accept'
3export * from './process-announce'
4export * from './process-create'
5export * from './process-delete'
6export * from './process-follow'
7export * from './process-like'
8export * from './process-undo'
9export * from './process-update'
diff --git a/server/lib/activitypub/process/process-accept.ts b/server/lib/activitypub/process/process-accept.ts
index 89bda9c32..ebb275e34 100644
--- a/server/lib/activitypub/process/process-accept.ts
+++ b/server/lib/activitypub/process/process-accept.ts
@@ -24,6 +24,7 @@ async function processAccept (actor: ActorModel, targetActor: ActorModel) {
24 if (follow.state !== 'accepted') { 24 if (follow.state !== 'accepted') {
25 follow.set('state', 'accepted') 25 follow.set('state', 'accepted')
26 await follow.save() 26 await follow.save()
27
27 await addFetchOutboxJob(targetActor) 28 await addFetchOutboxJob(targetActor)
28 } 29 }
29} 30}
diff --git a/server/lib/activitypub/process/process-announce.ts b/server/lib/activitypub/process/process-announce.ts
index cc88b5423..23310b41e 100644
--- a/server/lib/activitypub/process/process-announce.ts
+++ b/server/lib/activitypub/process/process-announce.ts
@@ -5,6 +5,8 @@ import { ActorModel } from '../../../models/activitypub/actor'
5import { VideoShareModel } from '../../../models/video/video-share' 5import { VideoShareModel } from '../../../models/video/video-share'
6import { forwardVideoRelatedActivity } from '../send/utils' 6import { forwardVideoRelatedActivity } from '../send/utils'
7import { getOrCreateVideoAndAccountAndChannel } from '../videos' 7import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { VideoPrivacy } from '../../../../shared/models/videos'
9import { Notifier } from '../../notifier'
8 10
9async function processAnnounceActivity (activity: ActivityAnnounce, actorAnnouncer: ActorModel) { 11async function processAnnounceActivity (activity: ActivityAnnounce, actorAnnouncer: ActorModel) {
10 return retryTransactionWrapper(processVideoShare, actorAnnouncer, activity) 12 return retryTransactionWrapper(processVideoShare, actorAnnouncer, activity)
@@ -21,9 +23,9 @@ export {
21async function processVideoShare (actorAnnouncer: ActorModel, activity: ActivityAnnounce) { 23async function processVideoShare (actorAnnouncer: ActorModel, activity: ActivityAnnounce) {
22 const objectUri = typeof activity.object === 'string' ? activity.object : activity.object.id 24 const objectUri = typeof activity.object === 'string' ? activity.object : activity.object.id
23 25
24 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: objectUri }) 26 const { video, created: videoCreated } = await getOrCreateVideoAndAccountAndChannel({ videoObject: objectUri })
25 27
26 return sequelizeTypescript.transaction(async t => { 28 await sequelizeTypescript.transaction(async t => {
27 // Add share entry 29 // Add share entry
28 30
29 const share = { 31 const share = {
@@ -49,4 +51,6 @@ async function processVideoShare (actorAnnouncer: ActorModel, activity: Activity
49 51
50 return undefined 52 return undefined
51 }) 53 })
54
55 if (videoCreated) Notifier.Instance.notifyOnNewVideo(video)
52} 56}
diff --git a/server/lib/activitypub/process/process-create.ts b/server/lib/activitypub/process/process-create.ts
index cefe89db0..5f4d793a5 100644
--- a/server/lib/activitypub/process/process-create.ts
+++ b/server/lib/activitypub/process/process-create.ts
@@ -1,34 +1,44 @@
1import { ActivityCreate, CacheFileObject, VideoAbuseState, VideoTorrentObject } from '../../../../shared' 1import { ActivityCreate, CacheFileObject, VideoTorrentObject } from '../../../../shared'
2import { DislikeObject, VideoAbuseObject, ViewObject } from '../../../../shared/models/activitypub/objects'
3import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object' 2import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object'
4import { retryTransactionWrapper } from '../../../helpers/database-utils' 3import { retryTransactionWrapper } from '../../../helpers/database-utils'
5import { logger } from '../../../helpers/logger' 4import { logger } from '../../../helpers/logger'
6import { sequelizeTypescript } from '../../../initializers' 5import { sequelizeTypescript } from '../../../initializers'
7import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
8import { ActorModel } from '../../../models/activitypub/actor' 6import { ActorModel } from '../../../models/activitypub/actor'
9import { VideoAbuseModel } from '../../../models/video/video-abuse'
10import { addVideoComment, resolveThread } from '../video-comments' 7import { addVideoComment, resolveThread } from '../video-comments'
11import { getOrCreateVideoAndAccountAndChannel } from '../videos' 8import { getOrCreateVideoAndAccountAndChannel } from '../videos'
12import { forwardVideoRelatedActivity } from '../send/utils' 9import { forwardVideoRelatedActivity } from '../send/utils'
13import { Redis } from '../../redis'
14import { createOrUpdateCacheFile } from '../cache-file' 10import { createOrUpdateCacheFile } from '../cache-file'
11import { Notifier } from '../../notifier'
12import { processViewActivity } from './process-view'
13import { processDislikeActivity } from './process-dislike'
14import { processFlagActivity } from './process-flag'
15 15
16async function processCreateActivity (activity: ActivityCreate, byActor: ActorModel) { 16async function processCreateActivity (activity: ActivityCreate, byActor: ActorModel) {
17 const activityObject = activity.object 17 const activityObject = activity.object
18 const activityType = activityObject.type 18 const activityType = activityObject.type
19 19
20 if (activityType === 'View') { 20 if (activityType === 'View') {
21 return processCreateView(byActor, activity) 21 return processViewActivity(activity, byActor)
22 } else if (activityType === 'Dislike') { 22 }
23 return retryTransactionWrapper(processCreateDislike, byActor, activity) 23
24 } else if (activityType === 'Video') { 24 if (activityType === 'Dislike') {
25 return retryTransactionWrapper(processDislikeActivity, activity, byActor)
26 }
27
28 if (activityType === 'Flag') {
29 return retryTransactionWrapper(processFlagActivity, activity, byActor)
30 }
31
32 if (activityType === 'Video') {
25 return processCreateVideo(activity) 33 return processCreateVideo(activity)
26 } else if (activityType === 'Flag') { 34 }
27 return retryTransactionWrapper(processCreateVideoAbuse, byActor, activityObject as VideoAbuseObject) 35
28 } else if (activityType === 'Note') { 36 if (activityType === 'Note') {
29 return retryTransactionWrapper(processCreateVideoComment, byActor, activity) 37 return retryTransactionWrapper(processCreateVideoComment, activity, byActor)
30 } else if (activityType === 'CacheFile') { 38 }
31 return retryTransactionWrapper(processCacheFile, byActor, activity) 39
40 if (activityType === 'CacheFile') {
41 return retryTransactionWrapper(processCacheFile, activity, byActor)
32 } 42 }
33 43
34 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id }) 44 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id })
@@ -46,60 +56,14 @@ export {
46async function processCreateVideo (activity: ActivityCreate) { 56async function processCreateVideo (activity: ActivityCreate) {
47 const videoToCreateData = activity.object as VideoTorrentObject 57 const videoToCreateData = activity.object as VideoTorrentObject
48 58
49 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoToCreateData }) 59 const { video, created } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoToCreateData })
50
51 return video
52}
53
54async function processCreateDislike (byActor: ActorModel, activity: ActivityCreate) {
55 const dislike = activity.object as DislikeObject
56 const byAccount = byActor.Account
57
58 if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
59
60 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
61
62 return sequelizeTypescript.transaction(async t => {
63 const rate = {
64 type: 'dislike' as 'dislike',
65 videoId: video.id,
66 accountId: byAccount.id
67 }
68 const [ , created ] = await AccountVideoRateModel.findOrCreate({
69 where: rate,
70 defaults: rate,
71 transaction: t
72 })
73 if (created === true) await video.increment('dislikes', { transaction: t })
74
75 if (video.isOwned() && created === true) {
76 // Don't resend the activity to the sender
77 const exceptions = [ byActor ]
78
79 await forwardVideoRelatedActivity(activity, t, exceptions, video)
80 }
81 })
82}
83
84async function processCreateView (byActor: ActorModel, activity: ActivityCreate) {
85 const view = activity.object as ViewObject
86
87 const options = {
88 videoObject: view.object,
89 fetchType: 'only-video' as 'only-video'
90 }
91 const { video } = await getOrCreateVideoAndAccountAndChannel(options)
92 60
93 await Redis.Instance.addVideoView(video.id) 61 if (created) Notifier.Instance.notifyOnNewVideo(video)
94 62
95 if (video.isOwned()) { 63 return video
96 // Don't resend the activity to the sender
97 const exceptions = [ byActor ]
98 await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
99 }
100} 64}
101 65
102async function processCacheFile (byActor: ActorModel, activity: ActivityCreate) { 66async function processCacheFile (activity: ActivityCreate, byActor: ActorModel) {
103 const cacheFile = activity.object as CacheFileObject 67 const cacheFile = activity.object as CacheFileObject
104 68
105 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFile.object }) 69 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFile.object })
@@ -115,29 +79,7 @@ async function processCacheFile (byActor: ActorModel, activity: ActivityCreate)
115 } 79 }
116} 80}
117 81
118async function processCreateVideoAbuse (byActor: ActorModel, videoAbuseToCreateData: VideoAbuseObject) { 82async function processCreateVideoComment (activity: ActivityCreate, byActor: ActorModel) {
119 logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object)
120
121 const account = byActor.Account
122 if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
123
124 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoAbuseToCreateData.object })
125
126 return sequelizeTypescript.transaction(async t => {
127 const videoAbuseData = {
128 reporterAccountId: account.id,
129 reason: videoAbuseToCreateData.content,
130 videoId: video.id,
131 state: VideoAbuseState.PENDING
132 }
133
134 await VideoAbuseModel.create(videoAbuseData, { transaction: t })
135
136 logger.info('Remote abuse for video uuid %s created', videoAbuseToCreateData.object)
137 })
138}
139
140async function processCreateVideoComment (byActor: ActorModel, activity: ActivityCreate) {
141 const commentObject = activity.object as VideoCommentObject 83 const commentObject = activity.object as VideoCommentObject
142 const byAccount = byActor.Account 84 const byAccount = byActor.Account
143 85
@@ -145,7 +87,7 @@ async function processCreateVideoComment (byActor: ActorModel, activity: Activit
145 87
146 const { video } = await resolveThread(commentObject.inReplyTo) 88 const { video } = await resolveThread(commentObject.inReplyTo)
147 89
148 const { created } = await addVideoComment(video, commentObject.id) 90 const { comment, created } = await addVideoComment(video, commentObject.id)
149 91
150 if (video.isOwned() && created === true) { 92 if (video.isOwned() && created === true) {
151 // Don't resend the activity to the sender 93 // Don't resend the activity to the sender
@@ -153,4 +95,6 @@ async function processCreateVideoComment (byActor: ActorModel, activity: Activit
153 95
154 await forwardVideoRelatedActivity(activity, undefined, exceptions, video) 96 await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
155 } 97 }
98
99 if (created === true) Notifier.Instance.notifyOnNewComment(comment)
156} 100}
diff --git a/server/lib/activitypub/process/process-dislike.ts b/server/lib/activitypub/process/process-dislike.ts
new file mode 100644
index 000000000..bfd69e07a
--- /dev/null
+++ b/server/lib/activitypub/process/process-dislike.ts
@@ -0,0 +1,52 @@
1import { ActivityCreate, ActivityDislike } from '../../../../shared'
2import { DislikeObject } from '../../../../shared/models/activitypub/objects'
3import { retryTransactionWrapper } from '../../../helpers/database-utils'
4import { sequelizeTypescript } from '../../../initializers'
5import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
6import { ActorModel } from '../../../models/activitypub/actor'
7import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { forwardVideoRelatedActivity } from '../send/utils'
9import { getVideoDislikeActivityPubUrl } from '../url'
10
11async function processDislikeActivity (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
12 return retryTransactionWrapper(processDislike, activity, byActor)
13}
14
15// ---------------------------------------------------------------------------
16
17export {
18 processDislikeActivity
19}
20
21// ---------------------------------------------------------------------------
22
23async function processDislike (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
24 const dislikeObject = activity.type === 'Dislike' ? activity.object : (activity.object as DislikeObject).object
25 const byAccount = byActor.Account
26
27 if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
28
29 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislikeObject })
30
31 return sequelizeTypescript.transaction(async t => {
32 const rate = {
33 type: 'dislike' as 'dislike',
34 videoId: video.id,
35 accountId: byAccount.id
36 }
37
38 const [ , created ] = await AccountVideoRateModel.findOrCreate({
39 where: rate,
40 defaults: Object.assign({}, rate, { url: getVideoDislikeActivityPubUrl(byActor, video) }),
41 transaction: t
42 })
43 if (created === true) await video.increment('dislikes', { transaction: t })
44
45 if (video.isOwned() && created === true) {
46 // Don't resend the activity to the sender
47 const exceptions = [ byActor ]
48
49 await forwardVideoRelatedActivity(activity, t, exceptions, video)
50 }
51 })
52}
diff --git a/server/lib/activitypub/process/process-flag.ts b/server/lib/activitypub/process/process-flag.ts
new file mode 100644
index 000000000..79ce6fb41
--- /dev/null
+++ b/server/lib/activitypub/process/process-flag.ts
@@ -0,0 +1,49 @@
1import { ActivityCreate, ActivityFlag, VideoAbuseState } from '../../../../shared'
2import { VideoAbuseObject } from '../../../../shared/models/activitypub/objects'
3import { retryTransactionWrapper } from '../../../helpers/database-utils'
4import { logger } from '../../../helpers/logger'
5import { sequelizeTypescript } from '../../../initializers'
6import { ActorModel } from '../../../models/activitypub/actor'
7import { VideoAbuseModel } from '../../../models/video/video-abuse'
8import { getOrCreateVideoAndAccountAndChannel } from '../videos'
9import { Notifier } from '../../notifier'
10import { getAPId } from '../../../helpers/activitypub'
11
12async function processFlagActivity (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
13 return retryTransactionWrapper(processCreateVideoAbuse, activity, byActor)
14}
15
16// ---------------------------------------------------------------------------
17
18export {
19 processFlagActivity
20}
21
22// ---------------------------------------------------------------------------
23
24async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
25 const flag = activity.type === 'Flag' ? activity : (activity.object as VideoAbuseObject)
26
27 logger.debug('Reporting remote abuse for video %s.', getAPId(flag.object))
28
29 const account = byActor.Account
30 if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
31
32 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: flag.object })
33
34 return sequelizeTypescript.transaction(async t => {
35 const videoAbuseData = {
36 reporterAccountId: account.id,
37 reason: flag.content,
38 videoId: video.id,
39 state: VideoAbuseState.PENDING
40 }
41
42 const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
43 videoAbuseInstance.Video = video
44
45 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
46
47 logger.info('Remote abuse for video uuid %s created', flag.object)
48 })
49}
diff --git a/server/lib/activitypub/process/process-follow.ts b/server/lib/activitypub/process/process-follow.ts
index 24c9085f7..0cd537187 100644
--- a/server/lib/activitypub/process/process-follow.ts
+++ b/server/lib/activitypub/process/process-follow.ts
@@ -5,9 +5,11 @@ import { sequelizeTypescript } from '../../../initializers'
5import { ActorModel } from '../../../models/activitypub/actor' 5import { ActorModel } from '../../../models/activitypub/actor'
6import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 6import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
7import { sendAccept } from '../send' 7import { sendAccept } from '../send'
8import { Notifier } from '../../notifier'
9import { getAPId } from '../../../helpers/activitypub'
8 10
9async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) { 11async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) {
10 const activityObject = activity.object 12 const activityObject = getAPId(activity.object)
11 13
12 return retryTransactionWrapper(processFollow, byActor, activityObject) 14 return retryTransactionWrapper(processFollow, byActor, activityObject)
13} 15}
@@ -21,13 +23,13 @@ export {
21// --------------------------------------------------------------------------- 23// ---------------------------------------------------------------------------
22 24
23async function processFollow (actor: ActorModel, targetActorURL: string) { 25async function processFollow (actor: ActorModel, targetActorURL: string) {
24 await sequelizeTypescript.transaction(async t => { 26 const { actorFollow, created } = await sequelizeTypescript.transaction(async t => {
25 const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t) 27 const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t)
26 28
27 if (!targetActor) throw new Error('Unknown actor') 29 if (!targetActor) throw new Error('Unknown actor')
28 if (targetActor.isOwned() === false) throw new Error('This is not a local actor.') 30 if (targetActor.isOwned() === false) throw new Error('This is not a local actor.')
29 31
30 const [ actorFollow ] = await ActorFollowModel.findOrCreate({ 32 const [ actorFollow, created ] = await ActorFollowModel.findOrCreate({
31 where: { 33 where: {
32 actorId: actor.id, 34 actorId: actor.id,
33 targetActorId: targetActor.id 35 targetActorId: targetActor.id
@@ -52,8 +54,12 @@ async function processFollow (actor: ActorModel, targetActorURL: string) {
52 actorFollow.ActorFollowing = targetActor 54 actorFollow.ActorFollowing = targetActor
53 55
54 // Target sends to actor he accepted the follow request 56 // Target sends to actor he accepted the follow request
55 return sendAccept(actorFollow) 57 await sendAccept(actorFollow)
58
59 return { actorFollow, created }
56 }) 60 })
57 61
62 if (created) Notifier.Instance.notifyOfNewFollow(actorFollow)
63
58 logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url) 64 logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url)
59} 65}
diff --git a/server/lib/activitypub/process/process-like.ts b/server/lib/activitypub/process/process-like.ts
index f7200db61..2a04167d7 100644
--- a/server/lib/activitypub/process/process-like.ts
+++ b/server/lib/activitypub/process/process-like.ts
@@ -5,6 +5,8 @@ import { AccountVideoRateModel } from '../../../models/account/account-video-rat
5import { ActorModel } from '../../../models/activitypub/actor' 5import { ActorModel } from '../../../models/activitypub/actor'
6import { forwardVideoRelatedActivity } from '../send/utils' 6import { forwardVideoRelatedActivity } from '../send/utils'
7import { getOrCreateVideoAndAccountAndChannel } from '../videos' 7import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { getVideoLikeActivityPubUrl } from '../url'
9import { getAPId } from '../../../helpers/activitypub'
8 10
9async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) { 11async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) {
10 return retryTransactionWrapper(processLikeVideo, byActor, activity) 12 return retryTransactionWrapper(processLikeVideo, byActor, activity)
@@ -19,7 +21,7 @@ export {
19// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
20 22
21async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) { 23async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) {
22 const videoUrl = activity.object 24 const videoUrl = getAPId(activity.object)
23 25
24 const byAccount = byActor.Account 26 const byAccount = byActor.Account
25 if (!byAccount) throw new Error('Cannot create like with the non account actor ' + byActor.url) 27 if (!byAccount) throw new Error('Cannot create like with the non account actor ' + byActor.url)
@@ -34,7 +36,7 @@ async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) {
34 } 36 }
35 const [ , created ] = await AccountVideoRateModel.findOrCreate({ 37 const [ , created ] = await AccountVideoRateModel.findOrCreate({
36 where: rate, 38 where: rate,
37 defaults: rate, 39 defaults: Object.assign({}, rate, { url: getVideoLikeActivityPubUrl(byActor, video) }),
38 transaction: t 40 transaction: t
39 }) 41 })
40 if (created === true) await video.increment('likes', { transaction: t }) 42 if (created === true) await video.increment('likes', { transaction: t })
diff --git a/server/lib/activitypub/process/process-undo.ts b/server/lib/activitypub/process/process-undo.ts
index ff019cd8c..ed0177a67 100644
--- a/server/lib/activitypub/process/process-undo.ts
+++ b/server/lib/activitypub/process/process-undo.ts
@@ -26,6 +26,10 @@ async function processUndoActivity (activity: ActivityUndo, byActor: ActorModel)
26 } 26 }
27 } 27 }
28 28
29 if (activityToUndo.type === 'Dislike') {
30 return retryTransactionWrapper(processUndoDislike, byActor, activity)
31 }
32
29 if (activityToUndo.type === 'Follow') { 33 if (activityToUndo.type === 'Follow') {
30 return retryTransactionWrapper(processUndoFollow, byActor, activityToUndo) 34 return retryTransactionWrapper(processUndoFollow, byActor, activityToUndo)
31 } 35 }
@@ -55,7 +59,8 @@ async function processUndoLike (byActor: ActorModel, activity: ActivityUndo) {
55 return sequelizeTypescript.transaction(async t => { 59 return sequelizeTypescript.transaction(async t => {
56 if (!byActor.Account) throw new Error('Unknown account ' + byActor.url) 60 if (!byActor.Account) throw new Error('Unknown account ' + byActor.url)
57 61
58 const rate = await AccountVideoRateModel.load(byActor.Account.id, video.id, t) 62 let rate = await AccountVideoRateModel.loadByUrl(likeActivity.id, t)
63 if (!rate) rate = await AccountVideoRateModel.load(byActor.Account.id, video.id, t)
59 if (!rate) throw new Error(`Unknown rate by account ${byActor.Account.id} for video ${video.id}.`) 64 if (!rate) throw new Error(`Unknown rate by account ${byActor.Account.id} for video ${video.id}.`)
60 65
61 await rate.destroy({ transaction: t }) 66 await rate.destroy({ transaction: t })
@@ -71,14 +76,17 @@ async function processUndoLike (byActor: ActorModel, activity: ActivityUndo) {
71} 76}
72 77
73async function processUndoDislike (byActor: ActorModel, activity: ActivityUndo) { 78async function processUndoDislike (byActor: ActorModel, activity: ActivityUndo) {
74 const dislike = activity.object.object as DislikeObject 79 const dislike = activity.object.type === 'Dislike'
80 ? activity.object
81 : activity.object.object as DislikeObject
75 82
76 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object }) 83 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
77 84
78 return sequelizeTypescript.transaction(async t => { 85 return sequelizeTypescript.transaction(async t => {
79 if (!byActor.Account) throw new Error('Unknown account ' + byActor.url) 86 if (!byActor.Account) throw new Error('Unknown account ' + byActor.url)
80 87
81 const rate = await AccountVideoRateModel.load(byActor.Account.id, video.id, t) 88 let rate = await AccountVideoRateModel.loadByUrl(dislike.id, t)
89 if (!rate) rate = await AccountVideoRateModel.load(byActor.Account.id, video.id, t)
82 if (!rate) throw new Error(`Unknown rate by account ${byActor.Account.id} for video ${video.id}.`) 90 if (!rate) throw new Error(`Unknown rate by account ${byActor.Account.id} for video ${video.id}.`)
83 91
84 await rate.destroy({ transaction: t }) 92 await rate.destroy({ transaction: t })
diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts
index bd4013555..c6b42d846 100644
--- a/server/lib/activitypub/process/process-update.ts
+++ b/server/lib/activitypub/process/process-update.ts
@@ -51,7 +51,7 @@ async function processUpdateVideo (actor: ActorModel, activity: ActivityUpdate)
51 return undefined 51 return undefined
52 } 52 }
53 53
54 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id }) 54 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id, allowRefresh: false })
55 const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject) 55 const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject)
56 56
57 const updateOptions = { 57 const updateOptions = {
@@ -59,7 +59,6 @@ async function processUpdateVideo (actor: ActorModel, activity: ActivityUpdate)
59 videoObject, 59 videoObject,
60 account: actor.Account, 60 account: actor.Account,
61 channel: channelActor.VideoChannel, 61 channel: channelActor.VideoChannel,
62 updateViews: true,
63 overrideTo: activity.to 62 overrideTo: activity.to
64 } 63 }
65 return updateVideoFromAP(updateOptions) 64 return updateVideoFromAP(updateOptions)
diff --git a/server/lib/activitypub/process/process-view.ts b/server/lib/activitypub/process/process-view.ts
new file mode 100644
index 000000000..8f66d3630
--- /dev/null
+++ b/server/lib/activitypub/process/process-view.ts
@@ -0,0 +1,35 @@
1import { ActorModel } from '../../../models/activitypub/actor'
2import { getOrCreateVideoAndAccountAndChannel } from '../videos'
3import { forwardVideoRelatedActivity } from '../send/utils'
4import { Redis } from '../../redis'
5import { ActivityCreate, ActivityView, ViewObject } from '../../../../shared/models/activitypub'
6
7async function processViewActivity (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
8 return processCreateView(activity, byActor)
9}
10
11// ---------------------------------------------------------------------------
12
13export {
14 processViewActivity
15}
16
17// ---------------------------------------------------------------------------
18
19async function processCreateView (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
20 const videoObject = activity.type === 'View' ? activity.object : (activity.object as ViewObject).object
21
22 const options = {
23 videoObject: videoObject,
24 fetchType: 'only-video' as 'only-video'
25 }
26 const { video } = await getOrCreateVideoAndAccountAndChannel(options)
27
28 await Redis.Instance.addVideoView(video.id)
29
30 if (video.isOwned()) {
31 // Don't resend the activity to the sender
32 const exceptions = [ byActor ]
33 await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
34 }
35}
diff --git a/server/lib/activitypub/process/process.ts b/server/lib/activitypub/process/process.ts
index b263f1ea2..9dd241402 100644
--- a/server/lib/activitypub/process/process.ts
+++ b/server/lib/activitypub/process/process.ts
@@ -1,5 +1,5 @@
1import { Activity, ActivityType } from '../../../../shared/models/activitypub' 1import { Activity, ActivityType } from '../../../../shared/models/activitypub'
2import { getActorUrl } from '../../../helpers/activitypub' 2import { checkUrlsSameHost, getAPId } from '../../../helpers/activitypub'
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { ActorModel } from '../../../models/activitypub/actor' 4import { ActorModel } from '../../../models/activitypub/actor'
5import { processAcceptActivity } from './process-accept' 5import { processAcceptActivity } from './process-accept'
@@ -12,6 +12,9 @@ import { processRejectActivity } from './process-reject'
12import { processUndoActivity } from './process-undo' 12import { processUndoActivity } from './process-undo'
13import { processUpdateActivity } from './process-update' 13import { processUpdateActivity } from './process-update'
14import { getOrCreateActorAndServerAndModel } from '../actor' 14import { getOrCreateActorAndServerAndModel } from '../actor'
15import { processDislikeActivity } from './process-dislike'
16import { processFlagActivity } from './process-flag'
17import { processViewActivity } from './process-view'
15 18
16const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: ActorModel, inboxActor?: ActorModel) => Promise<any> } = { 19const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: ActorModel, inboxActor?: ActorModel) => Promise<any> } = {
17 Create: processCreateActivity, 20 Create: processCreateActivity,
@@ -22,27 +25,41 @@ const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: Ac
22 Reject: processRejectActivity, 25 Reject: processRejectActivity,
23 Announce: processAnnounceActivity, 26 Announce: processAnnounceActivity,
24 Undo: processUndoActivity, 27 Undo: processUndoActivity,
25 Like: processLikeActivity 28 Like: processLikeActivity,
29 Dislike: processDislikeActivity,
30 Flag: processFlagActivity,
31 View: processViewActivity
26} 32}
27 33
28async function processActivities (activities: Activity[], signatureActor?: ActorModel, inboxActor?: ActorModel) { 34async function processActivities (
35 activities: Activity[],
36 options: {
37 signatureActor?: ActorModel
38 inboxActor?: ActorModel
39 outboxUrl?: string
40 } = {}) {
29 const actorsCache: { [ url: string ]: ActorModel } = {} 41 const actorsCache: { [ url: string ]: ActorModel } = {}
30 42
31 for (const activity of activities) { 43 for (const activity of activities) {
32 if (!signatureActor && [ 'Create', 'Announce', 'Like' ].indexOf(activity.type) === -1) { 44 if (!options.signatureActor && [ 'Create', 'Announce', 'Like' ].includes(activity.type) === false) {
33 logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type) 45 logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type)
34 continue 46 continue
35 } 47 }
36 48
37 const actorUrl = getActorUrl(activity.actor) 49 const actorUrl = getAPId(activity.actor)
38 50
39 // When we fetch remote data, we don't have signature 51 // When we fetch remote data, we don't have signature
40 if (signatureActor && actorUrl !== signatureActor.url) { 52 if (options.signatureActor && actorUrl !== options.signatureActor.url) {
41 logger.warn('Signature mismatch between %s and %s.', actorUrl, signatureActor.url) 53 logger.warn('Signature mismatch between %s and %s, skipping.', actorUrl, options.signatureActor.url)
42 continue 54 continue
43 } 55 }
44 56
45 const byActor = signatureActor || actorsCache[actorUrl] || await getOrCreateActorAndServerAndModel(actorUrl) 57 if (options.outboxUrl && checkUrlsSameHost(options.outboxUrl, actorUrl) !== true) {
58 logger.warn('Host mismatch between outbox URL %s and actor URL %s, skipping.', options.outboxUrl, actorUrl)
59 continue
60 }
61
62 const byActor = options.signatureActor || actorsCache[actorUrl] || await getOrCreateActorAndServerAndModel(actorUrl)
46 actorsCache[actorUrl] = byActor 63 actorsCache[actorUrl] = byActor
47 64
48 const activityProcessor = processActivity[activity.type] 65 const activityProcessor = processActivity[activity.type]
@@ -52,7 +69,7 @@ async function processActivities (activities: Activity[], signatureActor?: Actor
52 } 69 }
53 70
54 try { 71 try {
55 await activityProcessor(activity, byActor, inboxActor) 72 await activityProcessor(activity, byActor, options.inboxActor)
56 } catch (err) { 73 } catch (err) {
57 logger.warn('Cannot process activity %s.', activity.type, { err }) 74 logger.warn('Cannot process activity %s.', activity.type, { err })
58 } 75 }
diff --git a/server/lib/activitypub/send/send-create.ts b/server/lib/activitypub/send/send-create.ts
index 285edba3b..ef20e404c 100644
--- a/server/lib/activitypub/send/send-create.ts
+++ b/server/lib/activitypub/send/send-create.ts
@@ -3,9 +3,7 @@ import { ActivityAudience, ActivityCreate } from '../../../../shared/models/acti
3import { VideoPrivacy } from '../../../../shared/models/videos' 3import { VideoPrivacy } from '../../../../shared/models/videos'
4import { ActorModel } from '../../../models/activitypub/actor' 4import { ActorModel } from '../../../models/activitypub/actor'
5import { VideoModel } from '../../../models/video/video' 5import { VideoModel } from '../../../models/video/video'
6import { VideoAbuseModel } from '../../../models/video/video-abuse'
7import { VideoCommentModel } from '../../../models/video/video-comment' 6import { VideoCommentModel } from '../../../models/video/video-comment'
8import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
9import { broadcastToActors, broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils' 7import { broadcastToActors, broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
10import { audiencify, getActorsInvolvedInVideo, getAudience, getAudienceFromFollowersOf, getVideoCommentAudience } from '../audience' 8import { audiencify, getActorsInvolvedInVideo, getAudience, getAudienceFromFollowersOf, getVideoCommentAudience } from '../audience'
11import { logger } from '../../../helpers/logger' 9import { logger } from '../../../helpers/logger'
@@ -25,31 +23,14 @@ async function sendCreateVideo (video: VideoModel, t: Transaction) {
25 return broadcastToFollowers(createActivity, byActor, [ byActor ], t) 23 return broadcastToFollowers(createActivity, byActor, [ byActor ], t)
26} 24}
27 25
28async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) { 26async function sendCreateCacheFile (byActor: ActorModel, video: VideoModel, fileRedundancy: VideoRedundancyModel) {
29 if (!video.VideoChannel.Account.Actor.serverId) return // Local
30
31 const url = getVideoAbuseActivityPubUrl(videoAbuse)
32
33 logger.info('Creating job to send video abuse %s.', url)
34
35 // Custom audience, we only send the abuse to the origin instance
36 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
37 const createActivity = buildCreateActivity(url, byActor, videoAbuse.toActivityPubObject(), audience)
38
39 return unicastTo(createActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
40}
41
42async function sendCreateCacheFile (byActor: ActorModel, fileRedundancy: VideoRedundancyModel) {
43 logger.info('Creating job to send file cache of %s.', fileRedundancy.url) 27 logger.info('Creating job to send file cache of %s.', fileRedundancy.url)
44 28
45 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(fileRedundancy.VideoFile.Video.id)
46 const redundancyObject = fileRedundancy.toActivityPubObject()
47
48 return sendVideoRelatedCreateActivity({ 29 return sendVideoRelatedCreateActivity({
49 byActor, 30 byActor,
50 video, 31 video,
51 url: fileRedundancy.url, 32 url: fileRedundancy.url,
52 object: redundancyObject 33 object: fileRedundancy.toActivityPubObject()
53 }) 34 })
54} 35}
55 36
@@ -91,37 +72,6 @@ async function sendCreateVideoComment (comment: VideoCommentModel, t: Transactio
91 return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl) 72 return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl)
92} 73}
93 74
94async function sendCreateView (byActor: ActorModel, video: VideoModel, t: Transaction) {
95 logger.info('Creating job to send view of %s.', video.url)
96
97 const url = getVideoViewActivityPubUrl(byActor, video)
98 const viewActivity = buildViewActivity(byActor, video)
99
100 return sendVideoRelatedCreateActivity({
101 // Use the server actor to send the view
102 byActor,
103 video,
104 url,
105 object: viewActivity,
106 transaction: t
107 })
108}
109
110async function sendCreateDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
111 logger.info('Creating job to dislike %s.', video.url)
112
113 const url = getVideoDislikeActivityPubUrl(byActor, video)
114 const dislikeActivity = buildDislikeActivity(byActor, video)
115
116 return sendVideoRelatedCreateActivity({
117 byActor,
118 video,
119 url,
120 object: dislikeActivity,
121 transaction: t
122 })
123}
124
125function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate { 75function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate {
126 if (!audience) audience = getAudience(byActor) 76 if (!audience) audience = getAudience(byActor)
127 77
@@ -136,31 +86,11 @@ function buildCreateActivity (url: string, byActor: ActorModel, object: any, aud
136 ) 86 )
137} 87}
138 88
139function buildDislikeActivity (byActor: ActorModel, video: VideoModel) {
140 return {
141 type: 'Dislike',
142 actor: byActor.url,
143 object: video.url
144 }
145}
146
147function buildViewActivity (byActor: ActorModel, video: VideoModel) {
148 return {
149 type: 'View',
150 actor: byActor.url,
151 object: video.url
152 }
153}
154
155// --------------------------------------------------------------------------- 89// ---------------------------------------------------------------------------
156 90
157export { 91export {
158 sendCreateVideo, 92 sendCreateVideo,
159 sendVideoAbuse,
160 buildCreateActivity, 93 buildCreateActivity,
161 sendCreateView,
162 sendCreateDislike,
163 buildDislikeActivity,
164 sendCreateVideoComment, 94 sendCreateVideoComment,
165 sendCreateCacheFile 95 sendCreateCacheFile
166} 96}
diff --git a/server/lib/activitypub/send/send-dislike.ts b/server/lib/activitypub/send/send-dislike.ts
new file mode 100644
index 000000000..a88436f2c
--- /dev/null
+++ b/server/lib/activitypub/send/send-dislike.ts
@@ -0,0 +1,41 @@
1import { Transaction } from 'sequelize'
2import { ActorModel } from '../../../models/activitypub/actor'
3import { VideoModel } from '../../../models/video/video'
4import { getVideoDislikeActivityPubUrl } from '../url'
5import { logger } from '../../../helpers/logger'
6import { ActivityAudience, ActivityDislike } from '../../../../shared/models/activitypub'
7import { sendVideoRelatedActivity } from './utils'
8import { audiencify, getAudience } from '../audience'
9
10async function sendDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
11 logger.info('Creating job to dislike %s.', video.url)
12
13 const activityBuilder = (audience: ActivityAudience) => {
14 const url = getVideoDislikeActivityPubUrl(byActor, video)
15
16 return buildDislikeActivity(url, byActor, video, audience)
17 }
18
19 return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
20}
21
22function buildDislikeActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityDislike {
23 if (!audience) audience = getAudience(byActor)
24
25 return audiencify(
26 {
27 id: url,
28 type: 'Dislike' as 'Dislike',
29 actor: byActor.url,
30 object: video.url
31 },
32 audience
33 )
34}
35
36// ---------------------------------------------------------------------------
37
38export {
39 sendDislike,
40 buildDislikeActivity
41}
diff --git a/server/lib/activitypub/send/send-flag.ts b/server/lib/activitypub/send/send-flag.ts
new file mode 100644
index 000000000..96a7311b9
--- /dev/null
+++ b/server/lib/activitypub/send/send-flag.ts
@@ -0,0 +1,39 @@
1import { ActorModel } from '../../../models/activitypub/actor'
2import { VideoModel } from '../../../models/video/video'
3import { VideoAbuseModel } from '../../../models/video/video-abuse'
4import { getVideoAbuseActivityPubUrl } from '../url'
5import { unicastTo } from './utils'
6import { logger } from '../../../helpers/logger'
7import { ActivityAudience, ActivityFlag } from '../../../../shared/models/activitypub'
8import { audiencify, getAudience } from '../audience'
9
10async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) {
11 if (!video.VideoChannel.Account.Actor.serverId) return // Local user
12
13 const url = getVideoAbuseActivityPubUrl(videoAbuse)
14
15 logger.info('Creating job to send video abuse %s.', url)
16
17 // Custom audience, we only send the abuse to the origin instance
18 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
19 const flagActivity = buildFlagActivity(url, byActor, videoAbuse, audience)
20
21 return unicastTo(flagActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
22}
23
24function buildFlagActivity (url: string, byActor: ActorModel, videoAbuse: VideoAbuseModel, audience: ActivityAudience): ActivityFlag {
25 if (!audience) audience = getAudience(byActor)
26
27 const activity = Object.assign(
28 { id: url, actor: byActor.url },
29 videoAbuse.toActivityPubObject()
30 )
31
32 return audiencify(activity, audience)
33}
34
35// ---------------------------------------------------------------------------
36
37export {
38 sendVideoAbuse
39}
diff --git a/server/lib/activitypub/send/send-like.ts b/server/lib/activitypub/send/send-like.ts
index 89307acc6..35227887a 100644
--- a/server/lib/activitypub/send/send-like.ts
+++ b/server/lib/activitypub/send/send-like.ts
@@ -24,8 +24,8 @@ function buildLikeActivity (url: string, byActor: ActorModel, video: VideoModel,
24 24
25 return audiencify( 25 return audiencify(
26 { 26 {
27 type: 'Like' as 'Like',
28 id: url, 27 id: url,
28 type: 'Like' as 'Like',
29 actor: byActor.url, 29 actor: byActor.url,
30 object: video.url 30 object: video.url
31 }, 31 },
diff --git a/server/lib/activitypub/send/send-undo.ts b/server/lib/activitypub/send/send-undo.ts
index 5236d2cb3..ecbf605d6 100644
--- a/server/lib/activitypub/send/send-undo.ts
+++ b/server/lib/activitypub/send/send-undo.ts
@@ -2,7 +2,7 @@ import { Transaction } from 'sequelize'
2import { 2import {
3 ActivityAnnounce, 3 ActivityAnnounce,
4 ActivityAudience, 4 ActivityAudience,
5 ActivityCreate, 5 ActivityCreate, ActivityDislike,
6 ActivityFollow, 6 ActivityFollow,
7 ActivityLike, 7 ActivityLike,
8 ActivityUndo 8 ActivityUndo
@@ -13,13 +13,14 @@ import { VideoModel } from '../../../models/video/video'
13import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url' 13import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
14import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils' 14import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
15import { audiencify, getAudience } from '../audience' 15import { audiencify, getAudience } from '../audience'
16import { buildCreateActivity, buildDislikeActivity } from './send-create' 16import { buildCreateActivity } from './send-create'
17import { buildFollowActivity } from './send-follow' 17import { buildFollowActivity } from './send-follow'
18import { buildLikeActivity } from './send-like' 18import { buildLikeActivity } from './send-like'
19import { VideoShareModel } from '../../../models/video/video-share' 19import { VideoShareModel } from '../../../models/video/video-share'
20import { buildAnnounceWithVideoAudience } from './send-announce' 20import { buildAnnounceWithVideoAudience } from './send-announce'
21import { logger } from '../../../helpers/logger' 21import { logger } from '../../../helpers/logger'
22import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' 22import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
23import { buildDislikeActivity } from './send-dislike'
23 24
24async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) { 25async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
25 const me = actorFollow.ActorFollower 26 const me = actorFollow.ActorFollower
@@ -64,16 +65,16 @@ async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Trans
64 logger.info('Creating job to undo a dislike of video %s.', video.url) 65 logger.info('Creating job to undo a dislike of video %s.', video.url)
65 66
66 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video) 67 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
67 const dislikeActivity = buildDislikeActivity(byActor, video) 68 const dislikeActivity = buildDislikeActivity(dislikeUrl, byActor, video)
68 const createDislikeActivity = buildCreateActivity(dislikeUrl, byActor, dislikeActivity)
69 69
70 return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: createDislikeActivity, transaction: t }) 70 return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: dislikeActivity, transaction: t })
71} 71}
72 72
73async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) { 73async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) {
74 logger.info('Creating job to undo cache file %s.', redundancyModel.url) 74 logger.info('Creating job to undo cache file %s.', redundancyModel.url)
75 75
76 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id) 76 const videoId = redundancyModel.getVideo().id
77 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
77 const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject()) 78 const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject())
78 79
79 return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t }) 80 return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t })
@@ -94,7 +95,7 @@ export {
94function undoActivityData ( 95function undoActivityData (
95 url: string, 96 url: string,
96 byActor: ActorModel, 97 byActor: ActorModel,
97 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce, 98 object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
98 audience?: ActivityAudience 99 audience?: ActivityAudience
99): ActivityUndo { 100): ActivityUndo {
100 if (!audience) audience = getAudience(byActor) 101 if (!audience) audience = getAudience(byActor)
@@ -114,7 +115,7 @@ async function sendUndoVideoRelatedActivity (options: {
114 byActor: ActorModel, 115 byActor: ActorModel,
115 video: VideoModel, 116 video: VideoModel,
116 url: string, 117 url: string,
117 activity: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce, 118 activity: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
118 transaction: Transaction 119 transaction: Transaction
119}) { 120}) {
120 const activityBuilder = (audience: ActivityAudience) => { 121 const activityBuilder = (audience: ActivityAudience) => {
diff --git a/server/lib/activitypub/send/send-update.ts b/server/lib/activitypub/send/send-update.ts
index a68f03edf..839f66470 100644
--- a/server/lib/activitypub/send/send-update.ts
+++ b/server/lib/activitypub/send/send-update.ts
@@ -61,7 +61,7 @@ async function sendUpdateActor (accountOrChannel: AccountModel | VideoChannelMod
61async function sendUpdateCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel) { 61async function sendUpdateCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel) {
62 logger.info('Creating job to update cache file %s.', redundancyModel.url) 62 logger.info('Creating job to update cache file %s.', redundancyModel.url)
63 63
64 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id) 64 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.getVideo().id)
65 65
66 const activityBuilder = (audience: ActivityAudience) => { 66 const activityBuilder = (audience: ActivityAudience) => {
67 const redundancyObject = redundancyModel.toActivityPubObject() 67 const redundancyObject = redundancyModel.toActivityPubObject()
diff --git a/server/lib/activitypub/send/send-view.ts b/server/lib/activitypub/send/send-view.ts
new file mode 100644
index 000000000..8ad126be0
--- /dev/null
+++ b/server/lib/activitypub/send/send-view.ts
@@ -0,0 +1,40 @@
1import { Transaction } from 'sequelize'
2import { ActivityAudience, ActivityView } from '../../../../shared/models/activitypub'
3import { ActorModel } from '../../../models/activitypub/actor'
4import { VideoModel } from '../../../models/video/video'
5import { getVideoLikeActivityPubUrl } from '../url'
6import { sendVideoRelatedActivity } from './utils'
7import { audiencify, getAudience } from '../audience'
8import { logger } from '../../../helpers/logger'
9
10async function sendView (byActor: ActorModel, video: VideoModel, t: Transaction) {
11 logger.info('Creating job to send view of %s.', video.url)
12
13 const activityBuilder = (audience: ActivityAudience) => {
14 const url = getVideoLikeActivityPubUrl(byActor, video)
15
16 return buildViewActivity(url, byActor, video, audience)
17 }
18
19 return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
20}
21
22function buildViewActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityView {
23 if (!audience) audience = getAudience(byActor)
24
25 return audiencify(
26 {
27 id: url,
28 type: 'View' as 'View',
29 actor: byActor.url,
30 object: video.url
31 },
32 audience
33 )
34}
35
36// ---------------------------------------------------------------------------
37
38export {
39 sendView
40}
diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts
index 3ff60a97c..1767df0ae 100644
--- a/server/lib/activitypub/share.ts
+++ b/server/lib/activitypub/share.ts
@@ -4,13 +4,14 @@ import { getServerActor } from '../../helpers/utils'
4import { VideoModel } from '../../models/video/video' 4import { VideoModel } from '../../models/video/video'
5import { VideoShareModel } from '../../models/video/video-share' 5import { VideoShareModel } from '../../models/video/video-share'
6import { sendUndoAnnounce, sendVideoAnnounce } from './send' 6import { sendUndoAnnounce, sendVideoAnnounce } from './send'
7import { getAnnounceActivityPubUrl } from './url' 7import { getVideoAnnounceActivityPubUrl } from './url'
8import { VideoChannelModel } from '../../models/video/video-channel' 8import { VideoChannelModel } from '../../models/video/video-channel'
9import * as Bluebird from 'bluebird' 9import * as Bluebird from 'bluebird'
10import { doRequest } from '../../helpers/requests' 10import { doRequest } from '../../helpers/requests'
11import { getOrCreateActorAndServerAndModel } from './actor' 11import { getOrCreateActorAndServerAndModel } from './actor'
12import { logger } from '../../helpers/logger' 12import { logger } from '../../helpers/logger'
13import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' 13import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
14import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
14 15
15async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) { 16async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) {
16 if (video.privacy === VideoPrivacy.PRIVATE) return undefined 17 if (video.privacy === VideoPrivacy.PRIVATE) return undefined
@@ -38,9 +39,13 @@ async function addVideoShares (shareUrls: string[], instance: VideoModel) {
38 json: true, 39 json: true,
39 activityPub: true 40 activityPub: true
40 }) 41 })
41 if (!body || !body.actor) throw new Error('Body of body actor is invalid') 42 if (!body || !body.actor) throw new Error('Body or body actor is invalid')
43
44 const actorUrl = getAPId(body.actor)
45 if (checkUrlsSameHost(shareUrl, actorUrl) !== true) {
46 throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`)
47 }
42 48
43 const actorUrl = body.actor
44 const actor = await getOrCreateActorAndServerAndModel(actorUrl) 49 const actor = await getOrCreateActorAndServerAndModel(actorUrl)
45 50
46 const entry = { 51 const entry = {
@@ -72,8 +77,8 @@ export {
72async function shareByServer (video: VideoModel, t: Transaction) { 77async function shareByServer (video: VideoModel, t: Transaction) {
73 const serverActor = await getServerActor() 78 const serverActor = await getServerActor()
74 79
75 const serverShareUrl = getAnnounceActivityPubUrl(video.url, serverActor) 80 const serverShareUrl = getVideoAnnounceActivityPubUrl(serverActor, video)
76 return VideoShareModel.findOrCreate({ 81 const [ serverShare ] = await VideoShareModel.findOrCreate({
77 defaults: { 82 defaults: {
78 actorId: serverActor.id, 83 actorId: serverActor.id,
79 videoId: video.id, 84 videoId: video.id,
@@ -83,16 +88,14 @@ async function shareByServer (video: VideoModel, t: Transaction) {
83 url: serverShareUrl 88 url: serverShareUrl
84 }, 89 },
85 transaction: t 90 transaction: t
86 }).then(([ serverShare, created ]) => {
87 if (created) return sendVideoAnnounce(serverActor, serverShare, video, t)
88
89 return undefined
90 }) 91 })
92
93 return sendVideoAnnounce(serverActor, serverShare, video, t)
91} 94}
92 95
93async function shareByVideoChannel (video: VideoModel, t: Transaction) { 96async function shareByVideoChannel (video: VideoModel, t: Transaction) {
94 const videoChannelShareUrl = getAnnounceActivityPubUrl(video.url, video.VideoChannel.Actor) 97 const videoChannelShareUrl = getVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video)
95 return VideoShareModel.findOrCreate({ 98 const [ videoChannelShare ] = await VideoShareModel.findOrCreate({
96 defaults: { 99 defaults: {
97 actorId: video.VideoChannel.actorId, 100 actorId: video.VideoChannel.actorId,
98 videoId: video.id, 101 videoId: video.id,
@@ -102,11 +105,9 @@ async function shareByVideoChannel (video: VideoModel, t: Transaction) {
102 url: videoChannelShareUrl 105 url: videoChannelShareUrl
103 }, 106 },
104 transaction: t 107 transaction: t
105 }).then(([ videoChannelShare, created ]) => {
106 if (created) return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
107
108 return undefined
109 }) 108 })
109
110 return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
110} 111}
111 112
112async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) { 113async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) {
diff --git a/server/lib/activitypub/url.ts b/server/lib/activitypub/url.ts
index e792be698..4229fe094 100644
--- a/server/lib/activitypub/url.ts
+++ b/server/lib/activitypub/url.ts
@@ -5,6 +5,8 @@ import { VideoModel } from '../../models/video/video'
5import { VideoAbuseModel } from '../../models/video/video-abuse' 5import { VideoAbuseModel } from '../../models/video/video-abuse'
6import { VideoCommentModel } from '../../models/video/video-comment' 6import { VideoCommentModel } from '../../models/video/video-comment'
7import { VideoFileModel } from '../../models/video/video-file' 7import { VideoFileModel } from '../../models/video/video-file'
8import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
9import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
8 10
9function getVideoActivityPubUrl (video: VideoModel) { 11function getVideoActivityPubUrl (video: VideoModel) {
10 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid 12 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid
@@ -16,6 +18,10 @@ function getVideoCacheFileActivityPubUrl (videoFile: VideoFileModel) {
16 return `${CONFIG.WEBSERVER.URL}/redundancy/videos/${videoFile.Video.uuid}/${videoFile.resolution}${suffixFPS}` 18 return `${CONFIG.WEBSERVER.URL}/redundancy/videos/${videoFile.Video.uuid}/${videoFile.resolution}${suffixFPS}`
17} 19}
18 20
21function getVideoCacheStreamingPlaylistActivityPubUrl (video: VideoModel, playlist: VideoStreamingPlaylistModel) {
22 return `${CONFIG.WEBSERVER.URL}/redundancy/video-playlists/${playlist.getStringType()}/${video.uuid}`
23}
24
19function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) { 25function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) {
20 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '/comments/' + videoComment.id 26 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '/comments/' + videoComment.id
21} 27}
@@ -33,14 +39,14 @@ function getVideoAbuseActivityPubUrl (videoAbuse: VideoAbuseModel) {
33} 39}
34 40
35function getVideoViewActivityPubUrl (byActor: ActorModel, video: VideoModel) { 41function getVideoViewActivityPubUrl (byActor: ActorModel, video: VideoModel) {
36 return video.url + '/views/' + byActor.uuid + '/' + new Date().toISOString() 42 return byActor.url + '/views/videos/' + video.id + '/' + new Date().toISOString()
37} 43}
38 44
39function getVideoLikeActivityPubUrl (byActor: ActorModel, video: VideoModel) { 45function getVideoLikeActivityPubUrl (byActor: ActorModel, video: VideoModel | { id: number }) {
40 return byActor.url + '/likes/' + video.id 46 return byActor.url + '/likes/' + video.id
41} 47}
42 48
43function getVideoDislikeActivityPubUrl (byActor: ActorModel, video: VideoModel) { 49function getVideoDislikeActivityPubUrl (byActor: ActorModel, video: VideoModel | { id: number }) {
44 return byActor.url + '/dislikes/' + video.id 50 return byActor.url + '/dislikes/' + video.id
45} 51}
46 52
@@ -74,8 +80,8 @@ function getActorFollowAcceptActivityPubUrl (actorFollow: ActorFollowModel) {
74 return follower.url + '/accepts/follows/' + me.id 80 return follower.url + '/accepts/follows/' + me.id
75} 81}
76 82
77function getAnnounceActivityPubUrl (originalUrl: string, byActor: ActorModel) { 83function getVideoAnnounceActivityPubUrl (byActor: ActorModel, video: VideoModel) {
78 return originalUrl + '/announces/' + byActor.id 84 return video.url + '/announces/' + byActor.id
79} 85}
80 86
81function getDeleteActivityPubUrl (originalUrl: string) { 87function getDeleteActivityPubUrl (originalUrl: string) {
@@ -92,12 +98,13 @@ function getUndoActivityPubUrl (originalUrl: string) {
92 98
93export { 99export {
94 getVideoActivityPubUrl, 100 getVideoActivityPubUrl,
101 getVideoCacheStreamingPlaylistActivityPubUrl,
95 getVideoChannelActivityPubUrl, 102 getVideoChannelActivityPubUrl,
96 getAccountActivityPubUrl, 103 getAccountActivityPubUrl,
97 getVideoAbuseActivityPubUrl, 104 getVideoAbuseActivityPubUrl,
98 getActorFollowActivityPubUrl, 105 getActorFollowActivityPubUrl,
99 getActorFollowAcceptActivityPubUrl, 106 getActorFollowAcceptActivityPubUrl,
100 getAnnounceActivityPubUrl, 107 getVideoAnnounceActivityPubUrl,
101 getUpdateActivityPubUrl, 108 getUpdateActivityPubUrl,
102 getUndoActivityPubUrl, 109 getUndoActivityPubUrl,
103 getVideoViewActivityPubUrl, 110 getVideoViewActivityPubUrl,
diff --git a/server/lib/activitypub/video-comments.ts b/server/lib/activitypub/video-comments.ts
index c8c17f4c4..e87301fe7 100644
--- a/server/lib/activitypub/video-comments.ts
+++ b/server/lib/activitypub/video-comments.ts
@@ -9,6 +9,7 @@ import { VideoCommentModel } from '../../models/video/video-comment'
9import { getOrCreateActorAndServerAndModel } from './actor' 9import { getOrCreateActorAndServerAndModel } from './actor'
10import { getOrCreateVideoAndAccountAndChannel } from './videos' 10import { getOrCreateVideoAndAccountAndChannel } from './videos'
11import * as Bluebird from 'bluebird' 11import * as Bluebird from 'bluebird'
12import { checkUrlsSameHost } from '../../helpers/activitypub'
12 13
13async function videoCommentActivityObjectToDBAttributes (video: VideoModel, actor: ActorModel, comment: VideoCommentObject) { 14async function videoCommentActivityObjectToDBAttributes (video: VideoModel, actor: ActorModel, comment: VideoCommentObject) {
14 let originCommentId: number = null 15 let originCommentId: number = null
@@ -61,7 +62,15 @@ async function addVideoComment (videoInstance: VideoModel, commentUrl: string) {
61 const actorUrl = body.attributedTo 62 const actorUrl = body.attributedTo
62 if (!actorUrl) return { created: false } 63 if (!actorUrl) return { created: false }
63 64
64 const actor = await getOrCreateActorAndServerAndModel(actorUrl) 65 if (checkUrlsSameHost(commentUrl, actorUrl) !== true) {
66 throw new Error(`Actor url ${actorUrl} has not the same host than the comment url ${commentUrl}`)
67 }
68
69 if (checkUrlsSameHost(body.id, commentUrl) !== true) {
70 throw new Error(`Comment url ${commentUrl} host is different from the AP object id ${body.id}`)
71 }
72
73 const actor = await getOrCreateActorAndServerAndModel(actorUrl, 'all')
65 const entry = await videoCommentActivityObjectToDBAttributes(videoInstance, actor, body) 74 const entry = await videoCommentActivityObjectToDBAttributes(videoInstance, actor, body)
66 if (!entry) return { created: false } 75 if (!entry) return { created: false }
67 76
@@ -71,6 +80,8 @@ async function addVideoComment (videoInstance: VideoModel, commentUrl: string) {
71 }, 80 },
72 defaults: entry 81 defaults: entry
73 }) 82 })
83 comment.Account = actor.Account
84 comment.Video = videoInstance
74 85
75 return { comment, created } 86 return { comment, created }
76} 87}
@@ -134,6 +145,14 @@ async function resolveThread (url: string, comments: VideoCommentModel[] = []) {
134 const actorUrl = body.attributedTo 145 const actorUrl = body.attributedTo
135 if (!actorUrl) throw new Error('Miss attributed to in comment') 146 if (!actorUrl) throw new Error('Miss attributed to in comment')
136 147
148 if (checkUrlsSameHost(url, actorUrl) !== true) {
149 throw new Error(`Actor url ${actorUrl} has not the same host than the comment url ${url}`)
150 }
151
152 if (checkUrlsSameHost(body.id, url) !== true) {
153 throw new Error(`Comment url ${url} host is different from the AP object id ${body.id}`)
154 }
155
137 const actor = await getOrCreateActorAndServerAndModel(actorUrl) 156 const actor = await getOrCreateActorAndServerAndModel(actorUrl)
138 const comment = new VideoCommentModel({ 157 const comment = new VideoCommentModel({
139 url: body.id, 158 url: body.id,
diff --git a/server/lib/activitypub/video-rates.ts b/server/lib/activitypub/video-rates.ts
index 1619251c3..7aac79118 100644
--- a/server/lib/activitypub/video-rates.ts
+++ b/server/lib/activitypub/video-rates.ts
@@ -1,20 +1,43 @@
1import { Transaction } from 'sequelize' 1import { Transaction } from 'sequelize'
2import { AccountModel } from '../../models/account/account' 2import { AccountModel } from '../../models/account/account'
3import { VideoModel } from '../../models/video/video' 3import { VideoModel } from '../../models/video/video'
4import { sendCreateDislike, sendLike, sendUndoDislike, sendUndoLike } from './send' 4import { sendLike, sendUndoDislike, sendUndoLike } from './send'
5import { VideoRateType } from '../../../shared/models/videos' 5import { VideoRateType } from '../../../shared/models/videos'
6import * as Bluebird from 'bluebird' 6import * as Bluebird from 'bluebird'
7import { getOrCreateActorAndServerAndModel } from './actor' 7import { getOrCreateActorAndServerAndModel } from './actor'
8import { AccountVideoRateModel } from '../../models/account/account-video-rate' 8import { AccountVideoRateModel } from '../../models/account/account-video-rate'
9import { logger } from '../../helpers/logger' 9import { logger } from '../../helpers/logger'
10import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' 10import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
11import { doRequest } from '../../helpers/requests'
12import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
13import { ActorModel } from '../../models/activitypub/actor'
14import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from './url'
15import { sendDislike } from './send/send-dislike'
11 16
12async function createRates (actorUrls: string[], video: VideoModel, rate: VideoRateType) { 17async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRateType) {
13 let rateCounts = 0 18 let rateCounts = 0
14 19
15 await Bluebird.map(actorUrls, async actorUrl => { 20 await Bluebird.map(ratesUrl, async rateUrl => {
16 try { 21 try {
22 // Fetch url
23 const { body } = await doRequest({
24 uri: rateUrl,
25 json: true,
26 activityPub: true
27 })
28 if (!body || !body.actor) throw new Error('Body or body actor is invalid')
29
30 const actorUrl = getAPId(body.actor)
31 if (checkUrlsSameHost(actorUrl, rateUrl) !== true) {
32 throw new Error(`Rate url ${rateUrl} has not the same host than actor url ${actorUrl}`)
33 }
34
35 if (checkUrlsSameHost(body.id, rateUrl) !== true) {
36 throw new Error(`Rate url ${rateUrl} host is different from the AP object id ${body.id}`)
37 }
38
17 const actor = await getOrCreateActorAndServerAndModel(actorUrl) 39 const actor = await getOrCreateActorAndServerAndModel(actorUrl)
40
18 const [ , created ] = await AccountVideoRateModel 41 const [ , created ] = await AccountVideoRateModel
19 .findOrCreate({ 42 .findOrCreate({
20 where: { 43 where: {
@@ -24,13 +47,14 @@ async function createRates (actorUrls: string[], video: VideoModel, rate: VideoR
24 defaults: { 47 defaults: {
25 videoId: video.id, 48 videoId: video.id,
26 accountId: actor.Account.id, 49 accountId: actor.Account.id,
27 type: rate 50 type: rate,
51 url: body.id
28 } 52 }
29 }) 53 })
30 54
31 if (created) rateCounts += 1 55 if (created) rateCounts += 1
32 } catch (err) { 56 } catch (err) {
33 logger.warn('Cannot add rate %s for actor %s.', rate, actorUrl, { err }) 57 logger.warn('Cannot add rate %s.', rateUrl, { err })
34 } 58 }
35 }, { concurrency: CRAWL_REQUEST_CONCURRENCY }) 59 }, { concurrency: CRAWL_REQUEST_CONCURRENCY })
36 60
@@ -59,10 +83,15 @@ async function sendVideoRateChange (account: AccountModel,
59 // Like 83 // Like
60 if (likes > 0) await sendLike(actor, video, t) 84 if (likes > 0) await sendLike(actor, video, t)
61 // Dislike 85 // Dislike
62 if (dislikes > 0) await sendCreateDislike(actor, video, t) 86 if (dislikes > 0) await sendDislike(actor, video, t)
87}
88
89function getRateUrl (rateType: VideoRateType, actor: ActorModel, video: VideoModel) {
90 return rateType === 'like' ? getVideoLikeActivityPubUrl(actor, video) : getVideoDislikeActivityPubUrl(actor, video)
63} 91}
64 92
65export { 93export {
94 getRateUrl,
66 createRates, 95 createRates,
67 sendVideoRateChange 96 sendVideoRateChange
68} 97}
diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts
index 8521572a1..710929aac 100644
--- a/server/lib/activitypub/videos.ts
+++ b/server/lib/activitypub/videos.ts
@@ -1,17 +1,23 @@
1import * as Bluebird from 'bluebird' 1import * as Bluebird from 'bluebird'
2import * as sequelize from 'sequelize' 2import * as sequelize from 'sequelize'
3import * as magnetUtil from 'magnet-uri' 3import * as magnetUtil from 'magnet-uri'
4import { join } from 'path'
5import * as request from 'request' 4import * as request from 'request'
6import { ActivityIconObject, ActivityUrlObject, ActivityVideoUrlObject, VideoState } from '../../../shared/index' 5import {
6 ActivityIconObject,
7 ActivityPlaylistSegmentHashesObject,
8 ActivityPlaylistUrlObject,
9 ActivityUrlObject,
10 ActivityVideoUrlObject,
11 VideoState
12} from '../../../shared/index'
7import { VideoTorrentObject } from '../../../shared/models/activitypub/objects' 13import { VideoTorrentObject } from '../../../shared/models/activitypub/objects'
8import { VideoPrivacy } from '../../../shared/models/videos' 14import { VideoPrivacy } from '../../../shared/models/videos'
9import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos' 15import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos'
10import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos' 16import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
11import { resetSequelizeInstance, retryTransactionWrapper } from '../../helpers/database-utils' 17import { resetSequelizeInstance, retryTransactionWrapper } from '../../helpers/database-utils'
12import { logger } from '../../helpers/logger' 18import { logger } from '../../helpers/logger'
13import { doRequest, doRequestAndSaveToFile } from '../../helpers/requests' 19import { doRequest, downloadImage } from '../../helpers/requests'
14import { ACTIVITY_PUB, CONFIG, REMOTE_SCHEME, sequelizeTypescript, VIDEO_MIMETYPE_EXT } from '../../initializers' 20import { ACTIVITY_PUB, CONFIG, MIMETYPES, REMOTE_SCHEME, sequelizeTypescript, THUMBNAILS_SIZE } from '../../initializers'
15import { ActorModel } from '../../models/activitypub/actor' 21import { ActorModel } from '../../models/activitypub/actor'
16import { TagModel } from '../../models/video/tag' 22import { TagModel } from '../../models/video/tag'
17import { VideoModel } from '../../models/video/video' 23import { VideoModel } from '../../models/video/video'
@@ -29,6 +35,11 @@ import { createRates } from './video-rates'
29import { addVideoShares, shareVideoByServerAndChannel } from './share' 35import { addVideoShares, shareVideoByServerAndChannel } from './share'
30import { AccountModel } from '../../models/account/account' 36import { AccountModel } from '../../models/account/account'
31import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video' 37import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video'
38import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
39import { Notifier } from '../notifier'
40import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
41import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
42import { FilteredModelAttributes } from 'sequelize-typescript/lib/models/Model'
32 43
33async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) { 44async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) {
34 // If the video is not private and published, we federate it 45 // If the video is not private and published, we federate it
@@ -63,7 +74,7 @@ async function fetchRemoteVideo (videoUrl: string): Promise<{ response: request.
63 74
64 const { response, body } = await doRequest(options) 75 const { response, body } = await doRequest(options)
65 76
66 if (sanitizeAndCheckVideoTorrentObject(body) === false) { 77 if (sanitizeAndCheckVideoTorrentObject(body) === false || checkUrlsSameHost(body.id, videoUrl) !== true) {
67 logger.debug('Remote video JSON is not valid.', { body }) 78 logger.debug('Remote video JSON is not valid.', { body })
68 return { response, videoObject: undefined } 79 return { response, videoObject: undefined }
69 } 80 }
@@ -94,19 +105,18 @@ function fetchRemoteVideoStaticFile (video: VideoModel, path: string, reject: Fu
94 105
95function generateThumbnailFromUrl (video: VideoModel, icon: ActivityIconObject) { 106function generateThumbnailFromUrl (video: VideoModel, icon: ActivityIconObject) {
96 const thumbnailName = video.getThumbnailName() 107 const thumbnailName = video.getThumbnailName()
97 const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName)
98 108
99 const options = { 109 return downloadImage(icon.url, CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName, THUMBNAILS_SIZE)
100 method: 'GET',
101 uri: icon.url
102 }
103 return doRequestAndSaveToFile(options, thumbnailPath)
104} 110}
105 111
106function getOrCreateVideoChannelFromVideoObject (videoObject: VideoTorrentObject) { 112function getOrCreateVideoChannelFromVideoObject (videoObject: VideoTorrentObject) {
107 const channel = videoObject.attributedTo.find(a => a.type === 'Group') 113 const channel = videoObject.attributedTo.find(a => a.type === 'Group')
108 if (!channel) throw new Error('Cannot find associated video channel to video ' + videoObject.url) 114 if (!channel) throw new Error('Cannot find associated video channel to video ' + videoObject.url)
109 115
116 if (checkUrlsSameHost(channel.id, videoObject.id) !== true) {
117 throw new Error(`Video channel url ${channel.id} does not have the same host than video object id ${videoObject.id}`)
118 }
119
110 return getOrCreateActorAndServerAndModel(channel.id, 'all') 120 return getOrCreateActorAndServerAndModel(channel.id, 'all')
111} 121}
112 122
@@ -116,7 +126,7 @@ type SyncParam = {
116 shares: boolean 126 shares: boolean
117 comments: boolean 127 comments: boolean
118 thumbnail: boolean 128 thumbnail: boolean
119 refreshVideo: boolean 129 refreshVideo?: boolean
120} 130}
121async function syncVideoExternalAttributes (video: VideoModel, fetchedVideo: VideoTorrentObject, syncParam: SyncParam) { 131async function syncVideoExternalAttributes (video: VideoModel, fetchedVideo: VideoTorrentObject, syncParam: SyncParam) {
122 logger.info('Adding likes/dislikes/shares/comments of video %s.', video.uuid) 132 logger.info('Adding likes/dislikes/shares/comments of video %s.', video.uuid)
@@ -155,31 +165,34 @@ async function syncVideoExternalAttributes (video: VideoModel, fetchedVideo: Vid
155} 165}
156 166
157async function getOrCreateVideoAndAccountAndChannel (options: { 167async function getOrCreateVideoAndAccountAndChannel (options: {
158 videoObject: VideoTorrentObject | string, 168 videoObject: { id: string } | string,
159 syncParam?: SyncParam, 169 syncParam?: SyncParam,
160 fetchType?: VideoFetchByUrlType, 170 fetchType?: VideoFetchByUrlType,
161 refreshViews?: boolean 171 allowRefresh?: boolean // true by default
162}) { 172}) {
163 // Default params 173 // Default params
164 const syncParam = options.syncParam || { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true, refreshVideo: false } 174 const syncParam = options.syncParam || { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true, refreshVideo: false }
165 const fetchType = options.fetchType || 'all' 175 const fetchType = options.fetchType || 'all'
166 const refreshViews = options.refreshViews || false 176 const allowRefresh = options.allowRefresh !== false
167 177
168 // Get video url 178 // Get video url
169 const videoUrl = typeof options.videoObject === 'string' ? options.videoObject : options.videoObject.id 179 const videoUrl = getAPId(options.videoObject)
170 180
171 let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType) 181 let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType)
172 if (videoFromDatabase) { 182 if (videoFromDatabase) {
173 const refreshOptions = { 183
174 video: videoFromDatabase, 184 if (allowRefresh === true) {
175 fetchedType: fetchType, 185 const refreshOptions = {
176 syncParam, 186 video: videoFromDatabase,
177 refreshViews 187 fetchedType: fetchType,
188 syncParam
189 }
190
191 if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions)
192 else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: videoFromDatabase.url } })
178 } 193 }
179 const p = refreshVideoIfNeeded(refreshOptions)
180 if (syncParam.refreshVideo === true) videoFromDatabase = await p
181 194
182 return { video: videoFromDatabase } 195 return { video: videoFromDatabase, created: false }
183 } 196 }
184 197
185 const { videoObject: fetchedVideo } = await fetchRemoteVideo(videoUrl) 198 const { videoObject: fetchedVideo } = await fetchRemoteVideo(videoUrl)
@@ -190,7 +203,7 @@ async function getOrCreateVideoAndAccountAndChannel (options: {
190 203
191 await syncVideoExternalAttributes(video, fetchedVideo, syncParam) 204 await syncVideoExternalAttributes(video, fetchedVideo, syncParam)
192 205
193 return { video } 206 return { video, created: true }
194} 207}
195 208
196async function updateVideoFromAP (options: { 209async function updateVideoFromAP (options: {
@@ -198,17 +211,17 @@ async function updateVideoFromAP (options: {
198 videoObject: VideoTorrentObject, 211 videoObject: VideoTorrentObject,
199 account: AccountModel, 212 account: AccountModel,
200 channel: VideoChannelModel, 213 channel: VideoChannelModel,
201 updateViews: boolean,
202 overrideTo?: string[] 214 overrideTo?: string[]
203}) { 215}) {
204 logger.debug('Updating remote video "%s".', options.videoObject.uuid) 216 logger.debug('Updating remote video "%s".', options.videoObject.uuid)
217
205 let videoFieldsSave: any 218 let videoFieldsSave: any
219 const wasPrivateVideo = options.video.privacy === VideoPrivacy.PRIVATE
220 const wasUnlistedVideo = options.video.privacy === VideoPrivacy.UNLISTED
206 221
207 try { 222 try {
208 await sequelizeTypescript.transaction(async t => { 223 await sequelizeTypescript.transaction(async t => {
209 const sequelizeOptions = { 224 const sequelizeOptions = { transaction: t }
210 transaction: t
211 }
212 225
213 videoFieldsSave = options.video.toJSON() 226 videoFieldsSave = options.video.toJSON()
214 227
@@ -238,14 +251,10 @@ async function updateVideoFromAP (options: {
238 options.video.set('publishedAt', videoData.publishedAt) 251 options.video.set('publishedAt', videoData.publishedAt)
239 options.video.set('privacy', videoData.privacy) 252 options.video.set('privacy', videoData.privacy)
240 options.video.set('channelId', videoData.channelId) 253 options.video.set('channelId', videoData.channelId)
254 options.video.set('views', videoData.views)
241 255
242 if (options.updateViews === true) options.video.set('views', videoData.views)
243 await options.video.save(sequelizeOptions) 256 await options.video.save(sequelizeOptions)
244 257
245 // Don't block on request
246 generateThumbnailFromUrl(options.video, options.videoObject.icon)
247 .catch(err => logger.warn('Cannot generate thumbnail of %s.', options.videoObject.id, { err }))
248
249 { 258 {
250 const videoFileAttributes = videoFileActivityUrlToDBAttributes(options.video, options.videoObject) 259 const videoFileAttributes = videoFileActivityUrlToDBAttributes(options.video, options.videoObject)
251 const newVideoFiles = videoFileAttributes.map(a => new VideoFileModel(a)) 260 const newVideoFiles = videoFileAttributes.map(a => new VideoFileModel(a))
@@ -266,6 +275,25 @@ async function updateVideoFromAP (options: {
266 } 275 }
267 276
268 { 277 {
278 const streamingPlaylistAttributes = streamingPlaylistActivityUrlToDBAttributes(options.video, options.videoObject)
279 const newStreamingPlaylists = streamingPlaylistAttributes.map(a => new VideoStreamingPlaylistModel(a))
280
281 // Remove video files that do not exist anymore
282 const destroyTasks = options.video.VideoStreamingPlaylists
283 .filter(f => !newStreamingPlaylists.find(newPlaylist => newPlaylist.hasSameUniqueKeysThan(f)))
284 .map(f => f.destroy(sequelizeOptions))
285 await Promise.all(destroyTasks)
286
287 // Update or add other one
288 const upsertTasks = streamingPlaylistAttributes.map(a => {
289 return VideoStreamingPlaylistModel.upsert<VideoStreamingPlaylistModel>(a, { returning: true, transaction: t })
290 .then(([ streamingPlaylist ]) => streamingPlaylist)
291 })
292
293 options.video.VideoStreamingPlaylists = await Promise.all(upsertTasks)
294 }
295
296 {
269 // Update Tags 297 // Update Tags
270 const tags = options.videoObject.tag.map(tag => tag.name) 298 const tags = options.videoObject.tag.map(tag => tag.name)
271 const tagInstances = await TagModel.findOrCreateTags(tags, t) 299 const tagInstances = await TagModel.findOrCreateTags(tags, t)
@@ -283,6 +311,11 @@ async function updateVideoFromAP (options: {
283 } 311 }
284 }) 312 })
285 313
314 // Notify our users?
315 if (wasPrivateVideo || wasUnlistedVideo) {
316 Notifier.Instance.notifyOnNewVideo(options.video)
317 }
318
286 logger.info('Remote video with uuid %s updated', options.videoObject.uuid) 319 logger.info('Remote video with uuid %s updated', options.videoObject.uuid)
287 } catch (err) { 320 } catch (err) {
288 if (options.video !== undefined && videoFieldsSave !== undefined) { 321 if (options.video !== undefined && videoFieldsSave !== undefined) {
@@ -293,10 +326,66 @@ async function updateVideoFromAP (options: {
293 logger.debug('Cannot update the remote video.', { err }) 326 logger.debug('Cannot update the remote video.', { err })
294 throw err 327 throw err
295 } 328 }
329
330 try {
331 await generateThumbnailFromUrl(options.video, options.videoObject.icon)
332 } catch (err) {
333 logger.warn('Cannot generate thumbnail of %s.', options.videoObject.id, { err })
334 }
335}
336
337async function refreshVideoIfNeeded (options: {
338 video: VideoModel,
339 fetchedType: VideoFetchByUrlType,
340 syncParam: SyncParam
341}): Promise<VideoModel> {
342 if (!options.video.isOutdated()) return options.video
343
344 // We need more attributes if the argument video was fetched with not enough joints
345 const video = options.fetchedType === 'all' ? options.video : await VideoModel.loadByUrlAndPopulateAccount(options.video.url)
346
347 try {
348 const { response, videoObject } = await fetchRemoteVideo(video.url)
349 if (response.statusCode === 404) {
350 logger.info('Cannot refresh remote video %s: video does not exist anymore. Deleting it.', video.url)
351
352 // Video does not exist anymore
353 await video.destroy()
354 return undefined
355 }
356
357 if (videoObject === undefined) {
358 logger.warn('Cannot refresh remote video %s: invalid body.', video.url)
359
360 await video.setAsRefreshed()
361 return video
362 }
363
364 const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject)
365 const account = await AccountModel.load(channelActor.VideoChannel.accountId)
366
367 const updateOptions = {
368 video,
369 videoObject,
370 account,
371 channel: channelActor.VideoChannel
372 }
373 await retryTransactionWrapper(updateVideoFromAP, updateOptions)
374 await syncVideoExternalAttributes(video, videoObject, options.syncParam)
375
376 return video
377 } catch (err) {
378 logger.warn('Cannot refresh video %s.', options.video.url, { err })
379
380 // Don't refresh in loop
381 await video.setAsRefreshed()
382 return video
383 }
296} 384}
297 385
298export { 386export {
299 updateVideoFromAP, 387 updateVideoFromAP,
388 refreshVideoIfNeeded,
300 federateVideoIfNeeded, 389 federateVideoIfNeeded,
301 fetchRemoteVideo, 390 fetchRemoteVideo,
302 getOrCreateVideoAndAccountAndChannel, 391 getOrCreateVideoAndAccountAndChannel,
@@ -308,10 +397,23 @@ export {
308 397
309// --------------------------------------------------------------------------- 398// ---------------------------------------------------------------------------
310 399
311function isActivityVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject { 400function isAPVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject {
312 const mimeTypes = Object.keys(VIDEO_MIMETYPE_EXT) 401 const mimeTypes = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
313 402
314 return mimeTypes.indexOf(url.mimeType) !== -1 && url.mimeType.startsWith('video/') 403 const urlMediaType = url.mediaType || url.mimeType
404 return mimeTypes.indexOf(urlMediaType) !== -1 && urlMediaType.startsWith('video/')
405}
406
407function isAPStreamingPlaylistUrlObject (url: ActivityUrlObject): url is ActivityPlaylistUrlObject {
408 const urlMediaType = url.mediaType || url.mimeType
409
410 return urlMediaType === 'application/x-mpegURL'
411}
412
413function isAPPlaylistSegmentHashesUrlObject (tag: any): tag is ActivityPlaylistSegmentHashesObject {
414 const urlMediaType = tag.mediaType || tag.mimeType
415
416 return tag.name === 'sha256' && tag.type === 'Link' && urlMediaType === 'application/json'
315} 417}
316 418
317async function createVideo (videoObject: VideoTorrentObject, channelActor: ActorModel, waitThumbnail = false) { 419async function createVideo (videoObject: VideoTorrentObject, channelActor: ActorModel, waitThumbnail = false) {
@@ -334,8 +436,14 @@ async function createVideo (videoObject: VideoTorrentObject, channelActor: Actor
334 const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t })) 436 const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t }))
335 await Promise.all(videoFilePromises) 437 await Promise.all(videoFilePromises)
336 438
439 const videoStreamingPlaylists = streamingPlaylistActivityUrlToDBAttributes(videoCreated, videoObject)
440 const playlistPromises = videoStreamingPlaylists.map(p => VideoStreamingPlaylistModel.create(p, { transaction: t }))
441 await Promise.all(playlistPromises)
442
337 // Process tags 443 // Process tags
338 const tags = videoObject.tag.map(t => t.name) 444 const tags = videoObject.tag
445 .filter(t => t.type === 'Hashtag')
446 .map(t => t.name)
339 const tagInstances = await TagModel.findOrCreateTags(tags, t) 447 const tagInstances = await TagModel.findOrCreateTags(tags, t)
340 await videoCreated.$set('Tags', tagInstances, sequelizeOptions) 448 await videoCreated.$set('Tags', tagInstances, sequelizeOptions)
341 449
@@ -359,52 +467,6 @@ async function createVideo (videoObject: VideoTorrentObject, channelActor: Actor
359 return videoCreated 467 return videoCreated
360} 468}
361 469
362async function refreshVideoIfNeeded (options: {
363 video: VideoModel,
364 fetchedType: VideoFetchByUrlType,
365 syncParam: SyncParam,
366 refreshViews: boolean
367}): Promise<VideoModel> {
368 if (!options.video.isOutdated()) return options.video
369
370 // We need more attributes if the argument video was fetched with not enough joints
371 const video = options.fetchedType === 'all' ? options.video : await VideoModel.loadByUrlAndPopulateAccount(options.video.url)
372
373 try {
374 const { response, videoObject } = await fetchRemoteVideo(video.url)
375 if (response.statusCode === 404) {
376 logger.info('Cannot refresh remote video %s: video does not exist anymore. Deleting it.', video.url)
377
378 // Video does not exist anymore
379 await video.destroy()
380 return undefined
381 }
382
383 if (videoObject === undefined) {
384 logger.warn('Cannot refresh remote video %s: invalid body.', video.url)
385 return video
386 }
387
388 const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject)
389 const account = await AccountModel.load(channelActor.VideoChannel.accountId)
390
391 const updateOptions = {
392 video,
393 videoObject,
394 account,
395 channel: channelActor.VideoChannel,
396 updateViews: options.refreshViews
397 }
398 await retryTransactionWrapper(updateVideoFromAP, updateOptions)
399 await syncVideoExternalAttributes(video, videoObject, options.syncParam)
400
401 return video
402 } catch (err) {
403 logger.warn('Cannot refresh video %s.', options.video.url, { err })
404 return video
405 }
406}
407
408async function videoActivityObjectToDBAttributes ( 470async function videoActivityObjectToDBAttributes (
409 videoChannel: VideoChannelModel, 471 videoChannel: VideoChannelModel,
410 videoObject: VideoTorrentObject, 472 videoObject: VideoTorrentObject,
@@ -460,17 +522,18 @@ async function videoActivityObjectToDBAttributes (
460} 522}
461 523
462function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) { 524function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
463 const fileUrls = videoObject.url.filter(u => isActivityVideoUrlObject(u)) as ActivityVideoUrlObject[] 525 const fileUrls = videoObject.url.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[]
464 526
465 if (fileUrls.length === 0) { 527 if (fileUrls.length === 0) {
466 throw new Error('Cannot find video files for ' + video.url) 528 throw new Error('Cannot find video files for ' + video.url)
467 } 529 }
468 530
469 const attributes: VideoFileModel[] = [] 531 const attributes: FilteredModelAttributes<VideoFileModel>[] = []
470 for (const fileUrl of fileUrls) { 532 for (const fileUrl of fileUrls) {
471 // Fetch associated magnet uri 533 // Fetch associated magnet uri
472 const magnet = videoObject.url.find(u => { 534 const magnet = videoObject.url.find(u => {
473 return u.mimeType === 'application/x-bittorrent;x-scheme-handler/magnet' && u.height === fileUrl.height 535 const mediaType = u.mediaType || u.mimeType
536 return mediaType === 'application/x-bittorrent;x-scheme-handler/magnet' && (u as any).height === fileUrl.height
474 }) 537 })
475 538
476 if (!magnet) throw new Error('Cannot find associated magnet uri for file ' + fileUrl.href) 539 if (!magnet) throw new Error('Cannot find associated magnet uri for file ' + fileUrl.href)
@@ -480,14 +543,53 @@ function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: Vid
480 throw new Error('Cannot parse magnet URI ' + magnet.href) 543 throw new Error('Cannot parse magnet URI ' + magnet.href)
481 } 544 }
482 545
546 const mediaType = fileUrl.mediaType || fileUrl.mimeType
483 const attribute = { 547 const attribute = {
484 extname: VIDEO_MIMETYPE_EXT[ fileUrl.mimeType ], 548 extname: MIMETYPES.VIDEO.MIMETYPE_EXT[ mediaType ],
485 infoHash: parsed.infoHash, 549 infoHash: parsed.infoHash,
486 resolution: fileUrl.height, 550 resolution: fileUrl.height,
487 size: fileUrl.size, 551 size: fileUrl.size,
488 videoId: video.id, 552 videoId: video.id,
489 fps: fileUrl.fps || -1 553 fps: fileUrl.fps || -1
490 } as VideoFileModel 554 }
555
556 attributes.push(attribute)
557 }
558
559 return attributes
560}
561
562function streamingPlaylistActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
563 const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u)) as ActivityPlaylistUrlObject[]
564 if (playlistUrls.length === 0) return []
565
566 const attributes: FilteredModelAttributes<VideoStreamingPlaylistModel>[] = []
567 for (const playlistUrlObject of playlistUrls) {
568 const p2pMediaLoaderInfohashes = playlistUrlObject.tag
569 .filter(t => t.type === 'Infohash')
570 .map(t => t.name)
571 if (p2pMediaLoaderInfohashes.length === 0) {
572 logger.warn('No infohashes found in AP playlist object.', { playlistUrl: playlistUrlObject })
573 continue
574 }
575
576 const segmentsSha256UrlObject = playlistUrlObject.tag
577 .find(t => {
578 return isAPPlaylistSegmentHashesUrlObject(t)
579 }) as ActivityPlaylistSegmentHashesObject
580 if (!segmentsSha256UrlObject) {
581 logger.warn('No segment sha256 URL found in AP playlist object.', { playlistUrl: playlistUrlObject })
582 continue
583 }
584
585 const attribute = {
586 type: VideoStreamingPlaylistType.HLS,
587 playlistUrl: playlistUrlObject.href,
588 segmentsSha256Url: segmentsSha256UrlObject.href,
589 p2pMediaLoaderInfohashes,
590 videoId: video.id
591 }
592
491 attributes.push(attribute) 593 attributes.push(attribute)
492 } 594 }
493 595
diff --git a/server/lib/avatar.ts b/server/lib/avatar.ts
index 4b6bc3185..021426a1a 100644
--- a/server/lib/avatar.ts
+++ b/server/lib/avatar.ts
@@ -7,10 +7,11 @@ import { AccountModel } from '../models/account/account'
7import { VideoChannelModel } from '../models/video/video-channel' 7import { VideoChannelModel } from '../models/video/video-channel'
8import { extname, join } from 'path' 8import { extname, join } from 'path'
9import { retryTransactionWrapper } from '../helpers/database-utils' 9import { retryTransactionWrapper } from '../helpers/database-utils'
10import * as uuidv4 from 'uuid/v4'
10 11
11async function updateActorAvatarFile (avatarPhysicalFile: Express.Multer.File, accountOrChannel: AccountModel | VideoChannelModel) { 12async function updateActorAvatarFile (avatarPhysicalFile: Express.Multer.File, accountOrChannel: AccountModel | VideoChannelModel) {
12 const extension = extname(avatarPhysicalFile.filename) 13 const extension = extname(avatarPhysicalFile.filename)
13 const avatarName = accountOrChannel.Actor.uuid + extension 14 const avatarName = uuidv4() + extension
14 const destination = join(CONFIG.STORAGE.AVATARS_DIR, avatarName) 15 const destination = join(CONFIG.STORAGE.AVATARS_DIR, avatarName)
15 await processImage(avatarPhysicalFile, destination, AVATARS_SIZE) 16 await processImage(avatarPhysicalFile, destination, AVATARS_SIZE)
16 17
diff --git a/server/lib/blocklist.ts b/server/lib/blocklist.ts
new file mode 100644
index 000000000..1633e500c
--- /dev/null
+++ b/server/lib/blocklist.ts
@@ -0,0 +1,40 @@
1import { sequelizeTypescript } from '../initializers'
2import { AccountBlocklistModel } from '../models/account/account-blocklist'
3import { ServerBlocklistModel } from '../models/server/server-blocklist'
4
5function addAccountInBlocklist (byAccountId: number, targetAccountId: number) {
6 return sequelizeTypescript.transaction(async t => {
7 return AccountBlocklistModel.upsert({
8 accountId: byAccountId,
9 targetAccountId: targetAccountId
10 }, { transaction: t })
11 })
12}
13
14function addServerInBlocklist (byAccountId: number, targetServerId: number) {
15 return sequelizeTypescript.transaction(async t => {
16 return ServerBlocklistModel.upsert({
17 accountId: byAccountId,
18 targetServerId
19 }, { transaction: t })
20 })
21}
22
23function removeAccountFromBlocklist (accountBlock: AccountBlocklistModel) {
24 return sequelizeTypescript.transaction(async t => {
25 return accountBlock.destroy({ transaction: t })
26 })
27}
28
29function removeServerFromBlocklist (serverBlock: ServerBlocklistModel) {
30 return sequelizeTypescript.transaction(async t => {
31 return serverBlock.destroy({ transaction: t })
32 })
33}
34
35export {
36 addAccountInBlocklist,
37 addServerInBlocklist,
38 removeAccountFromBlocklist,
39 removeServerFromBlocklist
40}
diff --git a/server/lib/cache/actor-follow-score-cache.ts b/server/lib/cache/actor-follow-score-cache.ts
new file mode 100644
index 000000000..d070bde09
--- /dev/null
+++ b/server/lib/cache/actor-follow-score-cache.ts
@@ -0,0 +1,46 @@
1import { ACTOR_FOLLOW_SCORE } from '../../initializers'
2import { logger } from '../../helpers/logger'
3
4// Cache follows scores, instead of writing them too often in database
5// Keep data in memory, we don't really need Redis here as we don't really care to loose some scores
6class ActorFollowScoreCache {
7
8 private static instance: ActorFollowScoreCache
9 private pendingFollowsScore: { [ url: string ]: number } = {}
10
11 private constructor () {}
12
13 static get Instance () {
14 return this.instance || (this.instance = new this())
15 }
16
17 updateActorFollowsScore (goodInboxes: string[], badInboxes: string[]) {
18 if (goodInboxes.length === 0 && badInboxes.length === 0) return
19
20 logger.info('Updating %d good actor follows and %d bad actor follows scores in cache.', goodInboxes.length, badInboxes.length)
21
22 for (const goodInbox of goodInboxes) {
23 if (this.pendingFollowsScore[goodInbox] === undefined) this.pendingFollowsScore[goodInbox] = 0
24
25 this.pendingFollowsScore[goodInbox] += ACTOR_FOLLOW_SCORE.BONUS
26 }
27
28 for (const badInbox of badInboxes) {
29 if (this.pendingFollowsScore[badInbox] === undefined) this.pendingFollowsScore[badInbox] = 0
30
31 this.pendingFollowsScore[badInbox] += ACTOR_FOLLOW_SCORE.PENALTY
32 }
33 }
34
35 getPendingFollowsScoreCopy () {
36 return this.pendingFollowsScore
37 }
38
39 clearPendingFollowsScore () {
40 this.pendingFollowsScore = {}
41 }
42}
43
44export {
45 ActorFollowScoreCache
46}
diff --git a/server/lib/cache/index.ts b/server/lib/cache/index.ts
index 54eb983fa..e921d04a7 100644
--- a/server/lib/cache/index.ts
+++ b/server/lib/cache/index.ts
@@ -1,2 +1,3 @@
1export * from './actor-follow-score-cache'
1export * from './videos-preview-cache' 2export * from './videos-preview-cache'
2export * from './videos-caption-cache' 3export * from './videos-caption-cache'
diff --git a/server/lib/client-html.ts b/server/lib/client-html.ts
index fc013e0c3..b2c376e20 100644
--- a/server/lib/client-html.ts
+++ b/server/lib/client-html.ts
@@ -1,7 +1,7 @@
1import * as express from 'express' 1import * as express from 'express'
2import * as Bluebird from 'bluebird' 2import * as Bluebird from 'bluebird'
3import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n' 3import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n'
4import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, STATIC_PATHS } from '../initializers' 4import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE } from '../initializers'
5import { join } from 'path' 5import { join } from 'path'
6import { escapeHTML } from '../helpers/core-utils' 6import { escapeHTML } from '../helpers/core-utils'
7import { VideoModel } from '../models/video/video' 7import { VideoModel } from '../models/video/video'
@@ -18,21 +18,13 @@ export class ClientHtml {
18 ClientHtml.htmlCache = {} 18 ClientHtml.htmlCache = {}
19 } 19 }
20 20
21 static async getIndexHTML (req: express.Request, res: express.Response, paramLang?: string) { 21 static async getDefaultHTMLPage (req: express.Request, res: express.Response, paramLang?: string) {
22 const path = ClientHtml.getIndexPath(req, res, paramLang) 22 const html = await ClientHtml.getIndexHTML(req, res, paramLang)
23 if (ClientHtml.htmlCache[path]) return ClientHtml.htmlCache[path]
24
25 const buffer = await readFile(path)
26 23
27 let html = buffer.toString() 24 let customHtml = ClientHtml.addTitleTag(html)
28 25 customHtml = ClientHtml.addDescriptionTag(customHtml)
29 html = ClientHtml.addTitleTag(html)
30 html = ClientHtml.addDescriptionTag(html)
31 html = ClientHtml.addCustomCSS(html)
32 26
33 ClientHtml.htmlCache[path] = html 27 return customHtml
34
35 return html
36 } 28 }
37 29
38 static async getWatchHTMLPage (videoId: string, req: express.Request, res: express.Response) { 30 static async getWatchHTMLPage (videoId: string, req: express.Request, res: express.Response) {
@@ -55,7 +47,26 @@ export class ClientHtml {
55 return ClientHtml.getIndexHTML(req, res) 47 return ClientHtml.getIndexHTML(req, res)
56 } 48 }
57 49
58 return ClientHtml.addOpenGraphAndOEmbedTags(html, video) 50 let customHtml = ClientHtml.addTitleTag(html, escapeHTML(video.name))
51 customHtml = ClientHtml.addDescriptionTag(customHtml, escapeHTML(video.description))
52 customHtml = ClientHtml.addOpenGraphAndOEmbedTags(customHtml, video)
53
54 return customHtml
55 }
56
57 private static async getIndexHTML (req: express.Request, res: express.Response, paramLang?: string) {
58 const path = ClientHtml.getIndexPath(req, res, paramLang)
59 if (ClientHtml.htmlCache[path]) return ClientHtml.htmlCache[path]
60
61 const buffer = await readFile(path)
62
63 let html = buffer.toString()
64
65 html = ClientHtml.addCustomCSS(html)
66
67 ClientHtml.htmlCache[path] = html
68
69 return html
59 } 70 }
60 71
61 private static getIndexPath (req: express.Request, res: express.Response, paramLang?: string) { 72 private static getIndexPath (req: express.Request, res: express.Response, paramLang?: string) {
@@ -81,14 +92,18 @@ export class ClientHtml {
81 return join(__dirname, '../../../client/dist/' + buildFileLocale(lang) + '/index.html') 92 return join(__dirname, '../../../client/dist/' + buildFileLocale(lang) + '/index.html')
82 } 93 }
83 94
84 private static addTitleTag (htmlStringPage: string) { 95 private static addTitleTag (htmlStringPage: string, title?: string) {
85 const titleTag = '<title>' + CONFIG.INSTANCE.NAME + '</title>' 96 let text = title || CONFIG.INSTANCE.NAME
97 if (title) text += ` - ${CONFIG.INSTANCE.NAME}`
98
99 const titleTag = `<title>${text}</title>`
86 100
87 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.TITLE, titleTag) 101 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.TITLE, titleTag)
88 } 102 }
89 103
90 private static addDescriptionTag (htmlStringPage: string) { 104 private static addDescriptionTag (htmlStringPage: string, description?: string) {
91 const descriptionTag = `<meta name="description" content="${CONFIG.INSTANCE.SHORT_DESCRIPTION}" />` 105 const content = description || CONFIG.INSTANCE.SHORT_DESCRIPTION
106 const descriptionTag = `<meta name="description" content="${content}" />`
92 107
93 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.DESCRIPTION, descriptionTag) 108 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.DESCRIPTION, descriptionTag)
94 } 109 }
@@ -100,8 +115,8 @@ export class ClientHtml {
100 } 115 }
101 116
102 private static addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoModel) { 117 private static addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoModel) {
103 const previewUrl = CONFIG.WEBSERVER.URL + STATIC_PATHS.PREVIEWS + video.getPreviewName() 118 const previewUrl = CONFIG.WEBSERVER.URL + video.getPreviewStaticPath()
104 const videoUrl = CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid 119 const videoUrl = CONFIG.WEBSERVER.URL + video.getWatchStaticPath()
105 120
106 const videoNameEscaped = escapeHTML(video.name) 121 const videoNameEscaped = escapeHTML(video.name)
107 const videoDescriptionEscaped = escapeHTML(video.description) 122 const videoDescriptionEscaped = escapeHTML(video.description)
@@ -172,8 +187,8 @@ export class ClientHtml {
172 // Schema.org 187 // Schema.org
173 tagsString += `<script type="application/ld+json">${JSON.stringify(schemaTags)}</script>` 188 tagsString += `<script type="application/ld+json">${JSON.stringify(schemaTags)}</script>`
174 189
175 // SEO 190 // SEO, use origin video url so Google does not index remote videos
176 tagsString += `<link rel="canonical" href="${videoUrl}" />` 191 tagsString += `<link rel="canonical" href="${video.url}" />`
177 192
178 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.OPENGRAPH_AND_OEMBED, tagsString) 193 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.OPENGRAPH_AND_OEMBED, tagsString)
179 } 194 }
diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
index 9327792fb..672414cc0 100644
--- a/server/lib/emailer.ts
+++ b/server/lib/emailer.ts
@@ -1,5 +1,4 @@
1import { createTransport, Transporter } from 'nodemailer' 1import { createTransport, Transporter } from 'nodemailer'
2import { UserRight } from '../../shared/models/users'
3import { isTestInstance } from '../helpers/core-utils' 2import { isTestInstance } from '../helpers/core-utils'
4import { bunyanLogger, logger } from '../helpers/logger' 3import { bunyanLogger, logger } from '../helpers/logger'
5import { CONFIG } from '../initializers' 4import { CONFIG } from '../initializers'
@@ -8,6 +7,11 @@ import { VideoModel } from '../models/video/video'
8import { JobQueue } from './job-queue' 7import { JobQueue } from './job-queue'
9import { EmailPayload } from './job-queue/handlers/email' 8import { EmailPayload } from './job-queue/handlers/email'
10import { readFileSync } from 'fs-extra' 9import { readFileSync } from 'fs-extra'
10import { VideoCommentModel } from '../models/video/video-comment'
11import { VideoAbuseModel } from '../models/video/video-abuse'
12import { VideoBlacklistModel } from '../models/video/video-blacklist'
13import { VideoImportModel } from '../models/video/video-import'
14import { ActorFollowModel } from '../models/activitypub/actor-follow'
11 15
12class Emailer { 16class Emailer {
13 17
@@ -22,7 +26,7 @@ class Emailer {
22 if (this.initialized === true) return 26 if (this.initialized === true) return
23 this.initialized = true 27 this.initialized = true
24 28
25 if (CONFIG.SMTP.HOSTNAME && CONFIG.SMTP.PORT) { 29 if (Emailer.isEnabled()) {
26 logger.info('Using %s:%s as SMTP server.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT) 30 logger.info('Using %s:%s as SMTP server.', CONFIG.SMTP.HOSTNAME, CONFIG.SMTP.PORT)
27 31
28 let tls 32 let tls
@@ -57,6 +61,10 @@ class Emailer {
57 } 61 }
58 } 62 }
59 63
64 static isEnabled () {
65 return !!CONFIG.SMTP.HOSTNAME && !!CONFIG.SMTP.PORT
66 }
67
60 async checkConnectionOrDie () { 68 async checkConnectionOrDie () {
61 if (!this.transporter) return 69 if (!this.transporter) return
62 70
@@ -72,50 +80,158 @@ class Emailer {
72 } 80 }
73 } 81 }
74 82
75 addForgetPasswordEmailJob (to: string, resetPasswordUrl: string) { 83 addNewVideoFromSubscriberNotification (to: string[], video: VideoModel) {
84 const channelName = video.VideoChannel.getDisplayName()
85 const videoUrl = CONFIG.WEBSERVER.URL + video.getWatchStaticPath()
86
76 const text = `Hi dear user,\n\n` + 87 const text = `Hi dear user,\n\n` +
77 `It seems you forgot your password on ${CONFIG.WEBSERVER.HOST}! ` + 88 `Your subscription ${channelName} just published a new video: ${video.name}` +
78 `Please follow this link to reset it: ${resetPasswordUrl}\n\n` + 89 `\n\n` +
79 `If you are not the person who initiated this request, please ignore this email.\n\n` + 90 `You can view it on ${videoUrl} ` +
91 `\n\n` +
80 `Cheers,\n` + 92 `Cheers,\n` +
81 `PeerTube.` 93 `PeerTube.`
82 94
83 const emailPayload: EmailPayload = { 95 const emailPayload: EmailPayload = {
84 to: [ to ], 96 to,
85 subject: 'Reset your PeerTube password', 97 subject: channelName + ' just published a new video',
86 text 98 text
87 } 99 }
88 100
89 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 101 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
90 } 102 }
91 103
92 addVerifyEmailJob (to: string, verifyEmailUrl: string) { 104 addNewFollowNotification (to: string[], actorFollow: ActorFollowModel, followType: 'account' | 'channel') {
93 const text = `Welcome to PeerTube,\n\n` + 105 const followerName = actorFollow.ActorFollower.Account.getDisplayName()
94 `To start using PeerTube on ${CONFIG.WEBSERVER.HOST} you must verify your email! ` + 106 const followingName = (actorFollow.ActorFollowing.VideoChannel || actorFollow.ActorFollowing.Account).getDisplayName()
95 `Please follow this link to verify this email belongs to you: ${verifyEmailUrl}\n\n` + 107
96 `If you are not the person who initiated this request, please ignore this email.\n\n` + 108 const text = `Hi dear user,\n\n` +
109 `Your ${followType} ${followingName} has a new subscriber: ${followerName}` +
110 `\n\n` +
97 `Cheers,\n` + 111 `Cheers,\n` +
98 `PeerTube.` 112 `PeerTube.`
99 113
100 const emailPayload: EmailPayload = { 114 const emailPayload: EmailPayload = {
101 to: [ to ], 115 to,
102 subject: 'Verify your PeerTube email', 116 subject: 'New follower on your channel ' + followingName,
117 text
118 }
119
120 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
121 }
122
123 myVideoPublishedNotification (to: string[], video: VideoModel) {
124 const videoUrl = CONFIG.WEBSERVER.URL + video.getWatchStaticPath()
125
126 const text = `Hi dear user,\n\n` +
127 `Your video ${video.name} has been published.` +
128 `\n\n` +
129 `You can view it on ${videoUrl} ` +
130 `\n\n` +
131 `Cheers,\n` +
132 `PeerTube.`
133
134 const emailPayload: EmailPayload = {
135 to,
136 subject: `Your video ${video.name} is published`,
137 text
138 }
139
140 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
141 }
142
143 myVideoImportSuccessNotification (to: string[], videoImport: VideoImportModel) {
144 const videoUrl = CONFIG.WEBSERVER.URL + videoImport.Video.getWatchStaticPath()
145
146 const text = `Hi dear user,\n\n` +
147 `Your video import ${videoImport.getTargetIdentifier()} is finished.` +
148 `\n\n` +
149 `You can view the imported video on ${videoUrl} ` +
150 `\n\n` +
151 `Cheers,\n` +
152 `PeerTube.`
153
154 const emailPayload: EmailPayload = {
155 to,
156 subject: `Your video import ${videoImport.getTargetIdentifier()} is finished`,
157 text
158 }
159
160 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
161 }
162
163 myVideoImportErrorNotification (to: string[], videoImport: VideoImportModel) {
164 const importUrl = CONFIG.WEBSERVER.URL + '/my-account/video-imports'
165
166 const text = `Hi dear user,\n\n` +
167 `Your video import ${videoImport.getTargetIdentifier()} encountered an error.` +
168 `\n\n` +
169 `See your videos import dashboard for more information: ${importUrl}` +
170 `\n\n` +
171 `Cheers,\n` +
172 `PeerTube.`
173
174 const emailPayload: EmailPayload = {
175 to,
176 subject: `Your video import ${videoImport.getTargetIdentifier()} encountered an error`,
177 text
178 }
179
180 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
181 }
182
183 addNewCommentOnMyVideoNotification (to: string[], comment: VideoCommentModel) {
184 const accountName = comment.Account.getDisplayName()
185 const video = comment.Video
186 const commentUrl = CONFIG.WEBSERVER.URL + comment.getCommentStaticPath()
187
188 const text = `Hi dear user,\n\n` +
189 `A new comment has been posted by ${accountName} on your video ${video.name}` +
190 `\n\n` +
191 `You can view it on ${commentUrl} ` +
192 `\n\n` +
193 `Cheers,\n` +
194 `PeerTube.`
195
196 const emailPayload: EmailPayload = {
197 to,
198 subject: 'New comment on your video ' + video.name,
103 text 199 text
104 } 200 }
105 201
106 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 202 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
107 } 203 }
108 204
109 async addVideoAbuseReportJob (videoId: number) { 205 addNewCommentMentionNotification (to: string[], comment: VideoCommentModel) {
110 const video = await VideoModel.load(videoId) 206 const accountName = comment.Account.getDisplayName()
111 if (!video) throw new Error('Unknown Video id during Abuse report.') 207 const video = comment.Video
208 const commentUrl = CONFIG.WEBSERVER.URL + comment.getCommentStaticPath()
209
210 const text = `Hi dear user,\n\n` +
211 `${accountName} mentioned you on video ${video.name}` +
212 `\n\n` +
213 `You can view the comment on ${commentUrl} ` +
214 `\n\n` +
215 `Cheers,\n` +
216 `PeerTube.`
217
218 const emailPayload: EmailPayload = {
219 to,
220 subject: 'Mention on video ' + video.name,
221 text
222 }
223
224 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
225 }
226
227 addVideoAbuseModeratorsNotification (to: string[], videoAbuse: VideoAbuseModel) {
228 const videoUrl = CONFIG.WEBSERVER.URL + videoAbuse.Video.getWatchStaticPath()
112 229
113 const text = `Hi,\n\n` + 230 const text = `Hi,\n\n` +
114 `Your instance received an abuse for the following video ${video.url}\n\n` + 231 `${CONFIG.WEBSERVER.HOST} received an abuse for the following video ${videoUrl}\n\n` +
115 `Cheers,\n` + 232 `Cheers,\n` +
116 `PeerTube.` 233 `PeerTube.`
117 234
118 const to = await UserModel.listEmailsWithRight(UserRight.MANAGE_VIDEO_ABUSES)
119 const emailPayload: EmailPayload = { 235 const emailPayload: EmailPayload = {
120 to, 236 to,
121 subject: '[PeerTube] Received a video abuse', 237 subject: '[PeerTube] Received a video abuse',
@@ -125,16 +241,27 @@ class Emailer {
125 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 241 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
126 } 242 }
127 243
128 async addVideoBlacklistReportJob (videoId: number, reason?: string) { 244 addNewUserRegistrationNotification (to: string[], user: UserModel) {
129 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId) 245 const text = `Hi,\n\n` +
130 if (!video) throw new Error('Unknown Video id during Blacklist report.') 246 `User ${user.username} just registered on ${CONFIG.WEBSERVER.HOST} PeerTube instance.\n\n` +
131 // It's not our user 247 `Cheers,\n` +
132 if (video.remote === true) return 248 `PeerTube.`
249
250 const emailPayload: EmailPayload = {
251 to,
252 subject: '[PeerTube] New user registration on ' + CONFIG.WEBSERVER.HOST,
253 text
254 }
255
256 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
257 }
133 258
134 const user = await UserModel.loadById(video.VideoChannel.Account.userId) 259 addVideoBlacklistNotification (to: string[], videoBlacklist: VideoBlacklistModel) {
260 const videoName = videoBlacklist.Video.name
261 const videoUrl = CONFIG.WEBSERVER.URL + videoBlacklist.Video.getWatchStaticPath()
135 262
136 const reasonString = reason ? ` for the following reason: ${reason}` : '' 263 const reasonString = videoBlacklist.reason ? ` for the following reason: ${videoBlacklist.reason}` : ''
137 const blockedString = `Your video ${video.name} on ${CONFIG.WEBSERVER.HOST} has been blacklisted${reasonString}.` 264 const blockedString = `Your video ${videoName} (${videoUrl} on ${CONFIG.WEBSERVER.HOST} has been blacklisted${reasonString}.`
138 265
139 const text = 'Hi,\n\n' + 266 const text = 'Hi,\n\n' +
140 blockedString + 267 blockedString +
@@ -142,33 +269,26 @@ class Emailer {
142 'Cheers,\n' + 269 'Cheers,\n' +
143 `PeerTube.` 270 `PeerTube.`
144 271
145 const to = user.email
146 const emailPayload: EmailPayload = { 272 const emailPayload: EmailPayload = {
147 to: [ to ], 273 to,
148 subject: `[PeerTube] Video ${video.name} blacklisted`, 274 subject: `[PeerTube] Video ${videoName} blacklisted`,
149 text 275 text
150 } 276 }
151 277
152 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 278 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
153 } 279 }
154 280
155 async addVideoUnblacklistReportJob (videoId: number) { 281 addVideoUnblacklistNotification (to: string[], video: VideoModel) {
156 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId) 282 const videoUrl = CONFIG.WEBSERVER.URL + video.getWatchStaticPath()
157 if (!video) throw new Error('Unknown Video id during Blacklist report.')
158 // It's not our user
159 if (video.remote === true) return
160
161 const user = await UserModel.loadById(video.VideoChannel.Account.userId)
162 283
163 const text = 'Hi,\n\n' + 284 const text = 'Hi,\n\n' +
164 `Your video ${video.name} on ${CONFIG.WEBSERVER.HOST} has been unblacklisted.` + 285 `Your video ${video.name} (${videoUrl}) on ${CONFIG.WEBSERVER.HOST} has been unblacklisted.` +
165 '\n\n' + 286 '\n\n' +
166 'Cheers,\n' + 287 'Cheers,\n' +
167 `PeerTube.` 288 `PeerTube.`
168 289
169 const to = user.email
170 const emailPayload: EmailPayload = { 290 const emailPayload: EmailPayload = {
171 to: [ to ], 291 to,
172 subject: `[PeerTube] Video ${video.name} unblacklisted`, 292 subject: `[PeerTube] Video ${video.name} unblacklisted`,
173 text 293 text
174 } 294 }
@@ -176,6 +296,40 @@ class Emailer {
176 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 296 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
177 } 297 }
178 298
299 addPasswordResetEmailJob (to: string, resetPasswordUrl: string) {
300 const text = `Hi dear user,\n\n` +
301 `A reset password procedure for your account ${to} has been requested on ${CONFIG.WEBSERVER.HOST} ` +
302 `Please follow this link to reset it: ${resetPasswordUrl}\n\n` +
303 `If you are not the person who initiated this request, please ignore this email.\n\n` +
304 `Cheers,\n` +
305 `PeerTube.`
306
307 const emailPayload: EmailPayload = {
308 to: [ to ],
309 subject: 'Reset your PeerTube password',
310 text
311 }
312
313 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
314 }
315
316 addVerifyEmailJob (to: string, verifyEmailUrl: string) {
317 const text = `Welcome to PeerTube,\n\n` +
318 `To start using PeerTube on ${CONFIG.WEBSERVER.HOST} you must verify your email! ` +
319 `Please follow this link to verify this email belongs to you: ${verifyEmailUrl}\n\n` +
320 `If you are not the person who initiated this request, please ignore this email.\n\n` +
321 `Cheers,\n` +
322 `PeerTube.`
323
324 const emailPayload: EmailPayload = {
325 to: [ to ],
326 subject: 'Verify your PeerTube email',
327 text
328 }
329
330 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
331 }
332
179 addUserBlockJob (user: UserModel, blocked: boolean, reason?: string) { 333 addUserBlockJob (user: UserModel, blocked: boolean, reason?: string) {
180 const reasonString = reason ? ` for the following reason: ${reason}` : '' 334 const reasonString = reason ? ` for the following reason: ${reason}` : ''
181 const blockedWord = blocked ? 'blocked' : 'unblocked' 335 const blockedWord = blocked ? 'blocked' : 'unblocked'
@@ -197,13 +351,32 @@ class Emailer {
197 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 351 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
198 } 352 }
199 353
200 sendMail (to: string[], subject: string, text: string) { 354 addContactFormJob (fromEmail: string, fromName: string, body: string) {
201 if (!this.transporter) { 355 const text = 'Hello dear admin,\n\n' +
356 fromName + ' sent you a message' +
357 '\n\n---------------------------------------\n\n' +
358 body +
359 '\n\n---------------------------------------\n\n' +
360 'Cheers,\n' +
361 'PeerTube.'
362
363 const emailPayload: EmailPayload = {
364 from: fromEmail,
365 to: [ CONFIG.ADMIN.EMAIL ],
366 subject: '[PeerTube] Contact form submitted',
367 text
368 }
369
370 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
371 }
372
373 sendMail (to: string[], subject: string, text: string, from?: string) {
374 if (!Emailer.isEnabled()) {
202 throw new Error('Cannot send mail because SMTP is not configured.') 375 throw new Error('Cannot send mail because SMTP is not configured.')
203 } 376 }
204 377
205 return this.transporter.sendMail({ 378 return this.transporter.sendMail({
206 from: CONFIG.SMTP.FROM_ADDRESS, 379 from: from || CONFIG.SMTP.FROM_ADDRESS,
207 to: to.join(','), 380 to: to.join(','),
208 subject, 381 subject,
209 text 382 text
diff --git a/server/lib/hls.ts b/server/lib/hls.ts
new file mode 100644
index 000000000..3575981f4
--- /dev/null
+++ b/server/lib/hls.ts
@@ -0,0 +1,164 @@
1import { VideoModel } from '../models/video/video'
2import { basename, join, dirname } from 'path'
3import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
4import { close, ensureDir, move, open, outputJSON, pathExists, read, readFile, remove, writeFile } from 'fs-extra'
5import { getVideoFileSize } from '../helpers/ffmpeg-utils'
6import { sha256 } from '../helpers/core-utils'
7import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
8import { logger } from '../helpers/logger'
9import { doRequest, doRequestAndSaveToFile } from '../helpers/requests'
10import { generateRandomString } from '../helpers/utils'
11import { flatten, uniq } from 'lodash'
12
13async function updateMasterHLSPlaylist (video: VideoModel) {
14 const directory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
15 const masterPlaylists: string[] = [ '#EXTM3U', '#EXT-X-VERSION:3' ]
16 const masterPlaylistPath = join(directory, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
17
18 for (const file of video.VideoFiles) {
19 // If we did not generated a playlist for this resolution, skip
20 const filePlaylistPath = join(directory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
21 if (await pathExists(filePlaylistPath) === false) continue
22
23 const videoFilePath = video.getVideoFilePath(file)
24
25 const size = await getVideoFileSize(videoFilePath)
26
27 const bandwidth = 'BANDWIDTH=' + video.getBandwidthBits(file)
28 const resolution = `RESOLUTION=${size.width}x${size.height}`
29
30 let line = `#EXT-X-STREAM-INF:${bandwidth},${resolution}`
31 if (file.fps) line += ',FRAME-RATE=' + file.fps
32
33 masterPlaylists.push(line)
34 masterPlaylists.push(VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
35 }
36
37 await writeFile(masterPlaylistPath, masterPlaylists.join('\n') + '\n')
38}
39
40async function updateSha256Segments (video: VideoModel) {
41 const json: { [filename: string]: { [range: string]: string } } = {}
42
43 const playlistDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
44
45 // For all the resolutions available for this video
46 for (const file of video.VideoFiles) {
47 const rangeHashes: { [range: string]: string } = {}
48
49 const videoPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution))
50 const playlistPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
51
52 // Maybe the playlist is not generated for this resolution yet
53 if (!await pathExists(playlistPath)) continue
54
55 const playlistContent = await readFile(playlistPath)
56 const ranges = getRangesFromPlaylist(playlistContent.toString())
57
58 const fd = await open(videoPath, 'r')
59 for (const range of ranges) {
60 const buf = Buffer.alloc(range.length)
61 await read(fd, buf, 0, range.length, range.offset)
62
63 rangeHashes[`${range.offset}-${range.offset + range.length - 1}`] = sha256(buf)
64 }
65 await close(fd)
66
67 const videoFilename = VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution)
68 json[videoFilename] = rangeHashes
69 }
70
71 const outputPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
72 await outputJSON(outputPath, json)
73}
74
75function getRangesFromPlaylist (playlistContent: string) {
76 const ranges: { offset: number, length: number }[] = []
77 const lines = playlistContent.split('\n')
78 const regex = /^#EXT-X-BYTERANGE:(\d+)@(\d+)$/
79
80 for (const line of lines) {
81 const captured = regex.exec(line)
82
83 if (captured) {
84 ranges.push({ length: parseInt(captured[1], 10), offset: parseInt(captured[2], 10) })
85 }
86 }
87
88 return ranges
89}
90
91function downloadPlaylistSegments (playlistUrl: string, destinationDir: string, timeout: number) {
92 let timer
93
94 logger.info('Importing HLS playlist %s', playlistUrl)
95
96 return new Promise<string>(async (res, rej) => {
97 const tmpDirectory = join(CONFIG.STORAGE.TMP_DIR, await generateRandomString(10))
98
99 await ensureDir(tmpDirectory)
100
101 timer = setTimeout(() => {
102 deleteTmpDirectory(tmpDirectory)
103
104 return rej(new Error('HLS download timeout.'))
105 }, timeout)
106
107 try {
108 // Fetch master playlist
109 const subPlaylistUrls = await fetchUniqUrls(playlistUrl)
110
111 const subRequests = subPlaylistUrls.map(u => fetchUniqUrls(u))
112 const fileUrls = uniq(flatten(await Promise.all(subRequests)))
113
114 logger.debug('Will download %d HLS files.', fileUrls.length, { fileUrls })
115
116 for (const fileUrl of fileUrls) {
117 const destPath = join(tmpDirectory, basename(fileUrl))
118
119 await doRequestAndSaveToFile({ uri: fileUrl }, destPath)
120 }
121
122 clearTimeout(timer)
123
124 await move(tmpDirectory, destinationDir, { overwrite: true })
125
126 return res()
127 } catch (err) {
128 deleteTmpDirectory(tmpDirectory)
129
130 return rej(err)
131 }
132 })
133
134 function deleteTmpDirectory (directory: string) {
135 remove(directory)
136 .catch(err => logger.error('Cannot delete path on HLS download error.', { err }))
137 }
138
139 async function fetchUniqUrls (playlistUrl: string) {
140 const { body } = await doRequest<string>({ uri: playlistUrl })
141
142 if (!body) return []
143
144 const urls = body.split('\n')
145 .filter(line => line.endsWith('.m3u8') || line.endsWith('.mp4'))
146 .map(url => {
147 if (url.startsWith('http://') || url.startsWith('https://')) return url
148
149 return `${dirname(playlistUrl)}/${url}`
150 })
151
152 return uniq(urls)
153 }
154}
155
156// ---------------------------------------------------------------------------
157
158export {
159 updateMasterHLSPlaylist,
160 updateSha256Segments,
161 downloadPlaylistSegments
162}
163
164// ---------------------------------------------------------------------------
diff --git a/server/lib/job-queue/handlers/activitypub-follow.ts b/server/lib/job-queue/handlers/activitypub-follow.ts
index 36d0f237b..b4d381062 100644
--- a/server/lib/job-queue/handlers/activitypub-follow.ts
+++ b/server/lib/job-queue/handlers/activitypub-follow.ts
@@ -8,6 +8,7 @@ import { getOrCreateActorAndServerAndModel } from '../../activitypub/actor'
8import { retryTransactionWrapper } from '../../../helpers/database-utils' 8import { retryTransactionWrapper } from '../../../helpers/database-utils'
9import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 9import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
10import { ActorModel } from '../../../models/activitypub/actor' 10import { ActorModel } from '../../../models/activitypub/actor'
11import { Notifier } from '../../notifier'
11 12
12export type ActivitypubFollowPayload = { 13export type ActivitypubFollowPayload = {
13 followerActorId: number 14 followerActorId: number
@@ -42,7 +43,7 @@ export {
42 43
43// --------------------------------------------------------------------------- 44// ---------------------------------------------------------------------------
44 45
45function follow (fromActor: ActorModel, targetActor: ActorModel) { 46async function follow (fromActor: ActorModel, targetActor: ActorModel) {
46 if (fromActor.id === targetActor.id) { 47 if (fromActor.id === targetActor.id) {
47 throw new Error('Follower is the same than target actor.') 48 throw new Error('Follower is the same than target actor.')
48 } 49 }
@@ -50,7 +51,7 @@ function follow (fromActor: ActorModel, targetActor: ActorModel) {
50 // Same server, direct accept 51 // Same server, direct accept
51 const state = !fromActor.serverId && !targetActor.serverId ? 'accepted' : 'pending' 52 const state = !fromActor.serverId && !targetActor.serverId ? 'accepted' : 'pending'
52 53
53 return sequelizeTypescript.transaction(async t => { 54 const actorFollow = await sequelizeTypescript.transaction(async t => {
54 const [ actorFollow ] = await ActorFollowModel.findOrCreate({ 55 const [ actorFollow ] = await ActorFollowModel.findOrCreate({
55 where: { 56 where: {
56 actorId: fromActor.id, 57 actorId: fromActor.id,
@@ -68,5 +69,9 @@ function follow (fromActor: ActorModel, targetActor: ActorModel) {
68 69
69 // Send a notification to remote server if our follow is not already accepted 70 // Send a notification to remote server if our follow is not already accepted
70 if (actorFollow.state !== 'accepted') await sendFollow(actorFollow) 71 if (actorFollow.state !== 'accepted') await sendFollow(actorFollow)
72
73 return actorFollow
71 }) 74 })
75
76 if (actorFollow.state === 'accepted') Notifier.Instance.notifyOfNewFollow(actorFollow)
72} 77}
diff --git a/server/lib/job-queue/handlers/activitypub-http-broadcast.ts b/server/lib/job-queue/handlers/activitypub-http-broadcast.ts
index 03a9e12a4..9493945ff 100644
--- a/server/lib/job-queue/handlers/activitypub-http-broadcast.ts
+++ b/server/lib/job-queue/handlers/activitypub-http-broadcast.ts
@@ -3,8 +3,9 @@ import * as Bluebird from 'bluebird'
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { doRequest } from '../../../helpers/requests' 4import { doRequest } from '../../../helpers/requests'
5import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 5import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
6import { buildSignedRequestOptions, computeBody } from './utils/activitypub-http-utils' 6import { buildGlobalHeaders, buildSignedRequestOptions, computeBody } from './utils/activitypub-http-utils'
7import { BROADCAST_CONCURRENCY, JOB_REQUEST_TIMEOUT } from '../../../initializers' 7import { BROADCAST_CONCURRENCY, JOB_REQUEST_TIMEOUT } from '../../../initializers'
8import { ActorFollowScoreCache } from '../../cache'
8 9
9export type ActivitypubHttpBroadcastPayload = { 10export type ActivitypubHttpBroadcastPayload = {
10 uris: string[] 11 uris: string[]
@@ -25,7 +26,8 @@ async function processActivityPubHttpBroadcast (job: Bull.Job) {
25 uri: '', 26 uri: '',
26 json: body, 27 json: body,
27 httpSignature: httpSignatureOptions, 28 httpSignature: httpSignatureOptions,
28 timeout: JOB_REQUEST_TIMEOUT 29 timeout: JOB_REQUEST_TIMEOUT,
30 headers: buildGlobalHeaders(body)
29 } 31 }
30 32
31 const badUrls: string[] = [] 33 const badUrls: string[] = []
@@ -37,7 +39,7 @@ async function processActivityPubHttpBroadcast (job: Bull.Job) {
37 .catch(() => badUrls.push(uri)) 39 .catch(() => badUrls.push(uri))
38 }, { concurrency: BROADCAST_CONCURRENCY }) 40 }, { concurrency: BROADCAST_CONCURRENCY })
39 41
40 return ActorFollowModel.updateActorFollowsScore(goodUrls, badUrls, undefined) 42 return ActorFollowScoreCache.Instance.updateActorFollowsScore(goodUrls, badUrls)
41} 43}
42 44
43// --------------------------------------------------------------------------- 45// ---------------------------------------------------------------------------
diff --git a/server/lib/job-queue/handlers/activitypub-http-fetcher.ts b/server/lib/job-queue/handlers/activitypub-http-fetcher.ts
index 42217c27c..67ccfa995 100644
--- a/server/lib/job-queue/handlers/activitypub-http-fetcher.ts
+++ b/server/lib/job-queue/handlers/activitypub-http-fetcher.ts
@@ -23,7 +23,7 @@ async function processActivityPubHttpFetcher (job: Bull.Job) {
23 if (payload.videoId) video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoId) 23 if (payload.videoId) video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoId)
24 24
25 const fetcherType: { [ id in FetchType ]: (items: any[]) => Promise<any> } = { 25 const fetcherType: { [ id in FetchType ]: (items: any[]) => Promise<any> } = {
26 'activity': items => processActivities(items), 26 'activity': items => processActivities(items, { outboxUrl: payload.uri }),
27 'video-likes': items => createRates(items, video, 'like'), 27 'video-likes': items => createRates(items, video, 'like'),
28 'video-dislikes': items => createRates(items, video, 'dislike'), 28 'video-dislikes': items => createRates(items, video, 'dislike'),
29 'video-shares': items => addVideoShares(items, video), 29 'video-shares': items => addVideoShares(items, video),
diff --git a/server/lib/job-queue/handlers/activitypub-http-unicast.ts b/server/lib/job-queue/handlers/activitypub-http-unicast.ts
index c90d735f6..3973dcdc8 100644
--- a/server/lib/job-queue/handlers/activitypub-http-unicast.ts
+++ b/server/lib/job-queue/handlers/activitypub-http-unicast.ts
@@ -1,9 +1,9 @@
1import * as Bull from 'bull' 1import * as Bull from 'bull'
2import { logger } from '../../../helpers/logger' 2import { logger } from '../../../helpers/logger'
3import { doRequest } from '../../../helpers/requests' 3import { doRequest } from '../../../helpers/requests'
4import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 4import { buildGlobalHeaders, buildSignedRequestOptions, computeBody } from './utils/activitypub-http-utils'
5import { buildSignedRequestOptions, computeBody } from './utils/activitypub-http-utils'
6import { JOB_REQUEST_TIMEOUT } from '../../../initializers' 5import { JOB_REQUEST_TIMEOUT } from '../../../initializers'
6import { ActorFollowScoreCache } from '../../cache'
7 7
8export type ActivitypubHttpUnicastPayload = { 8export type ActivitypubHttpUnicastPayload = {
9 uri: string 9 uri: string
@@ -25,14 +25,15 @@ async function processActivityPubHttpUnicast (job: Bull.Job) {
25 uri, 25 uri,
26 json: body, 26 json: body,
27 httpSignature: httpSignatureOptions, 27 httpSignature: httpSignatureOptions,
28 timeout: JOB_REQUEST_TIMEOUT 28 timeout: JOB_REQUEST_TIMEOUT,
29 headers: buildGlobalHeaders(body)
29 } 30 }
30 31
31 try { 32 try {
32 await doRequest(options) 33 await doRequest(options)
33 ActorFollowModel.updateActorFollowsScore([ uri ], [], undefined) 34 ActorFollowScoreCache.Instance.updateActorFollowsScore([ uri ], [])
34 } catch (err) { 35 } catch (err) {
35 ActorFollowModel.updateActorFollowsScore([], [ uri ], undefined) 36 ActorFollowScoreCache.Instance.updateActorFollowsScore([], [ uri ])
36 37
37 throw err 38 throw err
38 } 39 }
diff --git a/server/lib/job-queue/handlers/activitypub-refresher.ts b/server/lib/job-queue/handlers/activitypub-refresher.ts
new file mode 100644
index 000000000..454b975fe
--- /dev/null
+++ b/server/lib/job-queue/handlers/activitypub-refresher.ts
@@ -0,0 +1,54 @@
1import * as Bull from 'bull'
2import { logger } from '../../../helpers/logger'
3import { fetchVideoByUrl } from '../../../helpers/video'
4import { refreshVideoIfNeeded, refreshActorIfNeeded } from '../../activitypub'
5import { ActorModel } from '../../../models/activitypub/actor'
6
7export type RefreshPayload = {
8 type: 'video' | 'actor'
9 url: string
10}
11
12async function refreshAPObject (job: Bull.Job) {
13 const payload = job.data as RefreshPayload
14
15 logger.info('Processing AP refresher in job %d for %s.', job.id, payload.url)
16
17 if (payload.type === 'video') return refreshVideo(payload.url)
18 if (payload.type === 'actor') return refreshActor(payload.url)
19}
20
21// ---------------------------------------------------------------------------
22
23export {
24 refreshActor,
25 refreshAPObject
26}
27
28// ---------------------------------------------------------------------------
29
30async function refreshVideo (videoUrl: string) {
31 const fetchType = 'all' as 'all'
32 const syncParam = { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true }
33
34 const videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType)
35 if (videoFromDatabase) {
36 const refreshOptions = {
37 video: videoFromDatabase,
38 fetchedType: fetchType,
39 syncParam
40 }
41
42 await refreshVideoIfNeeded(refreshOptions)
43 }
44}
45
46async function refreshActor (actorUrl: string) {
47 const fetchType = 'all' as 'all'
48 const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
49
50 if (actor) {
51 await refreshActorIfNeeded(actor, fetchType)
52 }
53
54}
diff --git a/server/lib/job-queue/handlers/email.ts b/server/lib/job-queue/handlers/email.ts
index 73d98ae54..220d0af32 100644
--- a/server/lib/job-queue/handlers/email.ts
+++ b/server/lib/job-queue/handlers/email.ts
@@ -6,13 +6,14 @@ export type EmailPayload = {
6 to: string[] 6 to: string[]
7 subject: string 7 subject: string
8 text: string 8 text: string
9 from?: string
9} 10}
10 11
11async function processEmail (job: Bull.Job) { 12async function processEmail (job: Bull.Job) {
12 const payload = job.data as EmailPayload 13 const payload = job.data as EmailPayload
13 logger.info('Processing email in job %d.', job.id) 14 logger.info('Processing email in job %d.', job.id)
14 15
15 return Emailer.Instance.sendMail(payload.to, payload.subject, payload.text) 16 return Emailer.Instance.sendMail(payload.to, payload.subject, payload.text, payload.from)
16} 17}
17 18
18// --------------------------------------------------------------------------- 19// ---------------------------------------------------------------------------
diff --git a/server/lib/job-queue/handlers/utils/activitypub-http-utils.ts b/server/lib/job-queue/handlers/utils/activitypub-http-utils.ts
index 36092665e..4961d4502 100644
--- a/server/lib/job-queue/handlers/utils/activitypub-http-utils.ts
+++ b/server/lib/job-queue/handlers/utils/activitypub-http-utils.ts
@@ -1,8 +1,12 @@
1import { buildSignedActivity } from '../../../../helpers/activitypub' 1import { buildSignedActivity } from '../../../../helpers/activitypub'
2import { getServerActor } from '../../../../helpers/utils' 2import { getServerActor } from '../../../../helpers/utils'
3import { ActorModel } from '../../../../models/activitypub/actor' 3import { ActorModel } from '../../../../models/activitypub/actor'
4import { sha256 } from '../../../../helpers/core-utils'
5import { HTTP_SIGNATURE } from '../../../../initializers'
4 6
5async function computeBody (payload: { body: any, signatureActorId?: number }) { 7type Payload = { body: any, signatureActorId?: number }
8
9async function computeBody (payload: Payload) {
6 let body = payload.body 10 let body = payload.body
7 11
8 if (payload.signatureActorId) { 12 if (payload.signatureActorId) {
@@ -14,7 +18,7 @@ async function computeBody (payload: { body: any, signatureActorId?: number }) {
14 return body 18 return body
15} 19}
16 20
17async function buildSignedRequestOptions (payload: { signatureActorId?: number }) { 21async function buildSignedRequestOptions (payload: Payload) {
18 let actor: ActorModel | null 22 let actor: ActorModel | null
19 if (payload.signatureActorId) { 23 if (payload.signatureActorId) {
20 actor = await ActorModel.load(payload.signatureActorId) 24 actor = await ActorModel.load(payload.signatureActorId)
@@ -26,14 +30,29 @@ async function buildSignedRequestOptions (payload: { signatureActorId?: number }
26 30
27 const keyId = actor.getWebfingerUrl() 31 const keyId = actor.getWebfingerUrl()
28 return { 32 return {
29 algorithm: 'rsa-sha256', 33 algorithm: HTTP_SIGNATURE.ALGORITHM,
30 authorizationHeaderName: 'Signature', 34 authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME,
31 keyId, 35 keyId,
32 key: actor.privateKey 36 key: actor.privateKey,
37 headers: HTTP_SIGNATURE.HEADERS_TO_SIGN
38 }
39}
40
41function buildGlobalHeaders (body: any) {
42 return {
43 'Digest': buildDigest(body)
33 } 44 }
34} 45}
35 46
47function buildDigest (body: any) {
48 const rawBody = typeof body === 'string' ? body : JSON.stringify(body)
49
50 return 'SHA-256=' + sha256(rawBody, 'base64')
51}
52
36export { 53export {
54 buildDigest,
55 buildGlobalHeaders,
37 computeBody, 56 computeBody,
38 buildSignedRequestOptions 57 buildSignedRequestOptions
39} 58}
diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts
index 1463c93fc..04983155c 100644
--- a/server/lib/job-queue/handlers/video-file.ts
+++ b/server/lib/job-queue/handlers/video-file.ts
@@ -5,16 +5,18 @@ import { VideoModel } from '../../../models/video/video'
5import { JobQueue } from '../job-queue' 5import { JobQueue } from '../job-queue'
6import { federateVideoIfNeeded } from '../../activitypub' 6import { federateVideoIfNeeded } from '../../activitypub'
7import { retryTransactionWrapper } from '../../../helpers/database-utils' 7import { retryTransactionWrapper } from '../../../helpers/database-utils'
8import { sequelizeTypescript } from '../../../initializers' 8import { sequelizeTypescript, CONFIG } from '../../../initializers'
9import * as Bluebird from 'bluebird' 9import * as Bluebird from 'bluebird'
10import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils' 10import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils'
11import { importVideoFile, transcodeOriginalVideofile, optimizeOriginalVideofile } from '../../video-transcoding' 11import { generateHlsPlaylist, importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding'
12import { Notifier } from '../../notifier'
12 13
13export type VideoFilePayload = { 14export type VideoFilePayload = {
14 videoUUID: string 15 videoUUID: string
15 isNewVideo?: boolean
16 resolution?: VideoResolution 16 resolution?: VideoResolution
17 isNewVideo?: boolean
17 isPortraitMode?: boolean 18 isPortraitMode?: boolean
19 generateHlsPlaylist?: boolean
18} 20}
19 21
20export type VideoFileImportPayload = { 22export type VideoFileImportPayload = {
@@ -50,34 +52,51 @@ async function processVideoFile (job: Bull.Job) {
50 return undefined 52 return undefined
51 } 53 }
52 54
53 // Transcoding in other resolution 55 if (payload.generateHlsPlaylist) {
54 if (payload.resolution) { 56 await generateHlsPlaylist(video, payload.resolution, payload.isPortraitMode || false)
57
58 await retryTransactionWrapper(onHlsPlaylistGenerationSuccess, video)
59 } else if (payload.resolution) { // Transcoding in other resolution
55 await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false) 60 await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false)
56 61
57 await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video) 62 await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video, payload)
58 } else { 63 } else {
59 await optimizeOriginalVideofile(video) 64 await optimizeVideofile(video)
60 65
61 await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload.isNewVideo) 66 await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload)
62 } 67 }
63 68
64 return video 69 return video
65} 70}
66 71
67async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) { 72async function onHlsPlaylistGenerationSuccess (video: VideoModel) {
73 if (video === undefined) return undefined
74
75 await sequelizeTypescript.transaction(async t => {
76 // Maybe the video changed in database, refresh it
77 let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
78 // Video does not exist anymore
79 if (!videoDatabase) return undefined
80
81 // If the video was not published, we consider it is a new one for other instances
82 await federateVideoIfNeeded(videoDatabase, false, t)
83 })
84}
85
86async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload?: VideoFilePayload) {
68 if (video === undefined) return undefined 87 if (video === undefined) return undefined
69 88
70 return sequelizeTypescript.transaction(async t => { 89 const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => {
71 // Maybe the video changed in database, refresh it 90 // Maybe the video changed in database, refresh it
72 let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) 91 let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
73 // Video does not exist anymore 92 // Video does not exist anymore
74 if (!videoDatabase) return undefined 93 if (!videoDatabase) return undefined
75 94
76 let isNewVideo = false 95 let videoPublished = false
77 96
78 // We transcoded the video file in another format, now we can publish it 97 // We transcoded the video file in another format, now we can publish it
79 if (videoDatabase.state !== VideoState.PUBLISHED) { 98 if (videoDatabase.state !== VideoState.PUBLISHED) {
80 isNewVideo = true 99 videoPublished = true
81 100
82 videoDatabase.state = VideoState.PUBLISHED 101 videoDatabase.state = VideoState.PUBLISHED
83 videoDatabase.publishedAt = new Date() 102 videoDatabase.publishedAt = new Date()
@@ -85,21 +104,29 @@ async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) {
85 } 104 }
86 105
87 // If the video was not published, we consider it is a new one for other instances 106 // If the video was not published, we consider it is a new one for other instances
88 await federateVideoIfNeeded(videoDatabase, isNewVideo, t) 107 await federateVideoIfNeeded(videoDatabase, videoPublished, t)
89 108
90 return undefined 109 return { videoDatabase, videoPublished }
91 }) 110 })
111
112 // don't notify prior to scheduled video update
113 if (videoPublished && !videoDatabase.ScheduleVideoUpdate) {
114 Notifier.Instance.notifyOnNewVideo(videoDatabase)
115 Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
116 }
117
118 await createHlsJobIfEnabled(payload)
92} 119}
93 120
94async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boolean) { 121async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: VideoFilePayload) {
95 if (video === undefined) return undefined 122 if (videoArg === undefined) return undefined
96 123
97 // Outside the transaction (IO on disk) 124 // Outside the transaction (IO on disk)
98 const { videoFileResolution } = await video.getOriginalFileResolution() 125 const { videoFileResolution } = await videoArg.getOriginalFileResolution()
99 126
100 return sequelizeTypescript.transaction(async t => { 127 const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => {
101 // Maybe the video changed in database, refresh it 128 // Maybe the video changed in database, refresh it
102 const videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) 129 let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoArg.uuid, t)
103 // Video does not exist anymore 130 // Video does not exist anymore
104 if (!videoDatabase) return undefined 131 if (!videoDatabase) return undefined
105 132
@@ -110,8 +137,10 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole
110 { resolutions: resolutionsEnabled } 137 { resolutions: resolutionsEnabled }
111 ) 138 )
112 139
140 let videoPublished = false
141
113 if (resolutionsEnabled.length !== 0) { 142 if (resolutionsEnabled.length !== 0) {
114 const tasks: Bluebird<any>[] = [] 143 const tasks: Bluebird<Bull.Job<any>>[] = []
115 144
116 for (const resolution of resolutionsEnabled) { 145 for (const resolution of resolutionsEnabled) {
117 const dataInput = { 146 const dataInput = {
@@ -127,15 +156,27 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole
127 156
128 logger.info('Transcoding jobs created for uuid %s.', videoDatabase.uuid, { resolutionsEnabled }) 157 logger.info('Transcoding jobs created for uuid %s.', videoDatabase.uuid, { resolutionsEnabled })
129 } else { 158 } else {
159 videoPublished = true
160
130 // No transcoding to do, it's now published 161 // No transcoding to do, it's now published
131 video.state = VideoState.PUBLISHED 162 videoDatabase.state = VideoState.PUBLISHED
132 video = await video.save({ transaction: t }) 163 videoDatabase = await videoDatabase.save({ transaction: t })
133 164
134 logger.info('No transcoding jobs created for video %s (no resolutions).', video.uuid) 165 logger.info('No transcoding jobs created for video %s (no resolutions).', videoDatabase.uuid, { privacy: videoDatabase.privacy })
135 } 166 }
136 167
137 return federateVideoIfNeeded(video, isNewVideo, t) 168 await federateVideoIfNeeded(videoDatabase, payload.isNewVideo, t)
169
170 return { videoDatabase, videoPublished }
138 }) 171 })
172
173 // don't notify prior to scheduled video update
174 if (!videoDatabase.ScheduleVideoUpdate) {
175 if (payload.isNewVideo) Notifier.Instance.notifyOnNewVideo(videoDatabase)
176 if (videoPublished) Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
177 }
178
179 await createHlsJobIfEnabled(Object.assign({}, payload, { resolution: videoDatabase.getOriginalFile().resolution }))
139} 180}
140 181
141// --------------------------------------------------------------------------- 182// ---------------------------------------------------------------------------
@@ -144,3 +185,20 @@ export {
144 processVideoFile, 185 processVideoFile,
145 processVideoFileImport 186 processVideoFileImport
146} 187}
188
189// ---------------------------------------------------------------------------
190
191function createHlsJobIfEnabled (payload?: VideoFilePayload) {
192 // Generate HLS playlist?
193 if (payload && CONFIG.TRANSCODING.HLS.ENABLED) {
194 const hlsTranscodingPayload = {
195 videoUUID: payload.videoUUID,
196 resolution: payload.resolution,
197 isPortraitMode: payload.isPortraitMode,
198
199 generateHlsPlaylist: true
200 }
201
202 return JobQueue.Instance.createJob({ type: 'video-file', payload: hlsTranscodingPayload })
203 }
204}
diff --git a/server/lib/job-queue/handlers/video-import.ts b/server/lib/job-queue/handlers/video-import.ts
index e3f2a276c..12004dcd7 100644
--- a/server/lib/job-queue/handlers/video-import.ts
+++ b/server/lib/job-queue/handlers/video-import.ts
@@ -6,15 +6,16 @@ import { VideoImportState } from '../../../../shared/models/videos'
6import { getDurationFromVideoFile, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' 6import { getDurationFromVideoFile, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils'
7import { extname, join } from 'path' 7import { extname, join } from 'path'
8import { VideoFileModel } from '../../../models/video/video-file' 8import { VideoFileModel } from '../../../models/video/video-file'
9import { CONFIG, sequelizeTypescript, VIDEO_IMPORT_TIMEOUT } from '../../../initializers' 9import { CONFIG, PREVIEWS_SIZE, sequelizeTypescript, THUMBNAILS_SIZE, VIDEO_IMPORT_TIMEOUT } from '../../../initializers'
10import { doRequestAndSaveToFile } from '../../../helpers/requests' 10import { downloadImage } from '../../../helpers/requests'
11import { VideoState } from '../../../../shared' 11import { VideoState } from '../../../../shared'
12import { JobQueue } from '../index' 12import { JobQueue } from '../index'
13import { federateVideoIfNeeded } from '../../activitypub' 13import { federateVideoIfNeeded } from '../../activitypub'
14import { VideoModel } from '../../../models/video/video' 14import { VideoModel } from '../../../models/video/video'
15import { downloadWebTorrentVideo } from '../../../helpers/webtorrent' 15import { downloadWebTorrentVideo } from '../../../helpers/webtorrent'
16import { getSecureTorrentName } from '../../../helpers/utils' 16import { getSecureTorrentName } from '../../../helpers/utils'
17import { remove, rename, stat } from 'fs-extra' 17import { remove, move, stat } from 'fs-extra'
18import { Notifier } from '../../notifier'
18 19
19type VideoImportYoutubeDLPayload = { 20type VideoImportYoutubeDLPayload = {
20 type: 'youtube-dl' 21 type: 'youtube-dl'
@@ -109,6 +110,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
109 let tempVideoPath: string 110 let tempVideoPath: string
110 let videoDestFile: string 111 let videoDestFile: string
111 let videoFile: VideoFileModel 112 let videoFile: VideoFileModel
113
112 try { 114 try {
113 // Download video from youtubeDL 115 // Download video from youtubeDL
114 tempVideoPath = await downloader() 116 tempVideoPath = await downloader()
@@ -133,19 +135,18 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
133 videoId: videoImport.videoId 135 videoId: videoImport.videoId
134 } 136 }
135 videoFile = new VideoFileModel(videoFileData) 137 videoFile = new VideoFileModel(videoFileData)
136 // Import if the import fails, to clean files 138 // To clean files if the import fails
137 videoImport.Video.VideoFiles = [ videoFile ] 139 videoImport.Video.VideoFiles = [ videoFile ]
138 140
139 // Move file 141 // Move file
140 videoDestFile = join(CONFIG.STORAGE.VIDEOS_DIR, videoImport.Video.getVideoFilename(videoFile)) 142 videoDestFile = join(CONFIG.STORAGE.VIDEOS_DIR, videoImport.Video.getVideoFilename(videoFile))
141 await rename(tempVideoPath, videoDestFile) 143 await move(tempVideoPath, videoDestFile)
142 tempVideoPath = null // This path is not used anymore 144 tempVideoPath = null // This path is not used anymore
143 145
144 // Process thumbnail 146 // Process thumbnail
145 if (options.downloadThumbnail) { 147 if (options.downloadThumbnail) {
146 if (options.thumbnailUrl) { 148 if (options.thumbnailUrl) {
147 const destThumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, videoImport.Video.getThumbnailName()) 149 await downloadImage(options.thumbnailUrl, CONFIG.STORAGE.THUMBNAILS_DIR, videoImport.Video.getThumbnailName(), THUMBNAILS_SIZE)
148 await doRequestAndSaveToFile({ method: 'GET', uri: options.thumbnailUrl }, destThumbnailPath)
149 } else { 150 } else {
150 await videoImport.Video.createThumbnail(videoFile) 151 await videoImport.Video.createThumbnail(videoFile)
151 } 152 }
@@ -156,8 +157,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
156 // Process preview 157 // Process preview
157 if (options.downloadPreview) { 158 if (options.downloadPreview) {
158 if (options.thumbnailUrl) { 159 if (options.thumbnailUrl) {
159 const destPreviewPath = join(CONFIG.STORAGE.PREVIEWS_DIR, videoImport.Video.getPreviewName()) 160 await downloadImage(options.thumbnailUrl, CONFIG.STORAGE.PREVIEWS_DIR, videoImport.Video.getPreviewName(), PREVIEWS_SIZE)
160 await doRequestAndSaveToFile({ method: 'GET', uri: options.thumbnailUrl }, destPreviewPath)
161 } else { 161 } else {
162 await videoImport.Video.createPreview(videoFile) 162 await videoImport.Video.createPreview(videoFile)
163 } 163 }
@@ -180,7 +180,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
180 // Update video DB object 180 // Update video DB object
181 video.duration = duration 181 video.duration = duration
182 video.state = CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED 182 video.state = CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED
183 const videoUpdated = await video.save({ transaction: t }) 183 await video.save({ transaction: t })
184 184
185 // Now we can federate the video (reload from database, we need more attributes) 185 // Now we can federate the video (reload from database, we need more attributes)
186 const videoForFederation = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t) 186 const videoForFederation = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
@@ -192,10 +192,13 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
192 192
193 logger.info('Video %s imported.', video.uuid) 193 logger.info('Video %s imported.', video.uuid)
194 194
195 videoImportUpdated.Video = videoUpdated 195 videoImportUpdated.Video = videoForFederation
196 return videoImportUpdated 196 return videoImportUpdated
197 }) 197 })
198 198
199 Notifier.Instance.notifyOnNewVideo(videoImportUpdated.Video)
200 Notifier.Instance.notifyOnFinishedVideoImport(videoImportUpdated, true)
201
199 // Create transcoding jobs? 202 // Create transcoding jobs?
200 if (videoImportUpdated.Video.state === VideoState.TO_TRANSCODE) { 203 if (videoImportUpdated.Video.state === VideoState.TO_TRANSCODE) {
201 // Put uuid because we don't have id auto incremented for now 204 // Put uuid because we don't have id auto incremented for now
@@ -218,6 +221,8 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide
218 videoImport.state = VideoImportState.FAILED 221 videoImport.state = VideoImportState.FAILED
219 await videoImport.save() 222 await videoImport.save()
220 223
224 Notifier.Instance.notifyOnFinishedVideoImport(videoImport, false)
225
221 throw err 226 throw err
222 } 227 }
223} 228}
diff --git a/server/lib/job-queue/handlers/video-views.ts b/server/lib/job-queue/handlers/video-views.ts
index cf180a11a..fa1fd13b3 100644
--- a/server/lib/job-queue/handlers/video-views.ts
+++ b/server/lib/job-queue/handlers/video-views.ts
@@ -3,8 +3,9 @@ import { logger } from '../../../helpers/logger'
3import { VideoModel } from '../../../models/video/video' 3import { VideoModel } from '../../../models/video/video'
4import { VideoViewModel } from '../../../models/video/video-views' 4import { VideoViewModel } from '../../../models/video/video-views'
5import { isTestInstance } from '../../../helpers/core-utils' 5import { isTestInstance } from '../../../helpers/core-utils'
6import { federateVideoIfNeeded } from '../../activitypub'
6 7
7async function processVideosViewsViews () { 8async function processVideosViews () {
8 const lastHour = new Date() 9 const lastHour = new Date()
9 10
10 // In test mode, we run this function multiple times per hour, so we don't want the values of the previous hour 11 // In test mode, we run this function multiple times per hour, so we don't want the values of the previous hour
@@ -22,13 +23,9 @@ async function processVideosViewsViews () {
22 for (const videoId of videoIds) { 23 for (const videoId of videoIds) {
23 try { 24 try {
24 const views = await Redis.Instance.getVideoViews(videoId, hour) 25 const views = await Redis.Instance.getVideoViews(videoId, hour)
25 if (isNaN(views)) { 26 if (views) {
26 logger.error('Cannot process videos views of video %d in hour %d: views number is NaN.', videoId, hour)
27 } else {
28 logger.debug('Adding %d views to video %d in hour %d.', views, videoId, hour) 27 logger.debug('Adding %d views to video %d in hour %d.', views, videoId, hour)
29 28
30 await VideoModel.incrementViews(videoId, views)
31
32 try { 29 try {
33 await VideoViewModel.create({ 30 await VideoViewModel.create({
34 startDate, 31 startDate,
@@ -36,6 +33,16 @@ async function processVideosViewsViews () {
36 views, 33 views,
37 videoId 34 videoId
38 }) 35 })
36
37 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
38 if (video.isOwned()) {
39 // If this is a remote video, the origin instance will send us an update
40 await VideoModel.incrementViews(videoId, views)
41
42 // Send video update
43 video.views += views
44 await federateVideoIfNeeded(video, false)
45 }
39 } catch (err) { 46 } catch (err) {
40 logger.debug('Cannot create video views for video %d in hour %d. Maybe the video does not exist anymore?', videoId, hour) 47 logger.debug('Cannot create video views for video %d in hour %d. Maybe the video does not exist anymore?', videoId, hour)
41 } 48 }
@@ -51,5 +58,5 @@ async function processVideosViewsViews () {
51// --------------------------------------------------------------------------- 58// ---------------------------------------------------------------------------
52 59
53export { 60export {
54 processVideosViewsViews 61 processVideosViews
55} 62}
diff --git a/server/lib/job-queue/job-queue.ts b/server/lib/job-queue/job-queue.ts
index 0696ba43c..ba9cbe0d9 100644
--- a/server/lib/job-queue/job-queue.ts
+++ b/server/lib/job-queue/job-queue.ts
@@ -10,7 +10,8 @@ import { EmailPayload, processEmail } from './handlers/email'
10import { processVideoFile, processVideoFileImport, VideoFileImportPayload, VideoFilePayload } from './handlers/video-file' 10import { processVideoFile, processVideoFileImport, VideoFileImportPayload, VideoFilePayload } from './handlers/video-file'
11import { ActivitypubFollowPayload, processActivityPubFollow } from './handlers/activitypub-follow' 11import { ActivitypubFollowPayload, processActivityPubFollow } from './handlers/activitypub-follow'
12import { processVideoImport, VideoImportPayload } from './handlers/video-import' 12import { processVideoImport, VideoImportPayload } from './handlers/video-import'
13import { processVideosViewsViews } from './handlers/video-views' 13import { processVideosViews } from './handlers/video-views'
14import { refreshAPObject, RefreshPayload } from './handlers/activitypub-refresher'
14 15
15type CreateJobArgument = 16type CreateJobArgument =
16 { type: 'activitypub-http-broadcast', payload: ActivitypubHttpBroadcastPayload } | 17 { type: 'activitypub-http-broadcast', payload: ActivitypubHttpBroadcastPayload } |
@@ -21,6 +22,7 @@ type CreateJobArgument =
21 { type: 'video-file', payload: VideoFilePayload } | 22 { type: 'video-file', payload: VideoFilePayload } |
22 { type: 'email', payload: EmailPayload } | 23 { type: 'email', payload: EmailPayload } |
23 { type: 'video-import', payload: VideoImportPayload } | 24 { type: 'video-import', payload: VideoImportPayload } |
25 { type: 'activitypub-refresher', payload: RefreshPayload } |
24 { type: 'videos-views', payload: {} } 26 { type: 'videos-views', payload: {} }
25 27
26const handlers: { [ id in JobType ]: (job: Bull.Job) => Promise<any>} = { 28const handlers: { [ id in JobType ]: (job: Bull.Job) => Promise<any>} = {
@@ -32,7 +34,8 @@ const handlers: { [ id in JobType ]: (job: Bull.Job) => Promise<any>} = {
32 'video-file': processVideoFile, 34 'video-file': processVideoFile,
33 'email': processEmail, 35 'email': processEmail,
34 'video-import': processVideoImport, 36 'video-import': processVideoImport,
35 'videos-views': processVideosViewsViews 37 'videos-views': processVideosViews,
38 'activitypub-refresher': refreshAPObject
36} 39}
37 40
38const jobTypes: JobType[] = [ 41const jobTypes: JobType[] = [
@@ -44,7 +47,8 @@ const jobTypes: JobType[] = [
44 'video-file', 47 'video-file',
45 'video-file-import', 48 'video-file-import',
46 'video-import', 49 'video-import',
47 'videos-views' 50 'videos-views',
51 'activitypub-refresher'
48] 52]
49 53
50class JobQueue { 54class JobQueue {
@@ -84,7 +88,6 @@ class JobQueue {
84 88
85 queue.on('error', err => { 89 queue.on('error', err => {
86 logger.error('Error in job queue %s.', handlerName, { err }) 90 logger.error('Error in job queue %s.', handlerName, { err })
87 process.exit(-1)
88 }) 91 })
89 92
90 this.queues[handlerName] = queue 93 this.queues[handlerName] = queue
@@ -162,10 +165,10 @@ class JobQueue {
162 return total 165 return total
163 } 166 }
164 167
165 removeOldJobs () { 168 async removeOldJobs () {
166 for (const key of Object.keys(this.queues)) { 169 for (const key of Object.keys(this.queues)) {
167 const queue = this.queues[key] 170 const queue = this.queues[key]
168 queue.clean(JOB_COMPLETED_LIFETIME, 'completed') 171 await queue.clean(JOB_COMPLETED_LIFETIME, 'completed')
169 } 172 }
170 } 173 }
171 174
diff --git a/server/lib/notifier.ts b/server/lib/notifier.ts
new file mode 100644
index 000000000..d1b331346
--- /dev/null
+++ b/server/lib/notifier.ts
@@ -0,0 +1,455 @@
1import { UserNotificationSettingValue, UserNotificationType, UserRight } from '../../shared/models/users'
2import { logger } from '../helpers/logger'
3import { VideoModel } from '../models/video/video'
4import { Emailer } from './emailer'
5import { UserNotificationModel } from '../models/account/user-notification'
6import { VideoCommentModel } from '../models/video/video-comment'
7import { UserModel } from '../models/account/user'
8import { PeerTubeSocket } from './peertube-socket'
9import { CONFIG } from '../initializers/constants'
10import { VideoPrivacy, VideoState } from '../../shared/models/videos'
11import { VideoAbuseModel } from '../models/video/video-abuse'
12import { VideoBlacklistModel } from '../models/video/video-blacklist'
13import * as Bluebird from 'bluebird'
14import { VideoImportModel } from '../models/video/video-import'
15import { AccountBlocklistModel } from '../models/account/account-blocklist'
16import { ActorFollowModel } from '../models/activitypub/actor-follow'
17import { AccountModel } from '../models/account/account'
18
19class Notifier {
20
21 private static instance: Notifier
22
23 private constructor () {}
24
25 notifyOnNewVideo (video: VideoModel): void {
26 // Only notify on public and published videos
27 if (video.privacy !== VideoPrivacy.PUBLIC || video.state !== VideoState.PUBLISHED) return
28
29 this.notifySubscribersOfNewVideo(video)
30 .catch(err => logger.error('Cannot notify subscribers of new video %s.', video.url, { err }))
31 }
32
33 notifyOnPendingVideoPublished (video: VideoModel): void {
34 // Only notify on public videos that has been published while the user waited transcoding/scheduled update
35 if (video.waitTranscoding === false && !video.ScheduleVideoUpdate) return
36
37 this.notifyOwnedVideoHasBeenPublished(video)
38 .catch(err => logger.error('Cannot notify owner that its video %s has been published.', video.url, { err }))
39 }
40
41 notifyOnNewComment (comment: VideoCommentModel): void {
42 this.notifyVideoOwnerOfNewComment(comment)
43 .catch(err => logger.error('Cannot notify video owner of new comment %s.', comment.url, { err }))
44
45 this.notifyOfCommentMention(comment)
46 .catch(err => logger.error('Cannot notify mentions of comment %s.', comment.url, { err }))
47 }
48
49 notifyOnNewVideoAbuse (videoAbuse: VideoAbuseModel): void {
50 this.notifyModeratorsOfNewVideoAbuse(videoAbuse)
51 .catch(err => logger.error('Cannot notify of new video abuse of video %s.', videoAbuse.Video.url, { err }))
52 }
53
54 notifyOnVideoBlacklist (videoBlacklist: VideoBlacklistModel): void {
55 this.notifyVideoOwnerOfBlacklist(videoBlacklist)
56 .catch(err => logger.error('Cannot notify video owner of new video blacklist of %s.', videoBlacklist.Video.url, { err }))
57 }
58
59 notifyOnVideoUnblacklist (video: VideoModel): void {
60 this.notifyVideoOwnerOfUnblacklist(video)
61 .catch(err => logger.error('Cannot notify video owner of new video blacklist of %s.', video.url, { err }))
62 }
63
64 notifyOnFinishedVideoImport (videoImport: VideoImportModel, success: boolean): void {
65 this.notifyOwnerVideoImportIsFinished(videoImport, success)
66 .catch(err => logger.error('Cannot notify owner that its video import %s is finished.', videoImport.getTargetIdentifier(), { err }))
67 }
68
69 notifyOnNewUserRegistration (user: UserModel): void {
70 this.notifyModeratorsOfNewUserRegistration(user)
71 .catch(err => logger.error('Cannot notify moderators of new user registration (%s).', user.username, { err }))
72 }
73
74 notifyOfNewFollow (actorFollow: ActorFollowModel): void {
75 this.notifyUserOfNewActorFollow(actorFollow)
76 .catch(err => {
77 logger.error(
78 'Cannot notify owner of channel %s of a new follow by %s.',
79 actorFollow.ActorFollowing.VideoChannel.getDisplayName(),
80 actorFollow.ActorFollower.Account.getDisplayName(),
81 err
82 )
83 })
84 }
85
86 private async notifySubscribersOfNewVideo (video: VideoModel) {
87 // List all followers that are users
88 const users = await UserModel.listUserSubscribersOf(video.VideoChannel.actorId)
89
90 logger.info('Notifying %d users of new video %s.', users.length, video.url)
91
92 function settingGetter (user: UserModel) {
93 return user.NotificationSetting.newVideoFromSubscription
94 }
95
96 async function notificationCreator (user: UserModel) {
97 const notification = await UserNotificationModel.create({
98 type: UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION,
99 userId: user.id,
100 videoId: video.id
101 })
102 notification.Video = video
103
104 return notification
105 }
106
107 function emailSender (emails: string[]) {
108 return Emailer.Instance.addNewVideoFromSubscriberNotification(emails, video)
109 }
110
111 return this.notify({ users, settingGetter, notificationCreator, emailSender })
112 }
113
114 private async notifyVideoOwnerOfNewComment (comment: VideoCommentModel) {
115 if (comment.Video.isOwned() === false) return
116
117 const user = await UserModel.loadByVideoId(comment.videoId)
118
119 // Not our user or user comments its own video
120 if (!user || comment.Account.userId === user.id) return
121
122 const accountMuted = await AccountBlocklistModel.isAccountMutedBy(user.Account.id, comment.accountId)
123 if (accountMuted) return
124
125 logger.info('Notifying user %s of new comment %s.', user.username, comment.url)
126
127 function settingGetter (user: UserModel) {
128 return user.NotificationSetting.newCommentOnMyVideo
129 }
130
131 async function notificationCreator (user: UserModel) {
132 const notification = await UserNotificationModel.create({
133 type: UserNotificationType.NEW_COMMENT_ON_MY_VIDEO,
134 userId: user.id,
135 commentId: comment.id
136 })
137 notification.Comment = comment
138
139 return notification
140 }
141
142 function emailSender (emails: string[]) {
143 return Emailer.Instance.addNewCommentOnMyVideoNotification(emails, comment)
144 }
145
146 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
147 }
148
149 private async notifyOfCommentMention (comment: VideoCommentModel) {
150 const usernames = comment.extractMentions()
151 let users = await UserModel.listByUsernames(usernames)
152
153 if (comment.Video.isOwned()) {
154 const userException = await UserModel.loadByVideoId(comment.videoId)
155 users = users.filter(u => u.id !== userException.id)
156 }
157
158 // Don't notify if I mentioned myself
159 users = users.filter(u => u.Account.id !== comment.accountId)
160
161 if (users.length === 0) return
162
163 const accountMutedHash = await AccountBlocklistModel.isAccountMutedByMulti(users.map(u => u.Account.id), comment.accountId)
164
165 logger.info('Notifying %d users of new comment %s.', users.length, comment.url)
166
167 function settingGetter (user: UserModel) {
168 if (accountMutedHash[user.Account.id] === true) return UserNotificationSettingValue.NONE
169
170 return user.NotificationSetting.commentMention
171 }
172
173 async function notificationCreator (user: UserModel) {
174 const notification = await UserNotificationModel.create({
175 type: UserNotificationType.COMMENT_MENTION,
176 userId: user.id,
177 commentId: comment.id
178 })
179 notification.Comment = comment
180
181 return notification
182 }
183
184 function emailSender (emails: string[]) {
185 return Emailer.Instance.addNewCommentMentionNotification(emails, comment)
186 }
187
188 return this.notify({ users, settingGetter, notificationCreator, emailSender })
189 }
190
191 private async notifyUserOfNewActorFollow (actorFollow: ActorFollowModel) {
192 if (actorFollow.ActorFollowing.isOwned() === false) return
193
194 // Account follows one of our account?
195 let followType: 'account' | 'channel' = 'channel'
196 let user = await UserModel.loadByChannelActorId(actorFollow.ActorFollowing.id)
197
198 // Account follows one of our channel?
199 if (!user) {
200 user = await UserModel.loadByAccountActorId(actorFollow.ActorFollowing.id)
201 followType = 'account'
202 }
203
204 if (!user) return
205
206 if (!actorFollow.ActorFollower.Account || !actorFollow.ActorFollower.Account.name) {
207 actorFollow.ActorFollower.Account = await actorFollow.ActorFollower.$get('Account') as AccountModel
208 }
209 const followerAccount = actorFollow.ActorFollower.Account
210
211 const accountMuted = await AccountBlocklistModel.isAccountMutedBy(user.Account.id, followerAccount.id)
212 if (accountMuted) return
213
214 logger.info('Notifying user %s of new follower: %s.', user.username, followerAccount.getDisplayName())
215
216 function settingGetter (user: UserModel) {
217 return user.NotificationSetting.newFollow
218 }
219
220 async function notificationCreator (user: UserModel) {
221 const notification = await UserNotificationModel.create({
222 type: UserNotificationType.NEW_FOLLOW,
223 userId: user.id,
224 actorFollowId: actorFollow.id
225 })
226 notification.ActorFollow = actorFollow
227
228 return notification
229 }
230
231 function emailSender (emails: string[]) {
232 return Emailer.Instance.addNewFollowNotification(emails, actorFollow, followType)
233 }
234
235 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
236 }
237
238 private async notifyModeratorsOfNewVideoAbuse (videoAbuse: VideoAbuseModel) {
239 const moderators = await UserModel.listWithRight(UserRight.MANAGE_VIDEO_ABUSES)
240 if (moderators.length === 0) return
241
242 logger.info('Notifying %s user/moderators of new video abuse %s.', moderators.length, videoAbuse.Video.url)
243
244 function settingGetter (user: UserModel) {
245 return user.NotificationSetting.videoAbuseAsModerator
246 }
247
248 async function notificationCreator (user: UserModel) {
249 const notification = await UserNotificationModel.create({
250 type: UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS,
251 userId: user.id,
252 videoAbuseId: videoAbuse.id
253 })
254 notification.VideoAbuse = videoAbuse
255
256 return notification
257 }
258
259 function emailSender (emails: string[]) {
260 return Emailer.Instance.addVideoAbuseModeratorsNotification(emails, videoAbuse)
261 }
262
263 return this.notify({ users: moderators, settingGetter, notificationCreator, emailSender })
264 }
265
266 private async notifyVideoOwnerOfBlacklist (videoBlacklist: VideoBlacklistModel) {
267 const user = await UserModel.loadByVideoId(videoBlacklist.videoId)
268 if (!user) return
269
270 logger.info('Notifying user %s that its video %s has been blacklisted.', user.username, videoBlacklist.Video.url)
271
272 function settingGetter (user: UserModel) {
273 return user.NotificationSetting.blacklistOnMyVideo
274 }
275
276 async function notificationCreator (user: UserModel) {
277 const notification = await UserNotificationModel.create({
278 type: UserNotificationType.BLACKLIST_ON_MY_VIDEO,
279 userId: user.id,
280 videoBlacklistId: videoBlacklist.id
281 })
282 notification.VideoBlacklist = videoBlacklist
283
284 return notification
285 }
286
287 function emailSender (emails: string[]) {
288 return Emailer.Instance.addVideoBlacklistNotification(emails, videoBlacklist)
289 }
290
291 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
292 }
293
294 private async notifyVideoOwnerOfUnblacklist (video: VideoModel) {
295 const user = await UserModel.loadByVideoId(video.id)
296 if (!user) return
297
298 logger.info('Notifying user %s that its video %s has been unblacklisted.', user.username, video.url)
299
300 function settingGetter (user: UserModel) {
301 return user.NotificationSetting.blacklistOnMyVideo
302 }
303
304 async function notificationCreator (user: UserModel) {
305 const notification = await UserNotificationModel.create({
306 type: UserNotificationType.UNBLACKLIST_ON_MY_VIDEO,
307 userId: user.id,
308 videoId: video.id
309 })
310 notification.Video = video
311
312 return notification
313 }
314
315 function emailSender (emails: string[]) {
316 return Emailer.Instance.addVideoUnblacklistNotification(emails, video)
317 }
318
319 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
320 }
321
322 private async notifyOwnedVideoHasBeenPublished (video: VideoModel) {
323 const user = await UserModel.loadByVideoId(video.id)
324 if (!user) return
325
326 logger.info('Notifying user %s of the publication of its video %s.', user.username, video.url)
327
328 function settingGetter (user: UserModel) {
329 return user.NotificationSetting.myVideoPublished
330 }
331
332 async function notificationCreator (user: UserModel) {
333 const notification = await UserNotificationModel.create({
334 type: UserNotificationType.MY_VIDEO_PUBLISHED,
335 userId: user.id,
336 videoId: video.id
337 })
338 notification.Video = video
339
340 return notification
341 }
342
343 function emailSender (emails: string[]) {
344 return Emailer.Instance.myVideoPublishedNotification(emails, video)
345 }
346
347 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
348 }
349
350 private async notifyOwnerVideoImportIsFinished (videoImport: VideoImportModel, success: boolean) {
351 const user = await UserModel.loadByVideoImportId(videoImport.id)
352 if (!user) return
353
354 logger.info('Notifying user %s its video import %s is finished.', user.username, videoImport.getTargetIdentifier())
355
356 function settingGetter (user: UserModel) {
357 return user.NotificationSetting.myVideoImportFinished
358 }
359
360 async function notificationCreator (user: UserModel) {
361 const notification = await UserNotificationModel.create({
362 type: success ? UserNotificationType.MY_VIDEO_IMPORT_SUCCESS : UserNotificationType.MY_VIDEO_IMPORT_ERROR,
363 userId: user.id,
364 videoImportId: videoImport.id
365 })
366 notification.VideoImport = videoImport
367
368 return notification
369 }
370
371 function emailSender (emails: string[]) {
372 return success
373 ? Emailer.Instance.myVideoImportSuccessNotification(emails, videoImport)
374 : Emailer.Instance.myVideoImportErrorNotification(emails, videoImport)
375 }
376
377 return this.notify({ users: [ user ], settingGetter, notificationCreator, emailSender })
378 }
379
380 private async notifyModeratorsOfNewUserRegistration (registeredUser: UserModel) {
381 const moderators = await UserModel.listWithRight(UserRight.MANAGE_USERS)
382 if (moderators.length === 0) return
383
384 logger.info(
385 'Notifying %s moderators of new user registration of %s.',
386 moderators.length, registeredUser.Account.Actor.preferredUsername
387 )
388
389 function settingGetter (user: UserModel) {
390 return user.NotificationSetting.newUserRegistration
391 }
392
393 async function notificationCreator (user: UserModel) {
394 const notification = await UserNotificationModel.create({
395 type: UserNotificationType.NEW_USER_REGISTRATION,
396 userId: user.id,
397 accountId: registeredUser.Account.id
398 })
399 notification.Account = registeredUser.Account
400
401 return notification
402 }
403
404 function emailSender (emails: string[]) {
405 return Emailer.Instance.addNewUserRegistrationNotification(emails, registeredUser)
406 }
407
408 return this.notify({ users: moderators, settingGetter, notificationCreator, emailSender })
409 }
410
411 private async notify (options: {
412 users: UserModel[],
413 notificationCreator: (user: UserModel) => Promise<UserNotificationModel>,
414 emailSender: (emails: string[]) => Promise<any> | Bluebird<any>,
415 settingGetter: (user: UserModel) => UserNotificationSettingValue
416 }) {
417 const emails: string[] = []
418
419 for (const user of options.users) {
420 if (this.isWebNotificationEnabled(options.settingGetter(user))) {
421 const notification = await options.notificationCreator(user)
422
423 PeerTubeSocket.Instance.sendNotification(user.id, notification)
424 }
425
426 if (this.isEmailEnabled(user, options.settingGetter(user))) {
427 emails.push(user.email)
428 }
429 }
430
431 if (emails.length !== 0) {
432 await options.emailSender(emails)
433 }
434 }
435
436 private isEmailEnabled (user: UserModel, value: UserNotificationSettingValue) {
437 if (CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION === true && user.emailVerified !== true) return false
438
439 return value & UserNotificationSettingValue.EMAIL
440 }
441
442 private isWebNotificationEnabled (value: UserNotificationSettingValue) {
443 return value & UserNotificationSettingValue.WEB
444 }
445
446 static get Instance () {
447 return this.instance || (this.instance = new this())
448 }
449}
450
451// ---------------------------------------------------------------------------
452
453export {
454 Notifier
455}
diff --git a/server/lib/oauth-model.ts b/server/lib/oauth-model.ts
index 5cbe60b82..2cd2ae97c 100644
--- a/server/lib/oauth-model.ts
+++ b/server/lib/oauth-model.ts
@@ -1,3 +1,4 @@
1import * as Bluebird from 'bluebird'
1import { AccessDeniedError } from 'oauth2-server' 2import { AccessDeniedError } from 'oauth2-server'
2import { logger } from '../helpers/logger' 3import { logger } from '../helpers/logger'
3import { UserModel } from '../models/account/user' 4import { UserModel } from '../models/account/user'
@@ -37,7 +38,7 @@ function clearCacheByToken (token: string) {
37function getAccessToken (bearerToken: string) { 38function getAccessToken (bearerToken: string) {
38 logger.debug('Getting access token (bearerToken: ' + bearerToken + ').') 39 logger.debug('Getting access token (bearerToken: ' + bearerToken + ').')
39 40
40 if (accessTokenCache[bearerToken] !== undefined) return accessTokenCache[bearerToken] 41 if (accessTokenCache[bearerToken] !== undefined) return Bluebird.resolve(accessTokenCache[bearerToken])
41 42
42 return OAuthTokenModel.getByTokenAndPopulateUser(bearerToken) 43 return OAuthTokenModel.getByTokenAndPopulateUser(bearerToken)
43 .then(tokenModel => { 44 .then(tokenModel => {
diff --git a/server/lib/peertube-socket.ts b/server/lib/peertube-socket.ts
new file mode 100644
index 000000000..eb84ecd4b
--- /dev/null
+++ b/server/lib/peertube-socket.ts
@@ -0,0 +1,52 @@
1import * as SocketIO from 'socket.io'
2import { authenticateSocket } from '../middlewares'
3import { UserNotificationModel } from '../models/account/user-notification'
4import { logger } from '../helpers/logger'
5import { Server } from 'http'
6
7class PeerTubeSocket {
8
9 private static instance: PeerTubeSocket
10
11 private userNotificationSockets: { [ userId: number ]: SocketIO.Socket } = {}
12
13 private constructor () {}
14
15 init (server: Server) {
16 const io = SocketIO(server)
17
18 io.of('/user-notifications')
19 .use(authenticateSocket)
20 .on('connection', socket => {
21 const userId = socket.handshake.query.user.id
22
23 logger.debug('User %d connected on the notification system.', userId)
24
25 this.userNotificationSockets[userId] = socket
26
27 socket.on('disconnect', () => {
28 logger.debug('User %d disconnected from SocketIO notifications.', userId)
29
30 delete this.userNotificationSockets[userId]
31 })
32 })
33 }
34
35 sendNotification (userId: number, notification: UserNotificationModel) {
36 const socket = this.userNotificationSockets[userId]
37
38 if (!socket) return
39
40 socket.emit('new-notification', notification.toFormattedJSON())
41 }
42
43 static get Instance () {
44 return this.instance || (this.instance = new this())
45 }
46}
47
48// ---------------------------------------------------------------------------
49
50export {
51 PeerTubeSocket
52}
diff --git a/server/lib/redis.ts b/server/lib/redis.ts
index abd75d512..3628c0583 100644
--- a/server/lib/redis.ts
+++ b/server/lib/redis.ts
@@ -2,7 +2,13 @@ import * as express from 'express'
2import { createClient, RedisClient } from 'redis' 2import { createClient, RedisClient } from 'redis'
3import { logger } from '../helpers/logger' 3import { logger } from '../helpers/logger'
4import { generateRandomString } from '../helpers/utils' 4import { generateRandomString } from '../helpers/utils'
5import { CONFIG, USER_PASSWORD_RESET_LIFETIME, USER_EMAIL_VERIFY_LIFETIME, VIDEO_VIEW_LIFETIME } from '../initializers' 5import {
6 CONFIG,
7 CONTACT_FORM_LIFETIME,
8 USER_EMAIL_VERIFY_LIFETIME,
9 USER_PASSWORD_RESET_LIFETIME,
10 VIDEO_VIEW_LIFETIME
11} from '../initializers'
6 12
7type CachedRoute = { 13type CachedRoute = {
8 body: string, 14 body: string,
@@ -76,6 +82,16 @@ class Redis {
76 return this.getValue(this.generateVerifyEmailKey(userId)) 82 return this.getValue(this.generateVerifyEmailKey(userId))
77 } 83 }
78 84
85 /************* Contact form per IP *************/
86
87 async setContactFormIp (ip: string) {
88 return this.setValue(this.generateContactFormKey(ip), '1', CONTACT_FORM_LIFETIME)
89 }
90
91 async isContactFormIpExists (ip: string) {
92 return this.exists(this.generateContactFormKey(ip))
93 }
94
79 /************* Views per IP *************/ 95 /************* Views per IP *************/
80 96
81 setIPVideoView (ip: string, videoUUID: string) { 97 setIPVideoView (ip: string, videoUUID: string) {
@@ -121,7 +137,14 @@ class Redis {
121 const key = this.generateVideoViewKey(videoId, hour) 137 const key = this.generateVideoViewKey(videoId, hour)
122 138
123 const valueString = await this.getValue(key) 139 const valueString = await this.getValue(key)
124 return parseInt(valueString, 10) 140 const valueInt = parseInt(valueString, 10)
141
142 if (isNaN(valueInt)) {
143 logger.error('Cannot get videos views of video %d in hour %d: views number is NaN (%s).', videoId, hour, valueString)
144 return undefined
145 }
146
147 return valueInt
125 } 148 }
126 149
127 async getVideosIdViewed (hour: number) { 150 async getVideosIdViewed (hour: number) {
@@ -168,7 +191,11 @@ class Redis {
168 } 191 }
169 192
170 private generateViewKey (ip: string, videoUUID: string) { 193 private generateViewKey (ip: string, videoUUID: string) {
171 return videoUUID + '-' + ip 194 return `views-${videoUUID}-${ip}`
195 }
196
197 private generateContactFormKey (ip: string) {
198 return 'contact-form-' + ip
172 } 199 }
173 200
174 /************* Redis helpers *************/ 201 /************* Redis helpers *************/
diff --git a/server/lib/schedulers/abstract-scheduler.ts b/server/lib/schedulers/abstract-scheduler.ts
index b9d0a4d17..86ea7aa38 100644
--- a/server/lib/schedulers/abstract-scheduler.ts
+++ b/server/lib/schedulers/abstract-scheduler.ts
@@ -1,8 +1,11 @@
1import { logger } from '../../helpers/logger'
2
1export abstract class AbstractScheduler { 3export abstract class AbstractScheduler {
2 4
3 protected abstract schedulerIntervalMs: number 5 protected abstract schedulerIntervalMs: number
4 6
5 private interval: NodeJS.Timer 7 private interval: NodeJS.Timer
8 private isRunning = false
6 9
7 enable () { 10 enable () {
8 if (!this.schedulerIntervalMs) throw new Error('Interval is not correctly set.') 11 if (!this.schedulerIntervalMs) throw new Error('Interval is not correctly set.')
@@ -14,5 +17,18 @@ export abstract class AbstractScheduler {
14 clearInterval(this.interval) 17 clearInterval(this.interval)
15 } 18 }
16 19
17 abstract execute () 20 async execute () {
21 if (this.isRunning === true) return
22 this.isRunning = true
23
24 try {
25 await this.internalExecute()
26 } catch (err) {
27 logger.error('Cannot execute %s scheduler.', this.constructor.name, { err })
28 } finally {
29 this.isRunning = false
30 }
31 }
32
33 protected abstract internalExecute (): Promise<any>
18} 34}
diff --git a/server/lib/schedulers/bad-actor-follow-scheduler.ts b/server/lib/schedulers/actor-follow-scheduler.ts
index 617149aaf..3967be7f8 100644
--- a/server/lib/schedulers/bad-actor-follow-scheduler.ts
+++ b/server/lib/schedulers/actor-follow-scheduler.ts
@@ -3,18 +3,35 @@ import { logger } from '../../helpers/logger'
3import { ActorFollowModel } from '../../models/activitypub/actor-follow' 3import { ActorFollowModel } from '../../models/activitypub/actor-follow'
4import { AbstractScheduler } from './abstract-scheduler' 4import { AbstractScheduler } from './abstract-scheduler'
5import { SCHEDULER_INTERVALS_MS } from '../../initializers' 5import { SCHEDULER_INTERVALS_MS } from '../../initializers'
6import { ActorFollowScoreCache } from '../cache'
6 7
7export class BadActorFollowScheduler extends AbstractScheduler { 8export class ActorFollowScheduler extends AbstractScheduler {
8 9
9 private static instance: AbstractScheduler 10 private static instance: AbstractScheduler
10 11
11 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.badActorFollow 12 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.actorFollowScores
12 13
13 private constructor () { 14 private constructor () {
14 super() 15 super()
15 } 16 }
16 17
17 async execute () { 18 protected async internalExecute () {
19 await this.processPendingScores()
20
21 await this.removeBadActorFollows()
22 }
23
24 private async processPendingScores () {
25 const pendingScores = ActorFollowScoreCache.Instance.getPendingFollowsScoreCopy()
26
27 ActorFollowScoreCache.Instance.clearPendingFollowsScore()
28
29 for (const inbox of Object.keys(pendingScores)) {
30 await ActorFollowModel.updateFollowScore(inbox, pendingScores[inbox])
31 }
32 }
33
34 private async removeBadActorFollows () {
18 if (!isTestInstance()) logger.info('Removing bad actor follows (scheduler).') 35 if (!isTestInstance()) logger.info('Removing bad actor follows (scheduler).')
19 36
20 try { 37 try {
diff --git a/server/lib/schedulers/remove-old-jobs-scheduler.ts b/server/lib/schedulers/remove-old-jobs-scheduler.ts
index a29a6b800..4a4341ba9 100644
--- a/server/lib/schedulers/remove-old-jobs-scheduler.ts
+++ b/server/lib/schedulers/remove-old-jobs-scheduler.ts
@@ -14,10 +14,10 @@ export class RemoveOldJobsScheduler extends AbstractScheduler {
14 super() 14 super()
15 } 15 }
16 16
17 async execute () { 17 protected internalExecute () {
18 if (!isTestInstance()) logger.info('Removing old jobs (scheduler).') 18 if (!isTestInstance()) logger.info('Removing old jobs in scheduler.')
19 19
20 JobQueue.Instance.removeOldJobs() 20 return JobQueue.Instance.removeOldJobs()
21 } 21 }
22 22
23 static get Instance () { 23 static get Instance () {
diff --git a/server/lib/schedulers/update-videos-scheduler.ts b/server/lib/schedulers/update-videos-scheduler.ts
index fd2edfd17..2618a5857 100644
--- a/server/lib/schedulers/update-videos-scheduler.ts
+++ b/server/lib/schedulers/update-videos-scheduler.ts
@@ -5,6 +5,8 @@ import { retryTransactionWrapper } from '../../helpers/database-utils'
5import { federateVideoIfNeeded } from '../activitypub' 5import { federateVideoIfNeeded } from '../activitypub'
6import { SCHEDULER_INTERVALS_MS, sequelizeTypescript } from '../../initializers' 6import { SCHEDULER_INTERVALS_MS, sequelizeTypescript } from '../../initializers'
7import { VideoPrivacy } from '../../../shared/models/videos' 7import { VideoPrivacy } from '../../../shared/models/videos'
8import { Notifier } from '../notifier'
9import { VideoModel } from '../../models/video/video'
8 10
9export class UpdateVideosScheduler extends AbstractScheduler { 11export class UpdateVideosScheduler extends AbstractScheduler {
10 12
@@ -12,30 +14,20 @@ export class UpdateVideosScheduler extends AbstractScheduler {
12 14
13 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.updateVideos 15 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.updateVideos
14 16
15 private isRunning = false
16
17 private constructor () { 17 private constructor () {
18 super() 18 super()
19 } 19 }
20 20
21 async execute () { 21 protected async internalExecute () {
22 if (this.isRunning === true) return 22 return retryTransactionWrapper(this.updateVideos.bind(this))
23 this.isRunning = true
24
25 try {
26 await retryTransactionWrapper(this.updateVideos.bind(this))
27 } catch (err) {
28 logger.error('Cannot execute update videos scheduler.', { err })
29 } finally {
30 this.isRunning = false
31 }
32 } 23 }
33 24
34 private async updateVideos () { 25 private async updateVideos () {
35 if (!await ScheduleVideoUpdateModel.areVideosToUpdate()) return undefined 26 if (!await ScheduleVideoUpdateModel.areVideosToUpdate()) return undefined
36 27
37 return sequelizeTypescript.transaction(async t => { 28 const publishedVideos = await sequelizeTypescript.transaction(async t => {
38 const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate(t) 29 const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate(t)
30 const publishedVideos: VideoModel[] = []
39 31
40 for (const schedule of schedules) { 32 for (const schedule of schedules) {
41 const video = schedule.Video 33 const video = schedule.Video
@@ -50,11 +42,23 @@ export class UpdateVideosScheduler extends AbstractScheduler {
50 42
51 await video.save({ transaction: t }) 43 await video.save({ transaction: t })
52 await federateVideoIfNeeded(video, isNewVideo, t) 44 await federateVideoIfNeeded(video, isNewVideo, t)
45
46 if (oldPrivacy === VideoPrivacy.UNLISTED || oldPrivacy === VideoPrivacy.PRIVATE) {
47 video.ScheduleVideoUpdate = schedule
48 publishedVideos.push(video)
49 }
53 } 50 }
54 51
55 await schedule.destroy({ transaction: t }) 52 await schedule.destroy({ transaction: t })
56 } 53 }
54
55 return publishedVideos
57 }) 56 })
57
58 for (const v of publishedVideos) {
59 Notifier.Instance.notifyOnNewVideo(v)
60 Notifier.Instance.notifyOnPendingVideoPublished(v)
61 }
58 } 62 }
59 63
60 static get Instance () { 64 static get Instance () {
diff --git a/server/lib/schedulers/videos-redundancy-scheduler.ts b/server/lib/schedulers/videos-redundancy-scheduler.ts
index c49a8c89a..1a48f2bd0 100644
--- a/server/lib/schedulers/videos-redundancy-scheduler.ts
+++ b/server/lib/schedulers/videos-redundancy-scheduler.ts
@@ -1,22 +1,31 @@
1import { AbstractScheduler } from './abstract-scheduler' 1import { AbstractScheduler } from './abstract-scheduler'
2import { CONFIG, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers' 2import { CONFIG, HLS_REDUNDANCY_DIRECTORY, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers'
3import { logger } from '../../helpers/logger' 3import { logger } from '../../helpers/logger'
4import { VideosRedundancy } from '../../../shared/models/redundancy' 4import { VideosRedundancy } from '../../../shared/models/redundancy'
5import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' 5import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
6import { VideoFileModel } from '../../models/video/video-file' 6import { VideoFileModel } from '../../models/video/video-file'
7import { downloadWebTorrentVideo } from '../../helpers/webtorrent' 7import { downloadWebTorrentVideo } from '../../helpers/webtorrent'
8import { join } from 'path' 8import { join } from 'path'
9import { rename } from 'fs-extra' 9import { move } from 'fs-extra'
10import { getServerActor } from '../../helpers/utils' 10import { getServerActor } from '../../helpers/utils'
11import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send' 11import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send'
12import { getVideoCacheFileActivityPubUrl } from '../activitypub/url' 12import { getVideoCacheFileActivityPubUrl, getVideoCacheStreamingPlaylistActivityPubUrl } from '../activitypub/url'
13import { removeVideoRedundancy } from '../redundancy' 13import { removeVideoRedundancy } from '../redundancy'
14import { getOrCreateVideoAndAccountAndChannel } from '../activitypub' 14import { getOrCreateVideoAndAccountAndChannel } from '../activitypub'
15import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
16import { VideoModel } from '../../models/video/video'
17import { downloadPlaylistSegments } from '../hls'
18
19type CandidateToDuplicate = {
20 redundancy: VideosRedundancy,
21 video: VideoModel,
22 files: VideoFileModel[],
23 streamingPlaylists: VideoStreamingPlaylistModel[]
24}
15 25
16export class VideosRedundancyScheduler extends AbstractScheduler { 26export class VideosRedundancyScheduler extends AbstractScheduler {
17 27
18 private static instance: AbstractScheduler 28 private static instance: AbstractScheduler
19 private executing = false
20 29
21 protected schedulerIntervalMs = CONFIG.REDUNDANCY.VIDEOS.CHECK_INTERVAL 30 protected schedulerIntervalMs = CONFIG.REDUNDANCY.VIDEOS.CHECK_INTERVAL
22 31
@@ -24,41 +33,39 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
24 super() 33 super()
25 } 34 }
26 35
27 async execute () { 36 protected async internalExecute () {
28 if (this.executing) return 37 for (const redundancyConfig of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) {
29 38 logger.info('Running redundancy scheduler for strategy %s.', redundancyConfig.strategy)
30 this.executing = true
31
32 for (const obj of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) {
33 logger.info('Running redundancy scheduler for strategy %s.', obj.strategy)
34 39
35 try { 40 try {
36 const videoToDuplicate = await this.findVideoToDuplicate(obj) 41 const videoToDuplicate = await this.findVideoToDuplicate(redundancyConfig)
37 if (!videoToDuplicate) continue 42 if (!videoToDuplicate) continue
38 43
39 const videoFiles = videoToDuplicate.VideoFiles 44 const candidateToDuplicate = {
40 videoFiles.forEach(f => f.Video = videoToDuplicate) 45 video: videoToDuplicate,
46 redundancy: redundancyConfig,
47 files: videoToDuplicate.VideoFiles,
48 streamingPlaylists: videoToDuplicate.VideoStreamingPlaylists
49 }
41 50
42 await this.purgeCacheIfNeeded(obj, videoFiles) 51 await this.purgeCacheIfNeeded(candidateToDuplicate)
43 52
44 if (await this.isTooHeavy(obj, videoFiles)) { 53 if (await this.isTooHeavy(candidateToDuplicate)) {
45 logger.info('Video %s is too big for our cache, skipping.', videoToDuplicate.url) 54 logger.info('Video %s is too big for our cache, skipping.', videoToDuplicate.url)
46 continue 55 continue
47 } 56 }
48 57
49 logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, obj.strategy) 58 logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, redundancyConfig.strategy)
50 59
51 await this.createVideoRedundancy(obj, videoFiles) 60 await this.createVideoRedundancies(candidateToDuplicate)
52 } catch (err) { 61 } catch (err) {
53 logger.error('Cannot run videos redundancy %s.', obj.strategy, { err }) 62 logger.error('Cannot run videos redundancy %s.', redundancyConfig.strategy, { err })
54 } 63 }
55 } 64 }
56 65
57 await this.extendsLocalExpiration() 66 await this.extendsLocalExpiration()
58 67
59 await this.purgeRemoteExpired() 68 await this.purgeRemoteExpired()
60
61 this.executing = false
62 } 69 }
63 70
64 static get Instance () { 71 static get Instance () {
@@ -70,25 +77,35 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
70 77
71 for (const redundancyModel of expired) { 78 for (const redundancyModel of expired) {
72 try { 79 try {
73 await this.extendsOrDeleteRedundancy(redundancyModel) 80 const redundancyConfig = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
81 const candidate = {
82 redundancy: redundancyConfig,
83 video: null,
84 files: [],
85 streamingPlaylists: []
86 }
87
88 // If the administrator disabled the redundancy or decreased the cache size, remove this redundancy instead of extending it
89 if (!redundancyConfig || await this.isTooHeavy(candidate)) {
90 logger.info('Destroying redundancy %s because the cache size %s is too heavy.', redundancyModel.url, redundancyModel.strategy)
91 await removeVideoRedundancy(redundancyModel)
92 } else {
93 await this.extendsRedundancy(redundancyModel)
94 }
74 } catch (err) { 95 } catch (err) {
75 logger.error('Cannot extend expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel)) 96 logger.error(
97 'Cannot extend or remove expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel),
98 { err }
99 )
76 } 100 }
77 } 101 }
78 } 102 }
79 103
80 private async extendsOrDeleteRedundancy (redundancyModel: VideoRedundancyModel) { 104 private async extendsRedundancy (redundancyModel: VideoRedundancyModel) {
81 // Refresh the video, maybe it was deleted
82 const video = await this.loadAndRefreshVideo(redundancyModel.VideoFile.Video.url)
83
84 if (!video) {
85 logger.info('Destroying existing redundancy %s, because the associated video does not exist anymore.', redundancyModel.url)
86
87 await redundancyModel.destroy()
88 return
89 }
90
91 const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy) 105 const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
106 // Redundancy strategy disabled, remove our redundancy instead of extending expiration
107 if (!redundancy) await removeVideoRedundancy(redundancyModel)
108
92 await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime) 109 await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime)
93 } 110 }
94 111
@@ -119,49 +136,93 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
119 } 136 }
120 } 137 }
121 138
122 private async createVideoRedundancy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 139 private async createVideoRedundancies (data: CandidateToDuplicate) {
123 const serverActor = await getServerActor() 140 const video = await this.loadAndRefreshVideo(data.video.url)
124 141
125 for (const file of filesToDuplicate) { 142 if (!video) {
126 const video = await this.loadAndRefreshVideo(file.Video.url) 143 logger.info('Video %s we want to duplicate does not existing anymore, skipping.', data.video.url)
127 144
145 return
146 }
147
148 for (const file of data.files) {
128 const existingRedundancy = await VideoRedundancyModel.loadLocalByFileId(file.id) 149 const existingRedundancy = await VideoRedundancyModel.loadLocalByFileId(file.id)
129 if (existingRedundancy) { 150 if (existingRedundancy) {
130 await this.extendsOrDeleteRedundancy(existingRedundancy) 151 await this.extendsRedundancy(existingRedundancy)
131 152
132 continue 153 continue
133 } 154 }
134 155
135 if (!video) { 156 await this.createVideoFileRedundancy(data.redundancy, video, file)
136 logger.info('Video %s we want to duplicate does not existing anymore, skipping.', file.Video.url) 157 }
158
159 for (const streamingPlaylist of data.streamingPlaylists) {
160 const existingRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(streamingPlaylist.id)
161 if (existingRedundancy) {
162 await this.extendsRedundancy(existingRedundancy)
137 163
138 continue 164 continue
139 } 165 }
140 166
141 logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy) 167 await this.createStreamingPlaylistRedundancy(data.redundancy, video, streamingPlaylist)
168 }
169 }
142 170
143 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls() 171 private async createVideoFileRedundancy (redundancy: VideosRedundancy, video: VideoModel, file: VideoFileModel) {
144 const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs) 172 file.Video = video
145 173
146 const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT) 174 const serverActor = await getServerActor()
147 175
148 const destPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(file)) 176 logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy)
149 await rename(tmpPath, destPath)
150 177
151 const createdModel = await VideoRedundancyModel.create({ 178 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
152 expiresOn: this.buildNewExpiration(redundancy.minLifetime), 179 const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs)
153 url: getVideoCacheFileActivityPubUrl(file),
154 fileUrl: video.getVideoFileUrl(file, CONFIG.WEBSERVER.URL),
155 strategy: redundancy.strategy,
156 videoFileId: file.id,
157 actorId: serverActor.id
158 })
159 createdModel.VideoFile = file
160 180
161 await sendCreateCacheFile(serverActor, createdModel) 181 const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT)
162 182
163 logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url) 183 const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file))
164 } 184 await move(tmpPath, destPath)
185
186 const createdModel = await VideoRedundancyModel.create({
187 expiresOn: this.buildNewExpiration(redundancy.minLifetime),
188 url: getVideoCacheFileActivityPubUrl(file),
189 fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL),
190 strategy: redundancy.strategy,
191 videoFileId: file.id,
192 actorId: serverActor.id
193 })
194
195 createdModel.VideoFile = file
196
197 await sendCreateCacheFile(serverActor, video, createdModel)
198
199 logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url)
200 }
201
202 private async createStreamingPlaylistRedundancy (redundancy: VideosRedundancy, video: VideoModel, playlist: VideoStreamingPlaylistModel) {
203 playlist.Video = video
204
205 const serverActor = await getServerActor()
206
207 logger.info('Duplicating %s streaming playlist in videos redundancy with "%s" strategy.', video.url, redundancy.strategy)
208
209 const destDirectory = join(HLS_REDUNDANCY_DIRECTORY, video.uuid)
210 await downloadPlaylistSegments(playlist.playlistUrl, destDirectory, VIDEO_IMPORT_TIMEOUT)
211
212 const createdModel = await VideoRedundancyModel.create({
213 expiresOn: this.buildNewExpiration(redundancy.minLifetime),
214 url: getVideoCacheStreamingPlaylistActivityPubUrl(video, playlist),
215 fileUrl: playlist.getVideoRedundancyUrl(CONFIG.WEBSERVER.URL),
216 strategy: redundancy.strategy,
217 videoStreamingPlaylistId: playlist.id,
218 actorId: serverActor.id
219 })
220
221 createdModel.VideoStreamingPlaylist = playlist
222
223 await sendCreateCacheFile(serverActor, video, createdModel)
224
225 logger.info('Duplicated playlist %s -> %s.', playlist.playlistUrl, createdModel.url)
165 } 226 }
166 227
167 private async extendsExpirationOf (redundancy: VideoRedundancyModel, expiresAfterMs: number) { 228 private async extendsExpirationOf (redundancy: VideoRedundancyModel, expiresAfterMs: number) {
@@ -175,8 +236,9 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
175 await sendUpdateCacheFile(serverActor, redundancy) 236 await sendUpdateCacheFile(serverActor, redundancy)
176 } 237 }
177 238
178 private async purgeCacheIfNeeded (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 239 private async purgeCacheIfNeeded (candidateToDuplicate: CandidateToDuplicate) {
179 while (this.isTooHeavy(redundancy, filesToDuplicate)) { 240 while (this.isTooHeavy(candidateToDuplicate)) {
241 const redundancy = candidateToDuplicate.redundancy
180 const toDelete = await VideoRedundancyModel.loadOldestLocalThatAlreadyExpired(redundancy.strategy, redundancy.minLifetime) 242 const toDelete = await VideoRedundancyModel.loadOldestLocalThatAlreadyExpired(redundancy.strategy, redundancy.minLifetime)
181 if (!toDelete) return 243 if (!toDelete) return
182 244
@@ -184,12 +246,13 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
184 } 246 }
185 } 247 }
186 248
187 private async isTooHeavy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 249 private async isTooHeavy (candidateToDuplicate: CandidateToDuplicate) {
188 const maxSize = redundancy.size - this.getTotalFileSizes(filesToDuplicate) 250 const maxSize = candidateToDuplicate.redundancy.size
189 251
190 const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(redundancy.strategy) 252 const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(candidateToDuplicate.redundancy.strategy)
253 const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(candidateToDuplicate.files, candidateToDuplicate.streamingPlaylists)
191 254
192 return totalDuplicated > maxSize 255 return totalWillDuplicate > maxSize
193 } 256 }
194 257
195 private buildNewExpiration (expiresAfterMs: number) { 258 private buildNewExpiration (expiresAfterMs: number) {
@@ -197,13 +260,15 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
197 } 260 }
198 261
199 private buildEntryLogId (object: VideoRedundancyModel) { 262 private buildEntryLogId (object: VideoRedundancyModel) {
200 return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}` 263 if (object.VideoFile) return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}`
264
265 return `${object.VideoStreamingPlaylist.playlistUrl}`
201 } 266 }
202 267
203 private getTotalFileSizes (files: VideoFileModel[]) { 268 private getTotalFileSizes (files: VideoFileModel[], playlists: VideoStreamingPlaylistModel[]) {
204 const fileReducer = (previous: number, current: VideoFileModel) => previous + current.size 269 const fileReducer = (previous: number, current: VideoFileModel) => previous + current.size
205 270
206 return files.reduce(fileReducer, 0) 271 return files.reduce(fileReducer, 0) * playlists.length
207 } 272 }
208 273
209 private async loadAndRefreshVideo (videoUrl: string) { 274 private async loadAndRefreshVideo (videoUrl: string) {
diff --git a/server/lib/schedulers/youtube-dl-update-scheduler.ts b/server/lib/schedulers/youtube-dl-update-scheduler.ts
index 461cd045e..aa027116d 100644
--- a/server/lib/schedulers/youtube-dl-update-scheduler.ts
+++ b/server/lib/schedulers/youtube-dl-update-scheduler.ts
@@ -12,7 +12,7 @@ export class YoutubeDlUpdateScheduler extends AbstractScheduler {
12 super() 12 super()
13 } 13 }
14 14
15 execute () { 15 protected internalExecute () {
16 return updateYoutubeDLBinary() 16 return updateYoutubeDLBinary()
17 } 17 }
18 18
diff --git a/server/lib/user.ts b/server/lib/user.ts
index db29469eb..a39ef6c3d 100644
--- a/server/lib/user.ts
+++ b/server/lib/user.ts
@@ -9,6 +9,8 @@ import { createVideoChannel } from './video-channel'
9import { VideoChannelModel } from '../models/video/video-channel' 9import { VideoChannelModel } from '../models/video/video-channel'
10import { FilteredModelAttributes } from 'sequelize-typescript/lib/models/Model' 10import { FilteredModelAttributes } from 'sequelize-typescript/lib/models/Model'
11import { ActorModel } from '../models/activitypub/actor' 11import { ActorModel } from '../models/activitypub/actor'
12import { UserNotificationSettingModel } from '../models/account/user-notification-setting'
13import { UserNotificationSetting, UserNotificationSettingValue } from '../../shared/models/users'
12 14
13async function createUserAccountAndChannel (userToCreate: UserModel, validateUser = true) { 15async function createUserAccountAndChannel (userToCreate: UserModel, validateUser = true) {
14 const { user, account, videoChannel } = await sequelizeTypescript.transaction(async t => { 16 const { user, account, videoChannel } = await sequelizeTypescript.transaction(async t => {
@@ -18,7 +20,9 @@ async function createUserAccountAndChannel (userToCreate: UserModel, validateUse
18 } 20 }
19 21
20 const userCreated = await userToCreate.save(userOptions) 22 const userCreated = await userToCreate.save(userOptions)
21 const accountCreated = await createLocalAccountWithoutKeys(userToCreate.username, userToCreate.id, null, t) 23 userCreated.NotificationSetting = await createDefaultUserNotificationSettings(userCreated, t)
24
25 const accountCreated = await createLocalAccountWithoutKeys(userCreated.username, userCreated.id, null, t)
22 userCreated.Account = accountCreated 26 userCreated.Account = accountCreated
23 27
24 let channelName = userCreated.username + '_channel' 28 let channelName = userCreated.username + '_channel'
@@ -37,8 +41,13 @@ async function createUserAccountAndChannel (userToCreate: UserModel, validateUse
37 return { user: userCreated, account: accountCreated, videoChannel } 41 return { user: userCreated, account: accountCreated, videoChannel }
38 }) 42 })
39 43
40 account.Actor = await setAsyncActorKeys(account.Actor) 44 const [ accountKeys, channelKeys ] = await Promise.all([
41 videoChannel.Actor = await setAsyncActorKeys(videoChannel.Actor) 45 setAsyncActorKeys(account.Actor),
46 setAsyncActorKeys(videoChannel.Actor)
47 ])
48
49 account.Actor = accountKeys
50 videoChannel.Actor = channelKeys
42 51
43 return { user, account, videoChannel } as { user: UserModel, account: AccountModel, videoChannel: VideoChannelModel } 52 return { user, account, videoChannel } as { user: UserModel, account: AccountModel, videoChannel: VideoChannelModel }
44} 53}
@@ -83,3 +92,22 @@ export {
83 createUserAccountAndChannel, 92 createUserAccountAndChannel,
84 createLocalAccountWithoutKeys 93 createLocalAccountWithoutKeys
85} 94}
95
96// ---------------------------------------------------------------------------
97
98function createDefaultUserNotificationSettings (user: UserModel, t: Sequelize.Transaction | undefined) {
99 const values: UserNotificationSetting & { userId: number } = {
100 userId: user.id,
101 newVideoFromSubscription: UserNotificationSettingValue.WEB,
102 newCommentOnMyVideo: UserNotificationSettingValue.WEB,
103 myVideoImportFinished: UserNotificationSettingValue.WEB,
104 myVideoPublished: UserNotificationSettingValue.WEB,
105 videoAbuseAsModerator: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
106 blacklistOnMyVideo: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
107 newUserRegistration: UserNotificationSettingValue.WEB,
108 commentMention: UserNotificationSettingValue.WEB,
109 newFollow: UserNotificationSettingValue.WEB
110 }
111
112 return UserNotificationSettingModel.create(values, { transaction: t })
113}
diff --git a/server/lib/video-comment.ts b/server/lib/video-comment.ts
index 70ba7c303..59bce7520 100644
--- a/server/lib/video-comment.ts
+++ b/server/lib/video-comment.ts
@@ -64,10 +64,8 @@ function buildFormattedCommentTree (resultList: ResultList<VideoCommentModel>):
64 } 64 }
65 65
66 const parentCommentThread = idx[childComment.inReplyToCommentId] 66 const parentCommentThread = idx[childComment.inReplyToCommentId]
67 if (!parentCommentThread) { 67 // Maybe the parent comment was blocked by the admin/user
68 const msg = `Cannot format video thread tree, parent ${childComment.inReplyToCommentId} not found for child ${childComment.id}` 68 if (!parentCommentThread) continue
69 throw new Error(msg)
70 }
71 69
72 parentCommentThread.children.push(childCommentThread) 70 parentCommentThread.children.push(childCommentThread)
73 idx[childComment.id] = childCommentThread 71 idx[childComment.id] = childCommentThread
diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts
index bf3ff78c2..086b860a2 100644
--- a/server/lib/video-transcoding.ts
+++ b/server/lib/video-transcoding.ts
@@ -1,22 +1,27 @@
1import { CONFIG } from '../initializers' 1import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
2import { join, extname } from 'path' 2import { extname, join } from 'path'
3import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils' 3import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils'
4import { copy, remove, rename, stat } from 'fs-extra' 4import { copy, ensureDir, move, remove, stat } from 'fs-extra'
5import { logger } from '../helpers/logger' 5import { logger } from '../helpers/logger'
6import { VideoResolution } from '../../shared/models/videos' 6import { VideoResolution } from '../../shared/models/videos'
7import { VideoFileModel } from '../models/video/video-file' 7import { VideoFileModel } from '../models/video/video-file'
8import { VideoModel } from '../models/video/video' 8import { VideoModel } from '../models/video/video'
9import { updateMasterHLSPlaylist, updateSha256Segments } from './hls'
10import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
11import { VideoStreamingPlaylistType } from '../../shared/models/videos/video-streaming-playlist.type'
9 12
10async function optimizeOriginalVideofile (video: VideoModel) { 13async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) {
11 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR 14 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
12 const newExtname = '.mp4' 15 const newExtname = '.mp4'
13 const inputVideoFile = video.getOriginalFile() 16
17 const inputVideoFile = inputVideoFileArg ? inputVideoFileArg : video.getOriginalFile()
14 const videoInputPath = join(videosDirectory, video.getVideoFilename(inputVideoFile)) 18 const videoInputPath = join(videosDirectory, video.getVideoFilename(inputVideoFile))
15 const videoTranscodedPath = join(videosDirectory, video.id + '-transcoded' + newExtname) 19 const videoTranscodedPath = join(videosDirectory, video.id + '-transcoded' + newExtname)
16 20
17 const transcodeOptions = { 21 const transcodeOptions = {
18 inputPath: videoInputPath, 22 inputPath: videoInputPath,
19 outputPath: videoTranscodedPath 23 outputPath: videoTranscodedPath,
24 resolution: inputVideoFile.resolution
20 } 25 }
21 26
22 // Could be very long! 27 // Could be very long!
@@ -29,7 +34,7 @@ async function optimizeOriginalVideofile (video: VideoModel) {
29 inputVideoFile.set('extname', newExtname) 34 inputVideoFile.set('extname', newExtname)
30 35
31 const videoOutputPath = video.getVideoFilePath(inputVideoFile) 36 const videoOutputPath = video.getVideoFilePath(inputVideoFile)
32 await rename(videoTranscodedPath, videoOutputPath) 37 await move(videoTranscodedPath, videoOutputPath)
33 const stats = await stat(videoOutputPath) 38 const stats = await stat(videoOutputPath)
34 const fps = await getVideoFileFPS(videoOutputPath) 39 const fps = await getVideoFileFPS(videoOutputPath)
35 40
@@ -46,7 +51,7 @@ async function optimizeOriginalVideofile (video: VideoModel) {
46 } 51 }
47} 52}
48 53
49async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) { 54async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortrait: boolean) {
50 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR 55 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
51 const extname = '.mp4' 56 const extname = '.mp4'
52 57
@@ -59,13 +64,13 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
59 size: 0, 64 size: 0,
60 videoId: video.id 65 videoId: video.id
61 }) 66 })
62 const videoOutputPath = join(videosDirectory, video.getVideoFilename(newVideoFile)) 67 const videoOutputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(newVideoFile))
63 68
64 const transcodeOptions = { 69 const transcodeOptions = {
65 inputPath: videoInputPath, 70 inputPath: videoInputPath,
66 outputPath: videoOutputPath, 71 outputPath: videoOutputPath,
67 resolution, 72 resolution,
68 isPortraitMode 73 isPortraitMode: isPortrait
69 } 74 }
70 75
71 await transcode(transcodeOptions) 76 await transcode(transcodeOptions)
@@ -83,6 +88,41 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
83 video.VideoFiles.push(newVideoFile) 88 video.VideoFiles.push(newVideoFile)
84} 89}
85 90
91async function generateHlsPlaylist (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
92 const baseHlsDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
93 await ensureDir(join(HLS_PLAYLIST_DIRECTORY, video.uuid))
94
95 const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getOriginalFile()))
96 const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
97
98 const transcodeOptions = {
99 inputPath: videoInputPath,
100 outputPath,
101 resolution,
102 isPortraitMode,
103
104 hlsPlaylist: {
105 videoFilename: VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, resolution)
106 }
107 }
108
109 await transcode(transcodeOptions)
110
111 await updateMasterHLSPlaylist(video)
112 await updateSha256Segments(video)
113
114 const playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
115
116 await VideoStreamingPlaylistModel.upsert({
117 videoId: video.id,
118 playlistUrl,
119 segmentsSha256Url: CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid),
120 p2pMediaLoaderInfohashes: VideoStreamingPlaylistModel.buildP2PMediaLoaderInfoHashes(playlistUrl, video.VideoFiles),
121
122 type: VideoStreamingPlaylistType.HLS
123 })
124}
125
86async function importVideoFile (video: VideoModel, inputFilePath: string) { 126async function importVideoFile (video: VideoModel, inputFilePath: string) {
87 const { videoFileResolution } = await getVideoFileResolution(inputFilePath) 127 const { videoFileResolution } = await getVideoFileResolution(inputFilePath)
88 const { size } = await stat(inputFilePath) 128 const { size } = await stat(inputFilePath)
@@ -124,7 +164,8 @@ async function importVideoFile (video: VideoModel, inputFilePath: string) {
124} 164}
125 165
126export { 166export {
127 optimizeOriginalVideofile, 167 generateHlsPlaylist,
168 optimizeVideofile,
128 transcodeOriginalVideofile, 169 transcodeOriginalVideofile,
129 importVideoFile 170 importVideoFile
130} 171}
diff --git a/server/middlewares/activitypub.ts b/server/middlewares/activitypub.ts
index d7f59be8c..01e5dd24e 100644
--- a/server/middlewares/activitypub.ts
+++ b/server/middlewares/activitypub.ts
@@ -2,34 +2,32 @@ import { eachSeries } from 'async'
2import { NextFunction, Request, RequestHandler, Response } from 'express' 2import { NextFunction, Request, RequestHandler, Response } from 'express'
3import { ActivityPubSignature } from '../../shared' 3import { ActivityPubSignature } from '../../shared'
4import { logger } from '../helpers/logger' 4import { logger } from '../helpers/logger'
5import { isSignatureVerified } from '../helpers/peertube-crypto' 5import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../helpers/peertube-crypto'
6import { ACCEPT_HEADERS, ACTIVITY_PUB } from '../initializers' 6import { ACCEPT_HEADERS, ACTIVITY_PUB, HTTP_SIGNATURE } from '../initializers'
7import { getOrCreateActorAndServerAndModel } from '../lib/activitypub' 7import { getOrCreateActorAndServerAndModel } from '../lib/activitypub'
8import { ActorModel } from '../models/activitypub/actor' 8import { ActorModel } from '../models/activitypub/actor'
9import { loadActorUrlOrGetFromWebfinger } from '../helpers/webfinger'
9 10
10async function checkSignature (req: Request, res: Response, next: NextFunction) { 11async function checkSignature (req: Request, res: Response, next: NextFunction) {
11 const signatureObject: ActivityPubSignature = req.body.signature 12 try {
13 const httpSignatureChecked = await checkHttpSignature(req, res)
14 if (httpSignatureChecked !== true) return
12 15
13 const [ creator ] = signatureObject.creator.split('#') 16 const actor: ActorModel = res.locals.signature.actor
14 17
15 logger.debug('Checking signature of actor %s...', creator) 18 // Forwarded activity
19 const bodyActor = req.body.actor
20 const bodyActorId = bodyActor && bodyActor.id ? bodyActor.id : bodyActor
21 if (bodyActorId && bodyActorId !== actor.url) {
22 const jsonLDSignatureChecked = await checkJsonLDSignature(req, res)
23 if (jsonLDSignatureChecked !== true) return
24 }
16 25
17 let actor: ActorModel 26 return next()
18 try {
19 actor = await getOrCreateActorAndServerAndModel(creator)
20 } catch (err) { 27 } catch (err) {
21 logger.warn('Cannot create remote actor %s and check signature.', creator, { err }) 28 logger.error('Error in ActivityPub signature checker.', err)
22 return res.sendStatus(403) 29 return res.sendStatus(403)
23 } 30 }
24
25 const verified = await isSignatureVerified(actor, req.body)
26 if (verified === false) return res.sendStatus(403)
27
28 res.locals.signature = {
29 actor
30 }
31
32 return next()
33} 31}
34 32
35function executeIfActivityPub (fun: RequestHandler | RequestHandler[]) { 33function executeIfActivityPub (fun: RequestHandler | RequestHandler[]) {
@@ -55,5 +53,66 @@ function executeIfActivityPub (fun: RequestHandler | RequestHandler[]) {
55 53
56export { 54export {
57 checkSignature, 55 checkSignature,
58 executeIfActivityPub 56 executeIfActivityPub,
57 checkHttpSignature
58}
59
60// ---------------------------------------------------------------------------
61
62async function checkHttpSignature (req: Request, res: Response) {
63 // FIXME: mastodon does not include the Signature scheme
64 const sig = req.headers[HTTP_SIGNATURE.HEADER_NAME] as string
65 if (sig && sig.startsWith('Signature ') === false) req.headers[HTTP_SIGNATURE.HEADER_NAME] = 'Signature ' + sig
66
67 const parsed = parseHTTPSignature(req)
68
69 const keyId = parsed.keyId
70 if (!keyId) {
71 res.sendStatus(403)
72 return false
73 }
74
75 logger.debug('Checking HTTP signature of actor %s...', keyId)
76
77 let [ actorUrl ] = keyId.split('#')
78 if (actorUrl.startsWith('acct:')) {
79 actorUrl = await loadActorUrlOrGetFromWebfinger(actorUrl.replace(/^acct:/, ''))
80 }
81
82 const actor = await getOrCreateActorAndServerAndModel(actorUrl)
83
84 const verified = isHTTPSignatureVerified(parsed, actor)
85 if (verified !== true) {
86 res.sendStatus(403)
87 return false
88 }
89
90 res.locals.signature = { actor }
91
92 return true
93}
94
95async function checkJsonLDSignature (req: Request, res: Response) {
96 const signatureObject: ActivityPubSignature = req.body.signature
97
98 if (!signatureObject || !signatureObject.creator) {
99 res.sendStatus(403)
100 return false
101 }
102
103 const [ creator ] = signatureObject.creator.split('#')
104
105 logger.debug('Checking JsonLD signature of actor %s...', creator)
106
107 const actor = await getOrCreateActorAndServerAndModel(creator)
108 const verified = await isJsonLDSignatureVerified(actor, req.body)
109
110 if (verified !== true) {
111 res.sendStatus(403)
112 return false
113 }
114
115 res.locals.signature = { actor }
116
117 return true
59} 118}
diff --git a/server/middlewares/cache.ts b/server/middlewares/cache.ts
index 1e00fc731..8ffe75700 100644
--- a/server/middlewares/cache.ts
+++ b/server/middlewares/cache.ts
@@ -19,6 +19,7 @@ function cacheRoute (lifetimeArg: string | number) {
19 logger.debug('No cached results for route %s.', req.originalUrl) 19 logger.debug('No cached results for route %s.', req.originalUrl)
20 20
21 const sendSave = res.send.bind(res) 21 const sendSave = res.send.bind(res)
22 const redirectSave = res.redirect.bind(res)
22 23
23 res.send = (body) => { 24 res.send = (body) => {
24 if (res.statusCode >= 200 && res.statusCode < 400) { 25 if (res.statusCode >= 200 && res.statusCode < 400) {
@@ -38,6 +39,12 @@ function cacheRoute (lifetimeArg: string | number) {
38 return sendSave(body) 39 return sendSave(body)
39 } 40 }
40 41
42 res.redirect = url => {
43 done()
44
45 return redirectSave(url)
46 }
47
41 return next() 48 return next()
42 } 49 }
43 50
diff --git a/server/middlewares/csp.ts b/server/middlewares/csp.ts
new file mode 100644
index 000000000..5fa9d1ab5
--- /dev/null
+++ b/server/middlewares/csp.ts
@@ -0,0 +1,44 @@
1import * as helmet from 'helmet'
2import { CONFIG } from '../initializers/constants'
3
4const baseDirectives = Object.assign({},
5 {
6 defaultSrc: ["'none'"], // by default, not specifying default-src = '*'
7 connectSrc: ['*', 'data:'],
8 mediaSrc: ["'self'", 'https:', 'blob:'],
9 fontSrc: ["'self'", 'data:'],
10 imgSrc: ["'self'", 'data:'],
11 scriptSrc: ["'self' 'unsafe-inline' 'unsafe-eval'"],
12 styleSrc: ["'self' 'unsafe-inline'"],
13 objectSrc: ["'none'"], // only define to allow plugins, else let defaultSrc 'none' block it
14 formAction: ["'self'"],
15 frameAncestors: ["'none'"],
16 baseUri: ["'self'"],
17 manifestSrc: ["'self'"],
18 frameSrc: ["'self'"], // instead of deprecated child-src / self because of test-embed
19 workerSrc: ["'self'", 'blob:'] // instead of deprecated child-src
20 },
21 CONFIG.SERVICES['CSP-LOGGER'] ? { reportUri: CONFIG.SERVICES['CSP-LOGGER'] } : {},
22 CONFIG.WEBSERVER.SCHEME === 'https' ? { upgradeInsecureRequests: true } : {}
23)
24
25const baseCSP = helmet.contentSecurityPolicy({
26 directives: baseDirectives,
27 browserSniff: false,
28 reportOnly: true
29})
30
31const embedCSP = helmet.contentSecurityPolicy({
32 directives: Object.assign(baseDirectives, {
33 frameAncestors: ['*']
34 }),
35 browserSniff: false, // assumes a modern browser, but allows CDN in front
36 reportOnly: true
37})
38
39// ---------------------------------------------------------------------------
40
41export {
42 baseCSP,
43 embedCSP
44}
diff --git a/server/middlewares/dnt.ts b/server/middlewares/dnt.ts
index cabad39c6..607def855 100644
--- a/server/middlewares/dnt.ts
+++ b/server/middlewares/dnt.ts
@@ -10,4 +10,4 @@ const advertiseDoNotTrack = (_, res, next) => {
10 10
11export { 11export {
12 advertiseDoNotTrack 12 advertiseDoNotTrack
13 } 13}
diff --git a/server/middlewares/index.ts b/server/middlewares/index.ts
index 0cef26953..b758a8586 100644
--- a/server/middlewares/index.ts
+++ b/server/middlewares/index.ts
@@ -6,3 +6,5 @@ export * from './pagination'
6export * from './servers' 6export * from './servers'
7export * from './sort' 7export * from './sort'
8export * from './user-right' 8export * from './user-right'
9export * from './dnt'
10export * from './csp'
diff --git a/server/middlewares/oauth.ts b/server/middlewares/oauth.ts
index 5233b66bd..1d193d467 100644
--- a/server/middlewares/oauth.ts
+++ b/server/middlewares/oauth.ts
@@ -3,6 +3,8 @@ import * as OAuthServer from 'express-oauth-server'
3import 'express-validator' 3import 'express-validator'
4import { OAUTH_LIFETIME } from '../initializers' 4import { OAUTH_LIFETIME } from '../initializers'
5import { logger } from '../helpers/logger' 5import { logger } from '../helpers/logger'
6import { Socket } from 'socket.io'
7import { getAccessToken } from '../lib/oauth-model'
6 8
7const oAuthServer = new OAuthServer({ 9const oAuthServer = new OAuthServer({
8 useErrorHandler: true, 10 useErrorHandler: true,
@@ -28,9 +30,43 @@ function authenticate (req: express.Request, res: express.Response, next: expres
28 }) 30 })
29} 31}
30 32
33function authenticateSocket (socket: Socket, next: (err?: any) => void) {
34 const accessToken = socket.handshake.query.accessToken
35
36 logger.debug('Checking socket access token %s.', accessToken)
37
38 getAccessToken(accessToken)
39 .then(tokenDB => {
40 const now = new Date()
41
42 if (!tokenDB || tokenDB.accessTokenExpiresAt < now || tokenDB.refreshTokenExpiresAt < now) {
43 return next(new Error('Invalid access token.'))
44 }
45
46 socket.handshake.query.user = tokenDB.User
47
48 return next()
49 })
50}
51
52function authenticatePromiseIfNeeded (req: express.Request, res: express.Response) {
53 return new Promise(resolve => {
54 // Already authenticated? (or tried to)
55 if (res.locals.oauth && res.locals.oauth.token.User) return resolve()
56
57 if (res.locals.authenticated === false) return res.sendStatus(401)
58
59 authenticate(req, res, () => {
60 return resolve()
61 })
62 })
63}
64
31function optionalAuthenticate (req: express.Request, res: express.Response, next: express.NextFunction) { 65function optionalAuthenticate (req: express.Request, res: express.Response, next: express.NextFunction) {
32 if (req.header('authorization')) return authenticate(req, res, next) 66 if (req.header('authorization')) return authenticate(req, res, next)
33 67
68 res.locals.authenticated = false
69
34 return next() 70 return next()
35} 71}
36 72
@@ -53,6 +89,8 @@ function token (req: express.Request, res: express.Response, next: express.NextF
53 89
54export { 90export {
55 authenticate, 91 authenticate,
92 authenticateSocket,
93 authenticatePromiseIfNeeded,
56 optionalAuthenticate, 94 optionalAuthenticate,
57 token 95 token
58} 96}
diff --git a/server/middlewares/validators/activitypub/signature.ts b/server/middlewares/validators/activitypub/signature.ts
index 4efe9aafa..be14e92ea 100644
--- a/server/middlewares/validators/activitypub/signature.ts
+++ b/server/middlewares/validators/activitypub/signature.ts
@@ -9,10 +9,18 @@ import { logger } from '../../../helpers/logger'
9import { areValidationErrors } from '../utils' 9import { areValidationErrors } from '../utils'
10 10
11const signatureValidator = [ 11const signatureValidator = [
12 body('signature.type').custom(isSignatureTypeValid).withMessage('Should have a valid signature type'), 12 body('signature.type')
13 body('signature.created').custom(isDateValid).withMessage('Should have a valid signature created date'), 13 .optional()
14 body('signature.creator').custom(isSignatureCreatorValid).withMessage('Should have a valid signature creator'), 14 .custom(isSignatureTypeValid).withMessage('Should have a valid signature type'),
15 body('signature.signatureValue').custom(isSignatureValueValid).withMessage('Should have a valid signature value'), 15 body('signature.created')
16 .optional()
17 .custom(isDateValid).withMessage('Should have a valid signature created date'),
18 body('signature.creator')
19 .optional()
20 .custom(isSignatureCreatorValid).withMessage('Should have a valid signature creator'),
21 body('signature.signatureValue')
22 .optional()
23 .custom(isSignatureValueValid).withMessage('Should have a valid signature value'),
16 24
17 (req: express.Request, res: express.Response, next: express.NextFunction) => { 25 (req: express.Request, res: express.Response, next: express.NextFunction) => {
18 logger.debug('Checking activitypub signature parameter', { parameters: { signature: req.body.signature } }) 26 logger.debug('Checking activitypub signature parameter', { parameters: { signature: req.body.signature } })
diff --git a/server/middlewares/validators/blocklist.ts b/server/middlewares/validators/blocklist.ts
new file mode 100644
index 000000000..109276c63
--- /dev/null
+++ b/server/middlewares/validators/blocklist.ts
@@ -0,0 +1,172 @@
1import { body, param } from 'express-validator/check'
2import * as express from 'express'
3import { logger } from '../../helpers/logger'
4import { areValidationErrors } from './utils'
5import { isAccountNameWithHostExist } from '../../helpers/custom-validators/accounts'
6import { UserModel } from '../../models/account/user'
7import { AccountBlocklistModel } from '../../models/account/account-blocklist'
8import { isHostValid } from '../../helpers/custom-validators/servers'
9import { ServerBlocklistModel } from '../../models/server/server-blocklist'
10import { ServerModel } from '../../models/server/server'
11import { CONFIG } from '../../initializers'
12import { getServerActor } from '../../helpers/utils'
13
14const blockAccountValidator = [
15 body('accountName').exists().withMessage('Should have an account name with host'),
16
17 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
18 logger.debug('Checking blockAccountByAccountValidator parameters', { parameters: req.body })
19
20 if (areValidationErrors(req, res)) return
21 if (!await isAccountNameWithHostExist(req.body.accountName, res)) return
22
23 const user = res.locals.oauth.token.User as UserModel
24 const accountToBlock = res.locals.account
25
26 if (user.Account.id === accountToBlock.id) {
27 res.status(409)
28 .send({ error: 'You cannot block yourself.' })
29 .end()
30
31 return
32 }
33
34 return next()
35 }
36]
37
38const unblockAccountByAccountValidator = [
39 param('accountName').exists().withMessage('Should have an account name with host'),
40
41 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
42 logger.debug('Checking unblockAccountByAccountValidator parameters', { parameters: req.params })
43
44 if (areValidationErrors(req, res)) return
45 if (!await isAccountNameWithHostExist(req.params.accountName, res)) return
46
47 const user = res.locals.oauth.token.User as UserModel
48 const targetAccount = res.locals.account
49 if (!await isUnblockAccountExists(user.Account.id, targetAccount.id, res)) return
50
51 return next()
52 }
53]
54
55const unblockAccountByServerValidator = [
56 param('accountName').exists().withMessage('Should have an account name with host'),
57
58 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
59 logger.debug('Checking unblockAccountByServerValidator parameters', { parameters: req.params })
60
61 if (areValidationErrors(req, res)) return
62 if (!await isAccountNameWithHostExist(req.params.accountName, res)) return
63
64 const serverActor = await getServerActor()
65 const targetAccount = res.locals.account
66 if (!await isUnblockAccountExists(serverActor.Account.id, targetAccount.id, res)) return
67
68 return next()
69 }
70]
71
72const blockServerValidator = [
73 body('host').custom(isHostValid).withMessage('Should have a valid host'),
74
75 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
76 logger.debug('Checking serverGetValidator parameters', { parameters: req.body })
77
78 if (areValidationErrors(req, res)) return
79
80 const host: string = req.body.host
81
82 if (host === CONFIG.WEBSERVER.HOST) {
83 return res.status(409)
84 .send({ error: 'You cannot block your own server.' })
85 .end()
86 }
87
88 const server = await ServerModel.loadByHost(host)
89 if (!server) {
90 return res.status(404)
91 .send({ error: 'Server host not found.' })
92 .end()
93 }
94
95 res.locals.server = server
96
97 return next()
98 }
99]
100
101const unblockServerByAccountValidator = [
102 param('host').custom(isHostValid).withMessage('Should have an account name with host'),
103
104 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
105 logger.debug('Checking unblockServerByAccountValidator parameters', { parameters: req.params })
106
107 if (areValidationErrors(req, res)) return
108
109 const user = res.locals.oauth.token.User as UserModel
110 if (!await isUnblockServerExists(user.Account.id, req.params.host, res)) return
111
112 return next()
113 }
114]
115
116const unblockServerByServerValidator = [
117 param('host').custom(isHostValid).withMessage('Should have an account name with host'),
118
119 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
120 logger.debug('Checking unblockServerByServerValidator parameters', { parameters: req.params })
121
122 if (areValidationErrors(req, res)) return
123
124 const serverActor = await getServerActor()
125 if (!await isUnblockServerExists(serverActor.Account.id, req.params.host, res)) return
126
127 return next()
128 }
129]
130
131// ---------------------------------------------------------------------------
132
133export {
134 blockServerValidator,
135 blockAccountValidator,
136 unblockAccountByAccountValidator,
137 unblockServerByAccountValidator,
138 unblockAccountByServerValidator,
139 unblockServerByServerValidator
140}
141
142// ---------------------------------------------------------------------------
143
144async function isUnblockAccountExists (accountId: number, targetAccountId: number, res: express.Response) {
145 const accountBlock = await AccountBlocklistModel.loadByAccountAndTarget(accountId, targetAccountId)
146 if (!accountBlock) {
147 res.status(404)
148 .send({ error: 'Account block entry not found.' })
149 .end()
150
151 return false
152 }
153
154 res.locals.accountBlock = accountBlock
155
156 return true
157}
158
159async function isUnblockServerExists (accountId: number, host: string, res: express.Response) {
160 const serverBlock = await ServerBlocklistModel.loadByAccountAndHost(accountId, host)
161 if (!serverBlock) {
162 res.status(404)
163 .send({ error: 'Server block entry not found.' })
164 .end()
165
166 return false
167 }
168
169 res.locals.serverBlock = serverBlock
170
171 return true
172}
diff --git a/server/middlewares/validators/config.ts b/server/middlewares/validators/config.ts
index f3f257d57..90108fa82 100644
--- a/server/middlewares/validators/config.ts
+++ b/server/middlewares/validators/config.ts
@@ -1,29 +1,44 @@
1import * as express from 'express' 1import * as express from 'express'
2import { body } from 'express-validator/check' 2import { body } from 'express-validator/check'
3import { isUserNSFWPolicyValid, isUserVideoQuotaValid } from '../../helpers/custom-validators/users' 3import { isUserNSFWPolicyValid, isUserVideoQuotaValid, isUserVideoQuotaDailyValid } from '../../helpers/custom-validators/users'
4import { logger } from '../../helpers/logger' 4import { logger } from '../../helpers/logger'
5import { areValidationErrors } from './utils' 5import { areValidationErrors } from './utils'
6 6
7const customConfigUpdateValidator = [ 7const customConfigUpdateValidator = [
8 body('instance.name').exists().withMessage('Should have a valid instance name'), 8 body('instance.name').exists().withMessage('Should have a valid instance name'),
9 body('instance.shortDescription').exists().withMessage('Should have a valid instance short description'),
9 body('instance.description').exists().withMessage('Should have a valid instance description'), 10 body('instance.description').exists().withMessage('Should have a valid instance description'),
10 body('instance.terms').exists().withMessage('Should have a valid instance terms'), 11 body('instance.terms').exists().withMessage('Should have a valid instance terms'),
11 body('instance.defaultClientRoute').exists().withMessage('Should have a valid instance default client route'), 12 body('instance.defaultClientRoute').exists().withMessage('Should have a valid instance default client route'),
12 body('instance.defaultNSFWPolicy').custom(isUserNSFWPolicyValid).withMessage('Should have a valid NSFW policy'), 13 body('instance.defaultNSFWPolicy').custom(isUserNSFWPolicyValid).withMessage('Should have a valid NSFW policy'),
13 body('instance.customizations.css').exists().withMessage('Should have a valid instance CSS customization'), 14 body('instance.customizations.css').exists().withMessage('Should have a valid instance CSS customization'),
14 body('instance.customizations.javascript').exists().withMessage('Should have a valid instance JavaScript customization'), 15 body('instance.customizations.javascript').exists().withMessage('Should have a valid instance JavaScript customization'),
15 body('cache.previews.size').isInt().withMessage('Should have a valid previews size'), 16
17 body('services.twitter.username').exists().withMessage('Should have a valid twitter username'),
18 body('services.twitter.whitelisted').isBoolean().withMessage('Should have a valid twitter whitelisted boolean'),
19
20 body('cache.previews.size').isInt().withMessage('Should have a valid previews cache size'),
21 body('cache.captions.size').isInt().withMessage('Should have a valid captions cache size'),
22
16 body('signup.enabled').isBoolean().withMessage('Should have a valid signup enabled boolean'), 23 body('signup.enabled').isBoolean().withMessage('Should have a valid signup enabled boolean'),
17 body('signup.limit').isInt().withMessage('Should have a valid signup limit'), 24 body('signup.limit').isInt().withMessage('Should have a valid signup limit'),
25 body('signup.requiresEmailVerification').isBoolean().withMessage('Should have a valid requiresEmailVerification boolean'),
26
18 body('admin.email').isEmail().withMessage('Should have a valid administrator email'), 27 body('admin.email').isEmail().withMessage('Should have a valid administrator email'),
28 body('contactForm.enabled').isBoolean().withMessage('Should have a valid contact form enabled boolean'),
29
19 body('user.videoQuota').custom(isUserVideoQuotaValid).withMessage('Should have a valid video quota'), 30 body('user.videoQuota').custom(isUserVideoQuotaValid).withMessage('Should have a valid video quota'),
31 body('user.videoQuotaDaily').custom(isUserVideoQuotaDailyValid).withMessage('Should have a valid daily video quota'),
32
20 body('transcoding.enabled').isBoolean().withMessage('Should have a valid transcoding enabled boolean'), 33 body('transcoding.enabled').isBoolean().withMessage('Should have a valid transcoding enabled boolean'),
34 body('transcoding.allowAdditionalExtensions').isBoolean().withMessage('Should have a valid additional extensions boolean'),
21 body('transcoding.threads').isInt().withMessage('Should have a valid transcoding threads number'), 35 body('transcoding.threads').isInt().withMessage('Should have a valid transcoding threads number'),
22 body('transcoding.resolutions.240p').isBoolean().withMessage('Should have a valid transcoding 240p resolution enabled boolean'), 36 body('transcoding.resolutions.240p').isBoolean().withMessage('Should have a valid transcoding 240p resolution enabled boolean'),
23 body('transcoding.resolutions.360p').isBoolean().withMessage('Should have a valid transcoding 360p resolution enabled boolean'), 37 body('transcoding.resolutions.360p').isBoolean().withMessage('Should have a valid transcoding 360p resolution enabled boolean'),
24 body('transcoding.resolutions.480p').isBoolean().withMessage('Should have a valid transcoding 480p resolution enabled boolean'), 38 body('transcoding.resolutions.480p').isBoolean().withMessage('Should have a valid transcoding 480p resolution enabled boolean'),
25 body('transcoding.resolutions.720p').isBoolean().withMessage('Should have a valid transcoding 720p resolution enabled boolean'), 39 body('transcoding.resolutions.720p').isBoolean().withMessage('Should have a valid transcoding 720p resolution enabled boolean'),
26 body('transcoding.resolutions.1080p').isBoolean().withMessage('Should have a valid transcoding 1080p resolution enabled boolean'), 40 body('transcoding.resolutions.1080p').isBoolean().withMessage('Should have a valid transcoding 1080p resolution enabled boolean'),
41
27 body('import.videos.http.enabled').isBoolean().withMessage('Should have a valid import video http enabled boolean'), 42 body('import.videos.http.enabled').isBoolean().withMessage('Should have a valid import video http enabled boolean'),
28 body('import.videos.torrent.enabled').isBoolean().withMessage('Should have a valid import video torrent enabled boolean'), 43 body('import.videos.torrent.enabled').isBoolean().withMessage('Should have a valid import video torrent enabled boolean'),
29 44
diff --git a/server/middlewares/validators/index.ts b/server/middlewares/validators/index.ts
index 17226614c..65dd00335 100644
--- a/server/middlewares/validators/index.ts
+++ b/server/middlewares/validators/index.ts
@@ -1,4 +1,5 @@
1export * from './account' 1export * from './account'
2export * from './blocklist'
2export * from './oembed' 3export * from './oembed'
3export * from './activitypub' 4export * from './activitypub'
4export * from './pagination' 5export * from './pagination'
@@ -10,3 +11,5 @@ export * from './user-subscriptions'
10export * from './videos' 11export * from './videos'
11export * from './webfinger' 12export * from './webfinger'
12export * from './search' 13export * from './search'
14export * from './server'
15export * from './user-history'
diff --git a/server/middlewares/validators/redundancy.ts b/server/middlewares/validators/redundancy.ts
index c72ab78b2..329322509 100644
--- a/server/middlewares/validators/redundancy.ts
+++ b/server/middlewares/validators/redundancy.ts
@@ -13,7 +13,7 @@ import { ActorFollowModel } from '../../models/activitypub/actor-follow'
13import { SERVER_ACTOR_NAME } from '../../initializers' 13import { SERVER_ACTOR_NAME } from '../../initializers'
14import { ServerModel } from '../../models/server/server' 14import { ServerModel } from '../../models/server/server'
15 15
16const videoRedundancyGetValidator = [ 16const videoFileRedundancyGetValidator = [
17 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'), 17 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
18 param('resolution') 18 param('resolution')
19 .customSanitizer(toIntOrNull) 19 .customSanitizer(toIntOrNull)
@@ -24,7 +24,7 @@ const videoRedundancyGetValidator = [
24 .custom(exists).withMessage('Should have a valid fps'), 24 .custom(exists).withMessage('Should have a valid fps'),
25 25
26 async (req: express.Request, res: express.Response, next: express.NextFunction) => { 26 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
27 logger.debug('Checking videoRedundancyGetValidator parameters', { parameters: req.params }) 27 logger.debug('Checking videoFileRedundancyGetValidator parameters', { parameters: req.params })
28 28
29 if (areValidationErrors(req, res)) return 29 if (areValidationErrors(req, res)) return
30 if (!await isVideoExist(req.params.videoId, res)) return 30 if (!await isVideoExist(req.params.videoId, res)) return
@@ -38,7 +38,31 @@ const videoRedundancyGetValidator = [
38 res.locals.videoFile = videoFile 38 res.locals.videoFile = videoFile
39 39
40 const videoRedundancy = await VideoRedundancyModel.loadLocalByFileId(videoFile.id) 40 const videoRedundancy = await VideoRedundancyModel.loadLocalByFileId(videoFile.id)
41 if (!videoRedundancy)return res.status(404).json({ error: 'Video redundancy not found.' }) 41 if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
42 res.locals.videoRedundancy = videoRedundancy
43
44 return next()
45 }
46]
47
48const videoPlaylistRedundancyGetValidator = [
49 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
50 param('streamingPlaylistType').custom(exists).withMessage('Should have a valid streaming playlist type'),
51
52 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
53 logger.debug('Checking videoPlaylistRedundancyGetValidator parameters', { parameters: req.params })
54
55 if (areValidationErrors(req, res)) return
56 if (!await isVideoExist(req.params.videoId, res)) return
57
58 const video: VideoModel = res.locals.video
59 const videoStreamingPlaylist = video.VideoStreamingPlaylists.find(p => p === req.params.streamingPlaylistType)
60
61 if (!videoStreamingPlaylist) return res.status(404).json({ error: 'Video playlist not found.' })
62 res.locals.videoStreamingPlaylist = videoStreamingPlaylist
63
64 const videoRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(videoStreamingPlaylist.id)
65 if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
42 res.locals.videoRedundancy = videoRedundancy 66 res.locals.videoRedundancy = videoRedundancy
43 67
44 return next() 68 return next()
@@ -75,6 +99,7 @@ const updateServerRedundancyValidator = [
75// --------------------------------------------------------------------------- 99// ---------------------------------------------------------------------------
76 100
77export { 101export {
78 videoRedundancyGetValidator, 102 videoFileRedundancyGetValidator,
103 videoPlaylistRedundancyGetValidator,
79 updateServerRedundancyValidator 104 updateServerRedundancyValidator
80} 105}
diff --git a/server/middlewares/validators/search.ts b/server/middlewares/validators/search.ts
index 8baf643a5..6a95d6095 100644
--- a/server/middlewares/validators/search.ts
+++ b/server/middlewares/validators/search.ts
@@ -2,8 +2,7 @@ import * as express from 'express'
2import { areValidationErrors } from './utils' 2import { areValidationErrors } from './utils'
3import { logger } from '../../helpers/logger' 3import { logger } from '../../helpers/logger'
4import { query } from 'express-validator/check' 4import { query } from 'express-validator/check'
5import { isNumberArray, isStringArray, isNSFWQueryValid } from '../../helpers/custom-validators/search' 5import { isDateValid } from '../../helpers/custom-validators/misc'
6import { isBooleanValid, isDateValid, toArray } from '../../helpers/custom-validators/misc'
7 6
8const videosSearchValidator = [ 7const videosSearchValidator = [
9 query('search').optional().not().isEmpty().withMessage('Should have a valid search'), 8 query('search').optional().not().isEmpty().withMessage('Should have a valid search'),
@@ -35,44 +34,9 @@ const videoChannelsSearchValidator = [
35 } 34 }
36] 35]
37 36
38const commonVideosFiltersValidator = [
39 query('categoryOneOf')
40 .optional()
41 .customSanitizer(toArray)
42 .custom(isNumberArray).withMessage('Should have a valid one of category array'),
43 query('licenceOneOf')
44 .optional()
45 .customSanitizer(toArray)
46 .custom(isNumberArray).withMessage('Should have a valid one of licence array'),
47 query('languageOneOf')
48 .optional()
49 .customSanitizer(toArray)
50 .custom(isStringArray).withMessage('Should have a valid one of language array'),
51 query('tagsOneOf')
52 .optional()
53 .customSanitizer(toArray)
54 .custom(isStringArray).withMessage('Should have a valid one of tags array'),
55 query('tagsAllOf')
56 .optional()
57 .customSanitizer(toArray)
58 .custom(isStringArray).withMessage('Should have a valid all of tags array'),
59 query('nsfw')
60 .optional()
61 .custom(isNSFWQueryValid).withMessage('Should have a valid NSFW attribute'),
62
63 (req: express.Request, res: express.Response, next: express.NextFunction) => {
64 logger.debug('Checking commons video filters query', { parameters: req.query })
65
66 if (areValidationErrors(req, res)) return
67
68 return next()
69 }
70]
71
72// --------------------------------------------------------------------------- 37// ---------------------------------------------------------------------------
73 38
74export { 39export {
75 commonVideosFiltersValidator,
76 videoChannelsSearchValidator, 40 videoChannelsSearchValidator,
77 videosSearchValidator 41 videosSearchValidator
78} 42}
diff --git a/server/middlewares/validators/server.ts b/server/middlewares/validators/server.ts
new file mode 100644
index 000000000..d85afc2ff
--- /dev/null
+++ b/server/middlewares/validators/server.ts
@@ -0,0 +1,78 @@
1import * as express from 'express'
2import { logger } from '../../helpers/logger'
3import { areValidationErrors } from './utils'
4import { isHostValid, isValidContactBody } from '../../helpers/custom-validators/servers'
5import { ServerModel } from '../../models/server/server'
6import { body } from 'express-validator/check'
7import { isUserDisplayNameValid } from '../../helpers/custom-validators/users'
8import { Emailer } from '../../lib/emailer'
9import { Redis } from '../../lib/redis'
10import { CONFIG } from '../../initializers/constants'
11
12const serverGetValidator = [
13 body('host').custom(isHostValid).withMessage('Should have a valid host'),
14
15 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
16 logger.debug('Checking serverGetValidator parameters', { parameters: req.body })
17
18 if (areValidationErrors(req, res)) return
19
20 const server = await ServerModel.loadByHost(req.body.host)
21 if (!server) {
22 return res.status(404)
23 .send({ error: 'Server host not found.' })
24 .end()
25 }
26
27 res.locals.server = server
28
29 return next()
30 }
31]
32
33const contactAdministratorValidator = [
34 body('fromName')
35 .custom(isUserDisplayNameValid).withMessage('Should have a valid name'),
36 body('fromEmail')
37 .isEmail().withMessage('Should have a valid email'),
38 body('body')
39 .custom(isValidContactBody).withMessage('Should have a valid body'),
40
41 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
42 logger.debug('Checking contactAdministratorValidator parameters', { parameters: req.body })
43
44 if (areValidationErrors(req, res)) return
45
46 if (CONFIG.CONTACT_FORM.ENABLED === false) {
47 return res
48 .status(409)
49 .send({ error: 'Contact form is not enabled on this instance.' })
50 .end()
51 }
52
53 if (Emailer.isEnabled() === false) {
54 return res
55 .status(409)
56 .send({ error: 'Emailer is not enabled on this instance.' })
57 .end()
58 }
59
60 if (await Redis.Instance.isContactFormIpExists(req.ip)) {
61 logger.info('Refusing a contact form by %s: already sent one recently.', req.ip)
62
63 return res
64 .status(403)
65 .send({ error: 'You already sent a contact form recently.' })
66 .end()
67 }
68
69 return next()
70 }
71]
72
73// ---------------------------------------------------------------------------
74
75export {
76 serverGetValidator,
77 contactAdministratorValidator
78}
diff --git a/server/middlewares/validators/sort.ts b/server/middlewares/validators/sort.ts
index 08dcc2680..5ceda845f 100644
--- a/server/middlewares/validators/sort.ts
+++ b/server/middlewares/validators/sort.ts
@@ -16,6 +16,9 @@ const SORTABLE_VIDEO_CHANNELS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.V
16const SORTABLE_FOLLOWERS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.FOLLOWERS) 16const SORTABLE_FOLLOWERS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.FOLLOWERS)
17const SORTABLE_FOLLOWING_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.FOLLOWING) 17const SORTABLE_FOLLOWING_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.FOLLOWING)
18const SORTABLE_USER_SUBSCRIPTIONS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.USER_SUBSCRIPTIONS) 18const SORTABLE_USER_SUBSCRIPTIONS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.USER_SUBSCRIPTIONS)
19const SORTABLE_ACCOUNTS_BLOCKLIST_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.ACCOUNTS_BLOCKLIST)
20const SORTABLE_SERVERS_BLOCKLIST_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.SERVERS_BLOCKLIST)
21const SORTABLE_USER_NOTIFICATIONS_COLUMNS = createSortableColumns(SORTABLE_COLUMNS.USER_NOTIFICATIONS)
19 22
20const usersSortValidator = checkSort(SORTABLE_USERS_COLUMNS) 23const usersSortValidator = checkSort(SORTABLE_USERS_COLUMNS)
21const accountsSortValidator = checkSort(SORTABLE_ACCOUNTS_COLUMNS) 24const accountsSortValidator = checkSort(SORTABLE_ACCOUNTS_COLUMNS)
@@ -31,6 +34,9 @@ const videoChannelsSortValidator = checkSort(SORTABLE_VIDEO_CHANNELS_COLUMNS)
31const followersSortValidator = checkSort(SORTABLE_FOLLOWERS_COLUMNS) 34const followersSortValidator = checkSort(SORTABLE_FOLLOWERS_COLUMNS)
32const followingSortValidator = checkSort(SORTABLE_FOLLOWING_COLUMNS) 35const followingSortValidator = checkSort(SORTABLE_FOLLOWING_COLUMNS)
33const userSubscriptionsSortValidator = checkSort(SORTABLE_USER_SUBSCRIPTIONS_COLUMNS) 36const userSubscriptionsSortValidator = checkSort(SORTABLE_USER_SUBSCRIPTIONS_COLUMNS)
37const accountsBlocklistSortValidator = checkSort(SORTABLE_ACCOUNTS_BLOCKLIST_COLUMNS)
38const serversBlocklistSortValidator = checkSort(SORTABLE_SERVERS_BLOCKLIST_COLUMNS)
39const userNotificationsSortValidator = checkSort(SORTABLE_USER_NOTIFICATIONS_COLUMNS)
34 40
35// --------------------------------------------------------------------------- 41// ---------------------------------------------------------------------------
36 42
@@ -48,5 +54,8 @@ export {
48 jobsSortValidator, 54 jobsSortValidator,
49 videoCommentThreadsSortValidator, 55 videoCommentThreadsSortValidator,
50 userSubscriptionsSortValidator, 56 userSubscriptionsSortValidator,
51 videoChannelsSearchSortValidator 57 videoChannelsSearchSortValidator,
58 accountsBlocklistSortValidator,
59 serversBlocklistSortValidator,
60 userNotificationsSortValidator
52} 61}
diff --git a/server/middlewares/validators/user-history.ts b/server/middlewares/validators/user-history.ts
new file mode 100644
index 000000000..418313d09
--- /dev/null
+++ b/server/middlewares/validators/user-history.ts
@@ -0,0 +1,26 @@
1import * as express from 'express'
2import 'express-validator'
3import { body } from 'express-validator/check'
4import { logger } from '../../helpers/logger'
5import { areValidationErrors } from './utils'
6import { isDateValid } from '../../helpers/custom-validators/misc'
7
8const userHistoryRemoveValidator = [
9 body('beforeDate')
10 .optional()
11 .custom(isDateValid).withMessage('Should have a valid before date'),
12
13 (req: express.Request, res: express.Response, next: express.NextFunction) => {
14 logger.debug('Checking userHistoryRemoveValidator parameters', { parameters: req.body })
15
16 if (areValidationErrors(req, res)) return
17
18 return next()
19 }
20]
21
22// ---------------------------------------------------------------------------
23
24export {
25 userHistoryRemoveValidator
26}
diff --git a/server/middlewares/validators/user-notifications.ts b/server/middlewares/validators/user-notifications.ts
new file mode 100644
index 000000000..46486e081
--- /dev/null
+++ b/server/middlewares/validators/user-notifications.ts
@@ -0,0 +1,63 @@
1import * as express from 'express'
2import 'express-validator'
3import { body, query } from 'express-validator/check'
4import { logger } from '../../helpers/logger'
5import { areValidationErrors } from './utils'
6import { isUserNotificationSettingValid } from '../../helpers/custom-validators/user-notifications'
7import { isNotEmptyIntArray } from '../../helpers/custom-validators/misc'
8
9const listUserNotificationsValidator = [
10 query('unread')
11 .optional()
12 .toBoolean()
13 .isBoolean().withMessage('Should have a valid unread boolean'),
14
15 (req: express.Request, res: express.Response, next: express.NextFunction) => {
16 logger.debug('Checking listUserNotificationsValidator parameters', { parameters: req.query })
17
18 if (areValidationErrors(req, res)) return
19
20 return next()
21 }
22]
23
24const updateNotificationSettingsValidator = [
25 body('newVideoFromSubscription')
26 .custom(isUserNotificationSettingValid).withMessage('Should have a valid new video from subscription notification setting'),
27 body('newCommentOnMyVideo')
28 .custom(isUserNotificationSettingValid).withMessage('Should have a valid new comment on my video notification setting'),
29 body('videoAbuseAsModerator')
30 .custom(isUserNotificationSettingValid).withMessage('Should have a valid new video abuse as moderator notification setting'),
31 body('blacklistOnMyVideo')
32 .custom(isUserNotificationSettingValid).withMessage('Should have a valid new blacklist on my video notification setting'),
33
34 (req: express.Request, res: express.Response, next: express.NextFunction) => {
35 logger.debug('Checking updateNotificationSettingsValidator parameters', { parameters: req.body })
36
37 if (areValidationErrors(req, res)) return
38
39 return next()
40 }
41]
42
43const markAsReadUserNotificationsValidator = [
44 body('ids')
45 .optional()
46 .custom(isNotEmptyIntArray).withMessage('Should have a valid notification ids to mark as read'),
47
48 (req: express.Request, res: express.Response, next: express.NextFunction) => {
49 logger.debug('Checking markAsReadUserNotificationsValidator parameters', { parameters: req.body })
50
51 if (areValidationErrors(req, res)) return
52
53 return next()
54 }
55]
56
57// ---------------------------------------------------------------------------
58
59export {
60 listUserNotificationsValidator,
61 updateNotificationSettingsValidator,
62 markAsReadUserNotificationsValidator
63}
diff --git a/server/middlewares/validators/users.ts b/server/middlewares/validators/users.ts
index 61297120a..a52e3060a 100644
--- a/server/middlewares/validators/users.ts
+++ b/server/middlewares/validators/users.ts
@@ -5,15 +5,16 @@ import { body, param } from 'express-validator/check'
5import { omit } from 'lodash' 5import { omit } from 'lodash'
6import { isIdOrUUIDValid } from '../../helpers/custom-validators/misc' 6import { isIdOrUUIDValid } from '../../helpers/custom-validators/misc'
7import { 7import {
8 isUserAutoPlayVideoValid, isUserBlockedReasonValid, 8 isUserAutoPlayVideoValid,
9 isUserBlockedReasonValid,
9 isUserDescriptionValid, 10 isUserDescriptionValid,
10 isUserDisplayNameValid, 11 isUserDisplayNameValid,
11 isUserNSFWPolicyValid, 12 isUserNSFWPolicyValid,
12 isUserPasswordValid, 13 isUserPasswordValid,
13 isUserRoleValid, 14 isUserRoleValid,
14 isUserUsernameValid, 15 isUserUsernameValid,
15 isUserVideoQuotaValid, 16 isUserVideoQuotaDailyValid,
16 isUserVideoQuotaDailyValid 17 isUserVideoQuotaValid, isUserVideosHistoryEnabledValid
17} from '../../helpers/custom-validators/users' 18} from '../../helpers/custom-validators/users'
18import { isVideoExist } from '../../helpers/custom-validators/videos' 19import { isVideoExist } from '../../helpers/custom-validators/videos'
19import { logger } from '../../helpers/logger' 20import { logger } from '../../helpers/logger'
@@ -22,7 +23,6 @@ import { Redis } from '../../lib/redis'
22import { UserModel } from '../../models/account/user' 23import { UserModel } from '../../models/account/user'
23import { areValidationErrors } from './utils' 24import { areValidationErrors } from './utils'
24import { ActorModel } from '../../models/activitypub/actor' 25import { ActorModel } from '../../models/activitypub/actor'
25import { comparePassword } from '../../helpers/peertube-crypto'
26 26
27const usersAddValidator = [ 27const usersAddValidator = [
28 body('username').custom(isUserUsernameValid).withMessage('Should have a valid username (lowercase alphanumeric characters)'), 28 body('username').custom(isUserUsernameValid).withMessage('Should have a valid username (lowercase alphanumeric characters)'),
@@ -113,7 +113,9 @@ const deleteMeValidator = [
113 113
114const usersUpdateValidator = [ 114const usersUpdateValidator = [
115 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'), 115 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
116 body('password').optional().custom(isUserPasswordValid).withMessage('Should have a valid password'),
116 body('email').optional().isEmail().withMessage('Should have a valid email attribute'), 117 body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
118 body('emailVerified').optional().isBoolean().withMessage('Should have a valid email verified attribute'),
117 body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'), 119 body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'),
118 body('videoQuotaDaily').optional().custom(isUserVideoQuotaDailyValid).withMessage('Should have a valid daily user quota'), 120 body('videoQuotaDaily').optional().custom(isUserVideoQuotaDailyValid).withMessage('Should have a valid daily user quota'),
119 body('role').optional().custom(isUserRoleValid).withMessage('Should have a valid role'), 121 body('role').optional().custom(isUserRoleValid).withMessage('Should have a valid role'),
@@ -143,6 +145,9 @@ const usersUpdateMeValidator = [
143 body('email').optional().isEmail().withMessage('Should have a valid email attribute'), 145 body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
144 body('nsfwPolicy').optional().custom(isUserNSFWPolicyValid).withMessage('Should have a valid display Not Safe For Work policy'), 146 body('nsfwPolicy').optional().custom(isUserNSFWPolicyValid).withMessage('Should have a valid display Not Safe For Work policy'),
145 body('autoPlayVideo').optional().custom(isUserAutoPlayVideoValid).withMessage('Should have a valid automatically plays video attribute'), 147 body('autoPlayVideo').optional().custom(isUserAutoPlayVideoValid).withMessage('Should have a valid automatically plays video attribute'),
148 body('videosHistoryEnabled')
149 .optional()
150 .custom(isUserVideosHistoryEnabledValid).withMessage('Should have a valid videos history enabled attribute'),
146 151
147 async (req: express.Request, res: express.Response, next: express.NextFunction) => { 152 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
148 logger.debug('Checking usersUpdateMe parameters', { parameters: omit(req.body, 'password') }) 153 logger.debug('Checking usersUpdateMe parameters', { parameters: omit(req.body, 'password') })
@@ -229,6 +234,7 @@ const usersAskResetPasswordValidator = [
229 logger.debug('Checking usersAskResetPassword parameters', { parameters: req.body }) 234 logger.debug('Checking usersAskResetPassword parameters', { parameters: req.body })
230 235
231 if (areValidationErrors(req, res)) return 236 if (areValidationErrors(req, res)) return
237
232 const exists = await checkUserEmailExist(req.body.email, res, false) 238 const exists = await checkUserEmailExist(req.body.email, res, false)
233 if (!exists) { 239 if (!exists) {
234 logger.debug('User with email %s does not exist (asking reset password).', req.body.email) 240 logger.debug('User with email %s does not exist (asking reset password).', req.body.email)
diff --git a/server/middlewares/validators/videos/index.ts b/server/middlewares/validators/videos/index.ts
index 294783d85..a0d585b93 100644
--- a/server/middlewares/validators/videos/index.ts
+++ b/server/middlewares/validators/videos/index.ts
@@ -5,4 +5,6 @@ export * from './video-channels'
5export * from './video-comments' 5export * from './video-comments'
6export * from './video-imports' 6export * from './video-imports'
7export * from './video-watch' 7export * from './video-watch'
8export * from './video-rates'
9export * from './video-shares'
8export * from './videos' 10export * from './videos'
diff --git a/server/middlewares/validators/videos/video-blacklist.ts b/server/middlewares/validators/videos/video-blacklist.ts
index 13da7acff..2688f63ae 100644
--- a/server/middlewares/validators/videos/video-blacklist.ts
+++ b/server/middlewares/validators/videos/video-blacklist.ts
@@ -1,10 +1,11 @@
1import * as express from 'express' 1import * as express from 'express'
2import { body, param } from 'express-validator/check' 2import { body, param } from 'express-validator/check'
3import { isIdOrUUIDValid } from '../../../helpers/custom-validators/misc' 3import { isBooleanValid, isIdOrUUIDValid } from '../../../helpers/custom-validators/misc'
4import { isVideoExist } from '../../../helpers/custom-validators/videos' 4import { isVideoExist } from '../../../helpers/custom-validators/videos'
5import { logger } from '../../../helpers/logger' 5import { logger } from '../../../helpers/logger'
6import { areValidationErrors } from '../utils' 6import { areValidationErrors } from '../utils'
7import { isVideoBlacklistExist, isVideoBlacklistReasonValid } from '../../../helpers/custom-validators/video-blacklist' 7import { isVideoBlacklistExist, isVideoBlacklistReasonValid } from '../../../helpers/custom-validators/video-blacklist'
8import { VideoModel } from '../../../models/video/video'
8 9
9const videosBlacklistRemoveValidator = [ 10const videosBlacklistRemoveValidator = [
10 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'), 11 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
@@ -22,6 +23,10 @@ const videosBlacklistRemoveValidator = [
22 23
23const videosBlacklistAddValidator = [ 24const videosBlacklistAddValidator = [
24 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'), 25 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
26 body('unfederate')
27 .optional()
28 .toBoolean()
29 .custom(isBooleanValid).withMessage('Should have a valid unfederate boolean'),
25 body('reason') 30 body('reason')
26 .optional() 31 .optional()
27 .custom(isVideoBlacklistReasonValid).withMessage('Should have a valid reason'), 32 .custom(isVideoBlacklistReasonValid).withMessage('Should have a valid reason'),
@@ -32,6 +37,14 @@ const videosBlacklistAddValidator = [
32 if (areValidationErrors(req, res)) return 37 if (areValidationErrors(req, res)) return
33 if (!await isVideoExist(req.params.videoId, res)) return 38 if (!await isVideoExist(req.params.videoId, res)) return
34 39
40 const video: VideoModel = res.locals.video
41 if (req.body.unfederate === true && video.remote === true) {
42 return res
43 .status(409)
44 .send({ error: 'You cannot unfederate a remote video.' })
45 .end()
46 }
47
35 return next() 48 return next()
36 } 49 }
37] 50]
diff --git a/server/middlewares/validators/videos/video-rates.ts b/server/middlewares/validators/videos/video-rates.ts
new file mode 100644
index 000000000..793354520
--- /dev/null
+++ b/server/middlewares/validators/videos/video-rates.ts
@@ -0,0 +1,55 @@
1import * as express from 'express'
2import 'express-validator'
3import { body, param } from 'express-validator/check'
4import { isIdOrUUIDValid, isIdValid } from '../../../helpers/custom-validators/misc'
5import { isVideoExist, isVideoRatingTypeValid } from '../../../helpers/custom-validators/videos'
6import { logger } from '../../../helpers/logger'
7import { areValidationErrors } from '../utils'
8import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
9import { VideoRateType } from '../../../../shared/models/videos'
10import { isAccountNameValid } from '../../../helpers/custom-validators/accounts'
11
12const videoUpdateRateValidator = [
13 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
14 body('rating').custom(isVideoRatingTypeValid).withMessage('Should have a valid rate type'),
15
16 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
17 logger.debug('Checking videoRate parameters', { parameters: req.body })
18
19 if (areValidationErrors(req, res)) return
20 if (!await isVideoExist(req.params.id, res)) return
21
22 return next()
23 }
24]
25
26const getAccountVideoRateValidator = function (rateType: VideoRateType) {
27 return [
28 param('name').custom(isAccountNameValid).withMessage('Should have a valid account name'),
29 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
30
31 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
32 logger.debug('Checking videoCommentGetValidator parameters.', { parameters: req.params })
33
34 if (areValidationErrors(req, res)) return
35
36 const rate = await AccountVideoRateModel.loadLocalAndPopulateVideo(rateType, req.params.name, req.params.videoId)
37 if (!rate) {
38 return res.status(404)
39 .json({ error: 'Video rate not found' })
40 .end()
41 }
42
43 res.locals.accountVideoRate = rate
44
45 return next()
46 }
47 ]
48}
49
50// ---------------------------------------------------------------------------
51
52export {
53 videoUpdateRateValidator,
54 getAccountVideoRateValidator
55}
diff --git a/server/middlewares/validators/videos/video-shares.ts b/server/middlewares/validators/videos/video-shares.ts
new file mode 100644
index 000000000..646d7acb1
--- /dev/null
+++ b/server/middlewares/validators/videos/video-shares.ts
@@ -0,0 +1,38 @@
1import * as express from 'express'
2import 'express-validator'
3import { param } from 'express-validator/check'
4import { isIdOrUUIDValid, isIdValid } from '../../../helpers/custom-validators/misc'
5import { isVideoExist } from '../../../helpers/custom-validators/videos'
6import { logger } from '../../../helpers/logger'
7import { VideoShareModel } from '../../../models/video/video-share'
8import { areValidationErrors } from '../utils'
9import { VideoModel } from '../../../models/video/video'
10
11const videosShareValidator = [
12 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
13 param('actorId').custom(isIdValid).not().isEmpty().withMessage('Should have a valid actor id'),
14
15 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
16 logger.debug('Checking videoShare parameters', { parameters: req.params })
17
18 if (areValidationErrors(req, res)) return
19 if (!await isVideoExist(req.params.id, res)) return
20
21 const video: VideoModel = res.locals.video
22
23 const share = await VideoShareModel.load(req.params.actorId, video.id)
24 if (!share) {
25 return res.status(404)
26 .end()
27 }
28
29 res.locals.videoShare = share
30 return next()
31 }
32]
33
34// ---------------------------------------------------------------------------
35
36export {
37 videosShareValidator
38}
diff --git a/server/middlewares/validators/videos/video-watch.ts b/server/middlewares/validators/videos/video-watch.ts
index bca64662f..c38ad8a10 100644
--- a/server/middlewares/validators/videos/video-watch.ts
+++ b/server/middlewares/validators/videos/video-watch.ts
@@ -4,6 +4,7 @@ import { isIdOrUUIDValid } from '../../../helpers/custom-validators/misc'
4import { isVideoExist } from '../../../helpers/custom-validators/videos' 4import { isVideoExist } from '../../../helpers/custom-validators/videos'
5import { areValidationErrors } from '../utils' 5import { areValidationErrors } from '../utils'
6import { logger } from '../../../helpers/logger' 6import { logger } from '../../../helpers/logger'
7import { UserModel } from '../../../models/account/user'
7 8
8const videoWatchingValidator = [ 9const videoWatchingValidator = [
9 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 10 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
@@ -17,6 +18,12 @@ const videoWatchingValidator = [
17 if (areValidationErrors(req, res)) return 18 if (areValidationErrors(req, res)) return
18 if (!await isVideoExist(req.params.videoId, res, 'id')) return 19 if (!await isVideoExist(req.params.videoId, res, 'id')) return
19 20
21 const user = res.locals.oauth.token.User as UserModel
22 if (user.videosHistoryEnabled === false) {
23 logger.warn('Cannot set videos to watch by user %d: videos history is disabled.', user.id)
24 return res.status(409).end()
25 }
26
20 return next() 27 return next()
21 } 28 }
22] 29]
diff --git a/server/middlewares/validators/videos/videos.ts b/server/middlewares/validators/videos/videos.ts
index 27e8a7449..d9626929c 100644
--- a/server/middlewares/validators/videos/videos.ts
+++ b/server/middlewares/validators/videos/videos.ts
@@ -1,6 +1,6 @@
1import * as express from 'express' 1import * as express from 'express'
2import 'express-validator' 2import 'express-validator'
3import { body, param, ValidationChain } from 'express-validator/check' 3import { body, param, query, ValidationChain } from 'express-validator/check'
4import { UserRight, VideoChangeOwnershipStatus, VideoPrivacy } from '../../../../shared' 4import { UserRight, VideoChangeOwnershipStatus, VideoPrivacy } from '../../../../shared'
5import { 5import {
6 isBooleanValid, 6 isBooleanValid,
@@ -8,6 +8,7 @@ import {
8 isIdOrUUIDValid, 8 isIdOrUUIDValid,
9 isIdValid, 9 isIdValid,
10 isUUIDValid, 10 isUUIDValid,
11 toArray,
11 toIntOrNull, 12 toIntOrNull,
12 toValueOrNull 13 toValueOrNull
13} from '../../../helpers/custom-validators/misc' 14} from '../../../helpers/custom-validators/misc'
@@ -19,20 +20,19 @@ import {
19 isVideoDescriptionValid, 20 isVideoDescriptionValid,
20 isVideoExist, 21 isVideoExist,
21 isVideoFile, 22 isVideoFile,
23 isVideoFilterValid,
22 isVideoImage, 24 isVideoImage,
23 isVideoLanguageValid, 25 isVideoLanguageValid,
24 isVideoLicenceValid, 26 isVideoLicenceValid,
25 isVideoNameValid, 27 isVideoNameValid,
26 isVideoPrivacyValid, 28 isVideoPrivacyValid,
27 isVideoRatingTypeValid,
28 isVideoSupportValid, 29 isVideoSupportValid,
29 isVideoTagsValid 30 isVideoTagsValid
30} from '../../../helpers/custom-validators/videos' 31} from '../../../helpers/custom-validators/videos'
31import { getDurationFromVideoFile } from '../../../helpers/ffmpeg-utils' 32import { getDurationFromVideoFile } from '../../../helpers/ffmpeg-utils'
32import { logger } from '../../../helpers/logger' 33import { logger } from '../../../helpers/logger'
33import { CONSTRAINTS_FIELDS } from '../../../initializers' 34import { CONFIG, CONSTRAINTS_FIELDS } from '../../../initializers'
34import { VideoShareModel } from '../../../models/video/video-share' 35import { authenticatePromiseIfNeeded } from '../../oauth'
35import { authenticate } from '../../oauth'
36import { areValidationErrors } from '../utils' 36import { areValidationErrors } from '../utils'
37import { cleanUpReqFiles } from '../../../helpers/express-utils' 37import { cleanUpReqFiles } from '../../../helpers/express-utils'
38import { VideoModel } from '../../../models/video/video' 38import { VideoModel } from '../../../models/video/video'
@@ -42,6 +42,8 @@ import { VideoChangeOwnershipAccept } from '../../../../shared/models/videos/vid
42import { VideoChangeOwnershipModel } from '../../../models/video/video-change-ownership' 42import { VideoChangeOwnershipModel } from '../../../models/video/video-change-ownership'
43import { AccountModel } from '../../../models/account/account' 43import { AccountModel } from '../../../models/account/account'
44import { VideoFetchType } from '../../../helpers/video' 44import { VideoFetchType } from '../../../helpers/video'
45import { isNSFWQueryValid, isNumberArray, isStringArray } from '../../../helpers/custom-validators/search'
46import { getServerActor } from '../../../helpers/utils'
45 47
46const videosAddValidator = getCommonVideoAttributes().concat([ 48const videosAddValidator = getCommonVideoAttributes().concat([
47 body('videofile') 49 body('videofile')
@@ -69,7 +71,6 @@ const videosAddValidator = getCommonVideoAttributes().concat([
69 if (isAble === false) { 71 if (isAble === false) {
70 res.status(403) 72 res.status(403)
71 .json({ error: 'The user video quota is exceeded with this video.' }) 73 .json({ error: 'The user video quota is exceeded with this video.' })
72 .end()
73 74
74 return cleanUpReqFiles(req) 75 return cleanUpReqFiles(req)
75 } 76 }
@@ -82,7 +83,6 @@ const videosAddValidator = getCommonVideoAttributes().concat([
82 logger.error('Invalid input file in videosAddValidator.', { err }) 83 logger.error('Invalid input file in videosAddValidator.', { err })
83 res.status(400) 84 res.status(400)
84 .json({ error: 'Invalid input file.' }) 85 .json({ error: 'Invalid input file.' })
85 .end()
86 86
87 return cleanUpReqFiles(req) 87 return cleanUpReqFiles(req)
88 } 88 }
@@ -120,7 +120,6 @@ const videosUpdateValidator = getCommonVideoAttributes().concat([
120 cleanUpReqFiles(req) 120 cleanUpReqFiles(req)
121 return res.status(409) 121 return res.status(409)
122 .json({ error: 'Cannot set "private" a video that was not private.' }) 122 .json({ error: 'Cannot set "private" a video that was not private.' })
123 .end()
124 } 123 }
125 124
126 if (req.body.channelId && !await isVideoChannelOfAccountExist(req.body.channelId, user, res)) return cleanUpReqFiles(req) 125 if (req.body.channelId && !await isVideoChannelOfAccountExist(req.body.channelId, user, res)) return cleanUpReqFiles(req)
@@ -129,6 +128,31 @@ const videosUpdateValidator = getCommonVideoAttributes().concat([
129 } 128 }
130]) 129])
131 130
131async function checkVideoFollowConstraints (req: express.Request, res: express.Response, next: express.NextFunction) {
132 const video: VideoModel = res.locals.video
133
134 // Anybody can watch local videos
135 if (video.isOwned() === true) return next()
136
137 // Logged user
138 if (res.locals.oauth) {
139 // Users can search or watch remote videos
140 if (CONFIG.SEARCH.REMOTE_URI.USERS === true) return next()
141 }
142
143 // Anybody can search or watch remote videos
144 if (CONFIG.SEARCH.REMOTE_URI.ANONYMOUS === true) return next()
145
146 // Check our instance follows an actor that shared this video
147 const serverActor = await getServerActor()
148 if (await VideoModel.checkVideoHasInstanceFollow(video.id, serverActor.id) === true) return next()
149
150 return res.status(403)
151 .json({
152 error: 'Cannot get this video regarding follow constraints.'
153 })
154}
155
132const videosCustomGetValidator = (fetchType: VideoFetchType) => { 156const videosCustomGetValidator = (fetchType: VideoFetchType) => {
133 return [ 157 return [
134 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 158 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
@@ -143,18 +167,20 @@ const videosCustomGetValidator = (fetchType: VideoFetchType) => {
143 167
144 // Video private or blacklisted 168 // Video private or blacklisted
145 if (video.privacy === VideoPrivacy.PRIVATE || video.VideoBlacklist) { 169 if (video.privacy === VideoPrivacy.PRIVATE || video.VideoBlacklist) {
146 return authenticate(req, res, () => { 170 await authenticatePromiseIfNeeded(req, res)
147 const user: UserModel = res.locals.oauth.token.User 171
148 172 const user: UserModel = res.locals.oauth ? res.locals.oauth.token.User : null
149 // Only the owner or a user that have blacklist rights can see the video 173
150 if (video.VideoChannel.Account.userId !== user.id && !user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST)) { 174 // Only the owner or a user that have blacklist rights can see the video
151 return res.status(403) 175 if (
152 .json({ error: 'Cannot get this private or blacklisted video.' }) 176 !user ||
153 .end() 177 (video.VideoChannel.Account.userId !== user.id && !user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST))
154 } 178 ) {
155 179 return res.status(403)
156 return next() 180 .json({ error: 'Cannot get this private or blacklisted video.' })
157 }) 181 }
182
183 return next()
158 } 184 }
159 185
160 // Video is public, anyone can access it 186 // Video is public, anyone can access it
@@ -189,41 +215,6 @@ const videosRemoveValidator = [
189 } 215 }
190] 216]
191 217
192const videoRateValidator = [
193 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
194 body('rating').custom(isVideoRatingTypeValid).withMessage('Should have a valid rate type'),
195
196 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
197 logger.debug('Checking videoRate parameters', { parameters: req.body })
198
199 if (areValidationErrors(req, res)) return
200 if (!await isVideoExist(req.params.id, res)) return
201
202 return next()
203 }
204]
205
206const videosShareValidator = [
207 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
208 param('accountId').custom(isIdValid).not().isEmpty().withMessage('Should have a valid account id'),
209
210 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
211 logger.debug('Checking videoShare parameters', { parameters: req.params })
212
213 if (areValidationErrors(req, res)) return
214 if (!await isVideoExist(req.params.id, res)) return
215
216 const share = await VideoShareModel.load(req.params.accountId, res.locals.video.id, undefined)
217 if (!share) {
218 return res.status(404)
219 .end()
220 }
221
222 res.locals.videoShare = share
223 return next()
224 }
225]
226
227const videosChangeOwnershipValidator = [ 218const videosChangeOwnershipValidator = [
228 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 219 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
229 220
@@ -239,8 +230,8 @@ const videosChangeOwnershipValidator = [
239 const nextOwner = await AccountModel.loadLocalByName(req.body.username) 230 const nextOwner = await AccountModel.loadLocalByName(req.body.username)
240 if (!nextOwner) { 231 if (!nextOwner) {
241 res.status(400) 232 res.status(400)
242 .type('json') 233 .json({ error: 'Changing video ownership to a remote account is not supported yet' })
243 .end() 234
244 return 235 return
245 } 236 }
246 res.locals.nextOwner = nextOwner 237 res.locals.nextOwner = nextOwner
@@ -271,7 +262,7 @@ const videosTerminateChangeOwnershipValidator = [
271 } else { 262 } else {
272 res.status(403) 263 res.status(403)
273 .json({ error: 'Ownership already accepted or refused' }) 264 .json({ error: 'Ownership already accepted or refused' })
274 .end() 265
275 return 266 return
276 } 267 }
277 } 268 }
@@ -288,7 +279,7 @@ const videosAcceptChangeOwnershipValidator = [
288 if (isAble === false) { 279 if (isAble === false) {
289 res.status(403) 280 res.status(403)
290 .json({ error: 'The user video quota is exceeded with this video.' }) 281 .json({ error: 'The user video quota is exceeded with this video.' })
291 .end() 282
292 return 283 return
293 } 284 }
294 285
@@ -367,23 +358,68 @@ function getCommonVideoAttributes () {
367 ] as (ValidationChain | express.Handler)[] 358 ] as (ValidationChain | express.Handler)[]
368} 359}
369 360
361const commonVideosFiltersValidator = [
362 query('categoryOneOf')
363 .optional()
364 .customSanitizer(toArray)
365 .custom(isNumberArray).withMessage('Should have a valid one of category array'),
366 query('licenceOneOf')
367 .optional()
368 .customSanitizer(toArray)
369 .custom(isNumberArray).withMessage('Should have a valid one of licence array'),
370 query('languageOneOf')
371 .optional()
372 .customSanitizer(toArray)
373 .custom(isStringArray).withMessage('Should have a valid one of language array'),
374 query('tagsOneOf')
375 .optional()
376 .customSanitizer(toArray)
377 .custom(isStringArray).withMessage('Should have a valid one of tags array'),
378 query('tagsAllOf')
379 .optional()
380 .customSanitizer(toArray)
381 .custom(isStringArray).withMessage('Should have a valid all of tags array'),
382 query('nsfw')
383 .optional()
384 .custom(isNSFWQueryValid).withMessage('Should have a valid NSFW attribute'),
385 query('filter')
386 .optional()
387 .custom(isVideoFilterValid).withMessage('Should have a valid filter attribute'),
388
389 (req: express.Request, res: express.Response, next: express.NextFunction) => {
390 logger.debug('Checking commons video filters query', { parameters: req.query })
391
392 if (areValidationErrors(req, res)) return
393
394 const user: UserModel = res.locals.oauth ? res.locals.oauth.token.User : undefined
395 if (req.query.filter === 'all-local' && (!user || user.hasRight(UserRight.SEE_ALL_VIDEOS) === false)) {
396 res.status(401)
397 .json({ error: 'You are not allowed to see all local videos.' })
398
399 return
400 }
401
402 return next()
403 }
404]
405
370// --------------------------------------------------------------------------- 406// ---------------------------------------------------------------------------
371 407
372export { 408export {
373 videosAddValidator, 409 videosAddValidator,
374 videosUpdateValidator, 410 videosUpdateValidator,
375 videosGetValidator, 411 videosGetValidator,
412 checkVideoFollowConstraints,
376 videosCustomGetValidator, 413 videosCustomGetValidator,
377 videosRemoveValidator, 414 videosRemoveValidator,
378 videosShareValidator,
379
380 videoRateValidator,
381 415
382 videosChangeOwnershipValidator, 416 videosChangeOwnershipValidator,
383 videosTerminateChangeOwnershipValidator, 417 videosTerminateChangeOwnershipValidator,
384 videosAcceptChangeOwnershipValidator, 418 videosAcceptChangeOwnershipValidator,
385 419
386 getCommonVideoAttributes 420 getCommonVideoAttributes,
421
422 commonVideosFiltersValidator
387} 423}
388 424
389// --------------------------------------------------------------------------- 425// ---------------------------------------------------------------------------
@@ -391,9 +427,10 @@ export {
391function areErrorsInScheduleUpdate (req: express.Request, res: express.Response) { 427function areErrorsInScheduleUpdate (req: express.Request, res: express.Response) {
392 if (req.body.scheduleUpdate) { 428 if (req.body.scheduleUpdate) {
393 if (!req.body.scheduleUpdate.updateAt) { 429 if (!req.body.scheduleUpdate.updateAt) {
430 logger.warn('Invalid parameters: scheduleUpdate.updateAt is mandatory.')
431
394 res.status(400) 432 res.status(400)
395 .json({ error: 'Schedule update at is mandatory.' }) 433 .json({ error: 'Schedule update at is mandatory.' })
396 .end()
397 434
398 return true 435 return true
399 } 436 }
diff --git a/server/models/account/account-blocklist.ts b/server/models/account/account-blocklist.ts
new file mode 100644
index 000000000..efd6ed59e
--- /dev/null
+++ b/server/models/account/account-blocklist.ts
@@ -0,0 +1,142 @@
1import { BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2import { AccountModel } from './account'
3import { getSort } from '../utils'
4import { AccountBlock } from '../../../shared/models/blocklist'
5import { Op } from 'sequelize'
6
7enum ScopeNames {
8 WITH_ACCOUNTS = 'WITH_ACCOUNTS'
9}
10
11@Scopes({
12 [ScopeNames.WITH_ACCOUNTS]: {
13 include: [
14 {
15 model: () => AccountModel,
16 required: true,
17 as: 'ByAccount'
18 },
19 {
20 model: () => AccountModel,
21 required: true,
22 as: 'BlockedAccount'
23 }
24 ]
25 }
26})
27
28@Table({
29 tableName: 'accountBlocklist',
30 indexes: [
31 {
32 fields: [ 'accountId', 'targetAccountId' ],
33 unique: true
34 },
35 {
36 fields: [ 'targetAccountId' ]
37 }
38 ]
39})
40export class AccountBlocklistModel extends Model<AccountBlocklistModel> {
41
42 @CreatedAt
43 createdAt: Date
44
45 @UpdatedAt
46 updatedAt: Date
47
48 @ForeignKey(() => AccountModel)
49 @Column
50 accountId: number
51
52 @BelongsTo(() => AccountModel, {
53 foreignKey: {
54 name: 'accountId',
55 allowNull: false
56 },
57 as: 'ByAccount',
58 onDelete: 'CASCADE'
59 })
60 ByAccount: AccountModel
61
62 @ForeignKey(() => AccountModel)
63 @Column
64 targetAccountId: number
65
66 @BelongsTo(() => AccountModel, {
67 foreignKey: {
68 name: 'targetAccountId',
69 allowNull: false
70 },
71 as: 'BlockedAccount',
72 onDelete: 'CASCADE'
73 })
74 BlockedAccount: AccountModel
75
76 static isAccountMutedBy (accountId: number, targetAccountId: number) {
77 return AccountBlocklistModel.isAccountMutedByMulti([ accountId ], targetAccountId)
78 .then(result => result[accountId])
79 }
80
81 static isAccountMutedByMulti (accountIds: number[], targetAccountId: number) {
82 const query = {
83 attributes: [ 'accountId', 'id' ],
84 where: {
85 accountId: {
86 [Op.any]: accountIds
87 },
88 targetAccountId
89 },
90 raw: true
91 }
92
93 return AccountBlocklistModel.unscoped()
94 .findAll(query)
95 .then(rows => {
96 const result: { [accountId: number]: boolean } = {}
97
98 for (const accountId of accountIds) {
99 result[accountId] = !!rows.find(r => r.accountId === accountId)
100 }
101
102 return result
103 })
104 }
105
106 static loadByAccountAndTarget (accountId: number, targetAccountId: number) {
107 const query = {
108 where: {
109 accountId,
110 targetAccountId
111 }
112 }
113
114 return AccountBlocklistModel.findOne(query)
115 }
116
117 static listForApi (accountId: number, start: number, count: number, sort: string) {
118 const query = {
119 offset: start,
120 limit: count,
121 order: getSort(sort),
122 where: {
123 accountId
124 }
125 }
126
127 return AccountBlocklistModel
128 .scope([ ScopeNames.WITH_ACCOUNTS ])
129 .findAndCountAll(query)
130 .then(({ rows, count }) => {
131 return { total: count, data: rows }
132 })
133 }
134
135 toFormattedJSON (): AccountBlock {
136 return {
137 byAccount: this.ByAccount.toFormattedJSON(),
138 blockedAccount: this.BlockedAccount.toFormattedJSON(),
139 createdAt: this.createdAt
140 }
141 }
142}
diff --git a/server/models/account/account-video-rate.ts b/server/models/account/account-video-rate.ts
index c99e32012..18762f0c5 100644
--- a/server/models/account/account-video-rate.ts
+++ b/server/models/account/account-video-rate.ts
@@ -1,12 +1,14 @@
1import { values } from 'lodash' 1import { values } from 'lodash'
2import { Transaction } from 'sequelize' 2import { Transaction } from 'sequelize'
3import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript' 3import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
4import { IFindOptions } from 'sequelize-typescript/lib/interfaces/IFindOptions' 4import { IFindOptions } from 'sequelize-typescript/lib/interfaces/IFindOptions'
5import { VideoRateType } from '../../../shared/models/videos' 5import { VideoRateType } from '../../../shared/models/videos'
6import { VIDEO_RATE_TYPES } from '../../initializers' 6import { CONSTRAINTS_FIELDS, VIDEO_RATE_TYPES } from '../../initializers'
7import { VideoModel } from '../video/video' 7import { VideoModel } from '../video/video'
8import { AccountModel } from './account' 8import { AccountModel } from './account'
9import { ActorModel } from '../activitypub/actor' 9import { ActorModel } from '../activitypub/actor'
10import { throwIfNotValid } from '../utils'
11import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
10 12
11/* 13/*
12 Account rates per video. 14 Account rates per video.
@@ -26,6 +28,10 @@ import { ActorModel } from '../activitypub/actor'
26 }, 28 },
27 { 29 {
28 fields: [ 'videoId', 'type' ] 30 fields: [ 'videoId', 'type' ]
31 },
32 {
33 fields: [ 'url' ],
34 unique: true
29 } 35 }
30 ] 36 ]
31}) 37})
@@ -35,6 +41,11 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> {
35 @Column(DataType.ENUM(values(VIDEO_RATE_TYPES))) 41 @Column(DataType.ENUM(values(VIDEO_RATE_TYPES)))
36 type: VideoRateType 42 type: VideoRateType
37 43
44 @AllowNull(false)
45 @Is('AccountVideoRateUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'url'))
46 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_RATES.URL.max))
47 url: string
48
38 @CreatedAt 49 @CreatedAt
39 createdAt: Date 50 createdAt: Date
40 51
@@ -65,7 +76,7 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> {
65 }) 76 })
66 Account: AccountModel 77 Account: AccountModel
67 78
68 static load (accountId: number, videoId: number, transaction: Transaction) { 79 static load (accountId: number, videoId: number, transaction?: Transaction) {
69 const options: IFindOptions<AccountVideoRateModel> = { 80 const options: IFindOptions<AccountVideoRateModel> = {
70 where: { 81 where: {
71 accountId, 82 accountId,
@@ -77,6 +88,49 @@ export class AccountVideoRateModel extends Model<AccountVideoRateModel> {
77 return AccountVideoRateModel.findOne(options) 88 return AccountVideoRateModel.findOne(options)
78 } 89 }
79 90
91 static loadLocalAndPopulateVideo (rateType: VideoRateType, accountName: string, videoId: number, transaction?: Transaction) {
92 const options: IFindOptions<AccountVideoRateModel> = {
93 where: {
94 videoId,
95 type: rateType
96 },
97 include: [
98 {
99 model: AccountModel.unscoped(),
100 required: true,
101 include: [
102 {
103 attributes: [ 'id', 'url', 'preferredUsername' ],
104 model: ActorModel.unscoped(),
105 required: true,
106 where: {
107 preferredUsername: accountName
108 }
109 }
110 ]
111 },
112 {
113 model: VideoModel.unscoped(),
114 required: true
115 }
116 ]
117 }
118 if (transaction) options.transaction = transaction
119
120 return AccountVideoRateModel.findOne(options)
121 }
122
123 static loadByUrl (url: string, transaction: Transaction) {
124 const options: IFindOptions<AccountVideoRateModel> = {
125 where: {
126 url
127 }
128 }
129 if (transaction) options.transaction = transaction
130
131 return AccountVideoRateModel.findOne(options)
132 }
133
80 static listAndCountAccountUrlsByVideoId (rateType: VideoRateType, videoId: number, start: number, count: number, t?: Transaction) { 134 static listAndCountAccountUrlsByVideoId (rateType: VideoRateType, videoId: number, start: number, count: number, t?: Transaction) {
81 const query = { 135 const query = {
82 offset: start, 136 offset: start,
diff --git a/server/models/account/account.ts b/server/models/account/account.ts
index 5a237d733..84ef0b30d 100644
--- a/server/models/account/account.ts
+++ b/server/models/account/account.ts
@@ -241,6 +241,27 @@ export class AccountModel extends Model<AccountModel> {
241 }) 241 })
242 } 242 }
243 243
244 static listLocalsForSitemap (sort: string) {
245 const query = {
246 attributes: [ ],
247 offset: 0,
248 order: getSort(sort),
249 include: [
250 {
251 attributes: [ 'preferredUsername', 'serverId' ],
252 model: ActorModel.unscoped(),
253 where: {
254 serverId: null
255 }
256 }
257 ]
258 }
259
260 return AccountModel
261 .unscoped()
262 .findAll(query)
263 }
264
244 toFormattedJSON (): Account { 265 toFormattedJSON (): Account {
245 const actor = this.Actor.toFormattedJSON() 266 const actor = this.Actor.toFormattedJSON()
246 const account = { 267 const account = {
@@ -267,6 +288,10 @@ export class AccountModel extends Model<AccountModel> {
267 return this.Actor.isOwned() 288 return this.Actor.isOwned()
268 } 289 }
269 290
291 isOutdated () {
292 return this.Actor.isOutdated()
293 }
294
270 getDisplayName () { 295 getDisplayName () {
271 return this.name 296 return this.name
272 } 297 }
diff --git a/server/models/account/user-notification-setting.ts b/server/models/account/user-notification-setting.ts
new file mode 100644
index 000000000..f1c3ac223
--- /dev/null
+++ b/server/models/account/user-notification-setting.ts
@@ -0,0 +1,150 @@
1import {
2 AfterDestroy,
3 AfterUpdate,
4 AllowNull,
5 BelongsTo,
6 Column,
7 CreatedAt,
8 Default,
9 ForeignKey,
10 Is,
11 Model,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { throwIfNotValid } from '../utils'
16import { UserModel } from './user'
17import { isUserNotificationSettingValid } from '../../helpers/custom-validators/user-notifications'
18import { UserNotificationSetting, UserNotificationSettingValue } from '../../../shared/models/users/user-notification-setting.model'
19import { clearCacheByUserId } from '../../lib/oauth-model'
20
21@Table({
22 tableName: 'userNotificationSetting',
23 indexes: [
24 {
25 fields: [ 'userId' ],
26 unique: true
27 }
28 ]
29})
30export class UserNotificationSettingModel extends Model<UserNotificationSettingModel> {
31
32 @AllowNull(false)
33 @Default(null)
34 @Is(
35 'UserNotificationSettingNewVideoFromSubscription',
36 value => throwIfNotValid(value, isUserNotificationSettingValid, 'newVideoFromSubscription')
37 )
38 @Column
39 newVideoFromSubscription: UserNotificationSettingValue
40
41 @AllowNull(false)
42 @Default(null)
43 @Is(
44 'UserNotificationSettingNewCommentOnMyVideo',
45 value => throwIfNotValid(value, isUserNotificationSettingValid, 'newCommentOnMyVideo')
46 )
47 @Column
48 newCommentOnMyVideo: UserNotificationSettingValue
49
50 @AllowNull(false)
51 @Default(null)
52 @Is(
53 'UserNotificationSettingVideoAbuseAsModerator',
54 value => throwIfNotValid(value, isUserNotificationSettingValid, 'videoAbuseAsModerator')
55 )
56 @Column
57 videoAbuseAsModerator: UserNotificationSettingValue
58
59 @AllowNull(false)
60 @Default(null)
61 @Is(
62 'UserNotificationSettingBlacklistOnMyVideo',
63 value => throwIfNotValid(value, isUserNotificationSettingValid, 'blacklistOnMyVideo')
64 )
65 @Column
66 blacklistOnMyVideo: UserNotificationSettingValue
67
68 @AllowNull(false)
69 @Default(null)
70 @Is(
71 'UserNotificationSettingMyVideoPublished',
72 value => throwIfNotValid(value, isUserNotificationSettingValid, 'myVideoPublished')
73 )
74 @Column
75 myVideoPublished: UserNotificationSettingValue
76
77 @AllowNull(false)
78 @Default(null)
79 @Is(
80 'UserNotificationSettingMyVideoImportFinished',
81 value => throwIfNotValid(value, isUserNotificationSettingValid, 'myVideoImportFinished')
82 )
83 @Column
84 myVideoImportFinished: UserNotificationSettingValue
85
86 @AllowNull(false)
87 @Default(null)
88 @Is(
89 'UserNotificationSettingNewUserRegistration',
90 value => throwIfNotValid(value, isUserNotificationSettingValid, 'newUserRegistration')
91 )
92 @Column
93 newUserRegistration: UserNotificationSettingValue
94
95 @AllowNull(false)
96 @Default(null)
97 @Is(
98 'UserNotificationSettingNewFollow',
99 value => throwIfNotValid(value, isUserNotificationSettingValid, 'newFollow')
100 )
101 @Column
102 newFollow: UserNotificationSettingValue
103
104 @AllowNull(false)
105 @Default(null)
106 @Is(
107 'UserNotificationSettingCommentMention',
108 value => throwIfNotValid(value, isUserNotificationSettingValid, 'commentMention')
109 )
110 @Column
111 commentMention: UserNotificationSettingValue
112
113 @ForeignKey(() => UserModel)
114 @Column
115 userId: number
116
117 @BelongsTo(() => UserModel, {
118 foreignKey: {
119 allowNull: false
120 },
121 onDelete: 'cascade'
122 })
123 User: UserModel
124
125 @CreatedAt
126 createdAt: Date
127
128 @UpdatedAt
129 updatedAt: Date
130
131 @AfterUpdate
132 @AfterDestroy
133 static removeTokenCache (instance: UserNotificationSettingModel) {
134 return clearCacheByUserId(instance.userId)
135 }
136
137 toFormattedJSON (): UserNotificationSetting {
138 return {
139 newCommentOnMyVideo: this.newCommentOnMyVideo,
140 newVideoFromSubscription: this.newVideoFromSubscription,
141 videoAbuseAsModerator: this.videoAbuseAsModerator,
142 blacklistOnMyVideo: this.blacklistOnMyVideo,
143 myVideoPublished: this.myVideoPublished,
144 myVideoImportFinished: this.myVideoImportFinished,
145 newUserRegistration: this.newUserRegistration,
146 commentMention: this.commentMention,
147 newFollow: this.newFollow
148 }
149 }
150}
diff --git a/server/models/account/user-notification.ts b/server/models/account/user-notification.ts
new file mode 100644
index 000000000..6cdbb827b
--- /dev/null
+++ b/server/models/account/user-notification.ts
@@ -0,0 +1,472 @@
1import {
2 AllowNull,
3 BelongsTo,
4 Column,
5 CreatedAt,
6 Default,
7 ForeignKey,
8 IFindOptions,
9 Is,
10 Model,
11 Scopes,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { UserNotification, UserNotificationType } from '../../../shared'
16import { getSort, throwIfNotValid } from '../utils'
17import { isBooleanValid } from '../../helpers/custom-validators/misc'
18import { isUserNotificationTypeValid } from '../../helpers/custom-validators/user-notifications'
19import { UserModel } from './user'
20import { VideoModel } from '../video/video'
21import { VideoCommentModel } from '../video/video-comment'
22import { Op } from 'sequelize'
23import { VideoChannelModel } from '../video/video-channel'
24import { AccountModel } from './account'
25import { VideoAbuseModel } from '../video/video-abuse'
26import { VideoBlacklistModel } from '../video/video-blacklist'
27import { VideoImportModel } from '../video/video-import'
28import { ActorModel } from '../activitypub/actor'
29import { ActorFollowModel } from '../activitypub/actor-follow'
30import { AvatarModel } from '../avatar/avatar'
31import { ServerModel } from '../server/server'
32
33enum ScopeNames {
34 WITH_ALL = 'WITH_ALL'
35}
36
37function buildActorWithAvatarInclude () {
38 return {
39 attributes: [ 'preferredUsername' ],
40 model: () => ActorModel.unscoped(),
41 required: true,
42 include: [
43 {
44 attributes: [ 'filename' ],
45 model: () => AvatarModel.unscoped(),
46 required: false
47 },
48 {
49 attributes: [ 'host' ],
50 model: () => ServerModel.unscoped(),
51 required: false
52 }
53 ]
54 }
55}
56
57function buildVideoInclude (required: boolean) {
58 return {
59 attributes: [ 'id', 'uuid', 'name' ],
60 model: () => VideoModel.unscoped(),
61 required
62 }
63}
64
65function buildChannelInclude (required: boolean, withActor = false) {
66 return {
67 required,
68 attributes: [ 'id', 'name' ],
69 model: () => VideoChannelModel.unscoped(),
70 include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
71 }
72}
73
74function buildAccountInclude (required: boolean, withActor = false) {
75 return {
76 required,
77 attributes: [ 'id', 'name' ],
78 model: () => AccountModel.unscoped(),
79 include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
80 }
81}
82
83@Scopes({
84 [ScopeNames.WITH_ALL]: {
85 include: [
86 Object.assign(buildVideoInclude(false), {
87 include: [ buildChannelInclude(true, true) ]
88 }),
89
90 {
91 attributes: [ 'id', 'originCommentId' ],
92 model: () => VideoCommentModel.unscoped(),
93 required: false,
94 include: [
95 buildAccountInclude(true, true),
96 buildVideoInclude(true)
97 ]
98 },
99
100 {
101 attributes: [ 'id' ],
102 model: () => VideoAbuseModel.unscoped(),
103 required: false,
104 include: [ buildVideoInclude(true) ]
105 },
106
107 {
108 attributes: [ 'id' ],
109 model: () => VideoBlacklistModel.unscoped(),
110 required: false,
111 include: [ buildVideoInclude(true) ]
112 },
113
114 {
115 attributes: [ 'id', 'magnetUri', 'targetUrl', 'torrentName' ],
116 model: () => VideoImportModel.unscoped(),
117 required: false,
118 include: [ buildVideoInclude(false) ]
119 },
120
121 {
122 attributes: [ 'id' ],
123 model: () => ActorFollowModel.unscoped(),
124 required: false,
125 include: [
126 {
127 attributes: [ 'preferredUsername' ],
128 model: () => ActorModel.unscoped(),
129 required: true,
130 as: 'ActorFollower',
131 include: [
132 {
133 attributes: [ 'id', 'name' ],
134 model: () => AccountModel.unscoped(),
135 required: true
136 },
137 {
138 attributes: [ 'filename' ],
139 model: () => AvatarModel.unscoped(),
140 required: false
141 },
142 {
143 attributes: [ 'host' ],
144 model: () => ServerModel.unscoped(),
145 required: false
146 }
147 ]
148 },
149 {
150 attributes: [ 'preferredUsername' ],
151 model: () => ActorModel.unscoped(),
152 required: true,
153 as: 'ActorFollowing',
154 include: [
155 buildChannelInclude(false),
156 buildAccountInclude(false)
157 ]
158 }
159 ]
160 },
161
162 buildAccountInclude(false, true)
163 ]
164 }
165})
166@Table({
167 tableName: 'userNotification',
168 indexes: [
169 {
170 fields: [ 'userId' ]
171 },
172 {
173 fields: [ 'videoId' ],
174 where: {
175 videoId: {
176 [Op.ne]: null
177 }
178 }
179 },
180 {
181 fields: [ 'commentId' ],
182 where: {
183 commentId: {
184 [Op.ne]: null
185 }
186 }
187 },
188 {
189 fields: [ 'videoAbuseId' ],
190 where: {
191 videoAbuseId: {
192 [Op.ne]: null
193 }
194 }
195 },
196 {
197 fields: [ 'videoBlacklistId' ],
198 where: {
199 videoBlacklistId: {
200 [Op.ne]: null
201 }
202 }
203 },
204 {
205 fields: [ 'videoImportId' ],
206 where: {
207 videoImportId: {
208 [Op.ne]: null
209 }
210 }
211 },
212 {
213 fields: [ 'accountId' ],
214 where: {
215 accountId: {
216 [Op.ne]: null
217 }
218 }
219 },
220 {
221 fields: [ 'actorFollowId' ],
222 where: {
223 actorFollowId: {
224 [Op.ne]: null
225 }
226 }
227 }
228 ]
229})
230export class UserNotificationModel extends Model<UserNotificationModel> {
231
232 @AllowNull(false)
233 @Default(null)
234 @Is('UserNotificationType', value => throwIfNotValid(value, isUserNotificationTypeValid, 'type'))
235 @Column
236 type: UserNotificationType
237
238 @AllowNull(false)
239 @Default(false)
240 @Is('UserNotificationRead', value => throwIfNotValid(value, isBooleanValid, 'read'))
241 @Column
242 read: boolean
243
244 @CreatedAt
245 createdAt: Date
246
247 @UpdatedAt
248 updatedAt: Date
249
250 @ForeignKey(() => UserModel)
251 @Column
252 userId: number
253
254 @BelongsTo(() => UserModel, {
255 foreignKey: {
256 allowNull: false
257 },
258 onDelete: 'cascade'
259 })
260 User: UserModel
261
262 @ForeignKey(() => VideoModel)
263 @Column
264 videoId: number
265
266 @BelongsTo(() => VideoModel, {
267 foreignKey: {
268 allowNull: true
269 },
270 onDelete: 'cascade'
271 })
272 Video: VideoModel
273
274 @ForeignKey(() => VideoCommentModel)
275 @Column
276 commentId: number
277
278 @BelongsTo(() => VideoCommentModel, {
279 foreignKey: {
280 allowNull: true
281 },
282 onDelete: 'cascade'
283 })
284 Comment: VideoCommentModel
285
286 @ForeignKey(() => VideoAbuseModel)
287 @Column
288 videoAbuseId: number
289
290 @BelongsTo(() => VideoAbuseModel, {
291 foreignKey: {
292 allowNull: true
293 },
294 onDelete: 'cascade'
295 })
296 VideoAbuse: VideoAbuseModel
297
298 @ForeignKey(() => VideoBlacklistModel)
299 @Column
300 videoBlacklistId: number
301
302 @BelongsTo(() => VideoBlacklistModel, {
303 foreignKey: {
304 allowNull: true
305 },
306 onDelete: 'cascade'
307 })
308 VideoBlacklist: VideoBlacklistModel
309
310 @ForeignKey(() => VideoImportModel)
311 @Column
312 videoImportId: number
313
314 @BelongsTo(() => VideoImportModel, {
315 foreignKey: {
316 allowNull: true
317 },
318 onDelete: 'cascade'
319 })
320 VideoImport: VideoImportModel
321
322 @ForeignKey(() => AccountModel)
323 @Column
324 accountId: number
325
326 @BelongsTo(() => AccountModel, {
327 foreignKey: {
328 allowNull: true
329 },
330 onDelete: 'cascade'
331 })
332 Account: AccountModel
333
334 @ForeignKey(() => ActorFollowModel)
335 @Column
336 actorFollowId: number
337
338 @BelongsTo(() => ActorFollowModel, {
339 foreignKey: {
340 allowNull: true
341 },
342 onDelete: 'cascade'
343 })
344 ActorFollow: ActorFollowModel
345
346 static listForApi (userId: number, start: number, count: number, sort: string, unread?: boolean) {
347 const query: IFindOptions<UserNotificationModel> = {
348 offset: start,
349 limit: count,
350 order: getSort(sort),
351 where: {
352 userId
353 }
354 }
355
356 if (unread !== undefined) query.where['read'] = !unread
357
358 return UserNotificationModel.scope(ScopeNames.WITH_ALL)
359 .findAndCountAll(query)
360 .then(({ rows, count }) => {
361 return {
362 data: rows,
363 total: count
364 }
365 })
366 }
367
368 static markAsRead (userId: number, notificationIds: number[]) {
369 const query = {
370 where: {
371 userId,
372 id: {
373 [Op.any]: notificationIds
374 }
375 }
376 }
377
378 return UserNotificationModel.update({ read: true }, query)
379 }
380
381 static markAllAsRead (userId: number) {
382 const query = { where: { userId } }
383
384 return UserNotificationModel.update({ read: true }, query)
385 }
386
387 toFormattedJSON (): UserNotification {
388 const video = this.Video
389 ? Object.assign(this.formatVideo(this.Video),{ channel: this.formatActor(this.Video.VideoChannel) })
390 : undefined
391
392 const videoImport = this.VideoImport ? {
393 id: this.VideoImport.id,
394 video: this.VideoImport.Video ? this.formatVideo(this.VideoImport.Video) : undefined,
395 torrentName: this.VideoImport.torrentName,
396 magnetUri: this.VideoImport.magnetUri,
397 targetUrl: this.VideoImport.targetUrl
398 } : undefined
399
400 const comment = this.Comment ? {
401 id: this.Comment.id,
402 threadId: this.Comment.getThreadId(),
403 account: this.formatActor(this.Comment.Account),
404 video: this.formatVideo(this.Comment.Video)
405 } : undefined
406
407 const videoAbuse = this.VideoAbuse ? {
408 id: this.VideoAbuse.id,
409 video: this.formatVideo(this.VideoAbuse.Video)
410 } : undefined
411
412 const videoBlacklist = this.VideoBlacklist ? {
413 id: this.VideoBlacklist.id,
414 video: this.formatVideo(this.VideoBlacklist.Video)
415 } : undefined
416
417 const account = this.Account ? this.formatActor(this.Account) : undefined
418
419 const actorFollow = this.ActorFollow ? {
420 id: this.ActorFollow.id,
421 follower: {
422 id: this.ActorFollow.ActorFollower.Account.id,
423 displayName: this.ActorFollow.ActorFollower.Account.getDisplayName(),
424 name: this.ActorFollow.ActorFollower.preferredUsername,
425 avatar: this.ActorFollow.ActorFollower.Avatar ? { path: this.ActorFollow.ActorFollower.Avatar.getWebserverPath() } : undefined,
426 host: this.ActorFollow.ActorFollower.getHost()
427 },
428 following: {
429 type: this.ActorFollow.ActorFollowing.VideoChannel ? 'channel' as 'channel' : 'account' as 'account',
430 displayName: (this.ActorFollow.ActorFollowing.VideoChannel || this.ActorFollow.ActorFollowing.Account).getDisplayName(),
431 name: this.ActorFollow.ActorFollowing.preferredUsername
432 }
433 } : undefined
434
435 return {
436 id: this.id,
437 type: this.type,
438 read: this.read,
439 video,
440 videoImport,
441 comment,
442 videoAbuse,
443 videoBlacklist,
444 account,
445 actorFollow,
446 createdAt: this.createdAt.toISOString(),
447 updatedAt: this.updatedAt.toISOString()
448 }
449 }
450
451 private formatVideo (video: VideoModel) {
452 return {
453 id: video.id,
454 uuid: video.uuid,
455 name: video.name
456 }
457 }
458
459 private formatActor (accountOrChannel: AccountModel | VideoChannelModel) {
460 const avatar = accountOrChannel.Actor.Avatar
461 ? { path: accountOrChannel.Actor.Avatar.getWebserverPath() }
462 : undefined
463
464 return {
465 id: accountOrChannel.id,
466 displayName: accountOrChannel.getDisplayName(),
467 name: accountOrChannel.Actor.preferredUsername,
468 host: accountOrChannel.Actor.getHost(),
469 avatar
470 }
471 }
472}
diff --git a/server/models/account/user-video-history.ts b/server/models/account/user-video-history.ts
index 0476cad9d..15cb399c9 100644
--- a/server/models/account/user-video-history.ts
+++ b/server/models/account/user-video-history.ts
@@ -1,6 +1,7 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, IsInt, Min, Model, Table, UpdatedAt } from 'sequelize-typescript' 1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, IsInt, Model, Table, UpdatedAt } from 'sequelize-typescript'
2import { VideoModel } from '../video/video' 2import { VideoModel } from '../video/video'
3import { UserModel } from './user' 3import { UserModel } from './user'
4import { Transaction, Op, DestroyOptions } from 'sequelize'
4 5
5@Table({ 6@Table({
6 tableName: 'userVideoHistory', 7 tableName: 'userVideoHistory',
@@ -52,4 +53,34 @@ export class UserVideoHistoryModel extends Model<UserVideoHistoryModel> {
52 onDelete: 'CASCADE' 53 onDelete: 'CASCADE'
53 }) 54 })
54 User: UserModel 55 User: UserModel
56
57 static listForApi (user: UserModel, start: number, count: number) {
58 return VideoModel.listForApi({
59 start,
60 count,
61 sort: '-UserVideoHistories.updatedAt',
62 nsfw: null, // All
63 includeLocalVideos: true,
64 withFiles: false,
65 user,
66 historyOfUser: user
67 })
68 }
69
70 static removeHistoryBefore (user: UserModel, beforeDate: string, t: Transaction) {
71 const query: DestroyOptions = {
72 where: {
73 userId: user.id
74 },
75 transaction: t
76 }
77
78 if (beforeDate) {
79 query.where.updatedAt = {
80 [Op.lt]: beforeDate
81 }
82 }
83
84 return UserVideoHistoryModel.destroy(query)
85 }
55} 86}
diff --git a/server/models/account/user.ts b/server/models/account/user.ts
index e56b0bf40..017a96657 100644
--- a/server/models/account/user.ts
+++ b/server/models/account/user.ts
@@ -1,6 +1,6 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { 2import {
3 AfterDelete, 3 AfterDestroy,
4 AfterUpdate, 4 AfterUpdate,
5 AllowNull, 5 AllowNull,
6 BeforeCreate, 6 BeforeCreate,
@@ -31,7 +31,9 @@ import {
31 isUserRoleValid, 31 isUserRoleValid,
32 isUserUsernameValid, 32 isUserUsernameValid,
33 isUserVideoQuotaDailyValid, 33 isUserVideoQuotaDailyValid,
34 isUserVideoQuotaValid 34 isUserVideoQuotaValid,
35 isUserVideosHistoryEnabledValid,
36 isUserWebTorrentEnabledValid
35} from '../../helpers/custom-validators/users' 37} from '../../helpers/custom-validators/users'
36import { comparePassword, cryptPassword } from '../../helpers/peertube-crypto' 38import { comparePassword, cryptPassword } from '../../helpers/peertube-crypto'
37import { OAuthTokenModel } from '../oauth/oauth-token' 39import { OAuthTokenModel } from '../oauth/oauth-token'
@@ -42,6 +44,11 @@ import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type'
42import { values } from 'lodash' 44import { values } from 'lodash'
43import { NSFW_POLICY_TYPES } from '../../initializers' 45import { NSFW_POLICY_TYPES } from '../../initializers'
44import { clearCacheByUserId } from '../../lib/oauth-model' 46import { clearCacheByUserId } from '../../lib/oauth-model'
47import { UserNotificationSettingModel } from './user-notification-setting'
48import { VideoModel } from '../video/video'
49import { ActorModel } from '../activitypub/actor'
50import { ActorFollowModel } from '../activitypub/actor-follow'
51import { VideoImportModel } from '../video/video-import'
45 52
46enum ScopeNames { 53enum ScopeNames {
47 WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL' 54 WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL'
@@ -52,6 +59,10 @@ enum ScopeNames {
52 { 59 {
53 model: () => AccountModel, 60 model: () => AccountModel,
54 required: true 61 required: true
62 },
63 {
64 model: () => UserNotificationSettingModel,
65 required: true
55 } 66 }
56 ] 67 ]
57}) 68})
@@ -62,6 +73,10 @@ enum ScopeNames {
62 model: () => AccountModel, 73 model: () => AccountModel,
63 required: true, 74 required: true,
64 include: [ () => VideoChannelModel ] 75 include: [ () => VideoChannelModel ]
76 },
77 {
78 model: () => UserNotificationSettingModel,
79 required: true
65 } 80 }
66 ] 81 ]
67 } 82 }
@@ -109,6 +124,18 @@ export class UserModel extends Model<UserModel> {
109 124
110 @AllowNull(false) 125 @AllowNull(false)
111 @Default(true) 126 @Default(true)
127 @Is('UserWebTorrentEnabled', value => throwIfNotValid(value, isUserWebTorrentEnabledValid, 'WebTorrent enabled'))
128 @Column
129 webTorrentEnabled: boolean
130
131 @AllowNull(false)
132 @Default(true)
133 @Is('UserVideosHistoryEnabled', value => throwIfNotValid(value, isUserVideosHistoryEnabledValid, 'Videos history enabled'))
134 @Column
135 videosHistoryEnabled: boolean
136
137 @AllowNull(false)
138 @Default(true)
112 @Is('UserAutoPlayVideo', value => throwIfNotValid(value, isUserAutoPlayVideoValid, 'auto play video boolean')) 139 @Is('UserAutoPlayVideo', value => throwIfNotValid(value, isUserAutoPlayVideoValid, 'auto play video boolean'))
113 @Column 140 @Column
114 autoPlayVideo: boolean 141 autoPlayVideo: boolean
@@ -153,6 +180,19 @@ export class UserModel extends Model<UserModel> {
153 }) 180 })
154 Account: AccountModel 181 Account: AccountModel
155 182
183 @HasOne(() => UserNotificationSettingModel, {
184 foreignKey: 'userId',
185 onDelete: 'cascade',
186 hooks: true
187 })
188 NotificationSetting: UserNotificationSettingModel
189
190 @HasMany(() => VideoImportModel, {
191 foreignKey: 'userId',
192 onDelete: 'cascade'
193 })
194 VideoImports: VideoImportModel[]
195
156 @HasMany(() => OAuthTokenModel, { 196 @HasMany(() => OAuthTokenModel, {
157 foreignKey: 'userId', 197 foreignKey: 'userId',
158 onDelete: 'cascade' 198 onDelete: 'cascade'
@@ -172,7 +212,7 @@ export class UserModel extends Model<UserModel> {
172 } 212 }
173 213
174 @AfterUpdate 214 @AfterUpdate
175 @AfterDelete 215 @AfterDestroy
176 static removeTokenCache (instance: UserModel) { 216 static removeTokenCache (instance: UserModel) {
177 return clearCacheByUserId(instance.id) 217 return clearCacheByUserId(instance.id)
178 } 218 }
@@ -181,7 +221,25 @@ export class UserModel extends Model<UserModel> {
181 return this.count() 221 return this.count()
182 } 222 }
183 223
184 static listForApi (start: number, count: number, sort: string) { 224 static listForApi (start: number, count: number, sort: string, search?: string) {
225 let where = undefined
226 if (search) {
227 where = {
228 [Sequelize.Op.or]: [
229 {
230 email: {
231 [Sequelize.Op.iLike]: '%' + search + '%'
232 }
233 },
234 {
235 username: {
236 [ Sequelize.Op.iLike ]: '%' + search + '%'
237 }
238 }
239 ]
240 }
241 }
242
185 const query = { 243 const query = {
186 attributes: { 244 attributes: {
187 include: [ 245 include: [
@@ -204,7 +262,8 @@ export class UserModel extends Model<UserModel> {
204 }, 262 },
205 offset: start, 263 offset: start,
206 limit: count, 264 limit: count,
207 order: getSort(sort) 265 order: getSort(sort),
266 where
208 } 267 }
209 268
210 return UserModel.findAndCountAll(query) 269 return UserModel.findAndCountAll(query)
@@ -216,13 +275,12 @@ export class UserModel extends Model<UserModel> {
216 }) 275 })
217 } 276 }
218 277
219 static listEmailsWithRight (right: UserRight) { 278 static listWithRight (right: UserRight) {
220 const roles = Object.keys(USER_ROLE_LABELS) 279 const roles = Object.keys(USER_ROLE_LABELS)
221 .map(k => parseInt(k, 10) as UserRole) 280 .map(k => parseInt(k, 10) as UserRole)
222 .filter(role => hasUserRight(role, right)) 281 .filter(role => hasUserRight(role, right))
223 282
224 const query = { 283 const query = {
225 attribute: [ 'email' ],
226 where: { 284 where: {
227 role: { 285 role: {
228 [Sequelize.Op.in]: roles 286 [Sequelize.Op.in]: roles
@@ -230,9 +288,56 @@ export class UserModel extends Model<UserModel> {
230 } 288 }
231 } 289 }
232 290
233 return UserModel.unscoped() 291 return UserModel.findAll(query)
234 .findAll(query) 292 }
235 .then(u => u.map(u => u.email)) 293
294 static listUserSubscribersOf (actorId: number) {
295 const query = {
296 include: [
297 {
298 model: UserNotificationSettingModel.unscoped(),
299 required: true
300 },
301 {
302 attributes: [ 'userId' ],
303 model: AccountModel.unscoped(),
304 required: true,
305 include: [
306 {
307 attributes: [ ],
308 model: ActorModel.unscoped(),
309 required: true,
310 where: {
311 serverId: null
312 },
313 include: [
314 {
315 attributes: [ ],
316 as: 'ActorFollowings',
317 model: ActorFollowModel.unscoped(),
318 required: true,
319 where: {
320 targetActorId: actorId
321 }
322 }
323 ]
324 }
325 ]
326 }
327 ]
328 }
329
330 return UserModel.unscoped().findAll(query)
331 }
332
333 static listByUsernames (usernames: string[]) {
334 const query = {
335 where: {
336 username: usernames
337 }
338 }
339
340 return UserModel.findAll(query)
236 } 341 }
237 342
238 static loadById (id: number) { 343 static loadById (id: number) {
@@ -281,6 +386,95 @@ export class UserModel extends Model<UserModel> {
281 return UserModel.findOne(query) 386 return UserModel.findOne(query)
282 } 387 }
283 388
389 static loadByVideoId (videoId: number) {
390 const query = {
391 include: [
392 {
393 required: true,
394 attributes: [ 'id' ],
395 model: AccountModel.unscoped(),
396 include: [
397 {
398 required: true,
399 attributes: [ 'id' ],
400 model: VideoChannelModel.unscoped(),
401 include: [
402 {
403 required: true,
404 attributes: [ 'id' ],
405 model: VideoModel.unscoped(),
406 where: {
407 id: videoId
408 }
409 }
410 ]
411 }
412 ]
413 }
414 ]
415 }
416
417 return UserModel.findOne(query)
418 }
419
420 static loadByVideoImportId (videoImportId: number) {
421 const query = {
422 include: [
423 {
424 required: true,
425 attributes: [ 'id' ],
426 model: VideoImportModel.unscoped(),
427 where: {
428 id: videoImportId
429 }
430 }
431 ]
432 }
433
434 return UserModel.findOne(query)
435 }
436
437 static loadByChannelActorId (videoChannelActorId: number) {
438 const query = {
439 include: [
440 {
441 required: true,
442 attributes: [ 'id' ],
443 model: AccountModel.unscoped(),
444 include: [
445 {
446 required: true,
447 attributes: [ 'id' ],
448 model: VideoChannelModel.unscoped(),
449 where: {
450 actorId: videoChannelActorId
451 }
452 }
453 ]
454 }
455 ]
456 }
457
458 return UserModel.findOne(query)
459 }
460
461 static loadByAccountActorId (accountActorId: number) {
462 const query = {
463 include: [
464 {
465 required: true,
466 attributes: [ 'id' ],
467 model: AccountModel.unscoped(),
468 where: {
469 actorId: accountActorId
470 }
471 }
472 ]
473 }
474
475 return UserModel.findOne(query)
476 }
477
284 static getOriginalVideoFileTotalFromUser (user: UserModel) { 478 static getOriginalVideoFileTotalFromUser (user: UserModel) {
285 // Don't use sequelize because we need to use a sub query 479 // Don't use sequelize because we need to use a sub query
286 const query = UserModel.generateUserQuotaBaseSQL() 480 const query = UserModel.generateUserQuotaBaseSQL()
@@ -336,6 +530,8 @@ export class UserModel extends Model<UserModel> {
336 email: this.email, 530 email: this.email,
337 emailVerified: this.emailVerified, 531 emailVerified: this.emailVerified,
338 nsfwPolicy: this.nsfwPolicy, 532 nsfwPolicy: this.nsfwPolicy,
533 webTorrentEnabled: this.webTorrentEnabled,
534 videosHistoryEnabled: this.videosHistoryEnabled,
339 autoPlayVideo: this.autoPlayVideo, 535 autoPlayVideo: this.autoPlayVideo,
340 role: this.role, 536 role: this.role,
341 roleLabel: USER_ROLE_LABELS[ this.role ], 537 roleLabel: USER_ROLE_LABELS[ this.role ],
@@ -345,6 +541,7 @@ export class UserModel extends Model<UserModel> {
345 blocked: this.blocked, 541 blocked: this.blocked,
346 blockedReason: this.blockedReason, 542 blockedReason: this.blockedReason,
347 account: this.Account.toFormattedJSON(), 543 account: this.Account.toFormattedJSON(),
544 notificationSettings: this.NotificationSetting ? this.NotificationSetting.toFormattedJSON() : undefined,
348 videoChannels: [], 545 videoChannels: [],
349 videoQuotaUsed: videoQuotaUsed !== undefined 546 videoQuotaUsed: videoQuotaUsed !== undefined
350 ? parseInt(videoQuotaUsed, 10) 547 ? parseInt(videoQuotaUsed, 10)
diff --git a/server/models/activitypub/actor-follow.ts b/server/models/activitypub/actor-follow.ts
index 27bb43dae..796e07a42 100644
--- a/server/models/activitypub/actor-follow.ts
+++ b/server/models/activitypub/actor-follow.ts
@@ -127,22 +127,6 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
127 if (numberOfActorFollowsRemoved) logger.info('Removed bad %d actor follows.', numberOfActorFollowsRemoved) 127 if (numberOfActorFollowsRemoved) logger.info('Removed bad %d actor follows.', numberOfActorFollowsRemoved)
128 } 128 }
129 129
130 static updateActorFollowsScore (goodInboxes: string[], badInboxes: string[], t: Sequelize.Transaction | undefined) {
131 if (goodInboxes.length === 0 && badInboxes.length === 0) return
132
133 logger.info('Updating %d good actor follows and %d bad actor follows scores.', goodInboxes.length, badInboxes.length)
134
135 if (goodInboxes.length !== 0) {
136 ActorFollowModel.incrementScores(goodInboxes, ACTOR_FOLLOW_SCORE.BONUS, t)
137 .catch(err => logger.error('Cannot increment scores of good actor follows.', { err }))
138 }
139
140 if (badInboxes.length !== 0) {
141 ActorFollowModel.incrementScores(badInboxes, ACTOR_FOLLOW_SCORE.PENALTY, t)
142 .catch(err => logger.error('Cannot decrement scores of bad actor follows.', { err }))
143 }
144 }
145
146 static loadByActorAndTarget (actorId: number, targetActorId: number, t?: Sequelize.Transaction) { 130 static loadByActorAndTarget (actorId: number, targetActorId: number, t?: Sequelize.Transaction) {
147 const query = { 131 const query = {
148 where: { 132 where: {
@@ -280,7 +264,7 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
280 return ActorFollowModel.findAll(query) 264 return ActorFollowModel.findAll(query)
281 } 265 }
282 266
283 static listFollowingForApi (id: number, start: number, count: number, sort: string) { 267 static listFollowingForApi (id: number, start: number, count: number, sort: string, search?: string) {
284 const query = { 268 const query = {
285 distinct: true, 269 distinct: true,
286 offset: start, 270 offset: start,
@@ -299,7 +283,17 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
299 model: ActorModel, 283 model: ActorModel,
300 as: 'ActorFollowing', 284 as: 'ActorFollowing',
301 required: true, 285 required: true,
302 include: [ ServerModel ] 286 include: [
287 {
288 model: ServerModel,
289 required: true,
290 where: search ? {
291 host: {
292 [Sequelize.Op.iLike]: '%' + search + '%'
293 }
294 } : undefined
295 }
296 ]
303 } 297 }
304 ] 298 ]
305 } 299 }
@@ -313,7 +307,50 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
313 }) 307 })
314 } 308 }
315 309
316 static listSubscriptionsForApi (id: number, start: number, count: number, sort: string) { 310 static listFollowersForApi (actorId: number, start: number, count: number, sort: string, search?: string) {
311 const query = {
312 distinct: true,
313 offset: start,
314 limit: count,
315 order: getSort(sort),
316 include: [
317 {
318 model: ActorModel,
319 required: true,
320 as: 'ActorFollower',
321 include: [
322 {
323 model: ServerModel,
324 required: true,
325 where: search ? {
326 host: {
327 [ Sequelize.Op.iLike ]: '%' + search + '%'
328 }
329 } : undefined
330 }
331 ]
332 },
333 {
334 model: ActorModel,
335 as: 'ActorFollowing',
336 required: true,
337 where: {
338 id: actorId
339 }
340 }
341 ]
342 }
343
344 return ActorFollowModel.findAndCountAll(query)
345 .then(({ rows, count }) => {
346 return {
347 data: rows,
348 total: count
349 }
350 })
351 }
352
353 static listSubscriptionsForApi (actorId: number, start: number, count: number, sort: string) {
317 const query = { 354 const query = {
318 attributes: [], 355 attributes: [],
319 distinct: true, 356 distinct: true,
@@ -321,7 +358,7 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
321 limit: count, 358 limit: count,
322 order: getSort(sort), 359 order: getSort(sort),
323 where: { 360 where: {
324 actorId: id 361 actorId: actorId
325 }, 362 },
326 include: [ 363 include: [
327 { 364 {
@@ -370,39 +407,6 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
370 }) 407 })
371 } 408 }
372 409
373 static listFollowersForApi (id: number, start: number, count: number, sort: string) {
374 const query = {
375 distinct: true,
376 offset: start,
377 limit: count,
378 order: getSort(sort),
379 include: [
380 {
381 model: ActorModel,
382 required: true,
383 as: 'ActorFollower',
384 include: [ ServerModel ]
385 },
386 {
387 model: ActorModel,
388 as: 'ActorFollowing',
389 required: true,
390 where: {
391 id
392 }
393 }
394 ]
395 }
396
397 return ActorFollowModel.findAndCountAll(query)
398 .then(({ rows, count }) => {
399 return {
400 data: rows,
401 total: count
402 }
403 })
404 }
405
406 static listAcceptedFollowerUrlsForApi (actorIds: number[], t: Sequelize.Transaction, start?: number, count?: number) { 410 static listAcceptedFollowerUrlsForApi (actorIds: number[], t: Sequelize.Transaction, start?: number, count?: number) {
407 return ActorFollowModel.createListAcceptedFollowForApiQuery('followers', actorIds, t, start, count) 411 return ActorFollowModel.createListAcceptedFollowForApiQuery('followers', actorIds, t, start, count)
408 } 412 }
@@ -444,6 +448,22 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
444 } 448 }
445 } 449 }
446 450
451 static updateFollowScore (inboxUrl: string, value: number, t?: Sequelize.Transaction) {
452 const query = `UPDATE "actorFollow" SET "score" = LEAST("score" + ${value}, ${ACTOR_FOLLOW_SCORE.MAX}) ` +
453 'WHERE id IN (' +
454 'SELECT "actorFollow"."id" FROM "actorFollow" ' +
455 'INNER JOIN "actor" ON "actor"."id" = "actorFollow"."actorId" ' +
456 `WHERE "actor"."inboxUrl" = '${inboxUrl}' OR "actor"."sharedInboxUrl" = '${inboxUrl}'` +
457 ')'
458
459 const options = {
460 type: Sequelize.QueryTypes.BULKUPDATE,
461 transaction: t
462 }
463
464 return ActorFollowModel.sequelize.query(query, options)
465 }
466
447 private static async createListAcceptedFollowForApiQuery ( 467 private static async createListAcceptedFollowForApiQuery (
448 type: 'followers' | 'following', 468 type: 'followers' | 'following',
449 actorIds: number[], 469 actorIds: number[],
@@ -489,33 +509,15 @@ export class ActorFollowModel extends Model<ActorFollowModel> {
489 tasks.push(ActorFollowModel.sequelize.query(query, options)) 509 tasks.push(ActorFollowModel.sequelize.query(query, options))
490 } 510 }
491 511
492 const [ followers, [ { total } ] ] = await Promise.all(tasks) 512 const [ followers, [ dataTotal ] ] = await Promise.all(tasks)
493 const urls: string[] = followers.map(f => f.url) 513 const urls: string[] = followers.map(f => f.url)
494 514
495 return { 515 return {
496 data: urls, 516 data: urls,
497 total: parseInt(total, 10) 517 total: dataTotal ? parseInt(dataTotal.total, 10) : 0
498 } 518 }
499 } 519 }
500 520
501 private static incrementScores (inboxUrls: string[], value: number, t: Sequelize.Transaction | undefined) {
502 const inboxUrlsString = inboxUrls.map(url => `'${url}'`).join(',')
503
504 const query = `UPDATE "actorFollow" SET "score" = LEAST("score" + ${value}, ${ACTOR_FOLLOW_SCORE.MAX}) ` +
505 'WHERE id IN (' +
506 'SELECT "actorFollow"."id" FROM "actorFollow" ' +
507 'INNER JOIN "actor" ON "actor"."id" = "actorFollow"."actorId" ' +
508 'WHERE "actor"."inboxUrl" IN (' + inboxUrlsString + ') OR "actor"."sharedInboxUrl" IN (' + inboxUrlsString + ')' +
509 ')'
510
511 const options = t ? {
512 type: Sequelize.QueryTypes.BULKUPDATE,
513 transaction: t
514 } : undefined
515
516 return ActorFollowModel.sequelize.query(query, options)
517 }
518
519 private static listBadActorFollows () { 521 private static listBadActorFollows () {
520 const query = { 522 const query = {
521 where: { 523 where: {
diff --git a/server/models/activitypub/actor.ts b/server/models/activitypub/actor.ts
index 12b83916e..dda57a8ba 100644
--- a/server/models/activitypub/actor.ts
+++ b/server/models/activitypub/actor.ts
@@ -219,6 +219,7 @@ export class ActorModel extends Model<ActorModel> {
219 name: 'actorId', 219 name: 'actorId',
220 allowNull: false 220 allowNull: false
221 }, 221 },
222 as: 'ActorFollowings',
222 onDelete: 'cascade' 223 onDelete: 'cascade'
223 }) 224 })
224 ActorFollowing: ActorFollowModel[] 225 ActorFollowing: ActorFollowModel[]
diff --git a/server/models/avatar/avatar.ts b/server/models/avatar/avatar.ts
index 5d73e24fa..303aebcc2 100644
--- a/server/models/avatar/avatar.ts
+++ b/server/models/avatar/avatar.ts
@@ -23,7 +23,10 @@ export class AvatarModel extends Model<AvatarModel> {
23 @AfterDestroy 23 @AfterDestroy
24 static removeFilesAndSendDelete (instance: AvatarModel) { 24 static removeFilesAndSendDelete (instance: AvatarModel) {
25 logger.info('Removing avatar file %s.', instance.filename) 25 logger.info('Removing avatar file %s.', instance.filename)
26 return instance.removeAvatar() 26
27 // Don't block the transaction
28 instance.removeAvatar()
29 .catch(err => logger.error('Cannot remove avatar file %s.', instance.filename, err))
27 } 30 }
28 31
29 toFormattedJSON (): Avatar { 32 toFormattedJSON (): Avatar {
diff --git a/server/models/oauth/oauth-token.ts b/server/models/oauth/oauth-token.ts
index ef9592c04..08d892da4 100644
--- a/server/models/oauth/oauth-token.ts
+++ b/server/models/oauth/oauth-token.ts
@@ -1,5 +1,5 @@
1import { 1import {
2 AfterDelete, 2 AfterDestroy,
3 AfterUpdate, 3 AfterUpdate,
4 AllowNull, 4 AllowNull,
5 BelongsTo, 5 BelongsTo,
@@ -47,7 +47,7 @@ enum ScopeNames {
47 required: true, 47 required: true,
48 include: [ 48 include: [
49 { 49 {
50 attributes: [ 'id' ], 50 attributes: [ 'id', 'url' ],
51 model: () => ActorModel.unscoped(), 51 model: () => ActorModel.unscoped(),
52 required: true 52 required: true
53 } 53 }
@@ -126,7 +126,7 @@ export class OAuthTokenModel extends Model<OAuthTokenModel> {
126 OAuthClients: OAuthClientModel[] 126 OAuthClients: OAuthClientModel[]
127 127
128 @AfterUpdate 128 @AfterUpdate
129 @AfterDelete 129 @AfterDestroy
130 static removeTokenCache (token: OAuthTokenModel) { 130 static removeTokenCache (token: OAuthTokenModel) {
131 return clearCacheByToken(token.accessToken) 131 return clearCacheByToken(token.accessToken)
132 } 132 }
diff --git a/server/models/redundancy/video-redundancy.ts b/server/models/redundancy/video-redundancy.ts
index 2ebe23ef1..b722bed14 100644
--- a/server/models/redundancy/video-redundancy.ts
+++ b/server/models/redundancy/video-redundancy.ts
@@ -15,7 +15,7 @@ import {
15import { ActorModel } from '../activitypub/actor' 15import { ActorModel } from '../activitypub/actor'
16import { getVideoSort, throwIfNotValid } from '../utils' 16import { getVideoSort, throwIfNotValid } from '../utils'
17import { isActivityPubUrlValid, isUrlValid } from '../../helpers/custom-validators/activitypub/misc' 17import { isActivityPubUrlValid, isUrlValid } from '../../helpers/custom-validators/activitypub/misc'
18import { CONFIG, CONSTRAINTS_FIELDS, VIDEO_EXT_MIMETYPE } from '../../initializers' 18import { CONFIG, CONSTRAINTS_FIELDS, MIMETYPES } from '../../initializers'
19import { VideoFileModel } from '../video/video-file' 19import { VideoFileModel } from '../video/video-file'
20import { getServerActor } from '../../helpers/utils' 20import { getServerActor } from '../../helpers/utils'
21import { VideoModel } from '../video/video' 21import { VideoModel } from '../video/video'
@@ -28,6 +28,7 @@ import { sample } from 'lodash'
28import { isTestInstance } from '../../helpers/core-utils' 28import { isTestInstance } from '../../helpers/core-utils'
29import * as Bluebird from 'bluebird' 29import * as Bluebird from 'bluebird'
30import * as Sequelize from 'sequelize' 30import * as Sequelize from 'sequelize'
31import { VideoStreamingPlaylistModel } from '../video/video-streaming-playlist'
31 32
32export enum ScopeNames { 33export enum ScopeNames {
33 WITH_VIDEO = 'WITH_VIDEO' 34 WITH_VIDEO = 'WITH_VIDEO'
@@ -38,7 +39,17 @@ export enum ScopeNames {
38 include: [ 39 include: [
39 { 40 {
40 model: () => VideoFileModel, 41 model: () => VideoFileModel,
41 required: true, 42 required: false,
43 include: [
44 {
45 model: () => VideoModel,
46 required: true
47 }
48 ]
49 },
50 {
51 model: () => VideoStreamingPlaylistModel,
52 required: false,
42 include: [ 53 include: [
43 { 54 {
44 model: () => VideoModel, 55 model: () => VideoModel,
@@ -97,12 +108,24 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
97 108
98 @BelongsTo(() => VideoFileModel, { 109 @BelongsTo(() => VideoFileModel, {
99 foreignKey: { 110 foreignKey: {
100 allowNull: false 111 allowNull: true
101 }, 112 },
102 onDelete: 'cascade' 113 onDelete: 'cascade'
103 }) 114 })
104 VideoFile: VideoFileModel 115 VideoFile: VideoFileModel
105 116
117 @ForeignKey(() => VideoStreamingPlaylistModel)
118 @Column
119 videoStreamingPlaylistId: number
120
121 @BelongsTo(() => VideoStreamingPlaylistModel, {
122 foreignKey: {
123 allowNull: true
124 },
125 onDelete: 'cascade'
126 })
127 VideoStreamingPlaylist: VideoStreamingPlaylistModel
128
106 @ForeignKey(() => ActorModel) 129 @ForeignKey(() => ActorModel)
107 @Column 130 @Column
108 actorId: number 131 actorId: number
@@ -117,16 +140,27 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
117 140
118 @BeforeDestroy 141 @BeforeDestroy
119 static async removeFile (instance: VideoRedundancyModel) { 142 static async removeFile (instance: VideoRedundancyModel) {
120 // Not us 143 if (!instance.isOwned()) return
121 if (!instance.strategy) return
122 144
123 const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId) 145 if (instance.videoFileId) {
146 const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId)
124 147
125 const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}` 148 const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}`
126 logger.info('Removing duplicated video file %s.', logIdentifier) 149 logger.info('Removing duplicated video file %s.', logIdentifier)
127 150
128 videoFile.Video.removeFile(videoFile) 151 videoFile.Video.removeFile(videoFile, true)
129 .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err })) 152 .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err }))
153 }
154
155 if (instance.videoStreamingPlaylistId) {
156 const videoStreamingPlaylist = await VideoStreamingPlaylistModel.loadWithVideo(instance.videoStreamingPlaylistId)
157
158 const videoUUID = videoStreamingPlaylist.Video.uuid
159 logger.info('Removing duplicated video streaming playlist %s.', videoUUID)
160
161 videoStreamingPlaylist.Video.removeStreamingPlaylist(true)
162 .catch(err => logger.error('Cannot delete video streaming playlist files of %s.', videoUUID, { err }))
163 }
130 164
131 return undefined 165 return undefined
132 } 166 }
@@ -144,6 +178,19 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
144 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query) 178 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
145 } 179 }
146 180
181 static async loadLocalByStreamingPlaylistId (videoStreamingPlaylistId: number) {
182 const actor = await getServerActor()
183
184 const query = {
185 where: {
186 actorId: actor.id,
187 videoStreamingPlaylistId
188 }
189 }
190
191 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
192 }
193
147 static loadByUrl (url: string, transaction?: Sequelize.Transaction) { 194 static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
148 const query = { 195 const query = {
149 where: { 196 where: {
@@ -192,7 +239,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
192 const ids = rows.map(r => r.id) 239 const ids = rows.map(r => r.id)
193 const id = sample(ids) 240 const id = sample(ids)
194 241
195 return VideoModel.loadWithFile(id, undefined, !isTestInstance()) 242 return VideoModel.loadWithFiles(id, undefined, !isTestInstance())
196 } 243 }
197 244
198 static async findMostViewToDuplicate (randomizedFactor: number) { 245 static async findMostViewToDuplicate (randomizedFactor: number) {
@@ -293,6 +340,11 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
293 } 340 }
294 341
295 return VideoFileModel.sum('size', options as any) // FIXME: typings 342 return VideoFileModel.sum('size', options as any) // FIXME: typings
343 .then(v => {
344 if (!v || isNaN(v)) return 0
345
346 return v
347 })
296 } 348 }
297 349
298 static async listLocalExpired () { 350 static async listLocalExpired () {
@@ -329,40 +381,44 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
329 381
330 static async listLocalOfServer (serverId: number) { 382 static async listLocalOfServer (serverId: number) {
331 const actor = await getServerActor() 383 const actor = await getServerActor()
332 384 const buildVideoInclude = () => ({
333 const query = { 385 model: VideoModel,
334 where: { 386 required: true,
335 actorId: actor.id
336 },
337 include: [ 387 include: [
338 { 388 {
339 model: VideoFileModel, 389 attributes: [],
390 model: VideoChannelModel.unscoped(),
340 required: true, 391 required: true,
341 include: [ 392 include: [
342 { 393 {
343 model: VideoModel, 394 attributes: [],
395 model: ActorModel.unscoped(),
344 required: true, 396 required: true,
345 include: [ 397 where: {
346 { 398 serverId
347 attributes: [], 399 }
348 model: VideoChannelModel.unscoped(),
349 required: true,
350 include: [
351 {
352 attributes: [],
353 model: ActorModel.unscoped(),
354 required: true,
355 where: {
356 serverId
357 }
358 }
359 ]
360 }
361 ]
362 } 400 }
363 ] 401 ]
364 } 402 }
365 ] 403 ]
404 })
405
406 const query = {
407 where: {
408 actorId: actor.id
409 },
410 include: [
411 {
412 model: VideoFileModel,
413 required: false,
414 include: [ buildVideoInclude() ]
415 },
416 {
417 model: VideoStreamingPlaylistModel,
418 required: false,
419 include: [ buildVideoInclude() ]
420 }
421 ]
366 } 422 }
367 423
368 return VideoRedundancyModel.findAll(query) 424 return VideoRedundancyModel.findAll(query)
@@ -391,7 +447,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
391 ] 447 ]
392 } 448 }
393 449
394 return VideoRedundancyModel.find(query as any) // FIXME: typings 450 return VideoRedundancyModel.findOne(query as any) // FIXME: typings
395 .then((r: any) => ({ 451 .then((r: any) => ({
396 totalUsed: parseInt(r.totalUsed.toString(), 10), 452 totalUsed: parseInt(r.totalUsed.toString(), 10),
397 totalVideos: r.totalVideos, 453 totalVideos: r.totalVideos,
@@ -399,7 +455,32 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
399 })) 455 }))
400 } 456 }
401 457
458 getVideo () {
459 if (this.VideoFile) return this.VideoFile.Video
460
461 return this.VideoStreamingPlaylist.Video
462 }
463
464 isOwned () {
465 return !!this.strategy
466 }
467
402 toActivityPubObject (): CacheFileObject { 468 toActivityPubObject (): CacheFileObject {
469 if (this.VideoStreamingPlaylist) {
470 return {
471 id: this.url,
472 type: 'CacheFile' as 'CacheFile',
473 object: this.VideoStreamingPlaylist.Video.url,
474 expires: this.expiresOn.toISOString(),
475 url: {
476 type: 'Link',
477 mimeType: 'application/x-mpegURL',
478 mediaType: 'application/x-mpegURL',
479 href: this.fileUrl
480 }
481 }
482 }
483
403 return { 484 return {
404 id: this.url, 485 id: this.url,
405 type: 'CacheFile' as 'CacheFile', 486 type: 'CacheFile' as 'CacheFile',
@@ -407,7 +488,8 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
407 expires: this.expiresOn.toISOString(), 488 expires: this.expiresOn.toISOString(),
408 url: { 489 url: {
409 type: 'Link', 490 type: 'Link',
410 mimeType: VIDEO_EXT_MIMETYPE[ this.VideoFile.extname ] as any, 491 mimeType: MIMETYPES.VIDEO.EXT_MIMETYPE[ this.VideoFile.extname ] as any,
492 mediaType: MIMETYPES.VIDEO.EXT_MIMETYPE[ this.VideoFile.extname ] as any,
411 href: this.fileUrl, 493 href: this.fileUrl,
412 height: this.VideoFile.resolution, 494 height: this.VideoFile.resolution,
413 size: this.VideoFile.size, 495 size: this.VideoFile.size,
@@ -422,7 +504,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
422 504
423 const notIn = Sequelize.literal( 505 const notIn = Sequelize.literal(
424 '(' + 506 '(' +
425 `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id}` + 507 `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id} AND "videoFileId" IS NOT NULL` +
426 ')' 508 ')'
427 ) 509 )
428 510
diff --git a/server/models/server/server-blocklist.ts b/server/models/server/server-blocklist.ts
new file mode 100644
index 000000000..450f27152
--- /dev/null
+++ b/server/models/server/server-blocklist.ts
@@ -0,0 +1,121 @@
1import { BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2import { AccountModel } from '../account/account'
3import { ServerModel } from './server'
4import { ServerBlock } from '../../../shared/models/blocklist'
5import { getSort } from '../utils'
6
7enum ScopeNames {
8 WITH_ACCOUNT = 'WITH_ACCOUNT',
9 WITH_SERVER = 'WITH_SERVER'
10}
11
12@Scopes({
13 [ScopeNames.WITH_ACCOUNT]: {
14 include: [
15 {
16 model: () => AccountModel,
17 required: true
18 }
19 ]
20 },
21 [ScopeNames.WITH_SERVER]: {
22 include: [
23 {
24 model: () => ServerModel,
25 required: true
26 }
27 ]
28 }
29})
30
31@Table({
32 tableName: 'serverBlocklist',
33 indexes: [
34 {
35 fields: [ 'accountId', 'targetServerId' ],
36 unique: true
37 },
38 {
39 fields: [ 'targetServerId' ]
40 }
41 ]
42})
43export class ServerBlocklistModel extends Model<ServerBlocklistModel> {
44
45 @CreatedAt
46 createdAt: Date
47
48 @UpdatedAt
49 updatedAt: Date
50
51 @ForeignKey(() => AccountModel)
52 @Column
53 accountId: number
54
55 @BelongsTo(() => AccountModel, {
56 foreignKey: {
57 name: 'accountId',
58 allowNull: false
59 },
60 onDelete: 'CASCADE'
61 })
62 ByAccount: AccountModel
63
64 @ForeignKey(() => ServerModel)
65 @Column
66 targetServerId: number
67
68 @BelongsTo(() => ServerModel, {
69 foreignKey: {
70 name: 'targetServerId',
71 allowNull: false
72 },
73 onDelete: 'CASCADE'
74 })
75 BlockedServer: ServerModel
76
77 static loadByAccountAndHost (accountId: number, host: string) {
78 const query = {
79 where: {
80 accountId
81 },
82 include: [
83 {
84 model: ServerModel,
85 where: {
86 host
87 },
88 required: true
89 }
90 ]
91 }
92
93 return ServerBlocklistModel.findOne(query)
94 }
95
96 static listForApi (accountId: number, start: number, count: number, sort: string) {
97 const query = {
98 offset: start,
99 limit: count,
100 order: getSort(sort),
101 where: {
102 accountId
103 }
104 }
105
106 return ServerBlocklistModel
107 .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.WITH_SERVER ])
108 .findAndCountAll(query)
109 .then(({ rows, count }) => {
110 return { total: count, data: rows }
111 })
112 }
113
114 toFormattedJSON (): ServerBlock {
115 return {
116 byAccount: this.ByAccount.toFormattedJSON(),
117 blockedServer: this.BlockedServer.toFormattedJSON(),
118 createdAt: this.createdAt
119 }
120 }
121}
diff --git a/server/models/server/server.ts b/server/models/server/server.ts
index ca3b24d51..300d70938 100644
--- a/server/models/server/server.ts
+++ b/server/models/server/server.ts
@@ -49,4 +49,10 @@ export class ServerModel extends Model<ServerModel> {
49 49
50 return ServerModel.findOne(query) 50 return ServerModel.findOne(query)
51 } 51 }
52
53 toFormattedJSON () {
54 return {
55 host: this.host
56 }
57 }
52} 58}
diff --git a/server/models/utils.ts b/server/models/utils.ts
index e0bf091ad..5b4093aec 100644
--- a/server/models/utils.ts
+++ b/server/models/utils.ts
@@ -29,7 +29,11 @@ function getVideoSort (value: string, lastSort: string[] = [ 'id', 'ASC' ]) {
29 ] 29 ]
30 } 30 }
31 31
32 return [ [ field, direction ], lastSort ] 32 const firstSort = typeof field === 'string' ?
33 field.split('.').concat([ direction ]) :
34 [ field, direction ]
35
36 return [ firstSort, lastSort ]
33} 37}
34 38
35function getSortOnModel (model: any, value: string, lastSort: string[] = [ 'id', 'ASC' ]) { 39function getSortOnModel (model: any, value: string, lastSort: string[] = [ 'id', 'ASC' ]) {
@@ -64,9 +68,25 @@ function createSimilarityAttribute (col: string, value: string) {
64 ) 68 )
65} 69}
66 70
71function buildBlockedAccountSQL (serverAccountId: number, userAccountId?: number) {
72 const blockerIds = [ serverAccountId ]
73 if (userAccountId) blockerIds.push(userAccountId)
74
75 const blockerIdsString = blockerIds.join(', ')
76
77 const query = 'SELECT "targetAccountId" AS "id" FROM "accountBlocklist" WHERE "accountId" IN (' + blockerIdsString + ')' +
78 ' UNION ALL ' +
79 'SELECT "account"."id" AS "id" FROM account INNER JOIN "actor" ON account."actorId" = actor.id ' +
80 'INNER JOIN "serverBlocklist" ON "actor"."serverId" = "serverBlocklist"."targetServerId" ' +
81 'WHERE "serverBlocklist"."accountId" IN (' + blockerIdsString + ')'
82
83 return query
84}
85
67// --------------------------------------------------------------------------- 86// ---------------------------------------------------------------------------
68 87
69export { 88export {
89 buildBlockedAccountSQL,
70 SortType, 90 SortType,
71 getSort, 91 getSort,
72 getVideoSort, 92 getVideoSort,
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts
index dbb88ca45..cc47644f2 100644
--- a/server/models/video/video-abuse.ts
+++ b/server/models/video/video-abuse.ts
@@ -1,17 +1,4 @@
1import { 1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2 AfterCreate,
3 AllowNull,
4 BelongsTo,
5 Column,
6 CreatedAt,
7 DataType,
8 Default,
9 ForeignKey,
10 Is,
11 Model,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { VideoAbuseObject } from '../../../shared/models/activitypub/objects' 2import { VideoAbuseObject } from '../../../shared/models/activitypub/objects'
16import { VideoAbuse } from '../../../shared/models/videos' 3import { VideoAbuse } from '../../../shared/models/videos'
17import { 4import {
@@ -19,7 +6,6 @@ import {
19 isVideoAbuseReasonValid, 6 isVideoAbuseReasonValid,
20 isVideoAbuseStateValid 7 isVideoAbuseStateValid
21} from '../../helpers/custom-validators/video-abuses' 8} from '../../helpers/custom-validators/video-abuses'
22import { Emailer } from '../../lib/emailer'
23import { AccountModel } from '../account/account' 9import { AccountModel } from '../account/account'
24import { getSort, throwIfNotValid } from '../utils' 10import { getSort, throwIfNotValid } from '../utils'
25import { VideoModel } from './video' 11import { VideoModel } from './video'
@@ -40,8 +26,9 @@ import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers'
40export class VideoAbuseModel extends Model<VideoAbuseModel> { 26export class VideoAbuseModel extends Model<VideoAbuseModel> {
41 27
42 @AllowNull(false) 28 @AllowNull(false)
29 @Default(null)
43 @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason')) 30 @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason'))
44 @Column 31 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.REASON.max))
45 reason: string 32 reason: string
46 33
47 @AllowNull(false) 34 @AllowNull(false)
@@ -86,11 +73,6 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> {
86 }) 73 })
87 Video: VideoModel 74 Video: VideoModel
88 75
89 @AfterCreate
90 static sendEmailNotification (instance: VideoAbuseModel) {
91 return Emailer.Instance.addVideoAbuseReportJob(instance.videoId)
92 }
93
94 static loadByIdAndVideoId (id: number, videoId: number) { 76 static loadByIdAndVideoId (id: number, videoId: number) {
95 const query = { 77 const query = {
96 where: { 78 where: {
diff --git a/server/models/video/video-blacklist.ts b/server/models/video/video-blacklist.ts
index 67f7cd487..3b567e488 100644
--- a/server/models/video/video-blacklist.ts
+++ b/server/models/video/video-blacklist.ts
@@ -1,21 +1,7 @@
1import { 1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2 AfterCreate,
3 AfterDestroy,
4 AllowNull,
5 BelongsTo,
6 Column,
7 CreatedAt,
8 DataType,
9 ForeignKey,
10 Is,
11 Model,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { getSortOnModel, SortType, throwIfNotValid } from '../utils' 2import { getSortOnModel, SortType, throwIfNotValid } from '../utils'
16import { VideoModel } from './video' 3import { VideoModel } from './video'
17import { isVideoBlacklistReasonValid } from '../../helpers/custom-validators/video-blacklist' 4import { isVideoBlacklistReasonValid } from '../../helpers/custom-validators/video-blacklist'
18import { Emailer } from '../../lib/emailer'
19import { VideoBlacklist } from '../../../shared/models/videos' 5import { VideoBlacklist } from '../../../shared/models/videos'
20import { CONSTRAINTS_FIELDS } from '../../initializers' 6import { CONSTRAINTS_FIELDS } from '../../initializers'
21 7
@@ -35,6 +21,10 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
35 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max)) 21 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max))
36 reason: string 22 reason: string
37 23
24 @AllowNull(false)
25 @Column
26 unfederated: boolean
27
38 @CreatedAt 28 @CreatedAt
39 createdAt: Date 29 createdAt: Date
40 30
@@ -53,16 +43,6 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
53 }) 43 })
54 Video: VideoModel 44 Video: VideoModel
55 45
56 @AfterCreate
57 static sendBlacklistEmailNotification (instance: VideoBlacklistModel) {
58 return Emailer.Instance.addVideoBlacklistReportJob(instance.videoId, instance.reason)
59 }
60
61 @AfterDestroy
62 static sendUnblacklistEmailNotification (instance: VideoBlacklistModel) {
63 return Emailer.Instance.addVideoUnblacklistReportJob(instance.videoId)
64 }
65
66 static listForApi (start: number, count: number, sort: SortType) { 46 static listForApi (start: number, count: number, sort: SortType) {
67 const query = { 47 const query = {
68 offset: start, 48 offset: start,
@@ -103,6 +83,7 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
103 createdAt: this.createdAt, 83 createdAt: this.createdAt,
104 updatedAt: this.updatedAt, 84 updatedAt: this.updatedAt,
105 reason: this.reason, 85 reason: this.reason,
86 unfederated: this.unfederated,
106 87
107 video: { 88 video: {
108 id: video.id, 89 id: video.id,
diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts
index f4586917e..5598d80f6 100644
--- a/server/models/video/video-channel.ts
+++ b/server/models/video/video-channel.ts
@@ -233,6 +233,27 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
233 }) 233 })
234 } 234 }
235 235
236 static listLocalsForSitemap (sort: string) {
237 const query = {
238 attributes: [ ],
239 offset: 0,
240 order: getSort(sort),
241 include: [
242 {
243 attributes: [ 'preferredUsername', 'serverId' ],
244 model: ActorModel.unscoped(),
245 where: {
246 serverId: null
247 }
248 }
249 ]
250 }
251
252 return VideoChannelModel
253 .unscoped()
254 .findAll(query)
255 }
256
236 static searchForApi (options: { 257 static searchForApi (options: {
237 actorId: number 258 actorId: number
238 search: string 259 search: string
@@ -449,4 +470,8 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
449 getDisplayName () { 470 getDisplayName () {
450 return this.name 471 return this.name
451 } 472 }
473
474 isOutdated () {
475 return this.Actor.isOutdated()
476 }
452} 477}
diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts
index f84c1880c..cf6278da7 100644
--- a/server/models/video/video-comment.ts
+++ b/server/models/video/video-comment.ts
@@ -1,21 +1,37 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import { 2import {
3 AllowNull, BeforeDestroy, BelongsTo, Column, CreatedAt, DataType, ForeignKey, IFindOptions, Is, Model, Scopes, Table, 3 AllowNull,
4 BeforeDestroy,
5 BelongsTo,
6 Column,
7 CreatedAt,
8 DataType,
9 ForeignKey,
10 IFindOptions,
11 Is,
12 Model,
13 Scopes,
14 Table,
4 UpdatedAt 15 UpdatedAt
5} from 'sequelize-typescript' 16} from 'sequelize-typescript'
6import { ActivityTagObject } from '../../../shared/models/activitypub/objects/common-objects' 17import { ActivityTagObject } from '../../../shared/models/activitypub/objects/common-objects'
7import { VideoCommentObject } from '../../../shared/models/activitypub/objects/video-comment-object' 18import { VideoCommentObject } from '../../../shared/models/activitypub/objects/video-comment-object'
8import { VideoComment } from '../../../shared/models/videos/video-comment.model' 19import { VideoComment } from '../../../shared/models/videos/video-comment.model'
9import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' 20import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
10import { CONSTRAINTS_FIELDS } from '../../initializers' 21import { CONFIG, CONSTRAINTS_FIELDS } from '../../initializers'
11import { sendDeleteVideoComment } from '../../lib/activitypub/send' 22import { sendDeleteVideoComment } from '../../lib/activitypub/send'
12import { AccountModel } from '../account/account' 23import { AccountModel } from '../account/account'
13import { ActorModel } from '../activitypub/actor' 24import { ActorModel } from '../activitypub/actor'
14import { AvatarModel } from '../avatar/avatar' 25import { AvatarModel } from '../avatar/avatar'
15import { ServerModel } from '../server/server' 26import { ServerModel } from '../server/server'
16import { getSort, throwIfNotValid } from '../utils' 27import { buildBlockedAccountSQL, getSort, throwIfNotValid } from '../utils'
17import { VideoModel } from './video' 28import { VideoModel } from './video'
18import { VideoChannelModel } from './video-channel' 29import { VideoChannelModel } from './video-channel'
30import { getServerActor } from '../../helpers/utils'
31import { UserModel } from '../account/user'
32import { actorNameAlphabet } from '../../helpers/custom-validators/activitypub/actor'
33import { regexpCapture } from '../../helpers/regexp'
34import { uniq } from 'lodash'
19 35
20enum ScopeNames { 36enum ScopeNames {
21 WITH_ACCOUNT = 'WITH_ACCOUNT', 37 WITH_ACCOUNT = 'WITH_ACCOUNT',
@@ -25,18 +41,29 @@ enum ScopeNames {
25} 41}
26 42
27@Scopes({ 43@Scopes({
28 [ScopeNames.ATTRIBUTES_FOR_API]: { 44 [ScopeNames.ATTRIBUTES_FOR_API]: (serverAccountId: number, userAccountId?: number) => {
29 attributes: { 45 return {
30 include: [ 46 attributes: {
31 [ 47 include: [
32 Sequelize.literal( 48 [
33 '(SELECT COUNT("replies"."id") ' + 49 Sequelize.literal(
34 'FROM "videoComment" AS "replies" ' + 50 '(' +
35 'WHERE "replies"."originCommentId" = "VideoCommentModel"."id")' 51 'WITH "blocklist" AS (' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')' +
36 ), 52 'SELECT COUNT("replies"."id") - (' +
37 'totalReplies' 53 'SELECT COUNT("replies"."id") ' +
54 'FROM "videoComment" AS "replies" ' +
55 'WHERE "replies"."originCommentId" = "VideoCommentModel"."id" ' +
56 'AND "accountId" IN (SELECT "id" FROM "blocklist")' +
57 ')' +
58 'FROM "videoComment" AS "replies" ' +
59 'WHERE "replies"."originCommentId" = "VideoCommentModel"."id" ' +
60 'AND "accountId" NOT IN (SELECT "id" FROM "blocklist")' +
61 ')'
62 ),
63 'totalReplies'
64 ]
38 ] 65 ]
39 ] 66 }
40 } 67 }
41 }, 68 },
42 [ScopeNames.WITH_ACCOUNT]: { 69 [ScopeNames.WITH_ACCOUNT]: {
@@ -267,26 +294,47 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
267 return VideoCommentModel.scope([ ScopeNames.WITH_IN_REPLY_TO, ScopeNames.WITH_VIDEO ]).findOne(query) 294 return VideoCommentModel.scope([ ScopeNames.WITH_IN_REPLY_TO, ScopeNames.WITH_VIDEO ]).findOne(query)
268 } 295 }
269 296
270 static listThreadsForApi (videoId: number, start: number, count: number, sort: string) { 297 static async listThreadsForApi (videoId: number, start: number, count: number, sort: string, user?: UserModel) {
298 const serverActor = await getServerActor()
299 const serverAccountId = serverActor.Account.id
300 const userAccountId = user ? user.Account.id : undefined
301
271 const query = { 302 const query = {
272 offset: start, 303 offset: start,
273 limit: count, 304 limit: count,
274 order: getSort(sort), 305 order: getSort(sort),
275 where: { 306 where: {
276 videoId, 307 videoId,
277 inReplyToCommentId: null 308 inReplyToCommentId: null,
309 accountId: {
310 [Sequelize.Op.notIn]: Sequelize.literal(
311 '(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')'
312 )
313 }
278 } 314 }
279 } 315 }
280 316
317 // FIXME: typings
318 const scopes: any[] = [
319 ScopeNames.WITH_ACCOUNT,
320 {
321 method: [ ScopeNames.ATTRIBUTES_FOR_API, serverAccountId, userAccountId ]
322 }
323 ]
324
281 return VideoCommentModel 325 return VideoCommentModel
282 .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.ATTRIBUTES_FOR_API ]) 326 .scope(scopes)
283 .findAndCountAll(query) 327 .findAndCountAll(query)
284 .then(({ rows, count }) => { 328 .then(({ rows, count }) => {
285 return { total: count, data: rows } 329 return { total: count, data: rows }
286 }) 330 })
287 } 331 }
288 332
289 static listThreadCommentsForApi (videoId: number, threadId: number) { 333 static async listThreadCommentsForApi (videoId: number, threadId: number, user?: UserModel) {
334 const serverActor = await getServerActor()
335 const serverAccountId = serverActor.Account.id
336 const userAccountId = user ? user.Account.id : undefined
337
290 const query = { 338 const query = {
291 order: [ [ 'createdAt', 'ASC' ], [ 'updatedAt', 'ASC' ] ], 339 order: [ [ 'createdAt', 'ASC' ], [ 'updatedAt', 'ASC' ] ],
292 where: { 340 where: {
@@ -294,12 +342,24 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
294 [ Sequelize.Op.or ]: [ 342 [ Sequelize.Op.or ]: [
295 { id: threadId }, 343 { id: threadId },
296 { originCommentId: threadId } 344 { originCommentId: threadId }
297 ] 345 ],
346 accountId: {
347 [Sequelize.Op.notIn]: Sequelize.literal(
348 '(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')'
349 )
350 }
298 } 351 }
299 } 352 }
300 353
354 const scopes: any[] = [
355 ScopeNames.WITH_ACCOUNT,
356 {
357 method: [ ScopeNames.ATTRIBUTES_FOR_API, serverAccountId, userAccountId ]
358 }
359 ]
360
301 return VideoCommentModel 361 return VideoCommentModel
302 .scope([ ScopeNames.WITH_ACCOUNT, ScopeNames.ATTRIBUTES_FOR_API ]) 362 .scope(scopes)
303 .findAndCountAll(query) 363 .findAndCountAll(query)
304 .then(({ rows, count }) => { 364 .then(({ rows, count }) => {
305 return { total: count, data: rows } 365 return { total: count, data: rows }
@@ -313,9 +373,11 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
313 id: { 373 id: {
314 [ Sequelize.Op.in ]: Sequelize.literal('(' + 374 [ Sequelize.Op.in ]: Sequelize.literal('(' +
315 'WITH RECURSIVE children (id, "inReplyToCommentId") AS ( ' + 375 'WITH RECURSIVE children (id, "inReplyToCommentId") AS ( ' +
316 'SELECT id, "inReplyToCommentId" FROM "videoComment" WHERE id = ' + comment.id + ' UNION ' + 376 `SELECT id, "inReplyToCommentId" FROM "videoComment" WHERE id = ${comment.id} ` +
317 'SELECT p.id, p."inReplyToCommentId" from "videoComment" p ' + 377 'UNION ' +
318 'INNER JOIN children c ON c."inReplyToCommentId" = p.id) ' + 378 'SELECT "parent"."id", "parent"."inReplyToCommentId" FROM "videoComment" "parent" ' +
379 'INNER JOIN "children" ON "children"."inReplyToCommentId" = "parent"."id"' +
380 ') ' +
319 'SELECT id FROM children' + 381 'SELECT id FROM children' +
320 ')'), 382 ')'),
321 [ Sequelize.Op.ne ]: comment.id 383 [ Sequelize.Op.ne ]: comment.id
@@ -391,6 +453,10 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
391 } 453 }
392 } 454 }
393 455
456 getCommentStaticPath () {
457 return this.Video.getWatchStaticPath() + ';threadId=' + this.getThreadId()
458 }
459
394 getThreadId (): number { 460 getThreadId (): number {
395 return this.originCommentId || this.id 461 return this.originCommentId || this.id
396 } 462 }
@@ -399,6 +465,34 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
399 return this.Account.isOwned() 465 return this.Account.isOwned()
400 } 466 }
401 467
468 extractMentions () {
469 if (!this.text) return []
470
471 const localMention = `@(${actorNameAlphabet}+)`
472 const remoteMention = `${localMention}@${CONFIG.WEBSERVER.HOST}`
473
474 const remoteMentionsRegex = new RegExp(' ' + remoteMention + ' ', 'g')
475 const localMentionsRegex = new RegExp(' ' + localMention + ' ', 'g')
476 const firstMentionRegex = new RegExp('^(?:(?:' + remoteMention + ')|(?:' + localMention + ')) ', 'g')
477 const endMentionRegex = new RegExp(' (?:(?:' + remoteMention + ')|(?:' + localMention + '))$', 'g')
478
479 return uniq(
480 [].concat(
481 regexpCapture(this.text, remoteMentionsRegex)
482 .map(([ , username ]) => username),
483
484 regexpCapture(this.text, localMentionsRegex)
485 .map(([ , username ]) => username),
486
487 regexpCapture(this.text, firstMentionRegex)
488 .map(([ , username1, username2 ]) => username1 || username2),
489
490 regexpCapture(this.text, endMentionRegex)
491 .map(([ , username1, username2 ]) => username1 || username2)
492 )
493 )
494 }
495
402 toFormattedJSON () { 496 toFormattedJSON () {
403 return { 497 return {
404 id: this.id, 498 id: this.id,
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts
index adebdf0c7..7d1e371b9 100644
--- a/server/models/video/video-file.ts
+++ b/server/models/video/video-file.ts
@@ -1,4 +1,3 @@
1import { values } from 'lodash'
2import { 1import {
3 AllowNull, 2 AllowNull,
4 BelongsTo, 3 BelongsTo,
@@ -14,12 +13,12 @@ import {
14 UpdatedAt 13 UpdatedAt
15} from 'sequelize-typescript' 14} from 'sequelize-typescript'
16import { 15import {
16 isVideoFileExtnameValid,
17 isVideoFileInfoHashValid, 17 isVideoFileInfoHashValid,
18 isVideoFileResolutionValid, 18 isVideoFileResolutionValid,
19 isVideoFileSizeValid, 19 isVideoFileSizeValid,
20 isVideoFPSResolutionValid 20 isVideoFPSResolutionValid
21} from '../../helpers/custom-validators/videos' 21} from '../../helpers/custom-validators/videos'
22import { CONSTRAINTS_FIELDS } from '../../initializers'
23import { throwIfNotValid } from '../utils' 22import { throwIfNotValid } from '../utils'
24import { VideoModel } from './video' 23import { VideoModel } from './video'
25import * as Sequelize from 'sequelize' 24import * as Sequelize from 'sequelize'
@@ -58,11 +57,12 @@ export class VideoFileModel extends Model<VideoFileModel> {
58 size: number 57 size: number
59 58
60 @AllowNull(false) 59 @AllowNull(false)
61 @Column(DataType.ENUM(values(CONSTRAINTS_FIELDS.VIDEOS.EXTNAME))) 60 @Is('VideoFileExtname', value => throwIfNotValid(value, isVideoFileExtnameValid, 'extname'))
61 @Column
62 extname: string 62 extname: string
63 63
64 @AllowNull(false) 64 @AllowNull(false)
65 @Is('VideoFileSize', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash')) 65 @Is('VideoFileInfohash', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash'))
66 @Column 66 @Column
67 infoHash: string 67 infoHash: string
68 68
@@ -86,14 +86,14 @@ export class VideoFileModel extends Model<VideoFileModel> {
86 86
87 @HasMany(() => VideoRedundancyModel, { 87 @HasMany(() => VideoRedundancyModel, {
88 foreignKey: { 88 foreignKey: {
89 allowNull: false 89 allowNull: true
90 }, 90 },
91 onDelete: 'CASCADE', 91 onDelete: 'CASCADE',
92 hooks: true 92 hooks: true
93 }) 93 })
94 RedundancyVideos: VideoRedundancyModel[] 94 RedundancyVideos: VideoRedundancyModel[]
95 95
96 static isInfohashExists (infoHash: string) { 96 static doesInfohashExist (infoHash: string) {
97 const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' 97 const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1'
98 const options = { 98 const options = {
99 type: Sequelize.QueryTypes.SELECT, 99 type: Sequelize.QueryTypes.SELECT,
@@ -120,6 +120,26 @@ export class VideoFileModel extends Model<VideoFileModel> {
120 return VideoFileModel.findById(id, options) 120 return VideoFileModel.findById(id, options)
121 } 121 }
122 122
123 static async getStats () {
124 let totalLocalVideoFilesSize = await VideoFileModel.sum('size', {
125 include: [
126 {
127 attributes: [],
128 model: VideoModel.unscoped(),
129 where: {
130 remote: false
131 }
132 }
133 ]
134 } as any)
135 // Sequelize could return null...
136 if (!totalLocalVideoFilesSize) totalLocalVideoFilesSize = 0
137
138 return {
139 totalLocalVideoFilesSize
140 }
141 }
142
123 hasSameUniqueKeysThan (other: VideoFileModel) { 143 hasSameUniqueKeysThan (other: VideoFileModel) {
124 return this.fps === other.fps && 144 return this.fps === other.fps &&
125 this.resolution === other.resolution && 145 this.resolution === other.resolution &&
diff --git a/server/models/video/video-format-utils.ts b/server/models/video/video-format-utils.ts
index e7bff2ed7..76d0445d4 100644
--- a/server/models/video/video-format-utils.ts
+++ b/server/models/video/video-format-utils.ts
@@ -1,8 +1,13 @@
1import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos' 1import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos'
2import { VideoModel } from './video' 2import { VideoModel } from './video'
3import { VideoFileModel } from './video-file' 3import { VideoFileModel } from './video-file'
4import { ActivityUrlObject, VideoTorrentObject } from '../../../shared/models/activitypub/objects' 4import {
5import { CONFIG, THUMBNAILS_SIZE, VIDEO_EXT_MIMETYPE } from '../../initializers' 5 ActivityPlaylistInfohashesObject,
6 ActivityPlaylistSegmentHashesObject,
7 ActivityUrlObject,
8 VideoTorrentObject
9} from '../../../shared/models/activitypub/objects'
10import { CONFIG, MIMETYPES, THUMBNAILS_SIZE } from '../../initializers'
6import { VideoCaptionModel } from './video-caption' 11import { VideoCaptionModel } from './video-caption'
7import { 12import {
8 getVideoCommentsActivityPubUrl, 13 getVideoCommentsActivityPubUrl,
@@ -11,6 +16,8 @@ import {
11 getVideoSharesActivityPubUrl 16 getVideoSharesActivityPubUrl
12} from '../../lib/activitypub' 17} from '../../lib/activitypub'
13import { isArray } from '../../helpers/custom-validators/misc' 18import { isArray } from '../../helpers/custom-validators/misc'
19import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
20import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
14 21
15export type VideoFormattingJSONOptions = { 22export type VideoFormattingJSONOptions = {
16 completeDescription?: boolean 23 completeDescription?: boolean
@@ -120,7 +127,12 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
120 } 127 }
121 }) 128 })
122 129
130 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
131
123 const tags = video.Tags ? video.Tags.map(t => t.name) : [] 132 const tags = video.Tags ? video.Tags.map(t => t.name) : []
133
134 const streamingPlaylists = streamingPlaylistsModelToFormattedJSON(video, video.VideoStreamingPlaylists)
135
124 const detailsJson = { 136 const detailsJson = {
125 support: video.support, 137 support: video.support,
126 descriptionPath: video.getDescriptionAPIPath(), 138 descriptionPath: video.getDescriptionAPIPath(),
@@ -134,7 +146,11 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
134 id: video.state, 146 id: video.state,
135 label: VideoModel.getStateLabel(video.state) 147 label: VideoModel.getStateLabel(video.state)
136 }, 148 },
137 files: [] 149
150 trackerUrls: video.getTrackerUrls(baseUrlHttp, baseUrlWs),
151
152 files: [],
153 streamingPlaylists
138 } 154 }
139 155
140 // Format and sort video files 156 // Format and sort video files
@@ -143,6 +159,25 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
143 return Object.assign(formattedJson, detailsJson) 159 return Object.assign(formattedJson, detailsJson)
144} 160}
145 161
162function streamingPlaylistsModelToFormattedJSON (video: VideoModel, playlists: VideoStreamingPlaylistModel[]): VideoStreamingPlaylist[] {
163 if (isArray(playlists) === false) return []
164
165 return playlists
166 .map(playlist => {
167 const redundancies = isArray(playlist.RedundancyVideos)
168 ? playlist.RedundancyVideos.map(r => ({ baseUrl: r.fileUrl }))
169 : []
170
171 return {
172 id: playlist.id,
173 type: playlist.type,
174 playlistUrl: playlist.playlistUrl,
175 segmentsSha256Url: playlist.segmentsSha256Url,
176 redundancies
177 } as VideoStreamingPlaylist
178 })
179}
180
146function videoFilesModelToFormattedJSON (video: VideoModel, videoFiles: VideoFileModel[]): VideoFile[] { 181function videoFilesModelToFormattedJSON (video: VideoModel, videoFiles: VideoFileModel[]): VideoFile[] {
147 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls() 182 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
148 183
@@ -208,7 +243,8 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject {
208 for (const file of video.VideoFiles) { 243 for (const file of video.VideoFiles) {
209 url.push({ 244 url.push({
210 type: 'Link', 245 type: 'Link',
211 mimeType: VIDEO_EXT_MIMETYPE[ file.extname ] as any, 246 mimeType: MIMETYPES.VIDEO.EXT_MIMETYPE[ file.extname ] as any,
247 mediaType: MIMETYPES.VIDEO.EXT_MIMETYPE[ file.extname ] as any,
212 href: video.getVideoFileUrl(file, baseUrlHttp), 248 href: video.getVideoFileUrl(file, baseUrlHttp),
213 height: file.resolution, 249 height: file.resolution,
214 size: file.size, 250 size: file.size,
@@ -218,6 +254,7 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject {
218 url.push({ 254 url.push({
219 type: 'Link', 255 type: 'Link',
220 mimeType: 'application/x-bittorrent' as 'application/x-bittorrent', 256 mimeType: 'application/x-bittorrent' as 'application/x-bittorrent',
257 mediaType: 'application/x-bittorrent' as 'application/x-bittorrent',
221 href: video.getTorrentUrl(file, baseUrlHttp), 258 href: video.getTorrentUrl(file, baseUrlHttp),
222 height: file.resolution 259 height: file.resolution
223 }) 260 })
@@ -225,15 +262,39 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject {
225 url.push({ 262 url.push({
226 type: 'Link', 263 type: 'Link',
227 mimeType: 'application/x-bittorrent;x-scheme-handler/magnet' as 'application/x-bittorrent;x-scheme-handler/magnet', 264 mimeType: 'application/x-bittorrent;x-scheme-handler/magnet' as 'application/x-bittorrent;x-scheme-handler/magnet',
265 mediaType: 'application/x-bittorrent;x-scheme-handler/magnet' as 'application/x-bittorrent;x-scheme-handler/magnet',
228 href: video.generateMagnetUri(file, baseUrlHttp, baseUrlWs), 266 href: video.generateMagnetUri(file, baseUrlHttp, baseUrlWs),
229 height: file.resolution 267 height: file.resolution
230 }) 268 })
231 } 269 }
232 270
271 for (const playlist of (video.VideoStreamingPlaylists || [])) {
272 let tag: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
273
274 tag = playlist.p2pMediaLoaderInfohashes
275 .map(i => ({ type: 'Infohash' as 'Infohash', name: i }))
276 tag.push({
277 type: 'Link',
278 name: 'sha256',
279 mimeType: 'application/json' as 'application/json',
280 mediaType: 'application/json' as 'application/json',
281 href: playlist.segmentsSha256Url
282 })
283
284 url.push({
285 type: 'Link',
286 mimeType: 'application/x-mpegURL' as 'application/x-mpegURL',
287 mediaType: 'application/x-mpegURL' as 'application/x-mpegURL',
288 href: playlist.playlistUrl,
289 tag
290 })
291 }
292
233 // Add video url too 293 // Add video url too
234 url.push({ 294 url.push({
235 type: 'Link', 295 type: 'Link',
236 mimeType: 'text/html', 296 mimeType: 'text/html',
297 mediaType: 'text/html',
237 href: CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid 298 href: CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid
238 }) 299 })
239 300
diff --git a/server/models/video/video-import.ts b/server/models/video/video-import.ts
index 8d442b3f8..c723e57c0 100644
--- a/server/models/video/video-import.ts
+++ b/server/models/video/video-import.ts
@@ -144,6 +144,10 @@ export class VideoImportModel extends Model<VideoImportModel> {
144 }) 144 })
145 } 145 }
146 146
147 getTargetIdentifier () {
148 return this.targetUrl || this.magnetUri || this.torrentName
149 }
150
147 toFormattedJSON (): VideoImport { 151 toFormattedJSON (): VideoImport {
148 const videoFormatOptions = { 152 const videoFormatOptions = {
149 completeDescription: true, 153 completeDescription: true,
diff --git a/server/models/video/video-share.ts b/server/models/video/video-share.ts
index fa9a70d50..c87f71277 100644
--- a/server/models/video/video-share.ts
+++ b/server/models/video/video-share.ts
@@ -88,7 +88,7 @@ export class VideoShareModel extends Model<VideoShareModel> {
88 }) 88 })
89 Video: VideoModel 89 Video: VideoModel
90 90
91 static load (actorId: number, videoId: number, t: Sequelize.Transaction) { 91 static load (actorId: number, videoId: number, t?: Sequelize.Transaction) {
92 return VideoShareModel.scope(ScopeNames.WITH_ACTOR).findOne({ 92 return VideoShareModel.scope(ScopeNames.WITH_ACTOR).findOne({
93 where: { 93 where: {
94 actorId, 94 actorId,
diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts
new file mode 100644
index 000000000..bf6f7b0c4
--- /dev/null
+++ b/server/models/video/video-streaming-playlist.ts
@@ -0,0 +1,158 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, HasMany, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
3import { throwIfNotValid } from '../utils'
4import { VideoModel } from './video'
5import * as Sequelize from 'sequelize'
6import { VideoRedundancyModel } from '../redundancy/video-redundancy'
7import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
8import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
9import { CONSTRAINTS_FIELDS, STATIC_PATHS } from '../../initializers'
10import { VideoFileModel } from './video-file'
11import { join } from 'path'
12import { sha1 } from '../../helpers/core-utils'
13import { isArrayOf } from '../../helpers/custom-validators/misc'
14
15@Table({
16 tableName: 'videoStreamingPlaylist',
17 indexes: [
18 {
19 fields: [ 'videoId' ]
20 },
21 {
22 fields: [ 'videoId', 'type' ],
23 unique: true
24 },
25 {
26 fields: [ 'p2pMediaLoaderInfohashes' ],
27 using: 'gin'
28 }
29 ]
30})
31export class VideoStreamingPlaylistModel extends Model<VideoStreamingPlaylistModel> {
32 @CreatedAt
33 createdAt: Date
34
35 @UpdatedAt
36 updatedAt: Date
37
38 @AllowNull(false)
39 @Column
40 type: VideoStreamingPlaylistType
41
42 @AllowNull(false)
43 @Is('PlaylistUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'playlist url'))
44 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.URL.max))
45 playlistUrl: string
46
47 @AllowNull(false)
48 @Is('VideoStreamingPlaylistInfoHashes', value => throwIfNotValid(value, v => isArrayOf(v, isVideoFileInfoHashValid), 'info hashes'))
49 @Column(DataType.ARRAY(DataType.STRING))
50 p2pMediaLoaderInfohashes: string[]
51
52 @AllowNull(false)
53 @Is('VideoStreamingSegmentsSha256Url', value => throwIfNotValid(value, isActivityPubUrlValid, 'segments sha256 url'))
54 @Column
55 segmentsSha256Url: string
56
57 @ForeignKey(() => VideoModel)
58 @Column
59 videoId: number
60
61 @BelongsTo(() => VideoModel, {
62 foreignKey: {
63 allowNull: false
64 },
65 onDelete: 'CASCADE'
66 })
67 Video: VideoModel
68
69 @HasMany(() => VideoRedundancyModel, {
70 foreignKey: {
71 allowNull: false
72 },
73 onDelete: 'CASCADE',
74 hooks: true
75 })
76 RedundancyVideos: VideoRedundancyModel[]
77
78 static doesInfohashExist (infoHash: string) {
79 const query = 'SELECT 1 FROM "videoStreamingPlaylist" WHERE $infoHash = ANY("p2pMediaLoaderInfohashes") LIMIT 1'
80 const options = {
81 type: Sequelize.QueryTypes.SELECT,
82 bind: { infoHash },
83 raw: true
84 }
85
86 return VideoModel.sequelize.query(query, options)
87 .then(results => {
88 return results.length === 1
89 })
90 }
91
92 static buildP2PMediaLoaderInfoHashes (playlistUrl: string, videoFiles: VideoFileModel[]) {
93 const hashes: string[] = []
94
95 // https://github.com/Novage/p2p-media-loader/blob/master/p2p-media-loader-core/lib/p2p-media-manager.ts#L97
96 for (let i = 0; i < videoFiles.length; i++) {
97 hashes.push(sha1(`1${playlistUrl}+V${i}`))
98 }
99
100 return hashes
101 }
102
103 static loadWithVideo (id: number) {
104 const options = {
105 include: [
106 {
107 model: VideoModel.unscoped(),
108 required: true
109 }
110 ]
111 }
112
113 return VideoStreamingPlaylistModel.findById(id, options)
114 }
115
116 static getHlsPlaylistFilename (resolution: number) {
117 return resolution + '.m3u8'
118 }
119
120 static getMasterHlsPlaylistFilename () {
121 return 'master.m3u8'
122 }
123
124 static getHlsSha256SegmentsFilename () {
125 return 'segments-sha256.json'
126 }
127
128 static getHlsVideoName (uuid: string, resolution: number) {
129 return `${uuid}-${resolution}-fragmented.mp4`
130 }
131
132 static getHlsMasterPlaylistStaticPath (videoUUID: string) {
133 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
134 }
135
136 static getHlsPlaylistStaticPath (videoUUID: string, resolution: number) {
137 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
138 }
139
140 static getHlsSha256SegmentsStaticPath (videoUUID: string) {
141 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
142 }
143
144 getStringType () {
145 if (this.type === VideoStreamingPlaylistType.HLS) return 'hls'
146
147 return 'unknown'
148 }
149
150 getVideoRedundancyUrl (baseUrlHttp: string) {
151 return baseUrlHttp + STATIC_PATHS.REDUNDANCY + this.getStringType() + '/' + this.Video.uuid
152 }
153
154 hasSameUniqueKeysThan (other: VideoStreamingPlaylistModel) {
155 return this.type === other.type &&
156 this.videoId === other.videoId
157 }
158}
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index a9baaf1da..0feeed4f8 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -27,7 +27,7 @@ import {
27 Table, 27 Table,
28 UpdatedAt 28 UpdatedAt
29} from 'sequelize-typescript' 29} from 'sequelize-typescript'
30import { VideoPrivacy, VideoState } from '../../../shared' 30import { UserRight, VideoPrivacy, VideoState } from '../../../shared'
31import { VideoTorrentObject } from '../../../shared/models/activitypub/objects' 31import { VideoTorrentObject } from '../../../shared/models/activitypub/objects'
32import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos' 32import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos'
33import { VideoFilter } from '../../../shared/models/videos/video-query.type' 33import { VideoFilter } from '../../../shared/models/videos/video-query.type'
@@ -52,7 +52,7 @@ import {
52 ACTIVITY_PUB, 52 ACTIVITY_PUB,
53 API_VERSION, 53 API_VERSION,
54 CONFIG, 54 CONFIG,
55 CONSTRAINTS_FIELDS, 55 CONSTRAINTS_FIELDS, HLS_PLAYLIST_DIRECTORY, HLS_REDUNDANCY_DIRECTORY,
56 PREVIEWS_SIZE, 56 PREVIEWS_SIZE,
57 REMOTE_SCHEME, 57 REMOTE_SCHEME,
58 STATIC_DOWNLOAD_PATHS, 58 STATIC_DOWNLOAD_PATHS,
@@ -70,7 +70,7 @@ import { AccountVideoRateModel } from '../account/account-video-rate'
70import { ActorModel } from '../activitypub/actor' 70import { ActorModel } from '../activitypub/actor'
71import { AvatarModel } from '../avatar/avatar' 71import { AvatarModel } from '../avatar/avatar'
72import { ServerModel } from '../server/server' 72import { ServerModel } from '../server/server'
73import { buildTrigramSearchIndex, createSimilarityAttribute, getVideoSort, throwIfNotValid } from '../utils' 73import { buildBlockedAccountSQL, buildTrigramSearchIndex, createSimilarityAttribute, getVideoSort, throwIfNotValid } from '../utils'
74import { TagModel } from './tag' 74import { TagModel } from './tag'
75import { VideoAbuseModel } from './video-abuse' 75import { VideoAbuseModel } from './video-abuse'
76import { VideoChannelModel } from './video-channel' 76import { VideoChannelModel } from './video-channel'
@@ -93,6 +93,9 @@ import {
93} from './video-format-utils' 93} from './video-format-utils'
94import * as validator from 'validator' 94import * as validator from 'validator'
95import { UserVideoHistoryModel } from '../account/user-video-history' 95import { UserVideoHistoryModel } from '../account/user-video-history'
96import { UserModel } from '../account/user'
97import { VideoImportModel } from './video-import'
98import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
96 99
97// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation 100// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation
98const indexes: Sequelize.DefineIndexesOptions[] = [ 101const indexes: Sequelize.DefineIndexesOptions[] = [
@@ -101,17 +104,45 @@ const indexes: Sequelize.DefineIndexesOptions[] = [
101 { fields: [ 'createdAt' ] }, 104 { fields: [ 'createdAt' ] },
102 { fields: [ 'publishedAt' ] }, 105 { fields: [ 'publishedAt' ] },
103 { fields: [ 'duration' ] }, 106 { fields: [ 'duration' ] },
104 { fields: [ 'category' ] },
105 { fields: [ 'licence' ] },
106 { fields: [ 'nsfw' ] },
107 { fields: [ 'language' ] },
108 { fields: [ 'waitTranscoding' ] },
109 { fields: [ 'state' ] },
110 { fields: [ 'remote' ] },
111 { fields: [ 'views' ] }, 107 { fields: [ 'views' ] },
112 { fields: [ 'likes' ] },
113 { fields: [ 'channelId' ] }, 108 { fields: [ 'channelId' ] },
114 { 109 {
110 fields: [ 'category' ], // We don't care videos with an unknown category
111 where: {
112 category: {
113 [Sequelize.Op.ne]: null
114 }
115 }
116 },
117 {
118 fields: [ 'licence' ], // We don't care videos with an unknown licence
119 where: {
120 licence: {
121 [Sequelize.Op.ne]: null
122 }
123 }
124 },
125 {
126 fields: [ 'language' ], // We don't care videos with an unknown language
127 where: {
128 language: {
129 [Sequelize.Op.ne]: null
130 }
131 }
132 },
133 {
134 fields: [ 'nsfw' ], // Most of the videos are not NSFW
135 where: {
136 nsfw: true
137 }
138 },
139 {
140 fields: [ 'remote' ], // Only index local videos
141 where: {
142 remote: false
143 }
144 },
145 {
115 fields: [ 'uuid' ], 146 fields: [ 'uuid' ],
116 unique: true 147 unique: true
117 }, 148 },
@@ -129,7 +160,9 @@ export enum ScopeNames {
129 WITH_FILES = 'WITH_FILES', 160 WITH_FILES = 'WITH_FILES',
130 WITH_SCHEDULED_UPDATE = 'WITH_SCHEDULED_UPDATE', 161 WITH_SCHEDULED_UPDATE = 'WITH_SCHEDULED_UPDATE',
131 WITH_BLACKLISTED = 'WITH_BLACKLISTED', 162 WITH_BLACKLISTED = 'WITH_BLACKLISTED',
132 WITH_USER_HISTORY = 'WITH_USER_HISTORY' 163 WITH_USER_HISTORY = 'WITH_USER_HISTORY',
164 WITH_STREAMING_PLAYLISTS = 'WITH_STREAMING_PLAYLISTS',
165 WITH_USER_ID = 'WITH_USER_ID'
133} 166}
134 167
135type ForAPIOptions = { 168type ForAPIOptions = {
@@ -138,7 +171,8 @@ type ForAPIOptions = {
138} 171}
139 172
140type AvailableForListIDsOptions = { 173type AvailableForListIDsOptions = {
141 actorId: number 174 serverAccountId: number
175 followerActorId: number
142 includeLocalVideos: boolean 176 includeLocalVideos: boolean
143 filter?: VideoFilter 177 filter?: VideoFilter
144 categoryOneOf?: number[] 178 categoryOneOf?: number[]
@@ -151,6 +185,8 @@ type AvailableForListIDsOptions = {
151 accountId?: number 185 accountId?: number
152 videoChannelId?: number 186 videoChannelId?: number
153 trendingDays?: number 187 trendingDays?: number
188 user?: UserModel,
189 historyOfUser?: UserModel
154} 190}
155 191
156@Scopes({ 192@Scopes({
@@ -236,6 +272,22 @@ type AvailableForListIDsOptions = {
236 } 272 }
237 ] 273 ]
238 }, 274 },
275 channelId: {
276 [ Sequelize.Op.notIn ]: Sequelize.literal(
277 '(' +
278 'SELECT id FROM "videoChannel" WHERE "accountId" IN (' +
279 buildBlockedAccountSQL(options.serverAccountId, options.user ? options.user.Account.id : undefined) +
280 ')' +
281 ')'
282 )
283 }
284 },
285 include: []
286 }
287
288 // Only list public/published videos
289 if (!options.filter || options.filter !== 'all-local') {
290 const privacyWhere = {
239 // Always list public videos 291 // Always list public videos
240 privacy: VideoPrivacy.PUBLIC, 292 privacy: VideoPrivacy.PUBLIC,
241 // Always list published videos, or videos that are being transcoded but on which we don't want to wait for transcoding 293 // Always list published videos, or videos that are being transcoded but on which we don't want to wait for transcoding
@@ -250,8 +302,9 @@ type AvailableForListIDsOptions = {
250 } 302 }
251 } 303 }
252 ] 304 ]
253 }, 305 }
254 include: [] 306
307 Object.assign(query.where, privacyWhere)
255 } 308 }
256 309
257 if (options.filter || options.accountId || options.videoChannelId) { 310 if (options.filter || options.accountId || options.videoChannelId) {
@@ -295,7 +348,7 @@ type AvailableForListIDsOptions = {
295 query.include.push(videoChannelInclude) 348 query.include.push(videoChannelInclude)
296 } 349 }
297 350
298 if (options.actorId) { 351 if (options.followerActorId) {
299 let localVideosReq = '' 352 let localVideosReq = ''
300 if (options.includeLocalVideos === true) { 353 if (options.includeLocalVideos === true) {
301 localVideosReq = ' UNION ALL ' + 354 localVideosReq = ' UNION ALL ' +
@@ -307,7 +360,7 @@ type AvailableForListIDsOptions = {
307 } 360 }
308 361
309 // Force actorId to be a number to avoid SQL injections 362 // Force actorId to be a number to avoid SQL injections
310 const actorIdNumber = parseInt(options.actorId.toString(), 10) 363 const actorIdNumber = parseInt(options.followerActorId.toString(), 10)
311 query.where[ 'id' ][ Sequelize.Op.and ].push({ 364 query.where[ 'id' ][ Sequelize.Op.and ].push({
312 [ Sequelize.Op.in ]: Sequelize.literal( 365 [ Sequelize.Op.in ]: Sequelize.literal(
313 '(' + 366 '(' +
@@ -396,8 +449,39 @@ type AvailableForListIDsOptions = {
396 query.subQuery = false 449 query.subQuery = false
397 } 450 }
398 451
452 if (options.historyOfUser) {
453 query.include.push({
454 model: UserVideoHistoryModel,
455 required: true,
456 where: {
457 userId: options.historyOfUser.id
458 }
459 })
460
461 // Even if the relation is n:m, we know that a user only have 0..1 video history
462 // So we won't have multiple rows for the same video
463 // Without this, we would not be able to sort on "updatedAt" column of UserVideoHistoryModel
464 query.subQuery = false
465 }
466
399 return query 467 return query
400 }, 468 },
469 [ ScopeNames.WITH_USER_ID ]: {
470 include: [
471 {
472 attributes: [ 'accountId' ],
473 model: () => VideoChannelModel.unscoped(),
474 required: true,
475 include: [
476 {
477 attributes: [ 'userId' ],
478 model: () => AccountModel.unscoped(),
479 required: true
480 }
481 ]
482 }
483 ]
484 },
401 [ ScopeNames.WITH_ACCOUNT_DETAILS ]: { 485 [ ScopeNames.WITH_ACCOUNT_DETAILS ]: {
402 include: [ 486 include: [
403 { 487 {
@@ -462,22 +546,55 @@ type AvailableForListIDsOptions = {
462 } 546 }
463 ] 547 ]
464 }, 548 },
465 [ ScopeNames.WITH_FILES ]: { 549 [ ScopeNames.WITH_FILES ]: (withRedundancies = false) => {
466 include: [ 550 let subInclude: any[] = []
467 { 551
468 model: () => VideoFileModel.unscoped(), 552 if (withRedundancies === true) {
469 // FIXME: typings 553 subInclude = [
470 [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join 554 {
471 required: false, 555 attributes: [ 'fileUrl' ],
472 include: [ 556 model: VideoRedundancyModel.unscoped(),
473 { 557 required: false
474 attributes: [ 'fileUrl' ], 558 }
475 model: () => VideoRedundancyModel.unscoped(), 559 ]
476 required: false 560 }
477 } 561
478 ] 562 return {
479 } 563 include: [
480 ] 564 {
565 model: VideoFileModel.unscoped(),
566 // FIXME: typings
567 [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join
568 required: false,
569 include: subInclude
570 }
571 ]
572 }
573 },
574 [ ScopeNames.WITH_STREAMING_PLAYLISTS ]: (withRedundancies = false) => {
575 let subInclude: any[] = []
576
577 if (withRedundancies === true) {
578 subInclude = [
579 {
580 attributes: [ 'fileUrl' ],
581 model: VideoRedundancyModel.unscoped(),
582 required: false
583 }
584 ]
585 }
586
587 return {
588 include: [
589 {
590 model: VideoStreamingPlaylistModel.unscoped(),
591 // FIXME: typings
592 [ 'separate' as any ]: true, // We may have multiple streaming playlists, having multiple redundancies so let's separate this join
593 required: false,
594 include: subInclude
595 }
596 ]
597 }
481 }, 598 },
482 [ ScopeNames.WITH_SCHEDULED_UPDATE ]: { 599 [ ScopeNames.WITH_SCHEDULED_UPDATE ]: {
483 include: [ 600 include: [
@@ -661,6 +778,16 @@ export class VideoModel extends Model<VideoModel> {
661 }) 778 })
662 VideoFiles: VideoFileModel[] 779 VideoFiles: VideoFileModel[]
663 780
781 @HasMany(() => VideoStreamingPlaylistModel, {
782 foreignKey: {
783 name: 'videoId',
784 allowNull: false
785 },
786 hooks: true,
787 onDelete: 'cascade'
788 })
789 VideoStreamingPlaylists: VideoStreamingPlaylistModel[]
790
664 @HasMany(() => VideoShareModel, { 791 @HasMany(() => VideoShareModel, {
665 foreignKey: { 792 foreignKey: {
666 name: 'videoId', 793 name: 'videoId',
@@ -725,6 +852,15 @@ export class VideoModel extends Model<VideoModel> {
725 }) 852 })
726 VideoBlacklist: VideoBlacklistModel 853 VideoBlacklist: VideoBlacklistModel
727 854
855 @HasOne(() => VideoImportModel, {
856 foreignKey: {
857 name: 'videoId',
858 allowNull: true
859 },
860 onDelete: 'set null'
861 })
862 VideoImport: VideoImportModel
863
728 @HasMany(() => VideoCaptionModel, { 864 @HasMany(() => VideoCaptionModel, {
729 foreignKey: { 865 foreignKey: {
730 name: 'videoId', 866 name: 'videoId',
@@ -777,6 +913,9 @@ export class VideoModel extends Model<VideoModel> {
777 tasks.push(instance.removeFile(file)) 913 tasks.push(instance.removeFile(file))
778 tasks.push(instance.removeTorrent(file)) 914 tasks.push(instance.removeTorrent(file))
779 }) 915 })
916
917 // Remove playlists file
918 tasks.push(instance.removeStreamingPlaylist())
780 } 919 }
781 920
782 // Do not wait video deletion because we could be in a transaction 921 // Do not wait video deletion because we could be in a transaction
@@ -788,8 +927,14 @@ export class VideoModel extends Model<VideoModel> {
788 return undefined 927 return undefined
789 } 928 }
790 929
791 static list () { 930 static listLocal () {
792 return VideoModel.scope(ScopeNames.WITH_FILES).findAll() 931 const query = {
932 where: {
933 remote: false
934 }
935 }
936
937 return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ]).findAll(query)
793 } 938 }
794 939
795 static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) { 940 static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) {
@@ -959,10 +1104,15 @@ export class VideoModel extends Model<VideoModel> {
959 filter?: VideoFilter, 1104 filter?: VideoFilter,
960 accountId?: number, 1105 accountId?: number,
961 videoChannelId?: number, 1106 videoChannelId?: number,
962 actorId?: number 1107 followerActorId?: number
963 trendingDays?: number, 1108 trendingDays?: number,
964 userId?: number 1109 user?: UserModel,
1110 historyOfUser?: UserModel
965 }, countVideos = true) { 1111 }, countVideos = true) {
1112 if (options.filter && options.filter === 'all-local' && !options.user.hasRight(UserRight.SEE_ALL_VIDEOS)) {
1113 throw new Error('Try to filter all-local but no user has not the see all videos right')
1114 }
1115
966 const query: IFindOptions<VideoModel> = { 1116 const query: IFindOptions<VideoModel> = {
967 offset: options.start, 1117 offset: options.start,
968 limit: options.count, 1118 limit: options.count,
@@ -976,11 +1126,14 @@ export class VideoModel extends Model<VideoModel> {
976 query.group = 'VideoModel.id' 1126 query.group = 'VideoModel.id'
977 } 1127 }
978 1128
979 // actorId === null has a meaning, so just check undefined 1129 const serverActor = await getServerActor()
980 const actorId = options.actorId !== undefined ? options.actorId : (await getServerActor()).id 1130
1131 // followerActorId === null has a meaning, so just check undefined
1132 const followerActorId = options.followerActorId !== undefined ? options.followerActorId : serverActor.id
981 1133
982 const queryOptions = { 1134 const queryOptions = {
983 actorId, 1135 followerActorId,
1136 serverAccountId: serverActor.Account.id,
984 nsfw: options.nsfw, 1137 nsfw: options.nsfw,
985 categoryOneOf: options.categoryOneOf, 1138 categoryOneOf: options.categoryOneOf,
986 licenceOneOf: options.licenceOneOf, 1139 licenceOneOf: options.licenceOneOf,
@@ -992,7 +1145,8 @@ export class VideoModel extends Model<VideoModel> {
992 accountId: options.accountId, 1145 accountId: options.accountId,
993 videoChannelId: options.videoChannelId, 1146 videoChannelId: options.videoChannelId,
994 includeLocalVideos: options.includeLocalVideos, 1147 includeLocalVideos: options.includeLocalVideos,
995 userId: options.userId, 1148 user: options.user,
1149 historyOfUser: options.historyOfUser,
996 trendingDays 1150 trendingDays
997 } 1151 }
998 1152
@@ -1015,7 +1169,8 @@ export class VideoModel extends Model<VideoModel> {
1015 tagsAllOf?: string[] 1169 tagsAllOf?: string[]
1016 durationMin?: number // seconds 1170 durationMin?: number // seconds
1017 durationMax?: number // seconds 1171 durationMax?: number // seconds
1018 userId?: number 1172 user?: UserModel,
1173 filter?: VideoFilter
1019 }) { 1174 }) {
1020 const whereAnd = [] 1175 const whereAnd = []
1021 1176
@@ -1084,7 +1239,8 @@ export class VideoModel extends Model<VideoModel> {
1084 1239
1085 const serverActor = await getServerActor() 1240 const serverActor = await getServerActor()
1086 const queryOptions = { 1241 const queryOptions = {
1087 actorId: serverActor.id, 1242 followerActorId: serverActor.id,
1243 serverAccountId: serverActor.Account.id,
1088 includeLocalVideos: options.includeLocalVideos, 1244 includeLocalVideos: options.includeLocalVideos,
1089 nsfw: options.nsfw, 1245 nsfw: options.nsfw,
1090 categoryOneOf: options.categoryOneOf, 1246 categoryOneOf: options.categoryOneOf,
@@ -1092,7 +1248,8 @@ export class VideoModel extends Model<VideoModel> {
1092 languageOneOf: options.languageOneOf, 1248 languageOneOf: options.languageOneOf,
1093 tagsOneOf: options.tagsOneOf, 1249 tagsOneOf: options.tagsOneOf,
1094 tagsAllOf: options.tagsAllOf, 1250 tagsAllOf: options.tagsAllOf,
1095 userId: options.userId 1251 user: options.user,
1252 filter: options.filter
1096 } 1253 }
1097 1254
1098 return VideoModel.getAvailableForApi(query, queryOptions) 1255 return VideoModel.getAvailableForApi(query, queryOptions)
@@ -1108,6 +1265,16 @@ export class VideoModel extends Model<VideoModel> {
1108 return VideoModel.findOne(options) 1265 return VideoModel.findOne(options)
1109 } 1266 }
1110 1267
1268 static loadWithRights (id: number | string, t?: Sequelize.Transaction) {
1269 const where = VideoModel.buildWhereIdOrUUID(id)
1270 const options = {
1271 where,
1272 transaction: t
1273 }
1274
1275 return VideoModel.scope([ ScopeNames.WITH_BLACKLISTED, ScopeNames.WITH_USER_ID ]).findOne(options)
1276 }
1277
1111 static loadOnlyId (id: number | string, t?: Sequelize.Transaction) { 1278 static loadOnlyId (id: number | string, t?: Sequelize.Transaction) {
1112 const where = VideoModel.buildWhereIdOrUUID(id) 1279 const where = VideoModel.buildWhereIdOrUUID(id)
1113 1280
@@ -1120,8 +1287,8 @@ export class VideoModel extends Model<VideoModel> {
1120 return VideoModel.findOne(options) 1287 return VideoModel.findOne(options)
1121 } 1288 }
1122 1289
1123 static loadWithFile (id: number, t?: Sequelize.Transaction, logging?: boolean) { 1290 static loadWithFiles (id: number, t?: Sequelize.Transaction, logging?: boolean) {
1124 return VideoModel.scope(ScopeNames.WITH_FILES) 1291 return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ])
1125 .findById(id, { transaction: t, logging }) 1292 .findById(id, { transaction: t, logging })
1126 } 1293 }
1127 1294
@@ -1132,9 +1299,7 @@ export class VideoModel extends Model<VideoModel> {
1132 } 1299 }
1133 } 1300 }
1134 1301
1135 return VideoModel 1302 return VideoModel.findOne(options)
1136 .scope([ ScopeNames.WITH_FILES ])
1137 .findOne(options)
1138 } 1303 }
1139 1304
1140 static loadByUrl (url: string, transaction?: Sequelize.Transaction) { 1305 static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
@@ -1156,7 +1321,11 @@ export class VideoModel extends Model<VideoModel> {
1156 transaction 1321 transaction
1157 } 1322 }
1158 1323
1159 return VideoModel.scope([ ScopeNames.WITH_ACCOUNT_DETAILS, ScopeNames.WITH_FILES ]).findOne(query) 1324 return VideoModel.scope([
1325 ScopeNames.WITH_ACCOUNT_DETAILS,
1326 ScopeNames.WITH_FILES,
1327 ScopeNames.WITH_STREAMING_PLAYLISTS
1328 ]).findOne(query)
1160 } 1329 }
1161 1330
1162 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Sequelize.Transaction, userId?: number) { 1331 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Sequelize.Transaction, userId?: number) {
@@ -1171,9 +1340,37 @@ export class VideoModel extends Model<VideoModel> {
1171 const scopes = [ 1340 const scopes = [
1172 ScopeNames.WITH_TAGS, 1341 ScopeNames.WITH_TAGS,
1173 ScopeNames.WITH_BLACKLISTED, 1342 ScopeNames.WITH_BLACKLISTED,
1343 ScopeNames.WITH_ACCOUNT_DETAILS,
1344 ScopeNames.WITH_SCHEDULED_UPDATE,
1174 ScopeNames.WITH_FILES, 1345 ScopeNames.WITH_FILES,
1346 ScopeNames.WITH_STREAMING_PLAYLISTS
1347 ]
1348
1349 if (userId) {
1350 scopes.push({ method: [ ScopeNames.WITH_USER_HISTORY, userId ] } as any) // FIXME: typings
1351 }
1352
1353 return VideoModel
1354 .scope(scopes)
1355 .findOne(options)
1356 }
1357
1358 static loadForGetAPI (id: number | string, t?: Sequelize.Transaction, userId?: number) {
1359 const where = VideoModel.buildWhereIdOrUUID(id)
1360
1361 const options = {
1362 order: [ [ 'Tags', 'name', 'ASC' ] ],
1363 where,
1364 transaction: t
1365 }
1366
1367 const scopes = [
1368 ScopeNames.WITH_TAGS,
1369 ScopeNames.WITH_BLACKLISTED,
1175 ScopeNames.WITH_ACCOUNT_DETAILS, 1370 ScopeNames.WITH_ACCOUNT_DETAILS,
1176 ScopeNames.WITH_SCHEDULED_UPDATE 1371 ScopeNames.WITH_SCHEDULED_UPDATE,
1372 { method: [ ScopeNames.WITH_FILES, true ] } as any, // FIXME: typings
1373 { method: [ ScopeNames.WITH_STREAMING_PLAYLISTS, true ] } as any // FIXME: typings
1177 ] 1374 ]
1178 1375
1179 if (userId) { 1376 if (userId) {
@@ -1217,12 +1414,31 @@ export class VideoModel extends Model<VideoModel> {
1217 }) 1414 })
1218 } 1415 }
1219 1416
1417 static checkVideoHasInstanceFollow (videoId: number, followerActorId: number) {
1418 // Instances only share videos
1419 const query = 'SELECT 1 FROM "videoShare" ' +
1420 'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "videoShare"."actorId" ' +
1421 'WHERE "actorFollow"."actorId" = $followerActorId AND "videoShare"."videoId" = $videoId ' +
1422 'LIMIT 1'
1423
1424 const options = {
1425 type: Sequelize.QueryTypes.SELECT,
1426 bind: { followerActorId, videoId },
1427 raw: true
1428 }
1429
1430 return VideoModel.sequelize.query(query, options)
1431 .then(results => results.length === 1)
1432 }
1433
1220 // threshold corresponds to how many video the field should have to be returned 1434 // threshold corresponds to how many video the field should have to be returned
1221 static async getRandomFieldSamples (field: 'category' | 'channelId', threshold: number, count: number) { 1435 static async getRandomFieldSamples (field: 'category' | 'channelId', threshold: number, count: number) {
1222 const actorId = (await getServerActor()).id 1436 const serverActor = await getServerActor()
1437 const followerActorId = serverActor.id
1223 1438
1224 const scopeOptions = { 1439 const scopeOptions: AvailableForListIDsOptions = {
1225 actorId, 1440 serverAccountId: serverActor.Account.id,
1441 followerActorId,
1226 includeLocalVideos: true 1442 includeLocalVideos: true
1227 } 1443 }
1228 1444
@@ -1256,7 +1472,7 @@ export class VideoModel extends Model<VideoModel> {
1256 } 1472 }
1257 1473
1258 private static buildActorWhereWithFilter (filter?: VideoFilter) { 1474 private static buildActorWhereWithFilter (filter?: VideoFilter) {
1259 if (filter && filter === 'local') { 1475 if (filter && (filter === 'local' || filter === 'all-local')) {
1260 return { 1476 return {
1261 serverId: null 1477 serverId: null
1262 } 1478 }
@@ -1267,7 +1483,7 @@ export class VideoModel extends Model<VideoModel> {
1267 1483
1268 private static async getAvailableForApi ( 1484 private static async getAvailableForApi (
1269 query: IFindOptions<VideoModel>, 1485 query: IFindOptions<VideoModel>,
1270 options: AvailableForListIDsOptions & { userId?: number}, 1486 options: AvailableForListIDsOptions,
1271 countVideos = true 1487 countVideos = true
1272 ) { 1488 ) {
1273 const idsScope = { 1489 const idsScope = {
@@ -1286,7 +1502,7 @@ export class VideoModel extends Model<VideoModel> {
1286 } 1502 }
1287 1503
1288 const [ count, rowsId ] = await Promise.all([ 1504 const [ count, rowsId ] = await Promise.all([
1289 countVideos ? VideoModel.scope(countScope).count(countQuery) : Promise.resolve(undefined), 1505 countVideos ? VideoModel.scope(countScope).count(countQuery) : Promise.resolve<number>(undefined),
1290 VideoModel.scope(idsScope).findAll(query) 1506 VideoModel.scope(idsScope).findAll(query)
1291 ]) 1507 ])
1292 const ids = rowsId.map(r => r.id) 1508 const ids = rowsId.map(r => r.id)
@@ -1300,8 +1516,8 @@ export class VideoModel extends Model<VideoModel> {
1300 } 1516 }
1301 ] 1517 ]
1302 1518
1303 if (options.userId) { 1519 if (options.user) {
1304 apiScope.push({ method: [ ScopeNames.WITH_USER_HISTORY, options.userId ] }) 1520 apiScope.push({ method: [ ScopeNames.WITH_USER_HISTORY, options.user.id ] })
1305 } 1521 }
1306 1522
1307 const secondQuery = { 1523 const secondQuery = {
@@ -1426,6 +1642,10 @@ export class VideoModel extends Model<VideoModel> {
1426 videoFile.infoHash = parsedTorrent.infoHash 1642 videoFile.infoHash = parsedTorrent.infoHash
1427 } 1643 }
1428 1644
1645 getWatchStaticPath () {
1646 return '/videos/watch/' + this.uuid
1647 }
1648
1429 getEmbedStaticPath () { 1649 getEmbedStaticPath () {
1430 return '/videos/embed/' + this.uuid 1650 return '/videos/embed/' + this.uuid
1431 } 1651 }
@@ -1483,8 +1703,10 @@ export class VideoModel extends Model<VideoModel> {
1483 .catch(err => logger.warn('Cannot delete preview %s.', previewPath, { err })) 1703 .catch(err => logger.warn('Cannot delete preview %s.', previewPath, { err }))
1484 } 1704 }
1485 1705
1486 removeFile (videoFile: VideoFileModel) { 1706 removeFile (videoFile: VideoFileModel, isRedundancy = false) {
1487 const filePath = join(CONFIG.STORAGE.VIDEOS_DIR, this.getVideoFilename(videoFile)) 1707 const baseDir = isRedundancy ? CONFIG.STORAGE.REDUNDANCY_DIR : CONFIG.STORAGE.VIDEOS_DIR
1708
1709 const filePath = join(baseDir, this.getVideoFilename(videoFile))
1488 return remove(filePath) 1710 return remove(filePath)
1489 .catch(err => logger.warn('Cannot delete file %s.', filePath, { err })) 1711 .catch(err => logger.warn('Cannot delete file %s.', filePath, { err }))
1490 } 1712 }
@@ -1495,6 +1717,14 @@ export class VideoModel extends Model<VideoModel> {
1495 .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err })) 1717 .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err }))
1496 } 1718 }
1497 1719
1720 removeStreamingPlaylist (isRedundancy = false) {
1721 const baseDir = isRedundancy ? HLS_REDUNDANCY_DIRECTORY : HLS_PLAYLIST_DIRECTORY
1722
1723 const filePath = join(baseDir, this.uuid)
1724 return remove(filePath)
1725 .catch(err => logger.warn('Cannot delete playlist directory %s.', filePath, { err }))
1726 }
1727
1498 isOutdated () { 1728 isOutdated () {
1499 if (this.isOwned()) return false 1729 if (this.isOwned()) return false
1500 1730
@@ -1506,6 +1736,12 @@ export class VideoModel extends Model<VideoModel> {
1506 (now - updatedAtTime) > ACTIVITY_PUB.VIDEO_REFRESH_INTERVAL 1736 (now - updatedAtTime) > ACTIVITY_PUB.VIDEO_REFRESH_INTERVAL
1507 } 1737 }
1508 1738
1739 setAsRefreshed () {
1740 this.changed('updatedAt', true)
1741
1742 return this.save()
1743 }
1744
1509 getBaseUrls () { 1745 getBaseUrls () {
1510 let baseUrlHttp 1746 let baseUrlHttp
1511 let baseUrlWs 1747 let baseUrlWs
@@ -1523,7 +1759,7 @@ export class VideoModel extends Model<VideoModel> {
1523 1759
1524 generateMagnetUri (videoFile: VideoFileModel, baseUrlHttp: string, baseUrlWs: string) { 1760 generateMagnetUri (videoFile: VideoFileModel, baseUrlHttp: string, baseUrlWs: string) {
1525 const xs = this.getTorrentUrl(videoFile, baseUrlHttp) 1761 const xs = this.getTorrentUrl(videoFile, baseUrlHttp)
1526 const announce = [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ] 1762 const announce = this.getTrackerUrls(baseUrlHttp, baseUrlWs)
1527 let urlList = [ this.getVideoFileUrl(videoFile, baseUrlHttp) ] 1763 let urlList = [ this.getVideoFileUrl(videoFile, baseUrlHttp) ]
1528 1764
1529 const redundancies = videoFile.RedundancyVideos 1765 const redundancies = videoFile.RedundancyVideos
@@ -1540,6 +1776,10 @@ export class VideoModel extends Model<VideoModel> {
1540 return magnetUtil.encode(magnetHash) 1776 return magnetUtil.encode(magnetHash)
1541 } 1777 }
1542 1778
1779 getTrackerUrls (baseUrlHttp: string, baseUrlWs: string) {
1780 return [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ]
1781 }
1782
1543 getThumbnailUrl (baseUrlHttp: string) { 1783 getThumbnailUrl (baseUrlHttp: string) {
1544 return baseUrlHttp + STATIC_PATHS.THUMBNAILS + this.getThumbnailName() 1784 return baseUrlHttp + STATIC_PATHS.THUMBNAILS + this.getThumbnailName()
1545 } 1785 }
@@ -1556,7 +1796,15 @@ export class VideoModel extends Model<VideoModel> {
1556 return baseUrlHttp + STATIC_PATHS.WEBSEED + this.getVideoFilename(videoFile) 1796 return baseUrlHttp + STATIC_PATHS.WEBSEED + this.getVideoFilename(videoFile)
1557 } 1797 }
1558 1798
1799 getVideoRedundancyUrl (videoFile: VideoFileModel, baseUrlHttp: string) {
1800 return baseUrlHttp + STATIC_PATHS.REDUNDANCY + this.getVideoFilename(videoFile)
1801 }
1802
1559 getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) { 1803 getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) {
1560 return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile) 1804 return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile)
1561 } 1805 }
1806
1807 getBandwidthBits (videoFile: VideoFileModel) {
1808 return Math.ceil((videoFile.size * 8) / this.duration)
1809 }
1562} 1810}
diff --git a/server/tests/activitypub.ts b/server/tests/activitypub.ts
deleted file mode 100644
index 53a04d363..000000000
--- a/server/tests/activitypub.ts
+++ /dev/null
@@ -1,35 +0,0 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { flushTests, killallServers, makeActivityPubGetRequest, runServer, ServerInfo, setAccessTokensToServers } from './utils'
6
7const expect = chai.expect
8
9describe('Test activitypub', function () {
10 let server: ServerInfo = null
11
12 before(async function () {
13 this.timeout(30000)
14
15 await flushTests()
16
17 server = await runServer(1)
18
19 await setAccessTokensToServers([ server ])
20 })
21
22 it('Should return the account object', async function () {
23 const res = await makeActivityPubGetRequest(server.url, '/accounts/root')
24 const object = res.body
25
26 expect(object.type).to.equal('Person')
27 expect(object.id).to.equal('http://localhost:9001/accounts/root')
28 expect(object.name).to.equal('root')
29 expect(object.preferredUsername).to.equal('root')
30 })
31
32 after(async function () {
33 killallServers([ server ])
34 })
35})
diff --git a/server/tests/api/activitypub/client.ts b/server/tests/api/activitypub/client.ts
new file mode 100644
index 000000000..6d90d8643
--- /dev/null
+++ b/server/tests/api/activitypub/client.ts
@@ -0,0 +1,67 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 doubleFollow,
7 flushAndRunMultipleServers,
8 flushTests,
9 killallServers,
10 makeActivityPubGetRequest,
11 ServerInfo,
12 setAccessTokensToServers,
13 uploadVideo
14} from '../../../../shared/utils'
15
16const expect = chai.expect
17
18describe('Test activitypub', function () {
19 let servers: ServerInfo[] = []
20 let videoUUID: string
21
22 before(async function () {
23 this.timeout(30000)
24
25 await flushTests()
26
27 servers = await flushAndRunMultipleServers(2)
28
29 await setAccessTokensToServers(servers)
30
31 {
32 const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' })
33 videoUUID = res.body.video.uuid
34 }
35
36 await doubleFollow(servers[0], servers[1])
37 })
38
39 it('Should return the account object', async function () {
40 const res = await makeActivityPubGetRequest(servers[0].url, '/accounts/root')
41 const object = res.body
42
43 expect(object.type).to.equal('Person')
44 expect(object.id).to.equal('http://localhost:9001/accounts/root')
45 expect(object.name).to.equal('root')
46 expect(object.preferredUsername).to.equal('root')
47 })
48
49 it('Should return the video object', async function () {
50 const res = await makeActivityPubGetRequest(servers[0].url, '/videos/watch/' + videoUUID)
51 const object = res.body
52
53 expect(object.type).to.equal('Video')
54 expect(object.id).to.equal('http://localhost:9001/videos/watch/' + videoUUID)
55 expect(object.name).to.equal('video')
56 })
57
58 it('Should redirect to the origin video object', async function () {
59 const res = await makeActivityPubGetRequest(servers[1].url, '/videos/watch/' + videoUUID, 302)
60
61 expect(res.header.location).to.equal('http://localhost:9001/videos/watch/' + videoUUID)
62 })
63
64 after(async function () {
65 killallServers(servers)
66 })
67})
diff --git a/server/tests/api/activitypub/fetch.ts b/server/tests/api/activitypub/fetch.ts
new file mode 100644
index 000000000..03609c1a9
--- /dev/null
+++ b/server/tests/api/activitypub/fetch.ts
@@ -0,0 +1,87 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4
5import {
6 createUser,
7 doubleFollow,
8 flushAndRunMultipleServers,
9 flushTests,
10 getVideosListSort,
11 killallServers,
12 ServerInfo,
13 setAccessTokensToServers,
14 setActorField,
15 setVideoField,
16 uploadVideo,
17 userLogin,
18 waitJobs
19} from '../../../../shared/utils'
20import * as chai from 'chai'
21import { Video } from '../../../../shared/models/videos'
22
23const expect = chai.expect
24
25describe('Test ActivityPub fetcher', function () {
26 let servers: ServerInfo[]
27
28 // ---------------------------------------------------------------
29
30 before(async function () {
31 this.timeout(60000)
32
33 servers = await flushAndRunMultipleServers(3)
34
35 // Get the access tokens
36 await setAccessTokensToServers(servers)
37
38 const user = { username: 'user1', password: 'password' }
39 for (const server of servers) {
40 await createUser(server.url, server.accessToken, user.username, user.password)
41 }
42
43 const userAccessToken = await userLogin(servers[0], user)
44
45 await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video root' })
46 const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'bad video root' })
47 const badVideoUUID = res.body.video.uuid
48 await uploadVideo(servers[0].url, userAccessToken, { name: 'video user' })
49
50 await setActorField(1, 'http://localhost:9001/accounts/user1', 'url', 'http://localhost:9002/accounts/user1')
51 await setVideoField(1, badVideoUUID, 'url', 'http://localhost:9003/videos/watch/' + badVideoUUID)
52 })
53
54 it('Should add only the video with a valid actor URL', async function () {
55 this.timeout(60000)
56
57 await doubleFollow(servers[0], servers[1])
58 await waitJobs(servers)
59
60 {
61 const res = await getVideosListSort(servers[0].url, 'createdAt')
62 expect(res.body.total).to.equal(3)
63
64 const data: Video[] = res.body.data
65 expect(data[0].name).to.equal('video root')
66 expect(data[1].name).to.equal('bad video root')
67 expect(data[2].name).to.equal('video user')
68 }
69
70 {
71 const res = await getVideosListSort(servers[1].url, 'createdAt')
72 expect(res.body.total).to.equal(1)
73
74 const data: Video[] = res.body.data
75 expect(data[0].name).to.equal('video root')
76 }
77 })
78
79 after(async function () {
80 killallServers(servers)
81
82 // Keep the logs if the test failed
83 if (this['ok']) {
84 await flushTests()
85 }
86 })
87})
diff --git a/server/tests/api/activitypub/helpers.ts b/server/tests/api/activitypub/helpers.ts
new file mode 100644
index 000000000..ac6e755c3
--- /dev/null
+++ b/server/tests/api/activitypub/helpers.ts
@@ -0,0 +1,182 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4import { expect } from 'chai'
5import { buildRequestStub } from '../../../../shared/utils/miscs/stubs'
6import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../../../helpers/peertube-crypto'
7import { cloneDeep } from 'lodash'
8import { buildSignedActivity } from '../../../helpers/activitypub'
9
10describe('Test activity pub helpers', function () {
11 describe('When checking the Linked Signature', function () {
12
13 it('Should fail with an invalid Mastodon signature', async function () {
14 const body = require('./json/mastodon/create-bad-signature.json')
15 const publicKey = require('./json/mastodon/public-key.json').publicKey
16 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
17
18 const result = await isJsonLDSignatureVerified(fromActor as any, body)
19
20 expect(result).to.be.false
21 })
22
23 it('Should fail with an invalid public key', async function () {
24 const body = require('./json/mastodon/create.json')
25 const publicKey = require('./json/mastodon/bad-public-key.json').publicKey
26 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
27
28 const result = await isJsonLDSignatureVerified(fromActor as any, body)
29
30 expect(result).to.be.false
31 })
32
33 it('Should succeed with a valid Mastodon signature', async function () {
34 const body = require('./json/mastodon/create.json')
35 const publicKey = require('./json/mastodon/public-key.json').publicKey
36 const fromActor = { publicKey, url: 'http://localhost:9002/accounts/peertube' }
37
38 const result = await isJsonLDSignatureVerified(fromActor as any, body)
39
40 expect(result).to.be.true
41 })
42
43 it('Should fail with an invalid PeerTube signature', async function () {
44 const keys = require('./json/peertube/invalid-keys.json')
45 const body = require('./json/peertube/announce-without-context.json')
46
47 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
48 const signedBody = await buildSignedActivity(actorSignature as any, body)
49
50 const fromActor = { publicKey: keys.publicKey, url: 'http://localhost:9002/accounts/peertube' }
51 const result = await isJsonLDSignatureVerified(fromActor as any, signedBody)
52
53 expect(result).to.be.false
54 })
55
56 it('Should fail with an invalid PeerTube URL', async function () {
57 const keys = require('./json/peertube/keys.json')
58 const body = require('./json/peertube/announce-without-context.json')
59
60 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
61 const signedBody = await buildSignedActivity(actorSignature as any, body)
62
63 const fromActor = { publicKey: keys.publicKey, url: 'http://localhost:9003/accounts/peertube' }
64 const result = await isJsonLDSignatureVerified(fromActor as any, signedBody)
65
66 expect(result).to.be.false
67 })
68
69 it('Should succeed with a valid PeerTube signature', async function () {
70 const keys = require('./json/peertube/keys.json')
71 const body = require('./json/peertube/announce-without-context.json')
72
73 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
74 const signedBody = await buildSignedActivity(actorSignature as any, body)
75
76 const fromActor = { publicKey: keys.publicKey, url: 'http://localhost:9002/accounts/peertube' }
77 const result = await isJsonLDSignatureVerified(fromActor as any, signedBody)
78
79 expect(result).to.be.true
80 })
81 })
82
83 describe('When checking HTTP signature', function () {
84 it('Should fail with an invalid http signature', async function () {
85 const req = buildRequestStub()
86 req.method = 'POST'
87 req.url = '/accounts/ronan/inbox'
88
89 const mastodonObject = cloneDeep(require('./json/mastodon/bad-http-signature.json'))
90 req.body = mastodonObject.body
91 req.headers = mastodonObject.headers
92 req.headers.signature = 'Signature ' + req.headers.signature
93
94 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
95 const publicKey = require('./json/mastodon/public-key.json').publicKey
96
97 const actor = { publicKey }
98 const verified = isHTTPSignatureVerified(parsed, actor as any)
99
100 expect(verified).to.be.false
101 })
102
103 it('Should fail with an invalid public key', async function () {
104 const req = buildRequestStub()
105 req.method = 'POST'
106 req.url = '/accounts/ronan/inbox'
107
108 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
109 req.body = mastodonObject.body
110 req.headers = mastodonObject.headers
111 req.headers.signature = 'Signature ' + req.headers.signature
112
113 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
114 const publicKey = require('./json/mastodon/bad-public-key.json').publicKey
115
116 const actor = { publicKey }
117 const verified = isHTTPSignatureVerified(parsed, actor as any)
118
119 expect(verified).to.be.false
120 })
121
122 it('Should fail because of clock skew', async function () {
123 const req = buildRequestStub()
124 req.method = 'POST'
125 req.url = '/accounts/ronan/inbox'
126
127 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
128 req.body = mastodonObject.body
129 req.headers = mastodonObject.headers
130 req.headers.signature = 'Signature ' + req.headers.signature
131
132 let errored = false
133 try {
134 parseHTTPSignature(req)
135 } catch {
136 errored = true
137 }
138
139 expect(errored).to.be.true
140 })
141
142 it('Should fail without scheme', async function () {
143 const req = buildRequestStub()
144 req.method = 'POST'
145 req.url = '/accounts/ronan/inbox'
146
147 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
148 req.body = mastodonObject.body
149 req.headers = mastodonObject.headers
150
151 let errored = false
152 try {
153 parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
154 } catch {
155 errored = true
156 }
157
158 expect(errored).to.be.true
159 })
160
161 it('Should succeed with a valid signature', async function () {
162 const req = buildRequestStub()
163 req.method = 'POST'
164 req.url = '/accounts/ronan/inbox'
165
166 const mastodonObject = cloneDeep(require('./json/mastodon/http-signature.json'))
167 req.body = mastodonObject.body
168 req.headers = mastodonObject.headers
169 req.headers.signature = 'Signature ' + req.headers.signature
170
171 const parsed = parseHTTPSignature(req, 3600 * 1000 * 365 * 10)
172 const publicKey = require('./json/mastodon/public-key.json').publicKey
173
174 const actor = { publicKey }
175 const verified = isHTTPSignatureVerified(parsed, actor as any)
176
177 expect(verified).to.be.true
178 })
179
180 })
181
182})
diff --git a/server/tests/api/activitypub/index.ts b/server/tests/api/activitypub/index.ts
new file mode 100644
index 000000000..450053309
--- /dev/null
+++ b/server/tests/api/activitypub/index.ts
@@ -0,0 +1,5 @@
1import './client'
2import './fetch'
3import './helpers'
4import './refresher'
5import './security'
diff --git a/server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json b/server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json
new file mode 100644
index 000000000..4e7bc3af5
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/bad-body-http-signature.json
@@ -0,0 +1,93 @@
1{
2 "headers": {
3 "user-agent": "http.rb/3.3.0 (Mastodon/2.5.0; +http://localhost:3000/)",
4 "host": "localhost",
5 "date": "Mon, 22 Oct 2018 13:34:22 GMT",
6 "accept-encoding": "gzip",
7 "digest": "SHA-256=FEr5j2WSSfdEMcG3NTOXuGU0lUchfTJx4+BtUlWOwDk=",
8 "content-type": "application/activity+json",
9 "signature": "keyId=\"http://localhost:3000/users/ronan2#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest content-type\",signature=\"oLKbgxdFXdXsHJ3x/UsG9Svu7oa8Dyqiy6Jif4wqNuhAqRVMRaG18f+dd2OcfFX3XRGF8p8flZkU6vvoEQBauTwGRGcgXAJuKC1zYIWGk+PeiW8lNUnE4qGapWcTiFnIo7FKauNdsgqg/tvgs1pQIdHkDDjZMI64twP7sTN/4vG1PCq+kyqi/DM+ORLi/W7vFuLVHt2Iz7ikfw/R3/mMtS4FwLops+tVYBQ2iQ9DVRhTwLKVbeL/LLVB/tdGzNZ4F4nImBAQQ9I7WpPM6J/k+cBmoEbrUKs8ptx9gbX3OSsl5wlvPVMNzU9F9yb2MrB/Y/J4qssKz+LbiaktKGj7OQ==\"",
10 "content-length": "2815"
11 },
12 "body": {
13 "@context": [
14 "https://www.w3.org/ns/activitystreams",
15 "https://w3id.org/security/v1",
16 {
17 "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
18 "sensitive": "as:sensitive",
19 "movedTo": {
20 "@id": "as:movedTo",
21 "@type": "@id"
22 },
23 "Hashtag": "as:Hashtag",
24 "ostatus": "http://ostatus.org#",
25 "atomUri": "ostatus:atomUri",
26 "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
27 "conversation": "ostatus:conversation",
28 "toot": "http://joinmastodon.org/ns#",
29 "Emoji": "toot:Emoji",
30 "focalPoint": {
31 "@container": "@list",
32 "@id": "toot:focalPoint"
33 },
34 "featured": {
35 "@id": "toot:featured",
36 "@type": "@id"
37 },
38 "schema": "http://schema.org#",
39 "PropertyValue": "schema:PropertyValue",
40 "value": "schema:value"
41 }
42 ],
43 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948/activity",
44 "type": "Create",
45 "actor": "http://localhost:3000/users/ronan2",
46 "published": "2018-10-22T13:34:18Z",
47 "to": [
48 "https://www.w3.org/ns/activitystreams#Public"
49 ],
50 "cc": [
51 "http://localhost:3000/users/ronan2/followers",
52 "http://localhost:9000/accounts/ronan"
53 ],
54 "object": {
55 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
56 "type": "Note",
57 "summary": null,
58 "inReplyTo": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
59 "published": "2018-10-22T13:34:18Z",
60 "url": "http://localhost:3000/@ronan2/100939547203370948",
61 "attributedTo": "http://localhost:3000/users/ronan2",
62 "to": [
63 "https://www.w3.org/ns/activitystreams#Public"
64 ],
65 "cc": [
66 "http://localhost:3000/users/ronan2/followers",
67 "http://localhost:9000/accounts/ronan"
68 ],
69 "sensitive": false,
70 "atomUri": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
71 "inReplyToAtomUri": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
72 "conversation": "tag:localhost:3000,2018-10-19:objectId=72:objectType=Conversation",
73 "content": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>",
74 "contentMap": {
75 "en": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>"
76 },
77 "attachment": [],
78 "tag": [
79 {
80 "type": "Mention",
81 "href": "http://localhost:9000/accounts/ronan",
82 "name": "@ronan@localhost:9000"
83 }
84 ]
85 },
86 "signature": {
87 "type": "RsaSignature2017",
88 "creator": "http://localhost:3000/users/ronan2#main-key",
89 "created": "2018-10-22T13:34:19Z",
90 "signatureValue": "x+xL4l8ERziYVhwEafHJyBQOInvNZ0gV4ccYd9AtFYeGJagc8fY6jjjhbDRCD7yMhgTjBX69z20MXnDuwpmM6wej3dt1wLKdIyXVViO84nAlqFz7KmNxtk5lDnAVX/vttscT5YUFvw4dbPT2mQiEd1lKbaLftRiIPEomZpQ37+fUkQdcPrnhruPAISO/Sof1n1LFW4mYIffozteQSZBH6HaCVp+MRMIhdMi5e8w7PD48/cZz8D/EU8Vqi91FM76/3tMqg6nLqQ+8bq74Jvt2kzwZlIufe+I55QMpZOmF6hGIJEt+R0JXdjQbtgcELONmNj2dr8sAlzu7zKlAGuJ24Q=="
91 }
92 }
93}
diff --git a/server/tests/api/activitypub/json/mastodon/bad-http-signature.json b/server/tests/api/activitypub/json/mastodon/bad-http-signature.json
new file mode 100644
index 000000000..098597db0
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/bad-http-signature.json
@@ -0,0 +1,93 @@
1{
2 "headers": {
3 "user-agent": "http.rb/3.3.0 (Mastodon/2.5.0; +http://localhost:3000/)",
4 "host": "localhost",
5 "date": "Mon, 22 Oct 2018 13:34:22 GMT",
6 "accept-encoding": "gzip",
7 "digest": "SHA-256=FEr5j2WSSfdEMcG3NTOXuGU0lUchfTJx4+BtUlWOwDk=",
8 "content-type": "application/activity+json",
9 "signature": "keyId=\"http://localhost:3000/users/ronan2#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest content-type\",signature=\"oLKbgxdFXdXsHJ3x/UsG9Svu7oa8Dyqiy6Jif4wqNuhAqRVMRaG18f+dd2OcfFX3XRGF8p8flZkU6vvoEQBauTwGRGcgXAJuKC1zYIWGk+PeiW8lNUnE4qGapWcTiFnIo7FKauNdsgqg/tvgs1pQIdHkDDjZMI64twP7sTN/4vG1PCq+kyqi/DM+ORLi/W7vFuLVHt2Iz7ikfw/R3/mMtS4FwLops+tVYBQ2iQ9DVRhTwLKVbeL/LLVB/tdGzNZ4F4nImBAQQ9I7WpPM6J/k+cBmoEbrUKs8ptx9gbX3OSsl4wlvPVMNzU9F9yb2MrB/Y/J4qssKz+LbiaktKGj7OQ==\"",
10 "content-length": "2815"
11 },
12 "body": {
13 "@context": [
14 "https://www.w3.org/ns/activitystreams",
15 "https://w3id.org/security/v1",
16 {
17 "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
18 "sensitive": "as:sensitive",
19 "movedTo": {
20 "@id": "as:movedTo",
21 "@type": "@id"
22 },
23 "Hashtag": "as:Hashtag",
24 "ostatus": "http://ostatus.org#",
25 "atomUri": "ostatus:atomUri",
26 "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
27 "conversation": "ostatus:conversation",
28 "toot": "http://joinmastodon.org/ns#",
29 "Emoji": "toot:Emoji",
30 "focalPoint": {
31 "@container": "@list",
32 "@id": "toot:focalPoint"
33 },
34 "featured": {
35 "@id": "toot:featured",
36 "@type": "@id"
37 },
38 "schema": "http://schema.org#",
39 "PropertyValue": "schema:PropertyValue",
40 "value": "schema:value"
41 }
42 ],
43 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948/activity",
44 "type": "Create",
45 "actor": "http://localhost:3000/users/ronan2",
46 "published": "2018-10-22T13:34:18Z",
47 "to": [
48 "https://www.w3.org/ns/activitystreams#Public"
49 ],
50 "cc": [
51 "http://localhost:3000/users/ronan2/followers",
52 "http://localhost:9000/accounts/ronan"
53 ],
54 "object": {
55 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
56 "type": "Note",
57 "summary": null,
58 "inReplyTo": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
59 "published": "2018-10-22T13:34:18Z",
60 "url": "http://localhost:3000/@ronan2/100939547203370948",
61 "attributedTo": "http://localhost:3000/users/ronan2",
62 "to": [
63 "https://www.w3.org/ns/activitystreams#Public"
64 ],
65 "cc": [
66 "http://localhost:3000/users/ronan2/followers",
67 "http://localhost:9000/accounts/ronan"
68 ],
69 "sensitive": false,
70 "atomUri": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
71 "inReplyToAtomUri": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
72 "conversation": "tag:localhost:3000,2018-10-19:objectId=72:objectType=Conversation",
73 "content": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>",
74 "contentMap": {
75 "en": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>"
76 },
77 "attachment": [],
78 "tag": [
79 {
80 "type": "Mention",
81 "href": "http://localhost:9000/accounts/ronan",
82 "name": "@ronan@localhost:9000"
83 }
84 ]
85 },
86 "signature": {
87 "type": "RsaSignature2017",
88 "creator": "http://localhost:3000/users/ronan2#main-key",
89 "created": "2018-10-22T13:34:19Z",
90 "signatureValue": "x+xL4l8ERziYVhwEafHJyBQOInvNZ0gV4ccYd9AtFYeGJagc8fY6jjjhbDRCD7yMhgTjBX69z20MXnDuwpmM6wej3dt1wLKdIyXVViO84nAlqFz7KmNxtk5lDnAVX/vttscT5YUFvw4dbPT2mQiEd1lKbaLftRiIPEomZpQ37+fUkQdcPrnhruPAISO/Sof1n1LFW4mYIffozteQSZBH6HaCVp+MRMIhdMi5e8w7PD48/cZz8D/EU8Vqi91FM76/3tMqg6nLqQ+8bq74Jvt2kzwZlIufe+I55QMpZOmF6hGIJEt+R0JXdjQbtgcELONmNj2dr8sAlzu7zKlAGuJ24Q=="
91 }
92 }
93}
diff --git a/server/tests/api/activitypub/json/mastodon/bad-public-key.json b/server/tests/api/activitypub/json/mastodon/bad-public-key.json
new file mode 100644
index 000000000..73d18b3ad
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/bad-public-key.json
@@ -0,0 +1,3 @@
1{
2 "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0YyuthHtWWgDe0Fdgdp2\ndC5dTJsRqW6pFw5omIYYYjoES/WRewhVxEA54BhmxD3L1zChfx131N1TS8jVowhW\nm999jpUffKCCvLgYKIXETJDHiDeMONVx8wp7v9fS1HiFXo/E5und39gUMs14CMFZ\n6PE5jRV3r4XIKQJHQl7/X5n5FOb2934K+1TKUeBkbft/AushlKatYQakt3qHxpwx\nFvE+JjGo7QTnzdjaOx/e5QvojdGi2Kx4+jl77j2WVcSo5lOBz04OAVJtChtn82vS\nulPdDh3hZcDn+WK67yAhGP6AnzvOybZZS4zowlKiQ3kqjVVXKdl8gAsL4Y7MZ40R\nJQIDAQAB\n-----END PUBLIC KEY-----\n"
3}
diff --git a/server/tests/api/activitypub/json/mastodon/create-bad-signature.json b/server/tests/api/activitypub/json/mastodon/create-bad-signature.json
new file mode 100644
index 000000000..2cd037241
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/create-bad-signature.json
@@ -0,0 +1,81 @@
1{
2 "@context": [
3 "https://www.w3.org/ns/activitystreams",
4 "https://w3id.org/security/v1",
5 {
6 "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
7 "sensitive": "as:sensitive",
8 "movedTo": {
9 "@id": "as:movedTo",
10 "@type": "@id"
11 },
12 "Hashtag": "as:Hashtag",
13 "ostatus": "http://ostatus.org#",
14 "atomUri": "ostatus:atomUri",
15 "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
16 "conversation": "ostatus:conversation",
17 "toot": "http://joinmastodon.org/ns#",
18 "Emoji": "toot:Emoji",
19 "focalPoint": {
20 "@container": "@list",
21 "@id": "toot:focalPoint"
22 },
23 "featured": {
24 "@id": "toot:featured",
25 "@type": "@id"
26 },
27 "schema": "http://schema.org#",
28 "PropertyValue": "schema:PropertyValue",
29 "value": "schema:value"
30 }
31 ],
32 "id": "http://localhost:3000/users/ronan2/statuses/100939345950887698/activity",
33 "type": "Create",
34 "actor": "http://localhost:3000/users/ronan2",
35 "published": "2018-10-22T12:43:07Z",
36 "to": [
37 "https://www.w3.org/ns/activitystreams#Public"
38 ],
39 "cc": [
40 "http://localhost:3000/users/ronan2/followers",
41 "http://localhost:9000/accounts/ronan"
42 ],
43 "object": {
44 "id": "http://localhost:3000/users/ronan2/statuses/100939345950887698",
45 "type": "Note",
46 "summary": null,
47 "inReplyTo": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
48 "published": "2018-10-22T12:43:07Z",
49 "url": "http://localhost:3000/@ronan2/100939345950887698",
50 "attributedTo": "http://localhost:3000/users/ronan2",
51 "to": [
52 "https://www.w3.org/ns/activitystreams#Public"
53 ],
54 "cc": [
55 "http://localhost:3000/users/ronan2/followers",
56 "http://localhost:9000/accounts/ronan"
57 ],
58 "sensitive": false,
59 "atomUri": "http://localhost:3000/users/ronan2/statuses/100939345950887698",
60 "inReplyToAtomUri": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
61 "conversation": "tag:localhost:3000,2018-10-19:objectId=72:objectType=Conversation",
62 "content": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zerg</p>",
63 "contentMap": {
64 "en": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zerg</p>"
65 },
66 "attachment": [],
67 "tag": [
68 {
69 "type": "Mention",
70 "href": "http://localhost:9000/accounts/ronan",
71 "name": "@ronan@localhost:9000"
72 }
73 ]
74 },
75 "signature": {
76 "type": "RsaSignature2017",
77 "creator": "http://localhost:3000/users/ronan2#main-key",
78 "created": "2018-10-22T12:43:08Z",
79 "signatureValue": "Vgr8nA0agPr9TcA4BlX+MWhmuE+rBcoIJLpnPbm3E5SnOCXbgjEfEaTLqfuzzkKNsR3PBbkvi3YWK4/DxJ0zmpzSB7yy4NRzluQMVQHqJiFKXAX3Sr3fIrK24xkWW9/F207c1NpFajSGbgnFKBdtFE0e5VqwSrSoOJkZukZW/2ATSnsyzblieuUmvTWpD0PqpUOsynPjw+RqZnqPn0cjw1z2Dm7ZRt3trnyMTXFYZw5U/YuqMY2kpadD6vq780md8kXlJIylxG6ZrlO2jz9fJdnfuVq43d4QFNsBm1K1r2WtNqX+i+wiqh+u3PjF4pzXtl/a3hJOH18IfZnK7I21mQ=="
80 }
81}
diff --git a/server/tests/api/activitypub/json/mastodon/create.json b/server/tests/api/activitypub/json/mastodon/create.json
new file mode 100644
index 000000000..0be271bb8
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/create.json
@@ -0,0 +1,81 @@
1{
2 "@context": [
3 "https://www.w3.org/ns/activitystreams",
4 "https://w3id.org/security/v1",
5 {
6 "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
7 "sensitive": "as:sensitive",
8 "movedTo": {
9 "@id": "as:movedTo",
10 "@type": "@id"
11 },
12 "Hashtag": "as:Hashtag",
13 "ostatus": "http://ostatus.org#",
14 "atomUri": "ostatus:atomUri",
15 "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
16 "conversation": "ostatus:conversation",
17 "toot": "http://joinmastodon.org/ns#",
18 "Emoji": "toot:Emoji",
19 "focalPoint": {
20 "@container": "@list",
21 "@id": "toot:focalPoint"
22 },
23 "featured": {
24 "@id": "toot:featured",
25 "@type": "@id"
26 },
27 "schema": "http://schema.org#",
28 "PropertyValue": "schema:PropertyValue",
29 "value": "schema:value"
30 }
31 ],
32 "id": "http://localhost:3000/users/ronan2/statuses/100939345950887698/activity",
33 "type": "Create",
34 "actor": "http://localhost:3000/users/ronan2",
35 "published": "2018-10-22T12:43:07Z",
36 "to": [
37 "https://www.w3.org/ns/activitystreams#Public"
38 ],
39 "cc": [
40 "http://localhost:3000/users/ronan2/followers",
41 "http://localhost:9000/accounts/ronan"
42 ],
43 "object": {
44 "id": "http://localhost:3000/users/ronan2/statuses/100939345950887698",
45 "type": "Note",
46 "summary": null,
47 "inReplyTo": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
48 "published": "2018-10-22T12:43:07Z",
49 "url": "http://localhost:3000/@ronan2/100939345950887698",
50 "attributedTo": "http://localhost:3000/users/ronan2",
51 "to": [
52 "https://www.w3.org/ns/activitystreams#Public"
53 ],
54 "cc": [
55 "http://localhost:3000/users/ronan2/followers",
56 "http://localhost:9000/accounts/ronan"
57 ],
58 "sensitive": false,
59 "atomUri": "http://localhost:3000/users/ronan2/statuses/100939345950887698",
60 "inReplyToAtomUri": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
61 "conversation": "tag:localhost:3000,2018-10-19:objectId=72:objectType=Conversation",
62 "content": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zerg</p>",
63 "contentMap": {
64 "en": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zerg</p>"
65 },
66 "attachment": [],
67 "tag": [
68 {
69 "type": "Mention",
70 "href": "http://localhost:9000/accounts/ronan",
71 "name": "@ronan@localhost:9000"
72 }
73 ]
74 },
75 "signature": {
76 "type": "RsaSignature2017",
77 "creator": "http://localhost:3000/users/ronan2#main-key",
78 "created": "2018-10-22T12:43:08Z",
79 "signatureValue": "VgR8nA0agPr9TcA4BlX+MWhmuE+rBcoIJLpnPbm3E5SnOCXbgjEfEaTLqfuzzkKNsR3PBbkvi3YWK4/DxJ0zmpzSB7yy4NRzluQMVQHqJiFKXAX3Sr3fIrK24xkWW9/F207c1NpFajSGbgnFKBdtFE0e5VqwSrSoOJkZukZW/2ATSnsyzblieuUmvTWpD0PqpUOsynPjw+RqZnqPn0cjw1z2Dm7ZRt3trnyMTXFYZw5U/YuqMY2kpadD6vq780md8kXlJIylxG6ZrlO2jz9fJdnfuVq43d4QFNsBm1K1r2WtNqX+i+wiqh+u3PjF4pzXtl/a3hJOH18IfZnK7I21mQ=="
80 }
81}
diff --git a/server/tests/api/activitypub/json/mastodon/http-signature.json b/server/tests/api/activitypub/json/mastodon/http-signature.json
new file mode 100644
index 000000000..4e7bc3af5
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/http-signature.json
@@ -0,0 +1,93 @@
1{
2 "headers": {
3 "user-agent": "http.rb/3.3.0 (Mastodon/2.5.0; +http://localhost:3000/)",
4 "host": "localhost",
5 "date": "Mon, 22 Oct 2018 13:34:22 GMT",
6 "accept-encoding": "gzip",
7 "digest": "SHA-256=FEr5j2WSSfdEMcG3NTOXuGU0lUchfTJx4+BtUlWOwDk=",
8 "content-type": "application/activity+json",
9 "signature": "keyId=\"http://localhost:3000/users/ronan2#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest content-type\",signature=\"oLKbgxdFXdXsHJ3x/UsG9Svu7oa8Dyqiy6Jif4wqNuhAqRVMRaG18f+dd2OcfFX3XRGF8p8flZkU6vvoEQBauTwGRGcgXAJuKC1zYIWGk+PeiW8lNUnE4qGapWcTiFnIo7FKauNdsgqg/tvgs1pQIdHkDDjZMI64twP7sTN/4vG1PCq+kyqi/DM+ORLi/W7vFuLVHt2Iz7ikfw/R3/mMtS4FwLops+tVYBQ2iQ9DVRhTwLKVbeL/LLVB/tdGzNZ4F4nImBAQQ9I7WpPM6J/k+cBmoEbrUKs8ptx9gbX3OSsl5wlvPVMNzU9F9yb2MrB/Y/J4qssKz+LbiaktKGj7OQ==\"",
10 "content-length": "2815"
11 },
12 "body": {
13 "@context": [
14 "https://www.w3.org/ns/activitystreams",
15 "https://w3id.org/security/v1",
16 {
17 "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
18 "sensitive": "as:sensitive",
19 "movedTo": {
20 "@id": "as:movedTo",
21 "@type": "@id"
22 },
23 "Hashtag": "as:Hashtag",
24 "ostatus": "http://ostatus.org#",
25 "atomUri": "ostatus:atomUri",
26 "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
27 "conversation": "ostatus:conversation",
28 "toot": "http://joinmastodon.org/ns#",
29 "Emoji": "toot:Emoji",
30 "focalPoint": {
31 "@container": "@list",
32 "@id": "toot:focalPoint"
33 },
34 "featured": {
35 "@id": "toot:featured",
36 "@type": "@id"
37 },
38 "schema": "http://schema.org#",
39 "PropertyValue": "schema:PropertyValue",
40 "value": "schema:value"
41 }
42 ],
43 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948/activity",
44 "type": "Create",
45 "actor": "http://localhost:3000/users/ronan2",
46 "published": "2018-10-22T13:34:18Z",
47 "to": [
48 "https://www.w3.org/ns/activitystreams#Public"
49 ],
50 "cc": [
51 "http://localhost:3000/users/ronan2/followers",
52 "http://localhost:9000/accounts/ronan"
53 ],
54 "object": {
55 "id": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
56 "type": "Note",
57 "summary": null,
58 "inReplyTo": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
59 "published": "2018-10-22T13:34:18Z",
60 "url": "http://localhost:3000/@ronan2/100939547203370948",
61 "attributedTo": "http://localhost:3000/users/ronan2",
62 "to": [
63 "https://www.w3.org/ns/activitystreams#Public"
64 ],
65 "cc": [
66 "http://localhost:3000/users/ronan2/followers",
67 "http://localhost:9000/accounts/ronan"
68 ],
69 "sensitive": false,
70 "atomUri": "http://localhost:3000/users/ronan2/statuses/100939547203370948",
71 "inReplyToAtomUri": "http://localhost:9000/videos/watch/90e6f8ed-b369-423c-b0c8-f44e5350c752",
72 "conversation": "tag:localhost:3000,2018-10-19:objectId=72:objectType=Conversation",
73 "content": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>",
74 "contentMap": {
75 "en": "<p><span class=\"h-card\"><a href=\"http://localhost:9000/accounts/ronan\" class=\"u-url mention\">@<span>ronan</span></a></span> zergzerg</p>"
76 },
77 "attachment": [],
78 "tag": [
79 {
80 "type": "Mention",
81 "href": "http://localhost:9000/accounts/ronan",
82 "name": "@ronan@localhost:9000"
83 }
84 ]
85 },
86 "signature": {
87 "type": "RsaSignature2017",
88 "creator": "http://localhost:3000/users/ronan2#main-key",
89 "created": "2018-10-22T13:34:19Z",
90 "signatureValue": "x+xL4l8ERziYVhwEafHJyBQOInvNZ0gV4ccYd9AtFYeGJagc8fY6jjjhbDRCD7yMhgTjBX69z20MXnDuwpmM6wej3dt1wLKdIyXVViO84nAlqFz7KmNxtk5lDnAVX/vttscT5YUFvw4dbPT2mQiEd1lKbaLftRiIPEomZpQ37+fUkQdcPrnhruPAISO/Sof1n1LFW4mYIffozteQSZBH6HaCVp+MRMIhdMi5e8w7PD48/cZz8D/EU8Vqi91FM76/3tMqg6nLqQ+8bq74Jvt2kzwZlIufe+I55QMpZOmF6hGIJEt+R0JXdjQbtgcELONmNj2dr8sAlzu7zKlAGuJ24Q=="
91 }
92 }
93}
diff --git a/server/tests/api/activitypub/json/mastodon/public-key.json b/server/tests/api/activitypub/json/mastodon/public-key.json
new file mode 100644
index 000000000..b7b9b8308
--- /dev/null
+++ b/server/tests/api/activitypub/json/mastodon/public-key.json
@@ -0,0 +1,3 @@
1{
2 "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0YyuthHtWWgDe0Fdgdp2\ndC5dTJsRqW6pFw5omIYYYjoES/WRewhVxEA54BhmxD3L1zChfx131N1TS8jVowhW\nm999jpUffKCCvLgYKIXETJDHiDeMONVx8wp7v9fS1HiFXo/E5und39gUMs14CMFZ\n6PE5jRV3r4XIKQJHQl7/X5n5FOb2934K+1TKUeBkbft/AushlKatYQakt3qHxpwx\nFvE+JjGo7QTnzdjaOx/e5QvojdGi2Kx4+jl87j2WVcSo5lOBz04OAVJtChtn82vS\nulPdDh3hZcDn+WK67yAhGP6AnzvOybZZS4zowlKiQ3kqjVVXKdl8gAsL4Y7MZ40R\nJQIDAQAB\n-----END PUBLIC KEY-----\n"
3}
diff --git a/server/tests/api/activitypub/json/peertube/announce-without-context.json b/server/tests/api/activitypub/json/peertube/announce-without-context.json
new file mode 100644
index 000000000..5f2af0cde
--- /dev/null
+++ b/server/tests/api/activitypub/json/peertube/announce-without-context.json
@@ -0,0 +1,13 @@
1{
2 "type": "Announce",
3 "id": "http://localhost:9002/videos/watch/997111d4-e8d8-4f45-99d3-857905785d05/announces/1",
4 "actor": "http://localhost:9002/accounts/peertube",
5 "object": "http://localhost:9002/videos/watch/997111d4-e8d8-4f45-99d3-857905785d05",
6 "to": [
7 "https://www.w3.org/ns/activitystreams#Public",
8 "http://localhost:9002/accounts/peertube/followers",
9 "http://localhost:9002/video-channels/root_channel/followers",
10 "http://localhost:9002/accounts/root/followers"
11 ],
12 "cc": []
13}
diff --git a/server/tests/api/activitypub/json/peertube/invalid-keys.json b/server/tests/api/activitypub/json/peertube/invalid-keys.json
new file mode 100644
index 000000000..0544e96b9
--- /dev/null
+++ b/server/tests/api/activitypub/json/peertube/invalid-keys.json
@@ -0,0 +1,6 @@
1{
2 "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqjQGdH6D3naKmSbbr/Df\nEh1H42F3WlHYXuxKLkm5Bemjdde+GwHYdz5m3fcIWw3HTzfA+y9Of8epGdfSrtYO\nwAyc3Zoy7afPNa4bZXqhJ1Im41rMGieiCuUn4uTPPucIjC0gCkVwvuQr3Elbk55s\nIkczDkseJuadTvG+A1e4uNY2lnRmVhf4g5B90u6CLe2KdbPpifRoKlw9zaUBj4/F\npP5S75TS5l1DfJQIq2lp8RwrH6FvGKLnWlbGeNYX96DDvlA5Sxoxz6a+bTV9OopM\n7mS7eP8zF8lKXYUu8cjIscKm+XqGmyRoPyw2Pp53tew29idRUocVQHGBnlNbpKdd\naQIDAQAB\n-----END PUBLIC KEY-----\n",
3 "privateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAqjQGdH6D3naKmSbbr/DfEh1H42F3WlHYXuxKLkm5Bemjdde+\nGwHYdz5m3fcIWw3HTzfA+y9Of8epGdfSrtYOwAyc3Zoy7afPNa4bZXqhJ1Im41rM\nGieiCuUn4uTPPucIjC0gCkVwvuQr3Elbk55sIkczDkseJuadTvG+A1e4uNY2lnRm\nVhf4g5B90u6CLe2KdbPpifRoKlw9zaUBj4/FpP5S75TS5l1DfJQIq2lp8RwrH6Fv\nGKLnWlbGeNYX96DDvlA5Sxoxz6a+bTV9OopM7mS7eP8zF8lKXYUu8cjIscKm+XqG\nmyRoPyw3Pp53tew29idRUocVQHGBnlNbpKddaQIDAQABAoIBAQCnBZawCtbtH/ay\ng+dhqEW/SOyavbKZ92cU/1tsQPxISRYXNjdf2VfK7HmVqC2S7NqBanz+AVZPHmda\n7OfamkSvQbFN5VvEy8ATNV+9HbG3HG78/MT9hZcGigmyJkcZuy4wILgoXCxfpxlD\netla60PB/4yioiRcmEIWjjOgpByphDJ7RuuuptyEvgjUjpPtvHK47O/loaD2HFJk\nbIYbRirbjUjITRjQxGVIvanqiwPG9pB26YDLxDOoXEumcnzRcEFWNdvoleaLgquS\nn/zVsXWEq4+1i7t44DDstWUt/2Bw5ksIkSdayQ6oy3vzre3YFHwvbVZ7qtQQgpru\nx+NIolZhAoGBAN1RgNj8zy9Py3SJdsoXtnuCItfD7eo7LWXUa06cM/NS695Q+/to\naa5i3cJnRlv+b+b3VvnhkhIBLfFQW+hWwPnnxJEehcm09ddN9zbWrZ4Yv9yYu+8d\nTLGyWL8kPFF1dz+29DcrSv3tXEOwxByX/O4U/X/i3wl2WhkybxVFnCuvAoGBAMTf\n91BgLzvcYKOxH+vRPOJY7g2HKGFe35R91M4E+9Eq1rq4LUQHBb3fhRh4+scNu0yb\nNfN1Zdx2nbgCXdTKomF1Ahxp58/A2iU65vVzL6hYfWXEGSmoBqsGCIpIxQ9jgB9k\nCl7t/Ban8Z/ORHTjI9fpHlSZyCWJ3ajepiM2a1ZnAoGAPpDO6wi1DXvyWVSPF1yS\nwuGsNfD2rjPihpoBZ+yypwP3GBcu1QjUb28Vn+KQOmt4eQPNO8DwCVT6BvEfulPk\nJAHISPom+jnFEgPBcmhIFpyKiLNI1bUjvExd2FNHFgQuHP38ligQAC782Un8dtTk\ntO2MKH4bbVJe8CaYzpuqJZMCgYABZyMpBHZxs8FQiUuT75rCdiXEHOlxwC5RrY/d\no/VzaR28mOFhsbcdwkD9iqcm0fc6tYRt5rFCH+pBzGqEwKjljuLj9vE67sHfMAtD\nRn3Zcj/6gKo5PMRHZbSb36bf1DKuhpT4VjPMqYe0PtEIEDJKMJQRwELH2bKlqGiA\nqbucEwKBgQCkS85JnpHEV/tSylsEEn2W3CQCx58zl7iZNV7h/tWMR4AyrcI0HqP6\nllJ7V/Cfw66MgelPnosKgagwLVI6gsqDtjnzYo3XuMRVlYIySJ/jV3eiUNkV2Ky2\nfp/gA9sVgp38QSr+xB9E0LNStcbqDzoCCcDRws/SK7PbkQH9KV47tQ==\n-----END RSA PRIVATE KEY-----"
4}
5
6
diff --git a/server/tests/api/activitypub/json/peertube/keys.json b/server/tests/api/activitypub/json/peertube/keys.json
new file mode 100644
index 000000000..1a7700865
--- /dev/null
+++ b/server/tests/api/activitypub/json/peertube/keys.json
@@ -0,0 +1,4 @@
1{
2 "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqjQGdH6D3naKmSbbr/Df\nEh1H42F3WlHYXuxKLkm5Bemjdde+GwHYdz5m3fcIWw3HTzfA+y9Of8epGdfSrtYO\nwAyc3Zoy7afPNa4bZXqhJ1Im41rMGieiCuUn4uTPPucIjC0gCkVwvuQr3Elbk55s\nIkczDkseJuadTvG+A1e4uNY2lnRmVhf4g5B90u6CLe2KdbPpifRoKlw9zaUBj4/F\npP5S75TS5l1DfJQIq2lp8RwrH6FvGKLnWlbGeNYX96DDvlA5Sxoxz6a+bTV9OopM\n7mS7eP8zF8lKXYUu8cjIscKm+XqGmyRoPyw3Pp53tew29idRUocVQHGBnlNbpKdd\naQIDAQAB\n-----END PUBLIC KEY-----\n",
3 "privateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAqjQGdH6D3naKmSbbr/DfEh1H42F3WlHYXuxKLkm5Bemjdde+\nGwHYdz5m3fcIWw3HTzfA+y9Of8epGdfSrtYOwAyc3Zoy7afPNa4bZXqhJ1Im41rM\nGieiCuUn4uTPPucIjC0gCkVwvuQr3Elbk55sIkczDkseJuadTvG+A1e4uNY2lnRm\nVhf4g5B90u6CLe2KdbPpifRoKlw9zaUBj4/FpP5S75TS5l1DfJQIq2lp8RwrH6Fv\nGKLnWlbGeNYX96DDvlA5Sxoxz6a+bTV9OopM7mS7eP8zF8lKXYUu8cjIscKm+XqG\nmyRoPyw3Pp53tew29idRUocVQHGBnlNbpKddaQIDAQABAoIBAQCnBZawCtbtH/ay\ng+dhqEW/SOyavbKZ92cU/1tsQPxISRYXNjdf2VfK7HmVqC2S7NqBanz+AVZPHmda\n7OfamkSvQbFN5VvEy8ATNV+9HbG3HG78/MT9hZcGigmyJkcZuy4wILgoXCxfpxlD\netla60PB/4yioiRcmEIWjjOgpByphDJ7RuuuptyEvgjUjpPtvHK47O/loaD2HFJk\nbIYbRirbjUjITRjQxGVIvanqiwPG9pB26YDLxDOoXEumcnzRcEFWNdvoleaLgquS\nn/zVsXWEq4+1i7t44DDstWUt/2Bw5ksIkSdayQ6oy3vzre3YFHwvbVZ7qtQQgpru\nx+NIolZhAoGBAN1RgNj8zy9Py3SJdsoXtnuCItfD7eo7LWXUa06cM/NS695Q+/to\naa5i3cJnRlv+b+b3VvnhkhIBLfFQW+hWwPnnxJEehcm09ddN9zbWrZ4Yv9yYu+8d\nTLGyWL8kPFF1dz+29DcrSv3tXEOwxByX/O4U/X/i3wl2WhkybxVFnCuvAoGBAMTf\n91BgLzvcYKOxH+vRPOJY7g2HKGFe35R91M4E+9Eq1rq4LUQHBb3fhRh4+scNu0yb\nNfN1Zdx2nbgCXdTKomF1Ahxp58/A2iU65vVzL6hYfWXEGSmoBqsGCIpIxQ9jgB9k\nCl7t/Ban8Z/ORHTjI9fpHlSZyCWJ3ajepiM2a1ZnAoGAPpDO6wi1DXvyWVSPF1yS\nwuGsNfD2rjPihpoBZ+yypwP3GBcu1QjUb28Vn+KQOmt4eQPNO8DwCVT6BvEfulPk\nJAHISPom+jnFEgPBcmhIFpyKiLNI1bUjvExd2FNHFgQuHP38ligQAC782Un8dtTk\ntO2MKH4bbVJe8CaYzpuqJZMCgYABZyMpBHZxs8FQiUuT75rCdiXEHOlxwC5RrY/d\no/VzaR28mOFhsbcdwkD9iqcm0fc6tYRt5rFCH+pBzGqEwKjljuLj9vE67sHfMAtD\nRn3Zcj/6gKo5PMRHZbSb36bf1DKuhpT4VjPMqYe0PtEIEDJKMJQRwELH2bKlqGiA\nqbucEwKBgQCkS85JnpHEV/tSylsEEn2W3CQCx58zl7iZNV7h/tWMR4AyrcI0HqP6\nllJ7V/Cfw66MgelPnosKgagwLVI6gsqDtjnzYo3XuMRVlYIySJ/jV3eiUNkV2Ky2\nfp/gA9sVgp38QSr+xB9E0LNStcbqDzoCCcDRws/SK7PbkQH9KV47tQ==\n-----END RSA PRIVATE KEY-----"
4}
diff --git a/server/tests/api/activitypub/refresher.ts b/server/tests/api/activitypub/refresher.ts
new file mode 100644
index 000000000..62ad8a0b5
--- /dev/null
+++ b/server/tests/api/activitypub/refresher.ts
@@ -0,0 +1,93 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4import {
5 doubleFollow,
6 flushAndRunMultipleServers,
7 getVideo,
8 killallServers,
9 reRunServer,
10 ServerInfo,
11 setAccessTokensToServers,
12 uploadVideo,
13 wait,
14 setVideoField,
15 waitJobs
16} from '../../../../shared/utils'
17
18describe('Test AP refresher', function () {
19 let servers: ServerInfo[] = []
20 let videoUUID1: string
21 let videoUUID2: string
22 let videoUUID3: string
23
24 before(async function () {
25 this.timeout(60000)
26
27 servers = await flushAndRunMultipleServers(2)
28
29 // Get the access tokens
30 await setAccessTokensToServers(servers)
31
32 {
33 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video1' })
34 videoUUID1 = res.body.video.uuid
35 }
36
37 {
38 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video2' })
39 videoUUID2 = res.body.video.uuid
40 }
41
42 {
43 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video3' })
44 videoUUID3 = res.body.video.uuid
45 }
46
47 await doubleFollow(servers[0], servers[1])
48 })
49
50 it('Should remove a deleted remote video', async function () {
51 this.timeout(60000)
52
53 await wait(10000)
54
55 // Change UUID so the remote server returns a 404
56 await setVideoField(2, videoUUID1, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174f')
57
58 await getVideo(servers[0].url, videoUUID1)
59 await getVideo(servers[0].url, videoUUID2)
60
61 await waitJobs(servers)
62
63 await getVideo(servers[0].url, videoUUID1, 404)
64 await getVideo(servers[0].url, videoUUID2, 200)
65 })
66
67 it('Should not update a remote video if the remote instance is down', async function () {
68 this.timeout(60000)
69
70 killallServers([ servers[1] ])
71
72 await setVideoField(2, videoUUID3, 'uuid', '304afe4f-39f9-4d49-8ed7-ac57b86b174e')
73
74 // Video will need a refresh
75 await wait(10000)
76
77 await getVideo(servers[0].url, videoUUID3)
78 // The refresh should fail
79 await waitJobs([ servers[0] ])
80
81 await reRunServer(servers[1])
82
83 // Should not refresh the video, even if the last refresh failed (to avoir a loop on dead instances)
84 await getVideo(servers[0].url, videoUUID3)
85 await waitJobs(servers)
86
87 await getVideo(servers[0].url, videoUUID3, 200)
88 })
89
90 after(async function () {
91 killallServers(servers)
92 })
93})
diff --git a/server/tests/api/activitypub/security.ts b/server/tests/api/activitypub/security.ts
new file mode 100644
index 000000000..342ae0fa1
--- /dev/null
+++ b/server/tests/api/activitypub/security.ts
@@ -0,0 +1,187 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4
5import {
6 flushAndRunMultipleServers,
7 flushTests,
8 killallServers,
9 makeFollowRequest,
10 makePOSTAPRequest,
11 ServerInfo,
12 setActorField
13} from '../../../../shared/utils'
14import { HTTP_SIGNATURE } from '../../../initializers'
15import { buildDigest, buildGlobalHeaders } from '../../../lib/job-queue/handlers/utils/activitypub-http-utils'
16import * as chai from 'chai'
17import { activityPubContextify, buildSignedActivity } from '../../../helpers/activitypub'
18
19const expect = chai.expect
20
21function setKeysOfServer2 (serverNumber: number, publicKey: string, privateKey: string) {
22 return Promise.all([
23 setActorField(serverNumber, 'http://localhost:9002/accounts/peertube', 'publicKey', publicKey),
24 setActorField(serverNumber, 'http://localhost:9002/accounts/peertube', 'privateKey', privateKey)
25 ])
26}
27
28function setKeysOfServer3 (serverNumber: number, publicKey: string, privateKey: string) {
29 return Promise.all([
30 setActorField(serverNumber, 'http://localhost:9003/accounts/peertube', 'publicKey', publicKey),
31 setActorField(serverNumber, 'http://localhost:9003/accounts/peertube', 'privateKey', privateKey)
32 ])
33}
34
35describe('Test ActivityPub security', function () {
36 let servers: ServerInfo[]
37 let url: string
38
39 const keys = require('./json/peertube/keys.json')
40 const invalidKeys = require('./json/peertube/invalid-keys.json')
41 const baseHttpSignature = {
42 algorithm: HTTP_SIGNATURE.ALGORITHM,
43 authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME,
44 keyId: 'acct:peertube@localhost:9002',
45 key: keys.privateKey,
46 headers: HTTP_SIGNATURE.HEADERS_TO_SIGN
47 }
48
49 // ---------------------------------------------------------------
50
51 before(async function () {
52 this.timeout(60000)
53
54 servers = await flushAndRunMultipleServers(3)
55
56 url = servers[0].url + '/inbox'
57
58 await setKeysOfServer2(1, keys.publicKey, keys.privateKey)
59
60 const to = { url: 'http://localhost:9001/accounts/peertube' }
61 const by = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
62 await makeFollowRequest(to, by)
63 })
64
65 describe('When checking HTTP signature', function () {
66
67 it('Should fail with an invalid digest', async function () {
68 const body = activityPubContextify(require('./json/peertube/announce-without-context.json'))
69 const headers = {
70 Digest: buildDigest({ hello: 'coucou' })
71 }
72
73 const { response } = await makePOSTAPRequest(url, body, baseHttpSignature, headers)
74
75 expect(response.statusCode).to.equal(403)
76 })
77
78 it('Should fail with an invalid date', async function () {
79 const body = activityPubContextify(require('./json/peertube/announce-without-context.json'))
80 const headers = buildGlobalHeaders(body)
81 headers['date'] = 'Wed, 21 Oct 2015 07:28:00 GMT'
82
83 const { response } = await makePOSTAPRequest(url, body, baseHttpSignature, headers)
84
85 expect(response.statusCode).to.equal(403)
86 })
87
88 it('Should fail with bad keys', async function () {
89 await setKeysOfServer2(1, invalidKeys.publicKey, invalidKeys.privateKey)
90 await setKeysOfServer2(2, invalidKeys.publicKey, invalidKeys.privateKey)
91
92 const body = activityPubContextify(require('./json/peertube/announce-without-context.json'))
93 const headers = buildGlobalHeaders(body)
94
95 const { response } = await makePOSTAPRequest(url, body, baseHttpSignature, headers)
96
97 expect(response.statusCode).to.equal(403)
98 })
99
100 it('Should succeed with a valid HTTP signature', async function () {
101 await setKeysOfServer2(1, keys.publicKey, keys.privateKey)
102 await setKeysOfServer2(2, keys.publicKey, keys.privateKey)
103
104 const body = activityPubContextify(require('./json/peertube/announce-without-context.json'))
105 const headers = buildGlobalHeaders(body)
106
107 const { response } = await makePOSTAPRequest(url, body, baseHttpSignature, headers)
108
109 expect(response.statusCode).to.equal(204)
110 })
111 })
112
113 describe('When checking Linked Data Signature', function () {
114 before(async () => {
115 await setKeysOfServer3(3, keys.publicKey, keys.privateKey)
116
117 const to = { url: 'http://localhost:9001/accounts/peertube' }
118 const by = { url: 'http://localhost:9003/accounts/peertube', privateKey: keys.privateKey }
119 await makeFollowRequest(to, by)
120 })
121
122 it('Should fail with bad keys', async function () {
123 this.timeout(10000)
124
125 await setKeysOfServer3(1, invalidKeys.publicKey, invalidKeys.privateKey)
126 await setKeysOfServer3(3, invalidKeys.publicKey, invalidKeys.privateKey)
127
128 const body = require('./json/peertube/announce-without-context.json')
129 body.actor = 'http://localhost:9003/accounts/peertube'
130
131 const signer: any = { privateKey: invalidKeys.privateKey, url: 'http://localhost:9003/accounts/peertube' }
132 const signedBody = await buildSignedActivity(signer, body)
133
134 const headers = buildGlobalHeaders(signedBody)
135
136 const { response } = await makePOSTAPRequest(url, signedBody, baseHttpSignature, headers)
137
138 expect(response.statusCode).to.equal(403)
139 })
140
141 it('Should fail with an altered body', async function () {
142 this.timeout(10000)
143
144 await setKeysOfServer3(1, keys.publicKey, keys.privateKey)
145 await setKeysOfServer3(3, keys.publicKey, keys.privateKey)
146
147 const body = require('./json/peertube/announce-without-context.json')
148 body.actor = 'http://localhost:9003/accounts/peertube'
149
150 const signer: any = { privateKey: keys.privateKey, url: 'http://localhost:9003/accounts/peertube' }
151 const signedBody = await buildSignedActivity(signer, body)
152
153 signedBody.actor = 'http://localhost:9003/account/peertube'
154
155 const headers = buildGlobalHeaders(signedBody)
156
157 const { response } = await makePOSTAPRequest(url, signedBody, baseHttpSignature, headers)
158
159 expect(response.statusCode).to.equal(403)
160 })
161
162 it('Should succeed with a valid signature', async function () {
163 this.timeout(10000)
164
165 const body = require('./json/peertube/announce-without-context.json')
166 body.actor = 'http://localhost:9003/accounts/peertube'
167
168 const signer: any = { privateKey: keys.privateKey, url: 'http://localhost:9003/accounts/peertube' }
169 const signedBody = await buildSignedActivity(signer, body)
170
171 const headers = buildGlobalHeaders(signedBody)
172
173 const { response } = await makePOSTAPRequest(url, signedBody, baseHttpSignature, headers)
174
175 expect(response.statusCode).to.equal(204)
176 })
177 })
178
179 after(async function () {
180 killallServers(servers)
181
182 // Keep the logs if the test failed
183 if (this['ok']) {
184 await flushTests()
185 }
186 })
187})
diff --git a/server/tests/api/check-params/accounts.ts b/server/tests/api/check-params/accounts.ts
index 9e0b1e35c..68f9519c6 100644
--- a/server/tests/api/check-params/accounts.ts
+++ b/server/tests/api/check-params/accounts.ts
@@ -2,11 +2,15 @@
2 2
3import 'mocha' 3import 'mocha'
4 4
5import { flushTests, killallServers, runServer, ServerInfo } from '../../utils' 5import { flushTests, killallServers, runServer, ServerInfo } from '../../../../shared/utils'
6import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 6import {
7import { getAccount } from '../../utils/users/accounts' 7 checkBadCountPagination,
8 8 checkBadSortPagination,
9describe('Test users API validators', function () { 9 checkBadStartPagination
10} from '../../../../shared/utils/requests/check-api-params'
11import { getAccount } from '../../../../shared/utils/users/accounts'
12
13describe('Test accounts API validators', function () {
10 const path = '/api/v1/accounts/' 14 const path = '/api/v1/accounts/'
11 let server: ServerInfo 15 let server: ServerInfo
12 16
diff --git a/server/tests/api/check-params/blocklist.ts b/server/tests/api/check-params/blocklist.ts
new file mode 100644
index 000000000..c20453c16
--- /dev/null
+++ b/server/tests/api/check-params/blocklist.ts
@@ -0,0 +1,498 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4
5import {
6 createUser,
7 doubleFollow,
8 flushAndRunMultipleServers,
9 flushTests,
10 killallServers,
11 makeDeleteRequest,
12 makeGetRequest,
13 makePostBodyRequest,
14 ServerInfo,
15 setAccessTokensToServers, userLogin
16} from '../../../../shared/utils'
17import {
18 checkBadCountPagination,
19 checkBadSortPagination,
20 checkBadStartPagination
21} from '../../../../shared/utils/requests/check-api-params'
22
23describe('Test blocklist API validators', function () {
24 let servers: ServerInfo[]
25 let server: ServerInfo
26 let userAccessToken: string
27
28 before(async function () {
29 this.timeout(60000)
30
31 await flushTests()
32
33 servers = await flushAndRunMultipleServers(2)
34 await setAccessTokensToServers(servers)
35
36 server = servers[0]
37
38 const user = { username: 'user1', password: 'password' }
39 await createUser(server.url, server.accessToken, user.username, user.password)
40
41 userAccessToken = await userLogin(server, user)
42
43 await doubleFollow(servers[0], servers[1])
44 })
45
46 // ---------------------------------------------------------------
47
48 describe('When managing user blocklist', function () {
49
50 describe('When managing user accounts blocklist', function () {
51 const path = '/api/v1/users/me/blocklist/accounts'
52
53 describe('When listing blocked accounts', function () {
54 it('Should fail with an unauthenticated user', async function () {
55 await makeGetRequest({
56 url: server.url,
57 path,
58 statusCodeExpected: 401
59 })
60 })
61
62 it('Should fail with a bad start pagination', async function () {
63 await checkBadStartPagination(server.url, path, server.accessToken)
64 })
65
66 it('Should fail with a bad count pagination', async function () {
67 await checkBadCountPagination(server.url, path, server.accessToken)
68 })
69
70 it('Should fail with an incorrect sort', async function () {
71 await checkBadSortPagination(server.url, path, server.accessToken)
72 })
73 })
74
75 describe('When blocking an account', function () {
76 it('Should fail with an unauthenticated user', async function () {
77 await makePostBodyRequest({
78 url: server.url,
79 path,
80 fields: { accountName: 'user1' },
81 statusCodeExpected: 401
82 })
83 })
84
85 it('Should fail with an unknown account', async function () {
86 await makePostBodyRequest({
87 url: server.url,
88 token: server.accessToken,
89 path,
90 fields: { accountName: 'user2' },
91 statusCodeExpected: 404
92 })
93 })
94
95 it('Should fail to block ourselves', async function () {
96 await makePostBodyRequest({
97 url: server.url,
98 token: server.accessToken,
99 path,
100 fields: { accountName: 'root' },
101 statusCodeExpected: 409
102 })
103 })
104
105 it('Should succeed with the correct params', async function () {
106 await makePostBodyRequest({
107 url: server.url,
108 token: server.accessToken,
109 path,
110 fields: { accountName: 'user1' },
111 statusCodeExpected: 204
112 })
113 })
114 })
115
116 describe('When unblocking an account', function () {
117 it('Should fail with an unauthenticated user', async function () {
118 await makeDeleteRequest({
119 url: server.url,
120 path: path + '/user1',
121 statusCodeExpected: 401
122 })
123 })
124
125 it('Should fail with an unknown account block', async function () {
126 await makeDeleteRequest({
127 url: server.url,
128 path: path + '/user2',
129 token: server.accessToken,
130 statusCodeExpected: 404
131 })
132 })
133
134 it('Should succeed with the correct params', async function () {
135 await makeDeleteRequest({
136 url: server.url,
137 path: path + '/user1',
138 token: server.accessToken,
139 statusCodeExpected: 204
140 })
141 })
142 })
143 })
144
145 describe('When managing user servers blocklist', function () {
146 const path = '/api/v1/users/me/blocklist/servers'
147
148 describe('When listing blocked servers', function () {
149 it('Should fail with an unauthenticated user', async function () {
150 await makeGetRequest({
151 url: server.url,
152 path,
153 statusCodeExpected: 401
154 })
155 })
156
157 it('Should fail with a bad start pagination', async function () {
158 await checkBadStartPagination(server.url, path, server.accessToken)
159 })
160
161 it('Should fail with a bad count pagination', async function () {
162 await checkBadCountPagination(server.url, path, server.accessToken)
163 })
164
165 it('Should fail with an incorrect sort', async function () {
166 await checkBadSortPagination(server.url, path, server.accessToken)
167 })
168 })
169
170 describe('When blocking a server', function () {
171 it('Should fail with an unauthenticated user', async function () {
172 await makePostBodyRequest({
173 url: server.url,
174 path,
175 fields: { host: 'localhost:9002' },
176 statusCodeExpected: 401
177 })
178 })
179
180 it('Should fail with an unknown server', async function () {
181 await makePostBodyRequest({
182 url: server.url,
183 token: server.accessToken,
184 path,
185 fields: { host: 'localhost:9003' },
186 statusCodeExpected: 404
187 })
188 })
189
190 it('Should fail with our own server', async function () {
191 await makePostBodyRequest({
192 url: server.url,
193 token: server.accessToken,
194 path,
195 fields: { host: 'localhost:9001' },
196 statusCodeExpected: 409
197 })
198 })
199
200 it('Should succeed with the correct params', async function () {
201 await makePostBodyRequest({
202 url: server.url,
203 token: server.accessToken,
204 path,
205 fields: { host: 'localhost:9002' },
206 statusCodeExpected: 204
207 })
208 })
209 })
210
211 describe('When unblocking a server', function () {
212 it('Should fail with an unauthenticated user', async function () {
213 await makeDeleteRequest({
214 url: server.url,
215 path: path + '/localhost:9002',
216 statusCodeExpected: 401
217 })
218 })
219
220 it('Should fail with an unknown server block', async function () {
221 await makeDeleteRequest({
222 url: server.url,
223 path: path + '/localhost:9003',
224 token: server.accessToken,
225 statusCodeExpected: 404
226 })
227 })
228
229 it('Should succeed with the correct params', async function () {
230 await makeDeleteRequest({
231 url: server.url,
232 path: path + '/localhost:9002',
233 token: server.accessToken,
234 statusCodeExpected: 204
235 })
236 })
237 })
238 })
239 })
240
241 describe('When managing server blocklist', function () {
242
243 describe('When managing server accounts blocklist', function () {
244 const path = '/api/v1/server/blocklist/accounts'
245
246 describe('When listing blocked accounts', function () {
247 it('Should fail with an unauthenticated user', async function () {
248 await makeGetRequest({
249 url: server.url,
250 path,
251 statusCodeExpected: 401
252 })
253 })
254
255 it('Should fail with a user without the appropriate rights', async function () {
256 await makeGetRequest({
257 url: server.url,
258 token: userAccessToken,
259 path,
260 statusCodeExpected: 403
261 })
262 })
263
264 it('Should fail with a bad start pagination', async function () {
265 await checkBadStartPagination(server.url, path, server.accessToken)
266 })
267
268 it('Should fail with a bad count pagination', async function () {
269 await checkBadCountPagination(server.url, path, server.accessToken)
270 })
271
272 it('Should fail with an incorrect sort', async function () {
273 await checkBadSortPagination(server.url, path, server.accessToken)
274 })
275 })
276
277 describe('When blocking an account', function () {
278 it('Should fail with an unauthenticated user', async function () {
279 await makePostBodyRequest({
280 url: server.url,
281 path,
282 fields: { accountName: 'user1' },
283 statusCodeExpected: 401
284 })
285 })
286
287 it('Should fail with a user without the appropriate rights', async function () {
288 await makePostBodyRequest({
289 url: server.url,
290 token: userAccessToken,
291 path,
292 fields: { accountName: 'user1' },
293 statusCodeExpected: 403
294 })
295 })
296
297 it('Should fail with an unknown account', async function () {
298 await makePostBodyRequest({
299 url: server.url,
300 token: server.accessToken,
301 path,
302 fields: { accountName: 'user2' },
303 statusCodeExpected: 404
304 })
305 })
306
307 it('Should fail to block ourselves', async function () {
308 await makePostBodyRequest({
309 url: server.url,
310 token: server.accessToken,
311 path,
312 fields: { accountName: 'root' },
313 statusCodeExpected: 409
314 })
315 })
316
317 it('Should succeed with the correct params', async function () {
318 await makePostBodyRequest({
319 url: server.url,
320 token: server.accessToken,
321 path,
322 fields: { accountName: 'user1' },
323 statusCodeExpected: 204
324 })
325 })
326 })
327
328 describe('When unblocking an account', function () {
329 it('Should fail with an unauthenticated user', async function () {
330 await makeDeleteRequest({
331 url: server.url,
332 path: path + '/user1',
333 statusCodeExpected: 401
334 })
335 })
336
337 it('Should fail with a user without the appropriate rights', async function () {
338 await makeDeleteRequest({
339 url: server.url,
340 path: path + '/user1',
341 token: userAccessToken,
342 statusCodeExpected: 403
343 })
344 })
345
346 it('Should fail with an unknown account block', async function () {
347 await makeDeleteRequest({
348 url: server.url,
349 path: path + '/user2',
350 token: server.accessToken,
351 statusCodeExpected: 404
352 })
353 })
354
355 it('Should succeed with the correct params', async function () {
356 await makeDeleteRequest({
357 url: server.url,
358 path: path + '/user1',
359 token: server.accessToken,
360 statusCodeExpected: 204
361 })
362 })
363 })
364 })
365
366 describe('When managing server servers blocklist', function () {
367 const path = '/api/v1/server/blocklist/servers'
368
369 describe('When listing blocked servers', function () {
370 it('Should fail with an unauthenticated user', async function () {
371 await makeGetRequest({
372 url: server.url,
373 path,
374 statusCodeExpected: 401
375 })
376 })
377
378 it('Should fail with a user without the appropriate rights', async function () {
379 await makeGetRequest({
380 url: server.url,
381 token: userAccessToken,
382 path,
383 statusCodeExpected: 403
384 })
385 })
386
387 it('Should fail with a bad start pagination', async function () {
388 await checkBadStartPagination(server.url, path, server.accessToken)
389 })
390
391 it('Should fail with a bad count pagination', async function () {
392 await checkBadCountPagination(server.url, path, server.accessToken)
393 })
394
395 it('Should fail with an incorrect sort', async function () {
396 await checkBadSortPagination(server.url, path, server.accessToken)
397 })
398 })
399
400 describe('When blocking a server', function () {
401 it('Should fail with an unauthenticated user', async function () {
402 await makePostBodyRequest({
403 url: server.url,
404 path,
405 fields: { host: 'localhost:9002' },
406 statusCodeExpected: 401
407 })
408 })
409
410 it('Should fail with a user without the appropriate rights', async function () {
411 await makePostBodyRequest({
412 url: server.url,
413 token: userAccessToken,
414 path,
415 fields: { host: 'localhost:9002' },
416 statusCodeExpected: 403
417 })
418 })
419
420 it('Should fail with an unknown server', async function () {
421 await makePostBodyRequest({
422 url: server.url,
423 token: server.accessToken,
424 path,
425 fields: { host: 'localhost:9003' },
426 statusCodeExpected: 404
427 })
428 })
429
430 it('Should fail with our own server', async function () {
431 await makePostBodyRequest({
432 url: server.url,
433 token: server.accessToken,
434 path,
435 fields: { host: 'localhost:9001' },
436 statusCodeExpected: 409
437 })
438 })
439
440 it('Should succeed with the correct params', async function () {
441 await makePostBodyRequest({
442 url: server.url,
443 token: server.accessToken,
444 path,
445 fields: { host: 'localhost:9002' },
446 statusCodeExpected: 204
447 })
448 })
449 })
450
451 describe('When unblocking a server', function () {
452 it('Should fail with an unauthenticated user', async function () {
453 await makeDeleteRequest({
454 url: server.url,
455 path: path + '/localhost:9002',
456 statusCodeExpected: 401
457 })
458 })
459
460 it('Should fail with a user without the appropriate rights', async function () {
461 await makeDeleteRequest({
462 url: server.url,
463 path: path + '/localhost:9002',
464 token: userAccessToken,
465 statusCodeExpected: 403
466 })
467 })
468
469 it('Should fail with an unknown server block', async function () {
470 await makeDeleteRequest({
471 url: server.url,
472 path: path + '/localhost:9003',
473 token: server.accessToken,
474 statusCodeExpected: 404
475 })
476 })
477
478 it('Should succeed with the correct params', async function () {
479 await makeDeleteRequest({
480 url: server.url,
481 path: path + '/localhost:9002',
482 token: server.accessToken,
483 statusCodeExpected: 204
484 })
485 })
486 })
487 })
488 })
489
490 after(async function () {
491 killallServers(servers)
492
493 // Keep the logs if the test failed
494 if (this['ok']) {
495 await flushTests()
496 }
497 })
498})
diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts
index d807f910b..07de2b5a5 100644
--- a/server/tests/api/check-params/config.ts
+++ b/server/tests/api/check-params/config.ts
@@ -7,7 +7,7 @@ import { CustomConfig } from '../../../../shared/models/server/custom-config.mod
7import { 7import {
8 createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePutBodyRequest, runServer, ServerInfo, 8 createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePutBodyRequest, runServer, ServerInfo,
9 setAccessTokensToServers, userLogin, immutableAssign 9 setAccessTokensToServers, userLogin, immutableAssign
10} from '../../utils' 10} from '../../../../shared/utils'
11 11
12describe('Test config API validators', function () { 12describe('Test config API validators', function () {
13 const path = '/api/v1/config/custom' 13 const path = '/api/v1/config/custom'
@@ -48,12 +48,16 @@ describe('Test config API validators', function () {
48 admin: { 48 admin: {
49 email: 'superadmin1@example.com' 49 email: 'superadmin1@example.com'
50 }, 50 },
51 contactForm: {
52 enabled: false
53 },
51 user: { 54 user: {
52 videoQuota: 5242881, 55 videoQuota: 5242881,
53 videoQuotaDaily: 318742 56 videoQuotaDaily: 318742
54 }, 57 },
55 transcoding: { 58 transcoding: {
56 enabled: true, 59 enabled: true,
60 allowAdditionalExtensions: true,
57 threads: 1, 61 threads: 1,
58 resolutions: { 62 resolutions: {
59 '240p': false, 63 '240p': false,
@@ -61,6 +65,9 @@ describe('Test config API validators', function () {
61 '480p': true, 65 '480p': true,
62 '720p': false, 66 '720p': false,
63 '1080p': false 67 '1080p': false
68 },
69 hls: {
70 enabled: false
64 } 71 }
65 }, 72 },
66 import: { 73 import: {
diff --git a/server/tests/api/check-params/contact-form.ts b/server/tests/api/check-params/contact-form.ts
new file mode 100644
index 000000000..c7e014b1f
--- /dev/null
+++ b/server/tests/api/check-params/contact-form.ts
@@ -0,0 +1,96 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4
5import {
6 flushTests,
7 immutableAssign,
8 killallServers,
9 reRunServer,
10 runServer,
11 ServerInfo,
12 setAccessTokensToServers
13} from '../../../../shared/utils'
14import {
15 checkBadCountPagination,
16 checkBadSortPagination,
17 checkBadStartPagination
18} from '../../../../shared/utils/requests/check-api-params'
19import { getAccount } from '../../../../shared/utils/users/accounts'
20import { sendContactForm } from '../../../../shared/utils/server/contact-form'
21import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
22
23describe('Test contact form API validators', function () {
24 let server: ServerInfo
25 const emails: object[] = []
26 const defaultBody = {
27 fromName: 'super name',
28 fromEmail: 'toto@example.com',
29 body: 'Hello, how are you?'
30 }
31
32 // ---------------------------------------------------------------
33
34 before(async function () {
35 this.timeout(60000)
36
37 await flushTests()
38 await MockSmtpServer.Instance.collectEmails(emails)
39
40 // Email is disabled
41 server = await runServer(1)
42 })
43
44 it('Should not accept a contact form if emails are disabled', async function () {
45 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 409 }))
46 })
47
48 it('Should not accept a contact form if it is disabled in the configuration', async function () {
49 this.timeout(10000)
50
51 killallServers([ server ])
52
53 // Contact form is disabled
54 await reRunServer(server, { smtp: { hostname: 'localhost' }, contact_form: { enabled: false } })
55 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 409 }))
56 })
57
58 it('Should not accept a contact form if from email is invalid', async function () {
59 this.timeout(10000)
60
61 killallServers([ server ])
62
63 // Email & contact form enabled
64 await reRunServer(server, { smtp: { hostname: 'localhost' } })
65
66 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromEmail: 'badEmail' }))
67 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromEmail: 'badEmail@' }))
68 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromEmail: undefined }))
69 })
70
71 it('Should not accept a contact form if from name is invalid', async function () {
72 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromName: 'name'.repeat(100) }))
73 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromName: '' }))
74 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromName: undefined }))
75 })
76
77 it('Should not accept a contact form if body is invalid', async function () {
78 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, body: 'body'.repeat(5000) }))
79 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, body: 'a' }))
80 await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, body: undefined }))
81 })
82
83 it('Should accept a contact form with the correct parameters', async function () {
84 await sendContactForm(immutableAssign(defaultBody, { url: server.url }))
85 })
86
87 after(async function () {
88 MockSmtpServer.Instance.kill()
89 killallServers([ server ])
90
91 // Keep the logs if the test failed
92 if (this['ok']) {
93 await flushTests()
94 }
95 })
96})
diff --git a/server/tests/api/check-params/follows.ts b/server/tests/api/check-params/follows.ts
index cdc95c81a..2ad1575a3 100644
--- a/server/tests/api/check-params/follows.ts
+++ b/server/tests/api/check-params/follows.ts
@@ -5,8 +5,12 @@ import 'mocha'
5import { 5import {
6 createUser, flushTests, killallServers, makeDeleteRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers, 6 createUser, flushTests, killallServers, makeDeleteRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers,
7 userLogin 7 userLogin
8} from '../../utils' 8} from '../../../../shared/utils'
9import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 9import {
10 checkBadCountPagination,
11 checkBadSortPagination,
12 checkBadStartPagination
13} from '../../../../shared/utils/requests/check-api-params'
10 14
11describe('Test server follows API validators', function () { 15describe('Test server follows API validators', function () {
12 let server: ServerInfo 16 let server: ServerInfo
diff --git a/server/tests/api/check-params/index.ts b/server/tests/api/check-params/index.ts
index 71a217649..77c17036a 100644
--- a/server/tests/api/check-params/index.ts
+++ b/server/tests/api/check-params/index.ts
@@ -1,11 +1,13 @@
1// Order of the tests we want to execute
2import './accounts' 1import './accounts'
2import './blocklist'
3import './config' 3import './config'
4import './contact-form'
4import './follows' 5import './follows'
5import './jobs' 6import './jobs'
6import './redundancy' 7import './redundancy'
7import './search' 8import './search'
8import './services' 9import './services'
10import './user-notifications'
9import './user-subscriptions' 11import './user-subscriptions'
10import './users' 12import './users'
11import './video-abuses' 13import './video-abuses'
@@ -15,4 +17,5 @@ import './video-channels'
15import './video-comments' 17import './video-comments'
16import './video-imports' 18import './video-imports'
17import './videos' 19import './videos'
20import './videos-filter'
18import './videos-history' 21import './videos-history'
diff --git a/server/tests/api/check-params/jobs.ts b/server/tests/api/check-params/jobs.ts
index ce3ac8809..89760ff98 100644
--- a/server/tests/api/check-params/jobs.ts
+++ b/server/tests/api/check-params/jobs.ts
@@ -2,9 +2,21 @@
2 2
3import 'mocha' 3import 'mocha'
4 4
5import { createUser, flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, userLogin } from '../../utils' 5import {
6import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 6 createUser,
7import { makeGetRequest } from '../../utils/requests/requests' 7 flushTests,
8 killallServers,
9 runServer,
10 ServerInfo,
11 setAccessTokensToServers,
12 userLogin
13} from '../../../../shared/utils'
14import {
15 checkBadCountPagination,
16 checkBadSortPagination,
17 checkBadStartPagination
18} from '../../../../shared/utils/requests/check-api-params'
19import { makeGetRequest } from '../../../../shared/utils/requests/requests'
8 20
9describe('Test jobs API validators', function () { 21describe('Test jobs API validators', function () {
10 const path = '/api/v1/jobs/failed' 22 const path = '/api/v1/jobs/failed'
diff --git a/server/tests/api/check-params/redundancy.ts b/server/tests/api/check-params/redundancy.ts
index aa588e3dd..ff4726ceb 100644
--- a/server/tests/api/check-params/redundancy.ts
+++ b/server/tests/api/check-params/redundancy.ts
@@ -12,7 +12,7 @@ import {
12 ServerInfo, 12 ServerInfo,
13 setAccessTokensToServers, 13 setAccessTokensToServers,
14 userLogin 14 userLogin
15} from '../../utils' 15} from '../../../../shared/utils'
16 16
17describe('Test server redundancy API validators', function () { 17describe('Test server redundancy API validators', function () {
18 let servers: ServerInfo[] 18 let servers: ServerInfo[]
diff --git a/server/tests/api/check-params/search.ts b/server/tests/api/check-params/search.ts
index eabf602ac..aa81965f3 100644
--- a/server/tests/api/check-params/search.ts
+++ b/server/tests/api/check-params/search.ts
@@ -2,8 +2,12 @@
2 2
3import 'mocha' 3import 'mocha'
4 4
5import { flushTests, immutableAssign, killallServers, makeGetRequest, runServer, ServerInfo } from '../../utils' 5import { flushTests, immutableAssign, killallServers, makeGetRequest, runServer, ServerInfo } from '../../../../shared/utils'
6import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 6import {
7 checkBadCountPagination,
8 checkBadSortPagination,
9 checkBadStartPagination
10} from '../../../../shared/utils/requests/check-api-params'
7 11
8describe('Test videos API validator', function () { 12describe('Test videos API validator', function () {
9 let server: ServerInfo 13 let server: ServerInfo
diff --git a/server/tests/api/check-params/services.ts b/server/tests/api/check-params/services.ts
index fcde7e179..28591af9d 100644
--- a/server/tests/api/check-params/services.ts
+++ b/server/tests/api/check-params/services.ts
@@ -2,7 +2,15 @@
2 2
3import 'mocha' 3import 'mocha'
4 4
5import { flushTests, killallServers, makeGetRequest, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils' 5import {
6 flushTests,
7 killallServers,
8 makeGetRequest,
9 runServer,
10 ServerInfo,
11 setAccessTokensToServers,
12 uploadVideo
13} from '../../../../shared/utils'
6 14
7describe('Test services API validators', function () { 15describe('Test services API validators', function () {
8 let server: ServerInfo 16 let server: ServerInfo
diff --git a/server/tests/api/check-params/user-notifications.ts b/server/tests/api/check-params/user-notifications.ts
new file mode 100644
index 000000000..714f481e9
--- /dev/null
+++ b/server/tests/api/check-params/user-notifications.ts
@@ -0,0 +1,297 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4import * as io from 'socket.io-client'
5
6import {
7 flushTests,
8 immutableAssign,
9 killallServers,
10 makeGetRequest,
11 makePostBodyRequest,
12 makePutBodyRequest,
13 runServer,
14 ServerInfo,
15 setAccessTokensToServers,
16 wait
17} from '../../../../shared/utils'
18import {
19 checkBadCountPagination,
20 checkBadSortPagination,
21 checkBadStartPagination
22} from '../../../../shared/utils/requests/check-api-params'
23import { UserNotificationSetting, UserNotificationSettingValue } from '../../../../shared/models/users'
24
25describe('Test user notifications API validators', function () {
26 let server: ServerInfo
27
28 // ---------------------------------------------------------------
29
30 before(async function () {
31 this.timeout(30000)
32
33 await flushTests()
34
35 server = await runServer(1)
36
37 await setAccessTokensToServers([ server ])
38 })
39
40 describe('When listing my notifications', function () {
41 const path = '/api/v1/users/me/notifications'
42
43 it('Should fail with a bad start pagination', async function () {
44 await checkBadStartPagination(server.url, path, server.accessToken)
45 })
46
47 it('Should fail with a bad count pagination', async function () {
48 await checkBadCountPagination(server.url, path, server.accessToken)
49 })
50
51 it('Should fail with an incorrect sort', async function () {
52 await checkBadSortPagination(server.url, path, server.accessToken)
53 })
54
55 it('Should fail with an incorrect unread parameter', async function () {
56 await makeGetRequest({
57 url: server.url,
58 path,
59 query: {
60 unread: 'toto'
61 },
62 token: server.accessToken,
63 statusCodeExpected: 200
64 })
65 })
66
67 it('Should fail with a non authenticated user', async function () {
68 await makeGetRequest({
69 url: server.url,
70 path,
71 statusCodeExpected: 401
72 })
73 })
74
75 it('Should succeed with the correct parameters', async function () {
76 await makeGetRequest({
77 url: server.url,
78 path,
79 token: server.accessToken,
80 statusCodeExpected: 200
81 })
82 })
83 })
84
85 describe('When marking as read my notifications', function () {
86 const path = '/api/v1/users/me/notifications/read'
87
88 it('Should fail with wrong ids parameters', async function () {
89 await makePostBodyRequest({
90 url: server.url,
91 path,
92 fields: {
93 ids: [ 'hello' ]
94 },
95 token: server.accessToken,
96 statusCodeExpected: 400
97 })
98
99 await makePostBodyRequest({
100 url: server.url,
101 path,
102 fields: {
103 ids: [ ]
104 },
105 token: server.accessToken,
106 statusCodeExpected: 400
107 })
108
109 await makePostBodyRequest({
110 url: server.url,
111 path,
112 fields: {
113 ids: 5
114 },
115 token: server.accessToken,
116 statusCodeExpected: 400
117 })
118 })
119
120 it('Should fail with a non authenticated user', async function () {
121 await makePostBodyRequest({
122 url: server.url,
123 path,
124 fields: {
125 ids: [ 5 ]
126 },
127 statusCodeExpected: 401
128 })
129 })
130
131 it('Should succeed with the correct parameters', async function () {
132 await makePostBodyRequest({
133 url: server.url,
134 path,
135 fields: {
136 ids: [ 5 ]
137 },
138 token: server.accessToken,
139 statusCodeExpected: 204
140 })
141 })
142 })
143
144 describe('When marking as read my notifications', function () {
145 const path = '/api/v1/users/me/notifications/read-all'
146
147 it('Should fail with a non authenticated user', async function () {
148 await makePostBodyRequest({
149 url: server.url,
150 path,
151 statusCodeExpected: 401
152 })
153 })
154
155 it('Should succeed with the correct parameters', async function () {
156 await makePostBodyRequest({
157 url: server.url,
158 path,
159 token: server.accessToken,
160 statusCodeExpected: 204
161 })
162 })
163 })
164
165 describe('When updating my notification settings', function () {
166 const path = '/api/v1/users/me/notification-settings'
167 const correctFields: UserNotificationSetting = {
168 newVideoFromSubscription: UserNotificationSettingValue.WEB,
169 newCommentOnMyVideo: UserNotificationSettingValue.WEB,
170 videoAbuseAsModerator: UserNotificationSettingValue.WEB,
171 blacklistOnMyVideo: UserNotificationSettingValue.WEB,
172 myVideoImportFinished: UserNotificationSettingValue.WEB,
173 myVideoPublished: UserNotificationSettingValue.WEB,
174 commentMention: UserNotificationSettingValue.WEB,
175 newFollow: UserNotificationSettingValue.WEB,
176 newUserRegistration: UserNotificationSettingValue.WEB
177 }
178
179 it('Should fail with missing fields', async function () {
180 await makePutBodyRequest({
181 url: server.url,
182 path,
183 token: server.accessToken,
184 fields: { newVideoFromSubscription: UserNotificationSettingValue.WEB },
185 statusCodeExpected: 400
186 })
187 })
188
189 it('Should fail with incorrect field values', async function () {
190 {
191 const fields = immutableAssign(correctFields, { newCommentOnMyVideo: 15 })
192
193 await makePutBodyRequest({
194 url: server.url,
195 path,
196 token: server.accessToken,
197 fields,
198 statusCodeExpected: 400
199 })
200 }
201
202 {
203 const fields = immutableAssign(correctFields, { newCommentOnMyVideo: 'toto' })
204
205 await makePutBodyRequest({
206 url: server.url,
207 path,
208 fields,
209 token: server.accessToken,
210 statusCodeExpected: 400
211 })
212 }
213 })
214
215 it('Should fail with a non authenticated user', async function () {
216 await makePutBodyRequest({
217 url: server.url,
218 path,
219 fields: correctFields,
220 statusCodeExpected: 401
221 })
222 })
223
224 it('Should succeed with the correct parameters', async function () {
225 await makePutBodyRequest({
226 url: server.url,
227 path,
228 token: server.accessToken,
229 fields: correctFields,
230 statusCodeExpected: 204
231 })
232 })
233 })
234
235 describe('When connecting to my notification socket', function () {
236 it('Should fail with no token', function (next) {
237 const socket = io('http://localhost:9001/user-notifications', { reconnection: false })
238
239 socket.on('error', () => {
240 socket.removeListener('error', this)
241 socket.disconnect()
242 next()
243 })
244
245 socket.on('connect', () => {
246 socket.disconnect()
247 next(new Error('Connected with a missing token.'))
248 })
249 })
250
251 it('Should fail with an invalid token', function (next) {
252 const socket = io('http://localhost:9001/user-notifications', {
253 query: { accessToken: 'bad_access_token' },
254 reconnection: false
255 })
256
257 socket.on('error', () => {
258 socket.removeListener('error', this)
259 socket.disconnect()
260 next()
261 })
262
263 socket.on('connect', () => {
264 socket.disconnect()
265 next(new Error('Connected with an invalid token.'))
266 })
267 })
268
269 it('Should success with the correct token', function (next) {
270 const socket = io('http://localhost:9001/user-notifications', {
271 query: { accessToken: server.accessToken },
272 reconnection: false
273 })
274
275 const errorListener = socket.on('error', err => {
276 next(new Error('Error in connection: ' + err))
277 })
278
279 socket.on('connect', async () => {
280 socket.removeListener('error', errorListener)
281 socket.disconnect()
282
283 await wait(500)
284 next()
285 })
286 })
287 })
288
289 after(async function () {
290 killallServers([ server ])
291
292 // Keep the logs if the test failed
293 if (this['ok']) {
294 await flushTests()
295 }
296 })
297})
diff --git a/server/tests/api/check-params/user-subscriptions.ts b/server/tests/api/check-params/user-subscriptions.ts
index 9fba99ac8..8a9ced7c1 100644
--- a/server/tests/api/check-params/user-subscriptions.ts
+++ b/server/tests/api/check-params/user-subscriptions.ts
@@ -13,8 +13,14 @@ import {
13 ServerInfo, 13 ServerInfo,
14 setAccessTokensToServers, 14 setAccessTokensToServers,
15 userLogin 15 userLogin
16} from '../../utils' 16} from '../../../../shared/utils'
17import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 17
18import {
19 checkBadCountPagination,
20 checkBadSortPagination,
21 checkBadStartPagination
22} from '../../../../shared/utils/requests/check-api-params'
23import { waitJobs } from '../../../../shared/utils/server/jobs'
18 24
19describe('Test user subscriptions API validators', function () { 25describe('Test user subscriptions API validators', function () {
20 const path = '/api/v1/users/me/subscriptions' 26 const path = '/api/v1/users/me/subscriptions'
@@ -141,6 +147,8 @@ describe('Test user subscriptions API validators', function () {
141 }) 147 })
142 148
143 it('Should succeed with the correct parameters', async function () { 149 it('Should succeed with the correct parameters', async function () {
150 this.timeout(20000)
151
144 await makePostBodyRequest({ 152 await makePostBodyRequest({
145 url: server.url, 153 url: server.url,
146 path, 154 path,
@@ -148,6 +156,8 @@ describe('Test user subscriptions API validators', function () {
148 fields: { uri: 'user1_channel@localhost:9001' }, 156 fields: { uri: 'user1_channel@localhost:9001' },
149 statusCodeExpected: 204 157 statusCodeExpected: 204
150 }) 158 })
159
160 await waitJobs([ server ])
151 }) 161 })
152 }) 162 })
153 163
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts
index cbfa0c137..13be8b460 100644
--- a/server/tests/api/check-params/users.ts
+++ b/server/tests/api/check-params/users.ts
@@ -9,11 +9,15 @@ import {
9 createUser, flushTests, getMyUserInformation, getMyUserVideoRating, getUsersList, immutableAssign, killallServers, makeGetRequest, 9 createUser, flushTests, getMyUserInformation, getMyUserVideoRating, getUsersList, immutableAssign, killallServers, makeGetRequest,
10 makePostBodyRequest, makeUploadRequest, makePutBodyRequest, registerUser, removeUser, runServer, ServerInfo, setAccessTokensToServers, 10 makePostBodyRequest, makeUploadRequest, makePutBodyRequest, registerUser, removeUser, runServer, ServerInfo, setAccessTokensToServers,
11 updateUser, uploadVideo, userLogin, deleteMe, unblockUser, blockUser 11 updateUser, uploadVideo, userLogin, deleteMe, unblockUser, blockUser
12} from '../../utils' 12} from '../../../../shared/utils'
13import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 13import {
14import { getMagnetURI, getMyVideoImports, getYoutubeVideoUrl, importVideo } from '../../utils/videos/video-imports' 14 checkBadCountPagination,
15 checkBadSortPagination,
16 checkBadStartPagination
17} from '../../../../shared/utils/requests/check-api-params'
18import { getMagnetURI, getMyVideoImports, getYoutubeVideoUrl, importVideo } from '../../../../shared/utils/videos/video-imports'
15import { VideoPrivacy } from '../../../../shared/models/videos' 19import { VideoPrivacy } from '../../../../shared/models/videos'
16import { waitJobs } from '../../utils/server/jobs' 20import { waitJobs } from '../../../../shared/utils/server/jobs'
17import { expect } from 'chai' 21import { expect } from 'chai'
18 22
19describe('Test users API validators', function () { 23describe('Test users API validators', function () {
@@ -99,13 +103,13 @@ describe('Test users API validators', function () {
99 } 103 }
100 104
101 it('Should fail with a too small username', async function () { 105 it('Should fail with a too small username', async function () {
102 const fields = immutableAssign(baseCorrectParams, { username: 'fi' }) 106 const fields = immutableAssign(baseCorrectParams, { username: '' })
103 107
104 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 108 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
105 }) 109 })
106 110
107 it('Should fail with a too long username', async function () { 111 it('Should fail with a too long username', async function () {
108 const fields = immutableAssign(baseCorrectParams, { username: 'my_super_username_which_is_very_long' }) 112 const fields = immutableAssign(baseCorrectParams, { username: 'super'.repeat(50) })
109 113
110 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 114 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
111 }) 115 })
@@ -304,6 +308,14 @@ describe('Test users API validators', function () {
304 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 308 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
305 }) 309 })
306 310
311 it('Should fail with an invalid videosHistoryEnabled attribute', async function () {
312 const fields = {
313 videosHistoryEnabled: -1
314 }
315
316 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
317 })
318
307 it('Should fail with an non authenticated user', async function () { 319 it('Should fail with an non authenticated user', async function () {
308 const fields = { 320 const fields = {
309 currentPassword: 'my super password', 321 currentPassword: 'my super password',
@@ -315,7 +327,7 @@ describe('Test users API validators', function () {
315 327
316 it('Should fail with a too long description', async function () { 328 it('Should fail with a too long description', async function () {
317 const fields = { 329 const fields = {
318 description: 'super'.repeat(60) 330 description: 'super'.repeat(201)
319 } 331 }
320 332
321 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 333 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
@@ -428,6 +440,14 @@ describe('Test users API validators', function () {
428 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields }) 440 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
429 }) 441 })
430 442
443 it('Should fail with an invalid emailVerified attribute', async function () {
444 const fields = {
445 emailVerified: 'yes'
446 }
447
448 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
449 })
450
431 it('Should fail with an invalid videoQuota attribute', async function () { 451 it('Should fail with an invalid videoQuota attribute', async function () {
432 const fields = { 452 const fields = {
433 videoQuota: -90 453 videoQuota: -90
@@ -444,6 +464,24 @@ describe('Test users API validators', function () {
444 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields }) 464 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
445 }) 465 })
446 466
467 it('Should fail with a too small password', async function () {
468 const fields = {
469 currentPassword: 'my super password',
470 password: 'bla'
471 }
472
473 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
474 })
475
476 it('Should fail with a too long password', async function () {
477 const fields = {
478 currentPassword: 'my super password',
479 password: 'super'.repeat(61)
480 }
481
482 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
483 })
484
447 it('Should fail with an non authenticated user', async function () { 485 it('Should fail with an non authenticated user', async function () {
448 const fields = { 486 const fields = {
449 videoQuota: 42 487 videoQuota: 42
@@ -463,12 +501,12 @@ describe('Test users API validators', function () {
463 it('Should succeed with the correct params', async function () { 501 it('Should succeed with the correct params', async function () {
464 const fields = { 502 const fields = {
465 email: 'email@example.com', 503 email: 'email@example.com',
504 emailVerified: true,
466 videoQuota: 42, 505 videoQuota: 42,
467 role: UserRole.MODERATOR 506 role: UserRole.USER
468 } 507 }
469 508
470 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields, statusCodeExpected: 204 }) 509 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields, statusCodeExpected: 204 })
471 userAccessToken = await userLogin(server, user)
472 }) 510 })
473 }) 511 })
474 512
@@ -541,13 +579,13 @@ describe('Test users API validators', function () {
541 } 579 }
542 580
543 it('Should fail with a too small username', async function () { 581 it('Should fail with a too small username', async function () {
544 const fields = immutableAssign(baseCorrectParams, { username: 'ji' }) 582 const fields = immutableAssign(baseCorrectParams, { username: '' })
545 583
546 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields }) 584 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
547 }) 585 })
548 586
549 it('Should fail with a too long username', async function () { 587 it('Should fail with a too long username', async function () {
550 const fields = immutableAssign(baseCorrectParams, { username: 'my_super_username_which_is_very_long' }) 588 const fields = immutableAssign(baseCorrectParams, { username: 'super'.repeat(50) })
551 589
552 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields }) 590 await makePostBodyRequest({ url: server.url, path: registrationPath, token: server.accessToken, fields })
553 }) 591 })
diff --git a/server/tests/api/check-params/video-abuses.ts b/server/tests/api/check-params/video-abuses.ts
index d2bed6a2a..3b8f5f14d 100644
--- a/server/tests/api/check-params/video-abuses.ts
+++ b/server/tests/api/check-params/video-abuses.ts
@@ -15,8 +15,12 @@ import {
15 updateVideoAbuse, 15 updateVideoAbuse,
16 uploadVideo, 16 uploadVideo,
17 userLogin 17 userLogin
18} from '../../utils' 18} from '../../../../shared/utils'
19import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 19import {
20 checkBadCountPagination,
21 checkBadSortPagination,
22 checkBadStartPagination
23} from '../../../../shared/utils/requests/check-api-params'
20import { VideoAbuseState } from '../../../../shared/models/videos' 24import { VideoAbuseState } from '../../../../shared/models/videos'
21 25
22describe('Test video abuses API validators', function () { 26describe('Test video abuses API validators', function () {
@@ -109,8 +113,8 @@ describe('Test video abuses API validators', function () {
109 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 113 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
110 }) 114 })
111 115
112 it('Should fail with a reason too big', async function () { 116 it('Should fail with a too big reason', async function () {
113 const fields = { reason: 'super'.repeat(61) } 117 const fields = { reason: 'super'.repeat(605) }
114 118
115 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 119 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
116 }) 120 })
@@ -150,7 +154,7 @@ describe('Test video abuses API validators', function () {
150 }) 154 })
151 155
152 it('Should fail with a bad moderation comment', async function () { 156 it('Should fail with a bad moderation comment', async function () {
153 const body = { moderationComment: 'b'.repeat(305) } 157 const body = { moderationComment: 'b'.repeat(3001) }
154 await updateVideoAbuse(server.url, server.accessToken, server.video.uuid, videoAbuseId, body, 400) 158 await updateVideoAbuse(server.url, server.accessToken, server.video.uuid, videoAbuseId, body, 400)
155 }) 159 })
156 160
diff --git a/server/tests/api/check-params/video-blacklist.ts b/server/tests/api/check-params/video-blacklist.ts
index 473216236..6b82643f4 100644
--- a/server/tests/api/check-params/video-blacklist.ts
+++ b/server/tests/api/check-params/video-blacklist.ts
@@ -4,25 +4,33 @@ import 'mocha'
4 4
5import { 5import {
6 createUser, 6 createUser,
7 doubleFollow,
8 flushAndRunMultipleServers,
7 flushTests, 9 flushTests,
8 getBlacklistedVideosList, getVideo, getVideoWithToken, 10 getBlacklistedVideosList,
11 getVideo,
12 getVideoWithToken,
9 killallServers, 13 killallServers,
10 makePostBodyRequest, 14 makePostBodyRequest,
11 makePutBodyRequest, 15 makePutBodyRequest,
12 removeVideoFromBlacklist, 16 removeVideoFromBlacklist,
13 runServer,
14 ServerInfo, 17 ServerInfo,
15 setAccessTokensToServers, 18 setAccessTokensToServers,
16 uploadVideo, 19 uploadVideo,
17 userLogin 20 userLogin, waitJobs
18} from '../../utils' 21} from '../../../../shared/utils'
19import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 22import {
23 checkBadCountPagination,
24 checkBadSortPagination,
25 checkBadStartPagination
26} from '../../../../shared/utils/requests/check-api-params'
20import { VideoDetails } from '../../../../shared/models/videos' 27import { VideoDetails } from '../../../../shared/models/videos'
21import { expect } from 'chai' 28import { expect } from 'chai'
22 29
23describe('Test video blacklist API validators', function () { 30describe('Test video blacklist API validators', function () {
24 let server: ServerInfo 31 let servers: ServerInfo[]
25 let notBlacklistedVideoId: number 32 let notBlacklistedVideoId: number
33 let remoteVideoUUID: string
26 let userAccessToken1 = '' 34 let userAccessToken1 = ''
27 let userAccessToken2 = '' 35 let userAccessToken2 = ''
28 36
@@ -32,75 +40,89 @@ describe('Test video blacklist API validators', function () {
32 this.timeout(120000) 40 this.timeout(120000)
33 41
34 await flushTests() 42 await flushTests()
43 servers = await flushAndRunMultipleServers(2)
35 44
36 server = await runServer(1) 45 await setAccessTokensToServers(servers)
37 46 await doubleFollow(servers[0], servers[1])
38 await setAccessTokensToServers([ server ])
39 47
40 { 48 {
41 const username = 'user1' 49 const username = 'user1'
42 const password = 'my super password' 50 const password = 'my super password'
43 await createUser(server.url, server.accessToken, username, password) 51 await createUser(servers[0].url, servers[0].accessToken, username, password)
44 userAccessToken1 = await userLogin(server, { username, password }) 52 userAccessToken1 = await userLogin(servers[0], { username, password })
45 } 53 }
46 54
47 { 55 {
48 const username = 'user2' 56 const username = 'user2'
49 const password = 'my super password' 57 const password = 'my super password'
50 await createUser(server.url, server.accessToken, username, password) 58 await createUser(servers[0].url, servers[0].accessToken, username, password)
51 userAccessToken2 = await userLogin(server, { username, password }) 59 userAccessToken2 = await userLogin(servers[0], { username, password })
52 } 60 }
53 61
54 { 62 {
55 const res = await uploadVideo(server.url, userAccessToken1, {}) 63 const res = await uploadVideo(servers[0].url, userAccessToken1, {})
56 server.video = res.body.video 64 servers[0].video = res.body.video
57 } 65 }
58 66
59 { 67 {
60 const res = await uploadVideo(server.url, server.accessToken, {}) 68 const res = await uploadVideo(servers[0].url, servers[0].accessToken, {})
61 notBlacklistedVideoId = res.body.video.uuid 69 notBlacklistedVideoId = res.body.video.uuid
62 } 70 }
71
72 {
73 const res = await uploadVideo(servers[1].url, servers[1].accessToken, {})
74 remoteVideoUUID = res.body.video.uuid
75 }
76
77 await waitJobs(servers)
63 }) 78 })
64 79
65 describe('When adding a video in blacklist', function () { 80 describe('When adding a video in blacklist', function () {
66 const basePath = '/api/v1/videos/' 81 const basePath = '/api/v1/videos/'
67 82
68 it('Should fail with nothing', async function () { 83 it('Should fail with nothing', async function () {
69 const path = basePath + server.video + '/blacklist' 84 const path = basePath + servers[0].video + '/blacklist'
70 const fields = {} 85 const fields = {}
71 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 86 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
72 }) 87 })
73 88
74 it('Should fail with a wrong video', async function () { 89 it('Should fail with a wrong video', async function () {
75 const wrongPath = '/api/v1/videos/blabla/blacklist' 90 const wrongPath = '/api/v1/videos/blabla/blacklist'
76 const fields = {} 91 const fields = {}
77 await makePostBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields }) 92 await makePostBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
78 }) 93 })
79 94
80 it('Should fail with a non authenticated user', async function () { 95 it('Should fail with a non authenticated user', async function () {
81 const path = basePath + server.video + '/blacklist' 96 const path = basePath + servers[0].video + '/blacklist'
82 const fields = {} 97 const fields = {}
83 await makePostBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 }) 98 await makePostBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
84 }) 99 })
85 100
86 it('Should fail with a non admin user', async function () { 101 it('Should fail with a non admin user', async function () {
87 const path = basePath + server.video + '/blacklist' 102 const path = basePath + servers[0].video + '/blacklist'
88 const fields = {} 103 const fields = {}
89 await makePostBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 }) 104 await makePostBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
90 }) 105 })
91 106
92 it('Should fail with an invalid reason', async function () { 107 it('Should fail with an invalid reason', async function () {
93 const path = basePath + server.video.uuid + '/blacklist' 108 const path = basePath + servers[0].video.uuid + '/blacklist'
94 const fields = { reason: 'a'.repeat(305) } 109 const fields = { reason: 'a'.repeat(305) }
95 110
96 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 111 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
112 })
113
114 it('Should fail to unfederate a remote video', async function () {
115 const path = basePath + remoteVideoUUID + '/blacklist'
116 const fields = { unfederate: true }
117
118 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 409 })
97 }) 119 })
98 120
99 it('Should succeed with the correct params', async function () { 121 it('Should succeed with the correct params', async function () {
100 const path = basePath + server.video.uuid + '/blacklist' 122 const path = basePath + servers[0].video.uuid + '/blacklist'
101 const fields = { } 123 const fields = { }
102 124
103 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 }) 125 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
104 }) 126 })
105 }) 127 })
106 128
@@ -110,61 +132,61 @@ describe('Test video blacklist API validators', function () {
110 it('Should fail with a wrong video', async function () { 132 it('Should fail with a wrong video', async function () {
111 const wrongPath = '/api/v1/videos/blabla/blacklist' 133 const wrongPath = '/api/v1/videos/blabla/blacklist'
112 const fields = {} 134 const fields = {}
113 await makePutBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields }) 135 await makePutBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
114 }) 136 })
115 137
116 it('Should fail with a video not blacklisted', async function () { 138 it('Should fail with a video not blacklisted', async function () {
117 const path = '/api/v1/videos/' + notBlacklistedVideoId + '/blacklist' 139 const path = '/api/v1/videos/' + notBlacklistedVideoId + '/blacklist'
118 const fields = {} 140 const fields = {}
119 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 404 }) 141 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 404 })
120 }) 142 })
121 143
122 it('Should fail with a non authenticated user', async function () { 144 it('Should fail with a non authenticated user', async function () {
123 const path = basePath + server.video + '/blacklist' 145 const path = basePath + servers[0].video + '/blacklist'
124 const fields = {} 146 const fields = {}
125 await makePutBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 }) 147 await makePutBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
126 }) 148 })
127 149
128 it('Should fail with a non admin user', async function () { 150 it('Should fail with a non admin user', async function () {
129 const path = basePath + server.video + '/blacklist' 151 const path = basePath + servers[0].video + '/blacklist'
130 const fields = {} 152 const fields = {}
131 await makePutBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 }) 153 await makePutBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
132 }) 154 })
133 155
134 it('Should fail with an invalid reason', async function () { 156 it('Should fail with an invalid reason', async function () {
135 const path = basePath + server.video.uuid + '/blacklist' 157 const path = basePath + servers[0].video.uuid + '/blacklist'
136 const fields = { reason: 'a'.repeat(305) } 158 const fields = { reason: 'a'.repeat(305) }
137 159
138 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 160 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
139 }) 161 })
140 162
141 it('Should succeed with the correct params', async function () { 163 it('Should succeed with the correct params', async function () {
142 const path = basePath + server.video.uuid + '/blacklist' 164 const path = basePath + servers[0].video.uuid + '/blacklist'
143 const fields = { reason: 'hello' } 165 const fields = { reason: 'hello' }
144 166
145 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 }) 167 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
146 }) 168 })
147 }) 169 })
148 170
149 describe('When getting blacklisted video', function () { 171 describe('When getting blacklisted video', function () {
150 172
151 it('Should fail with a non authenticated user', async function () { 173 it('Should fail with a non authenticated user', async function () {
152 await getVideo(server.url, server.video.uuid, 401) 174 await getVideo(servers[0].url, servers[0].video.uuid, 401)
153 }) 175 })
154 176
155 it('Should fail with another user', async function () { 177 it('Should fail with another user', async function () {
156 await getVideoWithToken(server.url, userAccessToken2, server.video.uuid, 403) 178 await getVideoWithToken(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
157 }) 179 })
158 180
159 it('Should succeed with the owner authenticated user', async function () { 181 it('Should succeed with the owner authenticated user', async function () {
160 const res = await getVideoWithToken(server.url, userAccessToken1, server.video.uuid, 200) 182 const res = await getVideoWithToken(servers[0].url, userAccessToken1, servers[0].video.uuid, 200)
161 const video: VideoDetails = res.body 183 const video: VideoDetails = res.body
162 184
163 expect(video.blacklisted).to.be.true 185 expect(video.blacklisted).to.be.true
164 }) 186 })
165 187
166 it('Should succeed with an admin', async function () { 188 it('Should succeed with an admin', async function () {
167 const res = await getVideoWithToken(server.url, server.accessToken, server.video.uuid, 200) 189 const res = await getVideoWithToken(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 200)
168 const video: VideoDetails = res.body 190 const video: VideoDetails = res.body
169 191
170 expect(video.blacklisted).to.be.true 192 expect(video.blacklisted).to.be.true
@@ -173,24 +195,24 @@ describe('Test video blacklist API validators', function () {
173 195
174 describe('When removing a video in blacklist', function () { 196 describe('When removing a video in blacklist', function () {
175 it('Should fail with a non authenticated user', async function () { 197 it('Should fail with a non authenticated user', async function () {
176 await removeVideoFromBlacklist(server.url, 'fake token', server.video.uuid, 401) 198 await removeVideoFromBlacklist(servers[0].url, 'fake token', servers[0].video.uuid, 401)
177 }) 199 })
178 200
179 it('Should fail with a non admin user', async function () { 201 it('Should fail with a non admin user', async function () {
180 await removeVideoFromBlacklist(server.url, userAccessToken2, server.video.uuid, 403) 202 await removeVideoFromBlacklist(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
181 }) 203 })
182 204
183 it('Should fail with an incorrect id', async function () { 205 it('Should fail with an incorrect id', async function () {
184 await removeVideoFromBlacklist(server.url, server.accessToken, 'hello', 400) 206 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, 'hello', 400)
185 }) 207 })
186 208
187 it('Should fail with a not blacklisted video', async function () { 209 it('Should fail with a not blacklisted video', async function () {
188 // The video was not added to the blacklist so it should fail 210 // The video was not added to the blacklist so it should fail
189 await removeVideoFromBlacklist(server.url, server.accessToken, notBlacklistedVideoId, 404) 211 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, notBlacklistedVideoId, 404)
190 }) 212 })
191 213
192 it('Should succeed with the correct params', async function () { 214 it('Should succeed with the correct params', async function () {
193 await removeVideoFromBlacklist(server.url, server.accessToken, server.video.uuid, 204) 215 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 204)
194 }) 216 })
195 }) 217 })
196 218
@@ -198,28 +220,28 @@ describe('Test video blacklist API validators', function () {
198 const basePath = '/api/v1/videos/blacklist/' 220 const basePath = '/api/v1/videos/blacklist/'
199 221
200 it('Should fail with a non authenticated user', async function () { 222 it('Should fail with a non authenticated user', async function () {
201 await getBlacklistedVideosList(server.url, 'fake token', 401) 223 await getBlacklistedVideosList(servers[0].url, 'fake token', 401)
202 }) 224 })
203 225
204 it('Should fail with a non admin user', async function () { 226 it('Should fail with a non admin user', async function () {
205 await getBlacklistedVideosList(server.url, userAccessToken2, 403) 227 await getBlacklistedVideosList(servers[0].url, userAccessToken2, 403)
206 }) 228 })
207 229
208 it('Should fail with a bad start pagination', async function () { 230 it('Should fail with a bad start pagination', async function () {
209 await checkBadStartPagination(server.url, basePath, server.accessToken) 231 await checkBadStartPagination(servers[0].url, basePath, servers[0].accessToken)
210 }) 232 })
211 233
212 it('Should fail with a bad count pagination', async function () { 234 it('Should fail with a bad count pagination', async function () {
213 await checkBadCountPagination(server.url, basePath, server.accessToken) 235 await checkBadCountPagination(servers[0].url, basePath, servers[0].accessToken)
214 }) 236 })
215 237
216 it('Should fail with an incorrect sort', async function () { 238 it('Should fail with an incorrect sort', async function () {
217 await checkBadSortPagination(server.url, basePath, server.accessToken) 239 await checkBadSortPagination(servers[0].url, basePath, servers[0].accessToken)
218 }) 240 })
219 }) 241 })
220 242
221 after(async function () { 243 after(async function () {
222 killallServers([ server ]) 244 killallServers(servers)
223 245
224 // Keep the logs if the test failed 246 // Keep the logs if the test failed
225 if (this['ok']) { 247 if (this['ok']) {
diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts
index 8d46971a1..e4d36fd4f 100644
--- a/server/tests/api/check-params/video-captions.ts
+++ b/server/tests/api/check-params/video-captions.ts
@@ -13,9 +13,9 @@ import {
13 setAccessTokensToServers, 13 setAccessTokensToServers,
14 uploadVideo, 14 uploadVideo,
15 userLogin 15 userLogin
16} from '../../utils' 16} from '../../../../shared/utils'
17import { join } from 'path' 17import { join } from 'path'
18import { createVideoCaption } from '../../utils/videos/video-captions' 18import { createVideoCaption } from '../../../../shared/utils/videos/video-captions'
19 19
20describe('Test video captions API validator', function () { 20describe('Test video captions API validator', function () {
21 const path = '/api/v1/videos/' 21 const path = '/api/v1/videos/'
diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts
index 3a7942945..14e4deaf7 100644
--- a/server/tests/api/check-params/video-channels.ts
+++ b/server/tests/api/check-params/video-channels.ts
@@ -20,8 +20,12 @@ import {
20 ServerInfo, 20 ServerInfo,
21 setAccessTokensToServers, 21 setAccessTokensToServers,
22 userLogin 22 userLogin
23} from '../../utils' 23} from '../../../../shared/utils'
24import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 24import {
25 checkBadCountPagination,
26 checkBadSortPagination,
27 checkBadStartPagination
28} from '../../../../shared/utils/requests/check-api-params'
25import { User } from '../../../../shared/models/users' 29import { User } from '../../../../shared/models/users'
26import { join } from 'path' 30import { join } from 'path'
27 31
@@ -118,12 +122,12 @@ describe('Test video channels API validator', function () {
118 }) 122 })
119 123
120 it('Should fail with a long description', async function () { 124 it('Should fail with a long description', async function () {
121 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(150) }) 125 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(201) })
122 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) 126 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
123 }) 127 })
124 128
125 it('Should fail with a long support text', async function () { 129 it('Should fail with a long support text', async function () {
126 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) 130 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) })
127 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) 131 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
128 }) 132 })
129 133
@@ -185,12 +189,12 @@ describe('Test video channels API validator', function () {
185 }) 189 })
186 190
187 it('Should fail with a long description', async function () { 191 it('Should fail with a long description', async function () {
188 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(150) }) 192 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(201) })
189 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 193 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields })
190 }) 194 })
191 195
192 it('Should fail with a long support text', async function () { 196 it('Should fail with a long support text', async function () {
193 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) 197 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) })
194 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 198 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields })
195 }) 199 })
196 200
diff --git a/server/tests/api/check-params/video-comments.ts b/server/tests/api/check-params/video-comments.ts
index 5241832fe..5981780ed 100644
--- a/server/tests/api/check-params/video-comments.ts
+++ b/server/tests/api/check-params/video-comments.ts
@@ -6,9 +6,13 @@ import {
6 createUser, 6 createUser,
7 flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers, 7 flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers,
8 uploadVideo, userLogin 8 uploadVideo, userLogin
9} from '../../utils' 9} from '../../../../shared/utils'
10import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 10import {
11import { addVideoCommentThread } from '../../utils/videos/video-comments' 11 checkBadCountPagination,
12 checkBadSortPagination,
13 checkBadStartPagination
14} from '../../../../shared/utils/requests/check-api-params'
15import { addVideoCommentThread } from '../../../../shared/utils/videos/video-comments'
12 16
13const expect = chai.expect 17const expect = chai.expect
14 18
diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts
index 1ffb81a38..6dd9f15f7 100644
--- a/server/tests/api/check-params/video-imports.ts
+++ b/server/tests/api/check-params/video-imports.ts
@@ -18,9 +18,13 @@ import {
18 setAccessTokensToServers, 18 setAccessTokensToServers,
19 updateCustomSubConfig, 19 updateCustomSubConfig,
20 userLogin 20 userLogin
21} from '../../utils' 21} from '../../../../shared/utils'
22import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 22import {
23import { getMagnetURI, getYoutubeVideoUrl } from '../../utils/videos/video-imports' 23 checkBadCountPagination,
24 checkBadSortPagination,
25 checkBadStartPagination
26} from '../../../../shared/utils/requests/check-api-params'
27import { getMagnetURI, getYoutubeVideoUrl } from '../../../../shared/utils/videos/video-imports'
24 28
25describe('Test video imports API validator', function () { 29describe('Test video imports API validator', function () {
26 const path = '/api/v1/videos/imports' 30 const path = '/api/v1/videos/imports'
@@ -141,7 +145,7 @@ describe('Test video imports API validator', function () {
141 }) 145 })
142 146
143 it('Should fail with a long support text', async function () { 147 it('Should fail with a long support text', async function () {
144 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) 148 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) })
145 149
146 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 150 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
147 }) 151 })
diff --git a/server/tests/api/check-params/videos-filter.ts b/server/tests/api/check-params/videos-filter.ts
new file mode 100644
index 000000000..e998c8a3d
--- /dev/null
+++ b/server/tests/api/check-params/videos-filter.ts
@@ -0,0 +1,127 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 createUser,
7 flushTests,
8 killallServers,
9 makeGetRequest,
10 runServer,
11 ServerInfo,
12 setAccessTokensToServers,
13 userLogin
14} from '../../../../shared/utils'
15import { UserRole } from '../../../../shared/models/users'
16
17const expect = chai.expect
18
19async function testEndpoints (server: ServerInfo, token: string, filter: string, statusCodeExpected: number) {
20 const paths = [
21 '/api/v1/video-channels/root_channel/videos',
22 '/api/v1/accounts/root/videos',
23 '/api/v1/videos',
24 '/api/v1/search/videos'
25 ]
26
27 for (const path of paths) {
28 await makeGetRequest({
29 url: server.url,
30 path,
31 token,
32 query: {
33 filter
34 },
35 statusCodeExpected
36 })
37 }
38}
39
40describe('Test videos filters', function () {
41 let server: ServerInfo
42 let userAccessToken: string
43 let moderatorAccessToken: string
44
45 // ---------------------------------------------------------------
46
47 before(async function () {
48 this.timeout(30000)
49
50 await flushTests()
51
52 server = await runServer(1)
53
54 await setAccessTokensToServers([ server ])
55
56 const user = { username: 'user1', password: 'my super password' }
57 await createUser(server.url, server.accessToken, user.username, user.password)
58 userAccessToken = await userLogin(server, user)
59
60 const moderator = { username: 'moderator', password: 'my super password' }
61 await createUser(
62 server.url,
63 server.accessToken,
64 moderator.username,
65 moderator.password,
66 undefined,
67 undefined,
68 UserRole.MODERATOR
69 )
70 moderatorAccessToken = await userLogin(server, moderator)
71 })
72
73 describe('When setting a video filter', function () {
74
75 it('Should fail with a bad filter', async function () {
76 await testEndpoints(server, server.accessToken, 'bad-filter', 400)
77 })
78
79 it('Should succeed with a good filter', async function () {
80 await testEndpoints(server, server.accessToken,'local', 200)
81 })
82
83 it('Should fail to list all-local with a simple user', async function () {
84 await testEndpoints(server, userAccessToken, 'all-local', 401)
85 })
86
87 it('Should succeed to list all-local with a moderator', async function () {
88 await testEndpoints(server, moderatorAccessToken, 'all-local', 200)
89 })
90
91 it('Should succeed to list all-local with an admin', async function () {
92 await testEndpoints(server, server.accessToken, 'all-local', 200)
93 })
94
95 // Because we cannot authenticate the user on the RSS endpoint
96 it('Should fail on the feeds endpoint with the all-local filter', async function () {
97 await makeGetRequest({
98 url: server.url,
99 path: '/feeds/videos.json',
100 statusCodeExpected: 401,
101 query: {
102 filter: 'all-local'
103 }
104 })
105 })
106
107 it('Should succed on the feeds endpoint with the local filter', async function () {
108 await makeGetRequest({
109 url: server.url,
110 path: '/feeds/videos.json',
111 statusCodeExpected: 200,
112 query: {
113 filter: 'local'
114 }
115 })
116 })
117 })
118
119 after(async function () {
120 killallServers([ server ])
121
122 // Keep the logs if the test failed
123 if (this['ok']) {
124 await flushTests()
125 }
126 })
127})
diff --git a/server/tests/api/check-params/videos-history.ts b/server/tests/api/check-params/videos-history.ts
index 808c3b616..8c079a956 100644
--- a/server/tests/api/check-params/videos-history.ts
+++ b/server/tests/api/check-params/videos-history.ts
@@ -3,20 +3,25 @@
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { 5import {
6 checkBadCountPagination,
7 checkBadStartPagination,
6 flushTests, 8 flushTests,
7 killallServers, 9 killallServers,
10 makeGetRequest,
8 makePostBodyRequest, 11 makePostBodyRequest,
9 makePutBodyRequest, 12 makePutBodyRequest,
10 runServer, 13 runServer,
11 ServerInfo, 14 ServerInfo,
12 setAccessTokensToServers, 15 setAccessTokensToServers,
13 uploadVideo 16 uploadVideo
14} from '../../utils' 17} from '../../../../shared/utils'
15 18
16const expect = chai.expect 19const expect = chai.expect
17 20
18describe('Test videos history API validator', function () { 21describe('Test videos history API validator', function () {
19 let path: string 22 let watchingPath: string
23 let myHistoryPath = '/api/v1/users/me/history/videos'
24 let myHistoryRemove = myHistoryPath + '/remove'
20 let server: ServerInfo 25 let server: ServerInfo
21 26
22 // --------------------------------------------------------------- 27 // ---------------------------------------------------------------
@@ -33,14 +38,14 @@ describe('Test videos history API validator', function () {
33 const res = await uploadVideo(server.url, server.accessToken, {}) 38 const res = await uploadVideo(server.url, server.accessToken, {})
34 const videoUUID = res.body.video.uuid 39 const videoUUID = res.body.video.uuid
35 40
36 path = '/api/v1/videos/' + videoUUID + '/watching' 41 watchingPath = '/api/v1/videos/' + videoUUID + '/watching'
37 }) 42 })
38 43
39 describe('When notifying a user is watching a video', function () { 44 describe('When notifying a user is watching a video', function () {
40 45
41 it('Should fail with an unauthenticated user', async function () { 46 it('Should fail with an unauthenticated user', async function () {
42 const fields = { currentTime: 5 } 47 const fields = { currentTime: 5 }
43 await makePutBodyRequest({ url: server.url, path, fields, statusCodeExpected: 401 }) 48 await makePutBodyRequest({ url: server.url, path: watchingPath, fields, statusCodeExpected: 401 })
44 }) 49 })
45 50
46 it('Should fail with an incorrect video id', async function () { 51 it('Should fail with an incorrect video id', async function () {
@@ -58,13 +63,68 @@ describe('Test videos history API validator', function () {
58 63
59 it('Should fail with a bad current time', async function () { 64 it('Should fail with a bad current time', async function () {
60 const fields = { currentTime: 'hello' } 65 const fields = { currentTime: 'hello' }
61 await makePutBodyRequest({ url: server.url, path, fields, token: server.accessToken, statusCodeExpected: 400 }) 66 await makePutBodyRequest({ url: server.url, path: watchingPath, fields, token: server.accessToken, statusCodeExpected: 400 })
62 }) 67 })
63 68
64 it('Should succeed with the correct parameters', async function () { 69 it('Should succeed with the correct parameters', async function () {
65 const fields = { currentTime: 5 } 70 const fields = { currentTime: 5 }
66 71
67 await makePutBodyRequest({ url: server.url, path, fields, token: server.accessToken, statusCodeExpected: 204 }) 72 await makePutBodyRequest({ url: server.url, path: watchingPath, fields, token: server.accessToken, statusCodeExpected: 204 })
73 })
74 })
75
76 describe('When listing user videos history', function () {
77 it('Should fail with a bad start pagination', async function () {
78 await checkBadStartPagination(server.url, myHistoryPath, server.accessToken)
79 })
80
81 it('Should fail with a bad count pagination', async function () {
82 await checkBadCountPagination(server.url, myHistoryPath, server.accessToken)
83 })
84
85 it('Should fail with an unauthenticated user', async function () {
86 await makeGetRequest({ url: server.url, path: myHistoryPath, statusCodeExpected: 401 })
87 })
88
89 it('Should succeed with the correct params', async function () {
90 await makeGetRequest({ url: server.url, token: server.accessToken, path: myHistoryPath, statusCodeExpected: 200 })
91 })
92 })
93
94 describe('When removing user videos history', function () {
95 it('Should fail with an unauthenticated user', async function () {
96 await makePostBodyRequest({ url: server.url, path: myHistoryPath + '/remove', statusCodeExpected: 401 })
97 })
98
99 it('Should fail with a bad beforeDate parameter', async function () {
100 const body = { beforeDate: '15' }
101 await makePostBodyRequest({
102 url: server.url,
103 token: server.accessToken,
104 path: myHistoryRemove,
105 fields: body,
106 statusCodeExpected: 400
107 })
108 })
109
110 it('Should succeed with a valid beforeDate param', async function () {
111 const body = { beforeDate: new Date().toISOString() }
112 await makePostBodyRequest({
113 url: server.url,
114 token: server.accessToken,
115 path: myHistoryRemove,
116 fields: body,
117 statusCodeExpected: 204
118 })
119 })
120
121 it('Should succeed without body', async function () {
122 await makePostBodyRequest({
123 url: server.url,
124 token: server.accessToken,
125 path: myHistoryRemove,
126 statusCodeExpected: 204
127 })
68 }) 128 })
69 }) 129 })
70 130
diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts
index bc28e2422..878ffe025 100644
--- a/server/tests/api/check-params/videos.ts
+++ b/server/tests/api/check-params/videos.ts
@@ -8,9 +8,13 @@ import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enu
8import { 8import {
9 createUser, flushTests, getMyUserInformation, getVideo, getVideosList, immutableAssign, killallServers, makeDeleteRequest, 9 createUser, flushTests, getMyUserInformation, getVideo, getVideosList, immutableAssign, killallServers, makeDeleteRequest,
10 makeGetRequest, makeUploadRequest, makePutBodyRequest, removeVideo, runServer, ServerInfo, setAccessTokensToServers, userLogin 10 makeGetRequest, makeUploadRequest, makePutBodyRequest, removeVideo, runServer, ServerInfo, setAccessTokensToServers, userLogin
11} from '../../utils' 11} from '../../../../shared/utils'
12import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' 12import {
13import { getAccountsList } from '../../utils/users/accounts' 13 checkBadCountPagination,
14 checkBadSortPagination,
15 checkBadStartPagination
16} from '../../../../shared/utils/requests/check-api-params'
17import { getAccountsList } from '../../../../shared/utils/users/accounts'
14 18
15const expect = chai.expect 19const expect = chai.expect
16 20
@@ -234,7 +238,7 @@ describe('Test videos API validator', function () {
234 }) 238 })
235 239
236 it('Should fail with a long support text', async function () { 240 it('Should fail with a long support text', async function () {
237 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) 241 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) })
238 const attaches = baseCorrectAttaches 242 const attaches = baseCorrectAttaches
239 243
240 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches }) 244 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@@ -317,10 +321,15 @@ describe('Test videos API validator', function () {
317 321
318 it('Should fail without an incorrect input file', async function () { 322 it('Should fail without an incorrect input file', async function () {
319 const fields = baseCorrectParams 323 const fields = baseCorrectParams
320 const attaches = { 324 let attaches = {
321 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm') 325 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
322 } 326 }
323 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches }) 327 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
328
329 attaches = {
330 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mkv')
331 }
332 await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
324 }) 333 })
325 334
326 it('Should fail with an incorrect thumbnail file', async function () { 335 it('Should fail with an incorrect thumbnail file', async function () {
@@ -484,7 +493,7 @@ describe('Test videos API validator', function () {
484 }) 493 })
485 494
486 it('Should fail with a long support text', async function () { 495 it('Should fail with a long support text', async function () {
487 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) 496 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) })
488 497
489 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields }) 498 await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields })
490 }) 499 })
diff --git a/server/tests/api/index-4.ts b/server/tests/api/index-4.ts
new file mode 100644
index 000000000..7d8be2b3d
--- /dev/null
+++ b/server/tests/api/index-4.ts
@@ -0,0 +1,2 @@
1import './redundancy'
2import './activitypub'
diff --git a/server/tests/api/index.ts b/server/tests/api/index.ts
index 2d996dbf9..bc140f860 100644
--- a/server/tests/api/index.ts
+++ b/server/tests/api/index.ts
@@ -2,3 +2,4 @@
2import './index-1' 2import './index-1'
3import './index-2' 3import './index-2'
4import './index-3' 4import './index-3'
5import './index-4'
diff --git a/server/tests/api/redundancy/index.ts b/server/tests/api/redundancy/index.ts
new file mode 100644
index 000000000..8e69b95a6
--- /dev/null
+++ b/server/tests/api/redundancy/index.ts
@@ -0,0 +1 @@
import './redundancy'
diff --git a/server/tests/api/server/redundancy.ts b/server/tests/api/redundancy/redundancy.ts
index 1960854b6..778611fff 100644
--- a/server/tests/api/server/redundancy.ts
+++ b/server/tests/api/redundancy/redundancy.ts
@@ -17,16 +17,17 @@ import {
17 viewVideo, 17 viewVideo,
18 wait, 18 wait,
19 waitUntilLog, 19 waitUntilLog,
20 checkVideoFilesWereRemoved, removeVideo 20 checkVideoFilesWereRemoved, removeVideo, getVideoWithToken, reRunServer, checkSegmentHash
21} from '../../utils' 21} from '../../../../shared/utils'
22import { waitJobs } from '../../utils/server/jobs' 22import { waitJobs } from '../../../../shared/utils/server/jobs'
23
23import * as magnetUtil from 'magnet-uri' 24import * as magnetUtil from 'magnet-uri'
24import { updateRedundancy } from '../../utils/server/redundancy' 25import { updateRedundancy } from '../../../../shared/utils/server/redundancy'
25import { ActorFollow } from '../../../../shared/models/actors' 26import { ActorFollow } from '../../../../shared/models/actors'
26import { readdir } from 'fs-extra' 27import { readdir } from 'fs-extra'
27import { join } from 'path' 28import { join } from 'path'
28import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy' 29import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy'
29import { getStats } from '../../utils/server/stats' 30import { getStats } from '../../../../shared/utils/server/stats'
30import { ServerStats } from '../../../../shared/models/server/server-stats.model' 31import { ServerStats } from '../../../../shared/models/server/server-stats.model'
31 32
32const expect = chai.expect 33const expect = chai.expect
@@ -47,6 +48,11 @@ function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: numbe
47 48
48async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) { 49async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
49 const config = { 50 const config = {
51 transcoding: {
52 hls: {
53 enabled: true
54 }
55 },
50 redundancy: { 56 redundancy: {
51 videos: { 57 videos: {
52 check_interval: '5 seconds', 58 check_interval: '5 seconds',
@@ -54,7 +60,7 @@ async function runServers (strategy: VideoRedundancyStrategy, additionalParams:
54 immutableAssign({ 60 immutableAssign({
55 min_lifetime: '1 hour', 61 min_lifetime: '1 hour',
56 strategy: strategy, 62 strategy: strategy,
57 size: '100KB' 63 size: '200KB'
58 }, additionalParams) 64 }, additionalParams)
59 ] 65 ]
60 } 66 }
@@ -84,7 +90,7 @@ async function runServers (strategy: VideoRedundancyStrategy, additionalParams:
84 await waitJobs(servers) 90 await waitJobs(servers)
85} 91}
86 92
87async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: string) { 93async function check1WebSeed (videoUUID?: string) {
88 if (!videoUUID) videoUUID = video1Server2UUID 94 if (!videoUUID) videoUUID = video1Server2UUID
89 95
90 const webseeds = [ 96 const webseeds = [
@@ -92,50 +98,21 @@ async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: str
92 ] 98 ]
93 99
94 for (const server of servers) { 100 for (const server of servers) {
95 { 101 // With token to avoid issues with video follow constraints
96 const res = await getVideo(server.url, videoUUID) 102 const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
97 103
98 const video: VideoDetails = res.body 104 const video: VideoDetails = res.body
99 for (const f of video.files) { 105 for (const f of video.files) {
100 checkMagnetWebseeds(f, webseeds, server) 106 checkMagnetWebseeds(f, webseeds, server)
101 }
102 } 107 }
103 } 108 }
104} 109}
105 110
106async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) { 111async function check2Webseeds (videoUUID?: string) {
107 const res = await getStats(servers[0].url)
108 const data: ServerStats = res.body
109
110 expect(data.videosRedundancy).to.have.lengthOf(1)
111 const stat = data.videosRedundancy[0]
112
113 expect(stat.strategy).to.equal(strategy)
114 expect(stat.totalSize).to.equal(102400)
115 expect(stat.totalUsed).to.be.at.least(1).and.below(102401)
116 expect(stat.totalVideoFiles).to.equal(4)
117 expect(stat.totalVideos).to.equal(1)
118}
119
120async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
121 const res = await getStats(servers[0].url)
122 const data: ServerStats = res.body
123
124 expect(data.videosRedundancy).to.have.lengthOf(1)
125
126 const stat = data.videosRedundancy[0]
127 expect(stat.strategy).to.equal(strategy)
128 expect(stat.totalSize).to.equal(102400)
129 expect(stat.totalUsed).to.equal(0)
130 expect(stat.totalVideoFiles).to.equal(0)
131 expect(stat.totalVideos).to.equal(0)
132}
133
134async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: string) {
135 if (!videoUUID) videoUUID = video1Server2UUID 112 if (!videoUUID) videoUUID = video1Server2UUID
136 113
137 const webseeds = [ 114 const webseeds = [
138 'http://localhost:9001/static/webseed/' + videoUUID, 115 'http://localhost:9001/static/redundancy/' + videoUUID,
139 'http://localhost:9002/static/webseed/' + videoUUID 116 'http://localhost:9002/static/webseed/' + videoUUID
140 ] 117 ]
141 118
@@ -147,20 +124,23 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st
147 for (const file of video.files) { 124 for (const file of video.files) {
148 checkMagnetWebseeds(file, webseeds, server) 125 checkMagnetWebseeds(file, webseeds, server)
149 126
150 // Only servers 1 and 2 have the video 127 await makeGetRequest({
151 if (server.serverNumber !== 3) { 128 url: servers[0].url,
152 await makeGetRequest({ 129 statusCodeExpected: 200,
153 url: server.url, 130 path: '/static/redundancy/' + `${videoUUID}-${file.resolution.id}.mp4`,
154 statusCodeExpected: 200, 131 contentType: null
155 path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`, 132 })
156 contentType: null 133 await makeGetRequest({
157 }) 134 url: servers[1].url,
158 } 135 statusCodeExpected: 200,
136 path: `/static/webseed/${videoUUID}-${file.resolution.id}.mp4`,
137 contentType: null
138 })
159 } 139 }
160 } 140 }
161 141
162 for (const directory of [ 'test1', 'test2' ]) { 142 for (const directory of [ 'test1/redundancy', 'test2/videos' ]) {
163 const files = await readdir(join(root(), directory, 'videos')) 143 const files = await readdir(join(root(), directory))
164 expect(files).to.have.length.at.least(4) 144 expect(files).to.have.length.at.least(4)
165 145
166 for (const resolution of [ 240, 360, 480, 720 ]) { 146 for (const resolution of [ 240, 360, 480, 720 ]) {
@@ -169,6 +149,85 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st
169 } 149 }
170} 150}
171 151
152async function check0PlaylistRedundancies (videoUUID?: string) {
153 if (!videoUUID) videoUUID = video1Server2UUID
154
155 for (const server of servers) {
156 // With token to avoid issues with video follow constraints
157 const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
158 const video: VideoDetails = res.body
159
160 expect(video.streamingPlaylists).to.be.an('array')
161 expect(video.streamingPlaylists).to.have.lengthOf(1)
162 expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(0)
163 }
164}
165
166async function check1PlaylistRedundancies (videoUUID?: string) {
167 if (!videoUUID) videoUUID = video1Server2UUID
168
169 for (const server of servers) {
170 const res = await getVideo(server.url, videoUUID)
171 const video: VideoDetails = res.body
172
173 expect(video.streamingPlaylists).to.have.lengthOf(1)
174 expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(1)
175
176 const redundancy = video.streamingPlaylists[0].redundancies[0]
177
178 expect(redundancy.baseUrl).to.equal(servers[0].url + '/static/redundancy/hls/' + videoUUID)
179 }
180
181 const baseUrlPlaylist = servers[1].url + '/static/playlists/hls'
182 const baseUrlSegment = servers[0].url + '/static/redundancy/hls'
183
184 const res = await getVideo(servers[0].url, videoUUID)
185 const hlsPlaylist = (res.body as VideoDetails).streamingPlaylists[0]
186
187 for (const resolution of [ 240, 360, 480, 720 ]) {
188 await checkSegmentHash(baseUrlPlaylist, baseUrlSegment, videoUUID, resolution, hlsPlaylist)
189 }
190
191 for (const directory of [ 'test1/redundancy/hls', 'test2/playlists/hls' ]) {
192 const files = await readdir(join(root(), directory, videoUUID))
193 expect(files).to.have.length.at.least(4)
194
195 for (const resolution of [ 240, 360, 480, 720 ]) {
196 const filename = `${videoUUID}-${resolution}-fragmented.mp4`
197
198 expect(files.find(f => f === filename)).to.not.be.undefined
199 }
200 }
201}
202
203async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
204 const res = await getStats(servers[0].url)
205 const data: ServerStats = res.body
206
207 expect(data.videosRedundancy).to.have.lengthOf(1)
208 const stat = data.videosRedundancy[0]
209
210 expect(stat.strategy).to.equal(strategy)
211 expect(stat.totalSize).to.equal(204800)
212 expect(stat.totalUsed).to.be.at.least(1).and.below(204801)
213 expect(stat.totalVideoFiles).to.equal(4)
214 expect(stat.totalVideos).to.equal(1)
215}
216
217async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
218 const res = await getStats(servers[0].url)
219 const data: ServerStats = res.body
220
221 expect(data.videosRedundancy).to.have.lengthOf(1)
222
223 const stat = data.videosRedundancy[0]
224 expect(stat.strategy).to.equal(strategy)
225 expect(stat.totalSize).to.equal(204800)
226 expect(stat.totalUsed).to.equal(0)
227 expect(stat.totalVideoFiles).to.equal(0)
228 expect(stat.totalVideos).to.equal(0)
229}
230
172async function enableRedundancyOnServer1 () { 231async function enableRedundancyOnServer1 () {
173 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true) 232 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true)
174 233
@@ -215,7 +274,8 @@ describe('Test videos redundancy', function () {
215 }) 274 })
216 275
217 it('Should have 1 webseed on the first video', async function () { 276 it('Should have 1 webseed on the first video', async function () {
218 await check1WebSeed(strategy) 277 await check1WebSeed()
278 await check0PlaylistRedundancies()
219 await checkStatsWith1Webseed(strategy) 279 await checkStatsWith1Webseed(strategy)
220 }) 280 })
221 281
@@ -223,28 +283,30 @@ describe('Test videos redundancy', function () {
223 return enableRedundancyOnServer1() 283 return enableRedundancyOnServer1()
224 }) 284 })
225 285
226 it('Should have 2 webseed on the first video', async function () { 286 it('Should have 2 webseeds on the first video', async function () {
227 this.timeout(40000) 287 this.timeout(80000)
228 288
229 await waitJobs(servers) 289 await waitJobs(servers)
230 await waitUntilLog(servers[0], 'Duplicated ', 4) 290 await waitUntilLog(servers[0], 'Duplicated ', 5)
231 await waitJobs(servers) 291 await waitJobs(servers)
232 292
233 await check2Webseeds(strategy) 293 await check2Webseeds()
294 await check1PlaylistRedundancies()
234 await checkStatsWith2Webseed(strategy) 295 await checkStatsWith2Webseed(strategy)
235 }) 296 })
236 297
237 it('Should undo redundancy on server 1 and remove duplicated videos', async function () { 298 it('Should undo redundancy on server 1 and remove duplicated videos', async function () {
238 this.timeout(40000) 299 this.timeout(80000)
239 300
240 await disableRedundancyOnServer1() 301 await disableRedundancyOnServer1()
241 302
242 await waitJobs(servers) 303 await waitJobs(servers)
243 await wait(5000) 304 await wait(5000)
244 305
245 await check1WebSeed(strategy) 306 await check1WebSeed()
307 await check0PlaylistRedundancies()
246 308
247 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) 309 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos', join('playlists', 'hls') ])
248 }) 310 })
249 311
250 after(function () { 312 after(function () {
@@ -262,7 +324,8 @@ describe('Test videos redundancy', function () {
262 }) 324 })
263 325
264 it('Should have 1 webseed on the first video', async function () { 326 it('Should have 1 webseed on the first video', async function () {
265 await check1WebSeed(strategy) 327 await check1WebSeed()
328 await check0PlaylistRedundancies()
266 await checkStatsWith1Webseed(strategy) 329 await checkStatsWith1Webseed(strategy)
267 }) 330 })
268 331
@@ -270,26 +333,28 @@ describe('Test videos redundancy', function () {
270 return enableRedundancyOnServer1() 333 return enableRedundancyOnServer1()
271 }) 334 })
272 335
273 it('Should have 2 webseed on the first video', async function () { 336 it('Should have 2 webseeds on the first video', async function () {
274 this.timeout(40000) 337 this.timeout(80000)
275 338
276 await waitJobs(servers) 339 await waitJobs(servers)
277 await waitUntilLog(servers[0], 'Duplicated ', 4) 340 await waitUntilLog(servers[0], 'Duplicated ', 5)
278 await waitJobs(servers) 341 await waitJobs(servers)
279 342
280 await check2Webseeds(strategy) 343 await check2Webseeds()
344 await check1PlaylistRedundancies()
281 await checkStatsWith2Webseed(strategy) 345 await checkStatsWith2Webseed(strategy)
282 }) 346 })
283 347
284 it('Should unfollow on server 1 and remove duplicated videos', async function () { 348 it('Should unfollow on server 1 and remove duplicated videos', async function () {
285 this.timeout(40000) 349 this.timeout(80000)
286 350
287 await unfollow(servers[0].url, servers[0].accessToken, servers[1]) 351 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
288 352
289 await waitJobs(servers) 353 await waitJobs(servers)
290 await wait(5000) 354 await wait(5000)
291 355
292 await check1WebSeed(strategy) 356 await check1WebSeed()
357 await check0PlaylistRedundancies()
293 358
294 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) 359 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
295 }) 360 })
@@ -309,7 +374,8 @@ describe('Test videos redundancy', function () {
309 }) 374 })
310 375
311 it('Should have 1 webseed on the first video', async function () { 376 it('Should have 1 webseed on the first video', async function () {
312 await check1WebSeed(strategy) 377 await check1WebSeed()
378 await check0PlaylistRedundancies()
313 await checkStatsWith1Webseed(strategy) 379 await checkStatsWith1Webseed(strategy)
314 }) 380 })
315 381
@@ -318,18 +384,19 @@ describe('Test videos redundancy', function () {
318 }) 384 })
319 385
320 it('Should still have 1 webseed on the first video', async function () { 386 it('Should still have 1 webseed on the first video', async function () {
321 this.timeout(40000) 387 this.timeout(80000)
322 388
323 await waitJobs(servers) 389 await waitJobs(servers)
324 await wait(15000) 390 await wait(15000)
325 await waitJobs(servers) 391 await waitJobs(servers)
326 392
327 await check1WebSeed(strategy) 393 await check1WebSeed()
394 await check0PlaylistRedundancies()
328 await checkStatsWith1Webseed(strategy) 395 await checkStatsWith1Webseed(strategy)
329 }) 396 })
330 397
331 it('Should view 2 times the first video to have > min_views config', async function () { 398 it('Should view 2 times the first video to have > min_views config', async function () {
332 this.timeout(40000) 399 this.timeout(80000)
333 400
334 await viewVideo(servers[ 0 ].url, video1Server2UUID) 401 await viewVideo(servers[ 0 ].url, video1Server2UUID)
335 await viewVideo(servers[ 2 ].url, video1Server2UUID) 402 await viewVideo(servers[ 2 ].url, video1Server2UUID)
@@ -338,14 +405,15 @@ describe('Test videos redundancy', function () {
338 await waitJobs(servers) 405 await waitJobs(servers)
339 }) 406 })
340 407
341 it('Should have 2 webseed on the first video', async function () { 408 it('Should have 2 webseeds on the first video', async function () {
342 this.timeout(40000) 409 this.timeout(80000)
343 410
344 await waitJobs(servers) 411 await waitJobs(servers)
345 await waitUntilLog(servers[0], 'Duplicated ', 4) 412 await waitUntilLog(servers[0], 'Duplicated ', 5)
346 await waitJobs(servers) 413 await waitJobs(servers)
347 414
348 await check2Webseeds(strategy) 415 await check2Webseeds()
416 await check1PlaylistRedundancies()
349 await checkStatsWith2Webseed(strategy) 417 await checkStatsWith2Webseed(strategy)
350 }) 418 })
351 419
@@ -400,7 +468,7 @@ describe('Test videos redundancy', function () {
400 }) 468 })
401 469
402 it('Should still have 2 webseeds after 10 seconds', async function () { 470 it('Should still have 2 webseeds after 10 seconds', async function () {
403 this.timeout(40000) 471 this.timeout(80000)
404 472
405 await wait(10000) 473 await wait(10000)
406 474
@@ -415,11 +483,11 @@ describe('Test videos redundancy', function () {
415 }) 483 })
416 484
417 it('Should stop server 1 and expire video redundancy', async function () { 485 it('Should stop server 1 and expire video redundancy', async function () {
418 this.timeout(40000) 486 this.timeout(80000)
419 487
420 killallServers([ servers[0] ]) 488 killallServers([ servers[0] ])
421 489
422 await wait(10000) 490 await wait(15000)
423 491
424 await checkNotContains([ servers[1], servers[2] ], 'http%3A%2F%2Flocalhost%3A9001') 492 await checkNotContains([ servers[1], servers[2] ], 'http%3A%2F%2Flocalhost%3A9001')
425 }) 493 })
@@ -441,41 +509,60 @@ describe('Test videos redundancy', function () {
441 await enableRedundancyOnServer1() 509 await enableRedundancyOnServer1()
442 510
443 await waitJobs(servers) 511 await waitJobs(servers)
444 await waitUntilLog(servers[0], 'Duplicated ', 4) 512 await waitUntilLog(servers[0], 'Duplicated ', 5)
445 await waitJobs(servers) 513 await waitJobs(servers)
446 514
447 await check2Webseeds(strategy) 515 await check2Webseeds()
516 await check1PlaylistRedundancies()
448 await checkStatsWith2Webseed(strategy) 517 await checkStatsWith2Webseed(strategy)
449 518
450 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' }) 519 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
451 video2Server2UUID = res.body.video.uuid 520 video2Server2UUID = res.body.video.uuid
452 }) 521 })
453 522
454 it('Should cache video 2 webseed on the first video', async function () { 523 it('Should cache video 2 webseeds on the first video', async function () {
455 this.timeout(50000) 524 this.timeout(120000)
456 525
457 await waitJobs(servers) 526 await waitJobs(servers)
458 527
459 await wait(7000) 528 let checked = false
460 529
461 try { 530 while (checked === false) {
462 await check1WebSeed(strategy, video1Server2UUID) 531 await wait(1000)
463 await check2Webseeds(strategy, video2Server2UUID)
464 } catch {
465 await wait(3000)
466 532
467 try { 533 try {
468 await check1WebSeed(strategy, video1Server2UUID) 534 await check1WebSeed(video1Server2UUID)
469 await check2Webseeds(strategy, video2Server2UUID) 535 await check0PlaylistRedundancies(video1Server2UUID)
470 } catch { 536 await check2Webseeds(video2Server2UUID)
471 await wait(5000) 537 await check1PlaylistRedundancies(video2Server2UUID)
472 538
473 await check1WebSeed(strategy, video1Server2UUID) 539 checked = true
474 await check2Webseeds(strategy, video2Server2UUID) 540 } catch {
541 checked = false
475 } 542 }
476 } 543 }
477 }) 544 })
478 545
546 it('Should disable strategy and remove redundancies', async function () {
547 this.timeout(80000)
548
549 await waitJobs(servers)
550
551 killallServers([ servers[ 0 ] ])
552 await reRunServer(servers[ 0 ], {
553 redundancy: {
554 videos: {
555 check_interval: '1 second',
556 strategies: []
557 }
558 }
559 })
560
561 await waitJobs(servers)
562
563 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ])
564 })
565
479 after(function () { 566 after(function () {
480 return cleanServers() 567 return cleanServers()
481 }) 568 })
diff --git a/server/tests/api/search/search-activitypub-video-channels.ts b/server/tests/api/search/search-activitypub-video-channels.ts
index a287c5bdf..a411e973b 100644
--- a/server/tests/api/search/search-activitypub-video-channels.ts
+++ b/server/tests/api/search/search-activitypub-video-channels.ts
@@ -17,10 +17,10 @@ import {
17 uploadVideo, 17 uploadVideo,
18 userLogin, 18 userLogin,
19 wait 19 wait
20} from '../../utils' 20} from '../../../../shared/utils'
21import { waitJobs } from '../../utils/server/jobs' 21import { waitJobs } from '../../../../shared/utils/server/jobs'
22import { VideoChannel } from '../../../../shared/models/videos' 22import { VideoChannel } from '../../../../shared/models/videos'
23import { searchVideoChannel } from '../../utils/search/video-channels' 23import { searchVideoChannel } from '../../../../shared/utils/search/video-channels'
24 24
25const expect = chai.expect 25const expect = chai.expect
26 26
diff --git a/server/tests/api/search/search-activitypub-videos.ts b/server/tests/api/search/search-activitypub-videos.ts
index 28f4fac50..f881917e7 100644
--- a/server/tests/api/search/search-activitypub-videos.ts
+++ b/server/tests/api/search/search-activitypub-videos.ts
@@ -16,8 +16,8 @@ import {
16 uploadVideo, 16 uploadVideo,
17 wait, 17 wait,
18 searchVideo 18 searchVideo
19} from '../../utils' 19} from '../../../../shared/utils'
20import { waitJobs } from '../../utils/server/jobs' 20import { waitJobs } from '../../../../shared/utils/server/jobs'
21import { Video, VideoPrivacy } from '../../../../shared/models/videos' 21import { Video, VideoPrivacy } from '../../../../shared/models/videos'
22 22
23const expect = chai.expect 23const expect = chai.expect
diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts
index f1392ffea..50da837da 100644
--- a/server/tests/api/search/search-videos.ts
+++ b/server/tests/api/search/search-videos.ts
@@ -13,7 +13,7 @@ import {
13 uploadVideo, 13 uploadVideo,
14 wait, 14 wait,
15 immutableAssign 15 immutableAssign
16} from '../../utils' 16} from '../../../../shared/utils'
17 17
18const expect = chai.expect 18const expect = chai.expect
19 19
diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts
index facd1688d..0dfe6e4fe 100644
--- a/server/tests/api/server/config.ts
+++ b/server/tests/api/server/config.ts
@@ -4,8 +4,11 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { About } from '../../../../shared/models/server/about.model' 5import { About } from '../../../../shared/models/server/about.model'
6import { CustomConfig } from '../../../../shared/models/server/custom-config.model' 6import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
7import { deleteCustomConfig, getAbout, killallServers, reRunServer } from '../../utils'
8import { 7import {
8 deleteCustomConfig,
9 getAbout,
10 killallServers,
11 reRunServer,
9 flushTests, 12 flushTests,
10 getConfig, 13 getConfig,
11 getCustomConfig, 14 getCustomConfig,
@@ -13,7 +16,8 @@ import {
13 runServer, 16 runServer,
14 setAccessTokensToServers, 17 setAccessTokensToServers,
15 updateCustomConfig 18 updateCustomConfig
16} from '../../utils/index' 19} from '../../../../shared/utils'
20import { ServerConfig } from '../../../../shared/models'
17 21
18const expect = chai.expect 22const expect = chai.expect
19 23
@@ -29,23 +33,32 @@ function checkInitialConfig (data: CustomConfig) {
29 expect(data.instance.defaultNSFWPolicy).to.equal('display') 33 expect(data.instance.defaultNSFWPolicy).to.equal('display')
30 expect(data.instance.customizations.css).to.be.empty 34 expect(data.instance.customizations.css).to.be.empty
31 expect(data.instance.customizations.javascript).to.be.empty 35 expect(data.instance.customizations.javascript).to.be.empty
36
32 expect(data.services.twitter.username).to.equal('@Chocobozzz') 37 expect(data.services.twitter.username).to.equal('@Chocobozzz')
33 expect(data.services.twitter.whitelisted).to.be.false 38 expect(data.services.twitter.whitelisted).to.be.false
39
34 expect(data.cache.previews.size).to.equal(1) 40 expect(data.cache.previews.size).to.equal(1)
35 expect(data.cache.captions.size).to.equal(1) 41 expect(data.cache.captions.size).to.equal(1)
42
36 expect(data.signup.enabled).to.be.true 43 expect(data.signup.enabled).to.be.true
37 expect(data.signup.limit).to.equal(4) 44 expect(data.signup.limit).to.equal(4)
38 expect(data.signup.requiresEmailVerification).to.be.false 45 expect(data.signup.requiresEmailVerification).to.be.false
46
39 expect(data.admin.email).to.equal('admin1@example.com') 47 expect(data.admin.email).to.equal('admin1@example.com')
48 expect(data.contactForm.enabled).to.be.true
49
40 expect(data.user.videoQuota).to.equal(5242880) 50 expect(data.user.videoQuota).to.equal(5242880)
41 expect(data.user.videoQuotaDaily).to.equal(-1) 51 expect(data.user.videoQuotaDaily).to.equal(-1)
42 expect(data.transcoding.enabled).to.be.false 52 expect(data.transcoding.enabled).to.be.false
53 expect(data.transcoding.allowAdditionalExtensions).to.be.false
43 expect(data.transcoding.threads).to.equal(2) 54 expect(data.transcoding.threads).to.equal(2)
44 expect(data.transcoding.resolutions['240p']).to.be.true 55 expect(data.transcoding.resolutions['240p']).to.be.true
45 expect(data.transcoding.resolutions['360p']).to.be.true 56 expect(data.transcoding.resolutions['360p']).to.be.true
46 expect(data.transcoding.resolutions['480p']).to.be.true 57 expect(data.transcoding.resolutions['480p']).to.be.true
47 expect(data.transcoding.resolutions['720p']).to.be.true 58 expect(data.transcoding.resolutions['720p']).to.be.true
48 expect(data.transcoding.resolutions['1080p']).to.be.true 59 expect(data.transcoding.resolutions['1080p']).to.be.true
60 expect(data.transcoding.hls.enabled).to.be.true
61
49 expect(data.import.videos.http.enabled).to.be.true 62 expect(data.import.videos.http.enabled).to.be.true
50 expect(data.import.videos.torrent.enabled).to.be.true 63 expect(data.import.videos.torrent.enabled).to.be.true
51} 64}
@@ -59,23 +72,33 @@ function checkUpdatedConfig (data: CustomConfig) {
59 expect(data.instance.defaultNSFWPolicy).to.equal('blur') 72 expect(data.instance.defaultNSFWPolicy).to.equal('blur')
60 expect(data.instance.customizations.javascript).to.equal('alert("coucou")') 73 expect(data.instance.customizations.javascript).to.equal('alert("coucou")')
61 expect(data.instance.customizations.css).to.equal('body { background-color: red; }') 74 expect(data.instance.customizations.css).to.equal('body { background-color: red; }')
75
62 expect(data.services.twitter.username).to.equal('@Kuja') 76 expect(data.services.twitter.username).to.equal('@Kuja')
63 expect(data.services.twitter.whitelisted).to.be.true 77 expect(data.services.twitter.whitelisted).to.be.true
78
64 expect(data.cache.previews.size).to.equal(2) 79 expect(data.cache.previews.size).to.equal(2)
65 expect(data.cache.captions.size).to.equal(3) 80 expect(data.cache.captions.size).to.equal(3)
81
66 expect(data.signup.enabled).to.be.false 82 expect(data.signup.enabled).to.be.false
67 expect(data.signup.limit).to.equal(5) 83 expect(data.signup.limit).to.equal(5)
68 expect(data.signup.requiresEmailVerification).to.be.true 84 expect(data.signup.requiresEmailVerification).to.be.true
85
69 expect(data.admin.email).to.equal('superadmin1@example.com') 86 expect(data.admin.email).to.equal('superadmin1@example.com')
87 expect(data.contactForm.enabled).to.be.false
88
70 expect(data.user.videoQuota).to.equal(5242881) 89 expect(data.user.videoQuota).to.equal(5242881)
71 expect(data.user.videoQuotaDaily).to.equal(318742) 90 expect(data.user.videoQuotaDaily).to.equal(318742)
91
72 expect(data.transcoding.enabled).to.be.true 92 expect(data.transcoding.enabled).to.be.true
73 expect(data.transcoding.threads).to.equal(1) 93 expect(data.transcoding.threads).to.equal(1)
94 expect(data.transcoding.allowAdditionalExtensions).to.be.true
74 expect(data.transcoding.resolutions['240p']).to.be.false 95 expect(data.transcoding.resolutions['240p']).to.be.false
75 expect(data.transcoding.resolutions['360p']).to.be.true 96 expect(data.transcoding.resolutions['360p']).to.be.true
76 expect(data.transcoding.resolutions['480p']).to.be.true 97 expect(data.transcoding.resolutions['480p']).to.be.true
77 expect(data.transcoding.resolutions['720p']).to.be.false 98 expect(data.transcoding.resolutions['720p']).to.be.false
78 expect(data.transcoding.resolutions['1080p']).to.be.false 99 expect(data.transcoding.resolutions['1080p']).to.be.false
100 expect(data.transcoding.hls.enabled).to.be.false
101
79 expect(data.import.videos.http.enabled).to.be.false 102 expect(data.import.videos.http.enabled).to.be.false
80 expect(data.import.videos.torrent.enabled).to.be.false 103 expect(data.import.videos.torrent.enabled).to.be.false
81} 104}
@@ -93,7 +116,7 @@ describe('Test config', function () {
93 116
94 it('Should have a correct config on a server with registration enabled', async function () { 117 it('Should have a correct config on a server with registration enabled', async function () {
95 const res = await getConfig(server.url) 118 const res = await getConfig(server.url)
96 const data = res.body 119 const data: ServerConfig = res.body
97 120
98 expect(data.signup.allowed).to.be.true 121 expect(data.signup.allowed).to.be.true
99 }) 122 })
@@ -108,11 +131,23 @@ describe('Test config', function () {
108 ]) 131 ])
109 132
110 const res = await getConfig(server.url) 133 const res = await getConfig(server.url)
111 const data = res.body 134 const data: ServerConfig = res.body
112 135
113 expect(data.signup.allowed).to.be.false 136 expect(data.signup.allowed).to.be.false
114 }) 137 })
115 138
139 it('Should have the correct video allowed extensions', async function () {
140 const res = await getConfig(server.url)
141 const data: ServerConfig = res.body
142
143 expect(data.video.file.extensions).to.have.lengthOf(3)
144 expect(data.video.file.extensions).to.contain('.mp4')
145 expect(data.video.file.extensions).to.contain('.webm')
146 expect(data.video.file.extensions).to.contain('.ogv')
147
148 expect(data.contactForm.enabled).to.be.true
149 })
150
116 it('Should get the customized configuration', async function () { 151 it('Should get the customized configuration', async function () {
117 const res = await getCustomConfig(server.url, server.accessToken) 152 const res = await getCustomConfig(server.url, server.accessToken)
118 const data = res.body as CustomConfig 153 const data = res.body as CustomConfig
@@ -156,12 +191,16 @@ describe('Test config', function () {
156 admin: { 191 admin: {
157 email: 'superadmin1@example.com' 192 email: 'superadmin1@example.com'
158 }, 193 },
194 contactForm: {
195 enabled: false
196 },
159 user: { 197 user: {
160 videoQuota: 5242881, 198 videoQuota: 5242881,
161 videoQuotaDaily: 318742 199 videoQuotaDaily: 318742
162 }, 200 },
163 transcoding: { 201 transcoding: {
164 enabled: true, 202 enabled: true,
203 allowAdditionalExtensions: true,
165 threads: 1, 204 threads: 1,
166 resolutions: { 205 resolutions: {
167 '240p': false, 206 '240p': false,
@@ -169,6 +208,9 @@ describe('Test config', function () {
169 '480p': true, 208 '480p': true,
170 '720p': false, 209 '720p': false,
171 '1080p': false 210 '1080p': false
211 },
212 hls: {
213 enabled: false
172 } 214 }
173 }, 215 },
174 import: { 216 import: {
@@ -190,6 +232,18 @@ describe('Test config', function () {
190 checkUpdatedConfig(data) 232 checkUpdatedConfig(data)
191 }) 233 })
192 234
235 it('Should have the correct updated video allowed extensions', async function () {
236 const res = await getConfig(server.url)
237 const data: ServerConfig = res.body
238
239 expect(data.video.file.extensions).to.have.length.above(3)
240 expect(data.video.file.extensions).to.contain('.mp4')
241 expect(data.video.file.extensions).to.contain('.webm')
242 expect(data.video.file.extensions).to.contain('.ogv')
243 expect(data.video.file.extensions).to.contain('.flv')
244 expect(data.video.file.extensions).to.contain('.mkv')
245 })
246
193 it('Should have the configuration updated after a restart', async function () { 247 it('Should have the configuration updated after a restart', async function () {
194 this.timeout(10000) 248 this.timeout(10000)
195 249
diff --git a/server/tests/api/server/contact-form.ts b/server/tests/api/server/contact-form.ts
new file mode 100644
index 000000000..93221d0a3
--- /dev/null
+++ b/server/tests/api/server/contact-form.ts
@@ -0,0 +1,86 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, wait } from '../../../../shared/utils'
6import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
7import { waitJobs } from '../../../../shared/utils/server/jobs'
8import { sendContactForm } from '../../../../shared/utils/server/contact-form'
9
10const expect = chai.expect
11
12describe('Test contact form', function () {
13 let server: ServerInfo
14 const emails: object[] = []
15
16 before(async function () {
17 this.timeout(30000)
18
19 await MockSmtpServer.Instance.collectEmails(emails)
20
21 await flushTests()
22
23 const overrideConfig = {
24 smtp: {
25 hostname: 'localhost'
26 }
27 }
28 server = await runServer(1, overrideConfig)
29 await setAccessTokensToServers([ server ])
30 })
31
32 it('Should send a contact form', async function () {
33 this.timeout(10000)
34
35 await sendContactForm({
36 url: server.url,
37 fromEmail: 'toto@example.com',
38 body: 'my super message',
39 fromName: 'Super toto'
40 })
41
42 await waitJobs(server)
43
44 expect(emails).to.have.lengthOf(1)
45
46 const email = emails[0]
47
48 expect(email['from'][0]['address']).equal('toto@example.com')
49 expect(email['to'][0]['address']).equal('admin1@example.com')
50 expect(email['subject']).contains('Contact form')
51 expect(email['text']).contains('my super message')
52 })
53
54 it('Should not be able to send another contact form because of the anti spam checker', async function () {
55 await sendContactForm({
56 url: server.url,
57 fromEmail: 'toto@example.com',
58 body: 'my super message',
59 fromName: 'Super toto'
60 })
61
62 await sendContactForm({
63 url: server.url,
64 fromEmail: 'toto@example.com',
65 body: 'my super message',
66 fromName: 'Super toto',
67 expectedStatus: 403
68 })
69 })
70
71 it('Should be able to send another contact form after a while', async function () {
72 await wait(1000)
73
74 await sendContactForm({
75 url: server.url,
76 fromEmail: 'toto@example.com',
77 body: 'my super message',
78 fromName: 'Super toto'
79 })
80 })
81
82 after(async function () {
83 MockSmtpServer.Instance.kill()
84 killallServers([ server ])
85 })
86})
diff --git a/server/tests/api/server/email.ts b/server/tests/api/server/email.ts
index 713a27143..f96c57b66 100644
--- a/server/tests/api/server/email.ts
+++ b/server/tests/api/server/email.ts
@@ -14,11 +14,14 @@ import {
14 unblockUser, 14 unblockUser,
15 uploadVideo, 15 uploadVideo,
16 userLogin, 16 userLogin,
17 verifyEmail 17 verifyEmail,
18} from '../../utils' 18 flushTests,
19import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' 19 killallServers,
20import { mockSmtpServer } from '../../utils/miscs/email' 20 ServerInfo,
21import { waitJobs } from '../../utils/server/jobs' 21 setAccessTokensToServers
22} from '../../../../shared/utils'
23import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
24import { waitJobs } from '../../../../shared/utils/server/jobs'
22 25
23const expect = chai.expect 26const expect = chai.expect
24 27
@@ -38,7 +41,7 @@ describe('Test emails', function () {
38 before(async function () { 41 before(async function () {
39 this.timeout(30000) 42 this.timeout(30000)
40 43
41 await mockSmtpServer(emails) 44 await MockSmtpServer.Instance.collectEmails(emails)
42 45
43 await flushTests() 46 await flushTests()
44 47
@@ -248,6 +251,7 @@ describe('Test emails', function () {
248 }) 251 })
249 252
250 after(async function () { 253 after(async function () {
254 MockSmtpServer.Instance.kill()
251 killallServers([ server ]) 255 killallServers([ server ])
252 }) 256 })
253}) 257})
diff --git a/server/tests/api/server/follow-constraints.ts b/server/tests/api/server/follow-constraints.ts
new file mode 100644
index 000000000..8bb073c41
--- /dev/null
+++ b/server/tests/api/server/follow-constraints.ts
@@ -0,0 +1,225 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 doubleFollow,
7 getAccountVideos,
8 getVideo,
9 getVideoChannelVideos,
10 getVideoWithToken,
11 flushAndRunMultipleServers,
12 killallServers,
13 ServerInfo,
14 setAccessTokensToServers,
15 uploadVideo
16} from '../../../../shared/utils'
17import { unfollow } from '../../../../shared/utils/server/follows'
18import { userLogin } from '../../../../shared/utils/users/login'
19import { createUser } from '../../../../shared/utils/users/users'
20
21const expect = chai.expect
22
23describe('Test follow constraints', function () {
24 let servers: ServerInfo[] = []
25 let video1UUID: string
26 let video2UUID: string
27 let userAccessToken: string
28
29 before(async function () {
30 this.timeout(30000)
31
32 servers = await flushAndRunMultipleServers(2)
33
34 // Get the access tokens
35 await setAccessTokensToServers(servers)
36
37 {
38 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video server 1' })
39 video1UUID = res.body.video.uuid
40 }
41 {
42 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video server 2' })
43 video2UUID = res.body.video.uuid
44 }
45
46 const user = {
47 username: 'user1',
48 password: 'super_password'
49 }
50 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
51 userAccessToken = await userLogin(servers[0], user)
52
53 await doubleFollow(servers[0], servers[1])
54 })
55
56 describe('With a followed instance', function () {
57
58 describe('With an unlogged user', function () {
59
60 it('Should get the local video', async function () {
61 await getVideo(servers[0].url, video1UUID, 200)
62 })
63
64 it('Should get the remote video', async function () {
65 await getVideo(servers[0].url, video2UUID, 200)
66 })
67
68 it('Should list local account videos', async function () {
69 const res = await getAccountVideos(servers[0].url, undefined, 'root@localhost:9001', 0, 5)
70
71 expect(res.body.total).to.equal(1)
72 expect(res.body.data).to.have.lengthOf(1)
73 })
74
75 it('Should list remote account videos', async function () {
76 const res = await getAccountVideos(servers[0].url, undefined, 'root@localhost:9002', 0, 5)
77
78 expect(res.body.total).to.equal(1)
79 expect(res.body.data).to.have.lengthOf(1)
80 })
81
82 it('Should list local channel videos', async function () {
83 const res = await getVideoChannelVideos(servers[0].url, undefined, 'root_channel@localhost:9001', 0, 5)
84
85 expect(res.body.total).to.equal(1)
86 expect(res.body.data).to.have.lengthOf(1)
87 })
88
89 it('Should list remote channel videos', async function () {
90 const res = await getVideoChannelVideos(servers[0].url, undefined, 'root_channel@localhost:9002', 0, 5)
91
92 expect(res.body.total).to.equal(1)
93 expect(res.body.data).to.have.lengthOf(1)
94 })
95 })
96
97 describe('With a logged user', function () {
98 it('Should get the local video', async function () {
99 await getVideoWithToken(servers[0].url, userAccessToken, video1UUID, 200)
100 })
101
102 it('Should get the remote video', async function () {
103 await getVideoWithToken(servers[0].url, userAccessToken, video2UUID, 200)
104 })
105
106 it('Should list local account videos', async function () {
107 const res = await getAccountVideos(servers[0].url, userAccessToken, 'root@localhost:9001', 0, 5)
108
109 expect(res.body.total).to.equal(1)
110 expect(res.body.data).to.have.lengthOf(1)
111 })
112
113 it('Should list remote account videos', async function () {
114 const res = await getAccountVideos(servers[0].url, userAccessToken, 'root@localhost:9002', 0, 5)
115
116 expect(res.body.total).to.equal(1)
117 expect(res.body.data).to.have.lengthOf(1)
118 })
119
120 it('Should list local channel videos', async function () {
121 const res = await getVideoChannelVideos(servers[0].url, userAccessToken, 'root_channel@localhost:9001', 0, 5)
122
123 expect(res.body.total).to.equal(1)
124 expect(res.body.data).to.have.lengthOf(1)
125 })
126
127 it('Should list remote channel videos', async function () {
128 const res = await getVideoChannelVideos(servers[0].url, userAccessToken, 'root_channel@localhost:9002', 0, 5)
129
130 expect(res.body.total).to.equal(1)
131 expect(res.body.data).to.have.lengthOf(1)
132 })
133 })
134 })
135
136 describe('With a non followed instance', function () {
137
138 before(async function () {
139 this.timeout(30000)
140
141 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
142 })
143
144 describe('With an unlogged user', function () {
145
146 it('Should get the local video', async function () {
147 await getVideo(servers[0].url, video1UUID, 200)
148 })
149
150 it('Should not get the remote video', async function () {
151 await getVideo(servers[0].url, video2UUID, 403)
152 })
153
154 it('Should list local account videos', async function () {
155 const res = await getAccountVideos(servers[0].url, undefined, 'root@localhost:9001', 0, 5)
156
157 expect(res.body.total).to.equal(1)
158 expect(res.body.data).to.have.lengthOf(1)
159 })
160
161 it('Should not list remote account videos', async function () {
162 const res = await getAccountVideos(servers[0].url, undefined, 'root@localhost:9002', 0, 5)
163
164 expect(res.body.total).to.equal(0)
165 expect(res.body.data).to.have.lengthOf(0)
166 })
167
168 it('Should list local channel videos', async function () {
169 const res = await getVideoChannelVideos(servers[0].url, undefined, 'root_channel@localhost:9001', 0, 5)
170
171 expect(res.body.total).to.equal(1)
172 expect(res.body.data).to.have.lengthOf(1)
173 })
174
175 it('Should not list remote channel videos', async function () {
176 const res = await getVideoChannelVideos(servers[0].url, undefined, 'root_channel@localhost:9002', 0, 5)
177
178 expect(res.body.total).to.equal(0)
179 expect(res.body.data).to.have.lengthOf(0)
180 })
181 })
182
183 describe('With a logged user', function () {
184 it('Should get the local video', async function () {
185 await getVideoWithToken(servers[0].url, userAccessToken, video1UUID, 200)
186 })
187
188 it('Should get the remote video', async function () {
189 await getVideoWithToken(servers[0].url, userAccessToken, video2UUID, 200)
190 })
191
192 it('Should list local account videos', async function () {
193 const res = await getAccountVideos(servers[0].url, userAccessToken, 'root@localhost:9001', 0, 5)
194
195 expect(res.body.total).to.equal(1)
196 expect(res.body.data).to.have.lengthOf(1)
197 })
198
199 it('Should list remote account videos', async function () {
200 const res = await getAccountVideos(servers[0].url, userAccessToken, 'root@localhost:9002', 0, 5)
201
202 expect(res.body.total).to.equal(1)
203 expect(res.body.data).to.have.lengthOf(1)
204 })
205
206 it('Should list local channel videos', async function () {
207 const res = await getVideoChannelVideos(servers[0].url, userAccessToken, 'root_channel@localhost:9001', 0, 5)
208
209 expect(res.body.total).to.equal(1)
210 expect(res.body.data).to.have.lengthOf(1)
211 })
212
213 it('Should list remote channel videos', async function () {
214 const res = await getVideoChannelVideos(servers[0].url, userAccessToken, 'root_channel@localhost:9002', 0, 5)
215
216 expect(res.body.total).to.equal(1)
217 expect(res.body.data).to.have.lengthOf(1)
218 })
219 })
220 })
221
222 after(async function () {
223 killallServers(servers)
224 })
225})
diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts
index e8914a9d4..ad4c87c73 100644
--- a/server/tests/api/server/follows.ts
+++ b/server/tests/api/server/follows.ts
@@ -4,7 +4,7 @@ import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { Video, VideoPrivacy } from '../../../../shared/models/videos' 5import { Video, VideoPrivacy } from '../../../../shared/models/videos'
6import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' 6import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
7import { completeVideoCheck } from '../../utils' 7import { completeVideoCheck } from '../../../../shared/utils'
8import { 8import {
9 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
10 getVideosList, 10 getVideosList,
@@ -12,21 +12,26 @@ import {
12 ServerInfo, 12 ServerInfo,
13 setAccessTokensToServers, 13 setAccessTokensToServers,
14 uploadVideo 14 uploadVideo
15} from '../../utils/index' 15} from '../../../../shared/utils/index'
16import { dateIsValid } from '../../utils/miscs/miscs' 16import { dateIsValid } from '../../../../shared/utils/miscs/miscs'
17import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort, unfollow } from '../../utils/server/follows' 17import {
18import { expectAccountFollows } from '../../utils/users/accounts' 18 follow,
19import { userLogin } from '../../utils/users/login' 19 getFollowersListPaginationAndSort,
20import { createUser } from '../../utils/users/users' 20 getFollowingListPaginationAndSort,
21 unfollow
22} from '../../../../shared/utils/server/follows'
23import { expectAccountFollows } from '../../../../shared/utils/users/accounts'
24import { userLogin } from '../../../../shared/utils/users/login'
25import { createUser } from '../../../../shared/utils/users/users'
21import { 26import {
22 addVideoCommentReply, 27 addVideoCommentReply,
23 addVideoCommentThread, 28 addVideoCommentThread,
24 getVideoCommentThreads, 29 getVideoCommentThreads,
25 getVideoThreadComments 30 getVideoThreadComments
26} from '../../utils/videos/video-comments' 31} from '../../../../shared/utils/videos/video-comments'
27import { rateVideo } from '../../utils/videos/videos' 32import { rateVideo } from '../../../../shared/utils/videos/videos'
28import { waitJobs } from '../../utils/server/jobs' 33import { waitJobs } from '../../../../shared/utils/server/jobs'
29import { createVideoCaption, listVideoCaptions, testCaptionFile } from '../../utils/videos/video-captions' 34import { createVideoCaption, listVideoCaptions, testCaptionFile } from '../../../../shared/utils/videos/video-captions'
30import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' 35import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
31 36
32const expect = chai.expect 37const expect = chai.expect
@@ -93,7 +98,26 @@ describe('Test follows', function () {
93 expect(server3Follow.state).to.equal('accepted') 98 expect(server3Follow.state).to.equal('accepted')
94 }) 99 })
95 100
96 it('Should have 0 followings on server 1 and 2', async function () { 101 it('Should search followings on server 1', async function () {
102 {
103 const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 1, 'createdAt', ':9002')
104 const follows = res.body.data
105
106 expect(res.body.total).to.equal(1)
107 expect(follows.length).to.equal(1)
108 expect(follows[ 0 ].following.host).to.equal('localhost:9002')
109 }
110
111 {
112 const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 1, 'createdAt', 'bla')
113 const follows = res.body.data
114
115 expect(res.body.total).to.equal(0)
116 expect(follows.length).to.equal(0)
117 }
118 })
119
120 it('Should have 0 followings on server 2 and 3', async function () {
97 for (const server of [ servers[1], servers[2] ]) { 121 for (const server of [ servers[1], servers[2] ]) {
98 const res = await getFollowingListPaginationAndSort(server.url, 0, 5, 'createdAt') 122 const res = await getFollowingListPaginationAndSort(server.url, 0, 5, 'createdAt')
99 const follows = res.body.data 123 const follows = res.body.data
@@ -116,6 +140,25 @@ describe('Test follows', function () {
116 } 140 }
117 }) 141 })
118 142
143 it('Should search followers on server 2', async function () {
144 {
145 const res = await getFollowersListPaginationAndSort(servers[ 2 ].url, 0, 5, 'createdAt', '9001')
146 const follows = res.body.data
147
148 expect(res.body.total).to.equal(1)
149 expect(follows.length).to.equal(1)
150 expect(follows[ 0 ].following.host).to.equal('localhost:9003')
151 }
152
153 {
154 const res = await getFollowersListPaginationAndSort(servers[ 2 ].url, 0, 5, 'createdAt', 'bla')
155 const follows = res.body.data
156
157 expect(res.body.total).to.equal(0)
158 expect(follows.length).to.equal(0)
159 }
160 })
161
119 it('Should have 0 followers on server 1', async function () { 162 it('Should have 0 followers on server 1', async function () {
120 const res = await getFollowersListPaginationAndSort(servers[0].url, 0, 5, 'createdAt') 163 const res = await getFollowersListPaginationAndSort(servers[0].url, 0, 5, 'createdAt')
121 const follows = res.body.data 164 const follows = res.body.data
diff --git a/server/tests/api/server/handle-down.ts b/server/tests/api/server/handle-down.ts
index b0a3d029a..cd5acbe16 100644
--- a/server/tests/api/server/handle-down.ts
+++ b/server/tests/api/server/handle-down.ts
@@ -5,24 +5,30 @@ import 'mocha'
5import { JobState, Video } from '../../../../shared/models' 5import { JobState, Video } from '../../../../shared/models'
6import { VideoPrivacy } from '../../../../shared/models/videos' 6import { VideoPrivacy } from '../../../../shared/models/videos'
7import { VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' 7import { VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
8import { completeVideoCheck, getVideo, immutableAssign, reRunServer, unfollow, viewVideo } from '../../utils' 8
9import { 9import {
10 completeVideoCheck,
10 flushAndRunMultipleServers, 11 flushAndRunMultipleServers,
12 getVideo,
11 getVideosList, 13 getVideosList,
14 immutableAssign,
12 killallServers, 15 killallServers,
16 reRunServer,
13 ServerInfo, 17 ServerInfo,
14 setAccessTokensToServers, 18 setAccessTokensToServers,
19 unfollow,
20 updateVideo,
15 uploadVideo, 21 uploadVideo,
16 wait 22 wait
17} from '../../utils/index' 23} from '../../../../shared/utils'
18import { follow, getFollowersListPaginationAndSort } from '../../utils/server/follows' 24import { follow, getFollowersListPaginationAndSort } from '../../../../shared/utils/server/follows'
19import { getJobsListPaginationAndSort, waitJobs } from '../../utils/server/jobs' 25import { getJobsListPaginationAndSort, waitJobs } from '../../../../shared/utils/server/jobs'
20import { 26import {
21 addVideoCommentReply, 27 addVideoCommentReply,
22 addVideoCommentThread, 28 addVideoCommentThread,
23 getVideoCommentThreads, 29 getVideoCommentThreads,
24 getVideoThreadComments 30 getVideoThreadComments
25} from '../../utils/videos/video-comments' 31} from '../../../../shared/utils/videos/video-comments'
26 32
27const expect = chai.expect 33const expect = chai.expect
28 34
@@ -195,15 +201,15 @@ describe('Test handle downs', function () {
195 expect(res.body.data).to.have.lengthOf(2) 201 expect(res.body.data).to.have.lengthOf(2)
196 }) 202 })
197 203
198 it('Should send a view to server 3, and automatically fetch the video', async function () { 204 it('Should send an update to server 3, and automatically fetch the video', async function () {
199 this.timeout(15000) 205 this.timeout(15000)
200 206
201 const res1 = await getVideosList(servers[2].url) 207 const res1 = await getVideosList(servers[2].url)
202 expect(res1.body.data).to.be.an('array') 208 expect(res1.body.data).to.be.an('array')
203 expect(res1.body.data).to.have.lengthOf(11) 209 expect(res1.body.data).to.have.lengthOf(11)
204 210
205 await viewVideo(servers[0].url, missedVideo1.uuid) 211 await updateVideo(servers[0].url, servers[0].accessToken, missedVideo1.uuid, { })
206 await viewVideo(servers[0].url, unlistedVideo.uuid) 212 await updateVideo(servers[0].url, servers[0].accessToken, unlistedVideo.uuid, { })
207 213
208 await waitJobs(servers) 214 await waitJobs(servers)
209 215
diff --git a/server/tests/api/server/index.ts b/server/tests/api/server/index.ts
index c74c68a33..1f80cc6cf 100644
--- a/server/tests/api/server/index.ts
+++ b/server/tests/api/server/index.ts
@@ -1,9 +1,11 @@
1import './config' 1import './config'
2import './contact-form'
2import './email' 3import './email'
4import './follow-constraints'
3import './follows' 5import './follows'
4import './handle-down' 6import './handle-down'
5import './jobs' 7import './jobs'
6import './redundancy'
7import './reverse-proxy' 8import './reverse-proxy'
8import './stats' 9import './stats'
9import './tracker' 10import './tracker'
11import './no-client'
diff --git a/server/tests/api/server/jobs.ts b/server/tests/api/server/jobs.ts
index cd59d9a1b..52948b1d6 100644
--- a/server/tests/api/server/jobs.ts
+++ b/server/tests/api/server/jobs.ts
@@ -2,12 +2,12 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' 5import { killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/utils/index'
6import { doubleFollow } from '../../utils/server/follows' 6import { doubleFollow } from '../../../../shared/utils/server/follows'
7import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../utils/server/jobs' 7import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../../../shared/utils/server/jobs'
8import { flushAndRunMultipleServers } from '../../utils/server/servers' 8import { flushAndRunMultipleServers } from '../../../../shared/utils/server/servers'
9import { uploadVideo } from '../../utils/videos/videos' 9import { uploadVideo } from '../../../../shared/utils/videos/videos'
10import { dateIsValid } from '../../utils/miscs/miscs' 10import { dateIsValid } from '../../../../shared/utils/miscs/miscs'
11 11
12const expect = chai.expect 12const expect = chai.expect
13 13
diff --git a/server/tests/api/server/no-client.ts b/server/tests/api/server/no-client.ts
new file mode 100644
index 000000000..3b95ce945
--- /dev/null
+++ b/server/tests/api/server/no-client.ts
@@ -0,0 +1,36 @@
1import 'mocha'
2import * as request from 'supertest'
3import {
4 flushTests,
5 killallServers,
6 ServerInfo
7} from '../../../../shared/utils'
8import { runServer } from '../../../../shared/utils/server/servers'
9
10describe('Start and stop server without web client routes', function () {
11 let server: ServerInfo
12
13 before(async function () {
14 this.timeout(30000)
15
16 await flushTests()
17
18 server = await runServer(1, {}, ['--no-client'])
19 })
20
21 it('Should fail getting the client', function () {
22 const req = request(server.url)
23 .get('/')
24
25 return req.expect(404)
26 })
27
28 after(async function () {
29 killallServers([ server ])
30
31 // Keep the logs if the test failed
32 if (this['ok']) {
33 await flushTests()
34 }
35 })
36})
diff --git a/server/tests/api/server/reverse-proxy.ts b/server/tests/api/server/reverse-proxy.ts
index e2c2a293e..ee0fffd5a 100644
--- a/server/tests/api/server/reverse-proxy.ts
+++ b/server/tests/api/server/reverse-proxy.ts
@@ -15,7 +15,7 @@ import {
15 userLogin, 15 userLogin,
16 viewVideo, 16 viewVideo,
17 wait 17 wait
18} from '../../utils' 18} from '../../../../shared/utils'
19const expect = chai.expect 19const expect = chai.expect
20 20
21import { 21import {
@@ -23,7 +23,7 @@ import {
23 flushTests, 23 flushTests,
24 runServer, 24 runServer,
25 registerUser, getCustomConfig, setAccessTokensToServers, updateCustomConfig 25 registerUser, getCustomConfig, setAccessTokensToServers, updateCustomConfig
26} from '../../utils/index' 26} from '../../../../shared/utils/index'
27 27
28describe('Test application behind a reverse proxy', function () { 28describe('Test application behind a reverse proxy', function () {
29 let server = null 29 let server = null
@@ -95,7 +95,7 @@ describe('Test application behind a reverse proxy', function () {
95 it('Should rate limit logins', async function () { 95 it('Should rate limit logins', async function () {
96 const user = { username: 'root', password: 'fail' } 96 const user = { username: 'root', password: 'fail' }
97 97
98 for (let i = 0; i < 14; i++) { 98 for (let i = 0; i < 19; i++) {
99 await userLogin(server, user, 400) 99 await userLogin(server, user, 400)
100 } 100 }
101 101
diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts
index cb229e876..aaa6c62f7 100644
--- a/server/tests/api/server/stats.ts
+++ b/server/tests/api/server/stats.ts
@@ -13,11 +13,11 @@ import {
13 uploadVideo, 13 uploadVideo,
14 viewVideo, 14 viewVideo,
15 wait 15 wait
16} from '../../utils' 16} from '../../../../shared/utils'
17import { flushTests, setAccessTokensToServers } from '../../utils/index' 17import { flushTests, setAccessTokensToServers } from '../../../../shared/utils/index'
18import { getStats } from '../../utils/server/stats' 18import { getStats } from '../../../../shared/utils/server/stats'
19import { addVideoCommentThread } from '../../utils/videos/video-comments' 19import { addVideoCommentThread } from '../../../../shared/utils/videos/video-comments'
20import { waitJobs } from '../../utils/server/jobs' 20import { waitJobs } from '../../../../shared/utils/server/jobs'
21 21
22const expect = chai.expect 22const expect = chai.expect
23 23
@@ -39,7 +39,7 @@ describe('Test stats (excluding redundancy)', function () {
39 } 39 }
40 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password) 40 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
41 41
42 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, {}) 42 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' })
43 const videoUUID = resVideo.body.video.uuid 43 const videoUUID = resVideo.body.video.uuid
44 44
45 await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment') 45 await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment')
@@ -60,6 +60,7 @@ describe('Test stats (excluding redundancy)', function () {
60 expect(data.totalLocalVideoComments).to.equal(1) 60 expect(data.totalLocalVideoComments).to.equal(1)
61 expect(data.totalLocalVideos).to.equal(1) 61 expect(data.totalLocalVideos).to.equal(1)
62 expect(data.totalLocalVideoViews).to.equal(1) 62 expect(data.totalLocalVideoViews).to.equal(1)
63 expect(data.totalLocalVideoFilesSize).to.equal(218910)
63 expect(data.totalUsers).to.equal(2) 64 expect(data.totalUsers).to.equal(2)
64 expect(data.totalVideoComments).to.equal(1) 65 expect(data.totalVideoComments).to.equal(1)
65 expect(data.totalVideos).to.equal(1) 66 expect(data.totalVideos).to.equal(1)
@@ -74,6 +75,7 @@ describe('Test stats (excluding redundancy)', function () {
74 expect(data.totalLocalVideoComments).to.equal(0) 75 expect(data.totalLocalVideoComments).to.equal(0)
75 expect(data.totalLocalVideos).to.equal(0) 76 expect(data.totalLocalVideos).to.equal(0)
76 expect(data.totalLocalVideoViews).to.equal(0) 77 expect(data.totalLocalVideoViews).to.equal(0)
78 expect(data.totalLocalVideoFilesSize).to.equal(0)
77 expect(data.totalUsers).to.equal(1) 79 expect(data.totalUsers).to.equal(1)
78 expect(data.totalVideoComments).to.equal(1) 80 expect(data.totalVideoComments).to.equal(1)
79 expect(data.totalVideos).to.equal(1) 81 expect(data.totalVideos).to.equal(1)
diff --git a/server/tests/api/server/tracker.ts b/server/tests/api/server/tracker.ts
index 856f2f4d1..25ca00029 100644
--- a/server/tests/api/server/tracker.ts
+++ b/server/tests/api/server/tracker.ts
@@ -2,8 +2,8 @@
2 2
3import * as magnetUtil from 'magnet-uri' 3import * as magnetUtil from 'magnet-uri'
4import 'mocha' 4import 'mocha'
5import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../utils' 5import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../../../shared/utils'
6import { flushTests, setAccessTokensToServers } from '../../utils/index' 6import { flushTests, setAccessTokensToServers } from '../../../../shared/utils/index'
7import { VideoDetails } from '../../../../shared/models/videos' 7import { VideoDetails } from '../../../../shared/models/videos'
8import * as WebTorrent from 'webtorrent' 8import * as WebTorrent from 'webtorrent'
9 9
diff --git a/server/tests/api/users/blocklist.ts b/server/tests/api/users/blocklist.ts
new file mode 100644
index 000000000..4bca27a94
--- /dev/null
+++ b/server/tests/api/users/blocklist.ts
@@ -0,0 +1,511 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { AccountBlock, ServerBlock, Video } from '../../../../shared/index'
6import {
7 createUser,
8 doubleFollow,
9 flushAndRunMultipleServers,
10 flushTests,
11 killallServers,
12 ServerInfo,
13 uploadVideo,
14 userLogin
15} from '../../../../shared/utils/index'
16import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
17import { getVideosListWithToken, getVideosList } from '../../../../shared/utils/videos/videos'
18import {
19 addVideoCommentReply,
20 addVideoCommentThread,
21 getVideoCommentThreads,
22 getVideoThreadComments
23} from '../../../../shared/utils/videos/video-comments'
24import { waitJobs } from '../../../../shared/utils/server/jobs'
25import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
26import {
27 addAccountToAccountBlocklist,
28 addAccountToServerBlocklist,
29 addServerToAccountBlocklist,
30 addServerToServerBlocklist,
31 getAccountBlocklistByAccount,
32 getAccountBlocklistByServer,
33 getServerBlocklistByAccount,
34 getServerBlocklistByServer,
35 removeAccountFromAccountBlocklist,
36 removeAccountFromServerBlocklist,
37 removeServerFromAccountBlocklist,
38 removeServerFromServerBlocklist
39} from '../../../../shared/utils/users/blocklist'
40
41const expect = chai.expect
42
43async function checkAllVideos (url: string, token: string) {
44 {
45 const res = await getVideosListWithToken(url, token)
46
47 expect(res.body.data).to.have.lengthOf(4)
48 }
49
50 {
51 const res = await getVideosList(url)
52
53 expect(res.body.data).to.have.lengthOf(4)
54 }
55}
56
57async function checkAllComments (url: string, token: string, videoUUID: string) {
58 const resThreads = await getVideoCommentThreads(url, videoUUID, 0, 5, '-createdAt', token)
59
60 const threads: VideoComment[] = resThreads.body.data
61 expect(threads).to.have.lengthOf(2)
62
63 for (const thread of threads) {
64 const res = await getVideoThreadComments(url, videoUUID, thread.id, token)
65
66 const tree: VideoCommentThreadTree = res.body
67 expect(tree.children).to.have.lengthOf(1)
68 }
69}
70
71describe('Test blocklist', function () {
72 let servers: ServerInfo[]
73 let videoUUID1: string
74 let videoUUID2: string
75 let userToken1: string
76 let userModeratorToken: string
77 let userToken2: string
78
79 before(async function () {
80 this.timeout(60000)
81
82 await flushTests()
83
84 servers = await flushAndRunMultipleServers(2)
85 await setAccessTokensToServers(servers)
86
87 {
88 const user = { username: 'user1', password: 'password' }
89 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
90
91 userToken1 = await userLogin(servers[0], user)
92 await uploadVideo(servers[0].url, userToken1, { name: 'video user 1' })
93 }
94
95 {
96 const user = { username: 'moderator', password: 'password' }
97 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
98
99 userModeratorToken = await userLogin(servers[0], user)
100 }
101
102 {
103 const user = { username: 'user2', password: 'password' }
104 await createUser(servers[1].url, servers[1].accessToken, user.username, user.password)
105
106 userToken2 = await userLogin(servers[1], user)
107 await uploadVideo(servers[1].url, userToken2, { name: 'video user 2' })
108 }
109
110 {
111 const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video server 1' })
112 videoUUID1 = res.body.video.uuid
113 }
114
115 {
116 const res = await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video server 2' })
117 videoUUID2 = res.body.video.uuid
118 }
119
120 await doubleFollow(servers[0], servers[1])
121
122 {
123 const resComment = await addVideoCommentThread(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1, 'comment root 1')
124 const resReply = await addVideoCommentReply(servers[ 0 ].url, userToken1, videoUUID1, resComment.body.comment.id, 'comment user 1')
125 await addVideoCommentReply(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1, resReply.body.comment.id, 'comment root 1')
126 }
127
128 {
129 const resComment = await addVideoCommentThread(servers[ 0 ].url, userToken1, videoUUID1, 'comment user 1')
130 await addVideoCommentReply(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1, resComment.body.comment.id, 'comment root 1')
131 }
132
133 await waitJobs(servers)
134 })
135
136 describe('User blocklist', function () {
137
138 describe('When managing account blocklist', function () {
139 it('Should list all videos', function () {
140 return checkAllVideos(servers[ 0 ].url, servers[ 0 ].accessToken)
141 })
142
143 it('Should list the comments', function () {
144 return checkAllComments(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1)
145 })
146
147 it('Should block a remote account', async function () {
148 await addAccountToAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user2@localhost:9002')
149 })
150
151 it('Should hide its videos', async function () {
152 const res = await getVideosListWithToken(servers[ 0 ].url, servers[ 0 ].accessToken)
153
154 const videos: Video[] = res.body.data
155 expect(videos).to.have.lengthOf(3)
156
157 const v = videos.find(v => v.name === 'video user 2')
158 expect(v).to.be.undefined
159 })
160
161 it('Should block a local account', async function () {
162 await addAccountToAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user1')
163 })
164
165 it('Should hide its videos', async function () {
166 const res = await getVideosListWithToken(servers[ 0 ].url, servers[ 0 ].accessToken)
167
168 const videos: Video[] = res.body.data
169 expect(videos).to.have.lengthOf(2)
170
171 const v = videos.find(v => v.name === 'video user 1')
172 expect(v).to.be.undefined
173 })
174
175 it('Should hide its comments', async function () {
176 const resThreads = await getVideoCommentThreads(servers[ 0 ].url, videoUUID1, 0, 5, '-createdAt', servers[ 0 ].accessToken)
177
178 const threads: VideoComment[] = resThreads.body.data
179 expect(threads).to.have.lengthOf(1)
180 expect(threads[ 0 ].totalReplies).to.equal(0)
181
182 const t = threads.find(t => t.text === 'comment user 1')
183 expect(t).to.be.undefined
184
185 for (const thread of threads) {
186 const res = await getVideoThreadComments(servers[ 0 ].url, videoUUID1, thread.id, servers[ 0 ].accessToken)
187
188 const tree: VideoCommentThreadTree = res.body
189 expect(tree.children).to.have.lengthOf(0)
190 }
191 })
192
193 it('Should list all the videos with another user', async function () {
194 return checkAllVideos(servers[ 0 ].url, userToken1)
195 })
196
197 it('Should list all the comments with another user', async function () {
198 return checkAllComments(servers[ 0 ].url, userToken1, videoUUID1)
199 })
200
201 it('Should list blocked accounts', async function () {
202 {
203 const res = await getAccountBlocklistByAccount(servers[ 0 ].url, servers[ 0 ].accessToken, 0, 1, 'createdAt')
204 const blocks: AccountBlock[] = res.body.data
205
206 expect(res.body.total).to.equal(2)
207
208 const block = blocks[ 0 ]
209 expect(block.byAccount.displayName).to.equal('root')
210 expect(block.byAccount.name).to.equal('root')
211 expect(block.blockedAccount.displayName).to.equal('user2')
212 expect(block.blockedAccount.name).to.equal('user2')
213 expect(block.blockedAccount.host).to.equal('localhost:9002')
214 }
215
216 {
217 const res = await getAccountBlocklistByAccount(servers[ 0 ].url, servers[ 0 ].accessToken, 1, 2, 'createdAt')
218 const blocks: AccountBlock[] = res.body.data
219
220 expect(res.body.total).to.equal(2)
221
222 const block = blocks[ 0 ]
223 expect(block.byAccount.displayName).to.equal('root')
224 expect(block.byAccount.name).to.equal('root')
225 expect(block.blockedAccount.displayName).to.equal('user1')
226 expect(block.blockedAccount.name).to.equal('user1')
227 expect(block.blockedAccount.host).to.equal('localhost:9001')
228 }
229 })
230
231 it('Should unblock the remote account', async function () {
232 await removeAccountFromAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user2@localhost:9002')
233 })
234
235 it('Should display its videos', async function () {
236 const res = await getVideosListWithToken(servers[ 0 ].url, servers[ 0 ].accessToken)
237
238 const videos: Video[] = res.body.data
239 expect(videos).to.have.lengthOf(3)
240
241 const v = videos.find(v => v.name === 'video user 2')
242 expect(v).not.to.be.undefined
243 })
244
245 it('Should unblock the local account', async function () {
246 await removeAccountFromAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user1')
247 })
248
249 it('Should display its comments', function () {
250 return checkAllComments(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1)
251 })
252 })
253
254 describe('When managing server blocklist', function () {
255 it('Should list all videos', function () {
256 return checkAllVideos(servers[ 0 ].url, servers[ 0 ].accessToken)
257 })
258
259 it('Should list the comments', function () {
260 return checkAllComments(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1)
261 })
262
263 it('Should block a remote server', async function () {
264 await addServerToAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'localhost:9002')
265 })
266
267 it('Should hide its videos', async function () {
268 const res = await getVideosListWithToken(servers[ 0 ].url, servers[ 0 ].accessToken)
269
270 const videos: Video[] = res.body.data
271 expect(videos).to.have.lengthOf(2)
272
273 const v1 = videos.find(v => v.name === 'video user 2')
274 const v2 = videos.find(v => v.name === 'video server 2')
275
276 expect(v1).to.be.undefined
277 expect(v2).to.be.undefined
278 })
279
280 it('Should list all the videos with another user', async function () {
281 return checkAllVideos(servers[ 0 ].url, userToken1)
282 })
283
284 it('Should hide its comments')
285
286 it('Should list blocked servers', async function () {
287 const res = await getServerBlocklistByAccount(servers[ 0 ].url, servers[ 0 ].accessToken, 0, 1, 'createdAt')
288 const blocks: ServerBlock[] = res.body.data
289
290 expect(res.body.total).to.equal(1)
291
292 const block = blocks[ 0 ]
293 expect(block.byAccount.displayName).to.equal('root')
294 expect(block.byAccount.name).to.equal('root')
295 expect(block.blockedServer.host).to.equal('localhost:9002')
296 })
297
298 it('Should unblock the remote server', async function () {
299 await removeServerFromAccountBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'localhost:9002')
300 })
301
302 it('Should display its videos', function () {
303 return checkAllVideos(servers[ 0 ].url, servers[ 0 ].accessToken)
304 })
305
306 it('Should display its comments', function () {
307 return checkAllComments(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID1)
308 })
309 })
310 })
311
312 describe('Server blocklist', function () {
313
314 describe('When managing account blocklist', function () {
315 it('Should list all videos', async function () {
316 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
317 await checkAllVideos(servers[ 0 ].url, token)
318 }
319 })
320
321 it('Should list the comments', async function () {
322 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
323 await checkAllComments(servers[ 0 ].url, token, videoUUID1)
324 }
325 })
326
327 it('Should block a remote account', async function () {
328 await addAccountToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user2@localhost:9002')
329 })
330
331 it('Should hide its videos', async function () {
332 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
333 const res = await getVideosListWithToken(servers[ 0 ].url, token)
334
335 const videos: Video[] = res.body.data
336 expect(videos).to.have.lengthOf(3)
337
338 const v = videos.find(v => v.name === 'video user 2')
339 expect(v).to.be.undefined
340 }
341 })
342
343 it('Should block a local account', async function () {
344 await addAccountToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user1')
345 })
346
347 it('Should hide its videos', async function () {
348 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
349 const res = await getVideosListWithToken(servers[ 0 ].url, token)
350
351 const videos: Video[] = res.body.data
352 expect(videos).to.have.lengthOf(2)
353
354 const v = videos.find(v => v.name === 'video user 1')
355 expect(v).to.be.undefined
356 }
357 })
358
359 it('Should hide its comments', async function () {
360 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
361 const resThreads = await getVideoCommentThreads(servers[ 0 ].url, videoUUID1, 0, 5, '-createdAt', token)
362
363 const threads: VideoComment[] = resThreads.body.data
364 expect(threads).to.have.lengthOf(1)
365 expect(threads[ 0 ].totalReplies).to.equal(0)
366
367 const t = threads.find(t => t.text === 'comment user 1')
368 expect(t).to.be.undefined
369
370 for (const thread of threads) {
371 const res = await getVideoThreadComments(servers[ 0 ].url, videoUUID1, thread.id, token)
372
373 const tree: VideoCommentThreadTree = res.body
374 expect(tree.children).to.have.lengthOf(0)
375 }
376 }
377 })
378
379 it('Should list blocked accounts', async function () {
380 {
381 const res = await getAccountBlocklistByServer(servers[ 0 ].url, servers[ 0 ].accessToken, 0, 1, 'createdAt')
382 const blocks: AccountBlock[] = res.body.data
383
384 expect(res.body.total).to.equal(2)
385
386 const block = blocks[ 0 ]
387 expect(block.byAccount.displayName).to.equal('peertube')
388 expect(block.byAccount.name).to.equal('peertube')
389 expect(block.blockedAccount.displayName).to.equal('user2')
390 expect(block.blockedAccount.name).to.equal('user2')
391 expect(block.blockedAccount.host).to.equal('localhost:9002')
392 }
393
394 {
395 const res = await getAccountBlocklistByServer(servers[ 0 ].url, servers[ 0 ].accessToken, 1, 2, 'createdAt')
396 const blocks: AccountBlock[] = res.body.data
397
398 expect(res.body.total).to.equal(2)
399
400 const block = blocks[ 0 ]
401 expect(block.byAccount.displayName).to.equal('peertube')
402 expect(block.byAccount.name).to.equal('peertube')
403 expect(block.blockedAccount.displayName).to.equal('user1')
404 expect(block.blockedAccount.name).to.equal('user1')
405 expect(block.blockedAccount.host).to.equal('localhost:9001')
406 }
407 })
408
409 it('Should unblock the remote account', async function () {
410 await removeAccountFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user2@localhost:9002')
411 })
412
413 it('Should display its videos', async function () {
414 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
415 const res = await getVideosListWithToken(servers[ 0 ].url, token)
416
417 const videos: Video[] = res.body.data
418 expect(videos).to.have.lengthOf(3)
419
420 const v = videos.find(v => v.name === 'video user 2')
421 expect(v).not.to.be.undefined
422 }
423 })
424
425 it('Should unblock the local account', async function () {
426 await removeAccountFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'user1')
427 })
428
429 it('Should display its comments', async function () {
430 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
431 await checkAllComments(servers[ 0 ].url, token, videoUUID1)
432 }
433 })
434 })
435
436 describe('When managing server blocklist', function () {
437 it('Should list all videos', async function () {
438 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
439 await checkAllVideos(servers[ 0 ].url, token)
440 }
441 })
442
443 it('Should list the comments', async function () {
444 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
445 await checkAllComments(servers[ 0 ].url, token, videoUUID1)
446 }
447 })
448
449 it('Should block a remote server', async function () {
450 await addServerToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'localhost:9002')
451 })
452
453 it('Should hide its videos', async function () {
454 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
455 const res1 = await getVideosList(servers[ 0 ].url)
456 const res2 = await getVideosListWithToken(servers[ 0 ].url, token)
457
458 for (const res of [ res1, res2 ]) {
459 const videos: Video[] = res.body.data
460 expect(videos).to.have.lengthOf(2)
461
462 const v1 = videos.find(v => v.name === 'video user 2')
463 const v2 = videos.find(v => v.name === 'video server 2')
464
465 expect(v1).to.be.undefined
466 expect(v2).to.be.undefined
467 }
468 }
469 })
470
471 it('Should hide its comments')
472
473 it('Should list blocked servers', async function () {
474 const res = await getServerBlocklistByServer(servers[ 0 ].url, servers[ 0 ].accessToken, 0, 1, 'createdAt')
475 const blocks: ServerBlock[] = res.body.data
476
477 expect(res.body.total).to.equal(1)
478
479 const block = blocks[ 0 ]
480 expect(block.byAccount.displayName).to.equal('peertube')
481 expect(block.byAccount.name).to.equal('peertube')
482 expect(block.blockedServer.host).to.equal('localhost:9002')
483 })
484
485 it('Should unblock the remote server', async function () {
486 await removeServerFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, 'localhost:9002')
487 })
488
489 it('Should list all videos', async function () {
490 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
491 await checkAllVideos(servers[ 0 ].url, token)
492 }
493 })
494
495 it('Should list the comments', async function () {
496 for (const token of [ userModeratorToken, servers[ 0 ].accessToken ]) {
497 await checkAllComments(servers[ 0 ].url, token, videoUUID1)
498 }
499 })
500 })
501 })
502
503 after(async function () {
504 killallServers(servers)
505
506 // Keep the logs if the test failed
507 if (this[ 'ok' ]) {
508 await flushTests()
509 }
510 })
511})
diff --git a/server/tests/api/users/index.ts b/server/tests/api/users/index.ts
index 21d75da3e..52ba6984e 100644
--- a/server/tests/api/users/index.ts
+++ b/server/tests/api/users/index.ts
@@ -1,4 +1,6 @@
1import './users-verification'
2import './user-notifications'
3import './blocklist'
1import './user-subscriptions' 4import './user-subscriptions'
2import './users' 5import './users'
3import './users-verification'
4import './users-multiple-servers' 6import './users-multiple-servers'
diff --git a/server/tests/api/users/user-notifications.ts b/server/tests/api/users/user-notifications.ts
new file mode 100644
index 000000000..69e51677e
--- /dev/null
+++ b/server/tests/api/users/user-notifications.ts
@@ -0,0 +1,1053 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 addVideoToBlacklist,
7 createUser,
8 doubleFollow,
9 flushAndRunMultipleServers,
10 flushTests,
11 getMyUserInformation,
12 immutableAssign,
13 registerUser,
14 removeVideoFromBlacklist,
15 reportVideoAbuse,
16 updateMyUser,
17 updateVideo,
18 updateVideoChannel,
19 userLogin,
20 wait
21} from '../../../../shared/utils'
22import { killallServers, ServerInfo, uploadVideo } from '../../../../shared/utils/index'
23import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
24import { waitJobs } from '../../../../shared/utils/server/jobs'
25import { getUserNotificationSocket } from '../../../../shared/utils/socket/socket-io'
26import {
27 checkCommentMention,
28 CheckerBaseParams,
29 checkMyVideoImportIsFinished,
30 checkNewActorFollow,
31 checkNewBlacklistOnMyVideo,
32 checkNewCommentOnMyVideo,
33 checkNewVideoAbuseForModerators,
34 checkNewVideoFromSubscription,
35 checkUserRegistered,
36 checkVideoIsPublished,
37 getLastNotification,
38 getUserNotifications,
39 markAsReadNotifications,
40 updateMyNotificationSettings,
41 markAsReadAllNotifications
42} from '../../../../shared/utils/users/user-notifications'
43import {
44 User,
45 UserNotification,
46 UserNotificationSetting,
47 UserNotificationSettingValue,
48 UserNotificationType
49} from '../../../../shared/models/users'
50import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
51import { addUserSubscription, removeUserSubscription } from '../../../../shared/utils/users/user-subscriptions'
52import { VideoPrivacy } from '../../../../shared/models/videos'
53import { getBadVideoUrl, getYoutubeVideoUrl, importVideo } from '../../../../shared/utils/videos/video-imports'
54import { addVideoCommentReply, addVideoCommentThread } from '../../../../shared/utils/videos/video-comments'
55import * as uuidv4 from 'uuid/v4'
56import { addAccountToAccountBlocklist, removeAccountFromAccountBlocklist } from '../../../../shared/utils/users/blocklist'
57
58const expect = chai.expect
59
60async function uploadVideoByRemoteAccount (servers: ServerInfo[], additionalParams: any = {}) {
61 const name = 'remote video ' + uuidv4()
62
63 const data = Object.assign({ name }, additionalParams)
64 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, data)
65
66 await waitJobs(servers)
67
68 return { uuid: res.body.video.uuid, name }
69}
70
71async function uploadVideoByLocalAccount (servers: ServerInfo[], additionalParams: any = {}) {
72 const name = 'local video ' + uuidv4()
73
74 const data = Object.assign({ name }, additionalParams)
75 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, data)
76
77 await waitJobs(servers)
78
79 return { uuid: res.body.video.uuid, name }
80}
81
82describe('Test users notifications', function () {
83 let servers: ServerInfo[] = []
84 let userAccessToken: string
85 let userNotifications: UserNotification[] = []
86 let adminNotifications: UserNotification[] = []
87 let adminNotificationsServer2: UserNotification[] = []
88 const emails: object[] = []
89 let channelId: number
90
91 const allNotificationSettings: UserNotificationSetting = {
92 newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
93 newCommentOnMyVideo: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
94 videoAbuseAsModerator: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
95 blacklistOnMyVideo: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
96 myVideoImportFinished: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
97 myVideoPublished: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
98 commentMention: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
99 newFollow: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
100 newUserRegistration: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
101 }
102
103 before(async function () {
104 this.timeout(120000)
105
106 await MockSmtpServer.Instance.collectEmails(emails)
107
108 await flushTests()
109
110 const overrideConfig = {
111 smtp: {
112 hostname: 'localhost'
113 }
114 }
115 servers = await flushAndRunMultipleServers(2, overrideConfig)
116
117 // Get the access tokens
118 await setAccessTokensToServers(servers)
119
120 // Server 1 and server 2 follow each other
121 await doubleFollow(servers[0], servers[1])
122
123 await waitJobs(servers)
124
125 const user = {
126 username: 'user_1',
127 password: 'super password'
128 }
129 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password, 10 * 1000 * 1000)
130 userAccessToken = await userLogin(servers[0], user)
131
132 await updateMyNotificationSettings(servers[0].url, userAccessToken, allNotificationSettings)
133 await updateMyNotificationSettings(servers[0].url, servers[0].accessToken, allNotificationSettings)
134 await updateMyNotificationSettings(servers[1].url, servers[1].accessToken, allNotificationSettings)
135
136 {
137 const socket = getUserNotificationSocket(servers[ 0 ].url, userAccessToken)
138 socket.on('new-notification', n => userNotifications.push(n))
139 }
140 {
141 const socket = getUserNotificationSocket(servers[ 0 ].url, servers[0].accessToken)
142 socket.on('new-notification', n => adminNotifications.push(n))
143 }
144 {
145 const socket = getUserNotificationSocket(servers[ 1 ].url, servers[1].accessToken)
146 socket.on('new-notification', n => adminNotificationsServer2.push(n))
147 }
148
149 {
150 const resChannel = await getMyUserInformation(servers[0].url, servers[0].accessToken)
151 channelId = resChannel.body.videoChannels[0].id
152 }
153 })
154
155 describe('New video from my subscription notification', function () {
156 let baseParams: CheckerBaseParams
157
158 before(() => {
159 baseParams = {
160 server: servers[0],
161 emails,
162 socketNotifications: userNotifications,
163 token: userAccessToken
164 }
165 })
166
167 it('Should not send notifications if the user does not follow the video publisher', async function () {
168 this.timeout(10000)
169
170 await uploadVideoByLocalAccount(servers)
171
172 const notification = await getLastNotification(servers[ 0 ].url, userAccessToken)
173 expect(notification).to.be.undefined
174
175 expect(emails).to.have.lengthOf(0)
176 expect(userNotifications).to.have.lengthOf(0)
177 })
178
179 it('Should send a new video notification if the user follows the local video publisher', async function () {
180 this.timeout(15000)
181
182 await addUserSubscription(servers[0].url, userAccessToken, 'root_channel@localhost:9001')
183 await waitJobs(servers)
184
185 const { name, uuid } = await uploadVideoByLocalAccount(servers)
186 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
187 })
188
189 it('Should send a new video notification from a remote account', async function () {
190 this.timeout(50000) // Server 2 has transcoding enabled
191
192 await addUserSubscription(servers[0].url, userAccessToken, 'root_channel@localhost:9002')
193 await waitJobs(servers)
194
195 const { name, uuid } = await uploadVideoByRemoteAccount(servers)
196 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
197 })
198
199 it('Should send a new video notification on a scheduled publication', async function () {
200 this.timeout(20000)
201
202 // In 2 seconds
203 let updateAt = new Date(new Date().getTime() + 2000)
204
205 const data = {
206 privacy: VideoPrivacy.PRIVATE,
207 scheduleUpdate: {
208 updateAt: updateAt.toISOString(),
209 privacy: VideoPrivacy.PUBLIC
210 }
211 }
212 const { name, uuid } = await uploadVideoByLocalAccount(servers, data)
213
214 await wait(6000)
215 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
216 })
217
218 it('Should send a new video notification on a remote scheduled publication', async function () {
219 this.timeout(20000)
220
221 // In 2 seconds
222 let updateAt = new Date(new Date().getTime() + 2000)
223
224 const data = {
225 privacy: VideoPrivacy.PRIVATE,
226 scheduleUpdate: {
227 updateAt: updateAt.toISOString(),
228 privacy: VideoPrivacy.PUBLIC
229 }
230 }
231 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
232 await waitJobs(servers)
233
234 await wait(6000)
235 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
236 })
237
238 it('Should not send a notification before the video is published', async function () {
239 this.timeout(20000)
240
241 let updateAt = new Date(new Date().getTime() + 100000)
242
243 const data = {
244 privacy: VideoPrivacy.PRIVATE,
245 scheduleUpdate: {
246 updateAt: updateAt.toISOString(),
247 privacy: VideoPrivacy.PUBLIC
248 }
249 }
250 const { name, uuid } = await uploadVideoByLocalAccount(servers, data)
251
252 await wait(6000)
253 await checkNewVideoFromSubscription(baseParams, name, uuid, 'absence')
254 })
255
256 it('Should send a new video notification when a video becomes public', async function () {
257 this.timeout(10000)
258
259 const data = { privacy: VideoPrivacy.PRIVATE }
260 const { name, uuid } = await uploadVideoByLocalAccount(servers, data)
261
262 await checkNewVideoFromSubscription(baseParams, name, uuid, 'absence')
263
264 await updateVideo(servers[0].url, servers[0].accessToken, uuid, { privacy: VideoPrivacy.PUBLIC })
265
266 await wait(500)
267 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
268 })
269
270 it('Should send a new video notification when a remote video becomes public', async function () {
271 this.timeout(20000)
272
273 const data = { privacy: VideoPrivacy.PRIVATE }
274 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
275
276 await checkNewVideoFromSubscription(baseParams, name, uuid, 'absence')
277
278 await updateVideo(servers[1].url, servers[1].accessToken, uuid, { privacy: VideoPrivacy.PUBLIC })
279
280 await waitJobs(servers)
281 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
282 })
283
284 it('Should not send a new video notification when a video becomes unlisted', async function () {
285 this.timeout(20000)
286
287 const data = { privacy: VideoPrivacy.PRIVATE }
288 const { name, uuid } = await uploadVideoByLocalAccount(servers, data)
289
290 await updateVideo(servers[0].url, servers[0].accessToken, uuid, { privacy: VideoPrivacy.UNLISTED })
291
292 await checkNewVideoFromSubscription(baseParams, name, uuid, 'absence')
293 })
294
295 it('Should not send a new video notification when a remote video becomes unlisted', async function () {
296 this.timeout(20000)
297
298 const data = { privacy: VideoPrivacy.PRIVATE }
299 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
300
301 await updateVideo(servers[1].url, servers[1].accessToken, uuid, { privacy: VideoPrivacy.UNLISTED })
302
303 await waitJobs(servers)
304 await checkNewVideoFromSubscription(baseParams, name, uuid, 'absence')
305 })
306
307 it('Should send a new video notification after a video import', async function () {
308 this.timeout(30000)
309
310 const name = 'video import ' + uuidv4()
311
312 const attributes = {
313 name,
314 channelId,
315 privacy: VideoPrivacy.PUBLIC,
316 targetUrl: getYoutubeVideoUrl()
317 }
318 const res = await importVideo(servers[0].url, servers[0].accessToken, attributes)
319 const uuid = res.body.video.uuid
320
321 await waitJobs(servers)
322
323 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
324 })
325 })
326
327 describe('Comment on my video notifications', function () {
328 let baseParams: CheckerBaseParams
329
330 before(() => {
331 baseParams = {
332 server: servers[0],
333 emails,
334 socketNotifications: userNotifications,
335 token: userAccessToken
336 }
337 })
338
339 it('Should not send a new comment notification after a comment on another video', async function () {
340 this.timeout(10000)
341
342 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
343 const uuid = resVideo.body.video.uuid
344
345 const resComment = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, 'comment')
346 const commentId = resComment.body.comment.id
347
348 await wait(500)
349 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')
350 })
351
352 it('Should not send a new comment notification if I comment my own video', async function () {
353 this.timeout(10000)
354
355 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
356 const uuid = resVideo.body.video.uuid
357
358 const resComment = await addVideoCommentThread(servers[0].url, userAccessToken, uuid, 'comment')
359 const commentId = resComment.body.comment.id
360
361 await wait(500)
362 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')
363 })
364
365 it('Should not send a new comment notification if the account is muted', async function () {
366 this.timeout(10000)
367
368 await addAccountToAccountBlocklist(servers[ 0 ].url, userAccessToken, 'root')
369
370 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
371 const uuid = resVideo.body.video.uuid
372
373 const resComment = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, 'comment')
374 const commentId = resComment.body.comment.id
375
376 await wait(500)
377 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')
378
379 await removeAccountFromAccountBlocklist(servers[ 0 ].url, userAccessToken, 'root')
380 })
381
382 it('Should send a new comment notification after a local comment on my video', async function () {
383 this.timeout(10000)
384
385 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
386 const uuid = resVideo.body.video.uuid
387
388 const resComment = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, 'comment')
389 const commentId = resComment.body.comment.id
390
391 await wait(500)
392 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'presence')
393 })
394
395 it('Should send a new comment notification after a remote comment on my video', async function () {
396 this.timeout(10000)
397
398 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
399 const uuid = resVideo.body.video.uuid
400
401 await waitJobs(servers)
402
403 const resComment = await addVideoCommentThread(servers[1].url, servers[1].accessToken, uuid, 'comment')
404 const commentId = resComment.body.comment.id
405
406 await waitJobs(servers)
407 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'presence')
408 })
409
410 it('Should send a new comment notification after a local reply on my video', async function () {
411 this.timeout(10000)
412
413 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
414 const uuid = resVideo.body.video.uuid
415
416 const resThread = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, 'comment')
417 const threadId = resThread.body.comment.id
418
419 const resComment = await addVideoCommentReply(servers[0].url, servers[0].accessToken, uuid, threadId, 'reply')
420 const commentId = resComment.body.comment.id
421
422 await wait(500)
423 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, threadId, 'presence')
424 })
425
426 it('Should send a new comment notification after a remote reply on my video', async function () {
427 this.timeout(10000)
428
429 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
430 const uuid = resVideo.body.video.uuid
431 await waitJobs(servers)
432
433 const resThread = await addVideoCommentThread(servers[1].url, servers[1].accessToken, uuid, 'comment')
434 const threadId = resThread.body.comment.id
435
436 const resComment = await addVideoCommentReply(servers[1].url, servers[1].accessToken, uuid, threadId, 'reply')
437 const commentId = resComment.body.comment.id
438
439 await waitJobs(servers)
440 await checkNewCommentOnMyVideo(baseParams, uuid, commentId, threadId, 'presence')
441 })
442 })
443
444 describe('Mention notifications', function () {
445 let baseParams: CheckerBaseParams
446
447 before(async () => {
448 baseParams = {
449 server: servers[0],
450 emails,
451 socketNotifications: userNotifications,
452 token: userAccessToken
453 }
454
455 await updateMyUser({
456 url: servers[0].url,
457 accessToken: servers[0].accessToken,
458 displayName: 'super root name'
459 })
460
461 await updateMyUser({
462 url: servers[1].url,
463 accessToken: servers[1].accessToken,
464 displayName: 'super root 2 name'
465 })
466 })
467
468 it('Should not send a new mention comment notification if I mention the video owner', async function () {
469 this.timeout(10000)
470
471 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name: 'super video' })
472 const uuid = resVideo.body.video.uuid
473
474 const resComment = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, '@user_1 hello')
475 const commentId = resComment.body.comment.id
476
477 await wait(500)
478 await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')
479 })
480
481 it('Should not send a new mention comment notification if I mention myself', async function () {
482 this.timeout(10000)
483
484 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
485 const uuid = resVideo.body.video.uuid
486
487 const resComment = await addVideoCommentThread(servers[0].url, userAccessToken, uuid, '@user_1 hello')
488 const commentId = resComment.body.comment.id
489
490 await wait(500)
491 await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')
492 })
493
494 it('Should not send a new mention notification if the account is muted', async function () {
495 this.timeout(10000)
496
497 await addAccountToAccountBlocklist(servers[ 0 ].url, userAccessToken, 'root')
498
499 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
500 const uuid = resVideo.body.video.uuid
501
502 const resComment = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, '@user_1 hello')
503 const commentId = resComment.body.comment.id
504
505 await wait(500)
506 await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')
507
508 await removeAccountFromAccountBlocklist(servers[ 0 ].url, userAccessToken, 'root')
509 })
510
511 it('Should send a new mention notification after local comments', async function () {
512 this.timeout(10000)
513
514 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
515 const uuid = resVideo.body.video.uuid
516
517 const resThread = await addVideoCommentThread(servers[0].url, servers[0].accessToken, uuid, '@user_1 hello 1')
518 const threadId = resThread.body.comment.id
519
520 await wait(500)
521 await checkCommentMention(baseParams, uuid, threadId, threadId, 'super root name', 'presence')
522
523 const resComment = await addVideoCommentReply(servers[0].url, servers[0].accessToken, uuid, threadId, 'hello 2 @user_1')
524 const commentId = resComment.body.comment.id
525
526 await wait(500)
527 await checkCommentMention(baseParams, uuid, commentId, threadId, 'super root name', 'presence')
528 })
529
530 it('Should send a new mention notification after remote comments', async function () {
531 this.timeout(20000)
532
533 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
534 const uuid = resVideo.body.video.uuid
535
536 await waitJobs(servers)
537 const resThread = await addVideoCommentThread(servers[1].url, servers[1].accessToken, uuid, 'hello @user_1@localhost:9001 1')
538 const threadId = resThread.body.comment.id
539
540 await waitJobs(servers)
541 await checkCommentMention(baseParams, uuid, threadId, threadId, 'super root 2 name', 'presence')
542
543 const text = '@user_1@localhost:9001 hello 2 @root@localhost:9001'
544 const resComment = await addVideoCommentReply(servers[1].url, servers[1].accessToken, uuid, threadId, text)
545 const commentId = resComment.body.comment.id
546
547 await waitJobs(servers)
548 await checkCommentMention(baseParams, uuid, commentId, threadId, 'super root 2 name', 'presence')
549 })
550 })
551
552 describe('Video abuse for moderators notification' , function () {
553 let baseParams: CheckerBaseParams
554
555 before(() => {
556 baseParams = {
557 server: servers[0],
558 emails,
559 socketNotifications: adminNotifications,
560 token: servers[0].accessToken
561 }
562 })
563
564 it('Should send a notification to moderators on local video abuse', async function () {
565 this.timeout(10000)
566
567 const name = 'video for abuse ' + uuidv4()
568 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name })
569 const uuid = resVideo.body.video.uuid
570
571 await reportVideoAbuse(servers[0].url, servers[0].accessToken, uuid, 'super reason')
572
573 await waitJobs(servers)
574 await checkNewVideoAbuseForModerators(baseParams, uuid, name, 'presence')
575 })
576
577 it('Should send a notification to moderators on remote video abuse', async function () {
578 this.timeout(10000)
579
580 const name = 'video for abuse ' + uuidv4()
581 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name })
582 const uuid = resVideo.body.video.uuid
583
584 await waitJobs(servers)
585
586 await reportVideoAbuse(servers[1].url, servers[1].accessToken, uuid, 'super reason')
587
588 await waitJobs(servers)
589 await checkNewVideoAbuseForModerators(baseParams, uuid, name, 'presence')
590 })
591 })
592
593 describe('Video blacklist on my video', function () {
594 let baseParams: CheckerBaseParams
595
596 before(() => {
597 baseParams = {
598 server: servers[0],
599 emails,
600 socketNotifications: userNotifications,
601 token: userAccessToken
602 }
603 })
604
605 it('Should send a notification to video owner on blacklist', async function () {
606 this.timeout(10000)
607
608 const name = 'video for abuse ' + uuidv4()
609 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name })
610 const uuid = resVideo.body.video.uuid
611
612 await addVideoToBlacklist(servers[0].url, servers[0].accessToken, uuid)
613
614 await waitJobs(servers)
615 await checkNewBlacklistOnMyVideo(baseParams, uuid, name, 'blacklist')
616 })
617
618 it('Should send a notification to video owner on unblacklist', async function () {
619 this.timeout(10000)
620
621 const name = 'video for abuse ' + uuidv4()
622 const resVideo = await uploadVideo(servers[0].url, userAccessToken, { name })
623 const uuid = resVideo.body.video.uuid
624
625 await addVideoToBlacklist(servers[0].url, servers[0].accessToken, uuid)
626
627 await waitJobs(servers)
628 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, uuid)
629 await waitJobs(servers)
630
631 await wait(500)
632 await checkNewBlacklistOnMyVideo(baseParams, uuid, name, 'unblacklist')
633 })
634 })
635
636 describe('My video is published', function () {
637 let baseParams: CheckerBaseParams
638
639 before(() => {
640 baseParams = {
641 server: servers[1],
642 emails,
643 socketNotifications: adminNotificationsServer2,
644 token: servers[1].accessToken
645 }
646 })
647
648 it('Should not send a notification if transcoding is not enabled', async function () {
649 this.timeout(10000)
650
651 const { name, uuid } = await uploadVideoByLocalAccount(servers)
652 await waitJobs(servers)
653
654 await checkVideoIsPublished(baseParams, name, uuid, 'absence')
655 })
656
657 it('Should not send a notification if the wait transcoding is false', async function () {
658 this.timeout(50000)
659
660 await uploadVideoByRemoteAccount(servers, { waitTranscoding: false })
661 await waitJobs(servers)
662
663 const notification = await getLastNotification(servers[ 0 ].url, userAccessToken)
664 if (notification) {
665 expect(notification.type).to.not.equal(UserNotificationType.MY_VIDEO_PUBLISHED)
666 }
667 })
668
669 it('Should send a notification even if the video is not transcoded in other resolutions', async function () {
670 this.timeout(50000)
671
672 const { name, uuid } = await uploadVideoByRemoteAccount(servers, { waitTranscoding: true, fixture: 'video_short_240p.mp4' })
673 await waitJobs(servers)
674
675 await checkVideoIsPublished(baseParams, name, uuid, 'presence')
676 })
677
678 it('Should send a notification with a transcoded video', async function () {
679 this.timeout(50000)
680
681 const { name, uuid } = await uploadVideoByRemoteAccount(servers, { waitTranscoding: true })
682 await waitJobs(servers)
683
684 await checkVideoIsPublished(baseParams, name, uuid, 'presence')
685 })
686
687 it('Should send a notification when an imported video is transcoded', async function () {
688 this.timeout(50000)
689
690 const name = 'video import ' + uuidv4()
691
692 const attributes = {
693 name,
694 channelId,
695 privacy: VideoPrivacy.PUBLIC,
696 targetUrl: getYoutubeVideoUrl(),
697 waitTranscoding: true
698 }
699 const res = await importVideo(servers[1].url, servers[1].accessToken, attributes)
700 const uuid = res.body.video.uuid
701
702 await waitJobs(servers)
703 await checkVideoIsPublished(baseParams, name, uuid, 'presence')
704 })
705
706 it('Should send a notification when the scheduled update has been proceeded', async function () {
707 this.timeout(70000)
708
709 // In 2 seconds
710 let updateAt = new Date(new Date().getTime() + 2000)
711
712 const data = {
713 privacy: VideoPrivacy.PRIVATE,
714 scheduleUpdate: {
715 updateAt: updateAt.toISOString(),
716 privacy: VideoPrivacy.PUBLIC
717 }
718 }
719 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
720
721 await wait(6000)
722 await checkVideoIsPublished(baseParams, name, uuid, 'presence')
723 })
724
725 it('Should not send a notification before the video is published', async function () {
726 this.timeout(20000)
727
728 let updateAt = new Date(new Date().getTime() + 100000)
729
730 const data = {
731 privacy: VideoPrivacy.PRIVATE,
732 scheduleUpdate: {
733 updateAt: updateAt.toISOString(),
734 privacy: VideoPrivacy.PUBLIC
735 }
736 }
737 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
738
739 await wait(6000)
740 await checkVideoIsPublished(baseParams, name, uuid, 'absence')
741 })
742 })
743
744 describe('My video is imported', function () {
745 let baseParams: CheckerBaseParams
746
747 before(() => {
748 baseParams = {
749 server: servers[0],
750 emails,
751 socketNotifications: adminNotifications,
752 token: servers[0].accessToken
753 }
754 })
755
756 it('Should send a notification when the video import failed', async function () {
757 this.timeout(70000)
758
759 const name = 'video import ' + uuidv4()
760
761 const attributes = {
762 name,
763 channelId,
764 privacy: VideoPrivacy.PRIVATE,
765 targetUrl: getBadVideoUrl()
766 }
767 const res = await importVideo(servers[0].url, servers[0].accessToken, attributes)
768 const uuid = res.body.video.uuid
769
770 await waitJobs(servers)
771 await checkMyVideoImportIsFinished(baseParams, name, uuid, getBadVideoUrl(), false, 'presence')
772 })
773
774 it('Should send a notification when the video import succeeded', async function () {
775 this.timeout(70000)
776
777 const name = 'video import ' + uuidv4()
778
779 const attributes = {
780 name,
781 channelId,
782 privacy: VideoPrivacy.PRIVATE,
783 targetUrl: getYoutubeVideoUrl()
784 }
785 const res = await importVideo(servers[0].url, servers[0].accessToken, attributes)
786 const uuid = res.body.video.uuid
787
788 await waitJobs(servers)
789 await checkMyVideoImportIsFinished(baseParams, name, uuid, getYoutubeVideoUrl(), true, 'presence')
790 })
791 })
792
793 describe('New registration', function () {
794 let baseParams: CheckerBaseParams
795
796 before(() => {
797 baseParams = {
798 server: servers[0],
799 emails,
800 socketNotifications: adminNotifications,
801 token: servers[0].accessToken
802 }
803 })
804
805 it('Should send a notification only to moderators when a user registers on the instance', async function () {
806 this.timeout(10000)
807
808 await registerUser(servers[0].url, 'user_45', 'password')
809
810 await waitJobs(servers)
811
812 await checkUserRegistered(baseParams, 'user_45', 'presence')
813
814 const userOverride = { socketNotifications: userNotifications, token: userAccessToken, check: { web: true, mail: false } }
815 await checkUserRegistered(immutableAssign(baseParams, userOverride), 'user_45', 'absence')
816 })
817 })
818
819 describe('New actor follow', function () {
820 let baseParams: CheckerBaseParams
821 let myChannelName = 'super channel name'
822 let myUserName = 'super user name'
823
824 before(async () => {
825 baseParams = {
826 server: servers[0],
827 emails,
828 socketNotifications: userNotifications,
829 token: userAccessToken
830 }
831
832 await updateMyUser({
833 url: servers[0].url,
834 accessToken: servers[0].accessToken,
835 displayName: 'super root name'
836 })
837
838 await updateMyUser({
839 url: servers[0].url,
840 accessToken: userAccessToken,
841 displayName: myUserName
842 })
843
844 await updateMyUser({
845 url: servers[1].url,
846 accessToken: servers[1].accessToken,
847 displayName: 'super root 2 name'
848 })
849
850 await updateVideoChannel(servers[0].url, userAccessToken, 'user_1_channel', { displayName: myChannelName })
851 })
852
853 it('Should notify when a local channel is following one of our channel', async function () {
854 this.timeout(10000)
855
856 await addUserSubscription(servers[0].url, servers[0].accessToken, 'user_1_channel@localhost:9001')
857 await waitJobs(servers)
858
859 await checkNewActorFollow(baseParams, 'channel', 'root', 'super root name', myChannelName, 'presence')
860
861 await removeUserSubscription(servers[0].url, servers[0].accessToken, 'user_1_channel@localhost:9001')
862 })
863
864 it('Should notify when a remote channel is following one of our channel', async function () {
865 this.timeout(10000)
866
867 await addUserSubscription(servers[1].url, servers[1].accessToken, 'user_1_channel@localhost:9001')
868 await waitJobs(servers)
869
870 await checkNewActorFollow(baseParams, 'channel', 'root', 'super root 2 name', myChannelName, 'presence')
871
872 await removeUserSubscription(servers[1].url, servers[1].accessToken, 'user_1_channel@localhost:9001')
873 })
874
875 it('Should notify when a local account is following one of our channel', async function () {
876 this.timeout(10000)
877
878 await addUserSubscription(servers[0].url, servers[0].accessToken, 'user_1@localhost:9001')
879
880 await waitJobs(servers)
881
882 await checkNewActorFollow(baseParams, 'account', 'root', 'super root name', myUserName, 'presence')
883 })
884
885 it('Should notify when a remote account is following one of our channel', async function () {
886 this.timeout(10000)
887
888 await addUserSubscription(servers[1].url, servers[1].accessToken, 'user_1@localhost:9001')
889
890 await waitJobs(servers)
891
892 await checkNewActorFollow(baseParams, 'account', 'root', 'super root 2 name', myUserName, 'presence')
893 })
894 })
895
896 describe('Mark as read', function () {
897 it('Should mark as read some notifications', async function () {
898 const res = await getUserNotifications(servers[ 0 ].url, userAccessToken, 2, 3)
899 const ids = res.body.data.map(n => n.id)
900
901 await markAsReadNotifications(servers[ 0 ].url, userAccessToken, ids)
902 })
903
904 it('Should have the notifications marked as read', async function () {
905 const res = await getUserNotifications(servers[ 0 ].url, userAccessToken, 0, 10)
906
907 const notifications = res.body.data as UserNotification[]
908 expect(notifications[ 0 ].read).to.be.false
909 expect(notifications[ 1 ].read).to.be.false
910 expect(notifications[ 2 ].read).to.be.true
911 expect(notifications[ 3 ].read).to.be.true
912 expect(notifications[ 4 ].read).to.be.true
913 expect(notifications[ 5 ].read).to.be.false
914 })
915
916 it('Should only list read notifications', async function () {
917 const res = await getUserNotifications(servers[ 0 ].url, userAccessToken, 0, 10, false)
918
919 const notifications = res.body.data as UserNotification[]
920 for (const notification of notifications) {
921 expect(notification.read).to.be.true
922 }
923 })
924
925 it('Should only list unread notifications', async function () {
926 const res = await getUserNotifications(servers[ 0 ].url, userAccessToken, 0, 10, true)
927
928 const notifications = res.body.data as UserNotification[]
929 for (const notification of notifications) {
930 expect(notification.read).to.be.false
931 }
932 })
933
934 it('Should mark as read all notifications', async function () {
935 await markAsReadAllNotifications(servers[ 0 ].url, userAccessToken)
936
937 const res = await getUserNotifications(servers[ 0 ].url, userAccessToken, 0, 10, true)
938
939 expect(res.body.total).to.equal(0)
940 expect(res.body.data).to.have.lengthOf(0)
941 })
942 })
943
944 describe('Notification settings', function () {
945 let baseParams: CheckerBaseParams
946
947 before(() => {
948 baseParams = {
949 server: servers[0],
950 emails,
951 socketNotifications: userNotifications,
952 token: userAccessToken
953 }
954 })
955
956 it('Should not have notifications', async function () {
957 this.timeout(10000)
958
959 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
960 newVideoFromSubscription: UserNotificationSettingValue.NONE
961 }))
962
963 {
964 const res = await getMyUserInformation(servers[0].url, userAccessToken)
965 const info = res.body as User
966 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.NONE)
967 }
968
969 const { name, uuid } = await uploadVideoByLocalAccount(servers)
970
971 const check = { web: true, mail: true }
972 await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence')
973 })
974
975 it('Should only have web notifications', async function () {
976 this.timeout(10000)
977
978 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
979 newVideoFromSubscription: UserNotificationSettingValue.WEB
980 }))
981
982 {
983 const res = await getMyUserInformation(servers[0].url, userAccessToken)
984 const info = res.body as User
985 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.WEB)
986 }
987
988 const { name, uuid } = await uploadVideoByLocalAccount(servers)
989
990 {
991 const check = { mail: true, web: false }
992 await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence')
993 }
994
995 {
996 const check = { mail: false, web: true }
997 await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'presence')
998 }
999 })
1000
1001 it('Should only have mail notifications', async function () {
1002 this.timeout(10000)
1003
1004 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
1005 newVideoFromSubscription: UserNotificationSettingValue.EMAIL
1006 }))
1007
1008 {
1009 const res = await getMyUserInformation(servers[0].url, userAccessToken)
1010 const info = res.body as User
1011 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.EMAIL)
1012 }
1013
1014 const { name, uuid } = await uploadVideoByLocalAccount(servers)
1015
1016 {
1017 const check = { mail: false, web: true }
1018 await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence')
1019 }
1020
1021 {
1022 const check = { mail: true, web: false }
1023 await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'presence')
1024 }
1025 })
1026
1027 it('Should have email and web notifications', async function () {
1028 this.timeout(10000)
1029
1030 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
1031 newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
1032 }))
1033
1034 {
1035 const res = await getMyUserInformation(servers[0].url, userAccessToken)
1036 const info = res.body as User
1037 expect(info.notificationSettings.newVideoFromSubscription).to.equal(
1038 UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
1039 )
1040 }
1041
1042 const { name, uuid } = await uploadVideoByLocalAccount(servers)
1043
1044 await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence')
1045 })
1046 })
1047
1048 after(async function () {
1049 MockSmtpServer.Instance.kill()
1050
1051 killallServers(servers)
1052 })
1053})
diff --git a/server/tests/api/users/user-subscriptions.ts b/server/tests/api/users/user-subscriptions.ts
index 65b80540c..88a7187d6 100644
--- a/server/tests/api/users/user-subscriptions.ts
+++ b/server/tests/api/users/user-subscriptions.ts
@@ -2,18 +2,27 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { createUser, doubleFollow, flushAndRunMultipleServers, follow, getVideosList, unfollow, updateVideo, userLogin } from '../../utils' 5import {
6import { killallServers, ServerInfo, uploadVideo } from '../../utils/index' 6 createUser,
7import { setAccessTokensToServers } from '../../utils/users/login' 7 doubleFollow,
8 flushAndRunMultipleServers,
9 follow,
10 getVideosList,
11 unfollow,
12 updateVideo,
13 userLogin
14} from '../../../../shared/utils'
15import { killallServers, ServerInfo, uploadVideo } from '../../../../shared/utils/index'
16import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
8import { Video, VideoChannel } from '../../../../shared/models/videos' 17import { Video, VideoChannel } from '../../../../shared/models/videos'
9import { waitJobs } from '../../utils/server/jobs' 18import { waitJobs } from '../../../../shared/utils/server/jobs'
10import { 19import {
11 addUserSubscription, 20 addUserSubscription,
12 listUserSubscriptions, 21 listUserSubscriptions,
13 listUserSubscriptionVideos, 22 listUserSubscriptionVideos,
14 removeUserSubscription, 23 removeUserSubscription,
15 getUserSubscription, areSubscriptionsExist 24 getUserSubscription, areSubscriptionsExist
16} from '../../utils/users/user-subscriptions' 25} from '../../../../shared/utils/users/user-subscriptions'
17 26
18const expect = chai.expect 27const expect = chai.expect
19 28
diff --git a/server/tests/api/users/users-multiple-servers.ts b/server/tests/api/users/users-multiple-servers.ts
index d8699db17..006d6cdf0 100644
--- a/server/tests/api/users/users-multiple-servers.ts
+++ b/server/tests/api/users/users-multiple-servers.ts
@@ -13,13 +13,13 @@ import {
13 removeUser, 13 removeUser,
14 updateMyUser, 14 updateMyUser,
15 userLogin 15 userLogin
16} from '../../utils' 16} from '../../../../shared/utils'
17import { getMyUserInformation, killallServers, ServerInfo, testImage, updateMyAvatar, uploadVideo } from '../../utils/index' 17import { getMyUserInformation, killallServers, ServerInfo, testImage, updateMyAvatar, uploadVideo } from '../../../../shared/utils/index'
18import { checkActorFilesWereRemoved, getAccount, getAccountsList } from '../../utils/users/accounts' 18import { checkActorFilesWereRemoved, getAccount, getAccountsList } from '../../../../shared/utils/users/accounts'
19import { setAccessTokensToServers } from '../../utils/users/login' 19import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
20import { User } from '../../../../shared/models/users' 20import { User } from '../../../../shared/models/users'
21import { VideoChannel } from '../../../../shared/models/videos' 21import { VideoChannel } from '../../../../shared/models/videos'
22import { waitJobs } from '../../utils/server/jobs' 22import { waitJobs } from '../../../../shared/utils/server/jobs'
23 23
24const expect = chai.expect 24const expect = chai.expect
25 25
diff --git a/server/tests/api/users/users-verification.ts b/server/tests/api/users/users-verification.ts
index fa5f5e371..babeda2b8 100644
--- a/server/tests/api/users/users-verification.ts
+++ b/server/tests/api/users/users-verification.ts
@@ -4,11 +4,11 @@ import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { 5import {
6 registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers, 6 registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers,
7 userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig 7 userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig, wait
8} from '../../utils' 8} from '../../../../shared/utils'
9import { setAccessTokensToServers } from '../../utils/users/login' 9import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
10import { mockSmtpServer } from '../../utils/miscs/email' 10import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
11import { waitJobs } from '../../utils/server/jobs' 11import { waitJobs } from '../../../../shared/utils/server/jobs'
12 12
13const expect = chai.expect 13const expect = chai.expect
14 14
@@ -30,7 +30,7 @@ describe('Test users account verification', function () {
30 before(async function () { 30 before(async function () {
31 this.timeout(30000) 31 this.timeout(30000)
32 32
33 await mockSmtpServer(emails) 33 await MockSmtpServer.Instance.collectEmails(emails)
34 34
35 await flushTests() 35 await flushTests()
36 36
@@ -123,6 +123,7 @@ describe('Test users account verification', function () {
123 }) 123 })
124 124
125 after(async function () { 125 after(async function () {
126 MockSmtpServer.Instance.kill()
126 killallServers([ server ]) 127 killallServers([ server ])
127 128
128 // Keep the logs if the test failed 129 // Keep the logs if the test failed
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts
index 8b9c6b455..c4465d541 100644
--- a/server/tests/api/users/users.ts
+++ b/server/tests/api/users/users.ts
@@ -32,10 +32,10 @@ import {
32 updateUser, 32 updateUser,
33 uploadVideo, 33 uploadVideo,
34 userLogin 34 userLogin
35} from '../../utils/index' 35} from '../../../../shared/utils/index'
36import { follow } from '../../utils/server/follows' 36import { follow } from '../../../../shared/utils/server/follows'
37import { setAccessTokensToServers } from '../../utils/users/login' 37import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
38import { getMyVideos } from '../../utils/videos/videos' 38import { getMyVideos } from '../../../../shared/utils/videos/videos'
39 39
40const expect = chai.expect 40const expect = chai.expect
41 41
@@ -180,7 +180,7 @@ describe('Test users', function () {
180 it('Should be able to upload a video again') 180 it('Should be able to upload a video again')
181 181
182 it('Should be able to create a new user', async function () { 182 it('Should be able to create a new user', async function () {
183 await createUser(server.url, accessToken, user.username,user.password, 2 * 1024 * 1024) 183 await createUser(server.url, accessToken, user.username, user.password, 2 * 1024 * 1024)
184 }) 184 })
185 185
186 it('Should be able to login with this user', async function () { 186 it('Should be able to login with this user', async function () {
@@ -322,6 +322,40 @@ describe('Test users', function () {
322 expect(users[ 1 ].nsfwPolicy).to.equal('display') 322 expect(users[ 1 ].nsfwPolicy).to.equal('display')
323 }) 323 })
324 324
325 it('Should search user by username', async function () {
326 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'oot')
327 const users = res.body.data as User[]
328
329 expect(res.body.total).to.equal(1)
330 expect(users.length).to.equal(1)
331
332 expect(users[ 0 ].username).to.equal('root')
333 })
334
335 it('Should search user by email', async function () {
336 {
337 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'r_1@exam')
338 const users = res.body.data as User[]
339
340 expect(res.body.total).to.equal(1)
341 expect(users.length).to.equal(1)
342
343 expect(users[ 0 ].username).to.equal('user_1')
344 expect(users[ 0 ].email).to.equal('user_1@example.com')
345 }
346
347 {
348 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'example')
349 const users = res.body.data as User[]
350
351 expect(res.body.total).to.equal(2)
352 expect(users.length).to.equal(2)
353
354 expect(users[ 0 ].username).to.equal('root')
355 expect(users[ 1 ].username).to.equal('user_1')
356 }
357 })
358
325 it('Should update my password', async function () { 359 it('Should update my password', async function () {
326 await updateMyUser({ 360 await updateMyUser({
327 url: server.url, 361 url: server.url,
@@ -444,6 +478,7 @@ describe('Test users', function () {
444 userId, 478 userId,
445 accessToken, 479 accessToken,
446 email: 'updated2@example.com', 480 email: 'updated2@example.com',
481 emailVerified: true,
447 videoQuota: 42, 482 videoQuota: 42,
448 role: UserRole.MODERATOR 483 role: UserRole.MODERATOR
449 }) 484 })
@@ -453,6 +488,7 @@ describe('Test users', function () {
453 488
454 expect(user.username).to.equal('user_1') 489 expect(user.username).to.equal('user_1')
455 expect(user.email).to.equal('updated2@example.com') 490 expect(user.email).to.equal('updated2@example.com')
491 expect(user.emailVerified).to.be.true
456 expect(user.nsfwPolicy).to.equal('do_not_list') 492 expect(user.nsfwPolicy).to.equal('do_not_list')
457 expect(user.videoQuota).to.equal(42) 493 expect(user.videoQuota).to.equal(42)
458 expect(user.roleLabel).to.equal('Moderator') 494 expect(user.roleLabel).to.equal('Moderator')
@@ -465,8 +501,20 @@ describe('Test users', function () {
465 accessTokenUser = await userLogin(server, user) 501 accessTokenUser = await userLogin(server, user)
466 }) 502 })
467 503
468 it('Should not be able to delete a user by a moderator', async function () { 504 it('Should be able to update another user password', async function () {
469 await removeUser(server.url, 2, accessTokenUser, 403) 505 await updateUser({
506 url: server.url,
507 userId,
508 accessToken,
509 password: 'password updated'
510 })
511
512 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, 401)
513
514 await userLogin(server, user, 400)
515
516 user.password = 'password updated'
517 accessTokenUser = await userLogin(server, user)
470 }) 518 })
471 519
472 it('Should be able to list video blacklist by a moderator', async function () { 520 it('Should be able to list video blacklist by a moderator', async function () {
diff --git a/server/tests/api/videos/index.ts b/server/tests/api/videos/index.ts
index 09bb62a8d..a501a80b2 100644
--- a/server/tests/api/videos/index.ts
+++ b/server/tests/api/videos/index.ts
@@ -3,16 +3,17 @@ import './services'
3import './single-server' 3import './single-server'
4import './video-abuse' 4import './video-abuse'
5import './video-blacklist' 5import './video-blacklist'
6import './video-blacklist-management'
7import './video-captions' 6import './video-captions'
8import './video-change-ownership' 7import './video-change-ownership'
9import './video-channels' 8import './video-channels'
10import './video-comments' 9import './video-comments'
11import './video-description' 10import './video-description'
11import './video-hls'
12import './video-imports' 12import './video-imports'
13import './video-nsfw' 13import './video-nsfw'
14import './video-privacy' 14import './video-privacy'
15import './video-schedule-update' 15import './video-schedule-update'
16import './video-transcoder' 16import './video-transcoder'
17import './videos-filter'
17import './videos-history' 18import './videos-history'
18import './videos-overview' 19import './videos-overview'
diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts
index 99b74ccff..1b471ba79 100644
--- a/server/tests/api/videos/multiple-servers.ts
+++ b/server/tests/api/videos/multiple-servers.ts
@@ -8,6 +8,7 @@ import { VideoPrivacy } from '../../../../shared/models/videos'
8import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' 8import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
9import { 9import {
10 addVideoChannel, 10 addVideoChannel,
11 checkTmpIsEmpty,
11 checkVideoFilesWereRemoved, 12 checkVideoFilesWereRemoved,
12 completeVideoCheck, 13 completeVideoCheck,
13 createUser, 14 createUser,
@@ -31,15 +32,15 @@ import {
31 viewVideo, 32 viewVideo,
32 wait, 33 wait,
33 webtorrentAdd 34 webtorrentAdd
34} from '../../utils' 35} from '../../../../shared/utils'
35import { 36import {
36 addVideoCommentReply, 37 addVideoCommentReply,
37 addVideoCommentThread, 38 addVideoCommentThread,
38 deleteVideoComment, 39 deleteVideoComment,
39 getVideoCommentThreads, 40 getVideoCommentThreads,
40 getVideoThreadComments 41 getVideoThreadComments
41} from '../../utils/videos/video-comments' 42} from '../../../../shared/utils/videos/video-comments'
42import { waitJobs } from '../../utils/server/jobs' 43import { waitJobs } from '../../../../shared/utils/server/jobs'
43 44
44const expect = chai.expect 45const expect = chai.expect
45 46
@@ -995,19 +996,19 @@ describe('Test multiple servers', function () {
995 files: [ 996 files: [
996 { 997 {
997 resolution: 720, 998 resolution: 720,
998 size: 36000 999 size: 72000
999 }, 1000 },
1000 { 1001 {
1001 resolution: 480, 1002 resolution: 480,
1002 size: 21000 1003 size: 45000
1003 }, 1004 },
1004 { 1005 {
1005 resolution: 360, 1006 resolution: 360,
1006 size: 17000 1007 size: 34600
1007 }, 1008 },
1008 { 1009 {
1009 resolution: 240, 1010 resolution: 240,
1010 size: 13000 1011 size: 24770
1011 } 1012 }
1012 ] 1013 ]
1013 } 1014 }
@@ -1016,6 +1017,14 @@ describe('Test multiple servers', function () {
1016 }) 1017 })
1017 }) 1018 })
1018 1019
1020 describe('TMP directory', function () {
1021 it('Should have an empty tmp directory', async function () {
1022 for (const server of servers) {
1023 await checkTmpIsEmpty(server)
1024 }
1025 })
1026 })
1027
1019 after(async function () { 1028 after(async function () {
1020 killallServers(servers) 1029 killallServers(servers)
1021 1030
diff --git a/server/tests/api/videos/services.ts b/server/tests/api/videos/services.ts
index 2f1424292..2da86964f 100644
--- a/server/tests/api/videos/services.ts
+++ b/server/tests/api/videos/services.ts
@@ -2,8 +2,16 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { flushTests, getOEmbed, getVideosList, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils/index' 5import {
6import { runServer } from '../../utils/server/servers' 6 flushTests,
7 getOEmbed,
8 getVideosList,
9 killallServers,
10 ServerInfo,
11 setAccessTokensToServers,
12 uploadVideo
13} from '../../../../shared/utils/index'
14import { runServer } from '../../../../shared/utils/server/servers'
7 15
8const expect = chai.expect 16const expect = chai.expect
9 17
diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts
index 92d42eb80..cfdcbaf3f 100644
--- a/server/tests/api/videos/single-server.ts
+++ b/server/tests/api/videos/single-server.ts
@@ -28,7 +28,7 @@ import {
28 uploadVideo, 28 uploadVideo,
29 viewVideo, 29 viewVideo,
30 wait 30 wait
31} from '../../utils' 31} from '../../../../shared/utils'
32 32
33const expect = chai.expect 33const expect = chai.expect
34 34
@@ -120,7 +120,7 @@ describe('Test a single server', function () {
120 const categories = res.body 120 const categories = res.body
121 expect(Object.keys(categories)).to.have.length.above(10) 121 expect(Object.keys(categories)).to.have.length.above(10)
122 122
123 expect(categories[11]).to.equal('News') 123 expect(categories[11]).to.equal('News & Politics')
124 }) 124 })
125 125
126 it('Should list video licences', async function () { 126 it('Should list video licences', async function () {
diff --git a/server/tests/api/videos/video-abuse.ts b/server/tests/api/videos/video-abuse.ts
index a17f3c8de..3a7b623da 100644
--- a/server/tests/api/videos/video-abuse.ts
+++ b/server/tests/api/videos/video-abuse.ts
@@ -14,9 +14,9 @@ import {
14 setAccessTokensToServers, 14 setAccessTokensToServers,
15 updateVideoAbuse, 15 updateVideoAbuse,
16 uploadVideo 16 uploadVideo
17} from '../../utils/index' 17} from '../../../../shared/utils/index'
18import { doubleFollow } from '../../utils/server/follows' 18import { doubleFollow } from '../../../../shared/utils/server/follows'
19import { waitJobs } from '../../utils/server/jobs' 19import { waitJobs } from '../../../../shared/utils/server/jobs'
20 20
21const expect = chai.expect 21const expect = chai.expect
22 22
diff --git a/server/tests/api/videos/video-blacklist-management.ts b/server/tests/api/videos/video-blacklist-management.ts
deleted file mode 100644
index 7bf39dc99..000000000
--- a/server/tests/api/videos/video-blacklist-management.ts
+++ /dev/null
@@ -1,193 +0,0 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import * as lodash from 'lodash'
5import 'mocha'
6import {
7 addVideoToBlacklist,
8 flushAndRunMultipleServers,
9 getBlacklistedVideosList,
10 getMyVideos,
11 getSortedBlacklistedVideosList,
12 getVideosList,
13 killallServers,
14 removeVideoFromBlacklist,
15 ServerInfo,
16 setAccessTokensToServers,
17 updateVideoBlacklist,
18 uploadVideo
19} from '../../utils/index'
20import { doubleFollow } from '../../utils/server/follows'
21import { waitJobs } from '../../utils/server/jobs'
22import { VideoAbuse } from '../../../../shared/models/videos'
23
24const expect = chai.expect
25const orderBy = lodash.orderBy
26
27describe('Test video blacklist management', function () {
28 let servers: ServerInfo[] = []
29 let videoId: number
30
31 async function blacklistVideosOnServer (server: ServerInfo) {
32 const res = await getVideosList(server.url)
33
34 const videos = res.body.data
35 for (let video of videos) {
36 await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
37 }
38 }
39
40 before(async function () {
41 this.timeout(50000)
42
43 // Run servers
44 servers = await flushAndRunMultipleServers(2)
45
46 // Get the access tokens
47 await setAccessTokensToServers(servers)
48
49 // Server 1 and server 2 follow each other
50 await doubleFollow(servers[0], servers[1])
51
52 // Upload 2 videos on server 2
53 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
54 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
55
56 // Wait videos propagation, server 2 has transcoding enabled
57 await waitJobs(servers)
58
59 // Blacklist the two videos on server 1
60 await blacklistVideosOnServer(servers[0])
61 })
62
63 describe('When listing blacklisted videos', function () {
64 it('Should display all the blacklisted videos', async function () {
65 const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
66
67 expect(res.body.total).to.equal(2)
68
69 const blacklistedVideos = res.body.data
70 expect(blacklistedVideos).to.be.an('array')
71 expect(blacklistedVideos.length).to.equal(2)
72
73 for (const blacklistedVideo of blacklistedVideos) {
74 expect(blacklistedVideo.reason).to.equal('super reason')
75 videoId = blacklistedVideo.video.id
76 }
77 })
78
79 it('Should get the correct sort when sorting by descending id', async function () {
80 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
81 expect(res.body.total).to.equal(2)
82
83 const blacklistedVideos = res.body.data
84 expect(blacklistedVideos).to.be.an('array')
85 expect(blacklistedVideos.length).to.equal(2)
86
87 const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
88
89 expect(blacklistedVideos).to.deep.equal(result)
90 })
91
92 it('Should get the correct sort when sorting by descending video name', async function () {
93 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
94 expect(res.body.total).to.equal(2)
95
96 const blacklistedVideos = res.body.data
97 expect(blacklistedVideos).to.be.an('array')
98 expect(blacklistedVideos.length).to.equal(2)
99
100 const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
101
102 expect(blacklistedVideos).to.deep.equal(result)
103 })
104
105 it('Should get the correct sort when sorting by ascending creation date', async function () {
106 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
107 expect(res.body.total).to.equal(2)
108
109 const blacklistedVideos = res.body.data
110 expect(blacklistedVideos).to.be.an('array')
111 expect(blacklistedVideos.length).to.equal(2)
112
113 const result = orderBy(res.body.data, [ 'createdAt' ])
114
115 expect(blacklistedVideos).to.deep.equal(result)
116 })
117 })
118
119 describe('When updating blacklisted videos', function () {
120 it('Should change the reason', async function () {
121 await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
122
123 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
124 const video = res.body.data.find(b => b.video.id === videoId)
125
126 expect(video.reason).to.equal('my super reason updated')
127 })
128 })
129
130 describe('When listing my videos', function () {
131 it('Should display blacklisted videos', async function () {
132 await blacklistVideosOnServer(servers[1])
133
134 const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
135
136 expect(res.body.total).to.equal(2)
137 expect(res.body.data).to.have.lengthOf(2)
138
139 for (const video of res.body.data) {
140 expect(video.blacklisted).to.be.true
141 expect(video.blacklistedReason).to.equal('super reason')
142 }
143 })
144 })
145
146 describe('When removing a blacklisted video', function () {
147 let videoToRemove: VideoAbuse
148 let blacklist = []
149
150 it('Should not have any video in videos list on server 1', async function () {
151 const res = await getVideosList(servers[0].url)
152 expect(res.body.total).to.equal(0)
153 expect(res.body.data).to.be.an('array')
154 expect(res.body.data.length).to.equal(0)
155 })
156
157 it('Should remove a video from the blacklist on server 1', async function () {
158 // Get one video in the blacklist
159 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
160 videoToRemove = res.body.data[0]
161 blacklist = res.body.data.slice(1)
162
163 // Remove it
164 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
165 })
166
167 it('Should have the ex-blacklisted video in videos list on server 1', async function () {
168 const res = await getVideosList(servers[0].url)
169 expect(res.body.total).to.equal(1)
170
171 const videos = res.body.data
172 expect(videos).to.be.an('array')
173 expect(videos.length).to.equal(1)
174
175 expect(videos[0].name).to.equal(videoToRemove.video.name)
176 expect(videos[0].id).to.equal(videoToRemove.video.id)
177 })
178
179 it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
180 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
181 expect(res.body.total).to.equal(1)
182
183 const videos = res.body.data
184 expect(videos).to.be.an('array')
185 expect(videos.length).to.equal(1)
186 expect(videos).to.deep.equal(blacklist)
187 })
188 })
189
190 after(async function () {
191 killallServers(servers)
192 })
193})
diff --git a/server/tests/api/videos/video-blacklist.ts b/server/tests/api/videos/video-blacklist.ts
index de4c68f1d..d39ad63b4 100644
--- a/server/tests/api/videos/video-blacklist.ts
+++ b/server/tests/api/videos/video-blacklist.ts
@@ -1,24 +1,43 @@
1/* tslint:disable:no-unused-expression */ 1/* tslint:disable:no-unused-expression */
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import { orderBy } from 'lodash'
4import 'mocha' 5import 'mocha'
5import { 6import {
6 addVideoToBlacklist, 7 addVideoToBlacklist,
7 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
9 getBlacklistedVideosList,
10 getMyVideos,
11 getSortedBlacklistedVideosList,
8 getVideosList, 12 getVideosList,
9 killallServers, 13 killallServers,
14 removeVideoFromBlacklist,
10 searchVideo, 15 searchVideo,
11 ServerInfo, 16 ServerInfo,
12 setAccessTokensToServers, 17 setAccessTokensToServers,
13 uploadVideo 18 updateVideo,
14} from '../../utils/index' 19 updateVideoBlacklist,
15import { doubleFollow } from '../../utils/server/follows' 20 uploadVideo,
16import { waitJobs } from '../../utils/server/jobs' 21 viewVideo
22} from '../../../../shared/utils/index'
23import { doubleFollow } from '../../../../shared/utils/server/follows'
24import { waitJobs } from '../../../../shared/utils/server/jobs'
25import { VideoBlacklist } from '../../../../shared/models/videos'
17 26
18const expect = chai.expect 27const expect = chai.expect
19 28
20describe('Test video blacklists', function () { 29describe('Test video blacklist management', function () {
21 let servers: ServerInfo[] = [] 30 let servers: ServerInfo[] = []
31 let videoId: number
32
33 async function blacklistVideosOnServer (server: ServerInfo) {
34 const res = await getVideosList(server.url)
35
36 const videos = res.body.data
37 for (let video of videos) {
38 await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
39 }
40 }
22 41
23 before(async function () { 42 before(async function () {
24 this.timeout(50000) 43 this.timeout(50000)
@@ -32,58 +51,270 @@ describe('Test video blacklists', function () {
32 // Server 1 and server 2 follow each other 51 // Server 1 and server 2 follow each other
33 await doubleFollow(servers[0], servers[1]) 52 await doubleFollow(servers[0], servers[1])
34 53
35 // Upload a video on server 2 54 // Upload 2 videos on server 2
36 const videoAttributes = { 55 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
37 name: 'my super name for server 2', 56 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
38 description: 'my super description for server 2'
39 }
40 await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
41 57
42 // Wait videos propagation, server 2 has transcoding enabled 58 // Wait videos propagation, server 2 has transcoding enabled
43 await waitJobs(servers) 59 await waitJobs(servers)
44 60
45 const res = await getVideosList(servers[0].url) 61 // Blacklist the two videos on server 1
46 const videos = res.body.data 62 await blacklistVideosOnServer(servers[0])
63 })
64
65 describe('When listing/searching videos', function () {
47 66
48 expect(videos.length).to.equal(1) 67 it('Should not have the video blacklisted in videos list/search on server 1', async function () {
68 {
69 const res = await getVideosList(servers[ 0 ].url)
49 70
50 servers[0].remoteVideo = videos.find(video => video.name === 'my super name for server 2') 71 expect(res.body.total).to.equal(0)
72 expect(res.body.data).to.be.an('array')
73 expect(res.body.data.length).to.equal(0)
74 }
75
76 {
77 const res = await searchVideo(servers[ 0 ].url, 'name')
78
79 expect(res.body.total).to.equal(0)
80 expect(res.body.data).to.be.an('array')
81 expect(res.body.data.length).to.equal(0)
82 }
83 })
84
85 it('Should have the blacklisted video in videos list/search on server 2', async function () {
86 {
87 const res = await getVideosList(servers[ 1 ].url)
88
89 expect(res.body.total).to.equal(2)
90 expect(res.body.data).to.be.an('array')
91 expect(res.body.data.length).to.equal(2)
92 }
93
94 {
95 const res = await searchVideo(servers[ 1 ].url, 'video')
96
97 expect(res.body.total).to.equal(2)
98 expect(res.body.data).to.be.an('array')
99 expect(res.body.data.length).to.equal(2)
100 }
101 })
51 }) 102 })
52 103
53 it('Should blacklist a remote video on server 1', async function () { 104 describe('When listing blacklisted videos', function () {
54 await addVideoToBlacklist(servers[0].url, servers[0].accessToken, servers[0].remoteVideo.id) 105 it('Should display all the blacklisted videos', async function () {
106 const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
107
108 expect(res.body.total).to.equal(2)
109
110 const blacklistedVideos = res.body.data
111 expect(blacklistedVideos).to.be.an('array')
112 expect(blacklistedVideos.length).to.equal(2)
113
114 for (const blacklistedVideo of blacklistedVideos) {
115 expect(blacklistedVideo.reason).to.equal('super reason')
116 videoId = blacklistedVideo.video.id
117 }
118 })
119
120 it('Should get the correct sort when sorting by descending id', async function () {
121 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
122 expect(res.body.total).to.equal(2)
123
124 const blacklistedVideos = res.body.data
125 expect(blacklistedVideos).to.be.an('array')
126 expect(blacklistedVideos.length).to.equal(2)
127
128 const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
129
130 expect(blacklistedVideos).to.deep.equal(result)
131 })
132
133 it('Should get the correct sort when sorting by descending video name', async function () {
134 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
135 expect(res.body.total).to.equal(2)
136
137 const blacklistedVideos = res.body.data
138 expect(blacklistedVideos).to.be.an('array')
139 expect(blacklistedVideos.length).to.equal(2)
140
141 const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
142
143 expect(blacklistedVideos).to.deep.equal(result)
144 })
145
146 it('Should get the correct sort when sorting by ascending creation date', async function () {
147 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
148 expect(res.body.total).to.equal(2)
149
150 const blacklistedVideos = res.body.data
151 expect(blacklistedVideos).to.be.an('array')
152 expect(blacklistedVideos.length).to.equal(2)
153
154 const result = orderBy(res.body.data, [ 'createdAt' ])
155
156 expect(blacklistedVideos).to.deep.equal(result)
157 })
55 }) 158 })
56 159
57 it('Should not have the video blacklisted in videos list on server 1', async function () { 160 describe('When updating blacklisted videos', function () {
58 const res = await getVideosList(servers[0].url) 161 it('Should change the reason', async function () {
162 await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
163
164 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
165 const video = res.body.data.find(b => b.video.id === videoId)
59 166
60 expect(res.body.total).to.equal(0) 167 expect(video.reason).to.equal('my super reason updated')
61 expect(res.body.data).to.be.an('array') 168 })
62 expect(res.body.data.length).to.equal(0)
63 }) 169 })
64 170
65 it('Should not have the video blacklisted in videos search on server 1', async function () { 171 describe('When listing my videos', function () {
66 const res = await searchVideo(servers[0].url, 'name') 172 it('Should display blacklisted videos', async function () {
173 await blacklistVideosOnServer(servers[1])
174
175 const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
67 176
68 expect(res.body.total).to.equal(0) 177 expect(res.body.total).to.equal(2)
69 expect(res.body.data).to.be.an('array') 178 expect(res.body.data).to.have.lengthOf(2)
70 expect(res.body.data.length).to.equal(0) 179
180 for (const video of res.body.data) {
181 expect(video.blacklisted).to.be.true
182 expect(video.blacklistedReason).to.equal('super reason')
183 }
184 })
71 }) 185 })
72 186
73 it('Should have the blacklisted video in videos list on server 2', async function () { 187 describe('When removing a blacklisted video', function () {
74 const res = await getVideosList(servers[1].url) 188 let videoToRemove: VideoBlacklist
189 let blacklist = []
190
191 it('Should not have any video in videos list on server 1', async function () {
192 const res = await getVideosList(servers[0].url)
193 expect(res.body.total).to.equal(0)
194 expect(res.body.data).to.be.an('array')
195 expect(res.body.data.length).to.equal(0)
196 })
197
198 it('Should remove a video from the blacklist on server 1', async function () {
199 // Get one video in the blacklist
200 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
201 videoToRemove = res.body.data[0]
202 blacklist = res.body.data.slice(1)
203
204 // Remove it
205 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
206 })
207
208 it('Should have the ex-blacklisted video in videos list on server 1', async function () {
209 const res = await getVideosList(servers[0].url)
210 expect(res.body.total).to.equal(1)
211
212 const videos = res.body.data
213 expect(videos).to.be.an('array')
214 expect(videos.length).to.equal(1)
215
216 expect(videos[0].name).to.equal(videoToRemove.video.name)
217 expect(videos[0].id).to.equal(videoToRemove.video.id)
218 })
219
220 it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
221 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
222 expect(res.body.total).to.equal(1)
75 223
76 expect(res.body.total).to.equal(1) 224 const videos = res.body.data
77 expect(res.body.data).to.be.an('array') 225 expect(videos).to.be.an('array')
78 expect(res.body.data.length).to.equal(1) 226 expect(videos.length).to.equal(1)
227 expect(videos).to.deep.equal(blacklist)
228 })
79 }) 229 })
80 230
81 it('Should have the video blacklisted in videos search on server 2', async function () { 231 describe('When blacklisting local videos', function () {
82 const res = await searchVideo(servers[1].url, 'name') 232 let video3UUID: string
233 let video4UUID: string
234
235 before(async function () {
236 this.timeout(10000)
237
238 {
239 const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'Video 3' })
240 video3UUID = res.body.video.uuid
241 }
242 {
243 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'Video 4' })
244 video4UUID = res.body.video.uuid
245 }
246
247 await waitJobs(servers)
248 })
249
250 it('Should blacklist video 3 and keep it federated', async function () {
251 this.timeout(10000)
252
253 await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video3UUID, 'super reason', false)
254
255 await waitJobs(servers)
256
257 {
258 const res = await getVideosList(servers[ 0 ].url)
259 expect(res.body.data.find(v => v.uuid === video3UUID)).to.be.undefined
260 }
261
262 {
263 const res = await getVideosList(servers[ 1 ].url)
264 expect(res.body.data.find(v => v.uuid === video3UUID)).to.not.be.undefined
265 }
266 })
267
268 it('Should unfederate the video', async function () {
269 this.timeout(10000)
270
271 await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, 'super reason', true)
272
273 await waitJobs(servers)
274
275 for (const server of servers) {
276 const res = await getVideosList(server.url)
277 expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
278 }
279 })
280
281 it('Should have the video unfederated even after an Update AP message', async function () {
282 this.timeout(10000)
283
284 await updateVideo(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, { description: 'super description' })
285
286 await waitJobs(servers)
287
288 for (const server of servers) {
289 const res = await getVideosList(server.url)
290 expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
291 }
292 })
293
294 it('Should have the correct video blacklist unfederate attribute', async function () {
295 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
296
297 const blacklistedVideos: VideoBlacklist[] = res.body.data
298 const video3Blacklisted = blacklistedVideos.find(b => b.video.uuid === video3UUID)
299 const video4Blacklisted = blacklistedVideos.find(b => b.video.uuid === video4UUID)
300
301 expect(video3Blacklisted.unfederated).to.be.false
302 expect(video4Blacklisted.unfederated).to.be.true
303 })
304
305 it('Should remove the video from blacklist and refederate the video', async function () {
306 this.timeout(10000)
307
308 await removeVideoFromBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID)
309
310 await waitJobs(servers)
311
312 for (const server of servers) {
313 const res = await getVideosList(server.url)
314 expect(res.body.data.find(v => v.uuid === video4UUID)).to.not.be.undefined
315 }
316 })
83 317
84 expect(res.body.total).to.equal(1)
85 expect(res.body.data).to.be.an('array')
86 expect(res.body.data.length).to.equal(1)
87 }) 318 })
88 319
89 after(async function () { 320 after(async function () {
diff --git a/server/tests/api/videos/video-captions.ts b/server/tests/api/videos/video-captions.ts
index 6e441410d..57bee713f 100644
--- a/server/tests/api/videos/video-captions.ts
+++ b/server/tests/api/videos/video-captions.ts
@@ -2,10 +2,17 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { checkVideoFilesWereRemoved, doubleFollow, flushAndRunMultipleServers, removeVideo, uploadVideo, wait } from '../../utils' 5import {
6import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' 6 checkVideoFilesWereRemoved,
7import { waitJobs } from '../../utils/server/jobs' 7 doubleFollow,
8import { createVideoCaption, deleteVideoCaption, listVideoCaptions, testCaptionFile } from '../../utils/videos/video-captions' 8 flushAndRunMultipleServers,
9 removeVideo,
10 uploadVideo,
11 wait
12} from '../../../../shared/utils'
13import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/utils/index'
14import { waitJobs } from '../../../../shared/utils/server/jobs'
15import { createVideoCaption, deleteVideoCaption, listVideoCaptions, testCaptionFile } from '../../../../shared/utils/videos/video-captions'
9import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' 16import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
10 17
11const expect = chai.expect 18const expect = chai.expect
diff --git a/server/tests/api/videos/video-change-ownership.ts b/server/tests/api/videos/video-change-ownership.ts
index 1578a471d..25675a966 100644
--- a/server/tests/api/videos/video-change-ownership.ts
+++ b/server/tests/api/videos/video-change-ownership.ts
@@ -18,8 +18,8 @@ import {
18 uploadVideo, 18 uploadVideo,
19 userLogin, 19 userLogin,
20 getVideo 20 getVideo
21} from '../../utils' 21} from '../../../../shared/utils'
22import { waitJobs } from '../../utils/server/jobs' 22import { waitJobs } from '../../../../shared/utils/server/jobs'
23import { User } from '../../../../shared/models/users' 23import { User } from '../../../../shared/models/users'
24import { VideoDetails } from '../../../../shared/models/videos' 24import { VideoDetails } from '../../../../shared/models/videos'
25 25
diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts
index 8138c65d6..63514d69c 100644
--- a/server/tests/api/videos/video-channels.ts
+++ b/server/tests/api/videos/video-channels.ts
@@ -7,11 +7,13 @@ import {
7 createUser, 7 createUser,
8 doubleFollow, 8 doubleFollow,
9 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
10 getVideoChannelVideos, serverLogin, testImage, 10 getVideoChannelVideos,
11 testImage,
11 updateVideo, 12 updateVideo,
12 updateVideoChannelAvatar, 13 updateVideoChannelAvatar,
13 uploadVideo, wait, userLogin 14 uploadVideo,
14} from '../../utils' 15 userLogin
16} from '../../../../shared/utils'
15import { 17import {
16 addVideoChannel, 18 addVideoChannel,
17 deleteVideoChannel, 19 deleteVideoChannel,
@@ -24,8 +26,8 @@ import {
24 ServerInfo, 26 ServerInfo,
25 setAccessTokensToServers, 27 setAccessTokensToServers,
26 updateVideoChannel 28 updateVideoChannel
27} from '../../utils/index' 29} from '../../../../shared/utils/index'
28import { waitJobs } from '../../utils/server/jobs' 30import { waitJobs } from '../../../../shared/utils/server/jobs'
29 31
30const expect = chai.expect 32const expect = chai.expect
31 33
diff --git a/server/tests/api/videos/video-comments.ts b/server/tests/api/videos/video-comments.ts
index d6e07c5b3..ce1b17e35 100644
--- a/server/tests/api/videos/video-comments.ts
+++ b/server/tests/api/videos/video-comments.ts
@@ -3,7 +3,7 @@
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' 5import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
6import { testImage } from '../../utils' 6import { testImage } from '../../../../shared/utils'
7import { 7import {
8 dateIsValid, 8 dateIsValid,
9 flushTests, 9 flushTests,
@@ -13,14 +13,14 @@ import {
13 setAccessTokensToServers, 13 setAccessTokensToServers,
14 updateMyAvatar, 14 updateMyAvatar,
15 uploadVideo 15 uploadVideo
16} from '../../utils/index' 16} from '../../../../shared/utils/index'
17import { 17import {
18 addVideoCommentReply, 18 addVideoCommentReply,
19 addVideoCommentThread, 19 addVideoCommentThread,
20 deleteVideoComment, 20 deleteVideoComment,
21 getVideoCommentThreads, 21 getVideoCommentThreads,
22 getVideoThreadComments 22 getVideoThreadComments
23} from '../../utils/videos/video-comments' 23} from '../../../../shared/utils/videos/video-comments'
24 24
25const expect = chai.expect 25const expect = chai.expect
26 26
diff --git a/server/tests/api/videos/video-description.ts b/server/tests/api/videos/video-description.ts
index dd5cd78c0..cbda0b9a6 100644
--- a/server/tests/api/videos/video-description.ts
+++ b/server/tests/api/videos/video-description.ts
@@ -12,9 +12,9 @@ import {
12 setAccessTokensToServers, 12 setAccessTokensToServers,
13 updateVideo, 13 updateVideo,
14 uploadVideo 14 uploadVideo
15} from '../../utils/index' 15} from '../../../../shared/utils/index'
16import { doubleFollow } from '../../utils/server/follows' 16import { doubleFollow } from '../../../../shared/utils/server/follows'
17import { waitJobs } from '../../utils/server/jobs' 17import { waitJobs } from '../../../../shared/utils/server/jobs'
18 18
19const expect = chai.expect 19const expect = chai.expect
20 20
diff --git a/server/tests/api/videos/video-hls.ts b/server/tests/api/videos/video-hls.ts
new file mode 100644
index 000000000..a1214bad1
--- /dev/null
+++ b/server/tests/api/videos/video-hls.ts
@@ -0,0 +1,139 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 checkDirectoryIsEmpty,
7 checkSegmentHash,
8 checkTmpIsEmpty,
9 doubleFollow,
10 flushAndRunMultipleServers,
11 flushTests,
12 getPlaylist,
13 getVideo,
14 killallServers,
15 removeVideo,
16 ServerInfo,
17 setAccessTokensToServers,
18 updateVideo,
19 uploadVideo,
20 waitJobs
21} from '../../../../shared/utils'
22import { VideoDetails } from '../../../../shared/models/videos'
23import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
24import { join } from 'path'
25
26const expect = chai.expect
27
28async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
29 const resolutions = [ 240, 360, 480, 720 ]
30
31 for (const server of servers) {
32 const res = await getVideo(server.url, videoUUID)
33 const videoDetails: VideoDetails = res.body
34
35 expect(videoDetails.streamingPlaylists).to.have.lengthOf(1)
36
37 const hlsPlaylist = videoDetails.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
38 expect(hlsPlaylist).to.not.be.undefined
39
40 {
41 const res2 = await getPlaylist(hlsPlaylist.playlistUrl)
42
43 const masterPlaylist = res2.text
44
45 expect(masterPlaylist).to.contain('#EXT-X-STREAM-INF:BANDWIDTH=55472,RESOLUTION=640x360,FRAME-RATE=25')
46
47 for (const resolution of resolutions) {
48 expect(masterPlaylist).to.contain(`${resolution}.m3u8`)
49 }
50 }
51
52 {
53 for (const resolution of resolutions) {
54 const res2 = await getPlaylist(`http://localhost:9001/static/playlists/hls/${videoUUID}/${resolution}.m3u8`)
55
56 const subPlaylist = res2.text
57 expect(subPlaylist).to.contain(`${videoUUID}-${resolution}-fragmented.mp4`)
58 }
59 }
60
61 {
62 const baseUrl = 'http://localhost:9001/static/playlists/hls'
63
64 for (const resolution of resolutions) {
65 await checkSegmentHash(baseUrl, baseUrl, videoUUID, resolution, hlsPlaylist)
66 }
67 }
68 }
69}
70
71describe('Test HLS videos', function () {
72 let servers: ServerInfo[] = []
73 let videoUUID = ''
74
75 before(async function () {
76 this.timeout(120000)
77
78 servers = await flushAndRunMultipleServers(2, { transcoding: { enabled: true, hls: { enabled: true } } })
79
80 // Get the access tokens
81 await setAccessTokensToServers(servers)
82
83 // Server 1 and server 2 follow each other
84 await doubleFollow(servers[0], servers[1])
85 })
86
87 it('Should upload a video and transcode it to HLS', async function () {
88 this.timeout(120000)
89
90 {
91 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video 1', fixture: 'video_short.webm' })
92 videoUUID = res.body.video.uuid
93 }
94
95 await waitJobs(servers)
96
97 await checkHlsPlaylist(servers, videoUUID)
98 })
99
100 it('Should update the video', async function () {
101 await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, { name: 'video 1 updated' })
102
103 await waitJobs(servers)
104
105 await checkHlsPlaylist(servers, videoUUID)
106 })
107
108 it('Should delete the video', async function () {
109 await removeVideo(servers[0].url, servers[0].accessToken, videoUUID)
110
111 await waitJobs(servers)
112
113 for (const server of servers) {
114 await getVideo(server.url, videoUUID, 404)
115 }
116 })
117
118 it('Should have the playlists/segment deleted from the disk', async function () {
119 for (const server of servers) {
120 await checkDirectoryIsEmpty(server, 'videos')
121 await checkDirectoryIsEmpty(server, join('playlists', 'hls'))
122 }
123 })
124
125 it('Should have an empty tmp directory', async function () {
126 for (const server of servers) {
127 await checkTmpIsEmpty(server)
128 }
129 })
130
131 after(async function () {
132 killallServers(servers)
133
134 // Keep the logs if the test failed
135 if (this['ok']) {
136 await flushTests()
137 }
138 })
139})
diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts
index b7866d529..cd4988553 100644
--- a/server/tests/api/videos/video-imports.ts
+++ b/server/tests/api/videos/video-imports.ts
@@ -14,9 +14,9 @@ import {
14 killallServers, 14 killallServers,
15 ServerInfo, 15 ServerInfo,
16 setAccessTokensToServers 16 setAccessTokensToServers
17} from '../../utils' 17} from '../../../../shared/utils'
18import { waitJobs } from '../../utils/server/jobs' 18import { waitJobs } from '../../../../shared/utils/server/jobs'
19import { getMagnetURI, getYoutubeVideoUrl, importVideo, getMyVideoImports } from '../../utils/videos/video-imports' 19import { getMagnetURI, getYoutubeVideoUrl, importVideo, getMyVideoImports } from '../../../../shared/utils/videos/video-imports'
20 20
21const expect = chai.expect 21const expect = chai.expect
22 22
@@ -30,7 +30,7 @@ describe('Test video imports', function () {
30 const videoHttp: VideoDetails = resHttp.body 30 const videoHttp: VideoDetails = resHttp.body
31 31
32 expect(videoHttp.name).to.equal('small video - youtube') 32 expect(videoHttp.name).to.equal('small video - youtube')
33 expect(videoHttp.category.label).to.equal('News') 33 expect(videoHttp.category.label).to.equal('News & Politics')
34 expect(videoHttp.licence.label).to.equal('Attribution') 34 expect(videoHttp.licence.label).to.equal('Attribution')
35 expect(videoHttp.language.label).to.equal('Unknown') 35 expect(videoHttp.language.label).to.equal('Unknown')
36 expect(videoHttp.nsfw).to.be.false 36 expect(videoHttp.nsfw).to.be.false
diff --git a/server/tests/api/videos/video-nsfw.ts b/server/tests/api/videos/video-nsfw.ts
index eab7a6991..df1ee2eb9 100644
--- a/server/tests/api/videos/video-nsfw.ts
+++ b/server/tests/api/videos/video-nsfw.ts
@@ -2,10 +2,17 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { flushTests, getVideosList, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils/index' 5import {
6import { userLogin } from '../../utils/users/login' 6 flushTests,
7import { createUser } from '../../utils/users/users' 7 getVideosList,
8import { getMyVideos } from '../../utils/videos/videos' 8 killallServers,
9 ServerInfo,
10 setAccessTokensToServers,
11 uploadVideo
12} from '../../../../shared/utils/index'
13import { userLogin } from '../../../../shared/utils/users/login'
14import { createUser } from '../../../../shared/utils/users/users'
15import { getMyVideos } from '../../../../shared/utils/videos/videos'
9import { 16import {
10 getAccountVideos, 17 getAccountVideos,
11 getConfig, 18 getConfig,
@@ -18,7 +25,7 @@ import {
18 searchVideoWithToken, 25 searchVideoWithToken,
19 updateCustomConfig, 26 updateCustomConfig,
20 updateMyUser 27 updateMyUser
21} from '../../utils' 28} from '../../../../shared/utils'
22import { ServerConfig } from '../../../../shared/models' 29import { ServerConfig } from '../../../../shared/models'
23import { CustomConfig } from '../../../../shared/models/server/custom-config.model' 30import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
24import { User } from '../../../../shared/models/users' 31import { User } from '../../../../shared/models/users'
diff --git a/server/tests/api/videos/video-privacy.ts b/server/tests/api/videos/video-privacy.ts
index 9fefca7e3..0b4e66369 100644
--- a/server/tests/api/videos/video-privacy.ts
+++ b/server/tests/api/videos/video-privacy.ts
@@ -10,12 +10,12 @@ import {
10 ServerInfo, 10 ServerInfo,
11 setAccessTokensToServers, 11 setAccessTokensToServers,
12 uploadVideo 12 uploadVideo
13} from '../../utils/index' 13} from '../../../../shared/utils/index'
14import { doubleFollow } from '../../utils/server/follows' 14import { doubleFollow } from '../../../../shared/utils/server/follows'
15import { userLogin } from '../../utils/users/login' 15import { userLogin } from '../../../../shared/utils/users/login'
16import { createUser } from '../../utils/users/users' 16import { createUser } from '../../../../shared/utils/users/users'
17import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../../utils/videos/videos' 17import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../../../../shared/utils/videos/videos'
18import { waitJobs } from '../../utils/server/jobs' 18import { waitJobs } from '../../../../shared/utils/server/jobs'
19 19
20const expect = chai.expect 20const expect = chai.expect
21 21
diff --git a/server/tests/api/videos/video-schedule-update.ts b/server/tests/api/videos/video-schedule-update.ts
index a260fa4da..632c4244c 100644
--- a/server/tests/api/videos/video-schedule-update.ts
+++ b/server/tests/api/videos/video-schedule-update.ts
@@ -15,9 +15,8 @@ import {
15 updateVideo, 15 updateVideo,
16 uploadVideo, 16 uploadVideo,
17 wait 17 wait
18} from '../../utils' 18} from '../../../../shared/utils'
19import { join } from 'path' 19import { waitJobs } from '../../../../shared/utils/server/jobs'
20import { waitJobs } from '../../utils/server/jobs'
21 20
22const expect = chai.expect 21const expect = chai.expect
23 22
diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts
index 0f83d4d57..eefd32ef8 100644
--- a/server/tests/api/videos/video-transcoder.ts
+++ b/server/tests/api/videos/video-transcoder.ts
@@ -3,13 +3,13 @@
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { omit } from 'lodash' 5import { omit } from 'lodash'
6import * as ffmpeg from 'fluent-ffmpeg' 6import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos'
7import { VideoDetails, VideoState } from '../../../../shared/models/videos' 7import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils'
8import { getVideoFileFPS, audio } from '../../../helpers/ffmpeg-utils'
9import { 8import {
10 buildAbsoluteFixturePath, 9 buildAbsoluteFixturePath,
11 doubleFollow, 10 doubleFollow,
12 flushAndRunMultipleServers, 11 flushAndRunMultipleServers,
12 generateHighBitrateVideo,
13 getMyVideos, 13 getMyVideos,
14 getVideo, 14 getVideo,
15 getVideosList, 15 getVideosList,
@@ -19,9 +19,10 @@ import {
19 setAccessTokensToServers, 19 setAccessTokensToServers,
20 uploadVideo, 20 uploadVideo,
21 webtorrentAdd 21 webtorrentAdd
22} from '../../utils' 22} from '../../../../shared/utils'
23import { join } from 'path' 23import { extname, join } from 'path'
24import { waitJobs } from '../../utils/server/jobs' 24import { waitJobs } from '../../../../shared/utils/server/jobs'
25import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants'
25 26
26const expect = chai.expect 27const expect = chai.expect
27 28
@@ -121,7 +122,7 @@ describe('Test video transcoding', function () {
121 expect(videoDetails.files).to.have.lengthOf(4) 122 expect(videoDetails.files).to.have.lengthOf(4)
122 123
123 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4') 124 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4')
124 const probe = await audio.get(ffmpeg, path) 125 const probe = await audio.get(path)
125 126
126 if (probe.audioStream) { 127 if (probe.audioStream) {
127 expect(probe.audioStream[ 'codec_name' ]).to.be.equal('aac') 128 expect(probe.audioStream[ 'codec_name' ]).to.be.equal('aac')
@@ -152,7 +153,7 @@ describe('Test video transcoding', function () {
152 153
153 expect(videoDetails.files).to.have.lengthOf(4) 154 expect(videoDetails.files).to.have.lengthOf(4)
154 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4') 155 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4')
155 const probe = await audio.get(ffmpeg, path) 156 const probe = await audio.get(path)
156 expect(probe).to.not.have.property('audioStream') 157 expect(probe).to.not.have.property('audioStream')
157 } 158 }
158 }) 159 })
@@ -177,9 +178,9 @@ describe('Test video transcoding', function () {
177 178
178 expect(videoDetails.files).to.have.lengthOf(4) 179 expect(videoDetails.files).to.have.lengthOf(4)
179 const fixturePath = buildAbsoluteFixturePath(videoAttributes.fixture) 180 const fixturePath = buildAbsoluteFixturePath(videoAttributes.fixture)
180 const fixtureVideoProbe = await audio.get(ffmpeg, fixturePath) 181 const fixtureVideoProbe = await audio.get(fixturePath)
181 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4') 182 const path = join(root(), 'test2', 'videos', video.uuid + '-240.mp4')
182 const videoProbe = await audio.get(ffmpeg, path) 183 const videoProbe = await audio.get(path)
183 if (videoProbe.audioStream && fixtureVideoProbe.audioStream) { 184 if (videoProbe.audioStream && fixtureVideoProbe.audioStream) {
184 const toOmit = [ 'max_bit_rate', 'duration', 'duration_ts', 'nb_frames', 'start_time', 'start_pts' ] 185 const toOmit = [ 'max_bit_rate', 'duration', 'duration_ts', 'nb_frames', 'start_time', 'start_pts' ]
185 expect(omit(videoProbe.audioStream, toOmit)).to.be.deep.equal(omit(fixtureVideoProbe.audioStream, toOmit)) 186 expect(omit(videoProbe.audioStream, toOmit)).to.be.deep.equal(omit(fixtureVideoProbe.audioStream, toOmit))
@@ -228,7 +229,7 @@ describe('Test video transcoding', function () {
228 } 229 }
229 }) 230 })
230 231
231 it('Should wait transcoding before publishing the video', async function () { 232 it('Should wait for transcoding before publishing the video', async function () {
232 this.timeout(80000) 233 this.timeout(80000)
233 234
234 { 235 {
@@ -281,6 +282,73 @@ describe('Test video transcoding', function () {
281 } 282 }
282 }) 283 })
283 284
285 it('Should respect maximum bitrate values', async function () {
286 this.timeout(160000)
287
288 let tempFixturePath: string
289
290 {
291 tempFixturePath = await generateHighBitrateVideo()
292
293 const bitrate = await getVideoFileBitrate(tempFixturePath)
294 expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS))
295 }
296
297 const videoAttributes = {
298 name: 'high bitrate video',
299 description: 'high bitrate video',
300 fixture: tempFixturePath
301 }
302
303 await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
304
305 await waitJobs(servers)
306
307 for (const server of servers) {
308 const res = await getVideosList(server.url)
309
310 const video = res.body.data.find(v => v.name === videoAttributes.name)
311
312 for (const resolution of ['240', '360', '480', '720', '1080']) {
313 const path = join(root(), 'test2', 'videos', video.uuid + '-' + resolution + '.mp4')
314 const bitrate = await getVideoFileBitrate(path)
315 const fps = await getVideoFileFPS(path)
316 const resolution2 = await getVideoFileResolution(path)
317
318 expect(resolution2.videoFileResolution.toString()).to.equal(resolution)
319 expect(bitrate).to.be.below(getMaxBitrate(resolution2.videoFileResolution, fps, VIDEO_TRANSCODING_FPS))
320 }
321 }
322 })
323
324 it('Should accept and transcode additional extensions', async function () {
325 this.timeout(300000)
326
327 for (const fixture of [ 'video_short.mkv', 'video_short.avi' ]) {
328 const videoAttributes = {
329 name: fixture,
330 fixture
331 }
332
333 await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributes)
334
335 await waitJobs(servers)
336
337 for (const server of servers) {
338 const res = await getVideosList(server.url)
339
340 const video = res.body.data.find(v => v.name === videoAttributes.name)
341 const res2 = await getVideo(server.url, video.id)
342 const videoDetails = res2.body
343
344 expect(videoDetails.files).to.have.lengthOf(4)
345
346 const magnetUri = videoDetails.files[ 0 ].magnetUri
347 expect(magnetUri).to.contain('.mp4')
348 }
349 }
350 })
351
284 after(async function () { 352 after(async function () {
285 killallServers(servers) 353 killallServers(servers)
286 }) 354 })
diff --git a/server/tests/api/videos/videos-filter.ts b/server/tests/api/videos/videos-filter.ts
new file mode 100644
index 000000000..59e37ad86
--- /dev/null
+++ b/server/tests/api/videos/videos-filter.ts
@@ -0,0 +1,130 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 createUser,
7 doubleFollow,
8 flushAndRunMultipleServers,
9 flushTests,
10 killallServers,
11 makeGetRequest,
12 ServerInfo,
13 setAccessTokensToServers,
14 uploadVideo,
15 userLogin
16} from '../../../../shared/utils'
17import { Video, VideoPrivacy } from '../../../../shared/models/videos'
18import { UserRole } from '../../../../shared/models/users'
19
20const expect = chai.expect
21
22async function getVideosNames (server: ServerInfo, token: string, filter: string, statusCodeExpected = 200) {
23 const paths = [
24 '/api/v1/video-channels/root_channel/videos',
25 '/api/v1/accounts/root/videos',
26 '/api/v1/videos',
27 '/api/v1/search/videos'
28 ]
29
30 const videosResults: Video[][] = []
31
32 for (const path of paths) {
33 const res = await makeGetRequest({
34 url: server.url,
35 path,
36 token,
37 query: {
38 sort: 'createdAt',
39 filter
40 },
41 statusCodeExpected
42 })
43
44 videosResults.push(res.body.data.map(v => v.name))
45 }
46
47 return videosResults
48}
49
50describe('Test videos filter validator', function () {
51 let servers: ServerInfo[]
52
53 // ---------------------------------------------------------------
54
55 before(async function () {
56 this.timeout(120000)
57
58 await flushTests()
59
60 servers = await flushAndRunMultipleServers(2)
61
62 await setAccessTokensToServers(servers)
63
64 for (const server of servers) {
65 const moderator = { username: 'moderator', password: 'my super password' }
66 await createUser(
67 server.url,
68 server.accessToken,
69 moderator.username,
70 moderator.password,
71 undefined,
72 undefined,
73 UserRole.MODERATOR
74 )
75 server['moderatorAccessToken'] = await userLogin(server, moderator)
76
77 await uploadVideo(server.url, server.accessToken, { name: 'public ' + server.serverNumber })
78
79 {
80 const attributes = { name: 'unlisted ' + server.serverNumber, privacy: VideoPrivacy.UNLISTED }
81 await uploadVideo(server.url, server.accessToken, attributes)
82 }
83
84 {
85 const attributes = { name: 'private ' + server.serverNumber, privacy: VideoPrivacy.PRIVATE }
86 await uploadVideo(server.url, server.accessToken, attributes)
87 }
88 }
89
90 await doubleFollow(servers[0], servers[1])
91 })
92
93 describe('Check videos filter', function () {
94
95 it('Should display local videos', async function () {
96 for (const server of servers) {
97 const namesResults = await getVideosNames(server, server.accessToken, 'local')
98 for (const names of namesResults) {
99 expect(names).to.have.lengthOf(1)
100 expect(names[ 0 ]).to.equal('public ' + server.serverNumber)
101 }
102 }
103 })
104
105 it('Should display all local videos by the admin or the moderator', async function () {
106 for (const server of servers) {
107 for (const token of [ server.accessToken, server['moderatorAccessToken'] ]) {
108
109 const namesResults = await getVideosNames(server, token, 'all-local')
110 for (const names of namesResults) {
111 expect(names).to.have.lengthOf(3)
112
113 expect(names[ 0 ]).to.equal('public ' + server.serverNumber)
114 expect(names[ 1 ]).to.equal('unlisted ' + server.serverNumber)
115 expect(names[ 2 ]).to.equal('private ' + server.serverNumber)
116 }
117 }
118 }
119 })
120 })
121
122 after(async function () {
123 killallServers(servers)
124
125 // Keep the logs if the test failed
126 if (this['ok']) {
127 await flushTests()
128 }
129 })
130})
diff --git a/server/tests/api/videos/videos-history.ts b/server/tests/api/videos/videos-history.ts
index 6d289b288..f654a422b 100644
--- a/server/tests/api/videos/videos-history.ts
+++ b/server/tests/api/videos/videos-history.ts
@@ -3,17 +3,21 @@
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { 5import {
6 createUser,
6 flushTests, 7 flushTests,
7 getVideosListWithToken, 8 getVideosListWithToken,
8 getVideoWithToken, 9 getVideoWithToken,
9 killallServers, makePutBodyRequest, 10 killallServers,
10 runServer, searchVideoWithToken, 11 runServer,
12 searchVideoWithToken,
11 ServerInfo, 13 ServerInfo,
12 setAccessTokensToServers, 14 setAccessTokensToServers,
13 uploadVideo 15 updateMyUser,
14} from '../../utils' 16 uploadVideo,
17 userLogin
18} from '../../../../shared/utils'
15import { Video, VideoDetails } from '../../../../shared/models/videos' 19import { Video, VideoDetails } from '../../../../shared/models/videos'
16import { userWatchVideo } from '../../utils/videos/video-history' 20import { listMyVideosHistory, removeMyVideosHistory, userWatchVideo } from '../../../../shared/utils/videos/video-history'
17 21
18const expect = chai.expect 22const expect = chai.expect
19 23
@@ -22,6 +26,8 @@ describe('Test videos history', function () {
22 let video1UUID: string 26 let video1UUID: string
23 let video2UUID: string 27 let video2UUID: string
24 let video3UUID: string 28 let video3UUID: string
29 let video3WatchedDate: Date
30 let userAccessToken: string
25 31
26 before(async function () { 32 before(async function () {
27 this.timeout(30000) 33 this.timeout(30000)
@@ -46,6 +52,13 @@ describe('Test videos history', function () {
46 const res = await uploadVideo(server.url, server.accessToken, { name: 'video 3' }) 52 const res = await uploadVideo(server.url, server.accessToken, { name: 'video 3' })
47 video3UUID = res.body.video.uuid 53 video3UUID = res.body.video.uuid
48 } 54 }
55
56 const user = {
57 username: 'user_1',
58 password: 'super password'
59 }
60 await createUser(server.url, server.accessToken, user.username, user.password)
61 userAccessToken = await userLogin(server, user)
49 }) 62 })
50 63
51 it('Should get videos, without watching history', async function () { 64 it('Should get videos, without watching history', async function () {
@@ -62,8 +75,8 @@ describe('Test videos history', function () {
62 }) 75 })
63 76
64 it('Should watch the first and second video', async function () { 77 it('Should watch the first and second video', async function () {
65 await userWatchVideo(server.url, server.accessToken, video1UUID, 3)
66 await userWatchVideo(server.url, server.accessToken, video2UUID, 8) 78 await userWatchVideo(server.url, server.accessToken, video2UUID, 8)
79 await userWatchVideo(server.url, server.accessToken, video1UUID, 3)
67 }) 80 })
68 81
69 it('Should return the correct history when listing, searching and getting videos', async function () { 82 it('Should return the correct history when listing, searching and getting videos', async function () {
@@ -117,6 +130,68 @@ describe('Test videos history', function () {
117 } 130 }
118 }) 131 })
119 132
133 it('Should have these videos when listing my history', async function () {
134 video3WatchedDate = new Date()
135 await userWatchVideo(server.url, server.accessToken, video3UUID, 2)
136
137 const res = await listMyVideosHistory(server.url, server.accessToken)
138
139 expect(res.body.total).to.equal(3)
140
141 const videos: Video[] = res.body.data
142 expect(videos[0].name).to.equal('video 3')
143 expect(videos[1].name).to.equal('video 1')
144 expect(videos[2].name).to.equal('video 2')
145 })
146
147 it('Should not have videos history on another user', async function () {
148 const res = await listMyVideosHistory(server.url, userAccessToken)
149
150 expect(res.body.total).to.equal(0)
151 expect(res.body.data).to.have.lengthOf(0)
152 })
153
154 it('Should clear my history', async function () {
155 await removeMyVideosHistory(server.url, server.accessToken, video3WatchedDate.toISOString())
156 })
157
158 it('Should have my history cleared', async function () {
159 const res = await listMyVideosHistory(server.url, server.accessToken)
160
161 expect(res.body.total).to.equal(1)
162
163 const videos: Video[] = res.body.data
164 expect(videos[0].name).to.equal('video 3')
165 })
166
167 it('Should disable videos history', async function () {
168 await updateMyUser({
169 url: server.url,
170 accessToken: server.accessToken,
171 videosHistoryEnabled: false
172 })
173
174 await userWatchVideo(server.url, server.accessToken, video2UUID, 8, 409)
175 })
176
177 it('Should re-enable videos history', async function () {
178 await updateMyUser({
179 url: server.url,
180 accessToken: server.accessToken,
181 videosHistoryEnabled: true
182 })
183
184 await userWatchVideo(server.url, server.accessToken, video1UUID, 8)
185
186 const res = await listMyVideosHistory(server.url, server.accessToken)
187
188 expect(res.body.total).to.equal(2)
189
190 const videos: Video[] = res.body.data
191 expect(videos[0].name).to.equal('video 1')
192 expect(videos[1].name).to.equal('video 3')
193 })
194
120 after(async function () { 195 after(async function () {
121 killallServers([ server ]) 196 killallServers([ server ])
122 197
diff --git a/server/tests/api/videos/videos-overview.ts b/server/tests/api/videos/videos-overview.ts
index 7d1f29c92..7221bcae6 100644
--- a/server/tests/api/videos/videos-overview.ts
+++ b/server/tests/api/videos/videos-overview.ts
@@ -2,8 +2,8 @@
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import 'mocha' 4import 'mocha'
5import { flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils' 5import { flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/utils'
6import { getVideosOverview } from '../../utils/overviews/overviews' 6import { getVideosOverview } from '../../../../shared/utils/overviews/overviews'
7import { VideosOverview } from '../../../../shared/models/overviews' 7import { VideosOverview } from '../../../../shared/models/overviews'
8 8
9const expect = chai.expect 9const expect = chai.expect
diff --git a/server/tests/cli/create-import-video-file-job.ts b/server/tests/cli/create-import-video-file-job.ts
index 13bcfd209..4acda47b1 100644
--- a/server/tests/cli/create-import-video-file-job.ts
+++ b/server/tests/cli/create-import-video-file-job.ts
@@ -15,8 +15,8 @@ import {
15 ServerInfo, 15 ServerInfo,
16 setAccessTokensToServers, 16 setAccessTokensToServers,
17 uploadVideo 17 uploadVideo
18} from '../utils' 18} from '../../../shared/utils'
19import { waitJobs } from '../utils/server/jobs' 19import { waitJobs } from '../../../shared/utils/server/jobs'
20 20
21const expect = chai.expect 21const expect = chai.expect
22 22
diff --git a/server/tests/cli/create-transcoding-job.ts b/server/tests/cli/create-transcoding-job.ts
index c2e3840c5..50be5fa19 100644
--- a/server/tests/cli/create-transcoding-job.ts
+++ b/server/tests/cli/create-transcoding-job.ts
@@ -15,8 +15,8 @@ import {
15 ServerInfo, 15 ServerInfo,
16 setAccessTokensToServers, 16 setAccessTokensToServers,
17 uploadVideo, wait 17 uploadVideo, wait
18} from '../utils' 18} from '../../../shared/utils'
19import { waitJobs } from '../utils/server/jobs' 19import { waitJobs } from '../../../shared/utils/server/jobs'
20 20
21const expect = chai.expect 21const expect = chai.expect
22 22
diff --git a/server/tests/cli/index.ts b/server/tests/cli/index.ts
index 6201314ce..c6b7ec078 100644
--- a/server/tests/cli/index.ts
+++ b/server/tests/cli/index.ts
@@ -1,6 +1,7 @@
1// Order of the tests we want to execute 1// Order of the tests we want to execute
2import './create-import-video-file-job' 2import './create-import-video-file-job'
3import './create-transcoding-job' 3import './create-transcoding-job'
4import './optimize-old-videos'
4import './peertube' 5import './peertube'
5import './reset-password' 6import './reset-password'
6import './update-host' 7import './update-host'
diff --git a/server/tests/cli/optimize-old-videos.ts b/server/tests/cli/optimize-old-videos.ts
new file mode 100644
index 000000000..6f6bc25a6
--- /dev/null
+++ b/server/tests/cli/optimize-old-videos.ts
@@ -0,0 +1,120 @@
1/* tslint:disable:no-unused-expression */
2
3import 'mocha'
4import * as chai from 'chai'
5import { getMaxBitrate, Video, VideoDetails, VideoResolution } from '../../../shared/models/videos'
6import {
7 doubleFollow,
8 execCLI,
9 flushAndRunMultipleServers,
10 flushTests, generateHighBitrateVideo,
11 getEnvCli,
12 getVideo,
13 getVideosList,
14 killallServers, root,
15 ServerInfo,
16 setAccessTokensToServers,
17 uploadVideo, viewVideo, wait
18} from '../../../shared/utils'
19import { waitJobs } from '../../../shared/utils/server/jobs'
20import { getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../helpers/ffmpeg-utils'
21import { VIDEO_TRANSCODING_FPS } from '../../initializers'
22import { join } from 'path'
23
24const expect = chai.expect
25
26describe('Test optimize old videos', function () {
27 let servers: ServerInfo[] = []
28 let video1UUID: string
29 let video2UUID: string
30
31 before(async function () {
32 this.timeout(200000)
33
34 await flushTests()
35
36 // Run server 2 to have transcoding enabled
37 servers = await flushAndRunMultipleServers(2)
38 await setAccessTokensToServers(servers)
39
40 await doubleFollow(servers[0], servers[1])
41
42 let tempFixturePath: string
43
44 {
45 tempFixturePath = await generateHighBitrateVideo()
46
47 const bitrate = await getVideoFileBitrate(tempFixturePath)
48 expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS))
49 }
50
51 // Upload two videos for our needs
52 const res1 = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video1', fixture: tempFixturePath })
53 video1UUID = res1.body.video.uuid
54 const res2 = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video2', fixture: tempFixturePath })
55 video2UUID = res2.body.video.uuid
56
57 await waitJobs(servers)
58 })
59
60 it('Should have two video files on each server', async function () {
61 this.timeout(30000)
62
63 for (const server of servers) {
64 const res = await getVideosList(server.url)
65 const videos = res.body.data
66 expect(videos).to.have.lengthOf(2)
67
68 for (const video of videos) {
69 const res2 = await getVideo(server.url, video.uuid)
70 const videoDetail: VideoDetails = res2.body
71 expect(videoDetail.files).to.have.lengthOf(1)
72 }
73 }
74 })
75
76 it('Should run optimize script', async function () {
77 this.timeout(120000)
78
79 const env = getEnvCli(servers[0])
80 await execCLI(`${env} npm run optimize-old-videos`)
81
82 await waitJobs(servers)
83
84 for (const server of servers) {
85 const res = await getVideosList(server.url)
86 const videos: Video[] = res.body.data
87
88 expect(videos).to.have.lengthOf(2)
89
90 for (const video of videos) {
91 await viewVideo(server.url, video.uuid)
92
93 // Refresh video
94 await waitJobs(servers)
95 await wait(5000)
96 await waitJobs(servers)
97
98 const res2 = await getVideo(server.url, video.uuid)
99 const videosDetails: VideoDetails = res2.body
100
101 expect(videosDetails.files).to.have.lengthOf(1)
102 const file = videosDetails.files[0]
103
104 expect(file.size).to.be.below(5000000)
105
106 const path = join(root(), 'test1', 'videos', video.uuid + '-' + file.resolution.id + '.mp4')
107 const bitrate = await getVideoFileBitrate(path)
108 const fps = await getVideoFileFPS(path)
109 const resolution = await getVideoFileResolution(path)
110
111 expect(resolution.videoFileResolution).to.equal(file.resolution.id)
112 expect(bitrate).to.be.below(getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS))
113 }
114 }
115 })
116
117 after(async function () {
118 killallServers(servers)
119 })
120})
diff --git a/server/tests/cli/peertube.ts b/server/tests/cli/peertube.ts
index 65cb05a1a..e2836d0c3 100644
--- a/server/tests/cli/peertube.ts
+++ b/server/tests/cli/peertube.ts
@@ -11,7 +11,7 @@ import {
11 runServer, 11 runServer,
12 ServerInfo, 12 ServerInfo,
13 setAccessTokensToServers 13 setAccessTokensToServers
14} from '../utils' 14} from '../../../shared/utils'
15 15
16describe('Test CLI wrapper', function () { 16describe('Test CLI wrapper', function () {
17 let server: ServerInfo 17 let server: ServerInfo
@@ -44,6 +44,8 @@ describe('Test CLI wrapper', function () {
44 }) 44 })
45 45
46 after(async function () { 46 after(async function () {
47 this.timeout(10000)
48
47 await execCLI(cmd + ` auth del ${server.url}`) 49 await execCLI(cmd + ` auth del ${server.url}`)
48 50
49 killallServers([ server ]) 51 killallServers([ server ])
diff --git a/server/tests/cli/reset-password.ts b/server/tests/cli/reset-password.ts
index bf937d1c0..1b65f7e39 100644
--- a/server/tests/cli/reset-password.ts
+++ b/server/tests/cli/reset-password.ts
@@ -10,7 +10,7 @@ import {
10 runServer, 10 runServer,
11 ServerInfo, 11 ServerInfo,
12 setAccessTokensToServers 12 setAccessTokensToServers
13} from '../utils' 13} from '../../../shared/utils'
14 14
15describe('Test reset password scripts', function () { 15describe('Test reset password scripts', function () {
16 let server: ServerInfo 16 let server: ServerInfo
diff --git a/server/tests/cli/update-host.ts b/server/tests/cli/update-host.ts
index b89e72ab7..d38bb4331 100644
--- a/server/tests/cli/update-host.ts
+++ b/server/tests/cli/update-host.ts
@@ -3,8 +3,8 @@
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { VideoDetails } from '../../../shared/models/videos' 5import { VideoDetails } from '../../../shared/models/videos'
6import { waitJobs } from '../utils/server/jobs' 6import { waitJobs } from '../../../shared/utils/server/jobs'
7import { addVideoCommentThread } from '../utils/videos/video-comments' 7import { addVideoCommentThread } from '../../../shared/utils/videos/video-comments'
8import { 8import {
9 addVideoChannel, 9 addVideoChannel,
10 createUser, 10 createUser,
@@ -21,8 +21,8 @@ import {
21 ServerInfo, 21 ServerInfo,
22 setAccessTokensToServers, 22 setAccessTokensToServers,
23 uploadVideo 23 uploadVideo
24} from '../utils' 24} from '../../../shared/utils'
25import { getAccountsList } from '../utils/users/accounts' 25import { getAccountsList } from '../../../shared/utils/users/accounts'
26 26
27const expect = chai.expect 27const expect = chai.expect
28 28
@@ -86,6 +86,13 @@ describe('Test update host scripts', function () {
86 const { body } = await makeActivityPubGetRequest(server.url, '/videos/watch/' + video.uuid) 86 const { body } = await makeActivityPubGetRequest(server.url, '/videos/watch/' + video.uuid)
87 87
88 expect(body.id).to.equal('http://localhost:9002/videos/watch/' + video.uuid) 88 expect(body.id).to.equal('http://localhost:9002/videos/watch/' + video.uuid)
89
90 const res = await getVideo(server.url, video.uuid)
91 const videoDetails: VideoDetails = res.body
92
93 expect(videoDetails.trackerUrls[0]).to.include(server.host)
94 expect(videoDetails.streamingPlaylists[0].playlistUrl).to.include(server.host)
95 expect(videoDetails.streamingPlaylists[0].segmentsSha256Url).to.include(server.host)
89 } 96 }
90 }) 97 })
91 98
@@ -100,7 +107,7 @@ describe('Test update host scripts', function () {
100 } 107 }
101 }) 108 })
102 109
103 it('Should have update accounts url', async function () { 110 it('Should have updated accounts url', async function () {
104 const res = await getAccountsList(server.url) 111 const res = await getAccountsList(server.url)
105 expect(res.body.total).to.equal(3) 112 expect(res.body.total).to.equal(3)
106 113
@@ -112,7 +119,7 @@ describe('Test update host scripts', function () {
112 } 119 }
113 }) 120 })
114 121
115 it('Should update torrent hosts', async function () { 122 it('Should have updated torrent hosts', async function () {
116 this.timeout(30000) 123 this.timeout(30000)
117 124
118 const res = await getVideosList(server.url) 125 const res = await getVideosList(server.url)
diff --git a/server/tests/client.ts b/server/tests/client.ts
index b33a653b1..06b4a9c5a 100644
--- a/server/tests/client.ts
+++ b/server/tests/client.ts
@@ -15,7 +15,7 @@ import {
15 updateCustomConfig, 15 updateCustomConfig,
16 updateCustomSubConfig, 16 updateCustomSubConfig,
17 uploadVideo 17 uploadVideo
18} from './utils' 18} from '../../shared/utils'
19 19
20const expect = chai.expect 20const expect = chai.expect
21 21
diff --git a/server/tests/feeds/feeds.ts b/server/tests/feeds/feeds.ts
index 28fe3493b..a771474bc 100644
--- a/server/tests/feeds/feeds.ts
+++ b/server/tests/feeds/feeds.ts
@@ -13,10 +13,10 @@ import {
13 ServerInfo, 13 ServerInfo,
14 setAccessTokensToServers, 14 setAccessTokensToServers,
15 uploadVideo, userLogin 15 uploadVideo, userLogin
16} from '../utils' 16} from '../../../shared/utils'
17import * as libxmljs from 'libxmljs' 17import * as libxmljs from 'libxmljs'
18import { addVideoCommentThread } from '../utils/videos/video-comments' 18import { addVideoCommentThread } from '../../../shared/utils/videos/video-comments'
19import { waitJobs } from '../utils/server/jobs' 19import { waitJobs } from '../../../shared/utils/server/jobs'
20import { User } from '../../../shared/models/users' 20import { User } from '../../../shared/models/users'
21 21
22chai.use(require('chai-xml')) 22chai.use(require('chai-xml'))
diff --git a/server/tests/fixtures/video_short.avi b/server/tests/fixtures/video_short.avi
new file mode 100644
index 000000000..88979cab2
--- /dev/null
+++ b/server/tests/fixtures/video_short.avi
Binary files differ
diff --git a/server/tests/fixtures/video_short.mkv b/server/tests/fixtures/video_short.mkv
new file mode 100644
index 000000000..a67f4f806
--- /dev/null
+++ b/server/tests/fixtures/video_short.mkv
Binary files differ
diff --git a/server/tests/fixtures/video_short_240p.mp4 b/server/tests/fixtures/video_short_240p.mp4
new file mode 100644
index 000000000..db074940b
--- /dev/null
+++ b/server/tests/fixtures/video_short_240p.mp4
Binary files differ
diff --git a/server/tests/helpers/comment-model.ts b/server/tests/helpers/comment-model.ts
new file mode 100644
index 000000000..76bb0f212
--- /dev/null
+++ b/server/tests/helpers/comment-model.ts
@@ -0,0 +1,25 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { VideoCommentModel } from '../../models/video/video-comment'
6
7const expect = chai.expect
8
9class CommentMock {
10 text: string
11
12 extractMentions = VideoCommentModel.prototype.extractMentions
13}
14
15describe('Comment model', function () {
16 it('Should correctly extract mentions', async function () {
17 const comment = new CommentMock()
18
19 comment.text = '@florian @jean@localhost:9000 @flo @another@localhost:9000 @flo2@jean.com hello ' +
20 'email@localhost:9000 coucou.com no? @chocobozzz @chocobozzz @end'
21 const result = comment.extractMentions().sort()
22
23 expect(result).to.deep.equal([ 'another', 'chocobozzz', 'end', 'flo', 'florian', 'jean' ])
24 })
25})
diff --git a/server/tests/helpers/core-utils.ts b/server/tests/helpers/core-utils.ts
new file mode 100644
index 000000000..e604cf7e3
--- /dev/null
+++ b/server/tests/helpers/core-utils.ts
@@ -0,0 +1,98 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { snakeCase, isNumber } from 'lodash'
6import {
7 parseBytes, objectConverter
8} from '../../helpers/core-utils'
9import { isNumeric } from 'validator'
10
11const expect = chai.expect
12
13describe('Parse Bytes', function () {
14
15 it('Should pass when given valid value', async function () {
16 // just return it
17 expect(parseBytes(1024)).to.be.eq(1024)
18 expect(parseBytes(1048576)).to.be.eq(1048576)
19 expect(parseBytes('1024')).to.be.eq(1024)
20 expect(parseBytes('1048576')).to.be.eq(1048576)
21
22 // sizes
23 expect(parseBytes('1B')).to.be.eq(1024)
24 expect(parseBytes('1MB')).to.be.eq(1048576)
25 expect(parseBytes('1GB')).to.be.eq(1073741824)
26 expect(parseBytes('1TB')).to.be.eq(1099511627776)
27
28 expect(parseBytes('5GB')).to.be.eq(5368709120)
29 expect(parseBytes('5TB')).to.be.eq(5497558138880)
30
31 expect(parseBytes('1024B')).to.be.eq(1048576)
32 expect(parseBytes('1024MB')).to.be.eq(1073741824)
33 expect(parseBytes('1024GB')).to.be.eq(1099511627776)
34 expect(parseBytes('1024TB')).to.be.eq(1125899906842624)
35
36 // with whitespace
37 expect(parseBytes('1 GB')).to.be.eq(1073741824)
38 expect(parseBytes('1\tGB')).to.be.eq(1073741824)
39
40 // sum value
41 expect(parseBytes('1TB 1024MB')).to.be.eq(1100585369600)
42 expect(parseBytes('4GB 1024MB')).to.be.eq(5368709120)
43 expect(parseBytes('4TB 1024GB')).to.be.eq(5497558138880)
44 expect(parseBytes('4TB 1024GB 0MB')).to.be.eq(5497558138880)
45 expect(parseBytes('1024TB 1024GB 1024MB')).to.be.eq(1127000492212224)
46 })
47
48 it('Should be invalid when given invalid value', async function () {
49 expect(parseBytes('6GB 1GB')).to.be.eq(6)
50 })
51
52 it('Should convert an object', async function () {
53 function keyConverter (k: string) {
54 return snakeCase(k)
55 }
56
57 function valueConverter (v: any) {
58 if (isNumeric(v + '')) return parseInt('' + v, 10)
59
60 return v
61 }
62
63 const obj = {
64 mySuperKey: 'hello',
65 mySuper2Key: '45',
66 mySuper3Key: {
67 mySuperSubKey: '15',
68 mySuperSub2Key: 'hello',
69 mySuperSub3Key: [ '1', 'hello', 2 ],
70 mySuperSub4Key: 4
71 },
72 mySuper4Key: 45,
73 toto: {
74 super_key: '15',
75 superKey2: 'hello'
76 },
77 super_key: {
78 superKey4: 15
79 }
80 }
81
82 const res = objectConverter(obj, keyConverter, valueConverter)
83
84 expect(res.my_super_key).to.equal('hello')
85 expect(res.my_super_2_key).to.equal(45)
86 expect(res.my_super_3_key.my_super_sub_key).to.equal(15)
87 expect(res.my_super_3_key.my_super_sub_2_key).to.equal('hello')
88 expect(res.my_super_3_key.my_super_sub_3_key).to.deep.equal([ 1, 'hello', 2 ])
89 expect(res.my_super_3_key.my_super_sub_4_key).to.equal(4)
90 expect(res.toto.super_key).to.equal(15)
91 expect(res.toto.super_key_2).to.equal('hello')
92 expect(res.super_key.super_key_4).to.equal(15)
93
94 // Immutable
95 expect(res.mySuperKey).to.be.undefined
96 expect(obj['my_super_key']).to.be.undefined
97 })
98})
diff --git a/server/tests/helpers/index.ts b/server/tests/helpers/index.ts
new file mode 100644
index 000000000..551208245
--- /dev/null
+++ b/server/tests/helpers/index.ts
@@ -0,0 +1,2 @@
1import './core-utils'
2import './comment-model'
diff --git a/server/tests/index.ts b/server/tests/index.ts
index e659fd3df..ed16d65dd 100644
--- a/server/tests/index.ts
+++ b/server/tests/index.ts
@@ -1,6 +1,5 @@
1// Order of the tests we want to execute 1// Order of the tests we want to execute
2import './client' 2import './client'
3import './activitypub'
4import './feeds/' 3import './feeds/'
5import './cli/' 4import './cli/'
6import './api/' 5import './api/'
diff --git a/server/tests/misc-endpoints.ts b/server/tests/misc-endpoints.ts
index 8fab20971..5f82719da 100644
--- a/server/tests/misc-endpoints.ts
+++ b/server/tests/misc-endpoints.ts
@@ -2,7 +2,18 @@
2 2
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { flushTests, killallServers, makeGetRequest, runServer, ServerInfo } from './utils' 5import {
6 addVideoChannel,
7 createUser,
8 flushTests,
9 killallServers,
10 makeGetRequest,
11 runServer,
12 ServerInfo,
13 setAccessTokensToServers,
14 uploadVideo
15} from '../../shared/utils'
16import { VideoPrivacy } from '../../shared/models/videos'
6 17
7const expect = chai.expect 18const expect = chai.expect
8 19
@@ -15,6 +26,7 @@ describe('Test misc endpoints', function () {
15 await flushTests() 26 await flushTests()
16 27
17 server = await runServer(1) 28 server = await runServer(1)
29 await setAccessTokensToServers([ server ])
18 }) 30 })
19 31
20 describe('Test a well known endpoints', function () { 32 describe('Test a well known endpoints', function () {
@@ -60,6 +72,16 @@ describe('Test misc endpoints', function () {
60 72
61 expect(res.body.tracking).to.equal('N') 73 expect(res.body.tracking).to.equal('N')
62 }) 74 })
75
76 it('Should get change-password location', async function () {
77 const res = await makeGetRequest({
78 url: server.url,
79 path: '/.well-known/change-password',
80 statusCodeExpected: 302
81 })
82
83 expect(res.header.location).to.equal('/my-account/settings')
84 })
63 }) 85 })
64 86
65 describe('Test classic static endpoints', function () { 87 describe('Test classic static endpoints', function () {
@@ -93,6 +115,64 @@ describe('Test misc endpoints', function () {
93 }) 115 })
94 }) 116 })
95 117
118 describe('Test bots endpoints', function () {
119
120 it('Should get the empty sitemap', async function () {
121 const res = await makeGetRequest({
122 url: server.url,
123 path: '/sitemap.xml',
124 statusCodeExpected: 200
125 })
126
127 expect(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"')
128 expect(res.text).to.contain('<url><loc>http://localhost:9001/about/instance</loc></url>')
129 })
130
131 it('Should get the empty cached sitemap', async function () {
132 const res = await makeGetRequest({
133 url: server.url,
134 path: '/sitemap.xml',
135 statusCodeExpected: 200
136 })
137
138 expect(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"')
139 expect(res.text).to.contain('<url><loc>http://localhost:9001/about/instance</loc></url>')
140 })
141
142 it('Should add videos, channel and accounts and get sitemap', async function () {
143 this.timeout(35000)
144
145 await uploadVideo(server.url, server.accessToken, { name: 'video 1', nsfw: false })
146 await uploadVideo(server.url, server.accessToken, { name: 'video 2', nsfw: false })
147 await uploadVideo(server.url, server.accessToken, { name: 'video 3', privacy: VideoPrivacy.PRIVATE })
148
149 await addVideoChannel(server.url, server.accessToken, { name: 'channel1', displayName: 'channel 1' })
150 await addVideoChannel(server.url, server.accessToken, { name: 'channel2', displayName: 'channel 2' })
151
152 await createUser(server.url, server.accessToken, 'user1', 'password')
153 await createUser(server.url, server.accessToken, 'user2', 'password')
154
155 const res = await makeGetRequest({
156 url: server.url,
157 path: '/sitemap.xml?t=1', // avoid using cache
158 statusCodeExpected: 200
159 })
160
161 expect(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"')
162 expect(res.text).to.contain('<url><loc>http://localhost:9001/about/instance</loc></url>')
163
164 expect(res.text).to.contain('<video:title><![CDATA[video 1]]></video:title>')
165 expect(res.text).to.contain('<video:title><![CDATA[video 2]]></video:title>')
166 expect(res.text).to.not.contain('<video:title><![CDATA[video 3]]></video:title>')
167
168 expect(res.text).to.contain('<url><loc>http://localhost:9001/video-channels/channel1</loc></url>')
169 expect(res.text).to.contain('<url><loc>http://localhost:9001/video-channels/channel2</loc></url>')
170
171 expect(res.text).to.contain('<url><loc>http://localhost:9001/accounts/user1</loc></url>')
172 expect(res.text).to.contain('<url><loc>http://localhost:9001/accounts/user2</loc></url>')
173 })
174 })
175
96 after(async function () { 176 after(async function () {
97 killallServers([ server ]) 177 killallServers([ server ])
98 }) 178 })
diff --git a/server/tests/real-world/populate-database.ts b/server/tests/real-world/populate-database.ts
index a7fdbd1dc..016503498 100644
--- a/server/tests/real-world/populate-database.ts
+++ b/server/tests/real-world/populate-database.ts
@@ -10,7 +10,7 @@ import {
10 ServerInfo, 10 ServerInfo,
11 setAccessTokensToServers, 11 setAccessTokensToServers,
12 uploadVideo 12 uploadVideo
13} from '../utils' 13} from '../../../shared/utils'
14import * as Bluebird from 'bluebird' 14import * as Bluebird from 'bluebird'
15 15
16start() 16start()
diff --git a/server/tests/real-world/real-world.ts b/server/tests/real-world/real-world.ts
index a96469b11..ac3baaf9a 100644
--- a/server/tests/real-world/real-world.ts
+++ b/server/tests/real-world/real-world.ts
@@ -16,8 +16,8 @@ import {
16 updateVideo, 16 updateVideo,
17 uploadVideo, viewVideo, 17 uploadVideo, viewVideo,
18 wait 18 wait
19} from '../utils' 19} from '../../../shared/utils'
20import { getJobsListPaginationAndSort } from '../utils/server/jobs' 20import { getJobsListPaginationAndSort } from '../../../shared/utils/server/jobs'
21 21
22interface ServerInfo extends DefaultServerInfo { 22interface ServerInfo extends DefaultServerInfo {
23 requestsNumber: number 23 requestsNumber: number
diff --git a/server/tests/utils/miscs/email.ts b/server/tests/utils/miscs/email.ts
deleted file mode 100644
index 21accd09d..000000000
--- a/server/tests/utils/miscs/email.ts
+++ /dev/null
@@ -1,25 +0,0 @@
1import * as MailDev from 'maildev'
2
3function mockSmtpServer (emailsCollection: object[]) {
4 const maildev = new MailDev({
5 ip: '127.0.0.1',
6 smtp: 1025,
7 disableWeb: true,
8 silent: true
9 })
10 maildev.on('new', email => emailsCollection.push(email))
11
12 return new Promise((res, rej) => {
13 maildev.listen(err => {
14 if (err) return rej(err)
15
16 return res()
17 })
18 })
19}
20
21// ---------------------------------------------------------------------------
22
23export {
24 mockSmtpServer
25}
diff --git a/server/tests/utils/videos/video-history.ts b/server/tests/utils/videos/video-history.ts
deleted file mode 100644
index 7635478f7..000000000
--- a/server/tests/utils/videos/video-history.ts
+++ /dev/null
@@ -1,14 +0,0 @@
1import { makePutBodyRequest } from '../requests/requests'
2
3function userWatchVideo (url: string, token: string, videoId: number | string, currentTime: number) {
4 const path = '/api/v1/videos/' + videoId + '/watching'
5 const fields = { currentTime }
6
7 return makePutBodyRequest({ url, path, token, fields, statusCodeExpected: 204 })
8}
9
10// ---------------------------------------------------------------------------
11
12export {
13 userWatchVideo
14}
diff --git a/server/tools/README.md b/server/tools/README.md
new file mode 100644
index 000000000..6b94d74e5
--- /dev/null
+++ b/server/tools/README.md
@@ -0,0 +1,82 @@
1peertube(8) -- companion CLI for PeerTube
2=========================================
3
4SYNOPSIS
5--------
6
7```
8peertube [command] [options]
9```
10
11DESCRIPTION
12-----------
13
14`peertube` wraps various utilities around PeerTube that are used either on a running local, running remote, or cold local instance.
15
16COMMANDS
17--------
18
19Unless otherwise specified, every command can be queried for its own help or manual by passing its name to the `help` command, or by using the `--help` option.
20
21`auth [action]`: stores credentials for your accounts on remote instances so that you don't need to pass them at every command
22
23`upload|up`: upload a video to a remote instance
24
25 $ peertube upload \
26 -u "PEERTUBE_URL" \
27 -U "PEERTUBE_USER" \
28 --password "PEERTUBE_PASSWORD"
29
30`import-videos|import`: import a video from a streaming platform to a remote instance
31
32 $ peertube import \
33 -u "PEERTUBE_URL" \
34 -U "PEERTUBE_USER" \
35 --password "PEERTUBE_PASSWORD" \
36 -t "TARGET_URL"
37
38 The target URL can be directly the video file, or any of the supported sites of youtube-dl. The video is downloaded locally and then uploaded. Already downloaded videos will not be uploaded twice, so you can run and re-run the script in case of crash, disconnection…
39
40`watch|w`: watch a video in the terminal ✩°。⋆
41
42 -g, --gui <player> player type (default: ascii)
43 -i, --invert invert colors (ascii player only)
44 -r, --resolution <res> video resolution (default: 720)
45
46 It provides support for different players:
47
48 - ascii (default ; plays in ascii art in your terminal!)
49 - mpv
50 - mplayer
51 - vlc
52 - stdout
53 - xbmc
54 - airplay
55 - chromecast
56
57`repl`: interact with the application libraries and objects even when PeerTube is not running
58
59 Type .help to see the repl-only functions, or to see the available PeerTube core functions:
60
61 repl> lodash.keys(context)
62
63`help [cmd]`: display help for [cmd]
64
65EXAMPLES
66--------
67
68 $ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD"
69 $ peertube up <videoFile>
70 $ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10
71
72SEE ALSO
73--------
74
75[PeerTube Tools Documentation](https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/tools.md)
76
77[PeerTube Admin Documentation](https://docs.joinpeertube.org/lang/en/docs/)
78
79REPORTING BUGS
80--------------
81
82See [PeerTube repository](https://github.com/Chocobozzz/PeerTube).
diff --git a/server/tools/cli.ts b/server/tools/cli.ts
index 53b20964e..108c44218 100644
--- a/server/tools/cli.ts
+++ b/server/tools/cli.ts
@@ -23,7 +23,7 @@ async function getSettings () {
23 if (err) { 23 if (err) {
24 return rej(err) 24 return rej(err)
25 } 25 }
26 return res(data || settings) 26 return res(Object.keys(data).length === 0 ? settings : data)
27 }) 27 })
28 }) 28 })
29} 29}
diff --git a/server/tools/peertube-auth.ts b/server/tools/peertube-auth.ts
index 33438811e..a962944a4 100644
--- a/server/tools/peertube-auth.ts
+++ b/server/tools/peertube-auth.ts
@@ -5,34 +5,25 @@ import { getSettings, writeSettings, netrc } from './cli'
5import { isHostValid } from '../helpers/custom-validators/servers' 5import { isHostValid } from '../helpers/custom-validators/servers'
6import { isUserUsernameValid } from '../helpers/custom-validators/users' 6import { isUserUsernameValid } from '../helpers/custom-validators/users'
7 7
8function delInstance (url: string) { 8async function delInstance (url: string) {
9 return new Promise((res, rej): void => { 9 const settings = await getSettings()
10 getSettings() 10
11 .then(async (settings) => { 11 settings.remotes.splice(settings.remotes.indexOf(url))
12 settings.remotes.splice(settings.remotes.indexOf(url)) 12 await writeSettings(settings)
13 await writeSettings(settings) 13
14 delete netrc.machines[url] 14 delete netrc.machines[url]
15 netrc.save() 15 await netrc.save()
16 res()
17 })
18 .catch(err => rej(err))
19 })
20} 16}
21 17
22async function setInstance (url: string, username: string, password: string) { 18async function setInstance (url: string, username: string, password: string) {
23 return new Promise((res, rej): void => { 19 const settings = await getSettings()
24 getSettings() 20 if (settings.remotes.indexOf(url) === -1) {
25 .then(async settings => { 21 settings.remotes.push(url)
26 if (settings.remotes.indexOf(url) === -1) { 22 }
27 settings.remotes.push(url) 23 await writeSettings(settings)
28 } 24
29 await writeSettings(settings) 25 netrc.machines[url] = { login: username, password }
30 netrc.machines[url] = { login: username, password } 26 await netrc.save()
31 netrc.save()
32 res()
33 })
34 .catch(err => rej(err))
35 })
36} 27}
37 28
38function isURLaPeerTubeInstance (url: string) { 29function isURLaPeerTubeInstance (url: string) {
@@ -71,56 +62,60 @@ program
71 required: true 62 required: true
72 } 63 }
73 } 64 }
74 }, (_, result) => { 65 }, async (_, result) => {
75 setInstance(result.url, result.username, result.password) 66 await setInstance(result.url, result.username, result.password)
67
68 process.exit(0)
76 }) 69 })
77 }) 70 })
78 71
79program 72program
80 .command('del <url>') 73 .command('del <url>')
81 .description('unregisters a remote instance') 74 .description('unregisters a remote instance')
82 .action((url) => { 75 .action(async url => {
83 delInstance(url) 76 await delInstance(url)
77
78 process.exit(0)
84 }) 79 })
85 80
86program 81program
87 .command('list') 82 .command('list')
88 .description('lists registered remote instances') 83 .description('lists registered remote instances')
89 .action(() => { 84 .action(async () => {
90 getSettings() 85 const settings = await getSettings()
91 .then(settings => { 86 const table = new Table({
92 const table = new Table({ 87 head: ['instance', 'login'],
93 head: ['instance', 'login'], 88 colWidths: [30, 30]
94 colWidths: [30, 30] 89 })
95 }) 90 netrc.loadSync()
96 netrc.loadSync() 91 settings.remotes.forEach(element => {
97 settings.remotes.forEach(element => { 92 table.push([
98 table.push([ 93 element,
99 element, 94 netrc.machines[element].login
100 netrc.machines[element].login 95 ])
101 ]) 96 })
102 }) 97
103 98 console.log(table.toString())
104 console.log(table.toString()) 99
105 }) 100 process.exit(0)
106 }) 101 })
107 102
108program 103program
109 .command('set-default <url>') 104 .command('set-default <url>')
110 .description('set an existing entry as default') 105 .description('set an existing entry as default')
111 .action((url) => { 106 .action(async url => {
112 getSettings() 107 const settings = await getSettings()
113 .then(settings => { 108 const instanceExists = settings.remotes.indexOf(url) !== -1
114 const instanceExists = settings.remotes.indexOf(url) !== -1 109
115 110 if (instanceExists) {
116 if (instanceExists) { 111 settings.default = settings.remotes.indexOf(url)
117 settings.default = settings.remotes.indexOf(url) 112 await writeSettings(settings)
118 writeSettings(settings) 113
119 } else { 114 process.exit(0)
120 console.log('<url> is not a registered instance.') 115 } else {
121 process.exit(-1) 116 console.log('<url> is not a registered instance.')
122 } 117 process.exit(-1)
123 }) 118 }
124 }) 119 })
125 120
126program.on('--help', function () { 121program.on('--help', function () {
diff --git a/server/tools/peertube-get-access-token.ts b/server/tools/peertube-get-access-token.ts
index eb2571a03..a68665f5b 100644
--- a/server/tools/peertube-get-access-token.ts
+++ b/server/tools/peertube-get-access-token.ts
@@ -6,7 +6,7 @@ import {
6 Server, 6 Server,
7 Client, 7 Client,
8 User 8 User
9} from '../tests/utils/index' 9} from '../../shared/utils'
10 10
11program 11program
12 .option('-u, --url <url>', 'Server url') 12 .option('-u, --url <url>', 'Server url')
diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts
index 15f517cab..151c5a989 100644
--- a/server/tools/peertube-import-videos.ts
+++ b/server/tools/peertube-import-videos.ts
@@ -6,10 +6,11 @@ import { join } from 'path'
6import { VideoPrivacy } from '../../shared/models/videos' 6import { VideoPrivacy } from '../../shared/models/videos'
7import { doRequestAndSaveToFile } from '../helpers/requests' 7import { doRequestAndSaveToFile } from '../helpers/requests'
8import { CONSTRAINTS_FIELDS } from '../initializers' 8import { CONSTRAINTS_FIELDS } from '../initializers'
9import { getClient, getVideoCategories, login, searchVideoWithSort, uploadVideo } from '../tests/utils' 9import { getClient, getVideoCategories, login, searchVideoWithSort, uploadVideo } from '../../shared/utils/index'
10import { truncate } from 'lodash' 10import { truncate } from 'lodash'
11import * as prompt from 'prompt' 11import * as prompt from 'prompt'
12import { remove } from 'fs-extra' 12import { remove } from 'fs-extra'
13import { sha256 } from '../helpers/core-utils'
13import { safeGetYoutubeDL } from '../helpers/youtube-dl' 14import { safeGetYoutubeDL } from '../helpers/youtube-dl'
14import { getSettings, netrc } from './cli' 15import { getSettings, netrc } from './cli'
15 16
@@ -57,6 +58,7 @@ getSettings()
57 settings.remotes[settings.default] : 58 settings.remotes[settings.default] :
58 settings.remotes[0] 59 settings.remotes[0]
59 } 60 }
61
60 if (!program['username']) program['username'] = netrc.machines[program['url']].login 62 if (!program['username']) program['username'] = netrc.machines[program['url']].login
61 if (!program['password']) program['password'] = netrc.machines[program['url']].password 63 if (!program['password']) program['password'] = netrc.machines[program['url']].password
62 } 64 }
@@ -68,12 +70,19 @@ getSettings()
68 process.exit(-1) 70 process.exit(-1)
69 } 71 }
70 72
73 removeEndSlashes(program['url'])
74 removeEndSlashes(program['targetUrl'])
75
71 const user = { 76 const user = {
72 username: program['username'], 77 username: program['username'],
73 password: program['password'] 78 password: program['password']
74 } 79 }
75 80
76 run(user, program['url']).catch(err => console.error(err)) 81 run(user, program['url'])
82 .catch(err => {
83 console.error(err)
84 process.exit(-1)
85 })
77}) 86})
78 87
79async function promptPassword () { 88async function promptPassword () {
@@ -107,8 +116,12 @@ async function run (user, url: string) {
107 secret: res.body.client_secret 116 secret: res.body.client_secret
108 } 117 }
109 118
110 const res2 = await login(url, client, user) 119 try {
111 accessToken = res2.body.access_token 120 const res = await login(program[ 'url' ], client, user)
121 accessToken = res.body.access_token
122 } catch (err) {
123 throw new Error('Cannot authenticate. Please check your username/password.')
124 }
112 125
113 const youtubeDL = await safeGetYoutubeDL() 126 const youtubeDL = await safeGetYoutubeDL()
114 127
@@ -133,8 +146,7 @@ async function run (user, url: string) {
133 await processVideo(info, program['language'], processOptions.cwd, url, user) 146 await processVideo(info, program['language'], processOptions.cwd, url, user)
134 } 147 }
135 148
136 // https://www.youtube.com/watch?v=2Upx39TBc1s 149 console.log('Video/s for user %s imported: %s', program['username'], program['targetUrl'])
137 console.log('I\'m finished!')
138 process.exit(0) 150 process.exit(0)
139 }) 151 })
140} 152}
@@ -155,7 +167,7 @@ function processVideo (info: any, languageCode: string, cwd: string, url: string
155 return res() 167 return res()
156 } 168 }
157 169
158 const path = join(cwd, new Date().getTime() + '.mp4') 170 const path = join(cwd, sha256(videoInfo.url) + '.mp4')
159 171
160 console.log('Downloading video "%s"...', videoInfo.title) 172 console.log('Downloading video "%s"...', videoInfo.title)
161 173
@@ -192,7 +204,7 @@ async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, cwd: st
192 204
193 let thumbnailfile 205 let thumbnailfile
194 if (videoInfo.thumbnail) { 206 if (videoInfo.thumbnail) {
195 thumbnailfile = join(cwd, 'thumbnail.jpg') 207 thumbnailfile = join(cwd, sha256(videoInfo.thumbnail) + '.jpg')
196 208
197 await doRequestAndSaveToFile({ 209 await doRequestAndSaveToFile({
198 method: 'GET', 210 method: 'GET',
@@ -322,3 +334,9 @@ function isNSFW (info: any) {
322 334
323 return false 335 return false
324} 336}
337
338function removeEndSlashes (url: string) {
339 while (url.endsWith('/')) {
340 url.slice(0, -1)
341 }
342}
diff --git a/server/tools/peertube-repl.ts b/server/tools/peertube-repl.ts
new file mode 100644
index 000000000..04d8b95a3
--- /dev/null
+++ b/server/tools/peertube-repl.ts
@@ -0,0 +1,76 @@
1import * as repl from 'repl'
2import * as path from 'path'
3import * as _ from 'lodash'
4import * as uuidv1 from 'uuid/v1'
5import * as uuidv3 from 'uuid/v3'
6import * as uuidv4 from 'uuid/v4'
7import * as uuidv5 from 'uuid/v5'
8import * as Sequelize from 'sequelize'
9import * as YoutubeDL from 'youtube-dl'
10
11import { initDatabaseModels, sequelizeTypescript } from '../initializers'
12import * as cli from '../tools/cli'
13import { logger } from '../helpers/logger'
14import * as constants from '../initializers/constants'
15import * as modelsUtils from '../models/utils'
16import * as coreUtils from '../helpers/core-utils'
17import * as ffmpegUtils from '../helpers/ffmpeg-utils'
18import * as peertubeCryptoUtils from '../helpers/peertube-crypto'
19import * as signupUtils from '../helpers/signup'
20import * as utils from '../helpers/utils'
21import * as YoutubeDLUtils from '../helpers/youtube-dl'
22
23const start = async () => {
24 await initDatabaseModels(true)
25
26 const versionCommitHash = await utils.getServerCommit()
27
28 const initContext = (replServer) => {
29 return (context) => {
30 const properties = {
31 context, repl: replServer, env: process.env,
32 lodash: _, path,
33 uuidv1, uuidv3, uuidv4, uuidv5,
34 cli, logger, constants,
35 Sequelize, sequelizeTypescript, modelsUtils,
36 models: sequelizeTypescript.models, transaction: sequelizeTypescript.transaction,
37 query: sequelizeTypescript.query, queryInterface: sequelizeTypescript.getQueryInterface(),
38 YoutubeDL,
39 coreUtils, ffmpegUtils, peertubeCryptoUtils, signupUtils, utils, YoutubeDLUtils
40 }
41
42 for (let prop in properties) {
43 Object.defineProperty(context, prop, {
44 configurable: false,
45 enumerable: true,
46 value: properties[prop]
47 })
48 }
49 }
50 }
51
52 const replServer = repl.start({
53 prompt: `PeerTube [${cli.version}] (${versionCommitHash})> `
54 })
55
56 initContext(replServer)(replServer.context)
57 replServer.on('reset', initContext(replServer))
58 replServer.on('exit', () => process.exit())
59
60 const resetCommand = {
61 help: 'Reset REPL',
62 action () {
63 this.write('.clear\n')
64 this.displayPrompt()
65 }
66 }
67 replServer.defineCommand('reset', resetCommand)
68 replServer.defineCommand('r', resetCommand)
69
70}
71
72start().then((data) => {
73 // do nothing
74}).catch((err) => {
75 console.error(err)
76})
diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts
index b17bc4288..ebc62c965 100644
--- a/server/tools/peertube-upload.ts
+++ b/server/tools/peertube-upload.ts
@@ -1,8 +1,8 @@
1import * as program from 'commander' 1import * as program from 'commander'
2import { access, constants } from 'fs-extra' 2import { access, constants } from 'fs-extra'
3import { isAbsolute } from 'path' 3import { isAbsolute } from 'path'
4import { getClient, login } from '../tests/utils' 4import { getClient, login } from '../../shared/utils'
5import { uploadVideo } from '../tests/utils/index' 5import { uploadVideo } from '../../shared/utils/'
6import { VideoPrivacy } from '../../shared/models/videos' 6import { VideoPrivacy } from '../../shared/models/videos'
7import { netrc, getSettings } from './cli' 7import { netrc, getSettings } from './cli'
8 8
diff --git a/server/tools/peertube.ts b/server/tools/peertube.ts
index ad76bafb4..5d3ab2815 100755
--- a/server/tools/peertube.ts
+++ b/server/tools/peertube.ts
@@ -17,6 +17,7 @@ program
17 .command('import-videos', 'import a video from a streaming platform').alias('import') 17 .command('import-videos', 'import a video from a streaming platform').alias('import')
18 .command('get-access-token', 'get a peertube access token', { noHelp: true }).alias('token') 18 .command('get-access-token', 'get a peertube access token', { noHelp: true }).alias('token')
19 .command('watch', 'watch a video in the terminal ✩°。⋆').alias('w') 19 .command('watch', 'watch a video in the terminal ✩°。⋆').alias('w')
20 .command('repl', 'initiate a REPL to access internals')
20 21
21/* Not Yet Implemented */ 22/* Not Yet Implemented */
22program 23program
@@ -57,7 +58,7 @@ if (!process.argv.slice(2).length) {
57 ,"\\/ 58 ,"\\/
58 _,.__/"\\/_ (the CLI for red chocobos) 59 _,.__/"\\/_ (the CLI for red chocobos)
59 / \\) "./, ". 60 / \\) "./, ".
60 --/---"---" "-) )---- by Chocobozzz et al.`) 61 --/---"---" "-) )---- by Chocobozzz et al.\n`)
61} 62}
62 63
63getSettings() 64getSettings()
diff --git a/shared/models/activitypub/activity.ts b/shared/models/activitypub/activity.ts
index 44cb99efb..89994f665 100644
--- a/shared/models/activitypub/activity.ts
+++ b/shared/models/activitypub/activity.ts
@@ -5,12 +5,14 @@ import { DislikeObject } from './objects/dislike-object'
5import { VideoAbuseObject } from './objects/video-abuse-object' 5import { VideoAbuseObject } from './objects/video-abuse-object'
6import { VideoCommentObject } from './objects/video-comment-object' 6import { VideoCommentObject } from './objects/video-comment-object'
7import { ViewObject } from './objects/view-object' 7import { ViewObject } from './objects/view-object'
8import { APObject } from './objects/object.model'
8 9
9export type Activity = ActivityCreate | ActivityUpdate | 10export type Activity = ActivityCreate | ActivityUpdate |
10 ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce | 11 ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce |
11 ActivityUndo | ActivityLike | ActivityReject 12 ActivityUndo | ActivityLike | ActivityReject | ActivityView | ActivityDislike | ActivityFlag
12 13
13export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' 14export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' |
15 'View' | 'Dislike' | 'Flag'
14 16
15export interface ActivityAudience { 17export interface ActivityAudience {
16 to: string[] 18 to: string[]
@@ -59,15 +61,34 @@ export interface ActivityReject extends BaseActivity {
59 61
60export interface ActivityAnnounce extends BaseActivity { 62export interface ActivityAnnounce extends BaseActivity {
61 type: 'Announce' 63 type: 'Announce'
62 object: string | { id: string } 64 object: APObject
63} 65}
64 66
65export interface ActivityUndo extends BaseActivity { 67export interface ActivityUndo extends BaseActivity {
66 type: 'Undo', 68 type: 'Undo',
67 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce 69 object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce
68} 70}
69 71
70export interface ActivityLike extends BaseActivity { 72export interface ActivityLike extends BaseActivity {
71 type: 'Like', 73 type: 'Like',
72 object: string 74 object: APObject
75}
76
77export interface ActivityView extends BaseActivity {
78 type: 'View',
79 actor: string
80 object: APObject
81}
82
83export interface ActivityDislike extends BaseActivity {
84 id: string
85 type: 'Dislike'
86 actor: string
87 object: APObject
88}
89
90export interface ActivityFlag extends BaseActivity {
91 type: 'Flag',
92 content: string,
93 object: APObject
73} 94}
diff --git a/shared/models/activitypub/activitypub-ordered-collection.ts b/shared/models/activitypub/activitypub-ordered-collection.ts
index dfec0bb76..3de0890bb 100644
--- a/shared/models/activitypub/activitypub-ordered-collection.ts
+++ b/shared/models/activitypub/activitypub-ordered-collection.ts
@@ -2,6 +2,9 @@ export interface ActivityPubOrderedCollection<T> {
2 '@context': string[] 2 '@context': string[]
3 type: 'OrderedCollection' | 'OrderedCollectionPage' 3 type: 'OrderedCollection' | 'OrderedCollectionPage'
4 totalItems: number 4 totalItems: number
5 partOf?: string
6 orderedItems: T[] 5 orderedItems: T[]
6
7 partOf?: string
8 next?: string
9 first?: string
7} 10}
diff --git a/shared/models/activitypub/objects/cache-file-object.ts b/shared/models/activitypub/objects/cache-file-object.ts
index 0a5125f5b..4b0a3a724 100644
--- a/shared/models/activitypub/objects/cache-file-object.ts
+++ b/shared/models/activitypub/objects/cache-file-object.ts
@@ -1,9 +1,9 @@
1import { ActivityVideoUrlObject } from './common-objects' 1import { ActivityVideoUrlObject, ActivityPlaylistUrlObject } from './common-objects'
2 2
3export interface CacheFileObject { 3export interface CacheFileObject {
4 id: string 4 id: string
5 type: 'CacheFile', 5 type: 'CacheFile',
6 object: string 6 object: string
7 expires: string 7 expires: string
8 url: ActivityVideoUrlObject 8 url: ActivityVideoUrlObject | ActivityPlaylistUrlObject
9} 9}
diff --git a/shared/models/activitypub/objects/common-objects.ts b/shared/models/activitypub/objects/common-objects.ts
index 1de60da94..8c89810d6 100644
--- a/shared/models/activitypub/objects/common-objects.ts
+++ b/shared/models/activitypub/objects/common-objects.ts
@@ -19,28 +19,56 @@ export interface ActivityIconObject {
19 19
20export type ActivityVideoUrlObject = { 20export type ActivityVideoUrlObject = {
21 type: 'Link' 21 type: 'Link'
22 mimeType: 'video/mp4' | 'video/webm' | 'video/ogg' 22 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
23 mimeType?: 'video/mp4' | 'video/webm' | 'video/ogg'
24 mediaType: 'video/mp4' | 'video/webm' | 'video/ogg'
23 href: string 25 href: string
24 height: number 26 height: number
25 size: number 27 size: number
26 fps: number 28 fps: number
27} 29}
28 30
29export type ActivityUrlObject = 31export type ActivityPlaylistSegmentHashesObject = {
30 ActivityVideoUrlObject 32 type: 'Link'
31 | 33 name: 'sha256'
32 { 34 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
33 type: 'Link' 35 mimeType?: 'application/json'
34 mimeType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet' 36 mediaType: 'application/json'
35 href: string 37 href: string
36 height: number 38}
37 } 39
38 | 40export type ActivityPlaylistInfohashesObject = {
39 { 41 type: 'Infohash'
40 type: 'Link' 42 name: string
41 mimeType: 'text/html' 43}
42 href: string 44
43 } 45export type ActivityPlaylistUrlObject = {
46 type: 'Link'
47 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
48 mimeType?: 'application/x-mpegURL'
49 mediaType: 'application/x-mpegURL'
50 href: string
51 tag?: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
52}
53
54export type ActivityBitTorrentUrlObject = {
55 type: 'Link'
56 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
57 mimeType?: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
58 mediaType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
59 href: string
60 height: number
61}
62
63export type ActivityHtmlUrlObject = {
64 type: 'Link'
65 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
66 mimeType?: 'text/html'
67 mediaType: 'text/html'
68 href: string
69}
70
71export type ActivityUrlObject = ActivityVideoUrlObject | ActivityPlaylistUrlObject | ActivityBitTorrentUrlObject | ActivityHtmlUrlObject
44 72
45export interface ActivityPubAttributedTo { 73export interface ActivityPubAttributedTo {
46 type: 'Group' | 'Person' 74 type: 'Group' | 'Person'
diff --git a/shared/models/activitypub/objects/dislike-object.ts b/shared/models/activitypub/objects/dislike-object.ts
index 295175774..7218fb784 100644
--- a/shared/models/activitypub/objects/dislike-object.ts
+++ b/shared/models/activitypub/objects/dislike-object.ts
@@ -1,5 +1,6 @@
1export interface DislikeObject { 1export interface DislikeObject {
2 type: 'Dislike', 2 id: string
3 type: 'Dislike'
3 actor: string 4 actor: string
4 object: string 5 object: string
5} 6}
diff --git a/shared/models/activitypub/objects/object.model.ts b/shared/models/activitypub/objects/object.model.ts
new file mode 100644
index 000000000..3fd33800a
--- /dev/null
+++ b/shared/models/activitypub/objects/object.model.ts
@@ -0,0 +1 @@
export type APObject = string | { id: string }
diff --git a/shared/models/actors/actor.model.ts b/shared/models/actors/actor.model.ts
index 6b3b1b47c..a3953874d 100644
--- a/shared/models/actors/actor.model.ts
+++ b/shared/models/actors/actor.model.ts
@@ -10,5 +10,5 @@ export interface Actor {
10 followersCount: number 10 followersCount: number
11 createdAt: Date | string 11 createdAt: Date | string
12 updatedAt: Date | string 12 updatedAt: Date | string
13 avatar: Avatar 13 avatar?: Avatar
14} 14}
diff --git a/shared/models/blocklist/account-block.model.ts b/shared/models/blocklist/account-block.model.ts
new file mode 100644
index 000000000..a942ed614
--- /dev/null
+++ b/shared/models/blocklist/account-block.model.ts
@@ -0,0 +1,7 @@
1import { Account } from '../actors'
2
3export interface AccountBlock {
4 byAccount: Account
5 blockedAccount: Account
6 createdAt: Date | string
7}
diff --git a/shared/models/blocklist/index.ts b/shared/models/blocklist/index.ts
new file mode 100644
index 000000000..fc7873270
--- /dev/null
+++ b/shared/models/blocklist/index.ts
@@ -0,0 +1,2 @@
1export * from './account-block.model'
2export * from './server-block.model'
diff --git a/shared/models/blocklist/server-block.model.ts b/shared/models/blocklist/server-block.model.ts
new file mode 100644
index 000000000..a8b8af0b7
--- /dev/null
+++ b/shared/models/blocklist/server-block.model.ts
@@ -0,0 +1,9 @@
1import { Account } from '../actors'
2
3export interface ServerBlock {
4 byAccount: Account
5 blockedServer: {
6 host: string
7 }
8 createdAt: Date | string
9}
diff --git a/shared/models/i18n/i18n.ts b/shared/models/i18n/i18n.ts
index 5c3249452..d7164b73f 100644
--- a/shared/models/i18n/i18n.ts
+++ b/shared/models/i18n/i18n.ts
@@ -8,12 +8,14 @@ export const I18N_LOCALES = {
8 'cs-CZ': 'Čeština', 8 'cs-CZ': 'Čeština',
9 'eo': 'Esperanto', 9 'eo': 'Esperanto',
10 'de-DE': 'Deutsch', 10 'de-DE': 'Deutsch',
11 'it-IT': 'Italiano',
11 'es-ES': 'Español', 12 'es-ES': 'Español',
12 'oc': 'Occitan', 13 'oc': 'Occitan',
13 'zh-Hant-TW': 'ç¹é«”中文(å°ç£ï¼‰', 14 'zh-Hant-TW': 'ç¹é«”中文(å°ç£ï¼‰',
14 'pt-BR': 'Português (Brasil)', 15 'pt-BR': 'Português (Brasil)',
15 'sv-SE': 'svenska', 16 'sv-SE': 'svenska',
16 // 'pl-PL': 'Polski' 17 'pl-PL': 'Polski',
18 'ru-RU': 'руÑÑкий',
17 'zh-Hans-CN': '简体中文(中国)' 19 'zh-Hans-CN': '简体中文(中国)'
18} 20}
19 21
@@ -26,8 +28,9 @@ const I18N_LOCALE_ALIAS = {
26 'de': 'de-DE', 28 'de': 'de-DE',
27 'es': 'es-ES', 29 'es': 'es-ES',
28 'pt': 'pt-BR', 30 'pt': 'pt-BR',
29 'sv': 'sv-SE' 31 'sv': 'sv-SE',
30 // 'pl': 'pl-PL' 32 'pl': 'pl-PL',
33 'ru': 'ru-RU'
31} 34}
32 35
33export const POSSIBLE_LOCALES = Object.keys(I18N_LOCALES) 36export const POSSIBLE_LOCALES = Object.keys(I18N_LOCALES)
diff --git a/shared/models/index.ts b/shared/models/index.ts
index e61d6cbdc..062533834 100644
--- a/shared/models/index.ts
+++ b/shared/models/index.ts
@@ -1,6 +1,7 @@
1export * from './activitypub' 1export * from './activitypub'
2export * from './actors' 2export * from './actors'
3export * from './avatars' 3export * from './avatars'
4export * from './blocklist'
4export * from './redundancy' 5export * from './redundancy'
5export * from './users' 6export * from './users'
6export * from './videos' 7export * from './videos'
diff --git a/shared/models/search/videos-search-query.model.ts b/shared/models/search/videos-search-query.model.ts
index 29aa5c100..0db220758 100644
--- a/shared/models/search/videos-search-query.model.ts
+++ b/shared/models/search/videos-search-query.model.ts
@@ -1,4 +1,5 @@
1import { NSFWQuery } from './nsfw-query.model' 1import { NSFWQuery } from './nsfw-query.model'
2import { VideoFilter } from '../videos'
2 3
3export interface VideosSearchQuery { 4export interface VideosSearchQuery {
4 search?: string 5 search?: string
@@ -23,4 +24,6 @@ export interface VideosSearchQuery {
23 24
24 durationMin?: number // seconds 25 durationMin?: number // seconds
25 durationMax?: number // seconds 26 durationMax?: number // seconds
27
28 filter?: VideoFilter
26} 29}
diff --git a/shared/models/server/contact-form.model.ts b/shared/models/server/contact-form.model.ts
new file mode 100644
index 000000000..0696be8b4
--- /dev/null
+++ b/shared/models/server/contact-form.model.ts
@@ -0,0 +1,5 @@
1export interface ContactForm {
2 fromEmail: string
3 fromName: string
4 body: string
5}
diff --git a/shared/models/server/custom-config.model.ts b/shared/models/server/custom-config.model.ts
index 3afd36fcd..b42ff90c6 100644
--- a/shared/models/server/custom-config.model.ts
+++ b/shared/models/server/custom-config.model.ts
@@ -41,6 +41,10 @@ export interface CustomConfig {
41 email: string 41 email: string
42 } 42 }
43 43
44 contactForm: {
45 enabled: boolean
46 }
47
44 user: { 48 user: {
45 videoQuota: number 49 videoQuota: number
46 videoQuotaDaily: number 50 videoQuotaDaily: number
@@ -48,6 +52,7 @@ export interface CustomConfig {
48 52
49 transcoding: { 53 transcoding: {
50 enabled: boolean 54 enabled: boolean
55 allowAdditionalExtensions: boolean
51 threads: number 56 threads: number
52 resolutions: { 57 resolutions: {
53 '240p': boolean 58 '240p': boolean
@@ -56,6 +61,9 @@ export interface CustomConfig {
56 '720p': boolean 61 '720p': boolean
57 '1080p': boolean 62 '1080p': boolean
58 } 63 }
64 hls: {
65 enabled: boolean
66 }
59 } 67 }
60 68
61 import: { 69 import: {
diff --git a/shared/models/server/index.ts b/shared/models/server/index.ts
new file mode 100644
index 000000000..c42f6f67f
--- /dev/null
+++ b/shared/models/server/index.ts
@@ -0,0 +1,6 @@
1export * from './about.model'
2export * from './contact-form.model'
3export * from './custom-config.model'
4export * from './job.model'
5export * from './server-config.model'
6export * from './server-stats.model'
diff --git a/shared/models/server/job.model.ts b/shared/models/server/job.model.ts
index 4046297c4..85bc9541b 100644
--- a/shared/models/server/job.model.ts
+++ b/shared/models/server/job.model.ts
@@ -8,7 +8,8 @@ export type JobType = 'activitypub-http-unicast' |
8 'video-file' | 8 'video-file' |
9 'email' | 9 'email' |
10 'video-import' | 10 'video-import' |
11 'videos-views' 11 'videos-views' |
12 'activitypub-refresher'
12 13
13export interface Job { 14export interface Job {
14 id: number 15 id: number
diff --git a/shared/models/server/server-config.model.ts b/shared/models/server/server-config.model.ts
index 91196c1eb..baafed31f 100644
--- a/shared/models/server/server-config.model.ts
+++ b/shared/models/server/server-config.model.ts
@@ -15,13 +15,25 @@ export interface ServerConfig {
15 } 15 }
16 } 16 }
17 17
18 email: {
19 enabled: boolean
20 }
21
22 contactForm: {
23 enabled: boolean
24 }
25
18 signup: { 26 signup: {
19 allowed: boolean, 27 allowed: boolean,
20 allowedForCurrentIP: boolean, 28 allowedForCurrentIP: boolean
21 requiresEmailVerification: boolean 29 requiresEmailVerification: boolean
22 } 30 }
23 31
24 transcoding: { 32 transcoding: {
33 hls: {
34 enabled: boolean
35 }
36
25 enabledResolutions: number[] 37 enabledResolutions: number[]
26 } 38 }
27 39
@@ -40,7 +52,7 @@ export interface ServerConfig {
40 file: { 52 file: {
41 size: { 53 size: {
42 max: number 54 max: number
43 }, 55 }
44 extensions: string[] 56 extensions: string[]
45 } 57 }
46 } 58 }
@@ -70,4 +82,10 @@ export interface ServerConfig {
70 videoQuota: number 82 videoQuota: number
71 videoQuotaDaily: number 83 videoQuotaDaily: number
72 } 84 }
85
86 trending: {
87 videos: {
88 intervalDays: number
89 }
90 }
73} 91}
diff --git a/shared/models/server/server-stats.model.ts b/shared/models/server/server-stats.model.ts
index a6bd2d4d3..74f3de5d3 100644
--- a/shared/models/server/server-stats.model.ts
+++ b/shared/models/server/server-stats.model.ts
@@ -5,6 +5,7 @@ export interface ServerStats {
5 totalLocalVideos: number 5 totalLocalVideos: number
6 totalLocalVideoViews: number 6 totalLocalVideoViews: number
7 totalLocalVideoComments: number 7 totalLocalVideoComments: number
8 totalLocalVideoFilesSize: number
8 9
9 totalVideos: number 10 totalVideos: number
10 totalVideoComments: number 11 totalVideoComments: number
diff --git a/shared/models/users/index.ts b/shared/models/users/index.ts
index 7114741e0..cd07cf320 100644
--- a/shared/models/users/index.ts
+++ b/shared/models/users/index.ts
@@ -1,6 +1,8 @@
1export * from './user.model' 1export * from './user.model'
2export * from './user-create.model' 2export * from './user-create.model'
3export * from './user-login.model' 3export * from './user-login.model'
4export * from './user-notification.model'
5export * from './user-notification-setting.model'
4export * from './user-refresh-token.model' 6export * from './user-refresh-token.model'
5export * from './user-update.model' 7export * from './user-update.model'
6export * from './user-update-me.model' 8export * from './user-update-me.model'
diff --git a/shared/models/users/user-notification-setting.model.ts b/shared/models/users/user-notification-setting.model.ts
new file mode 100644
index 000000000..531e12bba
--- /dev/null
+++ b/shared/models/users/user-notification-setting.model.ts
@@ -0,0 +1,17 @@
1export enum UserNotificationSettingValue {
2 NONE = 0,
3 WEB = 1 << 0,
4 EMAIL = 1 << 1
5}
6
7export interface UserNotificationSetting {
8 newVideoFromSubscription: UserNotificationSettingValue
9 newCommentOnMyVideo: UserNotificationSettingValue
10 videoAbuseAsModerator: UserNotificationSettingValue
11 blacklistOnMyVideo: UserNotificationSettingValue
12 myVideoPublished: UserNotificationSettingValue
13 myVideoImportFinished: UserNotificationSettingValue
14 newUserRegistration: UserNotificationSettingValue
15 newFollow: UserNotificationSettingValue
16 commentMention: UserNotificationSettingValue
17}
diff --git a/shared/models/users/user-notification.model.ts b/shared/models/users/user-notification.model.ts
new file mode 100644
index 000000000..186b62612
--- /dev/null
+++ b/shared/models/users/user-notification.model.ts
@@ -0,0 +1,83 @@
1export enum UserNotificationType {
2 NEW_VIDEO_FROM_SUBSCRIPTION = 1,
3 NEW_COMMENT_ON_MY_VIDEO = 2,
4 NEW_VIDEO_ABUSE_FOR_MODERATORS = 3,
5
6 BLACKLIST_ON_MY_VIDEO = 4,
7 UNBLACKLIST_ON_MY_VIDEO = 5,
8
9 MY_VIDEO_PUBLISHED = 6,
10
11 MY_VIDEO_IMPORT_SUCCESS = 7,
12 MY_VIDEO_IMPORT_ERROR = 8,
13
14 NEW_USER_REGISTRATION = 9,
15 NEW_FOLLOW = 10,
16 COMMENT_MENTION = 11
17}
18
19export interface VideoInfo {
20 id: number
21 uuid: string
22 name: string
23}
24
25export interface ActorInfo {
26 id: number
27 displayName: string
28 name: string
29 host: string
30 avatar?: {
31 path: string
32 }
33}
34
35export interface UserNotification {
36 id: number
37 type: UserNotificationType
38 read: boolean
39
40 video?: VideoInfo & {
41 channel: ActorInfo
42 }
43
44 videoImport?: {
45 id: number
46 video?: VideoInfo
47 torrentName?: string
48 magnetUri?: string
49 targetUrl?: string
50 }
51
52 comment?: {
53 id: number
54 threadId: number
55 account: ActorInfo
56 video: VideoInfo
57 }
58
59 videoAbuse?: {
60 id: number
61 video: VideoInfo
62 }
63
64 videoBlacklist?: {
65 id: number
66 video: VideoInfo
67 }
68
69 account?: ActorInfo
70
71 actorFollow?: {
72 id: number
73 follower: ActorInfo
74 following: {
75 type: 'account' | 'channel'
76 name: string
77 displayName: string
78 }
79 }
80
81 createdAt: string
82 updatedAt: string
83}
diff --git a/shared/models/users/user-right.enum.ts b/shared/models/users/user-right.enum.ts
index c4ccd632f..090256bca 100644
--- a/shared/models/users/user-right.enum.ts
+++ b/shared/models/users/user-right.enum.ts
@@ -2,17 +2,26 @@ export enum UserRight {
2 ALL, 2 ALL,
3 3
4 MANAGE_USERS, 4 MANAGE_USERS,
5
5 MANAGE_SERVER_FOLLOW, 6 MANAGE_SERVER_FOLLOW,
7
6 MANAGE_SERVER_REDUNDANCY, 8 MANAGE_SERVER_REDUNDANCY,
9
7 MANAGE_VIDEO_ABUSES, 10 MANAGE_VIDEO_ABUSES,
11
8 MANAGE_JOBS, 12 MANAGE_JOBS,
13
9 MANAGE_CONFIGURATION, 14 MANAGE_CONFIGURATION,
10 15
16 MANAGE_ACCOUNTS_BLOCKLIST,
17 MANAGE_SERVERS_BLOCKLIST,
18
11 MANAGE_VIDEO_BLACKLIST, 19 MANAGE_VIDEO_BLACKLIST,
12 20
13 REMOVE_ANY_VIDEO, 21 REMOVE_ANY_VIDEO,
14 REMOVE_ANY_VIDEO_CHANNEL, 22 REMOVE_ANY_VIDEO_CHANNEL,
15 REMOVE_ANY_VIDEO_COMMENT, 23 REMOVE_ANY_VIDEO_COMMENT,
16 UPDATE_ANY_VIDEO, 24 UPDATE_ANY_VIDEO,
25 SEE_ALL_VIDEOS,
17 CHANGE_VIDEO_OWNERSHIP 26 CHANGE_VIDEO_OWNERSHIP
18} 27}
diff --git a/shared/models/users/user-role.ts b/shared/models/users/user-role.ts
index 552aad999..59c2ba106 100644
--- a/shared/models/users/user-role.ts
+++ b/shared/models/users/user-role.ts
@@ -26,7 +26,11 @@ const userRoleRights: { [ id: number ]: UserRight[] } = {
26 UserRight.REMOVE_ANY_VIDEO, 26 UserRight.REMOVE_ANY_VIDEO,
27 UserRight.REMOVE_ANY_VIDEO_CHANNEL, 27 UserRight.REMOVE_ANY_VIDEO_CHANNEL,
28 UserRight.REMOVE_ANY_VIDEO_COMMENT, 28 UserRight.REMOVE_ANY_VIDEO_COMMENT,
29 UserRight.UPDATE_ANY_VIDEO 29 UserRight.UPDATE_ANY_VIDEO,
30 UserRight.SEE_ALL_VIDEOS,
31 UserRight.MANAGE_ACCOUNTS_BLOCKLIST,
32 UserRight.MANAGE_SERVERS_BLOCKLIST,
33 UserRight.MANAGE_USERS
30 ], 34 ],
31 35
32 [UserRole.USER]: [] 36 [UserRole.USER]: []
diff --git a/shared/models/users/user-update-me.model.ts b/shared/models/users/user-update-me.model.ts
index bbffe1487..e24afab94 100644
--- a/shared/models/users/user-update-me.model.ts
+++ b/shared/models/users/user-update-me.model.ts
@@ -4,7 +4,11 @@ export interface UserUpdateMe {
4 displayName?: string 4 displayName?: string
5 description?: string 5 description?: string
6 nsfwPolicy?: NSFWPolicyType 6 nsfwPolicy?: NSFWPolicyType
7
8 webTorrentEnabled?: boolean
7 autoPlayVideo?: boolean 9 autoPlayVideo?: boolean
10 videosHistoryEnabled?: boolean
11
8 email?: string 12 email?: string
9 currentPassword?: string 13 currentPassword?: string
10 password?: string 14 password?: string
diff --git a/shared/models/users/user-update.model.ts b/shared/models/users/user-update.model.ts
index ce866fb18..cd215bab3 100644
--- a/shared/models/users/user-update.model.ts
+++ b/shared/models/users/user-update.model.ts
@@ -1,7 +1,9 @@
1import { UserRole } from './user-role' 1import { UserRole } from './user-role'
2 2
3export interface UserUpdate { 3export interface UserUpdate {
4 password?: string
4 email?: string 5 email?: string
6 emailVerified?: boolean
5 videoQuota?: number 7 videoQuota?: number
6 videoQuotaDaily?: number 8 videoQuotaDaily?: number
7 role?: UserRole 9 role?: UserRole
diff --git a/shared/models/users/user.model.ts b/shared/models/users/user.model.ts
index 8147dc48e..af783d389 100644
--- a/shared/models/users/user.model.ts
+++ b/shared/models/users/user.model.ts
@@ -2,18 +2,25 @@ import { Account } from '../actors'
2import { VideoChannel } from '../videos/channel/video-channel.model' 2import { VideoChannel } from '../videos/channel/video-channel.model'
3import { UserRole } from './user-role' 3import { UserRole } from './user-role'
4import { NSFWPolicyType } from '../videos/nsfw-policy.type' 4import { NSFWPolicyType } from '../videos/nsfw-policy.type'
5import { UserNotificationSetting } from './user-notification-setting.model'
5 6
6export interface User { 7export interface User {
7 id: number 8 id: number
8 username: string 9 username: string
9 email: string 10 email: string
11 emailVerified: boolean
10 nsfwPolicy: NSFWPolicyType 12 nsfwPolicy: NSFWPolicyType
13
11 autoPlayVideo: boolean 14 autoPlayVideo: boolean
15 webTorrentEnabled: boolean
16 videosHistoryEnabled: boolean
17
12 role: UserRole 18 role: UserRole
13 videoQuota: number 19 videoQuota: number
14 videoQuotaDaily: number 20 videoQuotaDaily: number
15 createdAt: Date 21 createdAt: Date
16 account: Account 22 account: Account
23 notificationSettings?: UserNotificationSetting
17 videoChannels?: VideoChannel[] 24 videoChannels?: VideoChannel[]
18 25
19 blocked: boolean 26 blocked: boolean
diff --git a/shared/models/videos/blacklist/video-blacklist-create.model.ts b/shared/models/videos/blacklist/video-blacklist-create.model.ts
index 89c69cb56..6e7d36421 100644
--- a/shared/models/videos/blacklist/video-blacklist-create.model.ts
+++ b/shared/models/videos/blacklist/video-blacklist-create.model.ts
@@ -1,3 +1,4 @@
1export interface VideoBlacklistCreate { 1export interface VideoBlacklistCreate {
2 reason?: string 2 reason?: string
3 unfederate?: boolean
3} 4}
diff --git a/shared/models/videos/blacklist/video-blacklist.model.ts b/shared/models/videos/blacklist/video-blacklist.model.ts
index ef4e5e3a2..4bd976190 100644
--- a/shared/models/videos/blacklist/video-blacklist.model.ts
+++ b/shared/models/videos/blacklist/video-blacklist.model.ts
@@ -2,6 +2,7 @@ export interface VideoBlacklist {
2 id: number 2 id: number
3 createdAt: Date 3 createdAt: Date
4 updatedAt: Date 4 updatedAt: Date
5 unfederated: boolean
5 reason?: string 6 reason?: string
6 7
7 video: { 8 video: {
diff --git a/shared/models/videos/index.ts b/shared/models/videos/index.ts
index 90a0e3053..056ae06da 100644
--- a/shared/models/videos/index.ts
+++ b/shared/models/videos/index.ts
@@ -21,6 +21,7 @@ export * from './video-update.model'
21export * from './video.model' 21export * from './video.model'
22export * from './video-query.type' 22export * from './video-query.type'
23export * from './video-state.enum' 23export * from './video-state.enum'
24export * from './video-transcoding-fps.model'
24export * from './caption/video-caption.model' 25export * from './caption/video-caption.model'
25export * from './caption/video-caption-update.model' 26export * from './caption/video-caption-update.model'
26export * from './import/video-import-create.model' 27export * from './import/video-import-create.model'
diff --git a/shared/models/videos/video-query.type.ts b/shared/models/videos/video-query.type.ts
index ff0f527f3..f76a91aad 100644
--- a/shared/models/videos/video-query.type.ts
+++ b/shared/models/videos/video-query.type.ts
@@ -1 +1 @@
export type VideoFilter = 'local' export type VideoFilter = 'local' | 'all-local'
diff --git a/shared/models/videos/video-rate.type.ts b/shared/models/videos/video-rate.type.ts
index 17aaba5a5..d48774a4b 100644
--- a/shared/models/videos/video-rate.type.ts
+++ b/shared/models/videos/video-rate.type.ts
@@ -1 +1 @@
export type VideoRateType = 'like' | 'dislike' | 'none' export type VideoRateType = 'like' | 'dislike'
diff --git a/shared/models/videos/video-resolution.enum.ts b/shared/models/videos/video-resolution.enum.ts
index 100fc0e6e..7da5e7100 100644
--- a/shared/models/videos/video-resolution.enum.ts
+++ b/shared/models/videos/video-resolution.enum.ts
@@ -1,3 +1,5 @@
1import { VideoTranscodingFPS } from './video-transcoding-fps.model'
2
1export enum VideoResolution { 3export enum VideoResolution {
2 H_240P = 240, 4 H_240P = 240,
3 H_360P = 360, 5 H_360P = 360,
@@ -5,3 +7,69 @@ export enum VideoResolution {
5 H_720P = 720, 7 H_720P = 720,
6 H_1080P = 1080 8 H_1080P = 1080
7} 9}
10
11/**
12 * Bitrate targets for different resolutions, at VideoTranscodingFPS.AVERAGE.
13 *
14 * Sources for individual quality levels:
15 * Google Live Encoder: https://support.google.com/youtube/answer/2853702?hl=en
16 * YouTube Video Info (tested with random music video): https://www.h3xed.com/blogmedia/youtube-info.php
17 */
18function getBaseBitrate (resolution: VideoResolution) {
19 switch (resolution) {
20 case VideoResolution.H_240P:
21 // quality according to Google Live Encoder: 300 - 700 Kbps
22 // Quality according to YouTube Video Info: 186 Kbps
23 return 250 * 1000
24 case VideoResolution.H_360P:
25 // quality according to Google Live Encoder: 400 - 1,000 Kbps
26 // Quality according to YouTube Video Info: 480 Kbps
27 return 500 * 1000
28 case VideoResolution.H_480P:
29 // quality according to Google Live Encoder: 500 - 2,000 Kbps
30 // Quality according to YouTube Video Info: 879 Kbps
31 return 900 * 1000
32 case VideoResolution.H_720P:
33 // quality according to Google Live Encoder: 1,500 - 4,000 Kbps
34 // Quality according to YouTube Video Info: 1752 Kbps
35 return 1750 * 1000
36 case VideoResolution.H_1080P: // fallthrough
37 default:
38 // quality according to Google Live Encoder: 3000 - 6000 Kbps
39 // Quality according to YouTube Video Info: 3277 Kbps
40 return 3300 * 1000
41 }
42}
43
44/**
45 * Calculate the target bitrate based on video resolution and FPS.
46 *
47 * The calculation is based on two values:
48 * Bitrate at VideoTranscodingFPS.AVERAGE is always the same as
49 * getBaseBitrate(). Bitrate at VideoTranscodingFPS.MAX is always
50 * getBaseBitrate() * 1.4. All other values are calculated linearly
51 * between these two points.
52 */
53export function getTargetBitrate (resolution: VideoResolution, fps: number, fpsTranscodingConstants: VideoTranscodingFPS) {
54 const baseBitrate = getBaseBitrate(resolution)
55 // The maximum bitrate, used when fps === VideoTranscodingFPS.MAX
56 // Based on numbers from Youtube, 60 fps bitrate divided by 30 fps bitrate:
57 // 720p: 2600 / 1750 = 1.49
58 // 1080p: 4400 / 3300 = 1.33
59 const maxBitrate = baseBitrate * 1.4
60 const maxBitrateDifference = maxBitrate - baseBitrate
61 const maxFpsDifference = fpsTranscodingConstants.MAX - fpsTranscodingConstants.AVERAGE
62 // For 1080p video with default settings, this results in the following formula:
63 // 3300 + (x - 30) * (1320/30)
64 // Example outputs:
65 // 1080p10: 2420 kbps, 1080p30: 3300 kbps, 1080p60: 4620 kbps
66 // 720p10: 1283 kbps, 720p30: 1750 kbps, 720p60: 2450 kbps
67 return baseBitrate + (fps - fpsTranscodingConstants.AVERAGE) * (maxBitrateDifference / maxFpsDifference)
68}
69
70/**
71 * The maximum bitrate we expect to see on a transcoded video in bytes per second.
72 */
73export function getMaxBitrate (resolution: VideoResolution, fps: number, fpsTranscodingConstants: VideoTranscodingFPS) {
74 return getTargetBitrate(resolution, fps, fpsTranscodingConstants) * 2
75}
diff --git a/shared/models/videos/video-streaming-playlist.model.ts b/shared/models/videos/video-streaming-playlist.model.ts
new file mode 100644
index 000000000..17f8fe865
--- /dev/null
+++ b/shared/models/videos/video-streaming-playlist.model.ts
@@ -0,0 +1,12 @@
1import { VideoStreamingPlaylistType } from './video-streaming-playlist.type'
2
3export class VideoStreamingPlaylist {
4 id: number
5 type: VideoStreamingPlaylistType
6 playlistUrl: string
7 segmentsSha256Url: string
8
9 redundancies: {
10 baseUrl: string
11 }[]
12}
diff --git a/shared/models/videos/video-streaming-playlist.type.ts b/shared/models/videos/video-streaming-playlist.type.ts
new file mode 100644
index 000000000..3b403f295
--- /dev/null
+++ b/shared/models/videos/video-streaming-playlist.type.ts
@@ -0,0 +1,3 @@
1export enum VideoStreamingPlaylistType {
2 HLS = 1
3}
diff --git a/shared/models/videos/video-transcoding-fps.model.ts b/shared/models/videos/video-transcoding-fps.model.ts
new file mode 100644
index 000000000..82022d2f1
--- /dev/null
+++ b/shared/models/videos/video-transcoding-fps.model.ts
@@ -0,0 +1,6 @@
1export type VideoTranscodingFPS = {
2 MIN: number,
3 AVERAGE: number,
4 MAX: number,
5 KEEP_ORIGIN_FPS_RESOLUTION_MIN: number
6}
diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts
index 4a792fcbc..891831a9e 100644
--- a/shared/models/videos/video.model.ts
+++ b/shared/models/videos/video.model.ts
@@ -5,6 +5,7 @@ import { VideoChannel } from './channel/video-channel.model'
5import { VideoPrivacy } from './video-privacy.enum' 5import { VideoPrivacy } from './video-privacy.enum'
6import { VideoScheduleUpdate } from './video-schedule-update.model' 6import { VideoScheduleUpdate } from './video-schedule-update.model'
7import { VideoConstant } from './video-constant.model' 7import { VideoConstant } from './video-constant.model'
8import { VideoStreamingPlaylist } from './video-streaming-playlist.model'
8 9
9export interface VideoFile { 10export interface VideoFile {
10 magnetUri: string 11 magnetUri: string
@@ -24,7 +25,7 @@ export interface VideoChannelAttribute {
24 displayName: string 25 displayName: string
25 url: string 26 url: string
26 host: string 27 host: string
27 avatar: Avatar 28 avatar?: Avatar
28} 29}
29 30
30export interface AccountAttribute { 31export interface AccountAttribute {
@@ -34,7 +35,7 @@ export interface AccountAttribute {
34 displayName: string 35 displayName: string
35 url: string 36 url: string
36 host: string 37 host: string
37 avatar: Avatar 38 avatar?: Avatar
38} 39}
39 40
40export interface Video { 41export interface Video {
@@ -87,4 +88,8 @@ export interface VideoDetails extends Video {
87 // Not optional in details (unlike in Video) 88 // Not optional in details (unlike in Video)
88 waitTranscoding: boolean 89 waitTranscoding: boolean
89 state: VideoConstant<VideoState> 90 state: VideoConstant<VideoState>
91
92 trackerUrls: string[]
93
94 streamingPlaylists: VideoStreamingPlaylist[]
90} 95}
diff --git a/server/tests/utils/cli/cli.ts b/shared/utils/cli/cli.ts
index 54d05e9c6..54d05e9c6 100644
--- a/server/tests/utils/cli/cli.ts
+++ b/shared/utils/cli/cli.ts
diff --git a/server/tests/utils/feeds/feeds.ts b/shared/utils/feeds/feeds.ts
index af6df2b20..af6df2b20 100644
--- a/server/tests/utils/feeds/feeds.ts
+++ b/shared/utils/feeds/feeds.ts
diff --git a/server/tests/utils/index.ts b/shared/utils/index.ts
index 897389824..156901372 100644
--- a/server/tests/utils/index.ts
+++ b/shared/utils/index.ts
@@ -2,16 +2,23 @@ export * from './server/activitypub'
2export * from './cli/cli' 2export * from './cli/cli'
3export * from './server/clients' 3export * from './server/clients'
4export * from './server/config' 4export * from './server/config'
5export * from './server/jobs'
5export * from './users/login' 6export * from './users/login'
6export * from './miscs/miscs' 7export * from './miscs/miscs'
8export * from './miscs/stubs'
9export * from './miscs/sql'
7export * from './server/follows' 10export * from './server/follows'
11export * from './requests/activitypub'
8export * from './requests/requests' 12export * from './requests/requests'
13export * from './requests/check-api-params'
9export * from './server/servers' 14export * from './server/servers'
10export * from './videos/services' 15export * from './videos/services'
11export * from './users/users' 16export * from './users/users'
12export * from './videos/video-abuses' 17export * from './videos/video-abuses'
13export * from './videos/video-blacklist' 18export * from './videos/video-blacklist'
14export * from './videos/video-channels' 19export * from './videos/video-channels'
20export * from './videos/video-comments'
21export * from './videos/video-playlists'
15export * from './videos/videos' 22export * from './videos/videos'
16export * from './videos/video-change-ownership' 23export * from './videos/video-change-ownership'
17export * from './feeds/feeds' 24export * from './feeds/feeds'
diff --git a/shared/utils/miscs/email-child-process.js b/shared/utils/miscs/email-child-process.js
new file mode 100644
index 000000000..40ae37d70
--- /dev/null
+++ b/shared/utils/miscs/email-child-process.js
@@ -0,0 +1,27 @@
1const MailDev = require('maildev')
2
3// must run maildev as forked ChildProcess
4// failed instantiation stops main process with exit code 0
5process.on('message', (msg) => {
6 if (msg.start) {
7 const maildev = new MailDev({
8 ip: '127.0.0.1',
9 smtp: 1025,
10 disableWeb: true,
11 silent: true
12 })
13
14 maildev.on('new', email => {
15 process.send({ email })
16 })
17
18 maildev.listen(err => {
19 if (err) {
20 // cannot send as Error object
21 return process.send({ err: err.message })
22 }
23
24 return process.send({ err: null })
25 })
26 }
27})
diff --git a/shared/utils/miscs/email.ts b/shared/utils/miscs/email.ts
new file mode 100644
index 000000000..f9f1bd95b
--- /dev/null
+++ b/shared/utils/miscs/email.ts
@@ -0,0 +1,64 @@
1import { fork, ChildProcess } from 'child_process'
2
3class MockSmtpServer {
4
5 private static instance: MockSmtpServer
6 private started = false
7 private emailChildProcess: ChildProcess
8 private emails: object[]
9
10 private constructor () {
11 this.emailChildProcess = fork(`${__dirname}/email-child-process`, [])
12
13 this.emailChildProcess.on('message', (msg) => {
14 if (msg.email) {
15 return this.emails.push(msg.email)
16 }
17 })
18
19 process.on('exit', () => this.kill())
20 }
21
22 collectEmails (emailsCollection: object[]) {
23 return new Promise((res, rej) => {
24 if (this.started) {
25 this.emails = emailsCollection
26 return res()
27 }
28
29 // ensure maildev isn't started until
30 // unexpected exit can be reported to test runner
31 this.emailChildProcess.send({ start: true })
32 this.emailChildProcess.on('exit', () => {
33 return rej(new Error('maildev exited unexpectedly, confirm port not in use'))
34 })
35 this.emailChildProcess.on('message', (msg) => {
36 if (msg.err) {
37 return rej(new Error(msg.err))
38 }
39 this.started = true
40 this.emails = emailsCollection
41 return res()
42 })
43 })
44 }
45
46 kill () {
47 if (!this.emailChildProcess) return
48
49 process.kill(this.emailChildProcess.pid)
50
51 this.emailChildProcess = null
52 MockSmtpServer.instance = null
53 }
54
55 static get Instance () {
56 return this.instance || (this.instance = new this())
57 }
58}
59
60// ---------------------------------------------------------------------------
61
62export {
63 MockSmtpServer
64}
diff --git a/server/tests/utils/miscs/miscs.ts b/shared/utils/miscs/miscs.ts
index b2f80e9b1..91a93b631 100644
--- a/server/tests/utils/miscs/miscs.ts
+++ b/shared/utils/miscs/miscs.ts
@@ -4,7 +4,8 @@ import * as chai from 'chai'
4import { isAbsolute, join } from 'path' 4import { isAbsolute, join } from 'path'
5import * as request from 'supertest' 5import * as request from 'supertest'
6import * as WebTorrent from 'webtorrent' 6import * as WebTorrent from 'webtorrent'
7import { readFile } from 'fs-extra' 7import { pathExists, readFile } from 'fs-extra'
8import * as ffmpeg from 'fluent-ffmpeg'
8 9
9const expect = chai.expect 10const expect = chai.expect
10let webtorrent = new WebTorrent() 11let webtorrent = new WebTorrent()
@@ -32,8 +33,8 @@ function webtorrentAdd (torrent: string, refreshWebTorrent = false) {
32} 33}
33 34
34function root () { 35function root () {
35 // We are in server/tests/utils/miscs 36 // We are in /shared/utils/miscs
36 return join(__dirname, '..', '..', '..', '..') 37 return join(__dirname, '..', '..', '..')
37} 38}
38 39
39async function testImage (url: string, imageName: string, imagePath: string, extension = '.jpg') { 40async function testImage (url: string, imageName: string, imagePath: string, extension = '.jpg') {
@@ -43,7 +44,7 @@ async function testImage (url: string, imageName: string, imagePath: string, ext
43 44
44 const body = res.body 45 const body = res.body
45 46
46 const data = await readFile(join(__dirname, '..', '..', 'fixtures', imageName + extension)) 47 const data = await readFile(join(root(), 'server', 'tests', 'fixtures', imageName + extension))
47 const minLength = body.length - ((20 * body.length) / 100) 48 const minLength = body.length - ((20 * body.length) / 100)
48 const maxLength = body.length + ((20 * body.length) / 100) 49 const maxLength = body.length + ((20 * body.length) / 100)
49 50
@@ -51,12 +52,39 @@ async function testImage (url: string, imageName: string, imagePath: string, ext
51 expect(data.length).to.be.below(maxLength) 52 expect(data.length).to.be.below(maxLength)
52} 53}
53 54
54function buildAbsoluteFixturePath (path: string) { 55function buildAbsoluteFixturePath (path: string, customTravisPath = false) {
55 if (isAbsolute(path)) { 56 if (isAbsolute(path)) {
56 return path 57 return path
57 } 58 }
58 59
59 return join(__dirname, '..', '..', 'fixtures', path) 60 if (customTravisPath && process.env.TRAVIS) return join(process.env.HOME, 'fixtures', path)
61
62 return join(root(), 'server', 'tests', 'fixtures', path)
63}
64
65async function generateHighBitrateVideo () {
66 const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true)
67
68 const exists = await pathExists(tempFixturePath)
69 if (!exists) {
70
71 // Generate a random, high bitrate video on the fly, so we don't have to include
72 // a large file in the repo. The video needs to have a certain minimum length so
73 // that FFmpeg properly applies bitrate limits.
74 // https://stackoverflow.com/a/15795112
75 return new Promise<string>(async (res, rej) => {
76 ffmpeg()
77 .outputOptions([ '-f rawvideo', '-video_size 1920x1080', '-i /dev/urandom' ])
78 .outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ])
79 .outputOptions([ '-maxrate 10M', '-bufsize 10M' ])
80 .output(tempFixturePath)
81 .on('error', rej)
82 .on('end', () => res(tempFixturePath))
83 .run()
84 })
85 }
86
87 return tempFixturePath
60} 88}
61 89
62// --------------------------------------------------------------------------- 90// ---------------------------------------------------------------------------
@@ -68,5 +96,6 @@ export {
68 immutableAssign, 96 immutableAssign,
69 testImage, 97 testImage,
70 buildAbsoluteFixturePath, 98 buildAbsoluteFixturePath,
71 root 99 root,
100 generateHighBitrateVideo
72} 101}
diff --git a/shared/utils/miscs/sql.ts b/shared/utils/miscs/sql.ts
new file mode 100644
index 000000000..027f78131
--- /dev/null
+++ b/shared/utils/miscs/sql.ts
@@ -0,0 +1,38 @@
1import * as Sequelize from 'sequelize'
2
3function getSequelize (serverNumber: number) {
4 const dbname = 'peertube_test' + serverNumber
5 const username = 'peertube'
6 const password = 'peertube'
7 const host = 'localhost'
8 const port = 5432
9
10 return new Sequelize(dbname, username, password, {
11 dialect: 'postgres',
12 host,
13 port,
14 operatorsAliases: false,
15 logging: false
16 })
17}
18
19function setActorField (serverNumber: number, to: string, field: string, value: string) {
20 const seq = getSequelize(serverNumber)
21
22 const options = { type: Sequelize.QueryTypes.UPDATE }
23
24 return seq.query(`UPDATE actor SET "${field}" = '${value}' WHERE url = '${to}'`, options)
25}
26
27function setVideoField (serverNumber: number, uuid: string, field: string, value: string) {
28 const seq = getSequelize(serverNumber)
29
30 const options = { type: Sequelize.QueryTypes.UPDATE }
31
32 return seq.query(`UPDATE video SET "${field}" = '${value}' WHERE uuid = '${uuid}'`, options)
33}
34
35export {
36 setVideoField,
37 setActorField
38}
diff --git a/shared/utils/miscs/stubs.ts b/shared/utils/miscs/stubs.ts
new file mode 100644
index 000000000..d1eb0e3b2
--- /dev/null
+++ b/shared/utils/miscs/stubs.ts
@@ -0,0 +1,14 @@
1function buildRequestStub (): any {
2 return { }
3}
4
5function buildResponseStub (): any {
6 return {
7 locals: {}
8 }
9}
10
11export {
12 buildResponseStub,
13 buildRequestStub
14}
diff --git a/server/tests/utils/overviews/overviews.ts b/shared/utils/overviews/overviews.ts
index 23e3ceb1e..23e3ceb1e 100644
--- a/server/tests/utils/overviews/overviews.ts
+++ b/shared/utils/overviews/overviews.ts
diff --git a/shared/utils/requests/activitypub.ts b/shared/utils/requests/activitypub.ts
new file mode 100644
index 000000000..e2348ace0
--- /dev/null
+++ b/shared/utils/requests/activitypub.ts
@@ -0,0 +1,43 @@
1import { doRequest } from '../../../server/helpers/requests'
2import { HTTP_SIGNATURE } from '../../../server/initializers'
3import { buildGlobalHeaders } from '../../../server/lib/job-queue/handlers/utils/activitypub-http-utils'
4import { activityPubContextify } from '../../../server/helpers/activitypub'
5
6function makePOSTAPRequest (url: string, body: any, httpSignature: any, headers: any) {
7 const options = {
8 method: 'POST',
9 uri: url,
10 json: body,
11 httpSignature,
12 headers
13 }
14
15 return doRequest(options)
16}
17
18async function makeFollowRequest (to: { url: string }, by: { url: string, privateKey }) {
19 const follow = {
20 type: 'Follow',
21 id: by.url + '/toto',
22 actor: by.url,
23 object: to.url
24 }
25
26 const body = activityPubContextify(follow)
27
28 const httpSignature = {
29 algorithm: HTTP_SIGNATURE.ALGORITHM,
30 authorizationHeaderName: HTTP_SIGNATURE.HEADER_NAME,
31 keyId: by.url,
32 key: by.privateKey,
33 headers: HTTP_SIGNATURE.HEADERS_TO_SIGN
34 }
35 const headers = buildGlobalHeaders(body)
36
37 return makePOSTAPRequest(to.url, body, httpSignature, headers)
38}
39
40export {
41 makePOSTAPRequest,
42 makeFollowRequest
43}
diff --git a/server/tests/utils/requests/check-api-params.ts b/shared/utils/requests/check-api-params.ts
index edb47e0e9..a2a549682 100644
--- a/server/tests/utils/requests/check-api-params.ts
+++ b/shared/utils/requests/check-api-params.ts
@@ -1,5 +1,5 @@
1import { makeGetRequest } from './requests' 1import { makeGetRequest } from './requests'
2import { immutableAssign } from '..' 2import { immutableAssign } from '../miscs/miscs'
3 3
4function checkBadStartPagination (url: string, path: string, token?: string, query = {}) { 4function checkBadStartPagination (url: string, path: string, token?: string, query = {}) {
5 return makeGetRequest({ 5 return makeGetRequest({
diff --git a/server/tests/utils/requests/requests.ts b/shared/utils/requests/requests.ts
index 27a529eda..6b59e24fc 100644
--- a/server/tests/utils/requests/requests.ts
+++ b/shared/utils/requests/requests.ts
@@ -1,24 +1,32 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { buildAbsoluteFixturePath } from '../miscs/miscs' 2import { buildAbsoluteFixturePath, root } from '../miscs/miscs'
3import { isAbsolute, join } from 'path' 3import { isAbsolute, join } from 'path'
4import { parse } from 'url'
5
6function makeRawRequest (url: string, statusCodeExpected?: number, range?: string) {
7 const { host, protocol, pathname } = parse(url)
8
9 return makeGetRequest({ url: `${protocol}//${host}`, path: pathname, statusCodeExpected, range })
10}
4 11
5function makeGetRequest (options: { 12function makeGetRequest (options: {
6 url: string, 13 url: string,
7 path: string, 14 path?: string,
8 query?: any, 15 query?: any,
9 token?: string, 16 token?: string,
10 statusCodeExpected?: number, 17 statusCodeExpected?: number,
11 contentType?: string 18 contentType?: string,
19 range?: string
12}) { 20}) {
13 if (!options.statusCodeExpected) options.statusCodeExpected = 400 21 if (!options.statusCodeExpected) options.statusCodeExpected = 400
14 if (options.contentType === undefined) options.contentType = 'application/json' 22 if (options.contentType === undefined) options.contentType = 'application/json'
15 23
16 const req = request(options.url) 24 const req = request(options.url).get(options.path)
17 .get(options.path)
18 25
19 if (options.contentType) req.set('Accept', options.contentType) 26 if (options.contentType) req.set('Accept', options.contentType)
20 if (options.token) req.set('Authorization', 'Bearer ' + options.token) 27 if (options.token) req.set('Authorization', 'Bearer ' + options.token)
21 if (options.query) req.query(options.query) 28 if (options.query) req.query(options.query)
29 if (options.range) req.set('Range', options.range)
22 30
23 return req.expect(options.statusCodeExpected) 31 return req.expect(options.statusCodeExpected)
24} 32}
@@ -37,9 +45,7 @@ function makeDeleteRequest (options: {
37 45
38 if (options.token) req.set('Authorization', 'Bearer ' + options.token) 46 if (options.token) req.set('Authorization', 'Bearer ' + options.token)
39 47
40 return req 48 return req.expect(options.statusCodeExpected)
41 .expect('Content-Type', /json/)
42 .expect(options.statusCodeExpected)
43} 49}
44 50
45function makeUploadRequest (options: { 51function makeUploadRequest (options: {
@@ -144,7 +150,7 @@ function updateAvatarRequest (options: {
144 if (isAbsolute(options.fixture)) { 150 if (isAbsolute(options.fixture)) {
145 filePath = options.fixture 151 filePath = options.fixture
146 } else { 152 } else {
147 filePath = join(__dirname, '..', '..', 'fixtures', options.fixture) 153 filePath = join(root(), 'server', 'tests', 'fixtures', options.fixture)
148 } 154 }
149 155
150 return makeUploadRequest({ 156 return makeUploadRequest({
@@ -166,5 +172,6 @@ export {
166 makePostBodyRequest, 172 makePostBodyRequest,
167 makePutBodyRequest, 173 makePutBodyRequest,
168 makeDeleteRequest, 174 makeDeleteRequest,
175 makeRawRequest,
169 updateAvatarRequest 176 updateAvatarRequest
170} 177}
diff --git a/server/tests/utils/search/video-channels.ts b/shared/utils/search/video-channels.ts
index 0532134ae..0532134ae 100644
--- a/server/tests/utils/search/video-channels.ts
+++ b/shared/utils/search/video-channels.ts
diff --git a/server/tests/utils/search/videos.ts b/shared/utils/search/videos.ts
index 3a0c10e42..ba4627017 100644
--- a/server/tests/utils/search/videos.ts
+++ b/shared/utils/search/videos.ts
@@ -1,8 +1,8 @@
1/* tslint:disable:no-unused-expression */ 1/* tslint:disable:no-unused-expression */
2 2
3import * as request from 'supertest' 3import * as request from 'supertest'
4import { VideosSearchQuery } from '../../../../shared/models/search' 4import { VideosSearchQuery } from '../../models/search'
5import { immutableAssign } from '..' 5import { immutableAssign } from '../miscs/miscs'
6 6
7function searchVideo (url: string, search: string) { 7function searchVideo (url: string, search: string) {
8 const path = '/api/v1/search/videos' 8 const path = '/api/v1/search/videos'
diff --git a/server/tests/utils/server/activitypub.ts b/shared/utils/server/activitypub.ts
index cf3c1c3b3..eccb198ca 100644
--- a/server/tests/utils/server/activitypub.ts
+++ b/shared/utils/server/activitypub.ts
@@ -1,11 +1,10 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2 2
3function makeActivityPubGetRequest (url: string, path: string) { 3function makeActivityPubGetRequest (url: string, path: string, expectedStatus = 200) {
4 return request(url) 4 return request(url)
5 .get(path) 5 .get(path)
6 .set('Accept', 'application/activity+json,text/html;q=0.9,\\*/\\*;q=0.8') 6 .set('Accept', 'application/activity+json,text/html;q=0.9,\\*/\\*;q=0.8')
7 .expect(200) 7 .expect(expectedStatus)
8 .expect('Content-Type', /json/)
9} 8}
10 9
11// --------------------------------------------------------------------------- 10// ---------------------------------------------------------------------------
diff --git a/server/tests/utils/server/clients.ts b/shared/utils/server/clients.ts
index 273aac747..273aac747 100644
--- a/server/tests/utils/server/clients.ts
+++ b/shared/utils/server/clients.ts
diff --git a/server/tests/utils/server/config.ts b/shared/utils/server/config.ts
index b85e02ab7..29c24cff9 100644
--- a/server/tests/utils/server/config.ts
+++ b/shared/utils/server/config.ts
@@ -1,5 +1,5 @@
1import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../' 1import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../requests/requests'
2import { CustomConfig } from '../../../../shared/models/server/custom-config.model' 2import { CustomConfig } from '../../models/server/custom-config.model'
3 3
4function getConfig (url: string) { 4function getConfig (url: string) {
5 const path = '/api/v1/config' 5 const path = '/api/v1/config'
@@ -80,12 +80,16 @@ function updateCustomSubConfig (url: string, token: string, newConfig: any) {
80 admin: { 80 admin: {
81 email: 'superadmin1@example.com' 81 email: 'superadmin1@example.com'
82 }, 82 },
83 contactForm: {
84 enabled: true
85 },
83 user: { 86 user: {
84 videoQuota: 5242881, 87 videoQuota: 5242881,
85 videoQuotaDaily: 318742 88 videoQuotaDaily: 318742
86 }, 89 },
87 transcoding: { 90 transcoding: {
88 enabled: true, 91 enabled: true,
92 allowAdditionalExtensions: true,
89 threads: 1, 93 threads: 1,
90 resolutions: { 94 resolutions: {
91 '240p': false, 95 '240p': false,
@@ -93,6 +97,9 @@ function updateCustomSubConfig (url: string, token: string, newConfig: any) {
93 '480p': true, 97 '480p': true,
94 '720p': false, 98 '720p': false,
95 '1080p': false 99 '1080p': false
100 },
101 hls: {
102 enabled: false
96 } 103 }
97 }, 104 },
98 import: { 105 import: {
diff --git a/shared/utils/server/contact-form.ts b/shared/utils/server/contact-form.ts
new file mode 100644
index 000000000..80394cf99
--- /dev/null
+++ b/shared/utils/server/contact-form.ts
@@ -0,0 +1,28 @@
1import * as request from 'supertest'
2import { ContactForm } from '../../models/server'
3
4function sendContactForm (options: {
5 url: string,
6 fromEmail: string,
7 fromName: string,
8 body: string,
9 expectedStatus?: number
10}) {
11 const path = '/api/v1/server/contact'
12
13 const body: ContactForm = {
14 fromEmail: options.fromEmail,
15 fromName: options.fromName,
16 body: options.body
17 }
18 return request(options.url)
19 .post(path)
20 .send(body)
21 .expect(options.expectedStatus || 204)
22}
23
24// ---------------------------------------------------------------------------
25
26export {
27 sendContactForm
28}
diff --git a/server/tests/utils/server/follows.ts b/shared/utils/server/follows.ts
index 8a65a958b..7741757a6 100644
--- a/server/tests/utils/server/follows.ts
+++ b/shared/utils/server/follows.ts
@@ -2,7 +2,7 @@ import * as request from 'supertest'
2import { ServerInfo } from './servers' 2import { ServerInfo } from './servers'
3import { waitJobs } from './jobs' 3import { waitJobs } from './jobs'
4 4
5function getFollowersListPaginationAndSort (url: string, start: number, count: number, sort: string) { 5function getFollowersListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) {
6 const path = '/api/v1/server/followers' 6 const path = '/api/v1/server/followers'
7 7
8 return request(url) 8 return request(url)
@@ -10,12 +10,13 @@ function getFollowersListPaginationAndSort (url: string, start: number, count: n
10 .query({ start }) 10 .query({ start })
11 .query({ count }) 11 .query({ count })
12 .query({ sort }) 12 .query({ sort })
13 .query({ search })
13 .set('Accept', 'application/json') 14 .set('Accept', 'application/json')
14 .expect(200) 15 .expect(200)
15 .expect('Content-Type', /json/) 16 .expect('Content-Type', /json/)
16} 17}
17 18
18function getFollowingListPaginationAndSort (url: string, start: number, count: number, sort: string) { 19function getFollowingListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) {
19 const path = '/api/v1/server/following' 20 const path = '/api/v1/server/following'
20 21
21 return request(url) 22 return request(url)
@@ -23,6 +24,7 @@ function getFollowingListPaginationAndSort (url: string, start: number, count: n
23 .query({ start }) 24 .query({ start })
24 .query({ count }) 25 .query({ count })
25 .query({ sort }) 26 .query({ sort })
27 .query({ search })
26 .set('Accept', 'application/json') 28 .set('Accept', 'application/json')
27 .expect(200) 29 .expect(200)
28 .expect('Content-Type', /json/) 30 .expect('Content-Type', /json/)
diff --git a/server/tests/utils/server/jobs.ts b/shared/utils/server/jobs.ts
index 4c02cace5..692b5e24d 100644
--- a/server/tests/utils/server/jobs.ts
+++ b/shared/utils/server/jobs.ts
@@ -1,6 +1,7 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { Job, JobState } from '../../../../shared/models' 2import { Job, JobState } from '../../models'
3import { ServerInfo, wait } from '../index' 3import { wait } from '../miscs/miscs'
4import { ServerInfo } from './servers'
4 5
5function getJobsList (url: string, accessToken: string, state: JobState) { 6function getJobsList (url: string, accessToken: string, state: JobState) {
6 const path = '/api/v1/jobs/' + state 7 const path = '/api/v1/jobs/' + state
@@ -28,16 +29,17 @@ function getJobsListPaginationAndSort (url: string, accessToken: string, state:
28} 29}
29 30
30async function waitJobs (serversArg: ServerInfo[] | ServerInfo) { 31async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
32 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) : 2000
31 let servers: ServerInfo[] 33 let servers: ServerInfo[]
32 34
33 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ] 35 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ]
34 else servers = serversArg as ServerInfo[] 36 else servers = serversArg as ServerInfo[]
35 37
36 const states: JobState[] = [ 'waiting', 'active', 'delayed' ] 38 const states: JobState[] = [ 'waiting', 'active', 'delayed' ]
37 const tasks: Promise<any>[] = [] 39 let pendingRequests = false
38 let pendingRequests: boolean
39 40
40 do { 41 function tasksBuilder () {
42 const tasks: Promise<any>[] = []
41 pendingRequests = false 43 pendingRequests = false
42 44
43 // Check if each server has pending request 45 // Check if each server has pending request
@@ -53,13 +55,16 @@ async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
53 } 55 }
54 } 56 }
55 57
56 await Promise.all(tasks) 58 return tasks
59 }
60
61 do {
62 await Promise.all(tasksBuilder())
57 63
58 // Retry, in case of new jobs were created 64 // Retry, in case of new jobs were created
59 if (pendingRequests === false) { 65 if (pendingRequests === false) {
60 await wait(1000) 66 await wait(pendingJobWait)
61 67 await Promise.all(tasksBuilder())
62 await Promise.all(tasks)
63 } 68 }
64 69
65 if (pendingRequests) { 70 if (pendingRequests) {
diff --git a/server/tests/utils/server/redundancy.ts b/shared/utils/server/redundancy.ts
index c39ff2c8b..c39ff2c8b 100644
--- a/server/tests/utils/server/redundancy.ts
+++ b/shared/utils/server/redundancy.ts
diff --git a/server/tests/utils/server/servers.ts b/shared/utils/server/servers.ts
index 3c946db27..bde7dd5c2 100644
--- a/server/tests/utils/server/servers.ts
+++ b/shared/utils/server/servers.ts
@@ -1,7 +1,11 @@
1/* tslint:disable:no-unused-expression */
2
1import { ChildProcess, exec, fork } from 'child_process' 3import { ChildProcess, exec, fork } from 'child_process'
2import { join } from 'path' 4import { join } from 'path'
3import { root, wait } from '../miscs/miscs' 5import { root, wait } from '../miscs/miscs'
4import { readFile } from 'fs-extra' 6import { readdir, readFile } from 'fs-extra'
7import { existsSync } from 'fs'
8import { expect } from 'chai'
5 9
6interface ServerInfo { 10interface ServerInfo {
7 app: ChildProcess, 11 app: ChildProcess,
@@ -69,7 +73,7 @@ function flushTests () {
69 }) 73 })
70} 74}
71 75
72function runServer (serverNumber: number, configOverride?: Object) { 76function runServer (serverNumber: number, configOverride?: Object, args = []) {
73 const server: ServerInfo = { 77 const server: ServerInfo = {
74 app: null, 78 app: null,
75 serverNumber: serverNumber, 79 serverNumber: serverNumber,
@@ -115,7 +119,7 @@ function runServer (serverNumber: number, configOverride?: Object) {
115 } 119 }
116 120
117 return new Promise<ServerInfo>(res => { 121 return new Promise<ServerInfo>(res => {
118 server.app = fork(join(__dirname, '..', '..', '..', '..', 'dist', 'server.js'), [], options) 122 server.app = fork(join(root(), 'dist', 'server.js'), args, options)
119 server.app.stdout.on('data', function onStdout (data) { 123 server.app.stdout.on('data', function onStdout (data) {
120 let dontContinue = false 124 let dontContinue = false
121 125
@@ -141,8 +145,16 @@ function runServer (serverNumber: number, configOverride?: Object) {
141 if (dontContinue === true) return 145 if (dontContinue === true) return
142 146
143 server.app.stdout.removeListener('data', onStdout) 147 server.app.stdout.removeListener('data', onStdout)
148
149 process.on('exit', () => {
150 try {
151 process.kill(server.app.pid)
152 } catch { /* empty */ }
153 })
154
144 res(server) 155 res(server)
145 }) 156 })
157
146 }) 158 })
147} 159}
148 160
@@ -153,6 +165,22 @@ async function reRunServer (server: ServerInfo, configOverride?: any) {
153 return server 165 return server
154} 166}
155 167
168async function checkTmpIsEmpty (server: ServerInfo) {
169 return checkDirectoryIsEmpty(server, 'tmp')
170}
171
172async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) {
173 const testDirectory = 'test' + server.serverNumber
174
175 const directoryPath = join(root(), testDirectory, directory)
176
177 const directoryExists = existsSync(directoryPath)
178 expect(directoryExists).to.be.true
179
180 const files = await readdir(directoryPath)
181 expect(files).to.have.lengthOf(0)
182}
183
156function killallServers (servers: ServerInfo[]) { 184function killallServers (servers: ServerInfo[]) {
157 for (const server of servers) { 185 for (const server of servers) {
158 process.kill(-server.app.pid) 186 process.kill(-server.app.pid)
@@ -175,6 +203,8 @@ async function waitUntilLog (server: ServerInfo, str: string, count = 1) {
175// --------------------------------------------------------------------------- 203// ---------------------------------------------------------------------------
176 204
177export { 205export {
206 checkDirectoryIsEmpty,
207 checkTmpIsEmpty,
178 ServerInfo, 208 ServerInfo,
179 flushAndRunMultipleServers, 209 flushAndRunMultipleServers,
180 flushTests, 210 flushTests,
diff --git a/server/tests/utils/server/stats.ts b/shared/utils/server/stats.ts
index 01989d952..6f079ad18 100644
--- a/server/tests/utils/server/stats.ts
+++ b/shared/utils/server/stats.ts
@@ -1,4 +1,4 @@
1import { makeGetRequest } from '../' 1import { makeGetRequest } from '../requests/requests'
2 2
3function getStats (url: string, useCache = false) { 3function getStats (url: string, useCache = false) {
4 const path = '/api/v1/server/stats' 4 const path = '/api/v1/server/stats'
diff --git a/shared/utils/socket/socket-io.ts b/shared/utils/socket/socket-io.ts
new file mode 100644
index 000000000..854ab71af
--- /dev/null
+++ b/shared/utils/socket/socket-io.ts
@@ -0,0 +1,13 @@
1import * as io from 'socket.io-client'
2
3function getUserNotificationSocket (serverUrl: string, accessToken: string) {
4 return io(serverUrl + '/user-notifications', {
5 query: { accessToken }
6 })
7}
8
9// ---------------------------------------------------------------------------
10
11export {
12 getUserNotificationSocket
13}
diff --git a/server/tests/utils/users/accounts.ts b/shared/utils/users/accounts.ts
index f82b8d906..388eb6973 100644
--- a/server/tests/utils/users/accounts.ts
+++ b/shared/utils/users/accounts.ts
@@ -3,8 +3,8 @@
3import { expect } from 'chai' 3import { expect } from 'chai'
4import { existsSync, readdir } from 'fs-extra' 4import { existsSync, readdir } from 'fs-extra'
5import { join } from 'path' 5import { join } from 'path'
6import { Account } from '../../../../shared/models/actors' 6import { Account } from '../../models/actors'
7import { root } from '../index' 7import { root } from '../miscs/miscs'
8import { makeGetRequest } from '../requests/requests' 8import { makeGetRequest } from '../requests/requests'
9 9
10function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) { 10function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) {
diff --git a/shared/utils/users/blocklist.ts b/shared/utils/users/blocklist.ts
new file mode 100644
index 000000000..5feb84179
--- /dev/null
+++ b/shared/utils/users/blocklist.ts
@@ -0,0 +1,197 @@
1/* tslint:disable:no-unused-expression */
2
3import { makeGetRequest, makeDeleteRequest, makePostBodyRequest } from '../requests/requests'
4
5function getAccountBlocklistByAccount (
6 url: string,
7 token: string,
8 start: number,
9 count: number,
10 sort = '-createdAt',
11 statusCodeExpected = 200
12) {
13 const path = '/api/v1/users/me/blocklist/accounts'
14
15 return makeGetRequest({
16 url,
17 token,
18 query: { start, count, sort },
19 path,
20 statusCodeExpected
21 })
22}
23
24function addAccountToAccountBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) {
25 const path = '/api/v1/users/me/blocklist/accounts'
26
27 return makePostBodyRequest({
28 url,
29 path,
30 token,
31 fields: {
32 accountName: accountToBlock
33 },
34 statusCodeExpected
35 })
36}
37
38function removeAccountFromAccountBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) {
39 const path = '/api/v1/users/me/blocklist/accounts/' + accountToUnblock
40
41 return makeDeleteRequest({
42 url,
43 path,
44 token,
45 statusCodeExpected
46 })
47}
48
49function getServerBlocklistByAccount (
50 url: string,
51 token: string,
52 start: number,
53 count: number,
54 sort = '-createdAt',
55 statusCodeExpected = 200
56) {
57 const path = '/api/v1/users/me/blocklist/servers'
58
59 return makeGetRequest({
60 url,
61 token,
62 query: { start, count, sort },
63 path,
64 statusCodeExpected
65 })
66}
67
68function addServerToAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) {
69 const path = '/api/v1/users/me/blocklist/servers'
70
71 return makePostBodyRequest({
72 url,
73 path,
74 token,
75 fields: {
76 host: serverToBlock
77 },
78 statusCodeExpected
79 })
80}
81
82function removeServerFromAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) {
83 const path = '/api/v1/users/me/blocklist/servers/' + serverToBlock
84
85 return makeDeleteRequest({
86 url,
87 path,
88 token,
89 statusCodeExpected
90 })
91}
92
93function getAccountBlocklistByServer (
94 url: string,
95 token: string,
96 start: number,
97 count: number,
98 sort = '-createdAt',
99 statusCodeExpected = 200
100) {
101 const path = '/api/v1/server/blocklist/accounts'
102
103 return makeGetRequest({
104 url,
105 token,
106 query: { start, count, sort },
107 path,
108 statusCodeExpected
109 })
110}
111
112function addAccountToServerBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) {
113 const path = '/api/v1/server/blocklist/accounts'
114
115 return makePostBodyRequest({
116 url,
117 path,
118 token,
119 fields: {
120 accountName: accountToBlock
121 },
122 statusCodeExpected
123 })
124}
125
126function removeAccountFromServerBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) {
127 const path = '/api/v1/server/blocklist/accounts/' + accountToUnblock
128
129 return makeDeleteRequest({
130 url,
131 path,
132 token,
133 statusCodeExpected
134 })
135}
136
137function getServerBlocklistByServer (
138 url: string,
139 token: string,
140 start: number,
141 count: number,
142 sort = '-createdAt',
143 statusCodeExpected = 200
144) {
145 const path = '/api/v1/server/blocklist/servers'
146
147 return makeGetRequest({
148 url,
149 token,
150 query: { start, count, sort },
151 path,
152 statusCodeExpected
153 })
154}
155
156function addServerToServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) {
157 const path = '/api/v1/server/blocklist/servers'
158
159 return makePostBodyRequest({
160 url,
161 path,
162 token,
163 fields: {
164 host: serverToBlock
165 },
166 statusCodeExpected
167 })
168}
169
170function removeServerFromServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) {
171 const path = '/api/v1/server/blocklist/servers/' + serverToBlock
172
173 return makeDeleteRequest({
174 url,
175 path,
176 token,
177 statusCodeExpected
178 })
179}
180
181// ---------------------------------------------------------------------------
182
183export {
184 getAccountBlocklistByAccount,
185 addAccountToAccountBlocklist,
186 removeAccountFromAccountBlocklist,
187 getServerBlocklistByAccount,
188 addServerToAccountBlocklist,
189 removeServerFromAccountBlocklist,
190
191 getAccountBlocklistByServer,
192 addAccountToServerBlocklist,
193 removeAccountFromServerBlocklist,
194 getServerBlocklistByServer,
195 addServerToServerBlocklist,
196 removeServerFromServerBlocklist
197}
diff --git a/server/tests/utils/users/login.ts b/shared/utils/users/login.ts
index ddeb9df2a..ddeb9df2a 100644
--- a/server/tests/utils/users/login.ts
+++ b/shared/utils/users/login.ts
diff --git a/shared/utils/users/user-notifications.ts b/shared/utils/users/user-notifications.ts
new file mode 100644
index 000000000..c8ed7df30
--- /dev/null
+++ b/shared/utils/users/user-notifications.ts
@@ -0,0 +1,437 @@
1/* tslint:disable:no-unused-expression */
2
3import { makeGetRequest, makePostBodyRequest, makePutBodyRequest } from '../requests/requests'
4import { UserNotification, UserNotificationSetting, UserNotificationType } from '../../models/users'
5import { ServerInfo } from '..'
6import { expect } from 'chai'
7import { inspect } from 'util'
8
9function updateMyNotificationSettings (url: string, token: string, settings: UserNotificationSetting, statusCodeExpected = 204) {
10 const path = '/api/v1/users/me/notification-settings'
11
12 return makePutBodyRequest({
13 url,
14 path,
15 token,
16 fields: settings,
17 statusCodeExpected
18 })
19}
20
21function getUserNotifications (
22 url: string,
23 token: string,
24 start: number,
25 count: number,
26 unread?: boolean,
27 sort = '-createdAt',
28 statusCodeExpected = 200
29) {
30 const path = '/api/v1/users/me/notifications'
31
32 return makeGetRequest({
33 url,
34 path,
35 token,
36 query: {
37 start,
38 count,
39 sort,
40 unread
41 },
42 statusCodeExpected
43 })
44}
45
46function markAsReadNotifications (url: string, token: string, ids: number[], statusCodeExpected = 204) {
47 const path = '/api/v1/users/me/notifications/read'
48
49 return makePostBodyRequest({
50 url,
51 path,
52 token,
53 fields: { ids },
54 statusCodeExpected
55 })
56}
57function markAsReadAllNotifications (url: string, token: string, statusCodeExpected = 204) {
58 const path = '/api/v1/users/me/notifications/read-all'
59
60 return makePostBodyRequest({
61 url,
62 path,
63 token,
64 statusCodeExpected
65 })
66}
67
68async function getLastNotification (serverUrl: string, accessToken: string) {
69 const res = await getUserNotifications(serverUrl, accessToken, 0, 1, undefined, '-createdAt')
70
71 if (res.body.total === 0) return undefined
72
73 return res.body.data[0] as UserNotification
74}
75
76type CheckerBaseParams = {
77 server: ServerInfo
78 emails: object[]
79 socketNotifications: UserNotification[]
80 token: string,
81 check?: { web: boolean, mail: boolean }
82}
83
84type CheckerType = 'presence' | 'absence'
85
86async function checkNotification (
87 base: CheckerBaseParams,
88 notificationChecker: (notification: UserNotification, type: CheckerType) => void,
89 emailNotificationFinder: (email: object) => boolean,
90 checkType: CheckerType
91) {
92 const check = base.check || { web: true, mail: true }
93
94 if (check.web) {
95 const notification = await getLastNotification(base.server.url, base.token)
96
97 if (notification || checkType !== 'absence') {
98 notificationChecker(notification, checkType)
99 }
100
101 const socketNotification = base.socketNotifications.find(n => {
102 try {
103 notificationChecker(n, 'presence')
104 return true
105 } catch {
106 return false
107 }
108 })
109
110 if (checkType === 'presence') {
111 const obj = inspect(base.socketNotifications, { depth: 5 })
112 expect(socketNotification, 'The socket notification is absent. ' + obj).to.not.be.undefined
113 } else {
114 const obj = inspect(socketNotification, { depth: 5 })
115 expect(socketNotification, 'The socket notification is present. ' + obj).to.be.undefined
116 }
117 }
118
119 if (check.mail) {
120 // Last email
121 const email = base.emails
122 .slice()
123 .reverse()
124 .find(e => emailNotificationFinder(e))
125
126 if (checkType === 'presence') {
127 expect(email, 'The email is absent. ' + inspect(base.emails)).to.not.be.undefined
128 } else {
129 expect(email, 'The email is present. ' + inspect(email)).to.be.undefined
130 }
131 }
132}
133
134function checkVideo (video: any, videoName?: string, videoUUID?: string) {
135 expect(video.name).to.be.a('string')
136 expect(video.name).to.not.be.empty
137 if (videoName) expect(video.name).to.equal(videoName)
138
139 expect(video.uuid).to.be.a('string')
140 expect(video.uuid).to.not.be.empty
141 if (videoUUID) expect(video.uuid).to.equal(videoUUID)
142
143 expect(video.id).to.be.a('number')
144}
145
146function checkActor (actor: any) {
147 expect(actor.displayName).to.be.a('string')
148 expect(actor.displayName).to.not.be.empty
149 expect(actor.host).to.not.be.undefined
150}
151
152function checkComment (comment: any, commentId: number, threadId: number) {
153 expect(comment.id).to.equal(commentId)
154 expect(comment.threadId).to.equal(threadId)
155}
156
157async function checkNewVideoFromSubscription (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) {
158 const notificationType = UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION
159
160 function notificationChecker (notification: UserNotification, type: CheckerType) {
161 if (type === 'presence') {
162 expect(notification).to.not.be.undefined
163 expect(notification.type).to.equal(notificationType)
164
165 checkVideo(notification.video, videoName, videoUUID)
166 checkActor(notification.video.channel)
167 } else {
168 expect(notification.video).to.satisfy(v => v === undefined || v.name !== videoName)
169 }
170 }
171
172 function emailFinder (email: object) {
173 return email[ 'text' ].indexOf(videoUUID) !== -1
174 }
175
176 await checkNotification(base, notificationChecker, emailFinder, type)
177}
178
179async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) {
180 const notificationType = UserNotificationType.MY_VIDEO_PUBLISHED
181
182 function notificationChecker (notification: UserNotification, type: CheckerType) {
183 if (type === 'presence') {
184 expect(notification).to.not.be.undefined
185 expect(notification.type).to.equal(notificationType)
186
187 checkVideo(notification.video, videoName, videoUUID)
188 checkActor(notification.video.channel)
189 } else {
190 expect(notification.video).to.satisfy(v => v === undefined || v.name !== videoName)
191 }
192 }
193
194 function emailFinder (email: object) {
195 const text: string = email[ 'text' ]
196 return text.includes(videoUUID) && text.includes('Your video')
197 }
198
199 await checkNotification(base, notificationChecker, emailFinder, type)
200}
201
202async function checkMyVideoImportIsFinished (
203 base: CheckerBaseParams,
204 videoName: string,
205 videoUUID: string,
206 url: string,
207 success: boolean,
208 type: CheckerType
209) {
210 const notificationType = success ? UserNotificationType.MY_VIDEO_IMPORT_SUCCESS : UserNotificationType.MY_VIDEO_IMPORT_ERROR
211
212 function notificationChecker (notification: UserNotification, type: CheckerType) {
213 if (type === 'presence') {
214 expect(notification).to.not.be.undefined
215 expect(notification.type).to.equal(notificationType)
216
217 expect(notification.videoImport.targetUrl).to.equal(url)
218
219 if (success) checkVideo(notification.videoImport.video, videoName, videoUUID)
220 } else {
221 expect(notification.videoImport).to.satisfy(i => i === undefined || i.targetUrl !== url)
222 }
223 }
224
225 function emailFinder (email: object) {
226 const text: string = email[ 'text' ]
227 const toFind = success ? ' finished' : ' error'
228
229 return text.includes(url) && text.includes(toFind)
230 }
231
232 await checkNotification(base, notificationChecker, emailFinder, type)
233}
234
235async function checkUserRegistered (base: CheckerBaseParams, username: string, type: CheckerType) {
236 const notificationType = UserNotificationType.NEW_USER_REGISTRATION
237
238 function notificationChecker (notification: UserNotification, type: CheckerType) {
239 if (type === 'presence') {
240 expect(notification).to.not.be.undefined
241 expect(notification.type).to.equal(notificationType)
242
243 checkActor(notification.account)
244 expect(notification.account.name).to.equal(username)
245 } else {
246 expect(notification).to.satisfy(n => n.type !== notificationType || n.account.name !== username)
247 }
248 }
249
250 function emailFinder (email: object) {
251 const text: string = email[ 'text' ]
252
253 return text.includes(' registered ') && text.includes(username)
254 }
255
256 await checkNotification(base, notificationChecker, emailFinder, type)
257}
258
259async function checkNewActorFollow (
260 base: CheckerBaseParams,
261 followType: 'channel' | 'account',
262 followerName: string,
263 followerDisplayName: string,
264 followingDisplayName: string,
265 type: CheckerType
266) {
267 const notificationType = UserNotificationType.NEW_FOLLOW
268
269 function notificationChecker (notification: UserNotification, type: CheckerType) {
270 if (type === 'presence') {
271 expect(notification).to.not.be.undefined
272 expect(notification.type).to.equal(notificationType)
273
274 checkActor(notification.actorFollow.follower)
275 expect(notification.actorFollow.follower.displayName).to.equal(followerDisplayName)
276 expect(notification.actorFollow.follower.name).to.equal(followerName)
277 expect(notification.actorFollow.follower.host).to.not.be.undefined
278
279 expect(notification.actorFollow.following.displayName).to.equal(followingDisplayName)
280 expect(notification.actorFollow.following.type).to.equal(followType)
281 } else {
282 expect(notification).to.satisfy(n => {
283 return n.type !== notificationType ||
284 (n.actorFollow.follower.name !== followerName && n.actorFollow.following !== followingDisplayName)
285 })
286 }
287 }
288
289 function emailFinder (email: object) {
290 const text: string = email[ 'text' ]
291
292 return text.includes('Your ' + followType) && text.includes(followingDisplayName) && text.includes(followerDisplayName)
293 }
294
295 await checkNotification(base, notificationChecker, emailFinder, type)
296}
297
298async function checkCommentMention (
299 base: CheckerBaseParams,
300 uuid: string,
301 commentId: number,
302 threadId: number,
303 byAccountDisplayName: string,
304 type: CheckerType
305) {
306 const notificationType = UserNotificationType.COMMENT_MENTION
307
308 function notificationChecker (notification: UserNotification, type: CheckerType) {
309 if (type === 'presence') {
310 expect(notification).to.not.be.undefined
311 expect(notification.type).to.equal(notificationType)
312
313 checkComment(notification.comment, commentId, threadId)
314 checkActor(notification.comment.account)
315 expect(notification.comment.account.displayName).to.equal(byAccountDisplayName)
316
317 checkVideo(notification.comment.video, undefined, uuid)
318 } else {
319 expect(notification).to.satisfy(n => n.type !== notificationType || n.comment.id !== commentId)
320 }
321 }
322
323 function emailFinder (email: object) {
324 const text: string = email[ 'text' ]
325
326 return text.includes(' mentioned ') && text.includes(uuid) && text.includes(byAccountDisplayName)
327 }
328
329 await checkNotification(base, notificationChecker, emailFinder, type)
330}
331
332let lastEmailCount = 0
333async function checkNewCommentOnMyVideo (base: CheckerBaseParams, uuid: string, commentId: number, threadId: number, type: CheckerType) {
334 const notificationType = UserNotificationType.NEW_COMMENT_ON_MY_VIDEO
335
336 function notificationChecker (notification: UserNotification, type: CheckerType) {
337 if (type === 'presence') {
338 expect(notification).to.not.be.undefined
339 expect(notification.type).to.equal(notificationType)
340
341 checkComment(notification.comment, commentId, threadId)
342 checkActor(notification.comment.account)
343 checkVideo(notification.comment.video, undefined, uuid)
344 } else {
345 expect(notification).to.satisfy((n: UserNotification) => {
346 return n === undefined || n.comment === undefined || n.comment.id !== commentId
347 })
348 }
349 }
350
351 const commentUrl = `http://localhost:9001/videos/watch/${uuid};threadId=${threadId}`
352 function emailFinder (email: object) {
353 return email[ 'text' ].indexOf(commentUrl) !== -1
354 }
355
356 await checkNotification(base, notificationChecker, emailFinder, type)
357
358 if (type === 'presence') {
359 // We cannot detect email duplicates, so check we received another email
360 expect(base.emails).to.have.length.above(lastEmailCount)
361 lastEmailCount = base.emails.length
362 }
363}
364
365async function checkNewVideoAbuseForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) {
366 const notificationType = UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS
367
368 function notificationChecker (notification: UserNotification, type: CheckerType) {
369 if (type === 'presence') {
370 expect(notification).to.not.be.undefined
371 expect(notification.type).to.equal(notificationType)
372
373 expect(notification.videoAbuse.id).to.be.a('number')
374 checkVideo(notification.videoAbuse.video, videoName, videoUUID)
375 } else {
376 expect(notification).to.satisfy((n: UserNotification) => {
377 return n === undefined || n.videoAbuse === undefined || n.videoAbuse.video.uuid !== videoUUID
378 })
379 }
380 }
381
382 function emailFinder (email: object) {
383 const text = email[ 'text' ]
384 return text.indexOf(videoUUID) !== -1 && text.indexOf('abuse') !== -1
385 }
386
387 await checkNotification(base, notificationChecker, emailFinder, type)
388}
389
390async function checkNewBlacklistOnMyVideo (
391 base: CheckerBaseParams,
392 videoUUID: string,
393 videoName: string,
394 blacklistType: 'blacklist' | 'unblacklist'
395) {
396 const notificationType = blacklistType === 'blacklist'
397 ? UserNotificationType.BLACKLIST_ON_MY_VIDEO
398 : UserNotificationType.UNBLACKLIST_ON_MY_VIDEO
399
400 function notificationChecker (notification: UserNotification) {
401 expect(notification).to.not.be.undefined
402 expect(notification.type).to.equal(notificationType)
403
404 const video = blacklistType === 'blacklist' ? notification.videoBlacklist.video : notification.video
405
406 checkVideo(video, videoName, videoUUID)
407 }
408
409 function emailFinder (email: object) {
410 const text = email[ 'text' ]
411 return text.indexOf(videoUUID) !== -1 && text.indexOf(' ' + blacklistType) !== -1
412 }
413
414 await checkNotification(base, notificationChecker, emailFinder, 'presence')
415}
416
417// ---------------------------------------------------------------------------
418
419export {
420 CheckerBaseParams,
421 CheckerType,
422 checkNotification,
423 markAsReadAllNotifications,
424 checkMyVideoImportIsFinished,
425 checkUserRegistered,
426 checkVideoIsPublished,
427 checkNewVideoFromSubscription,
428 checkNewActorFollow,
429 checkNewCommentOnMyVideo,
430 checkNewBlacklistOnMyVideo,
431 checkCommentMention,
432 updateMyNotificationSettings,
433 checkNewVideoAbuseForModerators,
434 getUserNotifications,
435 markAsReadNotifications,
436 getLastNotification
437}
diff --git a/server/tests/utils/users/user-subscriptions.ts b/shared/utils/users/user-subscriptions.ts
index b0e7da7cc..7148fbfca 100644
--- a/server/tests/utils/users/user-subscriptions.ts
+++ b/shared/utils/users/user-subscriptions.ts
@@ -1,4 +1,4 @@
1import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../' 1import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../requests/requests'
2 2
3function addUserSubscription (url: string, token: string, targetUri: string, statusCodeExpected = 204) { 3function addUserSubscription (url: string, token: string, targetUri: string, statusCodeExpected = 204) {
4 const path = '/api/v1/users/me/subscriptions' 4 const path = '/api/v1/users/me/subscriptions'
diff --git a/server/tests/utils/users/users.ts b/shared/utils/users/users.ts
index 41d8ce265..7191b263e 100644
--- a/server/tests/utils/users/users.ts
+++ b/shared/utils/users/users.ts
@@ -1,8 +1,8 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../' 2import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../requests/requests'
3 3
4import { UserRole } from '../../../../shared/index' 4import { UserRole } from '../../index'
5import { NSFWPolicyType } from '../../../../shared/models/videos/nsfw-policy.type' 5import { NSFWPolicyType } from '../../models/videos/nsfw-policy.type'
6 6
7function createUser ( 7function createUser (
8 url: string, 8 url: string,
@@ -112,7 +112,7 @@ function getUsersList (url: string, accessToken: string) {
112 .expect('Content-Type', /json/) 112 .expect('Content-Type', /json/)
113} 113}
114 114
115function getUsersListPaginationAndSort (url: string, accessToken: string, start: number, count: number, sort: string) { 115function getUsersListPaginationAndSort (url: string, accessToken: string, start: number, count: number, sort: string, search?: string) {
116 const path = '/api/v1/users' 116 const path = '/api/v1/users'
117 117
118 return request(url) 118 return request(url)
@@ -120,6 +120,7 @@ function getUsersListPaginationAndSort (url: string, accessToken: string, start:
120 .query({ start }) 120 .query({ start })
121 .query({ count }) 121 .query({ count })
122 .query({ sort }) 122 .query({ sort })
123 .query({ search })
123 .set('Accept', 'application/json') 124 .set('Accept', 'application/json')
124 .set('Authorization', 'Bearer ' + accessToken) 125 .set('Authorization', 'Bearer ' + accessToken)
125 .expect(200) 126 .expect(200)
@@ -161,14 +162,15 @@ function unblockUser (url: string, userId: number | string, accessToken: string,
161 162
162function updateMyUser (options: { 163function updateMyUser (options: {
163 url: string 164 url: string
164 accessToken: string, 165 accessToken: string
165 currentPassword?: string, 166 currentPassword?: string
166 newPassword?: string, 167 newPassword?: string
167 nsfwPolicy?: NSFWPolicyType, 168 nsfwPolicy?: NSFWPolicyType
168 email?: string, 169 email?: string
169 autoPlayVideo?: boolean 170 autoPlayVideo?: boolean
170 displayName?: string, 171 displayName?: string
171 description?: string 172 description?: string
173 videosHistoryEnabled?: boolean
172}) { 174}) {
173 const path = '/api/v1/users/me' 175 const path = '/api/v1/users/me'
174 176
@@ -180,6 +182,9 @@ function updateMyUser (options: {
180 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email 182 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
181 if (options.description !== undefined && options.description !== null) toSend['description'] = options.description 183 if (options.description !== undefined && options.description !== null) toSend['description'] = options.description
182 if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName 184 if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName
185 if (options.videosHistoryEnabled !== undefined && options.videosHistoryEnabled !== null) {
186 toSend['videosHistoryEnabled'] = options.videosHistoryEnabled
187 }
183 188
184 return makePutBodyRequest({ 189 return makePutBodyRequest({
185 url: options.url, 190 url: options.url,
@@ -205,14 +210,18 @@ function updateUser (options: {
205 userId: number, 210 userId: number,
206 accessToken: string, 211 accessToken: string,
207 email?: string, 212 email?: string,
213 emailVerified?: boolean,
208 videoQuota?: number, 214 videoQuota?: number,
209 videoQuotaDaily?: number, 215 videoQuotaDaily?: number,
216 password?: string,
210 role?: UserRole 217 role?: UserRole
211}) { 218}) {
212 const path = '/api/v1/users/' + options.userId 219 const path = '/api/v1/users/' + options.userId
213 220
214 const toSend = {} 221 const toSend = {}
222 if (options.password !== undefined && options.password !== null) toSend['password'] = options.password
215 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email 223 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
224 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
216 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota 225 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
217 if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily 226 if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily
218 if (options.role !== undefined && options.role !== null) toSend['role'] = options.role 227 if (options.role !== undefined && options.role !== null) toSend['role'] = options.role
diff --git a/server/tests/utils/videos/services.ts b/shared/utils/videos/services.ts
index 1a53dd4cf..1a53dd4cf 100644
--- a/server/tests/utils/videos/services.ts
+++ b/shared/utils/videos/services.ts
diff --git a/server/tests/utils/videos/video-abuses.ts b/shared/utils/videos/video-abuses.ts
index 14907e6a0..7f011ec0f 100644
--- a/server/tests/utils/videos/video-abuses.ts
+++ b/shared/utils/videos/video-abuses.ts
@@ -1,6 +1,6 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { VideoAbuseUpdate } from '../../../../shared/models/videos/abuse/video-abuse-update.model' 2import { VideoAbuseUpdate } from '../../models/videos/abuse/video-abuse-update.model'
3import { makeDeleteRequest, makePutBodyRequest } from '..' 3import { makeDeleteRequest, makePutBodyRequest } from '../requests/requests'
4 4
5function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) { 5function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) {
6 const path = '/api/v1/videos/' + videoId + '/abuse' 6 const path = '/api/v1/videos/' + videoId + '/abuse'
diff --git a/server/tests/utils/videos/video-blacklist.ts b/shared/utils/videos/video-blacklist.ts
index 2c176fde0..f2ae0ed26 100644
--- a/server/tests/utils/videos/video-blacklist.ts
+++ b/shared/utils/videos/video-blacklist.ts
@@ -1,11 +1,18 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2 2
3function addVideoToBlacklist (url: string, token: string, videoId: number | string, reason?: string, specialStatus = 204) { 3function addVideoToBlacklist (
4 url: string,
5 token: string,
6 videoId: number | string,
7 reason?: string,
8 unfederate?: boolean,
9 specialStatus = 204
10) {
4 const path = '/api/v1/videos/' + videoId + '/blacklist' 11 const path = '/api/v1/videos/' + videoId + '/blacklist'
5 12
6 return request(url) 13 return request(url)
7 .post(path) 14 .post(path)
8 .send({ reason }) 15 .send({ reason, unfederate })
9 .set('Accept', 'application/json') 16 .set('Accept', 'application/json')
10 .set('Authorization', 'Bearer ' + token) 17 .set('Authorization', 'Bearer ' + token)
11 .expect(specialStatus) 18 .expect(specialStatus)
diff --git a/server/tests/utils/videos/video-captions.ts b/shared/utils/videos/video-captions.ts
index 41e52be07..8d67f617b 100644
--- a/server/tests/utils/videos/video-captions.ts
+++ b/shared/utils/videos/video-captions.ts
@@ -1,7 +1,7 @@
1import { makeDeleteRequest, makeGetRequest } from '../' 1import { makeDeleteRequest, makeGetRequest, makeUploadRequest } from '../requests/requests'
2import { buildAbsoluteFixturePath, makeUploadRequest } from '../index'
3import * as request from 'supertest' 2import * as request from 'supertest'
4import * as chai from 'chai' 3import * as chai from 'chai'
4import { buildAbsoluteFixturePath } from '../miscs/miscs'
5 5
6const expect = chai.expect 6const expect = chai.expect
7 7
diff --git a/server/tests/utils/videos/video-change-ownership.ts b/shared/utils/videos/video-change-ownership.ts
index f288692ea..f288692ea 100644
--- a/server/tests/utils/videos/video-change-ownership.ts
+++ b/shared/utils/videos/video-change-ownership.ts
diff --git a/server/tests/utils/videos/video-channels.ts b/shared/utils/videos/video-channels.ts
index 092985777..3935c261e 100644
--- a/server/tests/utils/videos/video-channels.ts
+++ b/shared/utils/videos/video-channels.ts
@@ -1,6 +1,6 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared/models/videos' 2import { VideoChannelCreate, VideoChannelUpdate } from '../../models/videos'
3import { updateAvatarRequest } from '../index' 3import { updateAvatarRequest } from '../requests/requests'
4 4
5function getVideoChannelsList (url: string, start: number, count: number, sort?: string) { 5function getVideoChannelsList (url: string, start: number, count: number, sort?: string) {
6 const path = '/api/v1/video-channels' 6 const path = '/api/v1/video-channels'
diff --git a/server/tests/utils/videos/video-comments.ts b/shared/utils/videos/video-comments.ts
index 1b9ee452e..0ebf69ced 100644
--- a/server/tests/utils/videos/video-comments.ts
+++ b/shared/utils/videos/video-comments.ts
@@ -1,7 +1,7 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { makeDeleteRequest } from '../' 2import { makeDeleteRequest } from '../requests/requests'
3 3
4function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string) { 4function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string, token?: string) {
5 const path = '/api/v1/videos/' + videoId + '/comment-threads' 5 const path = '/api/v1/videos/' + videoId + '/comment-threads'
6 6
7 const req = request(url) 7 const req = request(url)
@@ -10,20 +10,24 @@ function getVideoCommentThreads (url: string, videoId: number | string, start: n
10 .query({ count: count }) 10 .query({ count: count })
11 11
12 if (sort) req.query({ sort }) 12 if (sort) req.query({ sort })
13 if (token) req.set('Authorization', 'Bearer ' + token)
13 14
14 return req.set('Accept', 'application/json') 15 return req.set('Accept', 'application/json')
15 .expect(200) 16 .expect(200)
16 .expect('Content-Type', /json/) 17 .expect('Content-Type', /json/)
17} 18}
18 19
19function getVideoThreadComments (url: string, videoId: number | string, threadId: number) { 20function getVideoThreadComments (url: string, videoId: number | string, threadId: number, token?: string) {
20 const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId 21 const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId
21 22
22 return request(url) 23 const req = request(url)
23 .get(path) 24 .get(path)
24 .set('Accept', 'application/json') 25 .set('Accept', 'application/json')
25 .expect(200) 26
26 .expect('Content-Type', /json/) 27 if (token) req.set('Authorization', 'Bearer ' + token)
28
29 return req.expect(200)
30 .expect('Content-Type', /json/)
27} 31}
28 32
29function addVideoCommentThread (url: string, token: string, videoId: number | string, text: string, expectedStatus = 200) { 33function addVideoCommentThread (url: string, token: string, videoId: number | string, text: string, expectedStatus = 200) {
diff --git a/shared/utils/videos/video-history.ts b/shared/utils/videos/video-history.ts
new file mode 100644
index 000000000..dc7095b4d
--- /dev/null
+++ b/shared/utils/videos/video-history.ts
@@ -0,0 +1,39 @@
1import { makeGetRequest, makePostBodyRequest, makePutBodyRequest } from '../requests/requests'
2
3function userWatchVideo (url: string, token: string, videoId: number | string, currentTime: number, statusCodeExpected = 204) {
4 const path = '/api/v1/videos/' + videoId + '/watching'
5 const fields = { currentTime }
6
7 return makePutBodyRequest({ url, path, token, fields, statusCodeExpected })
8}
9
10function listMyVideosHistory (url: string, token: string) {
11 const path = '/api/v1/users/me/history/videos'
12
13 return makeGetRequest({
14 url,
15 path,
16 token,
17 statusCodeExpected: 200
18 })
19}
20
21function removeMyVideosHistory (url: string, token: string, beforeDate?: string) {
22 const path = '/api/v1/users/me/history/videos/remove'
23
24 return makePostBodyRequest({
25 url,
26 path,
27 token,
28 fields: beforeDate ? { beforeDate } : {},
29 statusCodeExpected: 204
30 })
31}
32
33// ---------------------------------------------------------------------------
34
35export {
36 userWatchVideo,
37 listMyVideosHistory,
38 removeMyVideosHistory
39}
diff --git a/server/tests/utils/videos/video-imports.ts b/shared/utils/videos/video-imports.ts
index 59dfd481a..ec77cdcda 100644
--- a/server/tests/utils/videos/video-imports.ts
+++ b/shared/utils/videos/video-imports.ts
@@ -1,5 +1,6 @@
1import { VideoImportCreate } from '../../../../shared/models/videos' 1
2import { makeGetRequest, makeUploadRequest } from '..' 2import { VideoImportCreate } from '../../models/videos'
3import { makeGetRequest, makeUploadRequest } from '../requests/requests'
3 4
4function getYoutubeVideoUrl () { 5function getYoutubeVideoUrl () {
5 return 'https://youtu.be/msX3jv1XdvM' 6 return 'https://youtu.be/msX3jv1XdvM'
@@ -10,6 +11,10 @@ function getMagnetURI () {
10 return 'magnet:?xs=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Ftorrents%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.torrent&xt=urn:btih:0f498834733e8057ed5c6f2ee2b4efd8d84a76ee&dn=super+peertube2+video&tr=wss%3A%2F%2Fpeertube2.cpy.re%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube2.cpy.re%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Fwebseed%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.mp4' 11 return 'magnet:?xs=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Ftorrents%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.torrent&xt=urn:btih:0f498834733e8057ed5c6f2ee2b4efd8d84a76ee&dn=super+peertube2+video&tr=wss%3A%2F%2Fpeertube2.cpy.re%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube2.cpy.re%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Fwebseed%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.mp4'
11} 12}
12 13
14function getBadVideoUrl () {
15 return 'https://download.cpy.re/peertube/bad_video.mp4'
16}
17
13function importVideo (url: string, token: string, attributes: VideoImportCreate) { 18function importVideo (url: string, token: string, attributes: VideoImportCreate) {
14 const path = '/api/v1/videos/imports' 19 const path = '/api/v1/videos/imports'
15 20
@@ -44,6 +49,7 @@ function getMyVideoImports (url: string, token: string, sort?: string) {
44// --------------------------------------------------------------------------- 49// ---------------------------------------------------------------------------
45 50
46export { 51export {
52 getBadVideoUrl,
47 getYoutubeVideoUrl, 53 getYoutubeVideoUrl,
48 importVideo, 54 importVideo,
49 getMagnetURI, 55 getMagnetURI,
diff --git a/shared/utils/videos/video-playlists.ts b/shared/utils/videos/video-playlists.ts
new file mode 100644
index 000000000..eb25011cb
--- /dev/null
+++ b/shared/utils/videos/video-playlists.ts
@@ -0,0 +1,51 @@
1import { makeRawRequest } from '../requests/requests'
2import { sha256 } from '../../../server/helpers/core-utils'
3import { VideoStreamingPlaylist } from '../../models/videos/video-streaming-playlist.model'
4import { expect } from 'chai'
5
6function getPlaylist (url: string, statusCodeExpected = 200) {
7 return makeRawRequest(url, statusCodeExpected)
8}
9
10function getSegment (url: string, statusCodeExpected = 200, range?: string) {
11 return makeRawRequest(url, statusCodeExpected, range)
12}
13
14function getSegmentSha256 (url: string, statusCodeExpected = 200) {
15 return makeRawRequest(url, statusCodeExpected)
16}
17
18async function checkSegmentHash (
19 baseUrlPlaylist: string,
20 baseUrlSegment: string,
21 videoUUID: string,
22 resolution: number,
23 hlsPlaylist: VideoStreamingPlaylist
24) {
25 const res = await getPlaylist(`${baseUrlPlaylist}/${videoUUID}/${resolution}.m3u8`)
26 const playlist = res.text
27
28 const videoName = `${videoUUID}-${resolution}-fragmented.mp4`
29
30 const matches = /#EXT-X-BYTERANGE:(\d+)@(\d+)/.exec(playlist)
31
32 const length = parseInt(matches[1], 10)
33 const offset = parseInt(matches[2], 10)
34 const range = `${offset}-${offset + length - 1}`
35
36 const res2 = await getSegment(`${baseUrlSegment}/${videoUUID}/${videoName}`, 206, `bytes=${range}`)
37
38 const resSha = await getSegmentSha256(hlsPlaylist.segmentsSha256Url)
39
40 const sha256Server = resSha.body[ videoName ][range]
41 expect(sha256(res2.body)).to.equal(sha256Server)
42}
43
44// ---------------------------------------------------------------------------
45
46export {
47 getPlaylist,
48 getSegment,
49 getSegmentSha256,
50 checkSegmentHash
51}
diff --git a/server/tests/utils/videos/videos.ts b/shared/utils/videos/videos.ts
index bc878b039..39c808d1f 100644
--- a/server/tests/utils/videos/videos.ts
+++ b/shared/utils/videos/videos.ts
@@ -16,9 +16,10 @@ import {
16 ServerInfo, 16 ServerInfo,
17 testImage 17 testImage
18} from '../' 18} from '../'
19import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' 19
20import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers' 20import { VideoDetails, VideoPrivacy } from '../../models/videos'
21import { dateIsValid, webtorrentAdd } from '../index' 21import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../server/initializers/constants'
22import { dateIsValid, webtorrentAdd } from '../miscs/miscs'
22 23
23type VideoAttributes = { 24type VideoAttributes = {
24 name?: string 25 name?: string
@@ -271,7 +272,16 @@ function removeVideo (url: string, token: string, id: number | string, expectedS
271async function checkVideoFilesWereRemoved ( 272async function checkVideoFilesWereRemoved (
272 videoUUID: string, 273 videoUUID: string,
273 serverNumber: number, 274 serverNumber: number,
274 directories = [ 'videos', 'thumbnails', 'torrents', 'previews', 'captions' ] 275 directories = [
276 'redundancy',
277 'videos',
278 'thumbnails',
279 'torrents',
280 'previews',
281 'captions',
282 join('playlists', 'hls'),
283 join('redundancy', 'hls')
284 ]
275) { 285) {
276 const testDirectory = 'test' + serverNumber 286 const testDirectory = 'test' + serverNumber
277 287
@@ -279,7 +289,7 @@ async function checkVideoFilesWereRemoved (
279 const directoryPath = join(root(), testDirectory, directory) 289 const directoryPath = join(root(), testDirectory, directory)
280 290
281 const directoryExists = existsSync(directoryPath) 291 const directoryExists = existsSync(directoryPath)
282 expect(directoryExists).to.be.true 292 if (!directoryExists) continue
283 293
284 const files = await readdir(directoryPath) 294 const files = await readdir(directoryPath)
285 for (const file of files) { 295 for (const file of files) {
@@ -420,7 +430,7 @@ function rateVideo (url: string, accessToken: string, id: number, rating: string
420function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) { 430function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
421 return new Promise<any>((res, rej) => { 431 return new Promise<any>((res, rej) => {
422 const torrentName = videoUUID + '-' + resolution + '.torrent' 432 const torrentName = videoUUID + '-' + resolution + '.torrent'
423 const torrentPath = join(__dirname, '..', '..', '..', '..', 'test' + server.serverNumber, 'torrents', torrentName) 433 const torrentPath = join(root(), 'test' + server.serverNumber, 'torrents', torrentName)
424 readFile(torrentPath, (err, data) => { 434 readFile(torrentPath, (err, data) => {
425 if (err) return rej(err) 435 if (err) return rej(err)
426 436
diff --git a/support/doc/api/accounts.yaml b/support/doc/api/accounts.yaml
deleted file mode 100644
index c5b20040d..000000000
--- a/support/doc/api/accounts.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
1parameters:
2 name:
3 name: name
4 in: path
5 required: true
6 type: string
7 description: 'The name of the account (chocobozzz or chocobozzz@peertube.cpy.re for example)' \ No newline at end of file
diff --git a/support/doc/api/commons.yaml b/support/doc/api/commons.yaml
deleted file mode 100644
index c8bab3c80..000000000
--- a/support/doc/api/commons.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
1parameters:
2 start:
3 name: start
4 in: query
5 required: false
6 type: number
7 description: 'Offset'
8 count:
9 name: count
10 in: query
11 required: false
12 type: number
13 description: 'Number of items'
14 sort:
15 name: sort
16 in: query
17 required: false
18 type: string
19 description: 'Sort column (-createdAt for example)'
20
21responses:
22 emptySuccess:
23 description: 'Successful operation' \ No newline at end of file
diff --git a/support/doc/api/html/index.html b/support/doc/api/html/index.html
deleted file mode 100644
index 0efc24f02..000000000
--- a/support/doc/api/html/index.html
+++ /dev/null
@@ -1,8540 +0,0 @@
1<!doctype html>
2<html class="no-js" lang="en">
3 <head>
4 <meta charset="utf-8" />
5 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6 <title>PeerTube | API Reference</title>
7 <link rel="stylesheet" href="stylesheets/foundation.min.css" />
8 <link rel="stylesheet" href="stylesheets/spectacle.min.css" />
9 <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
10 <!-- <script src="javascripts/foundation.js"></script> -->
11 <script src="javascripts/spectacle.min.js"></script>
12 </head>
13 <body id="spectacle">
14 <div id="page" class="drawer-layout drawer-slide-right-large">
15 <div id="sidebar">
16 <button class="close-button" aria-label="Close menu" type="button" data-drawer-close>
17 <span aria-hidden="true">×</span>
18 </button>
19 <nav id="nav" role="navigation">
20 <h5>Topics</h5>
21 <a href="#introduction">Introduction</a>
22 <a href="#authentication">Authentication</a>
23 <h5>Operations</h5>
24 <section>
25 <a href="#tag-Accounts">Accounts</a>
26 <ul>
27 <li>
28 <a href="#operation--accounts--name--get"> GET /accounts/{name} </a>
29 </li>
30 <li>
31 <a href="#operation--accounts--name--videos-get"> GET /accounts/{name}/videos </a>
32 </li>
33 <li>
34 <a href="#operation--accounts-get"> GET /accounts </a>
35 </li>
36 </ul>
37 </section>
38 <section>
39 <a href="#tag-Config">Config</a>
40 <ul>
41 <li>
42 <a href="#operation--config-get"> GET /config </a>
43 </li>
44 </ul>
45 </section>
46 <section>
47 <a href="#tag-Feeds">Feeds</a>
48 <ul>
49 <li>
50 <a href="#operation--feeds-videos.-format--get"> GET /feeds/videos.{format} </a>
51 </li>
52 </ul>
53 </section>
54 <section>
55 <a href="#tag-Job">Job</a>
56 <ul>
57 <li>
58 <a href="#operation--jobs-get"> GET /jobs </a>
59 </li>
60 </ul>
61 </section>
62 <section>
63 <a href="#tag-ServerFollowing">ServerFollowing</a>
64 <ul>
65 <li>
66 <a href="#operation--server-following--host--delete"> DELETE /server/following/{host} </a>
67 </li>
68 <li>
69 <a href="#operation--server-followers-get"> GET /server/followers </a>
70 </li>
71 <li>
72 <a href="#operation--server-following-get"> GET /server/following </a>
73 </li>
74 <li>
75 <a href="#operation--server-following-post"> POST /server/following </a>
76 </li>
77 </ul>
78 </section>
79 <section>
80 <a href="#tag-User">User</a>
81 <ul>
82 <li>
83 <a href="#operation--users-post"> POST /users </a>
84 </li>
85 <li>
86 <a href="#operation--users-get"> GET /users </a>
87 </li>
88 <li>
89 <a href="#operation--users--id--delete"> DELETE /users/{id} </a>
90 </li>
91 <li>
92 <a href="#operation--users--id--get"> GET /users/{id} </a>
93 </li>
94 <li>
95 <a href="#operation--users--id--put"> PUT /users/{id} </a>
96 </li>
97 <li>
98 <a href="#operation--users-me-get"> GET /users/me </a>
99 </li>
100 <li>
101 <a href="#operation--users-me-put"> PUT /users/me </a>
102 </li>
103 <li>
104 <a href="#operation--users-me-video-quota-used-get"> GET /users/me/video-quota-used </a>
105 </li>
106 <li>
107 <a href="#operation--users-me-videos--videoId--rating-get"> GET /users/me/videos/{videoId}/rating </a>
108 </li>
109 <li>
110 <a href="#operation--users-me-videos-get"> GET /users/me/videos </a>
111 </li>
112 <li>
113 <a href="#operation--users-register-post"> POST /users/register </a>
114 </li>
115 <li>
116 <a href="#operation--users-me-avatar-pick-post"> POST /users/me/avatar/pick </a>
117 </li>
118 </ul>
119 </section>
120 <section>
121 <a href="#tag-Video">Video</a>
122 <ul>
123 <li>
124 <a href="#operation--videos-get"> GET /videos </a>
125 </li>
126 <li>
127 <a href="#operation--videos-categories-get"> GET /videos/categories </a>
128 </li>
129 <li>
130 <a href="#operation--videos-licences-get"> GET /videos/licences </a>
131 </li>
132 <li>
133 <a href="#operation--videos-languages-get"> GET /videos/languages </a>
134 </li>
135 <li>
136 <a href="#operation--videos-privacies-get"> GET /videos/privacies </a>
137 </li>
138 <li>
139 <a href="#operation--videos--id--put"> PUT /videos/{id} </a>
140 </li>
141 <li>
142 <a href="#operation--videos--id--get"> GET /videos/{id} </a>
143 </li>
144 <li>
145 <a href="#operation--videos--id--delete"> DELETE /videos/{id} </a>
146 </li>
147 <li>
148 <a href="#operation--videos--id--description-get"> GET /videos/{id}/description </a>
149 </li>
150 <li>
151 <a href="#operation--videos--id--views-post"> POST /videos/{id}/views </a>
152 </li>
153 <li>
154 <a href="#operation--videos-upload-post"> POST /videos/upload </a>
155 </li>
156 </ul>
157 </section>
158 <section>
159 <a href="#tag-VideoAbuse">VideoAbuse</a>
160 <ul>
161 <li>
162 <a href="#operation--videos-abuse-get"> GET /videos/abuse </a>
163 </li>
164 <li>
165 <a href="#operation--videos--id--abuse-post"> POST /videos/{id}/abuse </a>
166 </li>
167 </ul>
168 </section>
169 <section>
170 <a href="#tag-VideoBlacklist">VideoBlacklist</a>
171 <ul>
172 <li>
173 <a href="#operation--videos--id--blacklist-post"> POST /videos/{id}/blacklist </a>
174 </li>
175 <li>
176 <a href="#operation--videos--id--blacklist-delete"> DELETE /videos/{id}/blacklist </a>
177 </li>
178 <li>
179 <a href="#operation--videos-blacklist-get"> GET /videos/blacklist </a>
180 </li>
181 </ul>
182 </section>
183 <section>
184 <a href="#tag-VideoChannel">VideoChannel</a>
185 <ul>
186 <li>
187 <a href="#operation--video-channels-get"> GET /video-channels </a>
188 </li>
189 <li>
190 <a href="#operation--video-channels-post"> POST /video-channels </a>
191 </li>
192 <li>
193 <a href="#operation--video-channels--id--get"> GET /video-channels/{id} </a>
194 </li>
195 <li>
196 <a href="#operation--video-channels--id--put"> PUT /video-channels/{id} </a>
197 </li>
198 <li>
199 <a href="#operation--video-channels--id--delete"> DELETE /video-channels/{id} </a>
200 </li>
201 <li>
202 <a href="#operation--video-channels--id--videos-get"> GET /video-channels/{id}/videos </a>
203 </li>
204 <li>
205 <a href="#operation--accounts--name--video-channels-get"> GET /accounts/{name}/video-channels </a>
206 </li>
207 </ul>
208 </section>
209 <section>
210 <a href="#tag-VideoComment">VideoComment</a>
211 <ul>
212 <li>
213 <a href="#operation--videos--id--comment-threads-get"> GET /videos/{id}/comment-threads </a>
214 </li>
215 <li>
216 <a href="#operation--videos--id--comment-threads-post"> POST /videos/{id}/comment-threads </a>
217 </li>
218 <li>
219 <a href="#operation--videos--id--comment-threads--threadId--get"> GET /videos/{id}/comment-threads/{threadId} </a>
220 </li>
221 <li>
222 <a href="#operation--videos--id--comments--commentId--post"> POST /videos/{id}/comments/{commentId} </a>
223 </li>
224 <li>
225 <a href="#operation--videos--id--comments--commentId--delete"> DELETE /videos/{id}/comments/{commentId} </a>
226 </li>
227 </ul>
228 </section>
229 <section>
230 <a href="#tag-VideoRate">VideoRate</a>
231 <ul>
232 <li>
233 <a href="#operation--videos--id--rate-put"> PUT /videos/{id}/rate </a>
234 </li>
235 </ul>
236 </section>
237 <section>
238 <a href="#tag-Search">Search</a>
239 <ul>
240 <li>
241 <a href="#operation--search-videos-get"> GET /search/videos </a>
242 </li>
243 </ul>
244 </section>
245 <h5>Schema Definitions</h5>
246 <a href="#definition-VideoConstantNumber"> VideoConstantNumber </a>
247 <a href="#definition-VideoConstantString"> VideoConstantString </a>
248 <a href="#definition-VideoPrivacy"> VideoPrivacy </a>
249 <a href="#definition-Video"> Video </a>
250 <a href="#definition-VideoAbuse"> VideoAbuse </a>
251 <a href="#definition-VideoBlacklist"> VideoBlacklist </a>
252 <a href="#definition-VideoChannel"> VideoChannel </a>
253 <a href="#definition-VideoComment"> VideoComment </a>
254 <a href="#definition-VideoCommentThreadTree"> VideoCommentThreadTree </a>
255 <a href="#definition-Avatar"> Avatar </a>
256 <a href="#definition-Actor"> Actor </a>
257 <a href="#definition-Account"> Account </a>
258 <a href="#definition-User"> User </a>
259 <a href="#definition-ServerConfig"> ServerConfig </a>
260 <a href="#definition-Follow"> Follow </a>
261 <a href="#definition-Job"> Job </a>
262 <a href="#definition-AddUserResponse"> AddUserResponse </a>
263 <a href="#definition-VideoUploadResponse"> VideoUploadResponse </a>
264 <a href="#definition-CommentThreadResponse"> CommentThreadResponse </a>
265 <a href="#definition-CommentThreadPostResponse"> CommentThreadPostResponse </a>
266 <a href="#definition-AddUser"> AddUser </a>
267 <a href="#definition-UpdateUser"> UpdateUser </a>
268 <a href="#definition-UpdateMe"> UpdateMe </a>
269 <a href="#definition-GetMeVideoRating"> GetMeVideoRating </a>
270 <a href="#definition-RegisterUser"> RegisterUser </a>
271 <a href="#definition-VideoChannelInput"> VideoChannelInput </a>
272 </nav>
273 </div>
274 <div id="docs" class="row collapse expanded drawer" data-drawer>
275 <button class="floating-menu-icon" type="button" data-drawer-slide="right">
276 <span class="hamburger"></span>
277 </button>
278 <div class="example-box doc-content"></div>
279 <article>
280 <h1 class="doc-title">PeerTube
281 <span>API Reference</span>
282 </h1>
283 <div id="introduction" data-traverse-target="introduction">
284 <div class="doc-row">
285 <div class="doc-copy">
286 <p>Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.</p>
287 </div>
288 <div class="doc-examples">
289 <section>
290 <h5>API Endpoint</h5>
291 <!-- <div class="hljs"> --><pre><code>https://peertube.example.com/api/v1</code></pre>
292 <!-- </div> -->
293 <h5>Schemes:
294 <span>https</span>
295 </h5>
296 <h5>Version:
297 <span>1.0.0-beta</span>
298 </h5>
299 </section>
300 </div>
301 </div>
302 </div>
303 <!-- <h1 id="security" data-traverse-target="security">Security</h1> -->
304 <h1 id="authentication" data-traverse-target="authentication">Authentication</h1>
305 <div id="security-definition-OAuth2" class="panel">
306 <div class="doc-row">
307 <div class="doc-copy">
308 <h3 class="security-definition-title">
309 <span class="security-name">OAuth2</span>
310 <span class="swagger-security-definition-oauth2"></span>
311 </h3>
312 <section class="security-definition-description">
313 <p>In the header:
314 <em>Authorization: Bearer mytoken</em>
315 </p>
316 </section>
317 <section class="swagger-security-definition-properties">
318 <div class="prop-row security-definition-property">
319 <div class="prop-name">
320 <div class="prop-title security-definition-property-name">type</div>
321 </div>
322 <div class="prop-value security-definition-property-type"> oauth2 </div>
323 </div>
324 <div class="prop-row security-definition-property">
325 <div class="prop-name">
326 <div class="prop-title security-definition-property-name">flow</div>
327 </div>
328 <div class="prop-value security-definition-property-type"> password </div>
329 </div>
330 <div class="prop-row security-definition-property">
331 <div class="prop-name">
332 <div class="prop-title security-definition-property-name">tokenUrl</div>
333 </div>
334 <div class="prop-value security-definition-property-type"> https://peertube.example.com/api/v1/users/token </div>
335 </div>
336 </section>
337 </div>
338 </div>
339 </div>
340 <h1 id="tag-Accounts" class="swagger-summary-tag" data-traverse-target="tag-Accounts">Accounts</h1>
341 <div id="operation--accounts--name--get" class="operation panel" data-traverse-target="operation--accounts--name--get">
342 <!-- <section class="operation-tags row"> -->
343 <!-- <div class="doc-copy"> -->
344 <div class="operation-tags">
345 <a class="label" href="#tag-Accounts">Accounts</a>
346 <!---->
347 </div>
348 <!-- </div> -->
349 <!-- </section> -->
350 <h2 class="operation-title">
351 <span class="operation-name">
352 <span class="operation-name">GET</span>
353 <span class="operation-path">/accounts/{name}</span>
354 </span>
355 </h2>
356 <div class="doc-row">
357 <div class="doc-copy">
358 <section class="swagger-request-params">
359 <div class="prop-row prop-group">
360 <div class="prop-name">
361 <div class="prop-title">name:
362 <span class="prop-type">
363 <span class="json-property-type">string</span>
364 <span class="json-property-range" title="Value limits"></span>
365 </span>
366 </div>
367 <span class="json-property-required"></span>
368 <div class="prop-subtitle"> in path </div>
369 </div>
370 <div class="prop-value">
371 <p>The name of the account (chocobozzz or
372 <a href="mailto:chocobozzz@peertube.cpy.re">chocobozzz@peertube.cpy.re</a> for example)</p>
373 </div>
374 </div>
375 <div class="prop-row prop-group">
376 <div class="prop-name">
377 <div class="prop-title">start:
378 <span class="prop-type">
379 <span class="json-property-type">number</span>
380 <span class="json-property-range" title="Value limits"></span>
381 </span>
382 </div>
383 <div class="prop-subtitle"> in query </div>
384 </div>
385 <div class="prop-value">
386 <p>Offset</p>
387 </div>
388 </div>
389 <div class="prop-row prop-group">
390 <div class="prop-name">
391 <div class="prop-title">count:
392 <span class="prop-type">
393 <span class="json-property-type">number</span>
394 <span class="json-property-range" title="Value limits"></span>
395 </span>
396 </div>
397 <div class="prop-subtitle"> in query </div>
398 </div>
399 <div class="prop-value">
400 <p>Number of items</p>
401 </div>
402 </div>
403 <div class="prop-row prop-group">
404 <div class="prop-name">
405 <div class="prop-title">sort:
406 <span class="prop-type">
407 <span class="json-property-type">string</span>
408 <span class="json-property-range" title="Value limits"></span>
409 </span>
410 </div>
411 <div class="prop-subtitle"> in query </div>
412 </div>
413 <div class="prop-value">
414 <p>Sort column (-createdAt for example)</p>
415 </div>
416 </div>
417 </section>
418 </div>
419 <div class="doc-examples"></div>
420 </div>
421 <div class="doc-row">
422 <div class="doc-copy">
423 <section class="swagger-responses">
424 <div class="prop-row prop-group">
425 <div class="prop-name">
426 <div class="prop-title">200 OK</div>
427 <div class="prop-ref">
428 <span class="">
429 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
430 </span>
431 </div>
432 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
433 </div>
434 <div class="prop-value">
435 <p>successful operation</p>
436 </div>
437 </div>
438 </section>
439 </div>
440 <div class="doc-examples">
441 <h5>Response Content-Types:
442 <span>application/json</span>
443 </h5>
444 <section>
445 <h5>Response Example
446 <span>(200 OK)</span>
447 </h5>
448 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
449 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
450 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
451 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
452 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
453 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
454 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
455 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
456 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
457 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
458 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
459 <span class="hljs-attr">&quot;avatar&quot;</span>: {
460 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
461 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
462 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
463 }
464}
465</code></pre>
466 <!-- </div> -->
467 </section>
468 </div>
469 </div>
470 </div>
471 <div id="operation--accounts--name--videos-get" class="operation panel" data-traverse-target="operation--accounts--name--videos-get">
472 <!-- <section class="operation-tags row"> -->
473 <!-- <div class="doc-copy"> -->
474 <div class="operation-tags">
475 <a class="label" href="#tag-Accounts">Accounts</a>
476 <!---->
477 </div>
478 <!-- </div> -->
479 <!-- </section> -->
480 <h2 class="operation-title">
481 <span class="operation-name">
482 <span class="operation-name">GET</span>
483 <span class="operation-path">/accounts/{name}/videos</span>
484 </span>
485 </h2>
486 <div class="doc-row">
487 <div class="doc-copy">
488 <section class="swagger-request-params">
489 <div class="prop-row prop-group">
490 <div class="prop-name">
491 <div class="prop-title">name:
492 <span class="prop-type">
493 <span class="json-property-type">string</span>
494 <span class="json-property-range" title="Value limits"></span>
495 </span>
496 </div>
497 <span class="json-property-required"></span>
498 <div class="prop-subtitle"> in path </div>
499 </div>
500 <div class="prop-value">
501 <p>The name of the account (chocobozzz or
502 <a href="mailto:chocobozzz@peertube.cpy.re">chocobozzz@peertube.cpy.re</a> for example)</p>
503 </div>
504 </div>
505 </section>
506 </div>
507 <div class="doc-examples"></div>
508 </div>
509 <div class="doc-row">
510 <div class="doc-copy">
511 <section class="swagger-responses">
512 <div class="prop-row prop-group">
513 <div class="prop-name">
514 <div class="prop-title">200 OK</div>
515 <div class="prop-ref">
516 <span class="">
517 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
518 </span>
519 </div>
520 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
521 </div>
522 <div class="prop-value">
523 <p>successful operation</p>
524 </div>
525 </div>
526 </section>
527 </div>
528 <div class="doc-examples">
529 <h5>Response Content-Types:
530 <span>application/json</span>
531 </h5>
532 <section>
533 <h5>Response Example
534 <span>(200 OK)</span>
535 </h5>
536 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
537 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
538 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
539 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
540 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
541 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
542 <span class="hljs-attr">&quot;category&quot;</span>: {
543 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
544 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
545 },
546 <span class="hljs-attr">&quot;licence&quot;</span>: {
547 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
548 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
549 },
550 <span class="hljs-attr">&quot;language&quot;</span>: {
551 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
552 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
553 },
554 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
555 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
556 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
557 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
558 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
559 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
560 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
561 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
562 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
563 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
564 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
565 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
566 <span class="hljs-attr">&quot;account&quot;</span>: {
567 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
568 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
569 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
570 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
571 <span class="hljs-attr">&quot;avatar&quot;</span>: {
572 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
573 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
574 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
575 }
576 }
577}
578</code></pre>
579 <!-- </div> -->
580 </section>
581 </div>
582 </div>
583 </div>
584 <div id="operation--accounts-get" class="operation panel" data-traverse-target="operation--accounts-get">
585 <!-- <section class="operation-tags row"> -->
586 <!-- <div class="doc-copy"> -->
587 <div class="operation-tags">
588 <a class="label" href="#tag-Accounts">Accounts</a>
589 <!---->
590 </div>
591 <!-- </div> -->
592 <!-- </section> -->
593 <h2 class="operation-title">
594 <span class="operation-name">
595 <span class="operation-name">GET</span>
596 <span class="operation-path">/accounts</span>
597 </span>
598 </h2>
599 <div class="doc-row">
600 <div class="doc-copy"> </div>
601 <div class="doc-examples"></div>
602 </div>
603 <div class="doc-row">
604 <div class="doc-copy">
605 <section class="swagger-responses">
606 <div class="prop-row prop-group">
607 <div class="prop-name">
608 <div class="prop-title">200 OK</div>
609 <div class="prop-ref">
610 <span class="json-schema-ref-array">
611 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
612 </span>
613 </div>
614 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
615 </div>
616 <div class="prop-value">
617 <p>successful operation</p>
618 </div>
619 </div>
620 <div class="prop-row prop-inner">
621 <div class="prop-name">type</div>
622 <div class="prop-value">
623 <span class="json-property-type">
624 <span class="json-schema-ref-array">
625 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
626 </span>
627 </span>
628 <span class="json-property-range" title="Value limits"></span>
629 </div>
630 </div>
631 </section>
632 </div>
633 <div class="doc-examples">
634 <h5>Response Content-Types:
635 <span>application/json</span>
636 </h5>
637 <section>
638 <h5>Response Example
639 <span>(200 OK)</span>
640 </h5>
641 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
642 {
643 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
644 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
645 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
646 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
647 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
648 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
649 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
650 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
651 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
652 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
653 <span class="hljs-attr">&quot;avatar&quot;</span>: {
654 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
655 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
656 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
657 }
658 }
659]
660</code></pre>
661 <!-- </div> -->
662 </section>
663 </div>
664 </div>
665 </div>
666 <h1 id="tag-Config" class="swagger-summary-tag" data-traverse-target="tag-Config">Config</h1>
667 <div id="operation--config-get" class="operation panel" data-traverse-target="operation--config-get">
668 <!-- <section class="operation-tags row"> -->
669 <!-- <div class="doc-copy"> -->
670 <div class="operation-tags">
671 <a class="label" href="#tag-Config">Config</a>
672 <!---->
673 </div>
674 <!-- </div> -->
675 <!-- </section> -->
676 <h2 class="operation-title">
677 <span class="operation-name">
678 <span class="operation-name">GET</span>
679 <span class="operation-path">/config</span>
680 </span>
681 </h2>
682 <div class="doc-row">
683 <div class="doc-copy"> </div>
684 <div class="doc-examples"></div>
685 </div>
686 <div class="doc-row">
687 <div class="doc-copy">
688 <section class="swagger-responses">
689 <div class="prop-row prop-group">
690 <div class="prop-name">
691 <div class="prop-title">200 OK</div>
692 <div class="prop-ref">
693 <span class="">
694 <a class="json-schema-ref" href="#/definitions/ServerConfig">ServerConfig</a>
695 </span>
696 </div>
697 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
698 </div>
699 <div class="prop-value">
700 <p>successful operation</p>
701 </div>
702 </div>
703 </section>
704 </div>
705 <div class="doc-examples">
706 <h5>Response Content-Types:
707 <span>application/json</span>
708 </h5>
709 <section>
710 <h5>Response Example
711 <span>(200 OK)</span>
712 </h5>
713 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
714 <span class="hljs-attr">&quot;signup&quot;</span>: {
715 <span class="hljs-attr">&quot;allowed&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>
716 },
717 <span class="hljs-attr">&quot;transcoding&quot;</span>: {
718 <span class="hljs-attr">&quot;enabledResolutions&quot;</span>: [
719 <span class="hljs-string">&quot;number&quot;</span>
720 ]
721 },
722 <span class="hljs-attr">&quot;avatar&quot;</span>: {
723 <span class="hljs-attr">&quot;file&quot;</span>: {
724 <span class="hljs-attr">&quot;size&quot;</span>: {
725 <span class="hljs-attr">&quot;max&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>
726 }
727 },
728 <span class="hljs-attr">&quot;extensions&quot;</span>: [
729 <span class="hljs-string">&quot;string&quot;</span>
730 ]
731 },
732 <span class="hljs-attr">&quot;video&quot;</span>: {
733 <span class="hljs-attr">&quot;file&quot;</span>: {
734 <span class="hljs-attr">&quot;extensions&quot;</span>: [
735 <span class="hljs-string">&quot;string&quot;</span>
736 ]
737 }
738 }
739}
740</code></pre>
741 <!-- </div> -->
742 </section>
743 </div>
744 </div>
745 </div>
746 <h1 id="tag-Feeds" class="swagger-summary-tag" data-traverse-target="tag-Feeds">Feeds</h1>
747 <div id="operation--feeds-videos.-format--get" class="operation panel" data-traverse-target="operation--feeds-videos.-format--get">
748 <!-- <section class="operation-tags row"> -->
749 <!-- <div class="doc-copy"> -->
750 <div class="operation-tags">
751 <a class="label" href="#tag-Feeds">Feeds</a>
752 <!---->
753 </div>
754 <!-- </div> -->
755 <!-- </section> -->
756 <h2 class="operation-title">
757 <span class="operation-name">
758 <span class="operation-name">GET</span>
759 <span class="operation-path">/feeds/videos.{format}</span>
760 </span>
761 </h2>
762 <div class="doc-row">
763 <div class="doc-copy">
764 <section class="swagger-request-params">
765 <div class="prop-row prop-group">
766 <div class="prop-name">
767 <div class="prop-title">format:
768 <span class="prop-type">
769 <span class="json-property-type">string</span>
770 <span class="json-property-enum" title="Possible values">
771 <span class="json-property-enum-item json-property-enum-default-value">xml</span>,
772 <span class="json-property-enum-item">atom</span>,
773 <span class="json-property-enum-item">json</span>
774 </span>
775 <span class="json-property-range" title="Value limits"></span>
776 <span class="json-property-default-value" title="Default value">xml</span>
777 </span>
778 </div>
779 <span class="json-property-required"></span>
780 <div class="prop-subtitle"> in path </div>
781 </div>
782 <div class="prop-value">
783 <p>The format expected (xml defaults to RSS 2.0, atom to ATOM 1.0 and json to JSON FEED 1.0</p>
784 </div>
785 </div>
786 <div class="prop-row prop-group">
787 <div class="prop-name">
788 <div class="prop-title">accountId:
789 <span class="prop-type">
790 <span class="json-property-type">number</span>
791 <span class="json-property-range" title="Value limits"></span>
792 </span>
793 </div>
794 <div class="prop-subtitle"> in query </div>
795 </div>
796 <div class="prop-value">
797 <p>The id of the local account to filter to (beware, users IDs and not actors IDs which will return empty feeds</p>
798 </div>
799 </div>
800 <div class="prop-row prop-group">
801 <div class="prop-name">
802 <div class="prop-title">accountName:
803 <span class="prop-type">
804 <span class="json-property-type">string</span>
805 <span class="json-property-range" title="Value limits"></span>
806 </span>
807 </div>
808 <div class="prop-subtitle"> in query </div>
809 </div>
810 <div class="prop-value">
811 <p>The name of the local account to filter to</p>
812 </div>
813 </div>
814 </section>
815 </div>
816 <div class="doc-examples"></div>
817 </div>
818 <div class="doc-row">
819 <div class="doc-copy">
820 <section class="swagger-responses">
821 <div class="prop-row prop-group">
822 <div class="prop-name">
823 <div class="prop-title">200 OK</div>
824 </div>
825 <div class="prop-value">
826 <p>successful operation</p>
827 </div>
828 </div>
829 </section>
830 </div>
831 <div class="doc-examples">
832 <h5>Response Content-Types:
833 <span>application/atom+xml, application/rss+xml, application/json</span>
834 </h5>
835 </div>
836 </div>
837 </div>
838 <h1 id="tag-Job" class="swagger-summary-tag" data-traverse-target="tag-Job">Job</h1>
839 <div id="operation--jobs-get" class="operation panel" data-traverse-target="operation--jobs-get">
840 <!-- <section class="operation-tags row"> -->
841 <!-- <div class="doc-copy"> -->
842 <div class="operation-tags">
843 <a class="label" href="#tag-Job">Job</a>
844 <!---->
845 </div>
846 <!-- </div> -->
847 <!-- </section> -->
848 <h2 class="operation-title">
849 <span class="operation-name">
850 <span class="operation-name">GET</span>
851 <span class="operation-path">/jobs</span>
852 </span>
853 </h2>
854 <div class="doc-row">
855 <div class="doc-copy">
856 <section class="swagger-request-params">
857 <div class="prop-row prop-group">
858 <div class="prop-name">
859 <div class="prop-title">state:
860 <span class="prop-type">
861 <span class="json-property-type">string</span>
862 <span class="json-property-range" title="Value limits"></span>
863 </span>
864 </div>
865 <span class="json-property-required"></span>
866 <div class="prop-subtitle"> in path </div>
867 </div>
868 <div class="prop-value">
869 <p>The state of the job</p>
870 </div>
871 </div>
872 <div class="prop-row prop-group">
873 <div class="prop-name">
874 <div class="prop-title">start:
875 <span class="prop-type">
876 <span class="json-property-type">number</span>
877 <span class="json-property-range" title="Value limits"></span>
878 </span>
879 </div>
880 <div class="prop-subtitle"> in query </div>
881 </div>
882 <div class="prop-value">
883 <p>Offset</p>
884 </div>
885 </div>
886 <div class="prop-row prop-group">
887 <div class="prop-name">
888 <div class="prop-title">count:
889 <span class="prop-type">
890 <span class="json-property-type">number</span>
891 <span class="json-property-range" title="Value limits"></span>
892 </span>
893 </div>
894 <div class="prop-subtitle"> in query </div>
895 </div>
896 <div class="prop-value">
897 <p>Number of items</p>
898 </div>
899 </div>
900 <div class="prop-row prop-group">
901 <div class="prop-name">
902 <div class="prop-title">sort:
903 <span class="prop-type">
904 <span class="json-property-type">string</span>
905 <span class="json-property-range" title="Value limits"></span>
906 </span>
907 </div>
908 <div class="prop-subtitle"> in query </div>
909 </div>
910 <div class="prop-value">
911 <p>Sort column (-createdAt for example)</p>
912 </div>
913 </div>
914 </section>
915 </div>
916 <div class="doc-examples"></div>
917 </div>
918 <div class="doc-row">
919 <div class="doc-copy">
920 <section class="swagger-responses">
921 <div class="prop-row prop-group">
922 <div class="prop-name">
923 <div class="prop-title">200 OK</div>
924 <div class="prop-ref">
925 <span class="json-schema-ref-array">
926 <a class="json-schema-ref" href="#/definitions/Job">Job</a>
927 </span>
928 </div>
929 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
930 </div>
931 <div class="prop-value">
932 <p>successful operation</p>
933 </div>
934 </div>
935 <div class="prop-row prop-inner">
936 <div class="prop-name">type</div>
937 <div class="prop-value">
938 <span class="json-property-type">
939 <span class="json-schema-ref-array">
940 <a class="json-schema-ref" href="#/definitions/Job">Job</a>
941 </span>
942 </span>
943 <span class="json-property-range" title="Value limits"></span>
944 </div>
945 </div>
946 </section>
947 </div>
948 <div class="doc-examples">
949 <h5>Response Content-Types:
950 <span>application/json</span>
951 </h5>
952 <section>
953 <h5>Response Example
954 <span>(200 OK)</span>
955 </h5>
956 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
957 {
958 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
959 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
960 <span class="hljs-attr">&quot;category&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
961 <span class="hljs-attr">&quot;handlerName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
962 <span class="hljs-attr">&quot;handlerInputData&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
963 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
964 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
965 }
966]
967</code></pre>
968 <!-- </div> -->
969 </section>
970 </div>
971 </div>
972 <div class="doc-row">
973 <div class="doc-copy">
974 <section class="swagger-request-security">
975 <table class="table">
976 <thead>
977 <tr>
978 <th class="swagger-request-security-schema"></th>
979 <th class="swagger-request-security-scopes"></th>
980 </tr>
981 </thead>
982 <tbody>
983 <tr>
984 <td>
985 <a href="#security-definition-OAuth2">OAuth2</a>
986 </td>
987 <td> </td>
988 </tr>
989 </tbody>
990 </table>
991 </section>
992 </div>
993 </div>
994 </div>
995 <h1 id="tag-ServerFollowing" class="swagger-summary-tag" data-traverse-target="tag-ServerFollowing">ServerFollowing</h1>
996 <div id="operation--server-following--host--delete" class="operation panel" data-traverse-target="operation--server-following--host--delete">
997 <!-- <section class="operation-tags row"> -->
998 <!-- <div class="doc-copy"> -->
999 <div class="operation-tags">
1000 <a class="label" href="#tag-ServerFollowing">ServerFollowing</a>
1001 <!---->
1002 </div>
1003 <!-- </div> -->
1004 <!-- </section> -->
1005 <h2 class="operation-title">
1006 <span class="operation-name">
1007 <span class="operation-name">DELETE</span>
1008 <span class="operation-path">/server/following/{host}</span>
1009 </span>
1010 </h2>
1011 <div class="doc-row">
1012 <div class="doc-copy">
1013 <section class="swagger-request-params">
1014 <div class="prop-row prop-group">
1015 <div class="prop-name">
1016 <div class="prop-title">host:
1017 <span class="prop-type">
1018 <span class="json-property-type">string</span>
1019 <span class="json-property-range" title="Value limits"></span>
1020 </span>
1021 </div>
1022 <span class="json-property-required"></span>
1023 <div class="prop-subtitle"> in path </div>
1024 </div>
1025 <div class="prop-value">
1026 <p>The host to unfollow </p>
1027 </div>
1028 </div>
1029 </section>
1030 </div>
1031 <div class="doc-examples"></div>
1032 </div>
1033 <div class="doc-row">
1034 <div class="doc-copy">
1035 <section class="swagger-responses">
1036 <div class="prop-row prop-group">
1037 <div class="prop-name">
1038 <div class="prop-title">201 Created</div>
1039 </div>
1040 <div class="prop-value">
1041 <p>successful operation</p>
1042 </div>
1043 </div>
1044 </section>
1045 </div>
1046 <div class="doc-examples">
1047 <h5>Response Content-Types:
1048 <span>application/json</span>
1049 </h5>
1050 </div>
1051 </div>
1052 <div class="doc-row">
1053 <div class="doc-copy">
1054 <section class="swagger-request-security">
1055 <table class="table">
1056 <thead>
1057 <tr>
1058 <th class="swagger-request-security-schema"></th>
1059 <th class="swagger-request-security-scopes"></th>
1060 </tr>
1061 </thead>
1062 <tbody>
1063 <tr>
1064 <td>
1065 <a href="#security-definition-OAuth2">OAuth2</a>
1066 </td>
1067 <td> </td>
1068 </tr>
1069 </tbody>
1070 </table>
1071 </section>
1072 </div>
1073 </div>
1074 </div>
1075 <div id="operation--server-followers-get" class="operation panel" data-traverse-target="operation--server-followers-get">
1076 <!-- <section class="operation-tags row"> -->
1077 <!-- <div class="doc-copy"> -->
1078 <div class="operation-tags">
1079 <a class="label" href="#tag-ServerFollowing">ServerFollowing</a>
1080 <!---->
1081 </div>
1082 <!-- </div> -->
1083 <!-- </section> -->
1084 <h2 class="operation-title">
1085 <span class="operation-name">
1086 <span class="operation-name">GET</span>
1087 <span class="operation-path">/server/followers</span>
1088 </span>
1089 </h2>
1090 <div class="doc-row">
1091 <div class="doc-copy">
1092 <section class="swagger-request-params">
1093 <div class="prop-row prop-group">
1094 <div class="prop-name">
1095 <div class="prop-title">start:
1096 <span class="prop-type">
1097 <span class="json-property-type">number</span>
1098 <span class="json-property-range" title="Value limits"></span>
1099 </span>
1100 </div>
1101 <div class="prop-subtitle"> in query </div>
1102 </div>
1103 <div class="prop-value">
1104 <p>Offset</p>
1105 </div>
1106 </div>
1107 <div class="prop-row prop-group">
1108 <div class="prop-name">
1109 <div class="prop-title">count:
1110 <span class="prop-type">
1111 <span class="json-property-type">number</span>
1112 <span class="json-property-range" title="Value limits"></span>
1113 </span>
1114 </div>
1115 <div class="prop-subtitle"> in query </div>
1116 </div>
1117 <div class="prop-value">
1118 <p>Number of items</p>
1119 </div>
1120 </div>
1121 <div class="prop-row prop-group">
1122 <div class="prop-name">
1123 <div class="prop-title">sort:
1124 <span class="prop-type">
1125 <span class="json-property-type">string</span>
1126 <span class="json-property-range" title="Value limits"></span>
1127 </span>
1128 </div>
1129 <div class="prop-subtitle"> in query </div>
1130 </div>
1131 <div class="prop-value">
1132 <p>Sort column (-createdAt for example)</p>
1133 </div>
1134 </div>
1135 </section>
1136 </div>
1137 <div class="doc-examples"></div>
1138 </div>
1139 <div class="doc-row">
1140 <div class="doc-copy">
1141 <section class="swagger-responses">
1142 <div class="prop-row prop-group">
1143 <div class="prop-name">
1144 <div class="prop-title">200 OK</div>
1145 <div class="prop-ref">
1146 <span class="json-schema-ref-array">
1147 <a class="json-schema-ref" href="#/definitions/Follow">Follow</a>
1148 </span>
1149 </div>
1150 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
1151 </div>
1152 <div class="prop-value">
1153 <p>successful operation</p>
1154 </div>
1155 </div>
1156 <div class="prop-row prop-inner">
1157 <div class="prop-name">type</div>
1158 <div class="prop-value">
1159 <span class="json-property-type">
1160 <span class="json-schema-ref-array">
1161 <a class="json-schema-ref" href="#/definitions/Follow">Follow</a>
1162 </span>
1163 </span>
1164 <span class="json-property-range" title="Value limits"></span>
1165 </div>
1166 </div>
1167 </section>
1168 </div>
1169 <div class="doc-examples">
1170 <h5>Response Content-Types:
1171 <span>application/json</span>
1172 </h5>
1173 <section>
1174 <h5>Response Example
1175 <span>(200 OK)</span>
1176 </h5>
1177 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
1178 {
1179 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1180 <span class="hljs-attr">&quot;follower&quot;</span>: {
1181 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1182 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1183 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1184 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1185 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1186 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1187 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1188 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1189 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1190 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1191 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1192 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1193 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1194 }
1195 },
1196 <span class="hljs-attr">&quot;following&quot;</span>: {
1197 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1198 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1199 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1200 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1201 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1202 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1203 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1204 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1205 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1206 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1207 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1208 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1209 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1210 }
1211 },
1212 <span class="hljs-attr">&quot;score&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1213 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1214 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1215 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1216 }
1217]
1218</code></pre>
1219 <!-- </div> -->
1220 </section>
1221 </div>
1222 </div>
1223 </div>
1224 <div id="operation--server-following-get" class="operation panel" data-traverse-target="operation--server-following-get">
1225 <!-- <section class="operation-tags row"> -->
1226 <!-- <div class="doc-copy"> -->
1227 <div class="operation-tags">
1228 <a class="label" href="#tag-ServerFollowing">ServerFollowing</a>
1229 <!---->
1230 </div>
1231 <!-- </div> -->
1232 <!-- </section> -->
1233 <h2 class="operation-title">
1234 <span class="operation-name">
1235 <span class="operation-name">GET</span>
1236 <span class="operation-path">/server/following</span>
1237 </span>
1238 </h2>
1239 <div class="doc-row">
1240 <div class="doc-copy">
1241 <section class="swagger-request-params">
1242 <div class="prop-row prop-group">
1243 <div class="prop-name">
1244 <div class="prop-title">start:
1245 <span class="prop-type">
1246 <span class="json-property-type">number</span>
1247 <span class="json-property-range" title="Value limits"></span>
1248 </span>
1249 </div>
1250 <div class="prop-subtitle"> in query </div>
1251 </div>
1252 <div class="prop-value">
1253 <p>Offset</p>
1254 </div>
1255 </div>
1256 <div class="prop-row prop-group">
1257 <div class="prop-name">
1258 <div class="prop-title">count:
1259 <span class="prop-type">
1260 <span class="json-property-type">number</span>
1261 <span class="json-property-range" title="Value limits"></span>
1262 </span>
1263 </div>
1264 <div class="prop-subtitle"> in query </div>
1265 </div>
1266 <div class="prop-value">
1267 <p>Number of items</p>
1268 </div>
1269 </div>
1270 <div class="prop-row prop-group">
1271 <div class="prop-name">
1272 <div class="prop-title">sort:
1273 <span class="prop-type">
1274 <span class="json-property-type">string</span>
1275 <span class="json-property-range" title="Value limits"></span>
1276 </span>
1277 </div>
1278 <div class="prop-subtitle"> in query </div>
1279 </div>
1280 <div class="prop-value">
1281 <p>Sort column (-createdAt for example)</p>
1282 </div>
1283 </div>
1284 </section>
1285 </div>
1286 <div class="doc-examples"></div>
1287 </div>
1288 <div class="doc-row">
1289 <div class="doc-copy">
1290 <section class="swagger-responses">
1291 <div class="prop-row prop-group">
1292 <div class="prop-name">
1293 <div class="prop-title">200 OK</div>
1294 <div class="prop-ref">
1295 <span class="json-schema-ref-array">
1296 <a class="json-schema-ref" href="#/definitions/Follow">Follow</a>
1297 </span>
1298 </div>
1299 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
1300 </div>
1301 <div class="prop-value">
1302 <p>successful operation</p>
1303 </div>
1304 </div>
1305 <div class="prop-row prop-inner">
1306 <div class="prop-name">type</div>
1307 <div class="prop-value">
1308 <span class="json-property-type">
1309 <span class="json-schema-ref-array">
1310 <a class="json-schema-ref" href="#/definitions/Follow">Follow</a>
1311 </span>
1312 </span>
1313 <span class="json-property-range" title="Value limits"></span>
1314 </div>
1315 </div>
1316 </section>
1317 </div>
1318 <div class="doc-examples">
1319 <h5>Response Content-Types:
1320 <span>application/json</span>
1321 </h5>
1322 <section>
1323 <h5>Response Example
1324 <span>(200 OK)</span>
1325 </h5>
1326 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
1327 {
1328 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1329 <span class="hljs-attr">&quot;follower&quot;</span>: {
1330 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1331 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1332 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1333 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1334 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1335 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1336 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1337 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1338 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1339 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1340 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1341 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1342 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1343 }
1344 },
1345 <span class="hljs-attr">&quot;following&quot;</span>: {
1346 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1347 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1348 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1349 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1350 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1351 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1352 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1353 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1354 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1355 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1356 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1357 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1358 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1359 }
1360 },
1361 <span class="hljs-attr">&quot;score&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1362 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1363 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1364 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1365 }
1366]
1367</code></pre>
1368 <!-- </div> -->
1369 </section>
1370 </div>
1371 </div>
1372 </div>
1373 <div id="operation--server-following-post" class="operation panel" data-traverse-target="operation--server-following-post">
1374 <!-- <section class="operation-tags row"> -->
1375 <!-- <div class="doc-copy"> -->
1376 <div class="operation-tags">
1377 <a class="label" href="#tag-ServerFollowing">ServerFollowing</a>
1378 <!---->
1379 </div>
1380 <!-- </div> -->
1381 <!-- </section> -->
1382 <h2 class="operation-title">
1383 <span class="operation-name">
1384 <span class="operation-name">POST</span>
1385 <span class="operation-path">/server/following</span>
1386 </span>
1387 </h2>
1388 <div class="doc-row">
1389 <div class="doc-copy">
1390 <section class="swagger-request-body">
1391 <div class="prop-row">
1392 <div class="prop-name">
1393 <div class="swagger-request-model">
1394 <span class="">
1395 <a class="json-schema-ref" href="#/definitions/Follow">Follow</a>
1396 </span>
1397 </div>
1398 </div>
1399 <div class="prop-value columns small-6">
1400 <!-- <div class="swagger-request-description"> -->
1401 <p>undefined</p>
1402 <!-- </div> -->
1403 </div>
1404 </div>
1405 </section>
1406 </div>
1407 <div class="doc-examples">
1408 <section>
1409 <h5>Request Content-Types:
1410 <span>application/json</span>
1411 </h5>
1412 <h5>Request Example</h5>
1413 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
1414 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1415 <span class="hljs-attr">&quot;follower&quot;</span>: {
1416 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1417 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1418 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1419 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1420 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1421 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1422 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1423 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1424 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1425 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1426 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1427 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1428 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1429 }
1430 },
1431 <span class="hljs-attr">&quot;following&quot;</span>: {
1432 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1433 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1434 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1435 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1436 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1437 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1438 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1439 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1440 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1441 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1442 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1443 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1444 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1445 }
1446 },
1447 <span class="hljs-attr">&quot;score&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1448 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1449 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1450 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1451}
1452</code></pre>
1453 <!-- </div> -->
1454 </section>
1455 </div>
1456 </div>
1457 <div class="doc-row">
1458 <div class="doc-copy">
1459 <section class="swagger-responses">
1460 <div class="prop-row prop-group">
1461 <div class="prop-name">
1462 <div class="prop-title">204 No Content</div>
1463 </div>
1464 <div class="prop-value">
1465 <p>Successful operation</p>
1466 </div>
1467 </div>
1468 </section>
1469 </div>
1470 <div class="doc-examples">
1471 <h5>Response Content-Types:
1472 <span>application/json</span>
1473 </h5>
1474 </div>
1475 </div>
1476 <div class="doc-row">
1477 <div class="doc-copy">
1478 <section class="swagger-request-security">
1479 <table class="table">
1480 <thead>
1481 <tr>
1482 <th class="swagger-request-security-schema"></th>
1483 <th class="swagger-request-security-scopes"></th>
1484 </tr>
1485 </thead>
1486 <tbody>
1487 <tr>
1488 <td>
1489 <a href="#security-definition-OAuth2">OAuth2</a>
1490 </td>
1491 <td> </td>
1492 </tr>
1493 </tbody>
1494 </table>
1495 </section>
1496 </div>
1497 </div>
1498 </div>
1499 <h1 id="tag-User" class="swagger-summary-tag" data-traverse-target="tag-User">User</h1>
1500 <div id="operation--users-post" class="operation panel" data-traverse-target="operation--users-post">
1501 <!-- <section class="operation-tags row"> -->
1502 <!-- <div class="doc-copy"> -->
1503 <div class="operation-tags">
1504 <a class="label" href="#tag-User">User</a>
1505 <!---->
1506 </div>
1507 <!-- </div> -->
1508 <!-- </section> -->
1509 <h2 class="operation-title">
1510 <span class="operation-name">
1511 <span class="operation-name">POST</span>
1512 <span class="operation-path">/users</span>
1513 </span>
1514 </h2>
1515 <div class="doc-row">
1516 <div class="doc-copy">
1517 <section class="swagger-request-body">
1518 <div class="prop-row">
1519 <div class="prop-name">
1520 <div class="swagger-request-model">
1521 <span class="">
1522 <a class="json-schema-ref" href="#/definitions/AddUser">AddUser</a>
1523 </span>
1524 </div>
1525 </div>
1526 <div class="prop-value columns small-6">
1527 <!-- <div class="swagger-request-description"> -->
1528 <p>User to create</p>
1529 <!-- </div> -->
1530 </div>
1531 </div>
1532 </section>
1533 </div>
1534 <div class="doc-examples">
1535 <section>
1536 <h5>Request Content-Types:
1537 <span>application/json</span>
1538 </h5>
1539 <h5>Request Example</h5>
1540 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
1541 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1542 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1543 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1544 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1545 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1546}
1547</code></pre>
1548 <!-- </div> -->
1549 </section>
1550 </div>
1551 </div>
1552 <div class="doc-row">
1553 <div class="doc-copy">
1554 <section class="swagger-responses">
1555 <div class="prop-row prop-group">
1556 <div class="prop-name">
1557 <div class="prop-title">200 OK</div>
1558 <div class="prop-ref">
1559 <span class="">
1560 <a class="json-schema-ref" href="#/definitions/AddUserResponse">AddUserResponse</a>
1561 </span>
1562 </div>
1563 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
1564 </div>
1565 <div class="prop-value">
1566 <p>successful operation</p>
1567 </div>
1568 </div>
1569 </section>
1570 </div>
1571 <div class="doc-examples">
1572 <h5>Response Content-Types:
1573 <span>application/json</span>
1574 </h5>
1575 <section>
1576 <h5>Response Example
1577 <span>(200 OK)</span>
1578 </h5>
1579 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
1580 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1581 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1582}
1583</code></pre>
1584 <!-- </div> -->
1585 </section>
1586 </div>
1587 </div>
1588 <div class="doc-row">
1589 <div class="doc-copy">
1590 <section class="swagger-request-security">
1591 <table class="table">
1592 <thead>
1593 <tr>
1594 <th class="swagger-request-security-schema"></th>
1595 <th class="swagger-request-security-scopes"></th>
1596 </tr>
1597 </thead>
1598 <tbody>
1599 <tr>
1600 <td>
1601 <a href="#security-definition-OAuth2">OAuth2</a>
1602 </td>
1603 <td> </td>
1604 </tr>
1605 </tbody>
1606 </table>
1607 </section>
1608 </div>
1609 </div>
1610 </div>
1611 <div id="operation--users-get" class="operation panel" data-traverse-target="operation--users-get">
1612 <!-- <section class="operation-tags row"> -->
1613 <!-- <div class="doc-copy"> -->
1614 <div class="operation-tags">
1615 <a class="label" href="#tag-User">User</a>
1616 <!---->
1617 </div>
1618 <!-- </div> -->
1619 <!-- </section> -->
1620 <h2 class="operation-title">
1621 <span class="operation-name">
1622 <span class="operation-name">GET</span>
1623 <span class="operation-path">/users</span>
1624 </span>
1625 </h2>
1626 <div class="doc-row">
1627 <div class="doc-copy">
1628 <section class="swagger-request-params">
1629 <div class="prop-row prop-group">
1630 <div class="prop-name">
1631 <div class="prop-title">start:
1632 <span class="prop-type">
1633 <span class="json-property-type">number</span>
1634 <span class="json-property-range" title="Value limits"></span>
1635 </span>
1636 </div>
1637 <div class="prop-subtitle"> in query </div>
1638 </div>
1639 <div class="prop-value">
1640 <p>Offset</p>
1641 </div>
1642 </div>
1643 <div class="prop-row prop-group">
1644 <div class="prop-name">
1645 <div class="prop-title">count:
1646 <span class="prop-type">
1647 <span class="json-property-type">number</span>
1648 <span class="json-property-range" title="Value limits"></span>
1649 </span>
1650 </div>
1651 <div class="prop-subtitle"> in query </div>
1652 </div>
1653 <div class="prop-value">
1654 <p>Number of items</p>
1655 </div>
1656 </div>
1657 <div class="prop-row prop-group">
1658 <div class="prop-name">
1659 <div class="prop-title">sort:
1660 <span class="prop-type">
1661 <span class="json-property-type">string</span>
1662 <span class="json-property-range" title="Value limits"></span>
1663 </span>
1664 </div>
1665 <div class="prop-subtitle"> in query </div>
1666 </div>
1667 <div class="prop-value">
1668 <p>Sort column (-createdAt for example)</p>
1669 </div>
1670 </div>
1671 </section>
1672 </div>
1673 <div class="doc-examples"></div>
1674 </div>
1675 <div class="doc-row">
1676 <div class="doc-copy">
1677 <section class="swagger-responses">
1678 <div class="prop-row prop-group">
1679 <div class="prop-name">
1680 <div class="prop-title">200 OK</div>
1681 <div class="prop-ref">
1682 <span class="json-schema-ref-array">
1683 <a class="json-schema-ref" href="#/definitions/User">User</a>
1684 </span>
1685 </div>
1686 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
1687 </div>
1688 <div class="prop-value">
1689 <p>successful operation</p>
1690 </div>
1691 </div>
1692 <div class="prop-row prop-inner">
1693 <div class="prop-name">type</div>
1694 <div class="prop-value">
1695 <span class="json-property-type">
1696 <span class="json-schema-ref-array">
1697 <a class="json-schema-ref" href="#/definitions/User">User</a>
1698 </span>
1699 </span>
1700 <span class="json-property-range" title="Value limits"></span>
1701 </div>
1702 </div>
1703 </section>
1704 </div>
1705 <div class="doc-examples">
1706 <h5>Response Content-Types:
1707 <span>application/json</span>
1708 </h5>
1709 <section>
1710 <h5>Response Example
1711 <span>(200 OK)</span>
1712 </h5>
1713 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
1714 {
1715 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1716 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1717 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1718 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1719 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1720 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1721 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1722 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1723 <span class="hljs-attr">&quot;account&quot;</span>: {
1724 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1725 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1726 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1727 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1728 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1729 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1730 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1731 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1732 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1733 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1734 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1735 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1736 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1737 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1738 }
1739 },
1740 <span class="hljs-attr">&quot;videoChannels&quot;</span>: [
1741 {
1742 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1743 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1744 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1745 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
1746 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1747 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1748 }
1749 }
1750 ]
1751 }
1752]
1753</code></pre>
1754 <!-- </div> -->
1755 </section>
1756 </div>
1757 </div>
1758 <div class="doc-row">
1759 <div class="doc-copy">
1760 <section class="swagger-request-security">
1761 <table class="table">
1762 <thead>
1763 <tr>
1764 <th class="swagger-request-security-schema"></th>
1765 <th class="swagger-request-security-scopes"></th>
1766 </tr>
1767 </thead>
1768 <tbody>
1769 <tr>
1770 <td>
1771 <a href="#security-definition-OAuth2">OAuth2</a>
1772 </td>
1773 <td> </td>
1774 </tr>
1775 </tbody>
1776 </table>
1777 </section>
1778 </div>
1779 </div>
1780 </div>
1781 <div id="operation--users--id--delete" class="operation panel" data-traverse-target="operation--users--id--delete">
1782 <!-- <section class="operation-tags row"> -->
1783 <!-- <div class="doc-copy"> -->
1784 <div class="operation-tags">
1785 <a class="label" href="#tag-User">User</a>
1786 <!---->
1787 </div>
1788 <!-- </div> -->
1789 <!-- </section> -->
1790 <h2 class="operation-title">
1791 <span class="operation-name">
1792 <span class="operation-name">DELETE</span>
1793 <span class="operation-path">/users/{id}</span>
1794 </span>
1795 </h2>
1796 <div class="doc-row">
1797 <div class="doc-copy">
1798 <section class="swagger-request-params">
1799 <div class="prop-row prop-group">
1800 <div class="prop-name">
1801 <div class="prop-title">id:
1802 <span class="prop-type">
1803 <span class="json-property-type">number</span>
1804 <span class="json-property-range" title="Value limits"></span>
1805 </span>
1806 </div>
1807 <span class="json-property-required"></span>
1808 <div class="prop-subtitle"> in path </div>
1809 </div>
1810 <div class="prop-value">
1811 <p>The user id</p>
1812 </div>
1813 </div>
1814 </section>
1815 </div>
1816 <div class="doc-examples"></div>
1817 </div>
1818 <div class="doc-row">
1819 <div class="doc-copy">
1820 <section class="swagger-responses">
1821 <div class="prop-row prop-group">
1822 <div class="prop-name">
1823 <div class="prop-title">204 No Content</div>
1824 </div>
1825 <div class="prop-value">
1826 <p>Successful operation</p>
1827 </div>
1828 </div>
1829 </section>
1830 </div>
1831 <div class="doc-examples">
1832 <h5>Response Content-Types:
1833 <span>application/json</span>
1834 </h5>
1835 </div>
1836 </div>
1837 <div class="doc-row">
1838 <div class="doc-copy">
1839 <section class="swagger-request-security">
1840 <table class="table">
1841 <thead>
1842 <tr>
1843 <th class="swagger-request-security-schema"></th>
1844 <th class="swagger-request-security-scopes"></th>
1845 </tr>
1846 </thead>
1847 <tbody>
1848 <tr>
1849 <td>
1850 <a href="#security-definition-OAuth2">OAuth2</a>
1851 </td>
1852 <td> </td>
1853 </tr>
1854 </tbody>
1855 </table>
1856 </section>
1857 </div>
1858 </div>
1859 </div>
1860 <div id="operation--users--id--get" class="operation panel" data-traverse-target="operation--users--id--get">
1861 <!-- <section class="operation-tags row"> -->
1862 <!-- <div class="doc-copy"> -->
1863 <div class="operation-tags">
1864 <a class="label" href="#tag-User">User</a>
1865 <!---->
1866 </div>
1867 <!-- </div> -->
1868 <!-- </section> -->
1869 <h2 class="operation-title">
1870 <span class="operation-name">
1871 <span class="operation-name">GET</span>
1872 <span class="operation-path">/users/{id}</span>
1873 </span>
1874 </h2>
1875 <div class="doc-row">
1876 <div class="doc-copy">
1877 <section class="swagger-request-params">
1878 <div class="prop-row prop-group">
1879 <div class="prop-name">
1880 <div class="prop-title">id:
1881 <span class="prop-type">
1882 <span class="json-property-type">number</span>
1883 <span class="json-property-range" title="Value limits"></span>
1884 </span>
1885 </div>
1886 <span class="json-property-required"></span>
1887 <div class="prop-subtitle"> in path </div>
1888 </div>
1889 <div class="prop-value">
1890 <p>The user id</p>
1891 </div>
1892 </div>
1893 </section>
1894 </div>
1895 <div class="doc-examples"></div>
1896 </div>
1897 <div class="doc-row">
1898 <div class="doc-copy">
1899 <section class="swagger-responses">
1900 <div class="prop-row prop-group">
1901 <div class="prop-name">
1902 <div class="prop-title">200 OK</div>
1903 <div class="prop-ref">
1904 <span class="">
1905 <a class="json-schema-ref" href="#/definitions/User">User</a>
1906 </span>
1907 </div>
1908 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
1909 </div>
1910 <div class="prop-value">
1911 <p>successful operation</p>
1912 </div>
1913 </div>
1914 </section>
1915 </div>
1916 <div class="doc-examples">
1917 <h5>Response Content-Types:
1918 <span>application/json</span>
1919 </h5>
1920 <section>
1921 <h5>Response Example
1922 <span>(200 OK)</span>
1923 </h5>
1924 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
1925 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1926 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1927 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1928 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1929 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1930 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1931 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1932 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1933 <span class="hljs-attr">&quot;account&quot;</span>: {
1934 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1935 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1936 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1937 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1938 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1939 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1940 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1941 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1942 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1943 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1944 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1945 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1946 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1947 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1948 }
1949 },
1950 <span class="hljs-attr">&quot;videoChannels&quot;</span>: [
1951 {
1952 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1953 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1954 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1955 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
1956 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1957 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1958 }
1959 }
1960 ]
1961}
1962</code></pre>
1963 <!-- </div> -->
1964 </section>
1965 </div>
1966 </div>
1967 <div class="doc-row">
1968 <div class="doc-copy">
1969 <section class="swagger-request-security">
1970 <table class="table">
1971 <thead>
1972 <tr>
1973 <th class="swagger-request-security-schema"></th>
1974 <th class="swagger-request-security-scopes"></th>
1975 </tr>
1976 </thead>
1977 <tbody>
1978 <tr>
1979 <td>
1980 <a href="#security-definition-OAuth2">OAuth2</a>
1981 </td>
1982 <td> </td>
1983 </tr>
1984 </tbody>
1985 </table>
1986 </section>
1987 </div>
1988 </div>
1989 </div>
1990 <div id="operation--users--id--put" class="operation panel" data-traverse-target="operation--users--id--put">
1991 <!-- <section class="operation-tags row"> -->
1992 <!-- <div class="doc-copy"> -->
1993 <div class="operation-tags">
1994 <a class="label" href="#tag-User">User</a>
1995 <!---->
1996 </div>
1997 <!-- </div> -->
1998 <!-- </section> -->
1999 <h2 class="operation-title">
2000 <span class="operation-name">
2001 <span class="operation-name">PUT</span>
2002 <span class="operation-path">/users/{id}</span>
2003 </span>
2004 </h2>
2005 <div class="doc-row">
2006 <div class="doc-copy">
2007 <section class="swagger-request-body">
2008 <div class="prop-row">
2009 <div class="prop-name">
2010 <div class="swagger-request-model">
2011 <span class="">
2012 <a class="json-schema-ref" href="#/definitions/UpdateUser">UpdateUser</a>
2013 </span>
2014 </div>
2015 </div>
2016 <div class="prop-value columns small-6">
2017 <!-- <div class="swagger-request-description"> -->
2018 <p>undefined</p>
2019 <!-- </div> -->
2020 </div>
2021 </div>
2022 </section>
2023 <section class="swagger-request-params">
2024 <div class="prop-row prop-group">
2025 <div class="prop-name">
2026 <div class="prop-title">id:
2027 <span class="prop-type">
2028 <span class="json-property-type">number</span>
2029 <span class="json-property-range" title="Value limits"></span>
2030 </span>
2031 </div>
2032 <span class="json-property-required"></span>
2033 <div class="prop-subtitle"> in path </div>
2034 </div>
2035 <div class="prop-value">
2036 <p>The user id</p>
2037 </div>
2038 </div>
2039 </section>
2040 </div>
2041 <div class="doc-examples">
2042 <section>
2043 <h5>Request Content-Types:
2044 <span>application/json</span>
2045 </h5>
2046 <h5>Request Example</h5>
2047 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
2048 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2049 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2050 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2051 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2052}
2053</code></pre>
2054 <!-- </div> -->
2055 </section>
2056 </div>
2057 </div>
2058 <div class="doc-row">
2059 <div class="doc-copy">
2060 <section class="swagger-responses">
2061 <div class="prop-row prop-group">
2062 <div class="prop-name">
2063 <div class="prop-title">204 No Content</div>
2064 </div>
2065 <div class="prop-value">
2066 <p>Successful operation</p>
2067 </div>
2068 </div>
2069 </section>
2070 </div>
2071 <div class="doc-examples">
2072 <h5>Response Content-Types:
2073 <span>application/json</span>
2074 </h5>
2075 </div>
2076 </div>
2077 <div class="doc-row">
2078 <div class="doc-copy">
2079 <section class="swagger-request-security">
2080 <table class="table">
2081 <thead>
2082 <tr>
2083 <th class="swagger-request-security-schema"></th>
2084 <th class="swagger-request-security-scopes"></th>
2085 </tr>
2086 </thead>
2087 <tbody>
2088 <tr>
2089 <td>
2090 <a href="#security-definition-OAuth2">OAuth2</a>
2091 </td>
2092 <td> </td>
2093 </tr>
2094 </tbody>
2095 </table>
2096 </section>
2097 </div>
2098 </div>
2099 </div>
2100 <div id="operation--users-me-get" class="operation panel" data-traverse-target="operation--users-me-get">
2101 <!-- <section class="operation-tags row"> -->
2102 <!-- <div class="doc-copy"> -->
2103 <div class="operation-tags">
2104 <a class="label" href="#tag-User">User</a>
2105 <!---->
2106 </div>
2107 <!-- </div> -->
2108 <!-- </section> -->
2109 <h2 class="operation-title">
2110 <span class="operation-name">
2111 <span class="operation-name">GET</span>
2112 <span class="operation-path">/users/me</span>
2113 </span>
2114 </h2>
2115 <div class="doc-row">
2116 <div class="doc-copy"> </div>
2117 <div class="doc-examples"></div>
2118 </div>
2119 <div class="doc-row">
2120 <div class="doc-copy">
2121 <section class="swagger-responses">
2122 <div class="prop-row prop-group">
2123 <div class="prop-name">
2124 <div class="prop-title">200 OK</div>
2125 <div class="prop-ref">
2126 <span class="json-schema-ref-array">
2127 <a class="json-schema-ref" href="#/definitions/User">User</a>
2128 </span>
2129 </div>
2130 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2131 </div>
2132 <div class="prop-value">
2133 <p>successful operation</p>
2134 </div>
2135 </div>
2136 <div class="prop-row prop-inner">
2137 <div class="prop-name">type</div>
2138 <div class="prop-value">
2139 <span class="json-property-type">
2140 <span class="json-schema-ref-array">
2141 <a class="json-schema-ref" href="#/definitions/User">User</a>
2142 </span>
2143 </span>
2144 <span class="json-property-range" title="Value limits"></span>
2145 </div>
2146 </div>
2147 </section>
2148 </div>
2149 <div class="doc-examples">
2150 <h5>Response Content-Types:
2151 <span>application/json</span>
2152 </h5>
2153 <section>
2154 <h5>Response Example
2155 <span>(200 OK)</span>
2156 </h5>
2157 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
2158 {
2159 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2160 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2161 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2162 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2163 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2164 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2165 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2166 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2167 <span class="hljs-attr">&quot;account&quot;</span>: {
2168 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2169 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2170 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2171 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2172 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2173 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2174 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2175 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2176 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2177 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2178 <span class="hljs-attr">&quot;avatar&quot;</span>: {
2179 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2180 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2181 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2182 }
2183 },
2184 <span class="hljs-attr">&quot;videoChannels&quot;</span>: [
2185 {
2186 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2187 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2188 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2189 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
2190 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2191 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2192 }
2193 }
2194 ]
2195 }
2196]
2197</code></pre>
2198 <!-- </div> -->
2199 </section>
2200 </div>
2201 </div>
2202 <div class="doc-row">
2203 <div class="doc-copy">
2204 <section class="swagger-request-security">
2205 <table class="table">
2206 <thead>
2207 <tr>
2208 <th class="swagger-request-security-schema"></th>
2209 <th class="swagger-request-security-scopes"></th>
2210 </tr>
2211 </thead>
2212 <tbody>
2213 <tr>
2214 <td>
2215 <a href="#security-definition-OAuth2">OAuth2</a>
2216 </td>
2217 <td> </td>
2218 </tr>
2219 </tbody>
2220 </table>
2221 </section>
2222 </div>
2223 </div>
2224 </div>
2225 <div id="operation--users-me-put" class="operation panel" data-traverse-target="operation--users-me-put">
2226 <!-- <section class="operation-tags row"> -->
2227 <!-- <div class="doc-copy"> -->
2228 <div class="operation-tags">
2229 <a class="label" href="#tag-User">User</a>
2230 <!---->
2231 </div>
2232 <!-- </div> -->
2233 <!-- </section> -->
2234 <h2 class="operation-title">
2235 <span class="operation-name">
2236 <span class="operation-name">PUT</span>
2237 <span class="operation-path">/users/me</span>
2238 </span>
2239 </h2>
2240 <div class="doc-row">
2241 <div class="doc-copy">
2242 <section class="swagger-request-body">
2243 <div class="prop-row">
2244 <div class="prop-name">
2245 <div class="swagger-request-model">
2246 <span class="">
2247 <a class="json-schema-ref" href="#/definitions/UpdateMe">UpdateMe</a>
2248 </span>
2249 </div>
2250 </div>
2251 <div class="prop-value columns small-6">
2252 <!-- <div class="swagger-request-description"> -->
2253 <p>undefined</p>
2254 <!-- </div> -->
2255 </div>
2256 </div>
2257 </section>
2258 </div>
2259 <div class="doc-examples">
2260 <section>
2261 <h5>Request Content-Types:
2262 <span>application/json</span>
2263 </h5>
2264 <h5>Request Example</h5>
2265 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
2266 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2267 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2268 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2269 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2270}
2271</code></pre>
2272 <!-- </div> -->
2273 </section>
2274 </div>
2275 </div>
2276 <div class="doc-row">
2277 <div class="doc-copy">
2278 <section class="swagger-responses">
2279 <div class="prop-row prop-group">
2280 <div class="prop-name">
2281 <div class="prop-title">204 No Content</div>
2282 </div>
2283 <div class="prop-value">
2284 <p>Successful operation</p>
2285 </div>
2286 </div>
2287 </section>
2288 </div>
2289 <div class="doc-examples">
2290 <h5>Response Content-Types:
2291 <span>application/json</span>
2292 </h5>
2293 </div>
2294 </div>
2295 <div class="doc-row">
2296 <div class="doc-copy">
2297 <section class="swagger-request-security">
2298 <table class="table">
2299 <thead>
2300 <tr>
2301 <th class="swagger-request-security-schema"></th>
2302 <th class="swagger-request-security-scopes"></th>
2303 </tr>
2304 </thead>
2305 <tbody>
2306 <tr>
2307 <td>
2308 <a href="#security-definition-OAuth2">OAuth2</a>
2309 </td>
2310 <td> </td>
2311 </tr>
2312 </tbody>
2313 </table>
2314 </section>
2315 </div>
2316 </div>
2317 </div>
2318 <div id="operation--users-me-video-quota-used-get" class="operation panel" data-traverse-target="operation--users-me-video-quota-used-get">
2319 <!-- <section class="operation-tags row"> -->
2320 <!-- <div class="doc-copy"> -->
2321 <div class="operation-tags">
2322 <a class="label" href="#tag-User">User</a>
2323 <!---->
2324 </div>
2325 <!-- </div> -->
2326 <!-- </section> -->
2327 <h2 class="operation-title">
2328 <span class="operation-name">
2329 <span class="operation-name">GET</span>
2330 <span class="operation-path">/users/me/video-quota-used</span>
2331 </span>
2332 </h2>
2333 <div class="doc-row">
2334 <div class="doc-copy"> </div>
2335 <div class="doc-examples"></div>
2336 </div>
2337 <div class="doc-row">
2338 <div class="doc-copy">
2339 <section class="swagger-responses">
2340 <div class="prop-row prop-group">
2341 <div class="prop-name">
2342 <div class="prop-title">200 OK</div>
2343 <div class="prop-ref"> </div>
2344 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2345 </div>
2346 <div class="prop-value">
2347 <p>successful operation</p>
2348 </div>
2349 </div>
2350 <div class="prop-row prop-inner">
2351 <div class="prop-name">type</div>
2352 <div class="prop-value">
2353 <span class="json-property-type">number</span>
2354 <span class="json-property-range" title="Value limits"></span>
2355 </div>
2356 </div>
2357 </section>
2358 </div>
2359 <div class="doc-examples">
2360 <h5>Response Content-Types:
2361 <span>application/json</span>
2362 </h5>
2363 <section>
2364 <h5>Response Example
2365 <span>(200 OK)</span>
2366 </h5>
2367 <!-- <div class="hljs"> --><pre><code class="hljs lang-json"><span class="hljs-string">&quot;number&quot;</span>
2368</code></pre>
2369 <!-- </div> -->
2370 </section>
2371 </div>
2372 </div>
2373 <div class="doc-row">
2374 <div class="doc-copy">
2375 <section class="swagger-request-security">
2376 <table class="table">
2377 <thead>
2378 <tr>
2379 <th class="swagger-request-security-schema"></th>
2380 <th class="swagger-request-security-scopes"></th>
2381 </tr>
2382 </thead>
2383 <tbody>
2384 <tr>
2385 <td>
2386 <a href="#security-definition-OAuth2">OAuth2</a>
2387 </td>
2388 <td> </td>
2389 </tr>
2390 </tbody>
2391 </table>
2392 </section>
2393 </div>
2394 </div>
2395 </div>
2396 <div id="operation--users-me-videos--videoId--rating-get" class="operation panel" data-traverse-target="operation--users-me-videos--videoId--rating-get">
2397 <!-- <section class="operation-tags row"> -->
2398 <!-- <div class="doc-copy"> -->
2399 <div class="operation-tags">
2400 <a class="label" href="#tag-User">User</a>
2401 <!---->
2402 </div>
2403 <!-- </div> -->
2404 <!-- </section> -->
2405 <h2 class="operation-title">
2406 <span class="operation-name">
2407 <span class="operation-name">GET</span>
2408 <span class="operation-path">/users/me/videos/{videoId}/rating</span>
2409 </span>
2410 </h2>
2411 <div class="doc-row">
2412 <div class="doc-copy">
2413 <section class="swagger-request-params">
2414 <div class="prop-row prop-group">
2415 <div class="prop-name">
2416 <div class="prop-title">videoId:
2417 <span class="prop-type">
2418 <span class="json-property-type">string</span>
2419 <span class="json-property-range" title="Value limits"></span>
2420 </span>
2421 </div>
2422 <span class="json-property-required"></span>
2423 <div class="prop-subtitle"> in path </div>
2424 </div>
2425 <div class="prop-value">
2426 <p>The video id </p>
2427 </div>
2428 </div>
2429 </section>
2430 </div>
2431 <div class="doc-examples"></div>
2432 </div>
2433 <div class="doc-row">
2434 <div class="doc-copy">
2435 <section class="swagger-responses">
2436 <div class="prop-row prop-group">
2437 <div class="prop-name">
2438 <div class="prop-title">200 OK</div>
2439 <div class="prop-ref">
2440 <span class="">
2441 <a class="json-schema-ref" href="#/definitions/GetMeVideoRating">GetMeVideoRating</a>
2442 </span>
2443 </div>
2444 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2445 </div>
2446 <div class="prop-value">
2447 <p>successful operation</p>
2448 </div>
2449 </div>
2450 </section>
2451 </div>
2452 <div class="doc-examples">
2453 <h5>Response Content-Types:
2454 <span>application/json</span>
2455 </h5>
2456 <section>
2457 <h5>Response Example
2458 <span>(200 OK)</span>
2459 </h5>
2460 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
2461 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2462 <span class="hljs-attr">&quot;rating&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>
2463}
2464</code></pre>
2465 <!-- </div> -->
2466 </section>
2467 </div>
2468 </div>
2469 <div class="doc-row">
2470 <div class="doc-copy">
2471 <section class="swagger-request-security">
2472 <table class="table">
2473 <thead>
2474 <tr>
2475 <th class="swagger-request-security-schema"></th>
2476 <th class="swagger-request-security-scopes"></th>
2477 </tr>
2478 </thead>
2479 <tbody>
2480 <tr>
2481 <td>
2482 <a href="#security-definition-OAuth2">OAuth2</a>
2483 </td>
2484 <td> </td>
2485 </tr>
2486 </tbody>
2487 </table>
2488 </section>
2489 </div>
2490 </div>
2491 </div>
2492 <div id="operation--users-me-videos-get" class="operation panel" data-traverse-target="operation--users-me-videos-get">
2493 <!-- <section class="operation-tags row"> -->
2494 <!-- <div class="doc-copy"> -->
2495 <div class="operation-tags">
2496 <a class="label" href="#tag-User">User</a>
2497 <!---->
2498 </div>
2499 <!-- </div> -->
2500 <!-- </section> -->
2501 <h2 class="operation-title">
2502 <span class="operation-name">
2503 <span class="operation-name">GET</span>
2504 <span class="operation-path">/users/me/videos</span>
2505 </span>
2506 </h2>
2507 <div class="doc-row">
2508 <div class="doc-copy">
2509 <section class="swagger-request-params">
2510 <div class="prop-row prop-group">
2511 <div class="prop-name">
2512 <div class="prop-title">start:
2513 <span class="prop-type">
2514 <span class="json-property-type">number</span>
2515 <span class="json-property-range" title="Value limits"></span>
2516 </span>
2517 </div>
2518 <div class="prop-subtitle"> in query </div>
2519 </div>
2520 <div class="prop-value">
2521 <p>Offset</p>
2522 </div>
2523 </div>
2524 <div class="prop-row prop-group">
2525 <div class="prop-name">
2526 <div class="prop-title">count:
2527 <span class="prop-type">
2528 <span class="json-property-type">number</span>
2529 <span class="json-property-range" title="Value limits"></span>
2530 </span>
2531 </div>
2532 <div class="prop-subtitle"> in query </div>
2533 </div>
2534 <div class="prop-value">
2535 <p>Number of items</p>
2536 </div>
2537 </div>
2538 <div class="prop-row prop-group">
2539 <div class="prop-name">
2540 <div class="prop-title">sort:
2541 <span class="prop-type">
2542 <span class="json-property-type">string</span>
2543 <span class="json-property-range" title="Value limits"></span>
2544 </span>
2545 </div>
2546 <div class="prop-subtitle"> in query </div>
2547 </div>
2548 <div class="prop-value">
2549 <p>Sort column (-createdAt for example)</p>
2550 </div>
2551 </div>
2552 </section>
2553 </div>
2554 <div class="doc-examples"></div>
2555 </div>
2556 <div class="doc-row">
2557 <div class="doc-copy">
2558 <section class="swagger-responses">
2559 <div class="prop-row prop-group">
2560 <div class="prop-name">
2561 <div class="prop-title">200 OK</div>
2562 <div class="prop-ref">
2563 <span class="json-schema-ref-array">
2564 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
2565 </span>
2566 </div>
2567 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2568 </div>
2569 <div class="prop-value">
2570 <p>successful operation</p>
2571 </div>
2572 </div>
2573 <div class="prop-row prop-inner">
2574 <div class="prop-name">type</div>
2575 <div class="prop-value">
2576 <span class="json-property-type">
2577 <span class="json-schema-ref-array">
2578 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
2579 </span>
2580 </span>
2581 <span class="json-property-range" title="Value limits"></span>
2582 </div>
2583 </div>
2584 </section>
2585 </div>
2586 <div class="doc-examples">
2587 <h5>Response Content-Types:
2588 <span>application/json</span>
2589 </h5>
2590 <section>
2591 <h5>Response Example
2592 <span>(200 OK)</span>
2593 </h5>
2594 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
2595 {
2596 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2597 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2598 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2599 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2600 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2601 <span class="hljs-attr">&quot;category&quot;</span>: {
2602 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2603 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2604 },
2605 <span class="hljs-attr">&quot;licence&quot;</span>: {
2606 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2607 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2608 },
2609 <span class="hljs-attr">&quot;language&quot;</span>: {
2610 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2611 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2612 },
2613 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2614 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2615 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2616 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2617 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2618 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2619 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2620 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2621 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2622 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2623 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2624 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2625 <span class="hljs-attr">&quot;account&quot;</span>: {
2626 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2627 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2628 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2629 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2630 <span class="hljs-attr">&quot;avatar&quot;</span>: {
2631 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2632 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2633 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2634 }
2635 }
2636 }
2637]
2638</code></pre>
2639 <!-- </div> -->
2640 </section>
2641 </div>
2642 </div>
2643 <div class="doc-row">
2644 <div class="doc-copy">
2645 <section class="swagger-request-security">
2646 <table class="table">
2647 <thead>
2648 <tr>
2649 <th class="swagger-request-security-schema"></th>
2650 <th class="swagger-request-security-scopes"></th>
2651 </tr>
2652 </thead>
2653 <tbody>
2654 <tr>
2655 <td>
2656 <a href="#security-definition-OAuth2">OAuth2</a>
2657 </td>
2658 <td> </td>
2659 </tr>
2660 </tbody>
2661 </table>
2662 </section>
2663 </div>
2664 </div>
2665 </div>
2666 <div id="operation--users-register-post" class="operation panel" data-traverse-target="operation--users-register-post">
2667 <!-- <section class="operation-tags row"> -->
2668 <!-- <div class="doc-copy"> -->
2669 <div class="operation-tags">
2670 <a class="label" href="#tag-User">User</a>
2671 <!---->
2672 </div>
2673 <!-- </div> -->
2674 <!-- </section> -->
2675 <h2 class="operation-title">
2676 <span class="operation-name">
2677 <span class="operation-name">POST</span>
2678 <span class="operation-path">/users/register</span>
2679 </span>
2680 </h2>
2681 <div class="doc-row">
2682 <div class="doc-copy">
2683 <section class="swagger-request-body">
2684 <div class="prop-row">
2685 <div class="prop-name">
2686 <div class="swagger-request-model">
2687 <span class="">
2688 <a class="json-schema-ref" href="#/definitions/RegisterUser">RegisterUser</a>
2689 </span>
2690 </div>
2691 </div>
2692 <div class="prop-value columns small-6">
2693 <!-- <div class="swagger-request-description"> -->
2694 <p>undefined</p>
2695 <!-- </div> -->
2696 </div>
2697 </div>
2698 </section>
2699 </div>
2700 <div class="doc-examples">
2701 <section>
2702 <h5>Request Content-Types:
2703 <span>application/json</span>
2704 </h5>
2705 <h5>Request Example</h5>
2706 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
2707 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2708 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2709 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2710}
2711</code></pre>
2712 <!-- </div> -->
2713 </section>
2714 </div>
2715 </div>
2716 <div class="doc-row">
2717 <div class="doc-copy">
2718 <section class="swagger-responses">
2719 <div class="prop-row prop-group">
2720 <div class="prop-name">
2721 <div class="prop-title">204 No Content</div>
2722 </div>
2723 <div class="prop-value">
2724 <p>Successful operation</p>
2725 </div>
2726 </div>
2727 </section>
2728 </div>
2729 <div class="doc-examples">
2730 <h5>Response Content-Types:
2731 <span>application/json</span>
2732 </h5>
2733 </div>
2734 </div>
2735 </div>
2736 <div id="operation--users-me-avatar-pick-post" class="operation panel" data-traverse-target="operation--users-me-avatar-pick-post">
2737 <!-- <section class="operation-tags row"> -->
2738 <!-- <div class="doc-copy"> -->
2739 <div class="operation-tags">
2740 <a class="label" href="#tag-User">User</a>
2741 <!---->
2742 </div>
2743 <!-- </div> -->
2744 <!-- </section> -->
2745 <h2 class="operation-title">
2746 <span class="operation-name">
2747 <span class="operation-name">POST</span>
2748 <span class="operation-path">/users/me/avatar/pick</span>
2749 </span>
2750 </h2>
2751 <div class="doc-row">
2752 <div class="doc-copy">
2753 <section class="swagger-request-params">
2754 <div class="prop-row prop-group">
2755 <div class="prop-name">
2756 <div class="prop-title">avatarfile:
2757 <span class="prop-type">
2758 <span class="json-property-type">file</span>
2759 <span class="json-property-range" title="Value limits"></span>
2760 </span>
2761 </div>
2762 <div class="prop-subtitle"> in formData </div>
2763 </div>
2764 <div class="prop-value">
2765 <p>The file to upload.</p>
2766 </div>
2767 </div>
2768 </section>
2769 </div>
2770 <div class="doc-examples"></div>
2771 </div>
2772 <div class="doc-row">
2773 <div class="doc-copy">
2774 <section class="swagger-responses">
2775 <div class="prop-row prop-group">
2776 <div class="prop-name">
2777 <div class="prop-title">200 OK</div>
2778 <div class="prop-ref">
2779 <span class="">
2780 <a class="json-schema-ref" href="#/definitions/Avatar">Avatar</a>
2781 </span>
2782 </div>
2783 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2784 </div>
2785 <div class="prop-value">
2786 <p>successful operation</p>
2787 </div>
2788 </div>
2789 </section>
2790 </div>
2791 <div class="doc-examples">
2792 <h5>Response Content-Types:
2793 <span>application/json</span>
2794 </h5>
2795 <section>
2796 <h5>Response Example
2797 <span>(200 OK)</span>
2798 </h5>
2799 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
2800 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2801 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2802 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2803}
2804</code></pre>
2805 <!-- </div> -->
2806 </section>
2807 </div>
2808 </div>
2809 <div class="doc-row">
2810 <div class="doc-copy">
2811 <section class="swagger-request-security">
2812 <table class="table">
2813 <thead>
2814 <tr>
2815 <th class="swagger-request-security-schema"></th>
2816 <th class="swagger-request-security-scopes"></th>
2817 </tr>
2818 </thead>
2819 <tbody>
2820 <tr>
2821 <td>
2822 <a href="#security-definition-OAuth2">OAuth2</a>
2823 </td>
2824 <td> </td>
2825 </tr>
2826 </tbody>
2827 </table>
2828 </section>
2829 </div>
2830 </div>
2831 </div>
2832 <h1 id="tag-Video" class="swagger-summary-tag" data-traverse-target="tag-Video">Video</h1>
2833 <div id="operation--videos-get" class="operation panel" data-traverse-target="operation--videos-get">
2834 <!-- <section class="operation-tags row"> -->
2835 <!-- <div class="doc-copy"> -->
2836 <div class="operation-tags">
2837 <a class="label" href="#tag-Video">Video</a>
2838 <!---->
2839 </div>
2840 <!-- </div> -->
2841 <!-- </section> -->
2842 <h2 class="operation-title">
2843 <span class="operation-name">
2844 <span class="operation-name">GET</span>
2845 <span class="operation-path">/videos</span>
2846 </span>
2847 </h2>
2848 <div class="doc-row">
2849 <div class="doc-copy">
2850 <section class="swagger-request-params">
2851 <div class="prop-row prop-group">
2852 <div class="prop-name">
2853 <div class="prop-title">category:
2854 <span class="prop-type">
2855 <span class="json-property-type">number</span>
2856 <span class="json-property-range" title="Value limits"></span>
2857 </span>
2858 </div>
2859 <div class="prop-subtitle"> in query </div>
2860 </div>
2861 <div class="prop-value">
2862 <p>category id of the video</p>
2863 </div>
2864 </div>
2865 <div class="prop-row prop-group">
2866 <div class="prop-name">
2867 <div class="prop-title">start:
2868 <span class="prop-type">
2869 <span class="json-property-type">number</span>
2870 <span class="json-property-range" title="Value limits"></span>
2871 </span>
2872 </div>
2873 <div class="prop-subtitle"> in query </div>
2874 </div>
2875 <div class="prop-value">
2876 <p>Offset</p>
2877 </div>
2878 </div>
2879 <div class="prop-row prop-group">
2880 <div class="prop-name">
2881 <div class="prop-title">count:
2882 <span class="prop-type">
2883 <span class="json-property-type">number</span>
2884 <span class="json-property-range" title="Value limits"></span>
2885 </span>
2886 </div>
2887 <div class="prop-subtitle"> in query </div>
2888 </div>
2889 <div class="prop-value">
2890 <p>Number of items</p>
2891 </div>
2892 </div>
2893 <div class="prop-row prop-group">
2894 <div class="prop-name">
2895 <div class="prop-title">sort:
2896 <span class="prop-type">
2897 <span class="json-property-type">string</span>
2898 <span class="json-property-range" title="Value limits"></span>
2899 </span>
2900 </div>
2901 <div class="prop-subtitle"> in query </div>
2902 </div>
2903 <div class="prop-value">
2904 <p>Sort column (-createdAt for example)</p>
2905 </div>
2906 </div>
2907 </section>
2908 </div>
2909 <div class="doc-examples"></div>
2910 </div>
2911 <div class="doc-row">
2912 <div class="doc-copy">
2913 <section class="swagger-responses">
2914 <div class="prop-row prop-group">
2915 <div class="prop-name">
2916 <div class="prop-title">200 OK</div>
2917 <div class="prop-ref">
2918 <span class="json-schema-ref-array">
2919 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
2920 </span>
2921 </div>
2922 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
2923 </div>
2924 <div class="prop-value">
2925 <p>successful operation</p>
2926 </div>
2927 </div>
2928 <div class="prop-row prop-inner">
2929 <div class="prop-name">type</div>
2930 <div class="prop-value">
2931 <span class="json-property-type">
2932 <span class="json-schema-ref-array">
2933 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
2934 </span>
2935 </span>
2936 <span class="json-property-range" title="Value limits"></span>
2937 </div>
2938 </div>
2939 </section>
2940 </div>
2941 <div class="doc-examples">
2942 <h5>Response Content-Types:
2943 <span>application/json</span>
2944 </h5>
2945 <section>
2946 <h5>Response Example
2947 <span>(200 OK)</span>
2948 </h5>
2949 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
2950 {
2951 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2952 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2953 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2954 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2955 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2956 <span class="hljs-attr">&quot;category&quot;</span>: {
2957 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2958 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2959 },
2960 <span class="hljs-attr">&quot;licence&quot;</span>: {
2961 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2962 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2963 },
2964 <span class="hljs-attr">&quot;language&quot;</span>: {
2965 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2966 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2967 },
2968 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2969 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2970 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2971 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2972 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2973 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2974 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2975 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2976 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2977 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2978 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2979 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2980 <span class="hljs-attr">&quot;account&quot;</span>: {
2981 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2982 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2983 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2984 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2985 <span class="hljs-attr">&quot;avatar&quot;</span>: {
2986 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2987 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2988 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2989 }
2990 }
2991 }
2992]
2993</code></pre>
2994 <!-- </div> -->
2995 </section>
2996 </div>
2997 </div>
2998 </div>
2999 <div id="operation--videos-categories-get" class="operation panel" data-traverse-target="operation--videos-categories-get">
3000 <!-- <section class="operation-tags row"> -->
3001 <!-- <div class="doc-copy"> -->
3002 <div class="operation-tags">
3003 <a class="label" href="#tag-Video">Video</a>
3004 <!---->
3005 </div>
3006 <!-- </div> -->
3007 <!-- </section> -->
3008 <h2 class="operation-title">
3009 <span class="operation-name">
3010 <span class="operation-name">GET</span>
3011 <span class="operation-path">/videos/categories</span>
3012 </span>
3013 </h2>
3014 <div class="doc-row">
3015 <div class="doc-copy"> </div>
3016 <div class="doc-examples"></div>
3017 </div>
3018 <div class="doc-row">
3019 <div class="doc-copy">
3020 <section class="swagger-responses">
3021 <div class="prop-row prop-group">
3022 <div class="prop-name">
3023 <div class="prop-title">200 OK</div>
3024 <div class="prop-ref"> </div>
3025 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3026 </div>
3027 <div class="prop-value">
3028 <p>successful operation</p>
3029 </div>
3030 </div>
3031 <div class="prop-row prop-inner">
3032 <div class="prop-name">type</div>
3033 <div class="prop-value">
3034 <span class="json-property-type">string[]</span>
3035 <span class="json-property-range" title="Value limits"></span>
3036 </div>
3037 </div>
3038 </section>
3039 </div>
3040 <div class="doc-examples">
3041 <h5>Response Content-Types:
3042 <span>application/json</span>
3043 </h5>
3044 <section>
3045 <h5>Response Example
3046 <span>(200 OK)</span>
3047 </h5>
3048 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
3049 <span class="hljs-string">&quot;string&quot;</span>
3050]
3051</code></pre>
3052 <!-- </div> -->
3053 </section>
3054 </div>
3055 </div>
3056 </div>
3057 <div id="operation--videos-licences-get" class="operation panel" data-traverse-target="operation--videos-licences-get">
3058 <!-- <section class="operation-tags row"> -->
3059 <!-- <div class="doc-copy"> -->
3060 <div class="operation-tags">
3061 <a class="label" href="#tag-Video">Video</a>
3062 <!---->
3063 </div>
3064 <!-- </div> -->
3065 <!-- </section> -->
3066 <h2 class="operation-title">
3067 <span class="operation-name">
3068 <span class="operation-name">GET</span>
3069 <span class="operation-path">/videos/licences</span>
3070 </span>
3071 </h2>
3072 <div class="doc-row">
3073 <div class="doc-copy"> </div>
3074 <div class="doc-examples"></div>
3075 </div>
3076 <div class="doc-row">
3077 <div class="doc-copy">
3078 <section class="swagger-responses">
3079 <div class="prop-row prop-group">
3080 <div class="prop-name">
3081 <div class="prop-title">200 OK</div>
3082 <div class="prop-ref"> </div>
3083 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3084 </div>
3085 <div class="prop-value">
3086 <p>successful operation</p>
3087 </div>
3088 </div>
3089 <div class="prop-row prop-inner">
3090 <div class="prop-name">type</div>
3091 <div class="prop-value">
3092 <span class="json-property-type">string[]</span>
3093 <span class="json-property-range" title="Value limits"></span>
3094 </div>
3095 </div>
3096 </section>
3097 </div>
3098 <div class="doc-examples">
3099 <h5>Response Content-Types:
3100 <span>application/json</span>
3101 </h5>
3102 <section>
3103 <h5>Response Example
3104 <span>(200 OK)</span>
3105 </h5>
3106 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
3107 <span class="hljs-string">&quot;string&quot;</span>
3108]
3109</code></pre>
3110 <!-- </div> -->
3111 </section>
3112 </div>
3113 </div>
3114 </div>
3115 <div id="operation--videos-languages-get" class="operation panel" data-traverse-target="operation--videos-languages-get">
3116 <!-- <section class="operation-tags row"> -->
3117 <!-- <div class="doc-copy"> -->
3118 <div class="operation-tags">
3119 <a class="label" href="#tag-Video">Video</a>
3120 <!---->
3121 </div>
3122 <!-- </div> -->
3123 <!-- </section> -->
3124 <h2 class="operation-title">
3125 <span class="operation-name">
3126 <span class="operation-name">GET</span>
3127 <span class="operation-path">/videos/languages</span>
3128 </span>
3129 </h2>
3130 <div class="doc-row">
3131 <div class="doc-copy"> </div>
3132 <div class="doc-examples"></div>
3133 </div>
3134 <div class="doc-row">
3135 <div class="doc-copy">
3136 <section class="swagger-responses">
3137 <div class="prop-row prop-group">
3138 <div class="prop-name">
3139 <div class="prop-title">200 OK</div>
3140 <div class="prop-ref"> </div>
3141 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3142 </div>
3143 <div class="prop-value">
3144 <p>successful operation</p>
3145 </div>
3146 </div>
3147 <div class="prop-row prop-inner">
3148 <div class="prop-name">type</div>
3149 <div class="prop-value">
3150 <span class="json-property-type">string[]</span>
3151 <span class="json-property-range" title="Value limits"></span>
3152 </div>
3153 </div>
3154 </section>
3155 </div>
3156 <div class="doc-examples">
3157 <h5>Response Content-Types:
3158 <span>application/json</span>
3159 </h5>
3160 <section>
3161 <h5>Response Example
3162 <span>(200 OK)</span>
3163 </h5>
3164 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
3165 <span class="hljs-string">&quot;string&quot;</span>
3166]
3167</code></pre>
3168 <!-- </div> -->
3169 </section>
3170 </div>
3171 </div>
3172 </div>
3173 <div id="operation--videos-privacies-get" class="operation panel" data-traverse-target="operation--videos-privacies-get">
3174 <!-- <section class="operation-tags row"> -->
3175 <!-- <div class="doc-copy"> -->
3176 <div class="operation-tags">
3177 <a class="label" href="#tag-Video">Video</a>
3178 <!---->
3179 </div>
3180 <!-- </div> -->
3181 <!-- </section> -->
3182 <h2 class="operation-title">
3183 <span class="operation-name">
3184 <span class="operation-name">GET</span>
3185 <span class="operation-path">/videos/privacies</span>
3186 </span>
3187 </h2>
3188 <div class="doc-row">
3189 <div class="doc-copy"> </div>
3190 <div class="doc-examples"></div>
3191 </div>
3192 <div class="doc-row">
3193 <div class="doc-copy">
3194 <section class="swagger-responses">
3195 <div class="prop-row prop-group">
3196 <div class="prop-name">
3197 <div class="prop-title">200 OK</div>
3198 <div class="prop-ref"> </div>
3199 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3200 </div>
3201 <div class="prop-value">
3202 <p>successful operation</p>
3203 </div>
3204 </div>
3205 <div class="prop-row prop-inner">
3206 <div class="prop-name">type</div>
3207 <div class="prop-value">
3208 <span class="json-property-type">string[]</span>
3209 <span class="json-property-range" title="Value limits"></span>
3210 </div>
3211 </div>
3212 </section>
3213 </div>
3214 <div class="doc-examples">
3215 <h5>Response Content-Types:
3216 <span>application/json</span>
3217 </h5>
3218 <section>
3219 <h5>Response Example
3220 <span>(200 OK)</span>
3221 </h5>
3222 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
3223 <span class="hljs-string">&quot;string&quot;</span>
3224]
3225</code></pre>
3226 <!-- </div> -->
3227 </section>
3228 </div>
3229 </div>
3230 </div>
3231 <div id="operation--videos--id--put" class="operation panel" data-traverse-target="operation--videos--id--put">
3232 <!-- <section class="operation-tags row"> -->
3233 <!-- <div class="doc-copy"> -->
3234 <div class="operation-tags">
3235 <a class="label" href="#tag-Video">Video</a>
3236 <!---->
3237 </div>
3238 <!-- </div> -->
3239 <!-- </section> -->
3240 <h2 class="operation-title">
3241 <span class="operation-name">
3242 <span class="operation-name">PUT</span>
3243 <span class="operation-path">/videos/{id}</span>
3244 </span>
3245 </h2>
3246 <div class="doc-row">
3247 <div class="doc-copy">
3248 <section class="swagger-request-params">
3249 <div class="prop-row prop-group">
3250 <div class="prop-name">
3251 <div class="prop-title">id:
3252 <span class="prop-type">
3253 <span class="json-property-type">string</span>
3254 <span class="json-property-range" title="Value limits"></span>
3255 </span>
3256 </div>
3257 <span class="json-property-required"></span>
3258 <div class="prop-subtitle"> in path </div>
3259 </div>
3260 <div class="prop-value">
3261 <p>The video id or uuid</p>
3262 </div>
3263 </div>
3264 <div class="prop-row prop-group">
3265 <div class="prop-name">
3266 <div class="prop-title">thumbnailfile:
3267 <span class="prop-type">
3268 <span class="json-property-type">file</span>
3269 <span class="json-property-range" title="Value limits"></span>
3270 </span>
3271 </div>
3272 <div class="prop-subtitle"> in formData </div>
3273 </div>
3274 <div class="prop-value">
3275 <p>Video thumbnail file</p>
3276 </div>
3277 </div>
3278 <div class="prop-row prop-group">
3279 <div class="prop-name">
3280 <div class="prop-title">previewfile:
3281 <span class="prop-type">
3282 <span class="json-property-type">file</span>
3283 <span class="json-property-range" title="Value limits"></span>
3284 </span>
3285 </div>
3286 <div class="prop-subtitle"> in formData </div>
3287 </div>
3288 <div class="prop-value">
3289 <p>Video preview file</p>
3290 </div>
3291 </div>
3292 <div class="prop-row prop-group">
3293 <div class="prop-name">
3294 <div class="prop-title">category:
3295 <span class="prop-type">
3296 <span class="json-property-type">number</span>
3297 <span class="json-property-range" title="Value limits"></span>
3298 </span>
3299 </div>
3300 <div class="prop-subtitle"> in formData </div>
3301 </div>
3302 <div class="prop-value">
3303 <p>Video category</p>
3304 </div>
3305 </div>
3306 <div class="prop-row prop-group">
3307 <div class="prop-name">
3308 <div class="prop-title">licence:
3309 <span class="prop-type">
3310 <span class="json-property-type">number</span>
3311 <span class="json-property-range" title="Value limits"></span>
3312 </span>
3313 </div>
3314 <div class="prop-subtitle"> in formData </div>
3315 </div>
3316 <div class="prop-value">
3317 <p>Video licence</p>
3318 </div>
3319 </div>
3320 <div class="prop-row prop-group">
3321 <div class="prop-name">
3322 <div class="prop-title">language:
3323 <span class="prop-type">
3324 <span class="json-property-type">string</span>
3325 <span class="json-property-range" title="Value limits"></span>
3326 </span>
3327 </div>
3328 <div class="prop-subtitle"> in formData </div>
3329 </div>
3330 <div class="prop-value">
3331 <p>Video language</p>
3332 </div>
3333 </div>
3334 <div class="prop-row prop-group">
3335 <div class="prop-name">
3336 <div class="prop-title">description:
3337 <span class="prop-type">
3338 <span class="json-property-type">string</span>
3339 <span class="json-property-range" title="Value limits"></span>
3340 </span>
3341 </div>
3342 <div class="prop-subtitle"> in formData </div>
3343 </div>
3344 <div class="prop-value">
3345 <p>Video description</p>
3346 </div>
3347 </div>
3348 <div class="prop-row prop-group">
3349 <div class="prop-name">
3350 <div class="prop-title">waitTranscoding:
3351 <span class="prop-type">
3352 <span class="json-property-type">boolean</span>
3353 <span class="json-property-range" title="Value limits"></span>
3354 </span>
3355 </div>
3356 <div class="prop-subtitle"> in formData </div>
3357 </div>
3358 <div class="prop-value">
3359 <p>Whether or not we wait transcoding before publish the video</p>
3360 </div>
3361 </div>
3362 <div class="prop-row prop-group">
3363 <div class="prop-name">
3364 <div class="prop-title">support:
3365 <span class="prop-type">
3366 <span class="json-property-type">string</span>
3367 <span class="json-property-range" title="Value limits"></span>
3368 </span>
3369 </div>
3370 <div class="prop-subtitle"> in formData </div>
3371 </div>
3372 <div class="prop-value">
3373 <p>Text describing how to support the video uploader</p>
3374 </div>
3375 </div>
3376 <div class="prop-row prop-group">
3377 <div class="prop-name">
3378 <div class="prop-title">nsfw:
3379 <span class="prop-type">
3380 <span class="json-property-type">boolean</span>
3381 <span class="json-property-range" title="Value limits"></span>
3382 </span>
3383 </div>
3384 <div class="prop-subtitle"> in formData </div>
3385 </div>
3386 <div class="prop-value">
3387 <p>Whether or not this video contains sensitive content</p>
3388 </div>
3389 </div>
3390 <div class="prop-row prop-group">
3391 <div class="prop-name">
3392 <div class="prop-title">name:
3393 <span class="prop-type">
3394 <span class="json-property-type">string</span>
3395 <span class="json-property-range" title="Value limits"></span>
3396 </span>
3397 </div>
3398 <div class="prop-subtitle"> in formData </div>
3399 </div>
3400 <div class="prop-value">
3401 <p>Video name</p>
3402 </div>
3403 </div>
3404 <div class="prop-row prop-group">
3405 <div class="prop-name">
3406 <div class="prop-title">tags:
3407 <span class="prop-type">
3408 <span class="json-property-type">string[]</span>
3409 <span class="json-property-range" title="Value limits"></span>
3410 </span>
3411 </div>
3412 <div class="prop-subtitle"> in formData </div>
3413 </div>
3414 <div class="prop-value">
3415 <p>Video tags</p>
3416 </div>
3417 </div>
3418 <div class="prop-row prop-group">
3419 <div class="prop-name">
3420 <div class="prop-title">commentsEnabled:
3421 <span class="prop-type">
3422 <span class="json-property-type">boolean</span>
3423 <span class="json-property-range" title="Value limits"></span>
3424 </span>
3425 </div>
3426 <div class="prop-subtitle"> in formData </div>
3427 </div>
3428 <div class="prop-value">
3429 <p>Enable or disable comments for this video</p>
3430 </div>
3431 </div>
3432 <div class="prop-row prop-group">
3433 <div class="prop-name">
3434 <div class="prop-title">privacy:
3435 <span class="prop-type">
3436 <span class="json-property-type">string</span>
3437 <span class="json-property-enum" title="Possible values">
3438 <span class="json-property-enum-item">Public</span>,
3439 <span class="json-property-enum-item">Unlisted</span>
3440 </span>
3441 <span class="json-property-range" title="Value limits"></span>
3442 </span>
3443 </div>
3444 <div class="prop-subtitle"> in formData </div>
3445 </div>
3446 <div class="prop-value">
3447 <p>Video privacy</p>
3448 </div>
3449 </div>
3450 <div class="prop-row prop-group">
3451 <div class="prop-name">
3452 <div class="prop-title">scheduleUpdate:
3453 <span class="prop-type">
3454 <span class="json-property-type">object</span>
3455 <span class="json-property-range" title="Value limits"></span>
3456 </span>
3457 </div>
3458 <div class="prop-subtitle"> in formData </div>
3459 </div>
3460 <div class="prop-value">
3461 <p>Schedule an update at a specific datetime</p>
3462 </div>
3463 </div>
3464 </section>
3465 </div>
3466 <div class="doc-examples"></div>
3467 </div>
3468 <div class="doc-row">
3469 <div class="doc-copy">
3470 <section class="swagger-responses">
3471 <div class="prop-row prop-group">
3472 <div class="prop-name">
3473 <div class="prop-title">200 OK</div>
3474 <div class="prop-ref">
3475 <span class="">
3476 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
3477 </span>
3478 </div>
3479 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3480 </div>
3481 <div class="prop-value">
3482 <p>successful operation</p>
3483 </div>
3484 </div>
3485 </section>
3486 </div>
3487 <div class="doc-examples">
3488 <h5>Response Content-Types:
3489 <span>application/json</span>
3490 </h5>
3491 <section>
3492 <h5>Response Example
3493 <span>(200 OK)</span>
3494 </h5>
3495 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
3496 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3497 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3498 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3499 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3500 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3501 <span class="hljs-attr">&quot;category&quot;</span>: {
3502 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3503 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3504 },
3505 <span class="hljs-attr">&quot;licence&quot;</span>: {
3506 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3507 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3508 },
3509 <span class="hljs-attr">&quot;language&quot;</span>: {
3510 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3511 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3512 },
3513 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3514 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3515 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3516 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
3517 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3518 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3519 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3520 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3521 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3522 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3523 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3524 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
3525 <span class="hljs-attr">&quot;account&quot;</span>: {
3526 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3527 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3528 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3529 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3530 <span class="hljs-attr">&quot;avatar&quot;</span>: {
3531 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3532 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3533 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3534 }
3535 }
3536}
3537</code></pre>
3538 <!-- </div> -->
3539 </section>
3540 </div>
3541 </div>
3542 <div class="doc-row">
3543 <div class="doc-copy">
3544 <section class="swagger-request-security">
3545 <table class="table">
3546 <thead>
3547 <tr>
3548 <th class="swagger-request-security-schema"></th>
3549 <th class="swagger-request-security-scopes"></th>
3550 </tr>
3551 </thead>
3552 <tbody>
3553 <tr>
3554 <td>
3555 <a href="#security-definition-OAuth2">OAuth2</a>
3556 </td>
3557 <td> </td>
3558 </tr>
3559 </tbody>
3560 </table>
3561 </section>
3562 </div>
3563 </div>
3564 </div>
3565 <div id="operation--videos--id--get" class="operation panel" data-traverse-target="operation--videos--id--get">
3566 <!-- <section class="operation-tags row"> -->
3567 <!-- <div class="doc-copy"> -->
3568 <div class="operation-tags">
3569 <a class="label" href="#tag-Video">Video</a>
3570 <!---->
3571 </div>
3572 <!-- </div> -->
3573 <!-- </section> -->
3574 <h2 class="operation-title">
3575 <span class="operation-name">
3576 <span class="operation-name">GET</span>
3577 <span class="operation-path">/videos/{id}</span>
3578 </span>
3579 </h2>
3580 <div class="doc-row">
3581 <div class="doc-copy">
3582 <section class="swagger-request-params">
3583 <div class="prop-row prop-group">
3584 <div class="prop-name">
3585 <div class="prop-title">id:
3586 <span class="prop-type">
3587 <span class="json-property-type">string</span>
3588 <span class="json-property-range" title="Value limits"></span>
3589 </span>
3590 </div>
3591 <span class="json-property-required"></span>
3592 <div class="prop-subtitle"> in path </div>
3593 </div>
3594 <div class="prop-value">
3595 <p>The video id or uuid</p>
3596 </div>
3597 </div>
3598 </section>
3599 </div>
3600 <div class="doc-examples"></div>
3601 </div>
3602 <div class="doc-row">
3603 <div class="doc-copy">
3604 <section class="swagger-responses">
3605 <div class="prop-row prop-group">
3606 <div class="prop-name">
3607 <div class="prop-title">200 OK</div>
3608 <div class="prop-ref">
3609 <span class="">
3610 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
3611 </span>
3612 </div>
3613 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3614 </div>
3615 <div class="prop-value">
3616 <p>successful operation</p>
3617 </div>
3618 </div>
3619 </section>
3620 </div>
3621 <div class="doc-examples">
3622 <h5>Response Content-Types:
3623 <span>application/json</span>
3624 </h5>
3625 <section>
3626 <h5>Response Example
3627 <span>(200 OK)</span>
3628 </h5>
3629 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
3630 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3631 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3632 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3633 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3634 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3635 <span class="hljs-attr">&quot;category&quot;</span>: {
3636 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3637 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3638 },
3639 <span class="hljs-attr">&quot;licence&quot;</span>: {
3640 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3641 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3642 },
3643 <span class="hljs-attr">&quot;language&quot;</span>: {
3644 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3645 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3646 },
3647 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3648 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3649 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3650 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
3651 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3652 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3653 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3654 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3655 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3656 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3657 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
3658 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
3659 <span class="hljs-attr">&quot;account&quot;</span>: {
3660 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3661 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3662 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3663 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3664 <span class="hljs-attr">&quot;avatar&quot;</span>: {
3665 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3666 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
3667 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
3668 }
3669 }
3670}
3671</code></pre>
3672 <!-- </div> -->
3673 </section>
3674 </div>
3675 </div>
3676 </div>
3677 <div id="operation--videos--id--delete" class="operation panel" data-traverse-target="operation--videos--id--delete">
3678 <!-- <section class="operation-tags row"> -->
3679 <!-- <div class="doc-copy"> -->
3680 <div class="operation-tags">
3681 <a class="label" href="#tag-Video">Video</a>
3682 <!---->
3683 </div>
3684 <!-- </div> -->
3685 <!-- </section> -->
3686 <h2 class="operation-title">
3687 <span class="operation-name">
3688 <span class="operation-name">DELETE</span>
3689 <span class="operation-path">/videos/{id}</span>
3690 </span>
3691 </h2>
3692 <div class="doc-row">
3693 <div class="doc-copy">
3694 <section class="swagger-request-params">
3695 <div class="prop-row prop-group">
3696 <div class="prop-name">
3697 <div class="prop-title">id:
3698 <span class="prop-type">
3699 <span class="json-property-type">string</span>
3700 <span class="json-property-range" title="Value limits"></span>
3701 </span>
3702 </div>
3703 <span class="json-property-required"></span>
3704 <div class="prop-subtitle"> in path </div>
3705 </div>
3706 <div class="prop-value">
3707 <p>The video id or uuid</p>
3708 </div>
3709 </div>
3710 </section>
3711 </div>
3712 <div class="doc-examples"></div>
3713 </div>
3714 <div class="doc-row">
3715 <div class="doc-copy">
3716 <section class="swagger-responses">
3717 <div class="prop-row prop-group">
3718 <div class="prop-name">
3719 <div class="prop-title">204 No Content</div>
3720 </div>
3721 <div class="prop-value">
3722 <p>Successful operation</p>
3723 </div>
3724 </div>
3725 </section>
3726 </div>
3727 <div class="doc-examples">
3728 <h5>Response Content-Types:
3729 <span>application/json</span>
3730 </h5>
3731 </div>
3732 </div>
3733 <div class="doc-row">
3734 <div class="doc-copy">
3735 <section class="swagger-request-security">
3736 <table class="table">
3737 <thead>
3738 <tr>
3739 <th class="swagger-request-security-schema"></th>
3740 <th class="swagger-request-security-scopes"></th>
3741 </tr>
3742 </thead>
3743 <tbody>
3744 <tr>
3745 <td>
3746 <a href="#security-definition-OAuth2">OAuth2</a>
3747 </td>
3748 <td> </td>
3749 </tr>
3750 </tbody>
3751 </table>
3752 </section>
3753 </div>
3754 </div>
3755 </div>
3756 <div id="operation--videos--id--description-get" class="operation panel" data-traverse-target="operation--videos--id--description-get">
3757 <!-- <section class="operation-tags row"> -->
3758 <!-- <div class="doc-copy"> -->
3759 <div class="operation-tags">
3760 <a class="label" href="#tag-Video">Video</a>
3761 <!---->
3762 </div>
3763 <!-- </div> -->
3764 <!-- </section> -->
3765 <h2 class="operation-title">
3766 <span class="operation-name">
3767 <span class="operation-name">GET</span>
3768 <span class="operation-path">/videos/{id}/description</span>
3769 </span>
3770 </h2>
3771 <div class="doc-row">
3772 <div class="doc-copy">
3773 <section class="swagger-request-params">
3774 <div class="prop-row prop-group">
3775 <div class="prop-name">
3776 <div class="prop-title">id:
3777 <span class="prop-type">
3778 <span class="json-property-type">string</span>
3779 <span class="json-property-range" title="Value limits"></span>
3780 </span>
3781 </div>
3782 <span class="json-property-required"></span>
3783 <div class="prop-subtitle"> in path </div>
3784 </div>
3785 <div class="prop-value">
3786 <p>The video id or uuid</p>
3787 </div>
3788 </div>
3789 </section>
3790 </div>
3791 <div class="doc-examples"></div>
3792 </div>
3793 <div class="doc-row">
3794 <div class="doc-copy">
3795 <section class="swagger-responses">
3796 <div class="prop-row prop-group">
3797 <div class="prop-name">
3798 <div class="prop-title">200 OK</div>
3799 <div class="prop-ref"> </div>
3800 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
3801 </div>
3802 <div class="prop-value">
3803 <p>successful operation</p>
3804 </div>
3805 </div>
3806 <div class="prop-row prop-inner">
3807 <div class="prop-name">type</div>
3808 <div class="prop-value">
3809 <span class="json-property-type">string</span>
3810 <span class="json-property-range" title="Value limits"></span>
3811 </div>
3812 </div>
3813 </section>
3814 </div>
3815 <div class="doc-examples">
3816 <h5>Response Content-Types:
3817 <span>application/json</span>
3818 </h5>
3819 <section>
3820 <h5>Response Example
3821 <span>(200 OK)</span>
3822 </h5>
3823 <!-- <div class="hljs"> --><pre><code class="hljs lang-json"><span class="hljs-string">&quot;string&quot;</span>
3824</code></pre>
3825 <!-- </div> -->
3826 </section>
3827 </div>
3828 </div>
3829 </div>
3830 <div id="operation--videos--id--views-post" class="operation panel" data-traverse-target="operation--videos--id--views-post">
3831 <!-- <section class="operation-tags row"> -->
3832 <!-- <div class="doc-copy"> -->
3833 <div class="operation-tags">
3834 <a class="label" href="#tag-Video">Video</a>
3835 <!---->
3836 </div>
3837 <!-- </div> -->
3838 <!-- </section> -->
3839 <h2 class="operation-title">
3840 <span class="operation-name">
3841 <span class="operation-name">POST</span>
3842 <span class="operation-path">/videos/{id}/views</span>
3843 </span>
3844 </h2>
3845 <div class="doc-row">
3846 <div class="doc-copy">
3847 <section class="swagger-request-params">
3848 <div class="prop-row prop-group">
3849 <div class="prop-name">
3850 <div class="prop-title">id:
3851 <span class="prop-type">
3852 <span class="json-property-type">string</span>
3853 <span class="json-property-range" title="Value limits"></span>
3854 </span>
3855 </div>
3856 <span class="json-property-required"></span>
3857 <div class="prop-subtitle"> in path </div>
3858 </div>
3859 <div class="prop-value">
3860 <p>The video id or uuid</p>
3861 </div>
3862 </div>
3863 </section>
3864 </div>
3865 <div class="doc-examples"></div>
3866 </div>
3867 <div class="doc-row">
3868 <div class="doc-copy">
3869 <section class="swagger-responses">
3870 <div class="prop-row prop-group">
3871 <div class="prop-name">
3872 <div class="prop-title">204 No Content</div>
3873 </div>
3874 <div class="prop-value">
3875 <p>Successful operation</p>
3876 </div>
3877 </div>
3878 </section>
3879 </div>
3880 <div class="doc-examples">
3881 <h5>Response Content-Types:
3882 <span>application/json</span>
3883 </h5>
3884 </div>
3885 </div>
3886 </div>
3887 <div id="operation--videos-upload-post" class="operation panel" data-traverse-target="operation--videos-upload-post">
3888 <!-- <section class="operation-tags row"> -->
3889 <!-- <div class="doc-copy"> -->
3890 <div class="operation-tags">
3891 <a class="label" href="#tag-Video">Video</a>
3892 <!---->
3893 </div>
3894 <!-- </div> -->
3895 <!-- </section> -->
3896 <h2 class="operation-title">
3897 <span class="operation-name">
3898 <span class="operation-name">POST</span>
3899 <span class="operation-path">/videos/upload</span>
3900 </span>
3901 </h2>
3902 <div class="doc-row">
3903 <div class="doc-copy">
3904 <section class="swagger-request-params">
3905 <div class="prop-row prop-group">
3906 <div class="prop-name">
3907 <div class="prop-title">videofile:
3908 <span class="prop-type">
3909 <span class="json-property-type">file</span>
3910 <span class="json-property-range" title="Value limits"></span>
3911 </span>
3912 </div>
3913 <span class="json-property-required"></span>
3914 <div class="prop-subtitle"> in formData </div>
3915 </div>
3916 <div class="prop-value">
3917 <p>Video file</p>
3918 </div>
3919 </div>
3920 <div class="prop-row prop-group">
3921 <div class="prop-name">
3922 <div class="prop-title">channelId:
3923 <span class="prop-type">
3924 <span class="json-property-type">number</span>
3925 <span class="json-property-range" title="Value limits"></span>
3926 </span>
3927 </div>
3928 <span class="json-property-required"></span>
3929 <div class="prop-subtitle"> in formData </div>
3930 </div>
3931 <div class="prop-value">
3932 <p>Channel id that will contain this video</p>
3933 </div>
3934 </div>
3935 <div class="prop-row prop-group">
3936 <div class="prop-name">
3937 <div class="prop-title">thumbnailfile:
3938 <span class="prop-type">
3939 <span class="json-property-type">file</span>
3940 <span class="json-property-range" title="Value limits"></span>
3941 </span>
3942 </div>
3943 <div class="prop-subtitle"> in formData </div>
3944 </div>
3945 <div class="prop-value">
3946 <p>Video thumbnail file</p>
3947 </div>
3948 </div>
3949 <div class="prop-row prop-group">
3950 <div class="prop-name">
3951 <div class="prop-title">previewfile:
3952 <span class="prop-type">
3953 <span class="json-property-type">file</span>
3954 <span class="json-property-range" title="Value limits"></span>
3955 </span>
3956 </div>
3957 <div class="prop-subtitle"> in formData </div>
3958 </div>
3959 <div class="prop-value">
3960 <p>Video preview file</p>
3961 </div>
3962 </div>
3963 <div class="prop-row prop-group">
3964 <div class="prop-name">
3965 <div class="prop-title">category:
3966 <span class="prop-type">
3967 <span class="json-property-type">number</span>
3968 <span class="json-property-range" title="Value limits"></span>
3969 </span>
3970 </div>
3971 <div class="prop-subtitle"> in formData </div>
3972 </div>
3973 <div class="prop-value">
3974 <p>Video category</p>
3975 </div>
3976 </div>
3977 <div class="prop-row prop-group">
3978 <div class="prop-name">
3979 <div class="prop-title">licence:
3980 <span class="prop-type">
3981 <span class="json-property-type">number</span>
3982 <span class="json-property-range" title="Value limits"></span>
3983 </span>
3984 </div>
3985 <div class="prop-subtitle"> in formData </div>
3986 </div>
3987 <div class="prop-value">
3988 <p>Video licence</p>
3989 </div>
3990 </div>
3991 <div class="prop-row prop-group">
3992 <div class="prop-name">
3993 <div class="prop-title">language:
3994 <span class="prop-type">
3995 <span class="json-property-type">string</span>
3996 <span class="json-property-range" title="Value limits"></span>
3997 </span>
3998 </div>
3999 <div class="prop-subtitle"> in formData </div>
4000 </div>
4001 <div class="prop-value">
4002 <p>Video language</p>
4003 </div>
4004 </div>
4005 <div class="prop-row prop-group">
4006 <div class="prop-name">
4007 <div class="prop-title">description:
4008 <span class="prop-type">
4009 <span class="json-property-type">string</span>
4010 <span class="json-property-range" title="Value limits"></span>
4011 </span>
4012 </div>
4013 <div class="prop-subtitle"> in formData </div>
4014 </div>
4015 <div class="prop-value">
4016 <p>Video description</p>
4017 </div>
4018 </div>
4019 <div class="prop-row prop-group">
4020 <div class="prop-name">
4021 <div class="prop-title">waitTranscoding:
4022 <span class="prop-type">
4023 <span class="json-property-type">boolean</span>
4024 <span class="json-property-range" title="Value limits"></span>
4025 </span>
4026 </div>
4027 <div class="prop-subtitle"> in formData </div>
4028 </div>
4029 <div class="prop-value">
4030 <p>Whether or not we wait transcoding before publish the video</p>
4031 </div>
4032 </div>
4033 <div class="prop-row prop-group">
4034 <div class="prop-name">
4035 <div class="prop-title">support:
4036 <span class="prop-type">
4037 <span class="json-property-type">string</span>
4038 <span class="json-property-range" title="Value limits"></span>
4039 </span>
4040 </div>
4041 <div class="prop-subtitle"> in formData </div>
4042 </div>
4043 <div class="prop-value">
4044 <p>Text describing how to support the video uploader</p>
4045 </div>
4046 </div>
4047 <div class="prop-row prop-group">
4048 <div class="prop-name">
4049 <div class="prop-title">nsfw:
4050 <span class="prop-type">
4051 <span class="json-property-type">boolean</span>
4052 <span class="json-property-range" title="Value limits"></span>
4053 </span>
4054 </div>
4055 <div class="prop-subtitle"> in formData </div>
4056 </div>
4057 <div class="prop-value">
4058 <p>Whether or not this video contains sensitive content</p>
4059 </div>
4060 </div>
4061 <div class="prop-row prop-group">
4062 <div class="prop-name">
4063 <div class="prop-title">name:
4064 <span class="prop-type">
4065 <span class="json-property-type">string</span>
4066 <span class="json-property-range" title="Value limits"></span>
4067 </span>
4068 </div>
4069 <div class="prop-subtitle"> in formData </div>
4070 </div>
4071 <div class="prop-value">
4072 <p>Video name</p>
4073 </div>
4074 </div>
4075 <div class="prop-row prop-group">
4076 <div class="prop-name">
4077 <div class="prop-title">tags:
4078 <span class="prop-type">
4079 <span class="json-property-type">string[]</span>
4080 <span class="json-property-range" title="Value limits"></span>
4081 </span>
4082 </div>
4083 <div class="prop-subtitle"> in formData </div>
4084 </div>
4085 <div class="prop-value">
4086 <p>Video tags</p>
4087 </div>
4088 </div>
4089 <div class="prop-row prop-group">
4090 <div class="prop-name">
4091 <div class="prop-title">commentsEnabled:
4092 <span class="prop-type">
4093 <span class="json-property-type">boolean</span>
4094 <span class="json-property-range" title="Value limits"></span>
4095 </span>
4096 </div>
4097 <div class="prop-subtitle"> in formData </div>
4098 </div>
4099 <div class="prop-value">
4100 <p>Enable or disable comments for this video</p>
4101 </div>
4102 </div>
4103 <div class="prop-row prop-group">
4104 <div class="prop-name">
4105 <div class="prop-title">privacy:
4106 <span class="prop-type">
4107 <span class="json-property-type">string</span>
4108 <span class="json-property-enum" title="Possible values">
4109 <span class="json-property-enum-item">Public</span>,
4110 <span class="json-property-enum-item">Unlisted</span>
4111 </span>
4112 <span class="json-property-range" title="Value limits"></span>
4113 </span>
4114 </div>
4115 <div class="prop-subtitle"> in formData </div>
4116 </div>
4117 <div class="prop-value">
4118 <p>Video privacy</p>
4119 </div>
4120 </div>
4121 <div class="prop-row prop-group">
4122 <div class="prop-name">
4123 <div class="prop-title">scheduleUpdate:
4124 <span class="prop-type">
4125 <span class="json-property-type">object</span>
4126 <span class="json-property-range" title="Value limits"></span>
4127 </span>
4128 </div>
4129 <div class="prop-subtitle"> in formData </div>
4130 </div>
4131 <div class="prop-value">
4132 <p>Schedule an update at a specific datetime</p>
4133 </div>
4134 </div>
4135 </section>
4136 </div>
4137 <div class="doc-examples"></div>
4138 </div>
4139 <div class="doc-row">
4140 <div class="doc-copy">
4141 <section class="swagger-responses">
4142 <div class="prop-row prop-group">
4143 <div class="prop-name">
4144 <div class="prop-title">200 OK</div>
4145 <div class="prop-ref">
4146 <span class="">
4147 <a class="json-schema-ref" href="#/definitions/VideoUploadResponse">VideoUploadResponse</a>
4148 </span>
4149 </div>
4150 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
4151 </div>
4152 <div class="prop-value">
4153 <p>successful operation</p>
4154 </div>
4155 </div>
4156 </section>
4157 </div>
4158 <div class="doc-examples">
4159 <h5>Response Content-Types:
4160 <span>application/json</span>
4161 </h5>
4162 <section>
4163 <h5>Response Example
4164 <span>(200 OK)</span>
4165 </h5>
4166 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
4167 <span class="hljs-attr">&quot;video&quot;</span>: {
4168 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4169 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4170 }
4171}
4172</code></pre>
4173 <!-- </div> -->
4174 </section>
4175 </div>
4176 </div>
4177 <div class="doc-row">
4178 <div class="doc-copy">
4179 <section class="swagger-request-security">
4180 <table class="table">
4181 <thead>
4182 <tr>
4183 <th class="swagger-request-security-schema"></th>
4184 <th class="swagger-request-security-scopes"></th>
4185 </tr>
4186 </thead>
4187 <tbody>
4188 <tr>
4189 <td>
4190 <a href="#security-definition-OAuth2">OAuth2</a>
4191 </td>
4192 <td> </td>
4193 </tr>
4194 </tbody>
4195 </table>
4196 </section>
4197 </div>
4198 </div>
4199 </div>
4200 <h1 id="tag-VideoAbuse" class="swagger-summary-tag" data-traverse-target="tag-VideoAbuse">VideoAbuse</h1>
4201 <div id="operation--videos-abuse-get" class="operation panel" data-traverse-target="operation--videos-abuse-get">
4202 <!-- <section class="operation-tags row"> -->
4203 <!-- <div class="doc-copy"> -->
4204 <div class="operation-tags">
4205 <a class="label" href="#tag-VideoAbuse">VideoAbuse</a>
4206 <!---->
4207 </div>
4208 <!-- </div> -->
4209 <!-- </section> -->
4210 <h2 class="operation-title">
4211 <span class="operation-name">
4212 <span class="operation-name">GET</span>
4213 <span class="operation-path">/videos/abuse</span>
4214 </span>
4215 </h2>
4216 <div class="doc-row">
4217 <div class="doc-copy">
4218 <section class="swagger-request-params">
4219 <div class="prop-row prop-group">
4220 <div class="prop-name">
4221 <div class="prop-title">start:
4222 <span class="prop-type">
4223 <span class="json-property-type">number</span>
4224 <span class="json-property-range" title="Value limits"></span>
4225 </span>
4226 </div>
4227 <div class="prop-subtitle"> in query </div>
4228 </div>
4229 <div class="prop-value">
4230 <p>Offset</p>
4231 </div>
4232 </div>
4233 <div class="prop-row prop-group">
4234 <div class="prop-name">
4235 <div class="prop-title">count:
4236 <span class="prop-type">
4237 <span class="json-property-type">number</span>
4238 <span class="json-property-range" title="Value limits"></span>
4239 </span>
4240 </div>
4241 <div class="prop-subtitle"> in query </div>
4242 </div>
4243 <div class="prop-value">
4244 <p>Number of items</p>
4245 </div>
4246 </div>
4247 <div class="prop-row prop-group">
4248 <div class="prop-name">
4249 <div class="prop-title">sort:
4250 <span class="prop-type">
4251 <span class="json-property-type">string</span>
4252 <span class="json-property-range" title="Value limits"></span>
4253 </span>
4254 </div>
4255 <div class="prop-subtitle"> in query </div>
4256 </div>
4257 <div class="prop-value">
4258 <p>Sort column (-createdAt for example)</p>
4259 </div>
4260 </div>
4261 </section>
4262 </div>
4263 <div class="doc-examples"></div>
4264 </div>
4265 <div class="doc-row">
4266 <div class="doc-copy">
4267 <section class="swagger-responses">
4268 <div class="prop-row prop-group">
4269 <div class="prop-name">
4270 <div class="prop-title">200 OK</div>
4271 <div class="prop-ref">
4272 <span class="json-schema-ref-array">
4273 <a class="json-schema-ref" href="#/definitions/VideoAbuse">VideoAbuse</a>
4274 </span>
4275 </div>
4276 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
4277 </div>
4278 <div class="prop-value">
4279 <p>successful operation</p>
4280 </div>
4281 </div>
4282 <div class="prop-row prop-inner">
4283 <div class="prop-name">type</div>
4284 <div class="prop-value">
4285 <span class="json-property-type">
4286 <span class="json-schema-ref-array">
4287 <a class="json-schema-ref" href="#/definitions/VideoAbuse">VideoAbuse</a>
4288 </span>
4289 </span>
4290 <span class="json-property-range" title="Value limits"></span>
4291 </div>
4292 </div>
4293 </section>
4294 </div>
4295 <div class="doc-examples">
4296 <h5>Response Content-Types:
4297 <span>application/json</span>
4298 </h5>
4299 <section>
4300 <h5>Response Example
4301 <span>(200 OK)</span>
4302 </h5>
4303 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
4304 {
4305 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4306 <span class="hljs-attr">&quot;reason&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4307 <span class="hljs-attr">&quot;reporterAccount&quot;</span>: {
4308 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4309 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4310 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4311 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4312 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4313 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4314 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4315 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4316 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4317 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4318 <span class="hljs-attr">&quot;avatar&quot;</span>: {
4319 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4320 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4321 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4322 }
4323 },
4324 <span class="hljs-attr">&quot;video&quot;</span>: {
4325 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4326 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4327 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4328 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4329 },
4330 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4331 }
4332]
4333</code></pre>
4334 <!-- </div> -->
4335 </section>
4336 </div>
4337 </div>
4338 <div class="doc-row">
4339 <div class="doc-copy">
4340 <section class="swagger-request-security">
4341 <table class="table">
4342 <thead>
4343 <tr>
4344 <th class="swagger-request-security-schema"></th>
4345 <th class="swagger-request-security-scopes"></th>
4346 </tr>
4347 </thead>
4348 <tbody>
4349 <tr>
4350 <td>
4351 <a href="#security-definition-OAuth2">OAuth2</a>
4352 </td>
4353 <td> </td>
4354 </tr>
4355 </tbody>
4356 </table>
4357 </section>
4358 </div>
4359 </div>
4360 </div>
4361 <div id="operation--videos--id--abuse-post" class="operation panel" data-traverse-target="operation--videos--id--abuse-post">
4362 <!-- <section class="operation-tags row"> -->
4363 <!-- <div class="doc-copy"> -->
4364 <div class="operation-tags">
4365 <a class="label" href="#tag-VideoAbuse">VideoAbuse</a>
4366 <!---->
4367 </div>
4368 <!-- </div> -->
4369 <!-- </section> -->
4370 <h2 class="operation-title">
4371 <span class="operation-name">
4372 <span class="operation-name">POST</span>
4373 <span class="operation-path">/videos/{id}/abuse</span>
4374 </span>
4375 </h2>
4376 <div class="doc-row">
4377 <div class="doc-copy">
4378 <section class="swagger-request-params">
4379 <div class="prop-row prop-group">
4380 <div class="prop-name">
4381 <div class="prop-title">id:
4382 <span class="prop-type">
4383 <span class="json-property-type">string</span>
4384 <span class="json-property-range" title="Value limits"></span>
4385 </span>
4386 </div>
4387 <span class="json-property-required"></span>
4388 <div class="prop-subtitle"> in path </div>
4389 </div>
4390 <div class="prop-value">
4391 <p>The video id or uuid</p>
4392 </div>
4393 </div>
4394 </section>
4395 </div>
4396 <div class="doc-examples"></div>
4397 </div>
4398 <div class="doc-row">
4399 <div class="doc-copy">
4400 <section class="swagger-responses">
4401 <div class="prop-row prop-group">
4402 <div class="prop-name">
4403 <div class="prop-title">204 No Content</div>
4404 </div>
4405 <div class="prop-value">
4406 <p>Successful operation</p>
4407 </div>
4408 </div>
4409 </section>
4410 </div>
4411 <div class="doc-examples">
4412 <h5>Response Content-Types:
4413 <span>application/json</span>
4414 </h5>
4415 </div>
4416 </div>
4417 <div class="doc-row">
4418 <div class="doc-copy">
4419 <section class="swagger-request-security">
4420 <table class="table">
4421 <thead>
4422 <tr>
4423 <th class="swagger-request-security-schema"></th>
4424 <th class="swagger-request-security-scopes"></th>
4425 </tr>
4426 </thead>
4427 <tbody>
4428 <tr>
4429 <td>
4430 <a href="#security-definition-OAuth2">OAuth2</a>
4431 </td>
4432 <td> </td>
4433 </tr>
4434 </tbody>
4435 </table>
4436 </section>
4437 </div>
4438 </div>
4439 </div>
4440 <h1 id="tag-VideoBlacklist" class="swagger-summary-tag" data-traverse-target="tag-VideoBlacklist">VideoBlacklist</h1>
4441 <div id="operation--videos--id--blacklist-post" class="operation panel" data-traverse-target="operation--videos--id--blacklist-post">
4442 <!-- <section class="operation-tags row"> -->
4443 <!-- <div class="doc-copy"> -->
4444 <div class="operation-tags">
4445 <a class="label" href="#tag-VideoBlacklist">VideoBlacklist</a>
4446 <!---->
4447 </div>
4448 <!-- </div> -->
4449 <!-- </section> -->
4450 <h2 class="operation-title">
4451 <span class="operation-name">
4452 <span class="operation-name">POST</span>
4453 <span class="operation-path">/videos/{id}/blacklist</span>
4454 </span>
4455 </h2>
4456 <div class="doc-row">
4457 <div class="doc-copy">
4458 <section class="swagger-request-params">
4459 <div class="prop-row prop-group">
4460 <div class="prop-name">
4461 <div class="prop-title">id:
4462 <span class="prop-type">
4463 <span class="json-property-type">string</span>
4464 <span class="json-property-range" title="Value limits"></span>
4465 </span>
4466 </div>
4467 <span class="json-property-required"></span>
4468 <div class="prop-subtitle"> in path </div>
4469 </div>
4470 <div class="prop-value">
4471 <p>The video id or uuid</p>
4472 </div>
4473 </div>
4474 </section>
4475 </div>
4476 <div class="doc-examples"></div>
4477 </div>
4478 <div class="doc-row">
4479 <div class="doc-copy">
4480 <section class="swagger-responses">
4481 <div class="prop-row prop-group">
4482 <div class="prop-name">
4483 <div class="prop-title">204 No Content</div>
4484 </div>
4485 <div class="prop-value">
4486 <p>Successful operation</p>
4487 </div>
4488 </div>
4489 </section>
4490 </div>
4491 <div class="doc-examples">
4492 <h5>Response Content-Types:
4493 <span>application/json</span>
4494 </h5>
4495 </div>
4496 </div>
4497 <div class="doc-row">
4498 <div class="doc-copy">
4499 <section class="swagger-request-security">
4500 <table class="table">
4501 <thead>
4502 <tr>
4503 <th class="swagger-request-security-schema"></th>
4504 <th class="swagger-request-security-scopes"></th>
4505 </tr>
4506 </thead>
4507 <tbody>
4508 <tr>
4509 <td>
4510 <a href="#security-definition-OAuth2">OAuth2</a>
4511 </td>
4512 <td> </td>
4513 </tr>
4514 </tbody>
4515 </table>
4516 </section>
4517 </div>
4518 </div>
4519 </div>
4520 <div id="operation--videos--id--blacklist-delete" class="operation panel" data-traverse-target="operation--videos--id--blacklist-delete">
4521 <!-- <section class="operation-tags row"> -->
4522 <!-- <div class="doc-copy"> -->
4523 <div class="operation-tags">
4524 <a class="label" href="#tag-VideoBlacklist">VideoBlacklist</a>
4525 <!---->
4526 </div>
4527 <!-- </div> -->
4528 <!-- </section> -->
4529 <h2 class="operation-title">
4530 <span class="operation-name">
4531 <span class="operation-name">DELETE</span>
4532 <span class="operation-path">/videos/{id}/blacklist</span>
4533 </span>
4534 </h2>
4535 <div class="doc-row">
4536 <div class="doc-copy">
4537 <section class="swagger-request-params">
4538 <div class="prop-row prop-group">
4539 <div class="prop-name">
4540 <div class="prop-title">id:
4541 <span class="prop-type">
4542 <span class="json-property-type">string</span>
4543 <span class="json-property-range" title="Value limits"></span>
4544 </span>
4545 </div>
4546 <span class="json-property-required"></span>
4547 <div class="prop-subtitle"> in path </div>
4548 </div>
4549 <div class="prop-value">
4550 <p>The video id or uuid</p>
4551 </div>
4552 </div>
4553 </section>
4554 </div>
4555 <div class="doc-examples"></div>
4556 </div>
4557 <div class="doc-row">
4558 <div class="doc-copy">
4559 <section class="swagger-responses">
4560 <div class="prop-row prop-group">
4561 <div class="prop-name">
4562 <div class="prop-title">204 No Content</div>
4563 </div>
4564 <div class="prop-value">
4565 <p>Successful operation</p>
4566 </div>
4567 </div>
4568 </section>
4569 </div>
4570 <div class="doc-examples">
4571 <h5>Response Content-Types:
4572 <span>application/json</span>
4573 </h5>
4574 </div>
4575 </div>
4576 <div class="doc-row">
4577 <div class="doc-copy">
4578 <section class="swagger-request-security">
4579 <table class="table">
4580 <thead>
4581 <tr>
4582 <th class="swagger-request-security-schema"></th>
4583 <th class="swagger-request-security-scopes"></th>
4584 </tr>
4585 </thead>
4586 <tbody>
4587 <tr>
4588 <td>
4589 <a href="#security-definition-OAuth2">OAuth2</a>
4590 </td>
4591 <td> </td>
4592 </tr>
4593 </tbody>
4594 </table>
4595 </section>
4596 </div>
4597 </div>
4598 </div>
4599 <div id="operation--videos-blacklist-get" class="operation panel" data-traverse-target="operation--videos-blacklist-get">
4600 <!-- <section class="operation-tags row"> -->
4601 <!-- <div class="doc-copy"> -->
4602 <div class="operation-tags">
4603 <a class="label" href="#tag-VideoBlacklist">VideoBlacklist</a>
4604 <!---->
4605 </div>
4606 <!-- </div> -->
4607 <!-- </section> -->
4608 <h2 class="operation-title">
4609 <span class="operation-name">
4610 <span class="operation-name">GET</span>
4611 <span class="operation-path">/videos/blacklist</span>
4612 </span>
4613 </h2>
4614 <div class="doc-row">
4615 <div class="doc-copy">
4616 <section class="swagger-request-params">
4617 <div class="prop-row prop-group">
4618 <div class="prop-name">
4619 <div class="prop-title">start:
4620 <span class="prop-type">
4621 <span class="json-property-type">number</span>
4622 <span class="json-property-range" title="Value limits"></span>
4623 </span>
4624 </div>
4625 <div class="prop-subtitle"> in query </div>
4626 </div>
4627 <div class="prop-value">
4628 <p>Offset</p>
4629 </div>
4630 </div>
4631 <div class="prop-row prop-group">
4632 <div class="prop-name">
4633 <div class="prop-title">count:
4634 <span class="prop-type">
4635 <span class="json-property-type">number</span>
4636 <span class="json-property-range" title="Value limits"></span>
4637 </span>
4638 </div>
4639 <div class="prop-subtitle"> in query </div>
4640 </div>
4641 <div class="prop-value">
4642 <p>Number of items</p>
4643 </div>
4644 </div>
4645 <div class="prop-row prop-group">
4646 <div class="prop-name">
4647 <div class="prop-title">sort:
4648 <span class="prop-type">
4649 <span class="json-property-type">string</span>
4650 <span class="json-property-range" title="Value limits"></span>
4651 </span>
4652 </div>
4653 <div class="prop-subtitle"> in query </div>
4654 </div>
4655 <div class="prop-value">
4656 <p>Sort column (-createdAt for example)</p>
4657 </div>
4658 </div>
4659 </section>
4660 </div>
4661 <div class="doc-examples"></div>
4662 </div>
4663 <div class="doc-row">
4664 <div class="doc-copy">
4665 <section class="swagger-responses">
4666 <div class="prop-row prop-group">
4667 <div class="prop-name">
4668 <div class="prop-title">200 OK</div>
4669 <div class="prop-ref">
4670 <span class="json-schema-ref-array">
4671 <a class="json-schema-ref" href="#/definitions/VideoBlacklist">VideoBlacklist</a>
4672 </span>
4673 </div>
4674 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
4675 </div>
4676 <div class="prop-value">
4677 <p>successful operation</p>
4678 </div>
4679 </div>
4680 <div class="prop-row prop-inner">
4681 <div class="prop-name">type</div>
4682 <div class="prop-value">
4683 <span class="json-property-type">
4684 <span class="json-schema-ref-array">
4685 <a class="json-schema-ref" href="#/definitions/VideoBlacklist">VideoBlacklist</a>
4686 </span>
4687 </span>
4688 <span class="json-property-range" title="Value limits"></span>
4689 </div>
4690 </div>
4691 </section>
4692 </div>
4693 <div class="doc-examples">
4694 <h5>Response Content-Types:
4695 <span>application/json</span>
4696 </h5>
4697 <section>
4698 <h5>Response Example
4699 <span>(200 OK)</span>
4700 </h5>
4701 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
4702 {
4703 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4704 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4705 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4706 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4707 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4708 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4709 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4710 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4711 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4712 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4713 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4714 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>
4715 }
4716]
4717</code></pre>
4718 <!-- </div> -->
4719 </section>
4720 </div>
4721 </div>
4722 <div class="doc-row">
4723 <div class="doc-copy">
4724 <section class="swagger-request-security">
4725 <table class="table">
4726 <thead>
4727 <tr>
4728 <th class="swagger-request-security-schema"></th>
4729 <th class="swagger-request-security-scopes"></th>
4730 </tr>
4731 </thead>
4732 <tbody>
4733 <tr>
4734 <td>
4735 <a href="#security-definition-OAuth2">OAuth2</a>
4736 </td>
4737 <td> </td>
4738 </tr>
4739 </tbody>
4740 </table>
4741 </section>
4742 </div>
4743 </div>
4744 </div>
4745 <h1 id="tag-VideoChannel" class="swagger-summary-tag" data-traverse-target="tag-VideoChannel">VideoChannel</h1>
4746 <div id="operation--video-channels-get" class="operation panel" data-traverse-target="operation--video-channels-get">
4747 <!-- <section class="operation-tags row"> -->
4748 <!-- <div class="doc-copy"> -->
4749 <div class="operation-tags">
4750 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
4751 <!---->
4752 </div>
4753 <!-- </div> -->
4754 <!-- </section> -->
4755 <h2 class="operation-title">
4756 <span class="operation-name">
4757 <span class="operation-name">GET</span>
4758 <span class="operation-path">/video-channels</span>
4759 </span>
4760 </h2>
4761 <div class="doc-row">
4762 <div class="doc-copy">
4763 <section class="swagger-request-params">
4764 <div class="prop-row prop-group">
4765 <div class="prop-name">
4766 <div class="prop-title">start:
4767 <span class="prop-type">
4768 <span class="json-property-type">number</span>
4769 <span class="json-property-range" title="Value limits"></span>
4770 </span>
4771 </div>
4772 <div class="prop-subtitle"> in query </div>
4773 </div>
4774 <div class="prop-value">
4775 <p>Offset</p>
4776 </div>
4777 </div>
4778 <div class="prop-row prop-group">
4779 <div class="prop-name">
4780 <div class="prop-title">count:
4781 <span class="prop-type">
4782 <span class="json-property-type">number</span>
4783 <span class="json-property-range" title="Value limits"></span>
4784 </span>
4785 </div>
4786 <div class="prop-subtitle"> in query </div>
4787 </div>
4788 <div class="prop-value">
4789 <p>Number of items</p>
4790 </div>
4791 </div>
4792 <div class="prop-row prop-group">
4793 <div class="prop-name">
4794 <div class="prop-title">sort:
4795 <span class="prop-type">
4796 <span class="json-property-type">string</span>
4797 <span class="json-property-range" title="Value limits"></span>
4798 </span>
4799 </div>
4800 <div class="prop-subtitle"> in query </div>
4801 </div>
4802 <div class="prop-value">
4803 <p>Sort column (-createdAt for example)</p>
4804 </div>
4805 </div>
4806 </section>
4807 </div>
4808 <div class="doc-examples"></div>
4809 </div>
4810 <div class="doc-row">
4811 <div class="doc-copy">
4812 <section class="swagger-responses">
4813 <div class="prop-row prop-group">
4814 <div class="prop-name">
4815 <div class="prop-title">200 OK</div>
4816 <div class="prop-ref">
4817 <span class="json-schema-ref-array">
4818 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
4819 </span>
4820 </div>
4821 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
4822 </div>
4823 <div class="prop-value">
4824 <p>successful operation</p>
4825 </div>
4826 </div>
4827 <div class="prop-row prop-inner">
4828 <div class="prop-name">type</div>
4829 <div class="prop-value">
4830 <span class="json-property-type">
4831 <span class="json-schema-ref-array">
4832 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
4833 </span>
4834 </span>
4835 <span class="json-property-range" title="Value limits"></span>
4836 </div>
4837 </div>
4838 </section>
4839 </div>
4840 <div class="doc-examples">
4841 <h5>Response Content-Types:
4842 <span>application/json</span>
4843 </h5>
4844 <section>
4845 <h5>Response Example
4846 <span>(200 OK)</span>
4847 </h5>
4848 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
4849 {
4850 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4851 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4852 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
4853 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
4854 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4855 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4856 }
4857 }
4858]
4859</code></pre>
4860 <!-- </div> -->
4861 </section>
4862 </div>
4863 </div>
4864 </div>
4865 <div id="operation--video-channels-post" class="operation panel" data-traverse-target="operation--video-channels-post">
4866 <!-- <section class="operation-tags row"> -->
4867 <!-- <div class="doc-copy"> -->
4868 <div class="operation-tags">
4869 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
4870 <!---->
4871 </div>
4872 <!-- </div> -->
4873 <!-- </section> -->
4874 <h2 class="operation-title">
4875 <span class="operation-name">
4876 <span class="operation-name">POST</span>
4877 <span class="operation-path">/video-channels</span>
4878 </span>
4879 </h2>
4880 <div class="doc-row">
4881 <div class="doc-copy">
4882 <section class="swagger-request-body">
4883 <div class="prop-row">
4884 <div class="prop-name">
4885 <div class="swagger-request-model">
4886 <span class="">
4887 <a class="json-schema-ref" href="#/definitions/VideoChannelInput">VideoChannelInput</a>
4888 </span>
4889 </div>
4890 </div>
4891 <div class="prop-value columns small-6">
4892 <!-- <div class="swagger-request-description"> -->
4893 <p>undefined</p>
4894 <!-- </div> -->
4895 </div>
4896 </div>
4897 </section>
4898 </div>
4899 <div class="doc-examples">
4900 <section>
4901 <h5>Request Content-Types:
4902 <span>application/json</span>
4903 </h5>
4904 <h5>Request Example</h5>
4905 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
4906 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4907 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4908}
4909</code></pre>
4910 <!-- </div> -->
4911 </section>
4912 </div>
4913 </div>
4914 <div class="doc-row">
4915 <div class="doc-copy">
4916 <section class="swagger-responses">
4917 <div class="prop-row prop-group">
4918 <div class="prop-name">
4919 <div class="prop-title">204 No Content</div>
4920 </div>
4921 <div class="prop-value">
4922 <p>Successful operation</p>
4923 </div>
4924 </div>
4925 </section>
4926 </div>
4927 <div class="doc-examples">
4928 <h5>Response Content-Types:
4929 <span>application/json</span>
4930 </h5>
4931 </div>
4932 </div>
4933 <div class="doc-row">
4934 <div class="doc-copy">
4935 <section class="swagger-request-security">
4936 <table class="table">
4937 <thead>
4938 <tr>
4939 <th class="swagger-request-security-schema"></th>
4940 <th class="swagger-request-security-scopes"></th>
4941 </tr>
4942 </thead>
4943 <tbody>
4944 <tr>
4945 <td>
4946 <a href="#security-definition-OAuth2">OAuth2</a>
4947 </td>
4948 <td> </td>
4949 </tr>
4950 </tbody>
4951 </table>
4952 </section>
4953 </div>
4954 </div>
4955 </div>
4956 <div id="operation--video-channels--id--get" class="operation panel" data-traverse-target="operation--video-channels--id--get">
4957 <!-- <section class="operation-tags row"> -->
4958 <!-- <div class="doc-copy"> -->
4959 <div class="operation-tags">
4960 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
4961 <!---->
4962 </div>
4963 <!-- </div> -->
4964 <!-- </section> -->
4965 <h2 class="operation-title">
4966 <span class="operation-name">
4967 <span class="operation-name">GET</span>
4968 <span class="operation-path">/video-channels/{id}</span>
4969 </span>
4970 </h2>
4971 <div class="doc-row">
4972 <div class="doc-copy">
4973 <section class="swagger-request-params">
4974 <div class="prop-row prop-group">
4975 <div class="prop-name">
4976 <div class="prop-title">id:
4977 <span class="prop-type">
4978 <span class="json-property-type">string</span>
4979 <span class="json-property-range" title="Value limits"></span>
4980 </span>
4981 </div>
4982 <span class="json-property-required"></span>
4983 <div class="prop-subtitle"> in path </div>
4984 </div>
4985 <div class="prop-value">
4986 <p>The video channel id or uuid</p>
4987 </div>
4988 </div>
4989 </section>
4990 </div>
4991 <div class="doc-examples"></div>
4992 </div>
4993 <div class="doc-row">
4994 <div class="doc-copy">
4995 <section class="swagger-responses">
4996 <div class="prop-row prop-group">
4997 <div class="prop-name">
4998 <div class="prop-title">200 OK</div>
4999 <div class="prop-ref">
5000 <span class="">
5001 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
5002 </span>
5003 </div>
5004 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5005 </div>
5006 <div class="prop-value">
5007 <p>successful operation</p>
5008 </div>
5009 </div>
5010 </section>
5011 </div>
5012 <div class="doc-examples">
5013 <h5>Response Content-Types:
5014 <span>application/json</span>
5015 </h5>
5016 <section>
5017 <h5>Response Example
5018 <span>(200 OK)</span>
5019 </h5>
5020 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5021 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5022 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5023 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5024 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
5025 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5026 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5027 }
5028}
5029</code></pre>
5030 <!-- </div> -->
5031 </section>
5032 </div>
5033 </div>
5034 </div>
5035 <div id="operation--video-channels--id--put" class="operation panel" data-traverse-target="operation--video-channels--id--put">
5036 <!-- <section class="operation-tags row"> -->
5037 <!-- <div class="doc-copy"> -->
5038 <div class="operation-tags">
5039 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5040 <!---->
5041 </div>
5042 <!-- </div> -->
5043 <!-- </section> -->
5044 <h2 class="operation-title">
5045 <span class="operation-name">
5046 <span class="operation-name">PUT</span>
5047 <span class="operation-path">/video-channels/{id}</span>
5048 </span>
5049 </h2>
5050 <div class="doc-row">
5051 <div class="doc-copy">
5052 <section class="swagger-request-body">
5053 <div class="prop-row">
5054 <div class="prop-name">
5055 <div class="swagger-request-model">
5056 <span class="">
5057 <a class="json-schema-ref" href="#/definitions/VideoChannelInput">VideoChannelInput</a>
5058 </span>
5059 </div>
5060 </div>
5061 <div class="prop-value columns small-6">
5062 <!-- <div class="swagger-request-description"> -->
5063 <p>undefined</p>
5064 <!-- </div> -->
5065 </div>
5066 </div>
5067 </section>
5068 <section class="swagger-request-params">
5069 <div class="prop-row prop-group">
5070 <div class="prop-name">
5071 <div class="prop-title">id:
5072 <span class="prop-type">
5073 <span class="json-property-type">string</span>
5074 <span class="json-property-range" title="Value limits"></span>
5075 </span>
5076 </div>
5077 <span class="json-property-required"></span>
5078 <div class="prop-subtitle"> in path </div>
5079 </div>
5080 <div class="prop-value">
5081 <p>The video channel id or uuid</p>
5082 </div>
5083 </div>
5084 </section>
5085 </div>
5086 <div class="doc-examples">
5087 <section>
5088 <h5>Request Content-Types:
5089 <span>application/json</span>
5090 </h5>
5091 <h5>Request Example</h5>
5092 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5093 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5094 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5095}
5096</code></pre>
5097 <!-- </div> -->
5098 </section>
5099 </div>
5100 </div>
5101 <div class="doc-row">
5102 <div class="doc-copy">
5103 <section class="swagger-responses">
5104 <div class="prop-row prop-group">
5105 <div class="prop-name">
5106 <div class="prop-title">204 No Content</div>
5107 </div>
5108 <div class="prop-value">
5109 <p>Successful operation</p>
5110 </div>
5111 </div>
5112 </section>
5113 </div>
5114 <div class="doc-examples">
5115 <h5>Response Content-Types:
5116 <span>application/json</span>
5117 </h5>
5118 </div>
5119 </div>
5120 <div class="doc-row">
5121 <div class="doc-copy">
5122 <section class="swagger-request-security">
5123 <table class="table">
5124 <thead>
5125 <tr>
5126 <th class="swagger-request-security-schema"></th>
5127 <th class="swagger-request-security-scopes"></th>
5128 </tr>
5129 </thead>
5130 <tbody>
5131 <tr>
5132 <td>
5133 <a href="#security-definition-OAuth2">OAuth2</a>
5134 </td>
5135 <td> </td>
5136 </tr>
5137 </tbody>
5138 </table>
5139 </section>
5140 </div>
5141 </div>
5142 </div>
5143 <div id="operation--video-channels--id--delete" class="operation panel" data-traverse-target="operation--video-channels--id--delete">
5144 <!-- <section class="operation-tags row"> -->
5145 <!-- <div class="doc-copy"> -->
5146 <div class="operation-tags">
5147 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5148 <!---->
5149 </div>
5150 <!-- </div> -->
5151 <!-- </section> -->
5152 <h2 class="operation-title">
5153 <span class="operation-name">
5154 <span class="operation-name">DELETE</span>
5155 <span class="operation-path">/video-channels/{id}</span>
5156 </span>
5157 </h2>
5158 <div class="doc-row">
5159 <div class="doc-copy">
5160 <section class="swagger-request-params">
5161 <div class="prop-row prop-group">
5162 <div class="prop-name">
5163 <div class="prop-title">id:
5164 <span class="prop-type">
5165 <span class="json-property-type">string</span>
5166 <span class="json-property-range" title="Value limits"></span>
5167 </span>
5168 </div>
5169 <span class="json-property-required"></span>
5170 <div class="prop-subtitle"> in path </div>
5171 </div>
5172 <div class="prop-value">
5173 <p>The video channel id or uuid</p>
5174 </div>
5175 </div>
5176 </section>
5177 </div>
5178 <div class="doc-examples"></div>
5179 </div>
5180 <div class="doc-row">
5181 <div class="doc-copy">
5182 <section class="swagger-responses">
5183 <div class="prop-row prop-group">
5184 <div class="prop-name">
5185 <div class="prop-title">204 No Content</div>
5186 </div>
5187 <div class="prop-value">
5188 <p>Successful operation</p>
5189 </div>
5190 </div>
5191 </section>
5192 </div>
5193 <div class="doc-examples">
5194 <h5>Response Content-Types:
5195 <span>application/json</span>
5196 </h5>
5197 </div>
5198 </div>
5199 <div class="doc-row">
5200 <div class="doc-copy">
5201 <section class="swagger-request-security">
5202 <table class="table">
5203 <thead>
5204 <tr>
5205 <th class="swagger-request-security-schema"></th>
5206 <th class="swagger-request-security-scopes"></th>
5207 </tr>
5208 </thead>
5209 <tbody>
5210 <tr>
5211 <td>
5212 <a href="#security-definition-OAuth2">OAuth2</a>
5213 </td>
5214 <td> </td>
5215 </tr>
5216 </tbody>
5217 </table>
5218 </section>
5219 </div>
5220 </div>
5221 </div>
5222 <div id="operation--video-channels--id--videos-get" class="operation panel" data-traverse-target="operation--video-channels--id--videos-get">
5223 <!-- <section class="operation-tags row"> -->
5224 <!-- <div class="doc-copy"> -->
5225 <div class="operation-tags">
5226 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5227 <!---->
5228 </div>
5229 <!-- </div> -->
5230 <!-- </section> -->
5231 <h2 class="operation-title">
5232 <span class="operation-name">
5233 <span class="operation-name">GET</span>
5234 <span class="operation-path">/video-channels/{id}/videos</span>
5235 </span>
5236 </h2>
5237 <div class="doc-row">
5238 <div class="doc-copy">
5239 <section class="swagger-request-params">
5240 <div class="prop-row prop-group">
5241 <div class="prop-name">
5242 <div class="prop-title">id:
5243 <span class="prop-type">
5244 <span class="json-property-type">string</span>
5245 <span class="json-property-range" title="Value limits"></span>
5246 </span>
5247 </div>
5248 <span class="json-property-required"></span>
5249 <div class="prop-subtitle"> in path </div>
5250 </div>
5251 <div class="prop-value">
5252 <p>The video channel id or uuid</p>
5253 </div>
5254 </div>
5255 </section>
5256 </div>
5257 <div class="doc-examples"></div>
5258 </div>
5259 <div class="doc-row">
5260 <div class="doc-copy">
5261 <section class="swagger-responses">
5262 <div class="prop-row prop-group">
5263 <div class="prop-name">
5264 <div class="prop-title">200 OK</div>
5265 <div class="prop-ref">
5266 <span class="">
5267 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
5268 </span>
5269 </div>
5270 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5271 </div>
5272 <div class="prop-value">
5273 <p>successful operation</p>
5274 </div>
5275 </div>
5276 </section>
5277 </div>
5278 <div class="doc-examples">
5279 <h5>Response Content-Types:
5280 <span>application/json</span>
5281 </h5>
5282 <section>
5283 <h5>Response Example
5284 <span>(200 OK)</span>
5285 </h5>
5286 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5287 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5288 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5289 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5290 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5291 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5292 <span class="hljs-attr">&quot;category&quot;</span>: {
5293 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5294 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5295 },
5296 <span class="hljs-attr">&quot;licence&quot;</span>: {
5297 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5298 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5299 },
5300 <span class="hljs-attr">&quot;language&quot;</span>: {
5301 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5302 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5303 },
5304 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5305 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5306 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5307 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5308 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5309 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5310 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5311 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5312 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5313 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5314 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5315 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5316 <span class="hljs-attr">&quot;account&quot;</span>: {
5317 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5318 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5319 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5320 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5321 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5322 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5323 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5324 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5325 }
5326 }
5327}
5328</code></pre>
5329 <!-- </div> -->
5330 </section>
5331 </div>
5332 </div>
5333 </div>
5334 <div id="operation--accounts--name--video-channels-get" class="operation panel" data-traverse-target="operation--accounts--name--video-channels-get">
5335 <!-- <section class="operation-tags row"> -->
5336 <!-- <div class="doc-copy"> -->
5337 <div class="operation-tags">
5338 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5339 <!---->
5340 </div>
5341 <!-- </div> -->
5342 <!-- </section> -->
5343 <h2 class="operation-title">
5344 <span class="operation-name">
5345 <span class="operation-name">GET</span>
5346 <span class="operation-path">/accounts/{name}/video-channels</span>
5347 </span>
5348 </h2>
5349 <div class="doc-row">
5350 <div class="doc-copy">
5351 <section class="swagger-request-params">
5352 <div class="prop-row prop-group">
5353 <div class="prop-name">
5354 <div class="prop-title">name:
5355 <span class="prop-type">
5356 <span class="json-property-type">string</span>
5357 <span class="json-property-range" title="Value limits"></span>
5358 </span>
5359 </div>
5360 <span class="json-property-required"></span>
5361 <div class="prop-subtitle"> in path </div>
5362 </div>
5363 <div class="prop-value">
5364 <p>The name of the account (chocobozzz or
5365 <a href="mailto:chocobozzz@peertube.cpy.re">chocobozzz@peertube.cpy.re</a> for example)</p>
5366 </div>
5367 </div>
5368 </section>
5369 </div>
5370 <div class="doc-examples"></div>
5371 </div>
5372 <div class="doc-row">
5373 <div class="doc-copy">
5374 <section class="swagger-responses">
5375 <div class="prop-row prop-group">
5376 <div class="prop-name">
5377 <div class="prop-title">200 OK</div>
5378 <div class="prop-ref">
5379 <span class="json-schema-ref-array">
5380 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
5381 </span>
5382 </div>
5383 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5384 </div>
5385 <div class="prop-value">
5386 <p>successful operation</p>
5387 </div>
5388 </div>
5389 <div class="prop-row prop-inner">
5390 <div class="prop-name">type</div>
5391 <div class="prop-value">
5392 <span class="json-property-type">
5393 <span class="json-schema-ref-array">
5394 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
5395 </span>
5396 </span>
5397 <span class="json-property-range" title="Value limits"></span>
5398 </div>
5399 </div>
5400 </section>
5401 </div>
5402 <div class="doc-examples">
5403 <h5>Response Content-Types:
5404 <span>application/json</span>
5405 </h5>
5406 <section>
5407 <h5>Response Example
5408 <span>(200 OK)</span>
5409 </h5>
5410 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
5411 {
5412 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5413 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5414 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5415 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
5416 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5417 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5418 }
5419 }
5420]
5421</code></pre>
5422 <!-- </div> -->
5423 </section>
5424 </div>
5425 </div>
5426 </div>
5427 <h1 id="tag-VideoComment" class="swagger-summary-tag" data-traverse-target="tag-VideoComment">VideoComment</h1>
5428 <div id="operation--videos--id--comment-threads-get" class="operation panel" data-traverse-target="operation--videos--id--comment-threads-get">
5429 <!-- <section class="operation-tags row"> -->
5430 <!-- <div class="doc-copy"> -->
5431 <div class="operation-tags">
5432 <a class="label" href="#tag-VideoComment">VideoComment</a>
5433 <!---->
5434 </div>
5435 <!-- </div> -->
5436 <!-- </section> -->
5437 <h2 class="operation-title">
5438 <span class="operation-name">
5439 <span class="operation-name">GET</span>
5440 <span class="operation-path">/videos/{id}/comment-threads</span>
5441 </span>
5442 </h2>
5443 <div class="doc-row">
5444 <div class="doc-copy">
5445 <section class="swagger-request-params">
5446 <div class="prop-row prop-group">
5447 <div class="prop-name">
5448 <div class="prop-title">id:
5449 <span class="prop-type">
5450 <span class="json-property-type">string</span>
5451 <span class="json-property-range" title="Value limits"></span>
5452 </span>
5453 </div>
5454 <span class="json-property-required"></span>
5455 <div class="prop-subtitle"> in path </div>
5456 </div>
5457 <div class="prop-value">
5458 <p>The video id or uuid</p>
5459 </div>
5460 </div>
5461 <div class="prop-row prop-group">
5462 <div class="prop-name">
5463 <div class="prop-title">start:
5464 <span class="prop-type">
5465 <span class="json-property-type">number</span>
5466 <span class="json-property-range" title="Value limits"></span>
5467 </span>
5468 </div>
5469 <div class="prop-subtitle"> in query </div>
5470 </div>
5471 <div class="prop-value">
5472 <p>Offset</p>
5473 </div>
5474 </div>
5475 <div class="prop-row prop-group">
5476 <div class="prop-name">
5477 <div class="prop-title">count:
5478 <span class="prop-type">
5479 <span class="json-property-type">number</span>
5480 <span class="json-property-range" title="Value limits"></span>
5481 </span>
5482 </div>
5483 <div class="prop-subtitle"> in query </div>
5484 </div>
5485 <div class="prop-value">
5486 <p>Number of items</p>
5487 </div>
5488 </div>
5489 <div class="prop-row prop-group">
5490 <div class="prop-name">
5491 <div class="prop-title">sort:
5492 <span class="prop-type">
5493 <span class="json-property-type">string</span>
5494 <span class="json-property-range" title="Value limits"></span>
5495 </span>
5496 </div>
5497 <div class="prop-subtitle"> in query </div>
5498 </div>
5499 <div class="prop-value">
5500 <p>Sort column (-createdAt for example)</p>
5501 </div>
5502 </div>
5503 </section>
5504 </div>
5505 <div class="doc-examples"></div>
5506 </div>
5507 <div class="doc-row">
5508 <div class="doc-copy">
5509 <section class="swagger-responses">
5510 <div class="prop-row prop-group">
5511 <div class="prop-name">
5512 <div class="prop-title">200 OK</div>
5513 <div class="prop-ref">
5514 <span class="">
5515 <a class="json-schema-ref" href="#/definitions/CommentThreadResponse">CommentThreadResponse</a>
5516 </span>
5517 </div>
5518 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5519 </div>
5520 <div class="prop-value">
5521 <p>successful operation</p>
5522 </div>
5523 </div>
5524 </section>
5525 </div>
5526 <div class="doc-examples">
5527 <h5>Response Content-Types:
5528 <span>application/json</span>
5529 </h5>
5530 <section>
5531 <h5>Response Example
5532 <span>(200 OK)</span>
5533 </h5>
5534 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5535 <span class="hljs-attr">&quot;total&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5536 <span class="hljs-attr">&quot;data&quot;</span>: [
5537 {
5538 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5539 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5540 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5541 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5542 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5543 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5544 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5545 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5546 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5547 <span class="hljs-attr">&quot;account&quot;</span>: {
5548 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5549 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5550 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5551 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5552 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5553 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5554 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5555 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5556 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5557 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5558 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5559 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5560 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5561 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5562 }
5563 }
5564 }
5565 ]
5566}
5567</code></pre>
5568 <!-- </div> -->
5569 </section>
5570 </div>
5571 </div>
5572 </div>
5573 <div id="operation--videos--id--comment-threads-post" class="operation panel" data-traverse-target="operation--videos--id--comment-threads-post">
5574 <!-- <section class="operation-tags row"> -->
5575 <!-- <div class="doc-copy"> -->
5576 <div class="operation-tags">
5577 <a class="label" href="#tag-VideoComment">VideoComment</a>
5578 <!---->
5579 </div>
5580 <!-- </div> -->
5581 <!-- </section> -->
5582 <h2 class="operation-title">
5583 <span class="operation-name">
5584 <span class="operation-name">POST</span>
5585 <span class="operation-path">/videos/{id}/comment-threads</span>
5586 </span>
5587 </h2>
5588 <div class="doc-row">
5589 <div class="doc-copy">
5590 <section class="swagger-request-params">
5591 <div class="prop-row prop-group">
5592 <div class="prop-name">
5593 <div class="prop-title">id:
5594 <span class="prop-type">
5595 <span class="json-property-type">string</span>
5596 <span class="json-property-range" title="Value limits"></span>
5597 </span>
5598 </div>
5599 <span class="json-property-required"></span>
5600 <div class="prop-subtitle"> in path </div>
5601 </div>
5602 <div class="prop-value">
5603 <p>The video id or uuid</p>
5604 </div>
5605 </div>
5606 </section>
5607 </div>
5608 <div class="doc-examples"></div>
5609 </div>
5610 <div class="doc-row">
5611 <div class="doc-copy">
5612 <section class="swagger-responses">
5613 <div class="prop-row prop-group">
5614 <div class="prop-name">
5615 <div class="prop-title">200 OK</div>
5616 <div class="prop-ref">
5617 <span class="">
5618 <a class="json-schema-ref" href="#/definitions/CommentThreadPostResponse">CommentThreadPostResponse</a>
5619 </span>
5620 </div>
5621 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5622 </div>
5623 <div class="prop-value">
5624 <p>successful operation</p>
5625 </div>
5626 </div>
5627 </section>
5628 </div>
5629 <div class="doc-examples">
5630 <h5>Response Content-Types:
5631 <span>application/json</span>
5632 </h5>
5633 <section>
5634 <h5>Response Example
5635 <span>(200 OK)</span>
5636 </h5>
5637 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5638 <span class="hljs-attr">&quot;comment&quot;</span>: {
5639 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5640 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5641 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5642 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5643 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5644 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5645 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5646 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5647 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5648 <span class="hljs-attr">&quot;account&quot;</span>: {
5649 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5650 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5651 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5652 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5653 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5654 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5655 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5656 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5657 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5658 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5659 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5660 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5661 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5662 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5663 }
5664 }
5665 }
5666}
5667</code></pre>
5668 <!-- </div> -->
5669 </section>
5670 </div>
5671 </div>
5672 <div class="doc-row">
5673 <div class="doc-copy">
5674 <section class="swagger-request-security">
5675 <table class="table">
5676 <thead>
5677 <tr>
5678 <th class="swagger-request-security-schema"></th>
5679 <th class="swagger-request-security-scopes"></th>
5680 </tr>
5681 </thead>
5682 <tbody>
5683 <tr>
5684 <td>
5685 <a href="#security-definition-OAuth2">OAuth2</a>
5686 </td>
5687 <td> </td>
5688 </tr>
5689 </tbody>
5690 </table>
5691 </section>
5692 </div>
5693 </div>
5694 </div>
5695 <div id="operation--videos--id--comment-threads--threadId--get" class="operation panel" data-traverse-target="operation--videos--id--comment-threads--threadId--get">
5696 <!-- <section class="operation-tags row"> -->
5697 <!-- <div class="doc-copy"> -->
5698 <div class="operation-tags">
5699 <a class="label" href="#tag-VideoComment">VideoComment</a>
5700 <!---->
5701 </div>
5702 <!-- </div> -->
5703 <!-- </section> -->
5704 <h2 class="operation-title">
5705 <span class="operation-name">
5706 <span class="operation-name">GET</span>
5707 <span class="operation-path">/videos/{id}/comment-threads/{threadId}</span>
5708 </span>
5709 </h2>
5710 <div class="doc-row">
5711 <div class="doc-copy">
5712 <section class="swagger-request-params">
5713 <div class="prop-row prop-group">
5714 <div class="prop-name">
5715 <div class="prop-title">id:
5716 <span class="prop-type">
5717 <span class="json-property-type">string</span>
5718 <span class="json-property-range" title="Value limits"></span>
5719 </span>
5720 </div>
5721 <span class="json-property-required"></span>
5722 <div class="prop-subtitle"> in path </div>
5723 </div>
5724 <div class="prop-value">
5725 <p>The video id or uuid</p>
5726 </div>
5727 </div>
5728 <div class="prop-row prop-group">
5729 <div class="prop-name">
5730 <div class="prop-title">threadId:
5731 <span class="prop-type">
5732 <span class="json-property-type">number</span>
5733 <span class="json-property-range" title="Value limits"></span>
5734 </span>
5735 </div>
5736 <span class="json-property-required"></span>
5737 <div class="prop-subtitle"> in path </div>
5738 </div>
5739 <div class="prop-value">
5740 <p>The thread id (root comment id)</p>
5741 </div>
5742 </div>
5743 </section>
5744 </div>
5745 <div class="doc-examples"></div>
5746 </div>
5747 <div class="doc-row">
5748 <div class="doc-copy">
5749 <section class="swagger-responses">
5750 <div class="prop-row prop-group">
5751 <div class="prop-name">
5752 <div class="prop-title">200 OK</div>
5753 <div class="prop-ref">
5754 <span class="">
5755 <a class="json-schema-ref" href="#/definitions/VideoCommentThreadTree">VideoCommentThreadTree</a>
5756 </span>
5757 </div>
5758 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5759 </div>
5760 <div class="prop-value">
5761 <p>successful operation</p>
5762 </div>
5763 </div>
5764 </section>
5765 </div>
5766 <div class="doc-examples">
5767 <h5>Response Content-Types:
5768 <span>application/json</span>
5769 </h5>
5770 <section>
5771 <h5>Response Example
5772 <span>(200 OK)</span>
5773 </h5>
5774 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5775 <span class="hljs-attr">&quot;comment&quot;</span>: {
5776 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5777 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5778 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5779 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5780 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5781 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5782 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5783 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5784 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5785 <span class="hljs-attr">&quot;account&quot;</span>: {
5786 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5787 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5788 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5789 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5790 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5791 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5792 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5793 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5794 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5795 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5796 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5797 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5798 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5799 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5800 }
5801 }
5802 },
5803 <span class="hljs-attr">&quot;children&quot;</span>: [
5804 {
5805 <span class="hljs-attr">&quot;comment&quot;</span>: {
5806 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5807 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5808 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5809 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5810 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5811 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5812 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5813 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5814 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5815 <span class="hljs-attr">&quot;account&quot;</span>: {
5816 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5817 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5818 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5819 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5820 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5821 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5822 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5823 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5824 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5825 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5826 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5827 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5828 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5829 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5830 }
5831 }
5832 },
5833 <span class="hljs-attr">&quot;children&quot;</span>: [
5834 {
5835 <span class="hljs-attr">&quot;comment&quot;</span>: {
5836 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5837 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5838 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5839 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5840 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5841 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5842 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5843 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5844 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5845 <span class="hljs-attr">&quot;account&quot;</span>: {
5846 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5847 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5848 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5849 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5850 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5851 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5852 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5853 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5854 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5855 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5856 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5857 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5858 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5859 }
5860 }
5861 }
5862 }
5863 ]
5864 }
5865 ]
5866}
5867</code></pre>
5868 <!-- </div> -->
5869 </section>
5870 </div>
5871 </div>
5872 </div>
5873 <div id="operation--videos--id--comments--commentId--post" class="operation panel" data-traverse-target="operation--videos--id--comments--commentId--post">
5874 <!-- <section class="operation-tags row"> -->
5875 <!-- <div class="doc-copy"> -->
5876 <div class="operation-tags">
5877 <a class="label" href="#tag-VideoComment">VideoComment</a>
5878 <!---->
5879 </div>
5880 <!-- </div> -->
5881 <!-- </section> -->
5882 <h2 class="operation-title">
5883 <span class="operation-name">
5884 <span class="operation-name">POST</span>
5885 <span class="operation-path">/videos/{id}/comments/{commentId}</span>
5886 </span>
5887 </h2>
5888 <div class="doc-row">
5889 <div class="doc-copy">
5890 <section class="swagger-request-params">
5891 <div class="prop-row prop-group">
5892 <div class="prop-name">
5893 <div class="prop-title">id:
5894 <span class="prop-type">
5895 <span class="json-property-type">string</span>
5896 <span class="json-property-range" title="Value limits"></span>
5897 </span>
5898 </div>
5899 <span class="json-property-required"></span>
5900 <div class="prop-subtitle"> in path </div>
5901 </div>
5902 <div class="prop-value">
5903 <p>The video id or uuid</p>
5904 </div>
5905 </div>
5906 <div class="prop-row prop-group">
5907 <div class="prop-name">
5908 <div class="prop-title">threadId:
5909 <span class="prop-type">
5910 <span class="json-property-type">number</span>
5911 <span class="json-property-range" title="Value limits"></span>
5912 </span>
5913 </div>
5914 <span class="json-property-required"></span>
5915 <div class="prop-subtitle"> in path </div>
5916 </div>
5917 <div class="prop-value">
5918 <p>The comment id</p>
5919 </div>
5920 </div>
5921 </section>
5922 </div>
5923 <div class="doc-examples"></div>
5924 </div>
5925 <div class="doc-row">
5926 <div class="doc-copy">
5927 <section class="swagger-responses">
5928 <div class="prop-row prop-group">
5929 <div class="prop-name">
5930 <div class="prop-title">200 OK</div>
5931 <div class="prop-ref">
5932 <span class="">
5933 <a class="json-schema-ref" href="#/definitions/CommentThreadPostResponse">CommentThreadPostResponse</a>
5934 </span>
5935 </div>
5936 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5937 </div>
5938 <div class="prop-value">
5939 <p>successful operation</p>
5940 </div>
5941 </div>
5942 </section>
5943 </div>
5944 <div class="doc-examples">
5945 <h5>Response Content-Types:
5946 <span>application/json</span>
5947 </h5>
5948 <section>
5949 <h5>Response Example
5950 <span>(200 OK)</span>
5951 </h5>
5952 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5953 <span class="hljs-attr">&quot;comment&quot;</span>: {
5954 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5955 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5956 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5957 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5958 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5959 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5960 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5961 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5962 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5963 <span class="hljs-attr">&quot;account&quot;</span>: {
5964 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5965 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5966 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5967 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5968 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5969 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5970 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5971 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5972 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5973 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5974 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5975 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5976 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5977 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5978 }
5979 }
5980 }
5981}
5982</code></pre>
5983 <!-- </div> -->
5984 </section>
5985 </div>
5986 </div>
5987 <div class="doc-row">
5988 <div class="doc-copy">
5989 <section class="swagger-request-security">
5990 <table class="table">
5991 <thead>
5992 <tr>
5993 <th class="swagger-request-security-schema"></th>
5994 <th class="swagger-request-security-scopes"></th>
5995 </tr>
5996 </thead>
5997 <tbody>
5998 <tr>
5999 <td>
6000 <a href="#security-definition-OAuth2">OAuth2</a>
6001 </td>
6002 <td> </td>
6003 </tr>
6004 </tbody>
6005 </table>
6006 </section>
6007 </div>
6008 </div>
6009 </div>
6010 <div id="operation--videos--id--comments--commentId--delete" class="operation panel" data-traverse-target="operation--videos--id--comments--commentId--delete">
6011 <!-- <section class="operation-tags row"> -->
6012 <!-- <div class="doc-copy"> -->
6013 <div class="operation-tags">
6014 <a class="label" href="#tag-VideoComment">VideoComment</a>
6015 <!---->
6016 </div>
6017 <!-- </div> -->
6018 <!-- </section> -->
6019 <h2 class="operation-title">
6020 <span class="operation-name">
6021 <span class="operation-name">DELETE</span>
6022 <span class="operation-path">/videos/{id}/comments/{commentId}</span>
6023 </span>
6024 </h2>
6025 <div class="doc-row">
6026 <div class="doc-copy">
6027 <section class="swagger-request-params">
6028 <div class="prop-row prop-group">
6029 <div class="prop-name">
6030 <div class="prop-title">id:
6031 <span class="prop-type">
6032 <span class="json-property-type">string</span>
6033 <span class="json-property-range" title="Value limits"></span>
6034 </span>
6035 </div>
6036 <span class="json-property-required"></span>
6037 <div class="prop-subtitle"> in path </div>
6038 </div>
6039 <div class="prop-value">
6040 <p>The video id or uuid</p>
6041 </div>
6042 </div>
6043 <div class="prop-row prop-group">
6044 <div class="prop-name">
6045 <div class="prop-title">threadId:
6046 <span class="prop-type">
6047 <span class="json-property-type">number</span>
6048 <span class="json-property-range" title="Value limits"></span>
6049 </span>
6050 </div>
6051 <span class="json-property-required"></span>
6052 <div class="prop-subtitle"> in path </div>
6053 </div>
6054 <div class="prop-value">
6055 <p>The comment id</p>
6056 </div>
6057 </div>
6058 </section>
6059 </div>
6060 <div class="doc-examples"></div>
6061 </div>
6062 <div class="doc-row">
6063 <div class="doc-copy">
6064 <section class="swagger-responses">
6065 <div class="prop-row prop-group">
6066 <div class="prop-name">
6067 <div class="prop-title">204 No Content</div>
6068 </div>
6069 <div class="prop-value">
6070 <p>Successful operation</p>
6071 </div>
6072 </div>
6073 </section>
6074 </div>
6075 <div class="doc-examples">
6076 <h5>Response Content-Types:
6077 <span>application/json</span>
6078 </h5>
6079 </div>
6080 </div>
6081 <div class="doc-row">
6082 <div class="doc-copy">
6083 <section class="swagger-request-security">
6084 <table class="table">
6085 <thead>
6086 <tr>
6087 <th class="swagger-request-security-schema"></th>
6088 <th class="swagger-request-security-scopes"></th>
6089 </tr>
6090 </thead>
6091 <tbody>
6092 <tr>
6093 <td>
6094 <a href="#security-definition-OAuth2">OAuth2</a>
6095 </td>
6096 <td> </td>
6097 </tr>
6098 </tbody>
6099 </table>
6100 </section>
6101 </div>
6102 </div>
6103 </div>
6104 <h1 id="tag-VideoRate" class="swagger-summary-tag" data-traverse-target="tag-VideoRate">VideoRate</h1>
6105 <div id="operation--videos--id--rate-put" class="operation panel" data-traverse-target="operation--videos--id--rate-put">
6106 <!-- <section class="operation-tags row"> -->
6107 <!-- <div class="doc-copy"> -->
6108 <div class="operation-tags">
6109 <a class="label" href="#tag-VideoRate">VideoRate</a>
6110 <!---->
6111 </div>
6112 <!-- </div> -->
6113 <!-- </section> -->
6114 <h2 class="operation-title">
6115 <span class="operation-name">
6116 <span class="operation-name">PUT</span>
6117 <span class="operation-path">/videos/{id}/rate</span>
6118 </span>
6119 </h2>
6120 <div class="doc-row">
6121 <div class="doc-copy">
6122 <section class="swagger-request-params">
6123 <div class="prop-row prop-group">
6124 <div class="prop-name">
6125 <div class="prop-title">id:
6126 <span class="prop-type">
6127 <span class="json-property-type">string</span>
6128 <span class="json-property-range" title="Value limits"></span>
6129 </span>
6130 </div>
6131 <span class="json-property-required"></span>
6132 <div class="prop-subtitle"> in path </div>
6133 </div>
6134 <div class="prop-value">
6135 <p>The video id or uuid</p>
6136 </div>
6137 </div>
6138 </section>
6139 </div>
6140 <div class="doc-examples"></div>
6141 </div>
6142 <div class="doc-row">
6143 <div class="doc-copy">
6144 <section class="swagger-responses">
6145 <div class="prop-row prop-group">
6146 <div class="prop-name">
6147 <div class="prop-title">204 No Content</div>
6148 </div>
6149 <div class="prop-value">
6150 <p>Successful operation</p>
6151 </div>
6152 </div>
6153 </section>
6154 </div>
6155 <div class="doc-examples">
6156 <h5>Response Content-Types:
6157 <span>application/json</span>
6158 </h5>
6159 </div>
6160 </div>
6161 <div class="doc-row">
6162 <div class="doc-copy">
6163 <section class="swagger-request-security">
6164 <table class="table">
6165 <thead>
6166 <tr>
6167 <th class="swagger-request-security-schema"></th>
6168 <th class="swagger-request-security-scopes"></th>
6169 </tr>
6170 </thead>
6171 <tbody>
6172 <tr>
6173 <td>
6174 <a href="#security-definition-OAuth2">OAuth2</a>
6175 </td>
6176 <td> </td>
6177 </tr>
6178 </tbody>
6179 </table>
6180 </section>
6181 </div>
6182 </div>
6183 </div>
6184 <h1 id="tag-Search" class="swagger-summary-tag" data-traverse-target="tag-Search">Search</h1>
6185 <div id="operation--search-videos-get" class="operation panel" data-traverse-target="operation--search-videos-get">
6186 <!-- <section class="operation-tags row"> -->
6187 <!-- <div class="doc-copy"> -->
6188 <div class="operation-tags">
6189 <a class="label" href="#tag-Search">Search</a>
6190 <!---->
6191 </div>
6192 <!-- </div> -->
6193 <!-- </section> -->
6194 <h2 class="operation-title">
6195 <span class="operation-name">
6196 <span class="operation-name">GET</span>
6197 <span class="operation-path">/search/videos</span>
6198 </span>
6199 </h2>
6200 <div class="doc-row">
6201 <div class="doc-copy">
6202 <section class="swagger-request-params">
6203 <div class="prop-row prop-group">
6204 <div class="prop-name">
6205 <div class="prop-title">start:
6206 <span class="prop-type">
6207 <span class="json-property-type">number</span>
6208 <span class="json-property-range" title="Value limits"></span>
6209 </span>
6210 </div>
6211 <div class="prop-subtitle"> in query </div>
6212 </div>
6213 <div class="prop-value">
6214 <p>Offset</p>
6215 </div>
6216 </div>
6217 <div class="prop-row prop-group">
6218 <div class="prop-name">
6219 <div class="prop-title">count:
6220 <span class="prop-type">
6221 <span class="json-property-type">number</span>
6222 <span class="json-property-range" title="Value limits"></span>
6223 </span>
6224 </div>
6225 <div class="prop-subtitle"> in query </div>
6226 </div>
6227 <div class="prop-value">
6228 <p>Number of items</p>
6229 </div>
6230 </div>
6231 <div class="prop-row prop-group">
6232 <div class="prop-name">
6233 <div class="prop-title">sort:
6234 <span class="prop-type">
6235 <span class="json-property-type">string</span>
6236 <span class="json-property-range" title="Value limits"></span>
6237 </span>
6238 </div>
6239 <div class="prop-subtitle"> in query </div>
6240 </div>
6241 <div class="prop-value">
6242 <p>Sort column (-createdAt for example)</p>
6243 </div>
6244 </div>
6245 <div class="prop-row prop-group">
6246 <div class="prop-name">
6247 <div class="prop-title">search:
6248 <span class="prop-type">
6249 <span class="json-property-type">string</span>
6250 <span class="json-property-range" title="Value limits"></span>
6251 </span>
6252 </div>
6253 <span class="json-property-required"></span>
6254 <div class="prop-subtitle"> in query </div>
6255 </div>
6256 <div class="prop-value">
6257 <p>String to search</p>
6258 </div>
6259 </div>
6260 </section>
6261 </div>
6262 <div class="doc-examples"></div>
6263 </div>
6264 <div class="doc-row">
6265 <div class="doc-copy">
6266 <section class="swagger-responses">
6267 <div class="prop-row prop-group">
6268 <div class="prop-name">
6269 <div class="prop-title">200 OK</div>
6270 <div class="prop-ref">
6271 <span class="json-schema-ref-array">
6272 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
6273 </span>
6274 </div>
6275 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
6276 </div>
6277 <div class="prop-value">
6278 <p>successful operation</p>
6279 </div>
6280 </div>
6281 <div class="prop-row prop-inner">
6282 <div class="prop-name">type</div>
6283 <div class="prop-value">
6284 <span class="json-property-type">
6285 <span class="json-schema-ref-array">
6286 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
6287 </span>
6288 </span>
6289 <span class="json-property-range" title="Value limits"></span>
6290 </div>
6291 </div>
6292 </section>
6293 </div>
6294 <div class="doc-examples">
6295 <h5>Response Content-Types:
6296 <span>application/json</span>
6297 </h5>
6298 <section>
6299 <h5>Response Example
6300 <span>(200 OK)</span>
6301 </h5>
6302 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
6303 {
6304 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6305 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6306 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6307 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6308 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6309 <span class="hljs-attr">&quot;category&quot;</span>: {
6310 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6311 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6312 },
6313 <span class="hljs-attr">&quot;licence&quot;</span>: {
6314 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6315 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6316 },
6317 <span class="hljs-attr">&quot;language&quot;</span>: {
6318 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6319 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6320 },
6321 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6322 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6323 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6324 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6325 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6326 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6327 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6328 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6329 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6330 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6331 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6332 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6333 <span class="hljs-attr">&quot;account&quot;</span>: {
6334 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6335 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6336 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6337 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6338 <span class="hljs-attr">&quot;avatar&quot;</span>: {
6339 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6340 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6341 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6342 }
6343 }
6344 }
6345]
6346</code></pre>
6347 <!-- </div> -->
6348 </section>
6349 </div>
6350 </div>
6351 </div>
6352 <h1>Schema Definitions</h1>
6353 <div id="definition-VideoConstantNumber" class="definition panel" data-traverse-target="definition-VideoConstantNumber">
6354 <h2 class="panel-title">
6355 <a name="/definitions/VideoConstantNumber"></a>VideoConstantNumber:
6356 <!-- <span class="json-property-type">
6357 <span class="json-property-type">object</span>
6358 <span class="json-property-range" title="Value limits"></span>
6359
6360
6361 </span> -->
6362 </h2>
6363 <div class="doc-row">
6364 <div class="doc-copy">
6365 <section class="json-schema-properties">
6366 <dl>
6367 <dt data-property-name="id">
6368 <span class="json-property-name">id:</span>
6369 <span class="json-property-type">number</span>
6370 <span class="json-property-range" title="Value limits"></span>
6371 </dt>
6372 <dt data-property-name="label">
6373 <span class="json-property-name">label:</span>
6374 <span class="json-property-type">string</span>
6375 <span class="json-property-range" title="Value limits"></span>
6376 </dt>
6377 </dl>
6378 </section>
6379 </div>
6380 <div class="doc-examples">
6381 <section>
6382 <h5>Example</h5>
6383 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6384 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6385 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6386}
6387</code></pre>
6388 <!-- </div> -->
6389 </section>
6390 </div>
6391 </div>
6392 </div>
6393 <div id="definition-VideoConstantString" class="definition panel" data-traverse-target="definition-VideoConstantString">
6394 <h2 class="panel-title">
6395 <a name="/definitions/VideoConstantString"></a>VideoConstantString:
6396 <!-- <span class="json-property-type">
6397 <span class="json-property-type">object</span>
6398 <span class="json-property-range" title="Value limits"></span>
6399
6400
6401 </span> -->
6402 </h2>
6403 <div class="doc-row">
6404 <div class="doc-copy">
6405 <section class="json-schema-properties">
6406 <dl>
6407 <dt data-property-name="id">
6408 <span class="json-property-name">id:</span>
6409 <span class="json-property-type">string</span>
6410 <span class="json-property-range" title="Value limits"></span>
6411 </dt>
6412 <dt data-property-name="label">
6413 <span class="json-property-name">label:</span>
6414 <span class="json-property-type">string</span>
6415 <span class="json-property-range" title="Value limits"></span>
6416 </dt>
6417 </dl>
6418 </section>
6419 </div>
6420 <div class="doc-examples">
6421 <section>
6422 <h5>Example</h5>
6423 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6424 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6425 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6426}
6427</code></pre>
6428 <!-- </div> -->
6429 </section>
6430 </div>
6431 </div>
6432 </div>
6433 <div id="definition-VideoPrivacy" class="definition panel" data-traverse-target="definition-VideoPrivacy">
6434 <h2 class="panel-title">
6435 <a name="/definitions/VideoPrivacy"></a>VideoPrivacy: string
6436 <!-- <span class="json-property-type">
6437 <span class="json-property-type">string</span> <span class="json-property-enum" title="Possible values">
6438 <span class="json-property-enum-item">Public</span>,
6439 <span class="json-property-enum-item">Unlisted</span>,
6440 <span class="json-property-enum-item">Private</span>
6441 </span>
6442 <span class="json-property-range" title="Value limits"></span>
6443
6444
6445 </span> -->
6446 </h2>
6447 <div class="doc-row">
6448 <div class="doc-copy">
6449 <span class="json-property-type">string</span>
6450 <span class="json-property-enum" title="Possible values">
6451 <span class="json-property-enum-item">Public</span>,
6452 <span class="json-property-enum-item">Unlisted</span>,
6453 <span class="json-property-enum-item">Private</span>
6454 </span>
6455 <span class="json-property-range" title="Value limits"></span>
6456 </div>
6457 </div>
6458 </div>
6459 <div id="definition-Video" class="definition panel" data-traverse-target="definition-Video">
6460 <h2 class="panel-title">
6461 <a name="/definitions/Video"></a>Video:
6462 <!-- <span class="json-property-type">
6463 <span class="json-property-type">object</span>
6464 <span class="json-property-range" title="Value limits"></span>
6465
6466
6467 </span> -->
6468 </h2>
6469 <div class="doc-row">
6470 <div class="doc-copy">
6471 <section class="json-schema-properties">
6472 <dl>
6473 <dt data-property-name="id">
6474 <span class="json-property-name">id:</span>
6475 <span class="json-property-type">number</span>
6476 <span class="json-property-range" title="Value limits"></span>
6477 </dt>
6478 <dt data-property-name="uuid">
6479 <span class="json-property-name">uuid:</span>
6480 <span class="json-property-type">string</span>
6481 <span class="json-property-range" title="Value limits"></span>
6482 </dt>
6483 <dt data-property-name="createdAt">
6484 <span class="json-property-name">createdAt:</span>
6485 <span class="json-property-type">string</span>
6486 <span class="json-property-range" title="Value limits"></span>
6487 </dt>
6488 <dt data-property-name="publishedAt">
6489 <span class="json-property-name">publishedAt:</span>
6490 <span class="json-property-type">string</span>
6491 <span class="json-property-range" title="Value limits"></span>
6492 </dt>
6493 <dt data-property-name="updatedAt">
6494 <span class="json-property-name">updatedAt:</span>
6495 <span class="json-property-type">string</span>
6496 <span class="json-property-range" title="Value limits"></span>
6497 </dt>
6498 <dt data-property-name="category">
6499 <span class="json-property-name">category:</span>
6500 <span class="json-property-type">
6501 <span class="">
6502 <a class="json-schema-ref" href="#/definitions/VideoConstantNumber">VideoConstantNumber</a>
6503 </span>
6504 </span>
6505 <span class="json-property-range" title="Value limits"></span>
6506 </dt>
6507 <dt data-property-name="licence">
6508 <span class="json-property-name">licence:</span>
6509 <span class="json-property-type">
6510 <span class="">
6511 <a class="json-schema-ref" href="#/definitions/VideoConstantNumber">VideoConstantNumber</a>
6512 </span>
6513 </span>
6514 <span class="json-property-range" title="Value limits"></span>
6515 </dt>
6516 <dt data-property-name="language">
6517 <span class="json-property-name">language:</span>
6518 <span class="json-property-type">
6519 <span class="">
6520 <a class="json-schema-ref" href="#/definitions/VideoConstantString">VideoConstantString</a>
6521 </span>
6522 </span>
6523 <span class="json-property-range" title="Value limits"></span>
6524 </dt>
6525 <dt data-property-name="privacy">
6526 <span class="json-property-name">privacy:</span>
6527 <span class="json-property-type">
6528 <span class="">
6529 <a class="json-schema-ref" href="#/definitions/VideoPrivacy">VideoPrivacy</a>
6530 </span>
6531 </span>
6532 <span class="json-property-range" title="Value limits"></span>
6533 </dt>
6534 <dt data-property-name="description">
6535 <span class="json-property-name">description:</span>
6536 <span class="json-property-type">string</span>
6537 <span class="json-property-range" title="Value limits"></span>
6538 </dt>
6539 <dt data-property-name="duration">
6540 <span class="json-property-name">duration:</span>
6541 <span class="json-property-type">number</span>
6542 <span class="json-property-range" title="Value limits"></span>
6543 </dt>
6544 <dt data-property-name="isLocal">
6545 <span class="json-property-name">isLocal:</span>
6546 <span class="json-property-type">boolean</span>
6547 <span class="json-property-range" title="Value limits"></span>
6548 </dt>
6549 <dt data-property-name="name">
6550 <span class="json-property-name">name:</span>
6551 <span class="json-property-type">string</span>
6552 <span class="json-property-range" title="Value limits"></span>
6553 </dt>
6554 <dt data-property-name="thumbnailPath">
6555 <span class="json-property-name">thumbnailPath:</span>
6556 <span class="json-property-type">string</span>
6557 <span class="json-property-range" title="Value limits"></span>
6558 </dt>
6559 <dt data-property-name="previewPath">
6560 <span class="json-property-name">previewPath:</span>
6561 <span class="json-property-type">string</span>
6562 <span class="json-property-range" title="Value limits"></span>
6563 </dt>
6564 <dt data-property-name="embedPath">
6565 <span class="json-property-name">embedPath:</span>
6566 <span class="json-property-type">string</span>
6567 <span class="json-property-range" title="Value limits"></span>
6568 </dt>
6569 <dt data-property-name="views">
6570 <span class="json-property-name">views:</span>
6571 <span class="json-property-type">number</span>
6572 <span class="json-property-range" title="Value limits"></span>
6573 </dt>
6574 <dt data-property-name="likes">
6575 <span class="json-property-name">likes:</span>
6576 <span class="json-property-type">number</span>
6577 <span class="json-property-range" title="Value limits"></span>
6578 </dt>
6579 <dt data-property-name="dislikes">
6580 <span class="json-property-name">dislikes:</span>
6581 <span class="json-property-type">number</span>
6582 <span class="json-property-range" title="Value limits"></span>
6583 </dt>
6584 <dt data-property-name="nsfw">
6585 <span class="json-property-name">nsfw:</span>
6586 <span class="json-property-type">boolean</span>
6587 <span class="json-property-range" title="Value limits"></span>
6588 </dt>
6589 <dt data-property-name="account">
6590 <span class="json-property-name">account:</span>
6591 <span class="json-property-type">object</span>
6592 <span class="json-property-range" title="Value limits"></span>
6593 </dt>
6594 <dt class="json-inner-schema">
6595 <section class="json-schema-properties">
6596 <dl>
6597 <dt data-property-name="name">
6598 <span class="json-property-name">name:</span>
6599 <span class="json-property-type">string</span>
6600 <span class="json-property-range" title="Value limits"></span>
6601 </dt>
6602 <dt data-property-name="displayName">
6603 <span class="json-property-name">displayName:</span>
6604 <span class="json-property-type">string</span>
6605 <span class="json-property-range" title="Value limits"></span>
6606 </dt>
6607 <dt data-property-name="url">
6608 <span class="json-property-name">url:</span>
6609 <span class="json-property-type">string</span>
6610 <span class="json-property-range" title="Value limits"></span>
6611 </dt>
6612 <dt data-property-name="host">
6613 <span class="json-property-name">host:</span>
6614 <span class="json-property-type">string</span>
6615 <span class="json-property-range" title="Value limits"></span>
6616 </dt>
6617 <dt data-property-name="avatar">
6618 <span class="json-property-name">avatar:</span>
6619 <span class="json-property-type">
6620 <span class="">
6621 <a class="json-schema-ref" href="#/definitions/Avatar">Avatar</a>
6622 </span>
6623 </span>
6624 <span class="json-property-range" title="Value limits"></span>
6625 </dt>
6626 </dl>
6627 </section>
6628 </dt>
6629 </dl>
6630 </section>
6631 </div>
6632 <div class="doc-examples">
6633 <section>
6634 <h5>Example</h5>
6635 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6636 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6637 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6638 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6639 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6640 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6641 <span class="hljs-attr">&quot;category&quot;</span>: {
6642 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6643 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6644 },
6645 <span class="hljs-attr">&quot;licence&quot;</span>: {
6646 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6647 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6648 },
6649 <span class="hljs-attr">&quot;language&quot;</span>: {
6650 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6651 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6652 },
6653 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6654 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6655 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6656 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6657 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6658 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6659 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6660 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6661 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6662 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6663 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6664 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6665 <span class="hljs-attr">&quot;account&quot;</span>: {
6666 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6667 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6668 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6669 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6670 <span class="hljs-attr">&quot;avatar&quot;</span>: {
6671 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6672 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6673 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6674 }
6675 }
6676}
6677</code></pre>
6678 <!-- </div> -->
6679 </section>
6680 </div>
6681 </div>
6682 </div>
6683 <div id="definition-VideoAbuse" class="definition panel" data-traverse-target="definition-VideoAbuse">
6684 <h2 class="panel-title">
6685 <a name="/definitions/VideoAbuse"></a>VideoAbuse:
6686 <!-- <span class="json-property-type">
6687 <span class="json-property-type">object</span>
6688 <span class="json-property-range" title="Value limits"></span>
6689
6690
6691 </span> -->
6692 </h2>
6693 <div class="doc-row">
6694 <div class="doc-copy">
6695 <section class="json-schema-properties">
6696 <dl>
6697 <dt data-property-name="id">
6698 <span class="json-property-name">id:</span>
6699 <span class="json-property-type">number</span>
6700 <span class="json-property-range" title="Value limits"></span>
6701 </dt>
6702 <dt data-property-name="reason">
6703 <span class="json-property-name">reason:</span>
6704 <span class="json-property-type">string</span>
6705 <span class="json-property-range" title="Value limits"></span>
6706 </dt>
6707 <dt data-property-name="reporterAccount">
6708 <span class="json-property-name">reporterAccount:</span>
6709 <span class="json-property-type">
6710 <span class="">
6711 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
6712 </span>
6713 </span>
6714 <span class="json-property-range" title="Value limits"></span>
6715 </dt>
6716 <dt data-property-name="video">
6717 <span class="json-property-name">video:</span>
6718 <span class="json-property-type">object</span>
6719 <span class="json-property-range" title="Value limits"></span>
6720 </dt>
6721 <dt class="json-inner-schema">
6722 <section class="json-schema-properties">
6723 <dl>
6724 <dt data-property-name="id">
6725 <span class="json-property-name">id:</span>
6726 <span class="json-property-type">number</span>
6727 <span class="json-property-range" title="Value limits"></span>
6728 </dt>
6729 <dt data-property-name="name">
6730 <span class="json-property-name">name:</span>
6731 <span class="json-property-type">string</span>
6732 <span class="json-property-range" title="Value limits"></span>
6733 </dt>
6734 <dt data-property-name="uuid">
6735 <span class="json-property-name">uuid:</span>
6736 <span class="json-property-type">string</span>
6737 <span class="json-property-range" title="Value limits"></span>
6738 </dt>
6739 <dt data-property-name="url">
6740 <span class="json-property-name">url:</span>
6741 <span class="json-property-type">string</span>
6742 <span class="json-property-range" title="Value limits"></span>
6743 </dt>
6744 </dl>
6745 </section>
6746 </dt>
6747 <dt data-property-name="createdAt">
6748 <span class="json-property-name">createdAt:</span>
6749 <span class="json-property-type">string</span>
6750 <span class="json-property-range" title="Value limits"></span>
6751 </dt>
6752 </dl>
6753 </section>
6754 </div>
6755 <div class="doc-examples">
6756 <section>
6757 <h5>Example</h5>
6758 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6759 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6760 <span class="hljs-attr">&quot;reason&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6761 <span class="hljs-attr">&quot;reporterAccount&quot;</span>: {
6762 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6763 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6764 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6765 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6766 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6767 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6768 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6769 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6770 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6771 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6772 <span class="hljs-attr">&quot;avatar&quot;</span>: {
6773 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6774 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6775 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6776 }
6777 },
6778 <span class="hljs-attr">&quot;video&quot;</span>: {
6779 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6780 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6781 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6782 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6783 },
6784 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6785}
6786</code></pre>
6787 <!-- </div> -->
6788 </section>
6789 </div>
6790 </div>
6791 </div>
6792 <div id="definition-VideoBlacklist" class="definition panel" data-traverse-target="definition-VideoBlacklist">
6793 <h2 class="panel-title">
6794 <a name="/definitions/VideoBlacklist"></a>VideoBlacklist:
6795 <!-- <span class="json-property-type">
6796 <span class="json-property-type">object</span>
6797 <span class="json-property-range" title="Value limits"></span>
6798
6799
6800 </span> -->
6801 </h2>
6802 <div class="doc-row">
6803 <div class="doc-copy">
6804 <section class="json-schema-properties">
6805 <dl>
6806 <dt data-property-name="id">
6807 <span class="json-property-name">id:</span>
6808 <span class="json-property-type">number</span>
6809 <span class="json-property-range" title="Value limits"></span>
6810 </dt>
6811 <dt data-property-name="videoId">
6812 <span class="json-property-name">videoId:</span>
6813 <span class="json-property-type">number</span>
6814 <span class="json-property-range" title="Value limits"></span>
6815 </dt>
6816 <dt data-property-name="createdAt">
6817 <span class="json-property-name">createdAt:</span>
6818 <span class="json-property-type">string</span>
6819 <span class="json-property-range" title="Value limits"></span>
6820 </dt>
6821 <dt data-property-name="updatedAt">
6822 <span class="json-property-name">updatedAt:</span>
6823 <span class="json-property-type">string</span>
6824 <span class="json-property-range" title="Value limits"></span>
6825 </dt>
6826 <dt data-property-name="name">
6827 <span class="json-property-name">name:</span>
6828 <span class="json-property-type">string</span>
6829 <span class="json-property-range" title="Value limits"></span>
6830 </dt>
6831 <dt data-property-name="uuid">
6832 <span class="json-property-name">uuid:</span>
6833 <span class="json-property-type">string</span>
6834 <span class="json-property-range" title="Value limits"></span>
6835 </dt>
6836 <dt data-property-name="description">
6837 <span class="json-property-name">description:</span>
6838 <span class="json-property-type">string</span>
6839 <span class="json-property-range" title="Value limits"></span>
6840 </dt>
6841 <dt data-property-name="duration">
6842 <span class="json-property-name">duration:</span>
6843 <span class="json-property-type">number</span>
6844 <span class="json-property-range" title="Value limits"></span>
6845 </dt>
6846 <dt data-property-name="views">
6847 <span class="json-property-name">views:</span>
6848 <span class="json-property-type">number</span>
6849 <span class="json-property-range" title="Value limits"></span>
6850 </dt>
6851 <dt data-property-name="likes">
6852 <span class="json-property-name">likes:</span>
6853 <span class="json-property-type">number</span>
6854 <span class="json-property-range" title="Value limits"></span>
6855 </dt>
6856 <dt data-property-name="dislikes">
6857 <span class="json-property-name">dislikes:</span>
6858 <span class="json-property-type">number</span>
6859 <span class="json-property-range" title="Value limits"></span>
6860 </dt>
6861 <dt data-property-name="nsfw">
6862 <span class="json-property-name">nsfw:</span>
6863 <span class="json-property-type">boolean</span>
6864 <span class="json-property-range" title="Value limits"></span>
6865 </dt>
6866 </dl>
6867 </section>
6868 </div>
6869 <div class="doc-examples">
6870 <section>
6871 <h5>Example</h5>
6872 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6873 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6874 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6875 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6876 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6877 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6878 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6879 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6880 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6881 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6882 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6883 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6884 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>
6885}
6886</code></pre>
6887 <!-- </div> -->
6888 </section>
6889 </div>
6890 </div>
6891 </div>
6892 <div id="definition-VideoChannel" class="definition panel" data-traverse-target="definition-VideoChannel">
6893 <h2 class="panel-title">
6894 <a name="/definitions/VideoChannel"></a>VideoChannel:
6895 <!-- <span class="json-property-type">
6896 <span class="json-property-type">object</span>
6897 <span class="json-property-range" title="Value limits"></span>
6898
6899
6900 </span> -->
6901 </h2>
6902 <div class="doc-row">
6903 <div class="doc-copy">
6904 <section class="json-schema-properties">
6905 <dl>
6906 <dt data-property-name="displayName">
6907 <span class="json-property-name">displayName:</span>
6908 <span class="json-property-type">string</span>
6909 <span class="json-property-range" title="Value limits"></span>
6910 </dt>
6911 <dt data-property-name="description">
6912 <span class="json-property-name">description:</span>
6913 <span class="json-property-type">string</span>
6914 <span class="json-property-range" title="Value limits"></span>
6915 </dt>
6916 <dt data-property-name="isLocal">
6917 <span class="json-property-name">isLocal:</span>
6918 <span class="json-property-type">boolean</span>
6919 <span class="json-property-range" title="Value limits"></span>
6920 </dt>
6921 <dt data-property-name="ownerAccount">
6922 <span class="json-property-name">ownerAccount:</span>
6923 <span class="json-property-type">object</span>
6924 <span class="json-property-range" title="Value limits"></span>
6925 </dt>
6926 <dt class="json-inner-schema">
6927 <section class="json-schema-properties">
6928 <dl>
6929 <dt data-property-name="id">
6930 <span class="json-property-name">id:</span>
6931 <span class="json-property-type">number</span>
6932 <span class="json-property-range" title="Value limits"></span>
6933 </dt>
6934 <dt data-property-name="uuid">
6935 <span class="json-property-name">uuid:</span>
6936 <span class="json-property-type">string</span>
6937 <span class="json-property-range" title="Value limits"></span>
6938 </dt>
6939 </dl>
6940 </section>
6941 </dt>
6942 </dl>
6943 </section>
6944 </div>
6945 <div class="doc-examples">
6946 <section>
6947 <h5>Example</h5>
6948 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
6949 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6950 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6951 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6952 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
6953 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6954 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6955 }
6956}
6957</code></pre>
6958 <!-- </div> -->
6959 </section>
6960 </div>
6961 </div>
6962 </div>
6963 <div id="definition-VideoComment" class="definition panel" data-traverse-target="definition-VideoComment">
6964 <h2 class="panel-title">
6965 <a name="/definitions/VideoComment"></a>VideoComment:
6966 <!-- <span class="json-property-type">
6967 <span class="json-property-type">object</span>
6968 <span class="json-property-range" title="Value limits"></span>
6969
6970
6971 </span> -->
6972 </h2>
6973 <div class="doc-row">
6974 <div class="doc-copy">
6975 <section class="json-schema-properties">
6976 <dl>
6977 <dt data-property-name="id">
6978 <span class="json-property-name">id:</span>
6979 <span class="json-property-type">number</span>
6980 <span class="json-property-range" title="Value limits"></span>
6981 </dt>
6982 <dt data-property-name="url">
6983 <span class="json-property-name">url:</span>
6984 <span class="json-property-type">string</span>
6985 <span class="json-property-range" title="Value limits"></span>
6986 </dt>
6987 <dt data-property-name="text">
6988 <span class="json-property-name">text:</span>
6989 <span class="json-property-type">string</span>
6990 <span class="json-property-range" title="Value limits"></span>
6991 </dt>
6992 <dt data-property-name="threadId">
6993 <span class="json-property-name">threadId:</span>
6994 <span class="json-property-type">number</span>
6995 <span class="json-property-range" title="Value limits"></span>
6996 </dt>
6997 <dt data-property-name="inReplyToCommentId">
6998 <span class="json-property-name">inReplyToCommentId:</span>
6999 <span class="json-property-type">number</span>
7000 <span class="json-property-range" title="Value limits"></span>
7001 </dt>
7002 <dt data-property-name="videoId">
7003 <span class="json-property-name">videoId:</span>
7004 <span class="json-property-type">number</span>
7005 <span class="json-property-range" title="Value limits"></span>
7006 </dt>
7007 <dt data-property-name="createdAt">
7008 <span class="json-property-name">createdAt:</span>
7009 <span class="json-property-type">string</span>
7010 <span class="json-property-range" title="Value limits"></span>
7011 </dt>
7012 <dt data-property-name="updatedAt">
7013 <span class="json-property-name">updatedAt:</span>
7014 <span class="json-property-type">string</span>
7015 <span class="json-property-range" title="Value limits"></span>
7016 </dt>
7017 <dt data-property-name="totalReplies">
7018 <span class="json-property-name">totalReplies:</span>
7019 <span class="json-property-type">number</span>
7020 <span class="json-property-range" title="Value limits"></span>
7021 </dt>
7022 <dt data-property-name="account">
7023 <span class="json-property-name">account:</span>
7024 <span class="json-property-type">
7025 <span class="">
7026 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
7027 </span>
7028 </span>
7029 <span class="json-property-range" title="Value limits"></span>
7030 </dt>
7031 </dl>
7032 </section>
7033 </div>
7034 <div class="doc-examples">
7035 <section>
7036 <h5>Example</h5>
7037 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7038 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7039 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7040 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7041 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7042 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7043 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7044 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7045 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7046 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7047 <span class="hljs-attr">&quot;account&quot;</span>: {
7048 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7049 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7050 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7051 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7052 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7053 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7054 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7055 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7056 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7057 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7058 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7059 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7060 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7061 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7062 }
7063 }
7064}
7065</code></pre>
7066 <!-- </div> -->
7067 </section>
7068 </div>
7069 </div>
7070 </div>
7071 <div id="definition-VideoCommentThreadTree" class="definition panel" data-traverse-target="definition-VideoCommentThreadTree">
7072 <h2 class="panel-title">
7073 <a name="/definitions/VideoCommentThreadTree"></a>VideoCommentThreadTree:
7074 <!-- <span class="json-property-type">
7075 <span class="json-property-type">object</span>
7076 <span class="json-property-range" title="Value limits"></span>
7077
7078
7079 </span> -->
7080 </h2>
7081 <div class="doc-row">
7082 <div class="doc-copy">
7083 <section class="json-schema-properties">
7084 <dl>
7085 <dt data-property-name="comment">
7086 <span class="json-property-name">comment:</span>
7087 <span class="json-property-type">
7088 <span class="">
7089 <a class="json-schema-ref" href="#/definitions/VideoComment">VideoComment</a>
7090 </span>
7091 </span>
7092 <span class="json-property-range" title="Value limits"></span>
7093 </dt>
7094 <dt data-property-name="children">
7095 <span class="json-property-name">children:</span>
7096 <span class="json-property-type">
7097 <span class="json-schema-ref-array">
7098 <a class="json-schema-ref" href="#/definitions/VideoCommentThreadTree">VideoCommentThreadTree</a>
7099 </span>
7100 </span>
7101 <span class="json-property-range" title="Value limits"></span>
7102 </dt>
7103 <dt class="json-inner-schema">
7104 <section class="json-schema-array-items">
7105 <span class="json-property-type">
7106 <span class="">
7107 <a class="json-schema-ref" href="#/definitions/VideoCommentThreadTree">VideoCommentThreadTree</a>
7108 </span>
7109 </span>
7110 <span class="json-property-range" title="Value limits"></span>
7111 <div class="json-inner-schema"> </div>
7112 </section>
7113 </dt>
7114 </dl>
7115 </section>
7116 </div>
7117 <div class="doc-examples">
7118 <section>
7119 <h5>Example</h5>
7120 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7121 <span class="hljs-attr">&quot;comment&quot;</span>: {
7122 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7123 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7124 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7125 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7126 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7127 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7128 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7129 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7130 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7131 <span class="hljs-attr">&quot;account&quot;</span>: {
7132 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7133 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7134 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7135 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7136 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7137 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7138 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7139 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7140 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7141 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7142 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7143 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7144 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7145 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7146 }
7147 }
7148 },
7149 <span class="hljs-attr">&quot;children&quot;</span>: [
7150 {
7151 <span class="hljs-attr">&quot;comment&quot;</span>: {
7152 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7153 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7154 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7155 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7156 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7157 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7158 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7159 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7160 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7161 <span class="hljs-attr">&quot;account&quot;</span>: {
7162 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7163 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7164 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7165 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7166 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7167 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7168 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7169 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7170 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7171 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7172 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7173 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7174 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7175 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7176 }
7177 }
7178 },
7179 <span class="hljs-attr">&quot;children&quot;</span>: [
7180 {
7181 <span class="hljs-attr">&quot;comment&quot;</span>: {
7182 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7183 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7184 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7185 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7186 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7187 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7188 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7189 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7190 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7191 <span class="hljs-attr">&quot;account&quot;</span>: {
7192 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7193 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7194 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7195 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7196 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7197 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7198 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7199 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7200 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7201 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7202 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7203 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7204 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7205 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7206 }
7207 }
7208 }
7209 }
7210 ]
7211 }
7212 ]
7213}
7214</code></pre>
7215 <!-- </div> -->
7216 </section>
7217 </div>
7218 </div>
7219 </div>
7220 <div id="definition-Avatar" class="definition panel" data-traverse-target="definition-Avatar">
7221 <h2 class="panel-title">
7222 <a name="/definitions/Avatar"></a>Avatar:
7223 <!-- <span class="json-property-type">
7224 <span class="json-property-type">object</span>
7225 <span class="json-property-range" title="Value limits"></span>
7226
7227
7228 </span> -->
7229 </h2>
7230 <div class="doc-row">
7231 <div class="doc-copy">
7232 <section class="json-schema-properties">
7233 <dl>
7234 <dt data-property-name="path">
7235 <span class="json-property-name">path:</span>
7236 <span class="json-property-type">string</span>
7237 <span class="json-property-range" title="Value limits"></span>
7238 </dt>
7239 <dt data-property-name="createdAt">
7240 <span class="json-property-name">createdAt:</span>
7241 <span class="json-property-type">string</span>
7242 <span class="json-property-range" title="Value limits"></span>
7243 </dt>
7244 <dt data-property-name="updatedAt">
7245 <span class="json-property-name">updatedAt:</span>
7246 <span class="json-property-type">string</span>
7247 <span class="json-property-range" title="Value limits"></span>
7248 </dt>
7249 </dl>
7250 </section>
7251 </div>
7252 <div class="doc-examples">
7253 <section>
7254 <h5>Example</h5>
7255 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7256 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7257 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7258 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7259}
7260</code></pre>
7261 <!-- </div> -->
7262 </section>
7263 </div>
7264 </div>
7265 </div>
7266 <div id="definition-Actor" class="definition panel" data-traverse-target="definition-Actor">
7267 <h2 class="panel-title">
7268 <a name="/definitions/Actor"></a>Actor:
7269 <!-- <span class="json-property-type">
7270 <span class="json-property-type">object</span>
7271 <span class="json-property-range" title="Value limits"></span>
7272
7273
7274 </span> -->
7275 </h2>
7276 <div class="doc-row">
7277 <div class="doc-copy">
7278 <section class="json-schema-properties">
7279 <dl>
7280 <dt data-property-name="id">
7281 <span class="json-property-name">id:</span>
7282 <span class="json-property-type">number</span>
7283 <span class="json-property-range" title="Value limits"></span>
7284 </dt>
7285 <dt data-property-name="uuid">
7286 <span class="json-property-name">uuid:</span>
7287 <span class="json-property-type">string</span>
7288 <span class="json-property-range" title="Value limits"></span>
7289 </dt>
7290 <dt data-property-name="url">
7291 <span class="json-property-name">url:</span>
7292 <span class="json-property-type">string</span>
7293 <span class="json-property-range" title="Value limits"></span>
7294 </dt>
7295 <dt data-property-name="name">
7296 <span class="json-property-name">name:</span>
7297 <span class="json-property-type">string</span>
7298 <span class="json-property-range" title="Value limits"></span>
7299 </dt>
7300 <dt data-property-name="host">
7301 <span class="json-property-name">host:</span>
7302 <span class="json-property-type">string</span>
7303 <span class="json-property-range" title="Value limits"></span>
7304 </dt>
7305 <dt data-property-name="followingCount">
7306 <span class="json-property-name">followingCount:</span>
7307 <span class="json-property-type">number</span>
7308 <span class="json-property-range" title="Value limits"></span>
7309 </dt>
7310 <dt data-property-name="followersCount">
7311 <span class="json-property-name">followersCount:</span>
7312 <span class="json-property-type">number</span>
7313 <span class="json-property-range" title="Value limits"></span>
7314 </dt>
7315 <dt data-property-name="createdAt">
7316 <span class="json-property-name">createdAt:</span>
7317 <span class="json-property-type">string</span>
7318 <span class="json-property-range" title="Value limits"></span>
7319 </dt>
7320 <dt data-property-name="updatedAt">
7321 <span class="json-property-name">updatedAt:</span>
7322 <span class="json-property-type">string</span>
7323 <span class="json-property-range" title="Value limits"></span>
7324 </dt>
7325 <dt data-property-name="avatar">
7326 <span class="json-property-name">avatar:</span>
7327 <span class="json-property-type">
7328 <span class="">
7329 <a class="json-schema-ref" href="#/definitions/Avatar">Avatar</a>
7330 </span>
7331 </span>
7332 <span class="json-property-range" title="Value limits"></span>
7333 </dt>
7334 </dl>
7335 </section>
7336 </div>
7337 <div class="doc-examples">
7338 <section>
7339 <h5>Example</h5>
7340 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7341 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7342 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7343 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7344 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7345 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7346 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7347 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7348 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7349 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7350 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7351 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7352 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7353 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7354 }
7355}
7356</code></pre>
7357 <!-- </div> -->
7358 </section>
7359 </div>
7360 </div>
7361 </div>
7362 <div id="definition-Account" class="definition panel" data-traverse-target="definition-Account">
7363 <h2 class="panel-title">
7364 <a name="/definitions/Account"></a>Account:
7365 <!-- <span class="json-property-type">
7366 <span class="json-property-type"></span>
7367 <span class="json-property-range" title="Value limits"></span>
7368
7369
7370 </span> -->
7371 </h2>
7372 <div class="doc-row">
7373 <div class="doc-copy">
7374 <section class="json-schema-allOf">
7375 <section class="json-schema-allOf-inherited">
7376 <ul>
7377 <span class="">
7378 <a class="json-schema-ref" href="#/definitions/Actor">Actor</a>
7379 </span>
7380 </ul>
7381 </section>
7382 <section class="json-schema-allOf-additional">
7383 <section class="json-schema-properties">
7384 <dl>
7385 <dt data-property-name="displayName">
7386 <span class="json-property-name">displayName:</span>
7387 <span class="json-property-type">string</span>
7388 <span class="json-property-range" title="Value limits"></span>
7389 </dt>
7390 </dl>
7391 </section>
7392 </section>
7393 </section>
7394 </div>
7395 <div class="doc-examples">
7396 <section>
7397 <h5>Example</h5>
7398 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7399 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7400 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7401 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7402 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7403 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7404 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7405 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7406 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7407 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7408 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7409 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7410 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7411 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7412 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7413 }
7414}
7415</code></pre>
7416 <!-- </div> -->
7417 </section>
7418 </div>
7419 </div>
7420 </div>
7421 <div id="definition-User" class="definition panel" data-traverse-target="definition-User">
7422 <h2 class="panel-title">
7423 <a name="/definitions/User"></a>User:
7424 <!-- <span class="json-property-type">
7425 <span class="json-property-type">object</span>
7426 <span class="json-property-range" title="Value limits"></span>
7427
7428
7429 </span> -->
7430 </h2>
7431 <div class="doc-row">
7432 <div class="doc-copy">
7433 <section class="json-schema-properties">
7434 <dl>
7435 <dt data-property-name="id">
7436 <span class="json-property-name">id:</span>
7437 <span class="json-property-type">number</span>
7438 <span class="json-property-range" title="Value limits"></span>
7439 </dt>
7440 <dt data-property-name="username">
7441 <span class="json-property-name">username:</span>
7442 <span class="json-property-type">string</span>
7443 <span class="json-property-range" title="Value limits"></span>
7444 </dt>
7445 <dt data-property-name="email">
7446 <span class="json-property-name">email:</span>
7447 <span class="json-property-type">string</span>
7448 <span class="json-property-range" title="Value limits"></span>
7449 </dt>
7450 <dt data-property-name="displayNSFW">
7451 <span class="json-property-name">displayNSFW:</span>
7452 <span class="json-property-type">boolean</span>
7453 <span class="json-property-range" title="Value limits"></span>
7454 </dt>
7455 <dt data-property-name="autoPlayVideo">
7456 <span class="json-property-name">autoPlayVideo:</span>
7457 <span class="json-property-type">boolean</span>
7458 <span class="json-property-range" title="Value limits"></span>
7459 </dt>
7460 <dt data-property-name="role">
7461 <span class="json-property-name">role:</span>
7462 <span class="json-property-type">string</span>
7463 <span class="json-property-enum" title="Possible values">
7464 <span class="json-property-enum-item">User</span>,
7465 <span class="json-property-enum-item">Moderator</span>,
7466 <span class="json-property-enum-item">Administrator</span>
7467 </span>
7468 <span class="json-property-range" title="Value limits"></span>
7469 </dt>
7470 <dt data-property-name="videoQuota">
7471 <span class="json-property-name">videoQuota:</span>
7472 <span class="json-property-type">number</span>
7473 <span class="json-property-range" title="Value limits"></span>
7474 </dt>
7475 <dt data-property-name="createdAt">
7476 <span class="json-property-name">createdAt:</span>
7477 <span class="json-property-type">string</span>
7478 <span class="json-property-range" title="Value limits"></span>
7479 </dt>
7480 <dt data-property-name="account">
7481 <span class="json-property-name">account:</span>
7482 <span class="json-property-type">
7483 <span class="">
7484 <a class="json-schema-ref" href="#/definitions/Account">Account</a>
7485 </span>
7486 </span>
7487 <span class="json-property-range" title="Value limits"></span>
7488 </dt>
7489 <dt data-property-name="videoChannels">
7490 <span class="json-property-name">videoChannels:</span>
7491 <span class="json-property-type">
7492 <span class="json-schema-ref-array">
7493 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
7494 </span>
7495 </span>
7496 <span class="json-property-range" title="Value limits"></span>
7497 </dt>
7498 <dt class="json-inner-schema">
7499 <section class="json-schema-array-items">
7500 <span class="json-property-type">
7501 <span class="">
7502 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
7503 </span>
7504 </span>
7505 <span class="json-property-range" title="Value limits"></span>
7506 <div class="json-inner-schema"> </div>
7507 </section>
7508 </dt>
7509 </dl>
7510 </section>
7511 </div>
7512 <div class="doc-examples">
7513 <section>
7514 <h5>Example</h5>
7515 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7516 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7517 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7518 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7519 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7520 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7521 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7522 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7523 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7524 <span class="hljs-attr">&quot;account&quot;</span>: {
7525 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7526 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7527 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7528 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7529 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7530 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7531 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7532 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7533 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7534 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7535 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7536 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7537 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7538 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7539 }
7540 },
7541 <span class="hljs-attr">&quot;videoChannels&quot;</span>: [
7542 {
7543 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7544 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7545 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7546 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
7547 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7548 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7549 }
7550 }
7551 ]
7552}
7553</code></pre>
7554 <!-- </div> -->
7555 </section>
7556 </div>
7557 </div>
7558 </div>
7559 <div id="definition-ServerConfig" class="definition panel" data-traverse-target="definition-ServerConfig">
7560 <h2 class="panel-title">
7561 <a name="/definitions/ServerConfig"></a>ServerConfig:
7562 <!-- <span class="json-property-type">
7563 <span class="json-property-type">object</span>
7564 <span class="json-property-range" title="Value limits"></span>
7565
7566
7567 </span> -->
7568 </h2>
7569 <div class="doc-row">
7570 <div class="doc-copy">
7571 <section class="json-schema-properties">
7572 <dl>
7573 <dt data-property-name="signup">
7574 <span class="json-property-name">signup:</span>
7575 <span class="json-property-type">object</span>
7576 <span class="json-property-range" title="Value limits"></span>
7577 </dt>
7578 <dt class="json-inner-schema">
7579 <section class="json-schema-properties">
7580 <dl>
7581 <dt data-property-name="allowed">
7582 <span class="json-property-name">allowed:</span>
7583 <span class="json-property-type">boolean</span>
7584 <span class="json-property-range" title="Value limits"></span>
7585 </dt>
7586 </dl>
7587 </section>
7588 </dt>
7589 <dt data-property-name="transcoding">
7590 <span class="json-property-name">transcoding:</span>
7591 <span class="json-property-type">object</span>
7592 <span class="json-property-range" title="Value limits"></span>
7593 </dt>
7594 <dt class="json-inner-schema">
7595 <section class="json-schema-properties">
7596 <dl>
7597 <dt data-property-name="enabledResolutions">
7598 <span class="json-property-name">enabledResolutions:</span>
7599 <span class="json-property-type">number[]</span>
7600 <span class="json-property-range" title="Value limits"></span>
7601 </dt>
7602 <dt class="json-inner-schema">
7603 <section class="json-schema-array-items">
7604 <span class="json-property-type">number</span>
7605 <span class="json-property-range" title="Value limits"></span>
7606 <div class="json-inner-schema"> </div>
7607 </section>
7608 </dt>
7609 </dl>
7610 </section>
7611 </dt>
7612 <dt data-property-name="avatar">
7613 <span class="json-property-name">avatar:</span>
7614 <span class="json-property-type">object</span>
7615 <span class="json-property-range" title="Value limits"></span>
7616 </dt>
7617 <dt class="json-inner-schema">
7618 <section class="json-schema-properties">
7619 <dl>
7620 <dt data-property-name="file">
7621 <span class="json-property-name">file:</span>
7622 <span class="json-property-type">object</span>
7623 <span class="json-property-range" title="Value limits"></span>
7624 </dt>
7625 <dt class="json-inner-schema">
7626 <section class="json-schema-properties">
7627 <dl>
7628 <dt data-property-name="size">
7629 <span class="json-property-name">size:</span>
7630 <span class="json-property-type">object</span>
7631 <span class="json-property-range" title="Value limits"></span>
7632 </dt>
7633 <dt class="json-inner-schema">
7634 <section class="json-schema-properties">
7635 <dl>
7636 <dt data-property-name="max">
7637 <span class="json-property-name">max:</span>
7638 <span class="json-property-type">number</span>
7639 <span class="json-property-range" title="Value limits"></span>
7640 </dt>
7641 </dl>
7642 </section>
7643 </dt>
7644 </dl>
7645 </section>
7646 </dt>
7647 <dt data-property-name="extensions">
7648 <span class="json-property-name">extensions:</span>
7649 <span class="json-property-type">string[]</span>
7650 <span class="json-property-range" title="Value limits"></span>
7651 </dt>
7652 <dt class="json-inner-schema">
7653 <section class="json-schema-array-items">
7654 <span class="json-property-type">string</span>
7655 <span class="json-property-range" title="Value limits"></span>
7656 <div class="json-inner-schema"> </div>
7657 </section>
7658 </dt>
7659 </dl>
7660 </section>
7661 </dt>
7662 <dt data-property-name="video">
7663 <span class="json-property-name">video:</span>
7664 <span class="json-property-type">object</span>
7665 <span class="json-property-range" title="Value limits"></span>
7666 </dt>
7667 <dt class="json-inner-schema">
7668 <section class="json-schema-properties">
7669 <dl>
7670 <dt data-property-name="file">
7671 <span class="json-property-name">file:</span>
7672 <span class="json-property-type">object</span>
7673 <span class="json-property-range" title="Value limits"></span>
7674 </dt>
7675 <dt class="json-inner-schema">
7676 <section class="json-schema-properties">
7677 <dl>
7678 <dt data-property-name="extensions">
7679 <span class="json-property-name">extensions:</span>
7680 <span class="json-property-type">string[]</span>
7681 <span class="json-property-range" title="Value limits"></span>
7682 </dt>
7683 <dt class="json-inner-schema">
7684 <section class="json-schema-array-items">
7685 <span class="json-property-type">string</span>
7686 <span class="json-property-range" title="Value limits"></span>
7687 <div class="json-inner-schema"> </div>
7688 </section>
7689 </dt>
7690 </dl>
7691 </section>
7692 </dt>
7693 </dl>
7694 </section>
7695 </dt>
7696 </dl>
7697 </section>
7698 </div>
7699 <div class="doc-examples">
7700 <section>
7701 <h5>Example</h5>
7702 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7703 <span class="hljs-attr">&quot;signup&quot;</span>: {
7704 <span class="hljs-attr">&quot;allowed&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>
7705 },
7706 <span class="hljs-attr">&quot;transcoding&quot;</span>: {
7707 <span class="hljs-attr">&quot;enabledResolutions&quot;</span>: [
7708 <span class="hljs-string">&quot;number&quot;</span>
7709 ]
7710 },
7711 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7712 <span class="hljs-attr">&quot;file&quot;</span>: {
7713 <span class="hljs-attr">&quot;size&quot;</span>: {
7714 <span class="hljs-attr">&quot;max&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>
7715 }
7716 },
7717 <span class="hljs-attr">&quot;extensions&quot;</span>: [
7718 <span class="hljs-string">&quot;string&quot;</span>
7719 ]
7720 },
7721 <span class="hljs-attr">&quot;video&quot;</span>: {
7722 <span class="hljs-attr">&quot;file&quot;</span>: {
7723 <span class="hljs-attr">&quot;extensions&quot;</span>: [
7724 <span class="hljs-string">&quot;string&quot;</span>
7725 ]
7726 }
7727 }
7728}
7729</code></pre>
7730 <!-- </div> -->
7731 </section>
7732 </div>
7733 </div>
7734 </div>
7735 <div id="definition-Follow" class="definition panel" data-traverse-target="definition-Follow">
7736 <h2 class="panel-title">
7737 <a name="/definitions/Follow"></a>Follow:
7738 <!-- <span class="json-property-type">
7739 <span class="json-property-type">object</span>
7740 <span class="json-property-range" title="Value limits"></span>
7741
7742
7743 </span> -->
7744 </h2>
7745 <div class="doc-row">
7746 <div class="doc-copy">
7747 <section class="json-schema-properties">
7748 <dl>
7749 <dt data-property-name="id">
7750 <span class="json-property-name">id:</span>
7751 <span class="json-property-type">number</span>
7752 <span class="json-property-range" title="Value limits"></span>
7753 </dt>
7754 <dt data-property-name="follower">
7755 <span class="json-property-name">follower:</span>
7756 <span class="json-property-type">
7757 <span class="">
7758 <a class="json-schema-ref" href="#/definitions/Actor">Actor</a>
7759 </span>
7760 </span>
7761 <span class="json-property-range" title="Value limits"></span>
7762 </dt>
7763 <dt data-property-name="following">
7764 <span class="json-property-name">following:</span>
7765 <span class="json-property-type">
7766 <span class="">
7767 <a class="json-schema-ref" href="#/definitions/Actor">Actor</a>
7768 </span>
7769 </span>
7770 <span class="json-property-range" title="Value limits"></span>
7771 </dt>
7772 <dt data-property-name="score">
7773 <span class="json-property-name">score:</span>
7774 <span class="json-property-type">number</span>
7775 <span class="json-property-range" title="Value limits"></span>
7776 </dt>
7777 <dt data-property-name="state">
7778 <span class="json-property-name">state:</span>
7779 <span class="json-property-type">string</span>
7780 <span class="json-property-enum" title="Possible values">
7781 <span class="json-property-enum-item">pending</span>,
7782 <span class="json-property-enum-item">accepted</span>
7783 </span>
7784 <span class="json-property-range" title="Value limits"></span>
7785 </dt>
7786 <dt data-property-name="createdAt">
7787 <span class="json-property-name">createdAt:</span>
7788 <span class="json-property-type">string</span>
7789 <span class="json-property-range" title="Value limits"></span>
7790 </dt>
7791 <dt data-property-name="updatedAt">
7792 <span class="json-property-name">updatedAt:</span>
7793 <span class="json-property-type">string</span>
7794 <span class="json-property-range" title="Value limits"></span>
7795 </dt>
7796 </dl>
7797 </section>
7798 </div>
7799 <div class="doc-examples">
7800 <section>
7801 <h5>Example</h5>
7802 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7803 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7804 <span class="hljs-attr">&quot;follower&quot;</span>: {
7805 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7806 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7807 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7808 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7809 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7810 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7811 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7812 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7813 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7814 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7815 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7816 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7817 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7818 }
7819 },
7820 <span class="hljs-attr">&quot;following&quot;</span>: {
7821 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7822 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7823 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7824 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7825 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7826 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7827 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7828 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7829 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7830 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7831 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7832 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7833 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7834 }
7835 },
7836 <span class="hljs-attr">&quot;score&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7837 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7838 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7839 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7840}
7841</code></pre>
7842 <!-- </div> -->
7843 </section>
7844 </div>
7845 </div>
7846 </div>
7847 <div id="definition-Job" class="definition panel" data-traverse-target="definition-Job">
7848 <h2 class="panel-title">
7849 <a name="/definitions/Job"></a>Job:
7850 <!-- <span class="json-property-type">
7851 <span class="json-property-type">object</span>
7852 <span class="json-property-range" title="Value limits"></span>
7853
7854
7855 </span> -->
7856 </h2>
7857 <div class="doc-row">
7858 <div class="doc-copy">
7859 <section class="json-schema-properties">
7860 <dl>
7861 <dt data-property-name="id">
7862 <span class="json-property-name">id:</span>
7863 <span class="json-property-type">number</span>
7864 <span class="json-property-range" title="Value limits"></span>
7865 </dt>
7866 <dt data-property-name="state">
7867 <span class="json-property-name">state:</span>
7868 <span class="json-property-type">string</span>
7869 <span class="json-property-enum" title="Possible values">
7870 <span class="json-property-enum-item">pending</span>,
7871 <span class="json-property-enum-item">processing</span>,
7872 <span class="json-property-enum-item">error</span>,
7873 <span class="json-property-enum-item">success</span>
7874 </span>
7875 <span class="json-property-range" title="Value limits"></span>
7876 </dt>
7877 <dt data-property-name="category">
7878 <span class="json-property-name">category:</span>
7879 <span class="json-property-type">string</span>
7880 <span class="json-property-enum" title="Possible values">
7881 <span class="json-property-enum-item">transcoding</span>,
7882 <span class="json-property-enum-item">activitypub-http</span>
7883 </span>
7884 <span class="json-property-range" title="Value limits"></span>
7885 </dt>
7886 <dt data-property-name="handlerName">
7887 <span class="json-property-name">handlerName:</span>
7888 <span class="json-property-type">string</span>
7889 <span class="json-property-range" title="Value limits"></span>
7890 </dt>
7891 <dt data-property-name="handlerInputData">
7892 <span class="json-property-name">handlerInputData:</span>
7893 <span class="json-property-type">string</span>
7894 <span class="json-property-range" title="Value limits"></span>
7895 </dt>
7896 <dt data-property-name="createdAt">
7897 <span class="json-property-name">createdAt:</span>
7898 <span class="json-property-type">string</span>
7899 <span class="json-property-range" title="Value limits"></span>
7900 </dt>
7901 <dt data-property-name="updatedAt">
7902 <span class="json-property-name">updatedAt:</span>
7903 <span class="json-property-type">string</span>
7904 <span class="json-property-range" title="Value limits"></span>
7905 </dt>
7906 </dl>
7907 </section>
7908 </div>
7909 <div class="doc-examples">
7910 <section>
7911 <h5>Example</h5>
7912 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7913 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7914 <span class="hljs-attr">&quot;state&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7915 <span class="hljs-attr">&quot;category&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7916 <span class="hljs-attr">&quot;handlerName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7917 <span class="hljs-attr">&quot;handlerInputData&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7918 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7919 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7920}
7921</code></pre>
7922 <!-- </div> -->
7923 </section>
7924 </div>
7925 </div>
7926 </div>
7927 <div id="definition-AddUserResponse" class="definition panel" data-traverse-target="definition-AddUserResponse">
7928 <h2 class="panel-title">
7929 <a name="/definitions/AddUserResponse"></a>AddUserResponse:
7930 <!-- <span class="json-property-type">
7931 <span class="json-property-type">object</span>
7932 <span class="json-property-range" title="Value limits"></span>
7933
7934
7935 </span> -->
7936 </h2>
7937 <div class="doc-row">
7938 <div class="doc-copy">
7939 <section class="json-schema-properties">
7940 <dl>
7941 <dt data-property-name="id">
7942 <span class="json-property-name">id:</span>
7943 <span class="json-property-type">number</span>
7944 <span class="json-property-range" title="Value limits"></span>
7945 </dt>
7946 <dt data-property-name="uuid">
7947 <span class="json-property-name">uuid:</span>
7948 <span class="json-property-type">string</span>
7949 <span class="json-property-range" title="Value limits"></span>
7950 </dt>
7951 </dl>
7952 </section>
7953 </div>
7954 <div class="doc-examples">
7955 <section>
7956 <h5>Example</h5>
7957 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
7958 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7959 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7960}
7961</code></pre>
7962 <!-- </div> -->
7963 </section>
7964 </div>
7965 </div>
7966 </div>
7967 <div id="definition-VideoUploadResponse" class="definition panel" data-traverse-target="definition-VideoUploadResponse">
7968 <h2 class="panel-title">
7969 <a name="/definitions/VideoUploadResponse"></a>VideoUploadResponse:
7970 <!-- <span class="json-property-type">
7971 <span class="json-property-type">object</span>
7972 <span class="json-property-range" title="Value limits"></span>
7973
7974
7975 </span> -->
7976 </h2>
7977 <div class="doc-row">
7978 <div class="doc-copy">
7979 <section class="json-schema-properties">
7980 <dl>
7981 <dt data-property-name="video">
7982 <span class="json-property-name">video:</span>
7983 <span class="json-property-type">object</span>
7984 <span class="json-property-range" title="Value limits"></span>
7985 </dt>
7986 <dt class="json-inner-schema">
7987 <section class="json-schema-properties">
7988 <dl>
7989 <dt data-property-name="id">
7990 <span class="json-property-name">id:</span>
7991 <span class="json-property-type">number</span>
7992 <span class="json-property-range" title="Value limits"></span>
7993 </dt>
7994 <dt data-property-name="uuid">
7995 <span class="json-property-name">uuid:</span>
7996 <span class="json-property-type">string</span>
7997 <span class="json-property-range" title="Value limits"></span>
7998 </dt>
7999 </dl>
8000 </section>
8001 </dt>
8002 </dl>
8003 </section>
8004 </div>
8005 <div class="doc-examples">
8006 <section>
8007 <h5>Example</h5>
8008 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8009 <span class="hljs-attr">&quot;video&quot;</span>: {
8010 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8011 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8012 }
8013}
8014</code></pre>
8015 <!-- </div> -->
8016 </section>
8017 </div>
8018 </div>
8019 </div>
8020 <div id="definition-CommentThreadResponse" class="definition panel" data-traverse-target="definition-CommentThreadResponse">
8021 <h2 class="panel-title">
8022 <a name="/definitions/CommentThreadResponse"></a>CommentThreadResponse:
8023 <!-- <span class="json-property-type">
8024 <span class="json-property-type">object</span>
8025 <span class="json-property-range" title="Value limits"></span>
8026
8027
8028 </span> -->
8029 </h2>
8030 <div class="doc-row">
8031 <div class="doc-copy">
8032 <section class="json-schema-properties">
8033 <dl>
8034 <dt data-property-name="total">
8035 <span class="json-property-name">total:</span>
8036 <span class="json-property-type">number</span>
8037 <span class="json-property-range" title="Value limits"></span>
8038 </dt>
8039 <dt data-property-name="data">
8040 <span class="json-property-name">data:</span>
8041 <span class="json-property-type">
8042 <span class="json-schema-ref-array">
8043 <a class="json-schema-ref" href="#/definitions/VideoComment">VideoComment</a>
8044 </span>
8045 </span>
8046 <span class="json-property-range" title="Value limits"></span>
8047 </dt>
8048 <dt class="json-inner-schema">
8049 <section class="json-schema-array-items">
8050 <span class="json-property-type">
8051 <span class="">
8052 <a class="json-schema-ref" href="#/definitions/VideoComment">VideoComment</a>
8053 </span>
8054 </span>
8055 <span class="json-property-range" title="Value limits"></span>
8056 <div class="json-inner-schema"> </div>
8057 </section>
8058 </dt>
8059 </dl>
8060 </section>
8061 </div>
8062 <div class="doc-examples">
8063 <section>
8064 <h5>Example</h5>
8065 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8066 <span class="hljs-attr">&quot;total&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8067 <span class="hljs-attr">&quot;data&quot;</span>: [
8068 {
8069 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8070 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8071 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8072 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8073 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8074 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8075 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8076 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8077 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8078 <span class="hljs-attr">&quot;account&quot;</span>: {
8079 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8080 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8081 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8082 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8083 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8084 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8085 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8086 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8087 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8088 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8089 <span class="hljs-attr">&quot;avatar&quot;</span>: {
8090 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8091 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8092 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8093 }
8094 }
8095 }
8096 ]
8097}
8098</code></pre>
8099 <!-- </div> -->
8100 </section>
8101 </div>
8102 </div>
8103 </div>
8104 <div id="definition-CommentThreadPostResponse" class="definition panel" data-traverse-target="definition-CommentThreadPostResponse">
8105 <h2 class="panel-title">
8106 <a name="/definitions/CommentThreadPostResponse"></a>CommentThreadPostResponse:
8107 <!-- <span class="json-property-type">
8108 <span class="json-property-type">object</span>
8109 <span class="json-property-range" title="Value limits"></span>
8110
8111
8112 </span> -->
8113 </h2>
8114 <div class="doc-row">
8115 <div class="doc-copy">
8116 <section class="json-schema-properties">
8117 <dl>
8118 <dt data-property-name="comment">
8119 <span class="json-property-name">comment:</span>
8120 <span class="json-property-type">
8121 <span class="">
8122 <a class="json-schema-ref" href="#/definitions/VideoComment">VideoComment</a>
8123 </span>
8124 </span>
8125 <span class="json-property-range" title="Value limits"></span>
8126 </dt>
8127 </dl>
8128 </section>
8129 </div>
8130 <div class="doc-examples">
8131 <section>
8132 <h5>Example</h5>
8133 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8134 <span class="hljs-attr">&quot;comment&quot;</span>: {
8135 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8136 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8137 <span class="hljs-attr">&quot;text&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8138 <span class="hljs-attr">&quot;threadId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8139 <span class="hljs-attr">&quot;inReplyToCommentId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8140 <span class="hljs-attr">&quot;videoId&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8141 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8142 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8143 <span class="hljs-attr">&quot;totalReplies&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8144 <span class="hljs-attr">&quot;account&quot;</span>: {
8145 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8146 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8147 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8148 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8149 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8150 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8151 <span class="hljs-attr">&quot;followingCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8152 <span class="hljs-attr">&quot;followersCount&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
8153 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8154 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8155 <span class="hljs-attr">&quot;avatar&quot;</span>: {
8156 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8157 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8158 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8159 }
8160 }
8161 }
8162}
8163</code></pre>
8164 <!-- </div> -->
8165 </section>
8166 </div>
8167 </div>
8168 </div>
8169 <div id="definition-AddUser" class="definition panel" data-traverse-target="definition-AddUser">
8170 <h2 class="panel-title">
8171 <a name="/definitions/AddUser"></a>AddUser:
8172 <!-- <span class="json-property-type">
8173 <span class="json-property-type">object</span>
8174 <span class="json-property-range" title="Value limits"></span>
8175
8176
8177 </span> -->
8178 </h2>
8179 <div class="doc-row">
8180 <div class="doc-copy">
8181 <section class="json-schema-properties">
8182 <dl>
8183 <dt data-property-name="username" class="has-description">
8184 <span class="json-property-name">username:</span>
8185 <span class="json-property-type">string</span>
8186 <span class="json-property-range" title="Value limits"></span>
8187 <span class="json-property-required"></span>
8188 </dt>
8189 <dd>
8190 <p>The user username </p>
8191 </dd>
8192 <dt data-property-name="password" class="has-description">
8193 <span class="json-property-name">password:</span>
8194 <span class="json-property-type">string</span>
8195 <span class="json-property-range" title="Value limits"></span>
8196 <span class="json-property-required"></span>
8197 </dt>
8198 <dd>
8199 <p>The user password </p>
8200 </dd>
8201 <dt data-property-name="email" class="has-description">
8202 <span class="json-property-name">email:</span>
8203 <span class="json-property-type">string</span>
8204 <span class="json-property-range" title="Value limits"></span>
8205 <span class="json-property-required"></span>
8206 </dt>
8207 <dd>
8208 <p>The user email </p>
8209 </dd>
8210 <dt data-property-name="videoQuota" class="has-description">
8211 <span class="json-property-name">videoQuota:</span>
8212 <span class="json-property-type">string</span>
8213 <span class="json-property-range" title="Value limits"></span>
8214 <span class="json-property-required"></span>
8215 </dt>
8216 <dd>
8217 <p>The user videoQuota </p>
8218 </dd>
8219 <dt data-property-name="role" class="has-description">
8220 <span class="json-property-name">role:</span>
8221 <span class="json-property-type">string</span>
8222 <span class="json-property-range" title="Value limits"></span>
8223 <span class="json-property-required"></span>
8224 </dt>
8225 <dd>
8226 <p>The user role </p>
8227 </dd>
8228 </dl>
8229 </section>
8230 </div>
8231 <div class="doc-examples">
8232 <section>
8233 <h5>Example</h5>
8234 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8235 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8236 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8237 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8238 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8239 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8240}
8241</code></pre>
8242 <!-- </div> -->
8243 </section>
8244 </div>
8245 </div>
8246 </div>
8247 <div id="definition-UpdateUser" class="definition panel" data-traverse-target="definition-UpdateUser">
8248 <h2 class="panel-title">
8249 <a name="/definitions/UpdateUser"></a>UpdateUser:
8250 <!-- <span class="json-property-type">
8251 <span class="json-property-type">object</span>
8252 <span class="json-property-range" title="Value limits"></span>
8253
8254
8255 </span> -->
8256 </h2>
8257 <div class="doc-row">
8258 <div class="doc-copy">
8259 <section class="json-schema-properties">
8260 <dl>
8261 <dt data-property-name="id" class="has-description">
8262 <span class="json-property-name">id:</span>
8263 <span class="json-property-type">string</span>
8264 <span class="json-property-range" title="Value limits"></span>
8265 <span class="json-property-required"></span>
8266 </dt>
8267 <dd>
8268 <p>The user id </p>
8269 </dd>
8270 <dt data-property-name="email" class="has-description">
8271 <span class="json-property-name">email:</span>
8272 <span class="json-property-type">string</span>
8273 <span class="json-property-range" title="Value limits"></span>
8274 <span class="json-property-required"></span>
8275 </dt>
8276 <dd>
8277 <p>The updated email of the user </p>
8278 </dd>
8279 <dt data-property-name="videoQuota" class="has-description">
8280 <span class="json-property-name">videoQuota:</span>
8281 <span class="json-property-type">string</span>
8282 <span class="json-property-range" title="Value limits"></span>
8283 <span class="json-property-required"></span>
8284 </dt>
8285 <dd>
8286 <p>The updated videoQuota of the user </p>
8287 </dd>
8288 <dt data-property-name="role" class="has-description">
8289 <span class="json-property-name">role:</span>
8290 <span class="json-property-type">string</span>
8291 <span class="json-property-range" title="Value limits"></span>
8292 <span class="json-property-required"></span>
8293 </dt>
8294 <dd>
8295 <p>The updated role of the user </p>
8296 </dd>
8297 </dl>
8298 </section>
8299 </div>
8300 <div class="doc-examples">
8301 <section>
8302 <h5>Example</h5>
8303 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8304 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8305 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8306 <span class="hljs-attr">&quot;videoQuota&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8307 <span class="hljs-attr">&quot;role&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8308}
8309</code></pre>
8310 <!-- </div> -->
8311 </section>
8312 </div>
8313 </div>
8314 </div>
8315 <div id="definition-UpdateMe" class="definition panel" data-traverse-target="definition-UpdateMe">
8316 <h2 class="panel-title">
8317 <a name="/definitions/UpdateMe"></a>UpdateMe:
8318 <!-- <span class="json-property-type">
8319 <span class="json-property-type">object</span>
8320 <span class="json-property-range" title="Value limits"></span>
8321
8322
8323 </span> -->
8324 </h2>
8325 <div class="doc-row">
8326 <div class="doc-copy">
8327 <section class="json-schema-properties">
8328 <dl>
8329 <dt data-property-name="password" class="has-description">
8330 <span class="json-property-name">password:</span>
8331 <span class="json-property-type">string</span>
8332 <span class="json-property-range" title="Value limits"></span>
8333 <span class="json-property-required"></span>
8334 </dt>
8335 <dd>
8336 <p>Your new password </p>
8337 </dd>
8338 <dt data-property-name="email" class="has-description">
8339 <span class="json-property-name">email:</span>
8340 <span class="json-property-type">string</span>
8341 <span class="json-property-range" title="Value limits"></span>
8342 <span class="json-property-required"></span>
8343 </dt>
8344 <dd>
8345 <p>Your new email </p>
8346 </dd>
8347 <dt data-property-name="displayNSFW" class="has-description">
8348 <span class="json-property-name">displayNSFW:</span>
8349 <span class="json-property-type">string</span>
8350 <span class="json-property-range" title="Value limits"></span>
8351 <span class="json-property-required"></span>
8352 </dt>
8353 <dd>
8354 <p>Your new displayNSFW </p>
8355 </dd>
8356 <dt data-property-name="autoPlayVideo" class="has-description">
8357 <span class="json-property-name">autoPlayVideo:</span>
8358 <span class="json-property-type">string</span>
8359 <span class="json-property-range" title="Value limits"></span>
8360 <span class="json-property-required"></span>
8361 </dt>
8362 <dd>
8363 <p>Your new autoPlayVideo </p>
8364 </dd>
8365 </dl>
8366 </section>
8367 </div>
8368 <div class="doc-examples">
8369 <section>
8370 <h5>Example</h5>
8371 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8372 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8373 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8374 <span class="hljs-attr">&quot;displayNSFW&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8375 <span class="hljs-attr">&quot;autoPlayVideo&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8376}
8377</code></pre>
8378 <!-- </div> -->
8379 </section>
8380 </div>
8381 </div>
8382 </div>
8383 <div id="definition-GetMeVideoRating" class="definition panel" data-traverse-target="definition-GetMeVideoRating">
8384 <h2 class="panel-title">
8385 <a name="/definitions/GetMeVideoRating"></a>GetMeVideoRating:
8386 <!-- <span class="json-property-type">
8387 <span class="json-property-type">object</span>
8388 <span class="json-property-range" title="Value limits"></span>
8389
8390
8391 </span> -->
8392 </h2>
8393 <div class="doc-row">
8394 <div class="doc-copy">
8395 <section class="json-schema-properties">
8396 <dl>
8397 <dt data-property-name="id" class="has-description">
8398 <span class="json-property-name">id:</span>
8399 <span class="json-property-type">string</span>
8400 <span class="json-property-range" title="Value limits"></span>
8401 <span class="json-property-required"></span>
8402 </dt>
8403 <dd>
8404 <p>Id of the video </p>
8405 </dd>
8406 <dt data-property-name="rating" class="has-description">
8407 <span class="json-property-name">rating:</span>
8408 <span class="json-property-type">number</span>
8409 <span class="json-property-range" title="Value limits"></span>
8410 <span class="json-property-required"></span>
8411 </dt>
8412 <dd>
8413 <p>Rating of the video </p>
8414 </dd>
8415 </dl>
8416 </section>
8417 </div>
8418 <div class="doc-examples">
8419 <section>
8420 <h5>Example</h5>
8421 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8422 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8423 <span class="hljs-attr">&quot;rating&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>
8424}
8425</code></pre>
8426 <!-- </div> -->
8427 </section>
8428 </div>
8429 </div>
8430 </div>
8431 <div id="definition-RegisterUser" class="definition panel" data-traverse-target="definition-RegisterUser">
8432 <h2 class="panel-title">
8433 <a name="/definitions/RegisterUser"></a>RegisterUser:
8434 <!-- <span class="json-property-type">
8435 <span class="json-property-type">object</span>
8436 <span class="json-property-range" title="Value limits"></span>
8437
8438
8439 </span> -->
8440 </h2>
8441 <div class="doc-row">
8442 <div class="doc-copy">
8443 <section class="json-schema-properties">
8444 <dl>
8445 <dt data-property-name="username" class="has-description">
8446 <span class="json-property-name">username:</span>
8447 <span class="json-property-type">string</span>
8448 <span class="json-property-range" title="Value limits"></span>
8449 <span class="json-property-required"></span>
8450 </dt>
8451 <dd>
8452 <p>The username of the user </p>
8453 </dd>
8454 <dt data-property-name="password" class="has-description">
8455 <span class="json-property-name">password:</span>
8456 <span class="json-property-type">string</span>
8457 <span class="json-property-range" title="Value limits"></span>
8458 <span class="json-property-required"></span>
8459 </dt>
8460 <dd>
8461 <p>The password of the user </p>
8462 </dd>
8463 <dt data-property-name="email" class="has-description">
8464 <span class="json-property-name">email:</span>
8465 <span class="json-property-type">string</span>
8466 <span class="json-property-range" title="Value limits"></span>
8467 <span class="json-property-required"></span>
8468 </dt>
8469 <dd>
8470 <p>The email of the user </p>
8471 </dd>
8472 </dl>
8473 </section>
8474 </div>
8475 <div class="doc-examples">
8476 <section>
8477 <h5>Example</h5>
8478 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8479 <span class="hljs-attr">&quot;username&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8480 <span class="hljs-attr">&quot;password&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8481 <span class="hljs-attr">&quot;email&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8482}
8483</code></pre>
8484 <!-- </div> -->
8485 </section>
8486 </div>
8487 </div>
8488 </div>
8489 <div id="definition-VideoChannelInput" class="definition panel" data-traverse-target="definition-VideoChannelInput">
8490 <h2 class="panel-title">
8491 <a name="/definitions/VideoChannelInput"></a>VideoChannelInput:
8492 <!-- <span class="json-property-type">
8493 <span class="json-property-type">object</span>
8494 <span class="json-property-range" title="Value limits"></span>
8495
8496
8497 </span> -->
8498 </h2>
8499 <div class="doc-row">
8500 <div class="doc-copy">
8501 <section class="json-schema-properties">
8502 <dl>
8503 <dt data-property-name="name">
8504 <span class="json-property-name">name:</span>
8505 <span class="json-property-type">string</span>
8506 <span class="json-property-range" title="Value limits"></span>
8507 </dt>
8508 <dt data-property-name="description">
8509 <span class="json-property-name">description:</span>
8510 <span class="json-property-type">string</span>
8511 <span class="json-property-range" title="Value limits"></span>
8512 </dt>
8513 </dl>
8514 </section>
8515 </div>
8516 <div class="doc-examples">
8517 <section>
8518 <h5>Example</h5>
8519 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
8520 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
8521 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
8522}
8523</code></pre>
8524 <!-- </div> -->
8525 </section>
8526 </div>
8527 </div>
8528 </div>
8529 <div class="doc-row no-margin">
8530 <div class="doc-copy doc-separator">
8531 <a class="powered-by" href="https://sourcey.com/spectacle">Documentation by
8532 <span>Spectacle</span>
8533 </a>
8534 </div>
8535 </div>
8536 </article>
8537 </div>
8538 </div>
8539 </body>
8540</html> \ No newline at end of file
diff --git a/support/doc/api/html/javascripts/spectacle.js b/support/doc/api/html/javascripts/spectacle.js
deleted file mode 100644
index e75fc6a3a..000000000
--- a/support/doc/api/html/javascripts/spectacle.js
+++ /dev/null
@@ -1,242 +0,0 @@
1$(function() {
2 // $(document).foundation();
3
4 var $sidebar = $('#sidebar');
5 if ($sidebar.length) {
6 var $docs = $('#docs');
7 var $nav = $sidebar.find('nav');
8
9 //
10 // Setup sidebar navigation
11 var traverse = new Traverse($nav, {
12 threshold: 10,
13 barOffset: $sidebar.position().top
14 });
15
16 $nav.on('update.traverse', function(event, element) {
17 $nav.find('section').removeClass('expand');
18 var $section = element.parents('section:first');
19 if ($section.length) {
20 $section.addClass('expand');
21 }
22 });
23
24 //
25 // Bind the drawer layout
26 var $drawerLayout = $('.drawer-layout'),
27 $drawer = $drawerLayout.find('.drawer'),
28 closeDrawer = function() {
29 $drawer.removeClass('slide-right slide-left');
30 $drawer.find('.drawer-overlay').remove();
31 $drawerLayout.removeClass('drawer-open drawer-slide-left-large drawer-slide-right-large');
32 return false;
33 };
34
35 // Drawer open buttons
36 $drawerLayout.find('[data-drawer-slide]').click(function(e) {
37 var $this = $(this),
38 direction = $this.data('drawer-slide');
39 $drawerLayout.addClass('drawer-open');
40 $drawer.addClass('slide-' + direction);
41
42 var $overlay = $('<a href="#" class="drawer-overlay"></a>')
43 $drawer.append($overlay);
44 $overlay.click(closeDrawer);
45
46 return false;
47 });
48
49 // Drawer close buttons
50 $drawerLayout.find('[data-drawer-close]').click(closeDrawer);
51 }
52});
53
54/**
55 * Creates a new instance of Traverse.
56 * @class
57 * @fires Traverse#init
58 * @param {Object} element - jQuery object to add the trigger to.
59 * @param {Object} options - Overrides to the default plugin settings.
60 */
61function Traverse(element, options) {
62 this.$element = element;
63 this.options = $.extend({}, Traverse.defaults, this.$element.data(), options);
64
65 this._init();
66}
67
68/**
69 * Default settings for plugin
70 */
71Traverse.defaults = {
72 /**
73 * Amount of time, in ms, the animated scrolling should take between locations.
74 * @option
75 * @example 500
76 */
77 animationDuration: 500,
78 /**
79 * Animation style to use when scrolling between locations.
80 * @option
81 * @example 'ease-in-out'
82 */
83 animationEasing: 'linear',
84 /**
85 * Number of pixels to use as a marker for location changes.
86 * @option
87 * @example 50
88 */
89 threshold: 50,
90 /**
91 * Class applied to the active locations link on the traverse container.
92 * @option
93 * @example 'active'
94 */
95 activeClass: 'active',
96 /**
97 * Allows the script to manipulate the url of the current page, and if supported, alter the history.
98 * @option
99 * @example true
100 */
101 deepLinking: false,
102 /**
103 * Number of pixels to offset the scroll of the page on item click if using a sticky nav bar.
104 * @option
105 * @example 25
106 */
107 barOffset: 0
108};
109
110/**
111 * Initializes the Traverse plugin and calls functions to get equalizer functioning on load.
112 * @private
113 */
114Traverse.prototype._init = function() {
115 var id = this.$element[0].id, // || Foundation.GetYoDigits(6, 'traverse'),
116 _this = this;
117 this.$targets = $('[data-traverse-target]');
118 this.$links = this.$element.find('a');
119 this.$element.attr({
120 'data-resize': id,
121 'data-scroll': id,
122 'id': id
123 });
124 this.$active = $();
125 this.scrollPos = parseInt(window.pageYOffset, 10);
126
127 this._events();
128};
129
130/**
131 * Calculates an array of pixel values that are the demarcation lines between locations on the page.
132 * Can be invoked if new elements are added or the size of a location changes.
133 * @function
134 */
135Traverse.prototype.calcPoints = function(){
136 var _this = this,
137 body = document.body,
138 html = document.documentElement;
139
140 this.points = [];
141 this.winHeight = Math.round(Math.max(window.innerHeight, html.clientHeight));
142 this.docHeight = Math.round(Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight));
143
144 this.$targets.each(function(){
145 var $tar = $(this),
146 pt = $tar.offset().top; // Math.round($tar.offset().top - _this.options.threshold);
147 $tar.targetPoint = pt;
148 _this.points.push(pt);
149 });
150};
151
152/**
153 * Initializes events for Traverse.
154 * @private
155 */
156Traverse.prototype._events = function() {
157 var _this = this,
158 $body = $('html, body'),
159 opts = {
160 duration: _this.options.animationDuration,
161 easing: _this.options.animationEasing
162 };
163
164 $(window).one('load', function(){
165 _this.calcPoints();
166 _this._updateActive();
167
168 $(this).resize(function(e) {
169 _this.reflow();
170 }).scroll(function(e) {
171 _this._updateActive();
172 });
173 })
174
175 this.$element.on('click', 'a[href^="#"]', function(e) { //'click.zf.traverse'
176 e.preventDefault();
177 var arrival = this.getAttribute('href').replace(".", "\\."),
178 scrollPos = $(arrival).offset().top - _this.options.barOffset; // - _this.options.threshold / 2 - _this.options.barOffset;
179
180 $body.stop(true).animate({
181 scrollTop: scrollPos
182 }, opts);
183 });
184};
185
186/**
187 * Calls necessary functions to update Traverse upon DOM change
188 * @function
189 */
190Traverse.prototype.reflow = function(){
191 this.calcPoints();
192 this._updateActive();
193};
194
195/**
196 * Updates the visibility of an active location link,
197 * and updates the url hash for the page, if deepLinking enabled.
198 * @private
199 * @function
200 * @fires Traverse#update
201 */
202 Traverse.prototype._updateActive = function(){
203 var winPos = parseInt(window.pageYOffset, 10),
204 curIdx;
205
206 if(winPos + this.winHeight === this.docHeight){ curIdx = this.points.length - 1; }
207 else if(winPos < this.points[0]){ curIdx = 0; }
208 else{
209 var isDown = this.scrollPos < winPos,
210 _this = this,
211 curVisible = this.points.filter(function(p, i){
212 return isDown ?
213 p <= (winPos + _this.options.barOffset + _this.options.threshold) :
214 (p - (_this.options.barOffset + _this.options.threshold)) <= winPos;
215 // p <= (winPos - (offset - _this.options.threshold)) :
216 // (p - (-offset + _this.options.threshold)) <= winPos;
217 });
218 curIdx = curVisible.length ? curVisible.length - 1 : 0;
219 }
220
221 var $prev = this.$active;
222 var $next = this.$links.eq(curIdx);
223 this.$active.removeClass(this.options.activeClass);
224 this.$active = $next.addClass(this.options.activeClass);
225
226 if(this.options.deepLinking){
227 var hash = this.$active[0].getAttribute('href');
228 if(window.history.pushState){
229 window.history.pushState(null, null, hash);
230 }else{
231 window.location.hash = hash;
232 }
233 }
234
235 this.scrollPos = winPos;
236
237 // Fire event if the active element was changed
238 var changed = $prev[0] !== $next[0];
239 if (changed) {
240 this.$element.trigger('update.traverse', [this.$active]);
241 }
242 };
diff --git a/support/doc/api/html/javascripts/spectacle.min.js b/support/doc/api/html/javascripts/spectacle.min.js
deleted file mode 100644
index f8d0b1fbd..000000000
--- a/support/doc/api/html/javascripts/spectacle.min.js
+++ /dev/null
@@ -1 +0,0 @@
1function Traverse(t,e){this.$element=t,this.options=$.extend({},Traverse.defaults,this.$element.data(),e),this._init()}$(function(){var t=$("#sidebar");if(t.length){$("#docs");var s=t.find("nav");new Traverse(s,{threshold:10,barOffset:t.position().top});s.on("update.traverse",function(t,e){s.find("section").removeClass("expand");var i=e.parents("section:first");i.length&&i.addClass("expand")});var a=$(".drawer-layout"),n=a.find(".drawer"),r=function(){return n.removeClass("slide-right slide-left"),n.find(".drawer-overlay").remove(),a.removeClass("drawer-open drawer-slide-left-large drawer-slide-right-large"),!1};a.find("[data-drawer-slide]").click(function(t){var e=$(this).data("drawer-slide");a.addClass("drawer-open"),n.addClass("slide-"+e);var i=$('<a href="#" class="drawer-overlay"></a>');return n.append(i),i.click(r),!1}),a.find("[data-drawer-close]").click(r)}}),Traverse.defaults={animationDuration:500,animationEasing:"linear",threshold:50,activeClass:"active",deepLinking:!1,barOffset:0},Traverse.prototype._init=function(){var t=this.$element[0].id;this.$targets=$("[data-traverse-target]"),this.$links=this.$element.find("a"),this.$element.attr({"data-resize":t,"data-scroll":t,id:t}),this.$active=$(),this.scrollPos=parseInt(window.pageYOffset,10),this._events()},Traverse.prototype.calcPoints=function(){var i=this,t=document.body,e=document.documentElement;this.points=[],this.winHeight=Math.round(Math.max(window.innerHeight,e.clientHeight)),this.docHeight=Math.round(Math.max(t.scrollHeight,t.offsetHeight,e.clientHeight,e.scrollHeight,e.offsetHeight)),this.$targets.each(function(){var t=$(this),e=t.offset().top;t.targetPoint=e,i.points.push(e)})},Traverse.prototype._events=function(){var s=this,a=$("html, body"),n={duration:s.options.animationDuration,easing:s.options.animationEasing};$(window).one("load",function(){s.calcPoints(),s._updateActive(),$(this).resize(function(t){s.reflow()}).scroll(function(t){s._updateActive()})}),this.$element.on("click",'a[href^="#"]',function(t){t.preventDefault();var e=this.getAttribute("href").replace(".","\\."),i=$(e).offset().top-s.options.barOffset;a.stop(!0).animate({scrollTop:i},n)})},Traverse.prototype.reflow=function(){this.calcPoints(),this._updateActive()},Traverse.prototype._updateActive=function(){var t,i=parseInt(window.pageYOffset,10);if(i+this.winHeight===this.docHeight)t=this.points.length-1;else if(i<this.points[0])t=0;else{var s=this.scrollPos<i,a=this,e=this.points.filter(function(t,e){return s?t<=i+a.options.barOffset+a.options.threshold:t-(a.options.barOffset+a.options.threshold)<=i});t=e.length?e.length-1:0}var n=this.$active,r=this.$links.eq(t);if(this.$active.removeClass(this.options.activeClass),this.$active=r.addClass(this.options.activeClass),this.options.deepLinking){var o=this.$active[0].getAttribute("href");window.history.pushState?window.history.pushState(null,null,o):window.location.hash=o}this.scrollPos=i,n[0]!==r[0]&&this.$element.trigger("update.traverse",[this.$active])}; \ No newline at end of file
diff --git a/support/doc/api/html/stylesheets/foundation.css b/support/doc/api/html/stylesheets/foundation.css
deleted file mode 100644
index 3345f1175..000000000
--- a/support/doc/api/html/stylesheets/foundation.css
+++ /dev/null
@@ -1,2285 +0,0 @@
1@charset "UTF-8";
2/**
3 * Foundation for Sites by ZURB
4 * Version 6.4.1
5 * foundation.zurb.com
6 * Licensed under MIT Open Source
7 */
8/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */
9/* Document
10 ========================================================================== */
11/**
12 * 1. Change the default font family in all browsers (opinionated).
13 * 2. Correct the line height in all browsers.
14 * 3. Prevent adjustments of font size after orientation changes in
15 * IE on Windows Phone and in iOS.
16 */
17html {
18 font-family: sans-serif;
19 /* 1 */
20 line-height: 1.15;
21 /* 2 */
22 -ms-text-size-adjust: 100%;
23 /* 3 */
24 -webkit-text-size-adjust: 100%;
25 /* 3 */ }
26
27/* Sections
28 ========================================================================== */
29/**
30 * Remove the margin in all browsers (opinionated).
31 */
32body {
33 margin: 0; }
34
35/**
36 * Add the correct display in IE 9-.
37 */
38article,
39aside,
40footer,
41header,
42nav,
43section {
44 display: block; }
45
46/**
47 * Correct the font size and margin on `h1` elements within `section` and
48 * `article` contexts in Chrome, Firefox, and Safari.
49 */
50h1 {
51 font-size: 2em;
52 margin: 0.67em 0; }
53
54/* Grouping content
55 ========================================================================== */
56/**
57 * Add the correct display in IE 9-.
58 */
59figcaption,
60figure {
61 display: block; }
62
63/**
64 * Add the correct margin in IE 8.
65 */
66figure {
67 margin: 1em 40px; }
68
69/**
70 * 1. Add the correct box sizing in Firefox.
71 * 2. Show the overflow in Edge and IE.
72 */
73hr {
74 box-sizing: content-box;
75 /* 1 */
76 height: 0;
77 /* 1 */
78 overflow: visible;
79 /* 2 */ }
80
81/**
82 * Add the correct display in IE.
83 */
84main {
85 display: block; }
86
87/**
88 * 1. Correct the inheritance and scaling of font size in all browsers.
89 * 2. Correct the odd `em` font sizing in all browsers.
90 */
91pre {
92 font-family: monospace, monospace;
93 /* 1 */
94 font-size: 1em;
95 /* 2 */ }
96
97/* Links
98 ========================================================================== */
99/**
100 * 1. Remove the gray background on active links in IE 10.
101 * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
102 */
103a {
104 background-color: transparent;
105 /* 1 */
106 -webkit-text-decoration-skip: objects;
107 /* 2 */ }
108
109/**
110 * Remove the outline on focused links when they are also active or hovered
111 * in all browsers (opinionated).
112 */
113a:active,
114a:hover {
115 outline-width: 0; }
116
117/* Text-level semantics
118 ========================================================================== */
119/**
120 * 1. Remove the bottom border in Firefox 39-.
121 * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
122 */
123abbr[title] {
124 border-bottom: none;
125 /* 1 */
126 text-decoration: underline;
127 /* 2 */
128 text-decoration: underline dotted;
129 /* 2 */ }
130
131/**
132 * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
133 */
134b,
135strong {
136 font-weight: inherit; }
137
138/**
139 * Add the correct font weight in Chrome, Edge, and Safari.
140 */
141b,
142strong {
143 font-weight: bolder; }
144
145/**
146 * 1. Correct the inheritance and scaling of font size in all browsers.
147 * 2. Correct the odd `em` font sizing in all browsers.
148 */
149code,
150kbd,
151samp {
152 font-family: monospace, monospace;
153 /* 1 */
154 font-size: 1em;
155 /* 2 */ }
156
157/**
158 * Add the correct font style in Android 4.3-.
159 */
160dfn {
161 font-style: italic; }
162
163/**
164 * Add the correct background and color in IE 9-.
165 */
166mark {
167 background-color: #ff0;
168 color: #000; }
169
170/**
171 * Add the correct font size in all browsers.
172 */
173small {
174 font-size: 80%; }
175
176/**
177 * Prevent `sub` and `sup` elements from affecting the line height in
178 * all browsers.
179 */
180sub,
181sup {
182 font-size: 75%;
183 line-height: 0;
184 position: relative;
185 vertical-align: baseline; }
186
187sub {
188 bottom: -0.25em; }
189
190sup {
191 top: -0.5em; }
192
193/* Embedded content
194 ========================================================================== */
195/**
196 * Add the correct display in IE 9-.
197 */
198audio,
199video {
200 display: inline-block; }
201
202/**
203 * Add the correct display in iOS 4-7.
204 */
205audio:not([controls]) {
206 display: none;
207 height: 0; }
208
209/**
210 * Remove the border on images inside links in IE 10-.
211 */
212img {
213 border-style: none; }
214
215/**
216 * Hide the overflow in IE.
217 */
218svg:not(:root) {
219 overflow: hidden; }
220
221/* Forms
222 ========================================================================== */
223/**
224 * 1. Change the font styles in all browsers (opinionated).
225 * 2. Remove the margin in Firefox and Safari.
226 */
227button,
228input,
229optgroup,
230select,
231textarea {
232 font-family: sans-serif;
233 /* 1 */
234 font-size: 100%;
235 /* 1 */
236 line-height: 1.15;
237 /* 1 */
238 margin: 0;
239 /* 2 */ }
240
241/**
242 * Show the overflow in IE.
243 */
244button {
245 overflow: visible; }
246
247/**
248 * Remove the inheritance of text transform in Edge, Firefox, and IE.
249 * 1. Remove the inheritance of text transform in Firefox.
250 */
251button,
252select {
253 /* 1 */
254 text-transform: none; }
255
256/**
257 * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
258 * controls in Android 4.
259 * 2. Correct the inability to style clickable types in iOS and Safari.
260 */
261button,
262html [type="button"],
263[type="reset"],
264[type="submit"] {
265 -webkit-appearance: button;
266 /* 2 */ }
267
268button,
269[type="button"],
270[type="reset"],
271[type="submit"] {
272 /**
273 * Remove the inner border and padding in Firefox.
274 */
275 /**
276 * Restore the focus styles unset by the previous rule.
277 */ }
278 button::-moz-focus-inner,
279 [type="button"]::-moz-focus-inner,
280 [type="reset"]::-moz-focus-inner,
281 [type="submit"]::-moz-focus-inner {
282 border-style: none;
283 padding: 0; }
284 button:-moz-focusring,
285 [type="button"]:-moz-focusring,
286 [type="reset"]:-moz-focusring,
287 [type="submit"]:-moz-focusring {
288 outline: 1px dotted ButtonText; }
289
290/**
291 * Show the overflow in Edge.
292 */
293input {
294 overflow: visible; }
295
296/**
297 * 1. Add the correct box sizing in IE 10-.
298 * 2. Remove the padding in IE 10-.
299 */
300[type="checkbox"],
301[type="radio"] {
302 box-sizing: border-box;
303 /* 1 */
304 padding: 0;
305 /* 2 */ }
306
307/**
308 * Correct the cursor style of increment and decrement buttons in Chrome.
309 */
310[type="number"]::-webkit-inner-spin-button,
311[type="number"]::-webkit-outer-spin-button {
312 height: auto; }
313
314/**
315 * 1. Correct the odd appearance in Chrome and Safari.
316 * 2. Correct the outline style in Safari.
317 */
318[type="search"] {
319 -webkit-appearance: textfield;
320 /* 1 */
321 outline-offset: -2px;
322 /* 2 */
323 /**
324 * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
325 */ }
326 [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration {
327 -webkit-appearance: none; }
328
329/**
330 * 1. Correct the inability to style clickable types in iOS and Safari.
331 * 2. Change font properties to `inherit` in Safari.
332 */
333::-webkit-file-upload-button {
334 -webkit-appearance: button;
335 /* 1 */
336 font: inherit;
337 /* 2 */ }
338
339/**
340 * Change the border, margin, and padding in all browsers (opinionated).
341 */
342fieldset {
343 border: 1px solid #c0c0c0;
344 margin: 0 2px;
345 padding: 0.35em 0.625em 0.75em; }
346
347/**
348 * 1. Correct the text wrapping in Edge and IE.
349 * 2. Correct the color inheritance from `fieldset` elements in IE.
350 * 3. Remove the padding so developers are not caught out when they zero out
351 * `fieldset` elements in all browsers.
352 */
353legend {
354 box-sizing: border-box;
355 /* 1 */
356 display: table;
357 /* 1 */
358 max-width: 100%;
359 /* 1 */
360 padding: 0;
361 /* 3 */
362 color: inherit;
363 /* 2 */
364 white-space: normal;
365 /* 1 */ }
366
367/**
368 * 1. Add the correct display in IE 9-.
369 * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
370 */
371progress {
372 display: inline-block;
373 /* 1 */
374 vertical-align: baseline;
375 /* 2 */ }
376
377/**
378 * Remove the default vertical scrollbar in IE.
379 */
380textarea {
381 overflow: auto; }
382
383/* Interactive
384 ========================================================================== */
385/*
386 * Add the correct display in Edge, IE, and Firefox.
387 */
388details {
389 display: block; }
390
391/*
392 * Add the correct display in all browsers.
393 */
394summary {
395 display: list-item; }
396
397/*
398 * Add the correct display in IE 9-.
399 */
400menu {
401 display: block; }
402
403/* Scripting
404 ========================================================================== */
405/**
406 * Add the correct display in IE 9-.
407 */
408canvas {
409 display: inline-block; }
410
411/**
412 * Add the correct display in IE.
413 */
414template {
415 display: none; }
416
417/* Hidden
418 ========================================================================== */
419/**
420 * Add the correct display in IE 10-.
421 */
422[hidden] {
423 display: none; }
424
425.foundation-mq {
426 font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; }
427
428html {
429 box-sizing: border-box;
430 font-size: 95%; }
431
432*,
433*::before,
434*::after {
435 box-sizing: inherit; }
436
437body {
438 margin: 0;
439 padding: 0;
440 background: #fefefe;
441 font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
442 font-weight: normal;
443 line-height: 1.5;
444 color: #2d3134;
445 -webkit-font-smoothing: antialiased;
446 -moz-osx-font-smoothing: grayscale; }
447
448img {
449 display: inline-block;
450 vertical-align: middle;
451 max-width: 100%;
452 height: auto;
453 -ms-interpolation-mode: bicubic; }
454
455textarea {
456 height: auto;
457 min-height: 50px;
458 border-radius: 0; }
459
460select {
461 box-sizing: border-box;
462 width: 100%;
463 border-radius: 0; }
464
465.map_canvas img,
466.map_canvas embed,
467.map_canvas object,
468.mqa-display img,
469.mqa-display embed,
470.mqa-display object {
471 max-width: none !important; }
472
473button {
474 padding: 0;
475 appearance: none;
476 border: 0;
477 border-radius: 0;
478 background: transparent;
479 line-height: 1; }
480 [data-whatinput='mouse'] button {
481 outline: 0; }
482
483pre {
484 overflow: auto; }
485
486button,
487input,
488optgroup,
489select,
490textarea {
491 font-family: inherit; }
492
493.is-visible {
494 display: block !important; }
495
496.is-hidden {
497 display: none !important; }
498
499.row {
500 max-width: auto;
501 margin-right: auto;
502 margin-left: auto; }
503 .row::before, .row::after {
504 display: table;
505 content: ' ';
506 flex-basis: 0;
507 order: 1; }
508 .row::after {
509 clear: both; }
510 .row.collapse > .column, .row.collapse > .columns {
511 padding-right: 0;
512 padding-left: 0; }
513 .row .row {
514 margin-right: -0.6578947368rem;
515 margin-left: -0.6578947368rem; }
516 @media print, screen and (min-width: 40em) {
517 .row .row {
518 margin-right: -0.9868421053rem;
519 margin-left: -0.9868421053rem; } }
520 @media print, screen and (min-width: 64em) {
521 .row .row {
522 margin-right: -0.9868421053rem;
523 margin-left: -0.9868421053rem; } }
524 .row .row.collapse {
525 margin-right: 0;
526 margin-left: 0; }
527 .row.expanded {
528 max-width: none; }
529 .row.expanded .row {
530 margin-right: auto;
531 margin-left: auto; }
532 .row:not(.expanded) .row {
533 max-width: none; }
534 .row.gutter-small > .column, .row.gutter-small > .columns {
535 padding-right: 0.6578947368rem;
536 padding-left: 0.6578947368rem; }
537 .row.gutter-medium > .column, .row.gutter-medium > .columns {
538 padding-right: 0.9868421053rem;
539 padding-left: 0.9868421053rem; }
540
541.column, .columns {
542 width: 100%;
543 float: left;
544 padding-right: 0.6578947368rem;
545 padding-left: 0.6578947368rem; }
546 @media print, screen and (min-width: 40em) {
547 .column, .columns {
548 padding-right: 0.9868421053rem;
549 padding-left: 0.9868421053rem; } }
550 .column:last-child:not(:first-child), .columns:last-child:not(:first-child) {
551 float: right; }
552 .column.end:last-child:last-child, .end.columns:last-child:last-child {
553 float: left; }
554
555.column.row.row, .row.row.columns {
556 float: none; }
557
558.row .column.row.row, .row .row.row.columns {
559 margin-right: 0;
560 margin-left: 0;
561 padding-right: 0;
562 padding-left: 0; }
563
564.small-1 {
565 width: 8.3333333333%; }
566
567.small-push-1 {
568 position: relative;
569 left: 8.3333333333%; }
570
571.small-pull-1 {
572 position: relative;
573 left: -8.3333333333%; }
574
575.small-offset-0 {
576 margin-left: 0%; }
577
578.small-2 {
579 width: 16.6666666667%; }
580
581.small-push-2 {
582 position: relative;
583 left: 16.6666666667%; }
584
585.small-pull-2 {
586 position: relative;
587 left: -16.6666666667%; }
588
589.small-offset-1 {
590 margin-left: 8.3333333333%; }
591
592.small-3 {
593 width: 25%; }
594
595.small-push-3 {
596 position: relative;
597 left: 25%; }
598
599.small-pull-3 {
600 position: relative;
601 left: -25%; }
602
603.small-offset-2 {
604 margin-left: 16.6666666667%; }
605
606.small-4 {
607 width: 33.3333333333%; }
608
609.small-push-4 {
610 position: relative;
611 left: 33.3333333333%; }
612
613.small-pull-4 {
614 position: relative;
615 left: -33.3333333333%; }
616
617.small-offset-3 {
618 margin-left: 25%; }
619
620.small-5 {
621 width: 41.6666666667%; }
622
623.small-push-5 {
624 position: relative;
625 left: 41.6666666667%; }
626
627.small-pull-5 {
628 position: relative;
629 left: -41.6666666667%; }
630
631.small-offset-4 {
632 margin-left: 33.3333333333%; }
633
634.small-6 {
635 width: 50%; }
636
637.small-push-6 {
638 position: relative;
639 left: 50%; }
640
641.small-pull-6 {
642 position: relative;
643 left: -50%; }
644
645.small-offset-5 {
646 margin-left: 41.6666666667%; }
647
648.small-7 {
649 width: 58.3333333333%; }
650
651.small-push-7 {
652 position: relative;
653 left: 58.3333333333%; }
654
655.small-pull-7 {
656 position: relative;
657 left: -58.3333333333%; }
658
659.small-offset-6 {
660 margin-left: 50%; }
661
662.small-8 {
663 width: 66.6666666667%; }
664
665.small-push-8 {
666 position: relative;
667 left: 66.6666666667%; }
668
669.small-pull-8 {
670 position: relative;
671 left: -66.6666666667%; }
672
673.small-offset-7 {
674 margin-left: 58.3333333333%; }
675
676.small-9 {
677 width: 75%; }
678
679.small-push-9 {
680 position: relative;
681 left: 75%; }
682
683.small-pull-9 {
684 position: relative;
685 left: -75%; }
686
687.small-offset-8 {
688 margin-left: 66.6666666667%; }
689
690.small-10 {
691 width: 83.3333333333%; }
692
693.small-push-10 {
694 position: relative;
695 left: 83.3333333333%; }
696
697.small-pull-10 {
698 position: relative;
699 left: -83.3333333333%; }
700
701.small-offset-9 {
702 margin-left: 75%; }
703
704.small-11 {
705 width: 91.6666666667%; }
706
707.small-push-11 {
708 position: relative;
709 left: 91.6666666667%; }
710
711.small-pull-11 {
712 position: relative;
713 left: -91.6666666667%; }
714
715.small-offset-10 {
716 margin-left: 83.3333333333%; }
717
718.small-12 {
719 width: 100%; }
720
721.small-offset-11 {
722 margin-left: 91.6666666667%; }
723
724.small-up-1 > .column, .small-up-1 > .columns {
725 float: left;
726 width: 100%; }
727 .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) {
728 clear: none; }
729 .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) {
730 clear: both; }
731 .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child {
732 float: left; }
733
734.small-up-2 > .column, .small-up-2 > .columns {
735 float: left;
736 width: 50%; }
737 .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) {
738 clear: none; }
739 .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) {
740 clear: both; }
741 .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child {
742 float: left; }
743
744.small-up-3 > .column, .small-up-3 > .columns {
745 float: left;
746 width: 33.3333333333%; }
747 .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) {
748 clear: none; }
749 .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) {
750 clear: both; }
751 .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child {
752 float: left; }
753
754.small-up-4 > .column, .small-up-4 > .columns {
755 float: left;
756 width: 25%; }
757 .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) {
758 clear: none; }
759 .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) {
760 clear: both; }
761 .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child {
762 float: left; }
763
764.small-up-5 > .column, .small-up-5 > .columns {
765 float: left;
766 width: 20%; }
767 .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) {
768 clear: none; }
769 .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) {
770 clear: both; }
771 .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child {
772 float: left; }
773
774.small-up-6 > .column, .small-up-6 > .columns {
775 float: left;
776 width: 16.6666666667%; }
777 .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) {
778 clear: none; }
779 .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) {
780 clear: both; }
781 .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child {
782 float: left; }
783
784.small-up-7 > .column, .small-up-7 > .columns {
785 float: left;
786 width: 14.2857142857%; }
787 .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) {
788 clear: none; }
789 .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) {
790 clear: both; }
791 .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child {
792 float: left; }
793
794.small-up-8 > .column, .small-up-8 > .columns {
795 float: left;
796 width: 12.5%; }
797 .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) {
798 clear: none; }
799 .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) {
800 clear: both; }
801 .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child {
802 float: left; }
803
804.small-collapse > .column, .small-collapse > .columns {
805 padding-right: 0;
806 padding-left: 0; }
807
808.small-collapse .row {
809 margin-right: 0;
810 margin-left: 0; }
811
812.expanded.row .small-collapse.row {
813 margin-right: 0;
814 margin-left: 0; }
815
816.small-uncollapse > .column, .small-uncollapse > .columns {
817 padding-right: 0.6578947368rem;
818 padding-left: 0.6578947368rem; }
819
820.small-centered {
821 margin-right: auto;
822 margin-left: auto; }
823 .small-centered, .small-centered:last-child:not(:first-child) {
824 float: none;
825 clear: both; }
826
827.small-uncentered,
828.small-push-0,
829.small-pull-0 {
830 position: static;
831 float: left;
832 margin-right: 0;
833 margin-left: 0; }
834
835@media print, screen and (min-width: 40em) {
836 .medium-1 {
837 width: 8.3333333333%; }
838 .medium-push-1 {
839 position: relative;
840 left: 8.3333333333%; }
841 .medium-pull-1 {
842 position: relative;
843 left: -8.3333333333%; }
844 .medium-offset-0 {
845 margin-left: 0%; }
846 .medium-2 {
847 width: 16.6666666667%; }
848 .medium-push-2 {
849 position: relative;
850 left: 16.6666666667%; }
851 .medium-pull-2 {
852 position: relative;
853 left: -16.6666666667%; }
854 .medium-offset-1 {
855 margin-left: 8.3333333333%; }
856 .medium-3 {
857 width: 25%; }
858 .medium-push-3 {
859 position: relative;
860 left: 25%; }
861 .medium-pull-3 {
862 position: relative;
863 left: -25%; }
864 .medium-offset-2 {
865 margin-left: 16.6666666667%; }
866 .medium-4 {
867 width: 33.3333333333%; }
868 .medium-push-4 {
869 position: relative;
870 left: 33.3333333333%; }
871 .medium-pull-4 {
872 position: relative;
873 left: -33.3333333333%; }
874 .medium-offset-3 {
875 margin-left: 25%; }
876 .medium-5 {
877 width: 41.6666666667%; }
878 .medium-push-5 {
879 position: relative;
880 left: 41.6666666667%; }
881 .medium-pull-5 {
882 position: relative;
883 left: -41.6666666667%; }
884 .medium-offset-4 {
885 margin-left: 33.3333333333%; }
886 .medium-6 {
887 width: 50%; }
888 .medium-push-6 {
889 position: relative;
890 left: 50%; }
891 .medium-pull-6 {
892 position: relative;
893 left: -50%; }
894 .medium-offset-5 {
895 margin-left: 41.6666666667%; }
896 .medium-7 {
897 width: 58.3333333333%; }
898 .medium-push-7 {
899 position: relative;
900 left: 58.3333333333%; }
901 .medium-pull-7 {
902 position: relative;
903 left: -58.3333333333%; }
904 .medium-offset-6 {
905 margin-left: 50%; }
906 .medium-8 {
907 width: 66.6666666667%; }
908 .medium-push-8 {
909 position: relative;
910 left: 66.6666666667%; }
911 .medium-pull-8 {
912 position: relative;
913 left: -66.6666666667%; }
914 .medium-offset-7 {
915 margin-left: 58.3333333333%; }
916 .medium-9 {
917 width: 75%; }
918 .medium-push-9 {
919 position: relative;
920 left: 75%; }
921 .medium-pull-9 {
922 position: relative;
923 left: -75%; }
924 .medium-offset-8 {
925 margin-left: 66.6666666667%; }
926 .medium-10 {
927 width: 83.3333333333%; }
928 .medium-push-10 {
929 position: relative;
930 left: 83.3333333333%; }
931 .medium-pull-10 {
932 position: relative;
933 left: -83.3333333333%; }
934 .medium-offset-9 {
935 margin-left: 75%; }
936 .medium-11 {
937 width: 91.6666666667%; }
938 .medium-push-11 {
939 position: relative;
940 left: 91.6666666667%; }
941 .medium-pull-11 {
942 position: relative;
943 left: -91.6666666667%; }
944 .medium-offset-10 {
945 margin-left: 83.3333333333%; }
946 .medium-12 {
947 width: 100%; }
948 .medium-offset-11 {
949 margin-left: 91.6666666667%; }
950 .medium-up-1 > .column, .medium-up-1 > .columns {
951 float: left;
952 width: 100%; }
953 .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) {
954 clear: none; }
955 .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) {
956 clear: both; }
957 .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child {
958 float: left; }
959 .medium-up-2 > .column, .medium-up-2 > .columns {
960 float: left;
961 width: 50%; }
962 .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) {
963 clear: none; }
964 .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) {
965 clear: both; }
966 .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child {
967 float: left; }
968 .medium-up-3 > .column, .medium-up-3 > .columns {
969 float: left;
970 width: 33.3333333333%; }
971 .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) {
972 clear: none; }
973 .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) {
974 clear: both; }
975 .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child {
976 float: left; }
977 .medium-up-4 > .column, .medium-up-4 > .columns {
978 float: left;
979 width: 25%; }
980 .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) {
981 clear: none; }
982 .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) {
983 clear: both; }
984 .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child {
985 float: left; }
986 .medium-up-5 > .column, .medium-up-5 > .columns {
987 float: left;
988 width: 20%; }
989 .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) {
990 clear: none; }
991 .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) {
992 clear: both; }
993 .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child {
994 float: left; }
995 .medium-up-6 > .column, .medium-up-6 > .columns {
996 float: left;
997 width: 16.6666666667%; }
998 .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) {
999 clear: none; }
1000 .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) {
1001 clear: both; }
1002 .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child {
1003 float: left; }
1004 .medium-up-7 > .column, .medium-up-7 > .columns {
1005 float: left;
1006 width: 14.2857142857%; }
1007 .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) {
1008 clear: none; }
1009 .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) {
1010 clear: both; }
1011 .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child {
1012 float: left; }
1013 .medium-up-8 > .column, .medium-up-8 > .columns {
1014 float: left;
1015 width: 12.5%; }
1016 .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) {
1017 clear: none; }
1018 .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) {
1019 clear: both; }
1020 .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child {
1021 float: left; }
1022 .medium-collapse > .column, .medium-collapse > .columns {
1023 padding-right: 0;
1024 padding-left: 0; }
1025 .medium-collapse .row {
1026 margin-right: 0;
1027 margin-left: 0; }
1028 .expanded.row .medium-collapse.row {
1029 margin-right: 0;
1030 margin-left: 0; }
1031 .medium-uncollapse > .column, .medium-uncollapse > .columns {
1032 padding-right: 0.9868421053rem;
1033 padding-left: 0.9868421053rem; }
1034 .medium-centered {
1035 margin-right: auto;
1036 margin-left: auto; }
1037 .medium-centered, .medium-centered:last-child:not(:first-child) {
1038 float: none;
1039 clear: both; }
1040 .medium-uncentered,
1041 .medium-push-0,
1042 .medium-pull-0 {
1043 position: static;
1044 float: left;
1045 margin-right: 0;
1046 margin-left: 0; } }
1047
1048@media print, screen and (min-width: 64em) {
1049 .large-1 {
1050 width: 8.3333333333%; }
1051 .large-push-1 {
1052 position: relative;
1053 left: 8.3333333333%; }
1054 .large-pull-1 {
1055 position: relative;
1056 left: -8.3333333333%; }
1057 .large-offset-0 {
1058 margin-left: 0%; }
1059 .large-2 {
1060 width: 16.6666666667%; }
1061 .large-push-2 {
1062 position: relative;
1063 left: 16.6666666667%; }
1064 .large-pull-2 {
1065 position: relative;
1066 left: -16.6666666667%; }
1067 .large-offset-1 {
1068 margin-left: 8.3333333333%; }
1069 .large-3 {
1070 width: 25%; }
1071 .large-push-3 {
1072 position: relative;
1073 left: 25%; }
1074 .large-pull-3 {
1075 position: relative;
1076 left: -25%; }
1077 .large-offset-2 {
1078 margin-left: 16.6666666667%; }
1079 .large-4 {
1080 width: 33.3333333333%; }
1081 .large-push-4 {
1082 position: relative;
1083 left: 33.3333333333%; }
1084 .large-pull-4 {
1085 position: relative;
1086 left: -33.3333333333%; }
1087 .large-offset-3 {
1088 margin-left: 25%; }
1089 .large-5 {
1090 width: 41.6666666667%; }
1091 .large-push-5 {
1092 position: relative;
1093 left: 41.6666666667%; }
1094 .large-pull-5 {
1095 position: relative;
1096 left: -41.6666666667%; }
1097 .large-offset-4 {
1098 margin-left: 33.3333333333%; }
1099 .large-6 {
1100 width: 50%; }
1101 .large-push-6 {
1102 position: relative;
1103 left: 50%; }
1104 .large-pull-6 {
1105 position: relative;
1106 left: -50%; }
1107 .large-offset-5 {
1108 margin-left: 41.6666666667%; }
1109 .large-7 {
1110 width: 58.3333333333%; }
1111 .large-push-7 {
1112 position: relative;
1113 left: 58.3333333333%; }
1114 .large-pull-7 {
1115 position: relative;
1116 left: -58.3333333333%; }
1117 .large-offset-6 {
1118 margin-left: 50%; }
1119 .large-8 {
1120 width: 66.6666666667%; }
1121 .large-push-8 {
1122 position: relative;
1123 left: 66.6666666667%; }
1124 .large-pull-8 {
1125 position: relative;
1126 left: -66.6666666667%; }
1127 .large-offset-7 {
1128 margin-left: 58.3333333333%; }
1129 .large-9 {
1130 width: 75%; }
1131 .large-push-9 {
1132 position: relative;
1133 left: 75%; }
1134 .large-pull-9 {
1135 position: relative;
1136 left: -75%; }
1137 .large-offset-8 {
1138 margin-left: 66.6666666667%; }
1139 .large-10 {
1140 width: 83.3333333333%; }
1141 .large-push-10 {
1142 position: relative;
1143 left: 83.3333333333%; }
1144 .large-pull-10 {
1145 position: relative;
1146 left: -83.3333333333%; }
1147 .large-offset-9 {
1148 margin-left: 75%; }
1149 .large-11 {
1150 width: 91.6666666667%; }
1151 .large-push-11 {
1152 position: relative;
1153 left: 91.6666666667%; }
1154 .large-pull-11 {
1155 position: relative;
1156 left: -91.6666666667%; }
1157 .large-offset-10 {
1158 margin-left: 83.3333333333%; }
1159 .large-12 {
1160 width: 100%; }
1161 .large-offset-11 {
1162 margin-left: 91.6666666667%; }
1163 .large-up-1 > .column, .large-up-1 > .columns {
1164 float: left;
1165 width: 100%; }
1166 .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) {
1167 clear: none; }
1168 .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) {
1169 clear: both; }
1170 .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child {
1171 float: left; }
1172 .large-up-2 > .column, .large-up-2 > .columns {
1173 float: left;
1174 width: 50%; }
1175 .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) {
1176 clear: none; }
1177 .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) {
1178 clear: both; }
1179 .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child {
1180 float: left; }
1181 .large-up-3 > .column, .large-up-3 > .columns {
1182 float: left;
1183 width: 33.3333333333%; }
1184 .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) {
1185 clear: none; }
1186 .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) {
1187 clear: both; }
1188 .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child {
1189 float: left; }
1190 .large-up-4 > .column, .large-up-4 > .columns {
1191 float: left;
1192 width: 25%; }
1193 .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) {
1194 clear: none; }
1195 .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) {
1196 clear: both; }
1197 .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child {
1198 float: left; }
1199 .large-up-5 > .column, .large-up-5 > .columns {
1200 float: left;
1201 width: 20%; }
1202 .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) {
1203 clear: none; }
1204 .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) {
1205 clear: both; }
1206 .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child {
1207 float: left; }
1208 .large-up-6 > .column, .large-up-6 > .columns {
1209 float: left;
1210 width: 16.6666666667%; }
1211 .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) {
1212 clear: none; }
1213 .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) {
1214 clear: both; }
1215 .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child {
1216 float: left; }
1217 .large-up-7 > .column, .large-up-7 > .columns {
1218 float: left;
1219 width: 14.2857142857%; }
1220 .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) {
1221 clear: none; }
1222 .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) {
1223 clear: both; }
1224 .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child {
1225 float: left; }
1226 .large-up-8 > .column, .large-up-8 > .columns {
1227 float: left;
1228 width: 12.5%; }
1229 .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) {
1230 clear: none; }
1231 .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) {
1232 clear: both; }
1233 .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child {
1234 float: left; }
1235 .large-collapse > .column, .large-collapse > .columns {
1236 padding-right: 0;
1237 padding-left: 0; }
1238 .large-collapse .row {
1239 margin-right: 0;
1240 margin-left: 0; }
1241 .expanded.row .large-collapse.row {
1242 margin-right: 0;
1243 margin-left: 0; }
1244 .large-uncollapse > .column, .large-uncollapse > .columns {
1245 padding-right: 0.9868421053rem;
1246 padding-left: 0.9868421053rem; }
1247 .large-centered {
1248 margin-right: auto;
1249 margin-left: auto; }
1250 .large-centered, .large-centered:last-child:not(:first-child) {
1251 float: none;
1252 clear: both; }
1253 .large-uncentered,
1254 .large-push-0,
1255 .large-pull-0 {
1256 position: static;
1257 float: left;
1258 margin-right: 0;
1259 margin-left: 0; } }
1260
1261.column-block {
1262 margin-bottom: 1.3157894737rem; }
1263 .column-block > :last-child {
1264 margin-bottom: 0; }
1265 @media print, screen and (min-width: 40em) {
1266 .column-block {
1267 margin-bottom: 1.9736842105rem; }
1268 .column-block > :last-child {
1269 margin-bottom: 0; } }
1270
1271div,
1272dl,
1273dt,
1274dd,
1275ul,
1276ol,
1277li,
1278h1,
1279h2,
1280h3,
1281h4,
1282h5,
1283h6,
1284pre,
1285form,
1286p,
1287blockquote,
1288th,
1289td {
1290 margin: 0;
1291 padding: 0; }
1292
1293p {
1294 margin-bottom: 1rem;
1295 font-size: inherit;
1296 line-height: 1.6;
1297 text-rendering: optimizeLegibility; }
1298
1299em,
1300i {
1301 font-style: italic;
1302 line-height: inherit; }
1303
1304strong,
1305b {
1306 font-weight: bold;
1307 line-height: inherit; }
1308
1309small {
1310 font-size: 80%;
1311 line-height: inherit; }
1312
1313h1,
1314h2,
1315h3,
1316h4,
1317h5,
1318h6 {
1319 font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
1320 font-style: normal;
1321 font-weight: normal;
1322 color: inherit;
1323 text-rendering: optimizeLegibility; }
1324 h1 small,
1325 h2 small,
1326 h3 small,
1327 h4 small,
1328 h5 small,
1329 h6 small {
1330 line-height: 0;
1331 color: #cacaca; }
1332
1333h1 {
1334 font-size: 1.5789473684rem;
1335 line-height: 1.4;
1336 margin-top: 0;
1337 margin-bottom: 0.5rem; }
1338
1339h2 {
1340 font-size: 1.3157894737rem;
1341 line-height: 1.4;
1342 margin-top: 0;
1343 margin-bottom: 0.5rem; }
1344
1345h3 {
1346 font-size: 1.25rem;
1347 line-height: 1.4;
1348 margin-top: 0;
1349 margin-bottom: 0.5rem; }
1350
1351h4 {
1352 font-size: 1.1842105263rem;
1353 line-height: 1.4;
1354 margin-top: 0;
1355 margin-bottom: 0.5rem; }
1356
1357h5 {
1358 font-size: 1.1184210526rem;
1359 line-height: 1.4;
1360 margin-top: 0;
1361 margin-bottom: 0.5rem; }
1362
1363h6 {
1364 font-size: 1.0526315789rem;
1365 line-height: 1.4;
1366 margin-top: 0;
1367 margin-bottom: 0.5rem; }
1368
1369@media print, screen and (min-width: 40em) {
1370 h1 {
1371 font-size: 1.7105263158rem; }
1372 h2 {
1373 font-size: 1.5789473684rem; }
1374 h3 {
1375 font-size: 1.3157894737rem; }
1376 h4 {
1377 font-size: 1.1842105263rem; }
1378 h5 {
1379 font-size: 1.1184210526rem; }
1380 h6 {
1381 font-size: 1.0526315789rem; } }
1382
1383a {
1384 line-height: inherit;
1385 color: #1779ba;
1386 text-decoration: none;
1387 cursor: pointer; }
1388 a:hover, a:focus {
1389 color: #1468a0; }
1390 a img {
1391 border: 0; }
1392
1393hr {
1394 clear: both;
1395 max-width: auto;
1396 height: 0;
1397 margin: 1.3157894737rem auto;
1398 border-top: 0;
1399 border-right: 0;
1400 border-bottom: 1px solid #cacaca;
1401 border-left: 0; }
1402
1403ul,
1404ol,
1405dl {
1406 margin-bottom: 1rem;
1407 list-style-position: outside;
1408 line-height: 1.6; }
1409
1410li {
1411 font-size: inherit; }
1412
1413ul {
1414 margin-left: 1.25rem;
1415 list-style-type: disc; }
1416
1417ol {
1418 margin-left: 1.25rem; }
1419
1420ul ul, ol ul, ul ol, ol ol {
1421 margin-left: 1.25rem;
1422 margin-bottom: 0; }
1423
1424dl {
1425 margin-bottom: 1rem; }
1426 dl dt {
1427 margin-bottom: 0.3rem;
1428 font-weight: bold; }
1429
1430blockquote {
1431 margin: 0 0 1rem;
1432 padding: 0.5921052632rem 1.3157894737rem 0 1.25rem;
1433 border-left: 1px solid #cacaca; }
1434 blockquote, blockquote p {
1435 line-height: 1.6;
1436 color: #8a8a8a; }
1437
1438cite {
1439 display: block;
1440 font-size: 0.8552631579rem;
1441 color: #8a8a8a; }
1442 cite:before {
1443 content: "— "; }
1444
1445abbr, abbr[title] {
1446 border-bottom: 1px dotted #2d3134;
1447 cursor: help;
1448 text-decoration: none; }
1449
1450figure {
1451 margin: 0; }
1452
1453code {
1454 padding: 0.1315789474rem 0.3289473684rem 0.0657894737rem;
1455 border: 1px solid #cacaca;
1456 background-color: #e6e6e6;
1457 font-family: Consolas, "Liberation Mono", Courier, monospace;
1458 font-weight: normal;
1459 color: #2d3134; }
1460
1461kbd {
1462 margin: 0;
1463 padding: 0.1315789474rem 0.2631578947rem 0;
1464 background-color: #e6e6e6;
1465 font-family: Consolas, "Liberation Mono", Courier, monospace;
1466 color: #2d3134; }
1467
1468.subheader {
1469 margin-top: 0.2rem;
1470 margin-bottom: 0.5rem;
1471 font-weight: normal;
1472 line-height: 1.4;
1473 color: #8a8a8a; }
1474
1475.lead {
1476 font-size: 118.75%;
1477 line-height: 1.6; }
1478
1479.stat {
1480 font-size: 2.5rem;
1481 line-height: 1; }
1482 p + .stat {
1483 margin-top: -1rem; }
1484
1485ul.no-bullet, ol.no-bullet {
1486 margin-left: 0;
1487 list-style: none; }
1488
1489.text-left {
1490 text-align: left; }
1491
1492.text-right {
1493 text-align: right; }
1494
1495.text-center {
1496 text-align: center; }
1497
1498.text-justify {
1499 text-align: justify; }
1500
1501@media print, screen and (min-width: 40em) {
1502 .medium-text-left {
1503 text-align: left; }
1504 .medium-text-right {
1505 text-align: right; }
1506 .medium-text-center {
1507 text-align: center; }
1508 .medium-text-justify {
1509 text-align: justify; } }
1510
1511@media print, screen and (min-width: 64em) {
1512 .large-text-left {
1513 text-align: left; }
1514 .large-text-right {
1515 text-align: right; }
1516 .large-text-center {
1517 text-align: center; }
1518 .large-text-justify {
1519 text-align: justify; } }
1520
1521.show-for-print {
1522 display: none !important; }
1523
1524@media print {
1525 * {
1526 background: transparent !important;
1527 box-shadow: none !important;
1528 color: black !important;
1529 text-shadow: none !important; }
1530 .show-for-print {
1531 display: block !important; }
1532 .hide-for-print {
1533 display: none !important; }
1534 table.show-for-print {
1535 display: table !important; }
1536 thead.show-for-print {
1537 display: table-header-group !important; }
1538 tbody.show-for-print {
1539 display: table-row-group !important; }
1540 tr.show-for-print {
1541 display: table-row !important; }
1542 td.show-for-print {
1543 display: table-cell !important; }
1544 th.show-for-print {
1545 display: table-cell !important; }
1546 a,
1547 a:visited {
1548 text-decoration: underline; }
1549 a[href]:after {
1550 content: " (" attr(href) ")"; }
1551 .ir a:after,
1552 a[href^='javascript:']:after,
1553 a[href^='#']:after {
1554 content: ''; }
1555 abbr[title]:after {
1556 content: " (" attr(title) ")"; }
1557 pre,
1558 blockquote {
1559 border: 1px solid #8a8a8a;
1560 page-break-inside: avoid; }
1561 thead {
1562 display: table-header-group; }
1563 tr,
1564 img {
1565 page-break-inside: avoid; }
1566 img {
1567 max-width: 100% !important; }
1568 @page {
1569 margin: 0.5cm; }
1570 p,
1571 h2,
1572 h3 {
1573 orphans: 3;
1574 widows: 3; }
1575 h2,
1576 h3 {
1577 page-break-after: avoid; }
1578 .print-break-inside {
1579 page-break-inside: auto; } }
1580
1581.button {
1582 display: inline-block;
1583 vertical-align: middle;
1584 margin: 0 0 1rem 0;
1585 font-family: inherit;
1586 padding: 0.85em 1em;
1587 -webkit-appearance: none;
1588 border: 1px solid transparent;
1589 border-radius: 0;
1590 transition: background-color 0.25s ease-out, color 0.25s ease-out;
1591 font-size: 0.9rem;
1592 line-height: 1;
1593 text-align: center;
1594 cursor: pointer;
1595 background-color: #1779ba;
1596 color: #fefefe; }
1597 [data-whatinput='mouse'] .button {
1598 outline: 0; }
1599 .button:hover, .button:focus {
1600 background-color: #14679e;
1601 color: #fefefe; }
1602 .button.tiny {
1603 font-size: 0.6rem; }
1604 .button.small {
1605 font-size: 0.75rem; }
1606 .button.large {
1607 font-size: 1.25rem; }
1608 .button.expanded {
1609 display: block;
1610 width: 100%;
1611 margin-right: 0;
1612 margin-left: 0; }
1613 .button.primary {
1614 background-color: #1779ba;
1615 color: #fefefe; }
1616 .button.primary:hover, .button.primary:focus {
1617 background-color: #126195;
1618 color: #fefefe; }
1619 .button.secondary {
1620 background-color: #767676;
1621 color: #fefefe; }
1622 .button.secondary:hover, .button.secondary:focus {
1623 background-color: #5e5e5e;
1624 color: #fefefe; }
1625 .button.success {
1626 background-color: #3adb76;
1627 color: #2d3134; }
1628 .button.success:hover, .button.success:focus {
1629 background-color: #22bb5b;
1630 color: #2d3134; }
1631 .button.warning {
1632 background-color: #ffae00;
1633 color: #2d3134; }
1634 .button.warning:hover, .button.warning:focus {
1635 background-color: #cc8b00;
1636 color: #2d3134; }
1637 .button.alert {
1638 background-color: #cc4b37;
1639 color: #fefefe; }
1640 .button.alert:hover, .button.alert:focus {
1641 background-color: #a53b2a;
1642 color: #fefefe; }
1643 .button.disabled, .button[disabled] {
1644 opacity: 0.25;
1645 cursor: not-allowed; }
1646 .button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus {
1647 background-color: #1779ba;
1648 color: #fefefe; }
1649 .button.disabled.primary, .button[disabled].primary {
1650 opacity: 0.25;
1651 cursor: not-allowed; }
1652 .button.disabled.primary, .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary, .button[disabled].primary:hover, .button[disabled].primary:focus {
1653 background-color: #1779ba;
1654 color: #fefefe; }
1655 .button.disabled.secondary, .button[disabled].secondary {
1656 opacity: 0.25;
1657 cursor: not-allowed; }
1658 .button.disabled.secondary, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
1659 background-color: #767676;
1660 color: #fefefe; }
1661 .button.disabled.success, .button[disabled].success {
1662 opacity: 0.25;
1663 cursor: not-allowed; }
1664 .button.disabled.success, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success, .button[disabled].success:hover, .button[disabled].success:focus {
1665 background-color: #3adb76;
1666 color: #2d3134; }
1667 .button.disabled.warning, .button[disabled].warning {
1668 opacity: 0.25;
1669 cursor: not-allowed; }
1670 .button.disabled.warning, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning, .button[disabled].warning:hover, .button[disabled].warning:focus {
1671 background-color: #ffae00;
1672 color: #2d3134; }
1673 .button.disabled.alert, .button[disabled].alert {
1674 opacity: 0.25;
1675 cursor: not-allowed; }
1676 .button.disabled.alert, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert, .button[disabled].alert:hover, .button[disabled].alert:focus {
1677 background-color: #cc4b37;
1678 color: #fefefe; }
1679 .button.hollow {
1680 border: 1px solid #1779ba;
1681 color: #1779ba; }
1682 .button.hollow, .button.hollow:hover, .button.hollow:focus {
1683 background-color: transparent; }
1684 .button.hollow.disabled, .button.hollow.disabled:hover, .button.hollow.disabled:focus, .button.hollow[disabled], .button.hollow[disabled]:hover, .button.hollow[disabled]:focus {
1685 background-color: transparent; }
1686 .button.hollow:hover, .button.hollow:focus {
1687 border-color: #0c3d5d;
1688 color: #0c3d5d; }
1689 .button.hollow:hover.disabled, .button.hollow:hover[disabled], .button.hollow:focus.disabled, .button.hollow:focus[disabled] {
1690 border: 1px solid #1779ba;
1691 color: #1779ba; }
1692 .button.hollow.primary {
1693 border: 1px solid #1779ba;
1694 color: #1779ba; }
1695 .button.hollow.primary:hover, .button.hollow.primary:focus {
1696 border-color: #0c3d5d;
1697 color: #0c3d5d; }
1698 .button.hollow.primary:hover.disabled, .button.hollow.primary:hover[disabled], .button.hollow.primary:focus.disabled, .button.hollow.primary:focus[disabled] {
1699 border: 1px solid #1779ba;
1700 color: #1779ba; }
1701 .button.hollow.secondary {
1702 border: 1px solid #767676;
1703 color: #767676; }
1704 .button.hollow.secondary:hover, .button.hollow.secondary:focus {
1705 border-color: #3b3b3b;
1706 color: #3b3b3b; }
1707 .button.hollow.secondary:hover.disabled, .button.hollow.secondary:hover[disabled], .button.hollow.secondary:focus.disabled, .button.hollow.secondary:focus[disabled] {
1708 border: 1px solid #767676;
1709 color: #767676; }
1710 .button.hollow.success {
1711 border: 1px solid #3adb76;
1712 color: #3adb76; }
1713 .button.hollow.success:hover, .button.hollow.success:focus {
1714 border-color: #157539;
1715 color: #157539; }
1716 .button.hollow.success:hover.disabled, .button.hollow.success:hover[disabled], .button.hollow.success:focus.disabled, .button.hollow.success:focus[disabled] {
1717 border: 1px solid #3adb76;
1718 color: #3adb76; }
1719 .button.hollow.warning {
1720 border: 1px solid #ffae00;
1721 color: #ffae00; }
1722 .button.hollow.warning:hover, .button.hollow.warning:focus {
1723 border-color: #805700;
1724 color: #805700; }
1725 .button.hollow.warning:hover.disabled, .button.hollow.warning:hover[disabled], .button.hollow.warning:focus.disabled, .button.hollow.warning:focus[disabled] {
1726 border: 1px solid #ffae00;
1727 color: #ffae00; }
1728 .button.hollow.alert {
1729 border: 1px solid #cc4b37;
1730 color: #cc4b37; }
1731 .button.hollow.alert:hover, .button.hollow.alert:focus {
1732 border-color: #67251a;
1733 color: #67251a; }
1734 .button.hollow.alert:hover.disabled, .button.hollow.alert:hover[disabled], .button.hollow.alert:focus.disabled, .button.hollow.alert:focus[disabled] {
1735 border: 1px solid #cc4b37;
1736 color: #cc4b37; }
1737 .button.clear {
1738 border: 1px solid #1779ba;
1739 color: #1779ba; }
1740 .button.clear, .button.clear:hover, .button.clear:focus {
1741 background-color: transparent; }
1742 .button.clear.disabled, .button.clear.disabled:hover, .button.clear.disabled:focus, .button.clear[disabled], .button.clear[disabled]:hover, .button.clear[disabled]:focus {
1743 background-color: transparent; }
1744 .button.clear:hover, .button.clear:focus {
1745 border-color: #0c3d5d;
1746 color: #0c3d5d; }
1747 .button.clear:hover.disabled, .button.clear:hover[disabled], .button.clear:focus.disabled, .button.clear:focus[disabled] {
1748 border: 1px solid #1779ba;
1749 color: #1779ba; }
1750 .button.clear, .button.clear.disabled, .button.clear[disabled], .button.clear:hover, .button.clear:hover.disabled, .button.clear:hover[disabled], .button.clear:focus, .button.clear:focus.disabled, .button.clear:focus[disabled] {
1751 border-color: transparent; }
1752 .button.clear.primary {
1753 border: 1px solid #1779ba;
1754 color: #1779ba; }
1755 .button.clear.primary:hover, .button.clear.primary:focus {
1756 border-color: #0c3d5d;
1757 color: #0c3d5d; }
1758 .button.clear.primary:hover.disabled, .button.clear.primary:hover[disabled], .button.clear.primary:focus.disabled, .button.clear.primary:focus[disabled] {
1759 border: 1px solid #1779ba;
1760 color: #1779ba; }
1761 .button.clear.primary, .button.clear.primary.disabled, .button.clear.primary[disabled], .button.clear.primary:hover, .button.clear.primary:hover.disabled, .button.clear.primary:hover[disabled], .button.clear.primary:focus, .button.clear.primary:focus.disabled, .button.clear.primary:focus[disabled] {
1762 border-color: transparent; }
1763 .button.clear.secondary {
1764 border: 1px solid #767676;
1765 color: #767676; }
1766 .button.clear.secondary:hover, .button.clear.secondary:focus {
1767 border-color: #3b3b3b;
1768 color: #3b3b3b; }
1769 .button.clear.secondary:hover.disabled, .button.clear.secondary:hover[disabled], .button.clear.secondary:focus.disabled, .button.clear.secondary:focus[disabled] {
1770 border: 1px solid #767676;
1771 color: #767676; }
1772 .button.clear.secondary, .button.clear.secondary.disabled, .button.clear.secondary[disabled], .button.clear.secondary:hover, .button.clear.secondary:hover.disabled, .button.clear.secondary:hover[disabled], .button.clear.secondary:focus, .button.clear.secondary:focus.disabled, .button.clear.secondary:focus[disabled] {
1773 border-color: transparent; }
1774 .button.clear.success {
1775 border: 1px solid #3adb76;
1776 color: #3adb76; }
1777 .button.clear.success:hover, .button.clear.success:focus {
1778 border-color: #157539;
1779 color: #157539; }
1780 .button.clear.success:hover.disabled, .button.clear.success:hover[disabled], .button.clear.success:focus.disabled, .button.clear.success:focus[disabled] {
1781 border: 1px solid #3adb76;
1782 color: #3adb76; }
1783 .button.clear.success, .button.clear.success.disabled, .button.clear.success[disabled], .button.clear.success:hover, .button.clear.success:hover.disabled, .button.clear.success:hover[disabled], .button.clear.success:focus, .button.clear.success:focus.disabled, .button.clear.success:focus[disabled] {
1784 border-color: transparent; }
1785 .button.clear.warning {
1786 border: 1px solid #ffae00;
1787 color: #ffae00; }
1788 .button.clear.warning:hover, .button.clear.warning:focus {
1789 border-color: #805700;
1790 color: #805700; }
1791 .button.clear.warning:hover.disabled, .button.clear.warning:hover[disabled], .button.clear.warning:focus.disabled, .button.clear.warning:focus[disabled] {
1792 border: 1px solid #ffae00;
1793 color: #ffae00; }
1794 .button.clear.warning, .button.clear.warning.disabled, .button.clear.warning[disabled], .button.clear.warning:hover, .button.clear.warning:hover.disabled, .button.clear.warning:hover[disabled], .button.clear.warning:focus, .button.clear.warning:focus.disabled, .button.clear.warning:focus[disabled] {
1795 border-color: transparent; }
1796 .button.clear.alert {
1797 border: 1px solid #cc4b37;
1798 color: #cc4b37; }
1799 .button.clear.alert:hover, .button.clear.alert:focus {
1800 border-color: #67251a;
1801 color: #67251a; }
1802 .button.clear.alert:hover.disabled, .button.clear.alert:hover[disabled], .button.clear.alert:focus.disabled, .button.clear.alert:focus[disabled] {
1803 border: 1px solid #cc4b37;
1804 color: #cc4b37; }
1805 .button.clear.alert, .button.clear.alert.disabled, .button.clear.alert[disabled], .button.clear.alert:hover, .button.clear.alert:hover.disabled, .button.clear.alert:hover[disabled], .button.clear.alert:focus, .button.clear.alert:focus.disabled, .button.clear.alert:focus[disabled] {
1806 border-color: transparent; }
1807 .button.dropdown::after {
1808 display: block;
1809 width: 0;
1810 height: 0;
1811 border: inset 0.4em;
1812 content: '';
1813 border-bottom-width: 0;
1814 border-top-style: solid;
1815 border-color: #fefefe transparent transparent;
1816 position: relative;
1817 top: 0.4em;
1818 display: inline-block;
1819 float: right;
1820 margin-left: 1em; }
1821 .button.dropdown.hollow::after {
1822 border-top-color: #1779ba; }
1823 .button.dropdown.hollow.primary::after {
1824 border-top-color: #1779ba; }
1825 .button.dropdown.hollow.secondary::after {
1826 border-top-color: #767676; }
1827 .button.dropdown.hollow.success::after {
1828 border-top-color: #3adb76; }
1829 .button.dropdown.hollow.warning::after {
1830 border-top-color: #ffae00; }
1831 .button.dropdown.hollow.alert::after {
1832 border-top-color: #cc4b37; }
1833 .button.arrow-only::after {
1834 top: -0.1em;
1835 float: none;
1836 margin-left: 0; }
1837
1838[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'],
1839textarea {
1840 display: block;
1841 box-sizing: border-box;
1842 width: 100%;
1843 height: 2.5657894737rem;
1844 margin: 0 0 1.0526315789rem;
1845 padding: 0.5263157895rem;
1846 border: 1px solid #cacaca;
1847 border-radius: 0;
1848 background-color: #fefefe;
1849 box-shadow: inset 0 1px 2px rgba(45, 49, 52, 0.1);
1850 font-family: inherit;
1851 font-size: 1.0526315789rem;
1852 font-weight: normal;
1853 line-height: 1.5;
1854 color: #2d3134;
1855 transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
1856 appearance: none; }
1857 [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus,
1858 textarea:focus {
1859 outline: none;
1860 border: 1px solid #8a8a8a;
1861 background-color: #fefefe;
1862 box-shadow: 0 0 5px #cacaca;
1863 transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
1864
1865textarea {
1866 max-width: 100%; }
1867 textarea[rows] {
1868 height: auto; }
1869
1870input::placeholder,
1871textarea::placeholder {
1872 color: #cacaca; }
1873
1874input:disabled, input[readonly],
1875textarea:disabled,
1876textarea[readonly] {
1877 background-color: #e6e6e6;
1878 cursor: not-allowed; }
1879
1880[type='submit'],
1881[type='button'] {
1882 appearance: none;
1883 border-radius: 0; }
1884
1885input[type='search'] {
1886 box-sizing: border-box; }
1887
1888[type='file'],
1889[type='checkbox'],
1890[type='radio'] {
1891 margin: 0 0 1.0526315789rem; }
1892
1893[type='checkbox'] + label,
1894[type='radio'] + label {
1895 display: inline-block;
1896 vertical-align: baseline;
1897 margin-left: 0.5263157895rem;
1898 margin-right: 1.0526315789rem;
1899 margin-bottom: 0; }
1900 [type='checkbox'] + label[for],
1901 [type='radio'] + label[for] {
1902 cursor: pointer; }
1903
1904label > [type='checkbox'],
1905label > [type='radio'] {
1906 margin-right: 0.5263157895rem; }
1907
1908[type='file'] {
1909 width: 100%; }
1910
1911label {
1912 display: block;
1913 margin: 0;
1914 font-size: 0.9210526316rem;
1915 font-weight: normal;
1916 line-height: 1.8;
1917 color: #2d3134; }
1918 label.middle {
1919 margin: 0 0 1.0526315789rem;
1920 padding: 0.5921052632rem 0; }
1921
1922.help-text {
1923 margin-top: -0.5263157895rem;
1924 font-size: 0.8552631579rem;
1925 font-style: italic;
1926 color: #2d3134; }
1927
1928.input-group {
1929 display: flex;
1930 width: 100%;
1931 margin-bottom: 1.0526315789rem;
1932 align-items: stretch; }
1933 .input-group > :first-child {
1934 border-radius: 0 0 0 0; }
1935 .input-group > :last-child > * {
1936 border-radius: 0 0 0 0; }
1937
1938.input-group-label, .input-group-field, .input-group-button, .input-group-button a,
1939.input-group-button input,
1940.input-group-button button,
1941.input-group-button label {
1942 margin: 0;
1943 white-space: nowrap; }
1944
1945.input-group-label {
1946 padding: 0 1rem;
1947 border: 1px solid #cacaca;
1948 background: #e6e6e6;
1949 color: #2d3134;
1950 text-align: center;
1951 white-space: nowrap;
1952 display: flex;
1953 flex: 0 0 auto;
1954 align-items: center; }
1955 .input-group-label:first-child {
1956 border-right: 0; }
1957 .input-group-label:last-child {
1958 border-left: 0; }
1959
1960.input-group-field {
1961 border-radius: 0;
1962 flex: 1 1 0px;
1963 height: auto;
1964 min-width: 0; }
1965
1966.input-group-button {
1967 padding-top: 0;
1968 padding-bottom: 0;
1969 text-align: center;
1970 flex: 0 0 auto; }
1971 .input-group-button a,
1972 .input-group-button input,
1973 .input-group-button button,
1974 .input-group-button label {
1975 height: 2.6315789474rem;
1976 padding-top: 0;
1977 padding-bottom: 0;
1978 font-size: 1.0526315789rem; }
1979
1980fieldset {
1981 margin: 0;
1982 padding: 0;
1983 border: 0; }
1984
1985legend {
1986 max-width: 100%;
1987 margin-bottom: 0.5263157895rem; }
1988
1989.fieldset {
1990 margin: 1.1842105263rem 0;
1991 padding: 1.3157894737rem;
1992 border: 1px solid #cacaca; }
1993 .fieldset legend {
1994 margin: 0;
1995 margin-left: -0.1973684211rem;
1996 padding: 0 0.1973684211rem; }
1997
1998select {
1999 height: 2.5657894737rem;
2000 margin: 0 0 1.0526315789rem;
2001 padding: 0.5263157895rem;
2002 appearance: none;
2003 border: 1px solid #cacaca;
2004 border-radius: 0;
2005 background-color: #fefefe;
2006 font-family: inherit;
2007 font-size: 1.0526315789rem;
2008 font-weight: normal;
2009 line-height: 1.5;
2010 color: #2d3134;
2011 background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>");
2012 background-origin: content-box;
2013 background-position: right -1.0526315789rem center;
2014 background-repeat: no-repeat;
2015 background-size: 9px 6px;
2016 padding-right: 1.5789473684rem;
2017 transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
2018 @media screen and (min-width: 0\0) {
2019 select {
2020 background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } }
2021 select:focus {
2022 outline: none;
2023 border: 1px solid #8a8a8a;
2024 background-color: #fefefe;
2025 box-shadow: 0 0 5px #cacaca;
2026 transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
2027 select:disabled {
2028 background-color: #e6e6e6;
2029 cursor: not-allowed; }
2030 select::-ms-expand {
2031 display: none; }
2032 select[multiple] {
2033 height: auto;
2034 background-image: none; }
2035
2036.is-invalid-input:not(:focus) {
2037 border-color: #cc4b37;
2038 background-color: #f9ecea; }
2039 .is-invalid-input:not(:focus)::placeholder {
2040 color: #cc4b37; }
2041
2042.is-invalid-label {
2043 color: #cc4b37; }
2044
2045.form-error {
2046 display: none;
2047 margin-top: -0.5263157895rem;
2048 margin-bottom: 1.0526315789rem;
2049 font-size: 0.7894736842rem;
2050 font-weight: bold;
2051 color: #cc4b37; }
2052 .form-error.is-visible {
2053 display: block; }
2054
2055.hide {
2056 display: none !important; }
2057
2058.invisible {
2059 visibility: hidden; }
2060
2061@media screen and (max-width: 39.9375em) {
2062 .hide-for-small-only {
2063 display: none !important; } }
2064
2065@media screen and (max-width: 0em), screen and (min-width: 40em) {
2066 .show-for-small-only {
2067 display: none !important; } }
2068
2069@media print, screen and (min-width: 40em) {
2070 .hide-for-medium {
2071 display: none !important; } }
2072
2073@media screen and (max-width: 39.9375em) {
2074 .show-for-medium {
2075 display: none !important; } }
2076
2077@media screen and (min-width: 40em) and (max-width: 63.9375em) {
2078 .hide-for-medium-only {
2079 display: none !important; } }
2080
2081@media screen and (max-width: 39.9375em), screen and (min-width: 64em) {
2082 .show-for-medium-only {
2083 display: none !important; } }
2084
2085@media print, screen and (min-width: 64em) {
2086 .hide-for-large {
2087 display: none !important; } }
2088
2089@media screen and (max-width: 63.9375em) {
2090 .show-for-large {
2091 display: none !important; } }
2092
2093@media screen and (min-width: 64em) and (max-width: 74.9375em) {
2094 .hide-for-large-only {
2095 display: none !important; } }
2096
2097@media screen and (max-width: 63.9375em), screen and (min-width: 75em) {
2098 .show-for-large-only {
2099 display: none !important; } }
2100
2101.show-for-sr,
2102.show-on-focus {
2103 position: absolute !important;
2104 width: 1px;
2105 height: 1px;
2106 padding: 0;
2107 overflow: hidden;
2108 clip: rect(0, 0, 0, 0);
2109 white-space: nowrap;
2110 clip-path: inset(50%);
2111 border: 0; }
2112
2113.show-on-focus:active, .show-on-focus:focus {
2114 position: static !important;
2115 width: auto;
2116 height: auto;
2117 overflow: visible;
2118 clip: auto;
2119 white-space: normal;
2120 clip-path: none; }
2121
2122.show-for-landscape,
2123.hide-for-portrait {
2124 display: block !important; }
2125 @media screen and (orientation: landscape) {
2126 .show-for-landscape,
2127 .hide-for-portrait {
2128 display: block !important; } }
2129 @media screen and (orientation: portrait) {
2130 .show-for-landscape,
2131 .hide-for-portrait {
2132 display: none !important; } }
2133
2134.hide-for-landscape,
2135.show-for-portrait {
2136 display: none !important; }
2137 @media screen and (orientation: landscape) {
2138 .hide-for-landscape,
2139 .show-for-portrait {
2140 display: none !important; } }
2141 @media screen and (orientation: portrait) {
2142 .hide-for-landscape,
2143 .show-for-portrait {
2144 display: block !important; } }
2145
2146.float-left {
2147 float: left !important; }
2148
2149.float-right {
2150 float: right !important; }
2151
2152.float-center {
2153 display: block;
2154 margin-right: auto;
2155 margin-left: auto; }
2156
2157.clearfix::before, .clearfix::after {
2158 display: table;
2159 content: ' ';
2160 flex-basis: 0;
2161 order: 1; }
2162
2163.clearfix::after {
2164 clear: both; }
2165
2166.close-button {
2167 position: absolute;
2168 color: #8a8a8a;
2169 cursor: pointer; }
2170 [data-whatinput='mouse'] .close-button {
2171 outline: 0; }
2172 .close-button:hover, .close-button:focus {
2173 color: #2d3134; }
2174 .close-button.small {
2175 right: 0.66rem;
2176 top: 0.33em;
2177 font-size: 1.5em;
2178 line-height: 1; }
2179 .close-button, .close-button.medium {
2180 right: 1rem;
2181 top: 0.5rem;
2182 font-size: 2em;
2183 line-height: 1; }
2184
2185.label {
2186 display: inline-block;
2187 padding: 0.33333rem 0.5rem;
2188 border-radius: 0;
2189 font-size: 0.8rem;
2190 line-height: 1;
2191 white-space: nowrap;
2192 cursor: default;
2193 background: #1779ba;
2194 color: #fefefe; }
2195 .label.primary {
2196 background: #1779ba;
2197 color: #fefefe; }
2198 .label.secondary {
2199 background: #767676;
2200 color: #fefefe; }
2201 .label.success {
2202 background: #3adb76;
2203 color: #2d3134; }
2204 .label.warning {
2205 background: #ffae00;
2206 color: #2d3134; }
2207 .label.alert {
2208 background: #cc4b37;
2209 color: #fefefe; }
2210
2211table {
2212 border-collapse: collapse;
2213 width: 100%;
2214 margin-bottom: 1rem;
2215 border-radius: 0; }
2216 thead,
2217 tbody,
2218 tfoot {
2219 border: 1px solid #f1f1f1;
2220 background-color: #fefefe; }
2221 caption {
2222 padding: 0.5263157895rem 0.6578947368rem 0.6578947368rem;
2223 font-weight: bold; }
2224 thead {
2225 background: #f8f8f8;
2226 color: #2d3134; }
2227 tfoot {
2228 background: #f1f1f1;
2229 color: #2d3134; }
2230 thead tr,
2231 tfoot tr {
2232 background: transparent; }
2233 thead th,
2234 thead td,
2235 tfoot th,
2236 tfoot td {
2237 padding: 0.5263157895rem 0.6578947368rem 0.6578947368rem;
2238 font-weight: bold;
2239 text-align: left; }
2240 tbody th,
2241 tbody td {
2242 padding: 0.5263157895rem 0.6578947368rem 0.6578947368rem; }
2243 tbody tr:nth-child(even) {
2244 border-bottom: 0;
2245 background-color: #f1f1f1; }
2246 table.unstriped tbody {
2247 background-color: #fefefe; }
2248 table.unstriped tbody tr {
2249 border-bottom: 0;
2250 border-bottom: 1px solid #f1f1f1;
2251 background-color: #fefefe; }
2252
2253@media screen and (max-width: 63.9375em) {
2254 table.stack thead {
2255 display: none; }
2256 table.stack tfoot {
2257 display: none; }
2258 table.stack tr,
2259 table.stack th,
2260 table.stack td {
2261 display: block; }
2262 table.stack td {
2263 border-top: 0; } }
2264
2265table.scroll {
2266 display: block;
2267 width: 100%;
2268 overflow-x: auto; }
2269
2270table.hover thead tr:hover {
2271 background-color: #f3f3f3; }
2272
2273table.hover tfoot tr:hover {
2274 background-color: #ececec; }
2275
2276table.hover tbody tr:hover {
2277 background-color: #f9f9f9; }
2278
2279table.hover:not(.unstriped) tr:nth-of-type(even):hover {
2280 background-color: #ececec; }
2281
2282.table-scroll {
2283 overflow-x: auto; }
2284 .table-scroll table {
2285 width: auto; }
diff --git a/support/doc/api/html/stylesheets/foundation.min.css b/support/doc/api/html/stylesheets/foundation.min.css
deleted file mode 100644
index 337beb289..000000000
--- a/support/doc/api/html/stylesheets/foundation.min.css
+++ /dev/null
@@ -1 +0,0 @@
1@charset "UTF-8";/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}main{display:block}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}input{overflow:visible}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}details{display:block}summary{display:list-item}menu{display:block}canvas{display:inline-block}template{display:none}[hidden]{display:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{box-sizing:border-box;font-size:95%}*,::after,::before{box-sizing:inherit}body{margin:0;padding:0;background:#fefefe;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;color:#2d3134;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}textarea{height:auto;min-height:50px;border-radius:0}select{box-sizing:border-box;width:100%;border-radius:0}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{padding:0;appearance:none;border:0;border-radius:0;background:0 0;line-height:1}[data-whatinput=mouse] button{outline:0}pre{overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}.row{max-width:auto;margin-right:auto;margin-left:auto}.row::after,.row::before{display:table;content:' ';flex-basis:0;order:1}.row::after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-right:0;padding-left:0}.row .row{margin-right:-.6578947368rem;margin-left:-.6578947368rem}@media print,screen and (min-width:40em){.row .row{margin-right:-.9868421053rem;margin-left:-.9868421053rem}}@media print,screen and (min-width:64em){.row .row{margin-right:-.9868421053rem;margin-left:-.9868421053rem}}.row .row.collapse{margin-right:0;margin-left:0}.row.expanded{max-width:none}.row.expanded .row{margin-right:auto;margin-left:auto}.row:not(.expanded) .row{max-width:none}.row.gutter-small>.column,.row.gutter-small>.columns{padding-right:.6578947368rem;padding-left:.6578947368rem}.row.gutter-medium>.column,.row.gutter-medium>.columns{padding-right:.9868421053rem;padding-left:.9868421053rem}.column,.columns{width:100%;float:left;padding-right:.6578947368rem;padding-left:.6578947368rem}@media print,screen and (min-width:40em){.column,.columns{padding-right:.9868421053rem;padding-left:.9868421053rem}}.column:last-child:not(:first-child),.columns:last-child:not(:first-child){float:right}.column.end:last-child:last-child,.end.columns:last-child:last-child{float:left}.column.row.row,.row.row.columns{float:none}.row .column.row.row,.row .row.row.columns{margin-right:0;margin-left:0;padding-right:0;padding-left:0}.small-1{width:8.3333333333%}.small-push-1{position:relative;left:8.3333333333%}.small-pull-1{position:relative;left:-8.3333333333%}.small-offset-0{margin-left:0}.small-2{width:16.6666666667%}.small-push-2{position:relative;left:16.6666666667%}.small-pull-2{position:relative;left:-16.6666666667%}.small-offset-1{margin-left:8.3333333333%}.small-3{width:25%}.small-push-3{position:relative;left:25%}.small-pull-3{position:relative;left:-25%}.small-offset-2{margin-left:16.6666666667%}.small-4{width:33.3333333333%}.small-push-4{position:relative;left:33.3333333333%}.small-pull-4{position:relative;left:-33.3333333333%}.small-offset-3{margin-left:25%}.small-5{width:41.6666666667%}.small-push-5{position:relative;left:41.6666666667%}.small-pull-5{position:relative;left:-41.6666666667%}.small-offset-4{margin-left:33.3333333333%}.small-6{width:50%}.small-push-6{position:relative;left:50%}.small-pull-6{position:relative;left:-50%}.small-offset-5{margin-left:41.6666666667%}.small-7{width:58.3333333333%}.small-push-7{position:relative;left:58.3333333333%}.small-pull-7{position:relative;left:-58.3333333333%}.small-offset-6{margin-left:50%}.small-8{width:66.6666666667%}.small-push-8{position:relative;left:66.6666666667%}.small-pull-8{position:relative;left:-66.6666666667%}.small-offset-7{margin-left:58.3333333333%}.small-9{width:75%}.small-push-9{position:relative;left:75%}.small-pull-9{position:relative;left:-75%}.small-offset-8{margin-left:66.6666666667%}.small-10{width:83.3333333333%}.small-push-10{position:relative;left:83.3333333333%}.small-pull-10{position:relative;left:-83.3333333333%}.small-offset-9{margin-left:75%}.small-11{width:91.6666666667%}.small-push-11{position:relative;left:91.6666666667%}.small-pull-11{position:relative;left:-91.6666666667%}.small-offset-10{margin-left:83.3333333333%}.small-12{width:100%}.small-offset-11{margin-left:91.6666666667%}.small-up-1>.column,.small-up-1>.columns{float:left;width:100%}.small-up-1>.column:nth-of-type(1n),.small-up-1>.columns:nth-of-type(1n){clear:none}.small-up-1>.column:nth-of-type(1n+1),.small-up-1>.columns:nth-of-type(1n+1){clear:both}.small-up-1>.column:last-child,.small-up-1>.columns:last-child{float:left}.small-up-2>.column,.small-up-2>.columns{float:left;width:50%}.small-up-2>.column:nth-of-type(1n),.small-up-2>.columns:nth-of-type(1n){clear:none}.small-up-2>.column:nth-of-type(2n+1),.small-up-2>.columns:nth-of-type(2n+1){clear:both}.small-up-2>.column:last-child,.small-up-2>.columns:last-child{float:left}.small-up-3>.column,.small-up-3>.columns{float:left;width:33.3333333333%}.small-up-3>.column:nth-of-type(1n),.small-up-3>.columns:nth-of-type(1n){clear:none}.small-up-3>.column:nth-of-type(3n+1),.small-up-3>.columns:nth-of-type(3n+1){clear:both}.small-up-3>.column:last-child,.small-up-3>.columns:last-child{float:left}.small-up-4>.column,.small-up-4>.columns{float:left;width:25%}.small-up-4>.column:nth-of-type(1n),.small-up-4>.columns:nth-of-type(1n){clear:none}.small-up-4>.column:nth-of-type(4n+1),.small-up-4>.columns:nth-of-type(4n+1){clear:both}.small-up-4>.column:last-child,.small-up-4>.columns:last-child{float:left}.small-up-5>.column,.small-up-5>.columns{float:left;width:20%}.small-up-5>.column:nth-of-type(1n),.small-up-5>.columns:nth-of-type(1n){clear:none}.small-up-5>.column:nth-of-type(5n+1),.small-up-5>.columns:nth-of-type(5n+1){clear:both}.small-up-5>.column:last-child,.small-up-5>.columns:last-child{float:left}.small-up-6>.column,.small-up-6>.columns{float:left;width:16.6666666667%}.small-up-6>.column:nth-of-type(1n),.small-up-6>.columns:nth-of-type(1n){clear:none}.small-up-6>.column:nth-of-type(6n+1),.small-up-6>.columns:nth-of-type(6n+1){clear:both}.small-up-6>.column:last-child,.small-up-6>.columns:last-child{float:left}.small-up-7>.column,.small-up-7>.columns{float:left;width:14.2857142857%}.small-up-7>.column:nth-of-type(1n),.small-up-7>.columns:nth-of-type(1n){clear:none}.small-up-7>.column:nth-of-type(7n+1),.small-up-7>.columns:nth-of-type(7n+1){clear:both}.small-up-7>.column:last-child,.small-up-7>.columns:last-child{float:left}.small-up-8>.column,.small-up-8>.columns{float:left;width:12.5%}.small-up-8>.column:nth-of-type(1n),.small-up-8>.columns:nth-of-type(1n){clear:none}.small-up-8>.column:nth-of-type(8n+1),.small-up-8>.columns:nth-of-type(8n+1){clear:both}.small-up-8>.column:last-child,.small-up-8>.columns:last-child{float:left}.small-collapse>.column,.small-collapse>.columns{padding-right:0;padding-left:0}.small-collapse .row{margin-right:0;margin-left:0}.expanded.row .small-collapse.row{margin-right:0;margin-left:0}.small-uncollapse>.column,.small-uncollapse>.columns{padding-right:.6578947368rem;padding-left:.6578947368rem}.small-centered{margin-right:auto;margin-left:auto}.small-centered,.small-centered:last-child:not(:first-child){float:none;clear:both}.small-pull-0,.small-push-0,.small-uncentered{position:static;float:left;margin-right:0;margin-left:0}@media print,screen and (min-width:40em){.medium-1{width:8.3333333333%}.medium-push-1{position:relative;left:8.3333333333%}.medium-pull-1{position:relative;left:-8.3333333333%}.medium-offset-0{margin-left:0}.medium-2{width:16.6666666667%}.medium-push-2{position:relative;left:16.6666666667%}.medium-pull-2{position:relative;left:-16.6666666667%}.medium-offset-1{margin-left:8.3333333333%}.medium-3{width:25%}.medium-push-3{position:relative;left:25%}.medium-pull-3{position:relative;left:-25%}.medium-offset-2{margin-left:16.6666666667%}.medium-4{width:33.3333333333%}.medium-push-4{position:relative;left:33.3333333333%}.medium-pull-4{position:relative;left:-33.3333333333%}.medium-offset-3{margin-left:25%}.medium-5{width:41.6666666667%}.medium-push-5{position:relative;left:41.6666666667%}.medium-pull-5{position:relative;left:-41.6666666667%}.medium-offset-4{margin-left:33.3333333333%}.medium-6{width:50%}.medium-push-6{position:relative;left:50%}.medium-pull-6{position:relative;left:-50%}.medium-offset-5{margin-left:41.6666666667%}.medium-7{width:58.3333333333%}.medium-push-7{position:relative;left:58.3333333333%}.medium-pull-7{position:relative;left:-58.3333333333%}.medium-offset-6{margin-left:50%}.medium-8{width:66.6666666667%}.medium-push-8{position:relative;left:66.6666666667%}.medium-pull-8{position:relative;left:-66.6666666667%}.medium-offset-7{margin-left:58.3333333333%}.medium-9{width:75%}.medium-push-9{position:relative;left:75%}.medium-pull-9{position:relative;left:-75%}.medium-offset-8{margin-left:66.6666666667%}.medium-10{width:83.3333333333%}.medium-push-10{position:relative;left:83.3333333333%}.medium-pull-10{position:relative;left:-83.3333333333%}.medium-offset-9{margin-left:75%}.medium-11{width:91.6666666667%}.medium-push-11{position:relative;left:91.6666666667%}.medium-pull-11{position:relative;left:-91.6666666667%}.medium-offset-10{margin-left:83.3333333333%}.medium-12{width:100%}.medium-offset-11{margin-left:91.6666666667%}.medium-up-1>.column,.medium-up-1>.columns{float:left;width:100%}.medium-up-1>.column:nth-of-type(1n),.medium-up-1>.columns:nth-of-type(1n){clear:none}.medium-up-1>.column:nth-of-type(1n+1),.medium-up-1>.columns:nth-of-type(1n+1){clear:both}.medium-up-1>.column:last-child,.medium-up-1>.columns:last-child{float:left}.medium-up-2>.column,.medium-up-2>.columns{float:left;width:50%}.medium-up-2>.column:nth-of-type(1n),.medium-up-2>.columns:nth-of-type(1n){clear:none}.medium-up-2>.column:nth-of-type(2n+1),.medium-up-2>.columns:nth-of-type(2n+1){clear:both}.medium-up-2>.column:last-child,.medium-up-2>.columns:last-child{float:left}.medium-up-3>.column,.medium-up-3>.columns{float:left;width:33.3333333333%}.medium-up-3>.column:nth-of-type(1n),.medium-up-3>.columns:nth-of-type(1n){clear:none}.medium-up-3>.column:nth-of-type(3n+1),.medium-up-3>.columns:nth-of-type(3n+1){clear:both}.medium-up-3>.column:last-child,.medium-up-3>.columns:last-child{float:left}.medium-up-4>.column,.medium-up-4>.columns{float:left;width:25%}.medium-up-4>.column:nth-of-type(1n),.medium-up-4>.columns:nth-of-type(1n){clear:none}.medium-up-4>.column:nth-of-type(4n+1),.medium-up-4>.columns:nth-of-type(4n+1){clear:both}.medium-up-4>.column:last-child,.medium-up-4>.columns:last-child{float:left}.medium-up-5>.column,.medium-up-5>.columns{float:left;width:20%}.medium-up-5>.column:nth-of-type(1n),.medium-up-5>.columns:nth-of-type(1n){clear:none}.medium-up-5>.column:nth-of-type(5n+1),.medium-up-5>.columns:nth-of-type(5n+1){clear:both}.medium-up-5>.column:last-child,.medium-up-5>.columns:last-child{float:left}.medium-up-6>.column,.medium-up-6>.columns{float:left;width:16.6666666667%}.medium-up-6>.column:nth-of-type(1n),.medium-up-6>.columns:nth-of-type(1n){clear:none}.medium-up-6>.column:nth-of-type(6n+1),.medium-up-6>.columns:nth-of-type(6n+1){clear:both}.medium-up-6>.column:last-child,.medium-up-6>.columns:last-child{float:left}.medium-up-7>.column,.medium-up-7>.columns{float:left;width:14.2857142857%}.medium-up-7>.column:nth-of-type(1n),.medium-up-7>.columns:nth-of-type(1n){clear:none}.medium-up-7>.column:nth-of-type(7n+1),.medium-up-7>.columns:nth-of-type(7n+1){clear:both}.medium-up-7>.column:last-child,.medium-up-7>.columns:last-child{float:left}.medium-up-8>.column,.medium-up-8>.columns{float:left;width:12.5%}.medium-up-8>.column:nth-of-type(1n),.medium-up-8>.columns:nth-of-type(1n){clear:none}.medium-up-8>.column:nth-of-type(8n+1),.medium-up-8>.columns:nth-of-type(8n+1){clear:both}.medium-up-8>.column:last-child,.medium-up-8>.columns:last-child{float:left}.medium-collapse>.column,.medium-collapse>.columns{padding-right:0;padding-left:0}.medium-collapse .row{margin-right:0;margin-left:0}.expanded.row .medium-collapse.row{margin-right:0;margin-left:0}.medium-uncollapse>.column,.medium-uncollapse>.columns{padding-right:.9868421053rem;padding-left:.9868421053rem}.medium-centered{margin-right:auto;margin-left:auto}.medium-centered,.medium-centered:last-child:not(:first-child){float:none;clear:both}.medium-pull-0,.medium-push-0,.medium-uncentered{position:static;float:left;margin-right:0;margin-left:0}}@media print,screen and (min-width:64em){.large-1{width:8.3333333333%}.large-push-1{position:relative;left:8.3333333333%}.large-pull-1{position:relative;left:-8.3333333333%}.large-offset-0{margin-left:0}.large-2{width:16.6666666667%}.large-push-2{position:relative;left:16.6666666667%}.large-pull-2{position:relative;left:-16.6666666667%}.large-offset-1{margin-left:8.3333333333%}.large-3{width:25%}.large-push-3{position:relative;left:25%}.large-pull-3{position:relative;left:-25%}.large-offset-2{margin-left:16.6666666667%}.large-4{width:33.3333333333%}.large-push-4{position:relative;left:33.3333333333%}.large-pull-4{position:relative;left:-33.3333333333%}.large-offset-3{margin-left:25%}.large-5{width:41.6666666667%}.large-push-5{position:relative;left:41.6666666667%}.large-pull-5{position:relative;left:-41.6666666667%}.large-offset-4{margin-left:33.3333333333%}.large-6{width:50%}.large-push-6{position:relative;left:50%}.large-pull-6{position:relative;left:-50%}.large-offset-5{margin-left:41.6666666667%}.large-7{width:58.3333333333%}.large-push-7{position:relative;left:58.3333333333%}.large-pull-7{position:relative;left:-58.3333333333%}.large-offset-6{margin-left:50%}.large-8{width:66.6666666667%}.large-push-8{position:relative;left:66.6666666667%}.large-pull-8{position:relative;left:-66.6666666667%}.large-offset-7{margin-left:58.3333333333%}.large-9{width:75%}.large-push-9{position:relative;left:75%}.large-pull-9{position:relative;left:-75%}.large-offset-8{margin-left:66.6666666667%}.large-10{width:83.3333333333%}.large-push-10{position:relative;left:83.3333333333%}.large-pull-10{position:relative;left:-83.3333333333%}.large-offset-9{margin-left:75%}.large-11{width:91.6666666667%}.large-push-11{position:relative;left:91.6666666667%}.large-pull-11{position:relative;left:-91.6666666667%}.large-offset-10{margin-left:83.3333333333%}.large-12{width:100%}.large-offset-11{margin-left:91.6666666667%}.large-up-1>.column,.large-up-1>.columns{float:left;width:100%}.large-up-1>.column:nth-of-type(1n),.large-up-1>.columns:nth-of-type(1n){clear:none}.large-up-1>.column:nth-of-type(1n+1),.large-up-1>.columns:nth-of-type(1n+1){clear:both}.large-up-1>.column:last-child,.large-up-1>.columns:last-child{float:left}.large-up-2>.column,.large-up-2>.columns{float:left;width:50%}.large-up-2>.column:nth-of-type(1n),.large-up-2>.columns:nth-of-type(1n){clear:none}.large-up-2>.column:nth-of-type(2n+1),.large-up-2>.columns:nth-of-type(2n+1){clear:both}.large-up-2>.column:last-child,.large-up-2>.columns:last-child{float:left}.large-up-3>.column,.large-up-3>.columns{float:left;width:33.3333333333%}.large-up-3>.column:nth-of-type(1n),.large-up-3>.columns:nth-of-type(1n){clear:none}.large-up-3>.column:nth-of-type(3n+1),.large-up-3>.columns:nth-of-type(3n+1){clear:both}.large-up-3>.column:last-child,.large-up-3>.columns:last-child{float:left}.large-up-4>.column,.large-up-4>.columns{float:left;width:25%}.large-up-4>.column:nth-of-type(1n),.large-up-4>.columns:nth-of-type(1n){clear:none}.large-up-4>.column:nth-of-type(4n+1),.large-up-4>.columns:nth-of-type(4n+1){clear:both}.large-up-4>.column:last-child,.large-up-4>.columns:last-child{float:left}.large-up-5>.column,.large-up-5>.columns{float:left;width:20%}.large-up-5>.column:nth-of-type(1n),.large-up-5>.columns:nth-of-type(1n){clear:none}.large-up-5>.column:nth-of-type(5n+1),.large-up-5>.columns:nth-of-type(5n+1){clear:both}.large-up-5>.column:last-child,.large-up-5>.columns:last-child{float:left}.large-up-6>.column,.large-up-6>.columns{float:left;width:16.6666666667%}.large-up-6>.column:nth-of-type(1n),.large-up-6>.columns:nth-of-type(1n){clear:none}.large-up-6>.column:nth-of-type(6n+1),.large-up-6>.columns:nth-of-type(6n+1){clear:both}.large-up-6>.column:last-child,.large-up-6>.columns:last-child{float:left}.large-up-7>.column,.large-up-7>.columns{float:left;width:14.2857142857%}.large-up-7>.column:nth-of-type(1n),.large-up-7>.columns:nth-of-type(1n){clear:none}.large-up-7>.column:nth-of-type(7n+1),.large-up-7>.columns:nth-of-type(7n+1){clear:both}.large-up-7>.column:last-child,.large-up-7>.columns:last-child{float:left}.large-up-8>.column,.large-up-8>.columns{float:left;width:12.5%}.large-up-8>.column:nth-of-type(1n),.large-up-8>.columns:nth-of-type(1n){clear:none}.large-up-8>.column:nth-of-type(8n+1),.large-up-8>.columns:nth-of-type(8n+1){clear:both}.large-up-8>.column:last-child,.large-up-8>.columns:last-child{float:left}.large-collapse>.column,.large-collapse>.columns{padding-right:0;padding-left:0}.large-collapse .row{margin-right:0;margin-left:0}.expanded.row .large-collapse.row{margin-right:0;margin-left:0}.large-uncollapse>.column,.large-uncollapse>.columns{padding-right:.9868421053rem;padding-left:.9868421053rem}.large-centered{margin-right:auto;margin-left:auto}.large-centered,.large-centered:last-child:not(:first-child){float:none;clear:both}.large-pull-0,.large-push-0,.large-uncentered{position:static;float:left;margin-right:0;margin-left:0}}.column-block{margin-bottom:1.3157894737rem}.column-block>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.column-block{margin-bottom:1.9736842105rem}.column-block>:last-child{margin-bottom:0}}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{margin-bottom:1rem;font-size:inherit;line-height:1.6;text-rendering:optimizeLegibility}em,i{font-style:italic;line-height:inherit}b,strong{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;color:inherit;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{line-height:0;color:#cacaca}h1{font-size:1.5789473684rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h2{font-size:1.3157894737rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h3{font-size:1.25rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h4{font-size:1.1842105263rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h5{font-size:1.1184210526rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}h6{font-size:1.0526315789rem;line-height:1.4;margin-top:0;margin-bottom:.5rem}@media print,screen and (min-width:40em){h1{font-size:1.7105263158rem}h2{font-size:1.5789473684rem}h3{font-size:1.3157894737rem}h4{font-size:1.1842105263rem}h5{font-size:1.1184210526rem}h6{font-size:1.0526315789rem}}a{line-height:inherit;color:#1779ba;text-decoration:none;cursor:pointer}a:focus,a:hover{color:#1468a0}a img{border:0}hr{clear:both;max-width:auto;height:0;margin:1.3157894737rem auto;border-top:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}dl,ol,ul{margin-bottom:1rem;list-style-position:outside;line-height:1.6}li{font-size:inherit}ul{margin-left:1.25rem;list-style-type:disc}ol{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-left:1.25rem;margin-bottom:0}dl{margin-bottom:1rem}dl dt{margin-bottom:.3rem;font-weight:700}blockquote{margin:0 0 1rem;padding:.5921052632rem 1.3157894737rem 0 1.25rem;border-left:1px solid #cacaca}blockquote,blockquote p{line-height:1.6;color:#8a8a8a}cite{display:block;font-size:.8552631579rem;color:#8a8a8a}cite:before{content:"— "}abbr,abbr[title]{border-bottom:1px dotted #2d3134;cursor:help;text-decoration:none}figure{margin:0}code{padding:.1315789474rem .3289473684rem .0657894737rem;border:1px solid #cacaca;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#2d3134}kbd{margin:0;padding:.1315789474rem .2631578947rem 0;background-color:#e6e6e6;font-family:Consolas,"Liberation Mono",Courier,monospace;color:#2d3134}.subheader{margin-top:.2rem;margin-bottom:.5rem;font-weight:400;line-height:1.4;color:#8a8a8a}.lead{font-size:118.75%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{margin-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;box-shadow:none!important;color:#000!important;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print{display:table-cell!important}th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^='#']:after,a[href^='javascript:']:after{content:''}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.button{display:inline-block;vertical-align:middle;margin:0 0 1rem 0;font-family:inherit;padding:.85em 1em;-webkit-appearance:none;border:1px solid transparent;border-radius:0;transition:background-color .25s ease-out,color .25s ease-out;font-size:.9rem;line-height:1;text-align:center;cursor:pointer;background-color:#1779ba;color:#fefefe}[data-whatinput=mouse] .button{outline:0}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;width:100%;margin-right:0;margin-left:0}.button.primary{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success{background-color:#3adb76;color:#2d3134}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#2d3134}.button.warning{background-color:#ffae00;color:#2d3134}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#2d3134}.button.alert{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.disabled,.button[disabled]{opacity:.25;cursor:not-allowed}.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.disabled.primary,.button[disabled].primary{opacity:.25;cursor:not-allowed}.button.disabled.primary,.button.disabled.primary:focus,.button.disabled.primary:hover,.button[disabled].primary,.button[disabled].primary:focus,.button[disabled].primary:hover{background-color:#1779ba;color:#fefefe}.button.disabled.secondary,.button[disabled].secondary{opacity:.25;cursor:not-allowed}.button.disabled.secondary,.button.disabled.secondary:focus,.button.disabled.secondary:hover,.button[disabled].secondary,.button[disabled].secondary:focus,.button[disabled].secondary:hover{background-color:#767676;color:#fefefe}.button.disabled.success,.button[disabled].success{opacity:.25;cursor:not-allowed}.button.disabled.success,.button.disabled.success:focus,.button.disabled.success:hover,.button[disabled].success,.button[disabled].success:focus,.button[disabled].success:hover{background-color:#3adb76;color:#2d3134}.button.disabled.warning,.button[disabled].warning{opacity:.25;cursor:not-allowed}.button.disabled.warning,.button.disabled.warning:focus,.button.disabled.warning:hover,.button[disabled].warning,.button[disabled].warning:focus,.button[disabled].warning:hover{background-color:#ffae00;color:#2d3134}.button.disabled.alert,.button[disabled].alert{opacity:.25;cursor:not-allowed}.button.disabled.alert,.button.disabled.alert:focus,.button.disabled.alert:hover,.button[disabled].alert,.button[disabled].alert:focus,.button[disabled].alert:hover{background-color:#cc4b37;color:#fefefe}.button.hollow{border:1px solid #1779ba;color:#1779ba}.button.hollow,.button.hollow:focus,.button.hollow:hover{background-color:transparent}.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow:focus.disabled,.button.hollow:focus[disabled],.button.hollow:hover.disabled,.button.hollow:hover[disabled]{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary:focus.disabled,.button.hollow.primary:focus[disabled],.button.hollow.primary:hover.disabled,.button.hollow.primary:hover[disabled]{border:1px solid #1779ba;color:#1779ba}.button.hollow.secondary{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.secondary:focus.disabled,.button.hollow.secondary:focus[disabled],.button.hollow.secondary:hover.disabled,.button.hollow.secondary:hover[disabled]{border:1px solid #767676;color:#767676}.button.hollow.success{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.success:focus.disabled,.button.hollow.success:focus[disabled],.button.hollow.success:hover.disabled,.button.hollow.success:hover[disabled]{border:1px solid #3adb76;color:#3adb76}.button.hollow.warning{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.warning:focus.disabled,.button.hollow.warning:focus[disabled],.button.hollow.warning:hover.disabled,.button.hollow.warning:hover[disabled]{border:1px solid #ffae00;color:#ffae00}.button.hollow.alert{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.hollow.alert:focus.disabled,.button.hollow.alert:focus[disabled],.button.hollow.alert:hover.disabled,.button.hollow.alert:hover[disabled]{border:1px solid #cc4b37;color:#cc4b37}.button.clear{border:1px solid #1779ba;color:#1779ba}.button.clear,.button.clear:focus,.button.clear:hover{background-color:transparent}.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent}.button.clear:focus,.button.clear:hover{border-color:#0c3d5d;color:#0c3d5d}.button.clear:focus.disabled,.button.clear:focus[disabled],.button.clear:hover.disabled,.button.clear:hover[disabled]{border:1px solid #1779ba;color:#1779ba}.button.clear,.button.clear.disabled,.button.clear:focus,.button.clear:focus.disabled,.button.clear:focus[disabled],.button.clear:hover,.button.clear:hover.disabled,.button.clear:hover[disabled],.button.clear[disabled]{border-color:transparent}.button.clear.primary{border:1px solid #1779ba;color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.clear.primary:focus.disabled,.button.clear.primary:focus[disabled],.button.clear.primary:hover.disabled,.button.clear.primary:hover[disabled]{border:1px solid #1779ba;color:#1779ba}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary:focus,.button.clear.primary:focus.disabled,.button.clear.primary:focus[disabled],.button.clear.primary:hover,.button.clear.primary:hover.disabled,.button.clear.primary:hover[disabled],.button.clear.primary[disabled]{border-color:transparent}.button.clear.secondary{border:1px solid #767676;color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.clear.secondary:focus.disabled,.button.clear.secondary:focus[disabled],.button.clear.secondary:hover.disabled,.button.clear.secondary:hover[disabled]{border:1px solid #767676;color:#767676}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary:focus,.button.clear.secondary:focus.disabled,.button.clear.secondary:focus[disabled],.button.clear.secondary:hover,.button.clear.secondary:hover.disabled,.button.clear.secondary:hover[disabled],.button.clear.secondary[disabled]{border-color:transparent}.button.clear.success{border:1px solid #3adb76;color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{border-color:#157539;color:#157539}.button.clear.success:focus.disabled,.button.clear.success:focus[disabled],.button.clear.success:hover.disabled,.button.clear.success:hover[disabled]{border:1px solid #3adb76;color:#3adb76}.button.clear.success,.button.clear.success.disabled,.button.clear.success:focus,.button.clear.success:focus.disabled,.button.clear.success:focus[disabled],.button.clear.success:hover,.button.clear.success:hover.disabled,.button.clear.success:hover[disabled],.button.clear.success[disabled]{border-color:transparent}.button.clear.warning{border:1px solid #ffae00;color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{border-color:#805700;color:#805700}.button.clear.warning:focus.disabled,.button.clear.warning:focus[disabled],.button.clear.warning:hover.disabled,.button.clear.warning:hover[disabled]{border:1px solid #ffae00;color:#ffae00}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning:focus,.button.clear.warning:focus.disabled,.button.clear.warning:focus[disabled],.button.clear.warning:hover,.button.clear.warning:hover.disabled,.button.clear.warning:hover[disabled],.button.clear.warning[disabled]{border-color:transparent}.button.clear.alert{border:1px solid #cc4b37;color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{border-color:#67251a;color:#67251a}.button.clear.alert:focus.disabled,.button.clear.alert:focus[disabled],.button.clear.alert:hover.disabled,.button.clear.alert:hover[disabled]{border:1px solid #cc4b37;color:#cc4b37}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert:focus,.button.clear.alert:focus.disabled,.button.clear.alert:focus[disabled],.button.clear.alert:hover,.button.clear.alert:hover.disabled,.button.clear.alert:hover[disabled],.button.clear.alert[disabled]{border-color:transparent}.button.dropdown::after{display:block;width:0;height:0;border:inset .4em;content:'';border-bottom-width:0;border-top-style:solid;border-color:#fefefe transparent transparent;position:relative;top:.4em;display:inline-block;float:right;margin-left:1em}.button.dropdown.hollow::after{border-top-color:#1779ba}.button.dropdown.hollow.primary::after{border-top-color:#1779ba}.button.dropdown.hollow.secondary::after{border-top-color:#767676}.button.dropdown.hollow.success::after{border-top-color:#3adb76}.button.dropdown.hollow.warning::after{border-top-color:#ffae00}.button.dropdown.hollow.alert::after{border-top-color:#cc4b37}.button.arrow-only::after{top:-.1em;float:none;margin-left:0}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{display:block;box-sizing:border-box;width:100%;height:2.5657894737rem;margin:0 0 1.0526315789rem;padding:.5263157895rem;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;box-shadow:inset 0 1px 2px rgba(45,49,52,.1);font-family:inherit;font-size:1.0526315789rem;font-weight:400;line-height:1.5;color:#2d3134;transition:box-shadow .5s,border-color .25s ease-in-out;appearance:none}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{outline:0;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}textarea{max-width:100%}textarea[rows]{height:auto}input::placeholder,textarea::placeholder{color:#cacaca}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{appearance:none;border-radius:0}input[type=search]{box-sizing:border-box}[type=checkbox],[type=file],[type=radio]{margin:0 0 1.0526315789rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;vertical-align:baseline;margin-left:.5263157895rem;margin-right:1.0526315789rem;margin-bottom:0}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5263157895rem}[type=file]{width:100%}label{display:block;margin:0;font-size:.9210526316rem;font-weight:400;line-height:1.8;color:#2d3134}label.middle{margin:0 0 1.0526315789rem;padding:.5921052632rem 0}.help-text{margin-top:-.5263157895rem;font-size:.8552631579rem;font-style:italic;color:#2d3134}.input-group{display:flex;width:100%;margin-bottom:1.0526315789rem;align-items:stretch}.input-group>:first-child{border-radius:0}.input-group>:last-child>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{padding:0 1rem;border:1px solid #cacaca;background:#e6e6e6;color:#2d3134;text-align:center;white-space:nowrap;display:flex;flex:0 0 auto;align-items:center}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{border-radius:0;flex:1 1 0px;height:auto;min-width:0}.input-group-button{padding-top:0;padding-bottom:0;text-align:center;flex:0 0 auto}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{height:2.6315789474rem;padding-top:0;padding-bottom:0;font-size:1.0526315789rem}fieldset{margin:0;padding:0;border:0}legend{max-width:100%;margin-bottom:.5263157895rem}.fieldset{margin:1.1842105263rem 0;padding:1.3157894737rem;border:1px solid #cacaca}.fieldset legend{margin:0;margin-left:-.1973684211rem;padding:0 .1973684211rem}select{height:2.5657894737rem;margin:0 0 1.0526315789rem;padding:.5263157895rem;appearance:none;border:1px solid #cacaca;border-radius:0;background-color:#fefefe;font-family:inherit;font-size:1.0526315789rem;font-weight:400;line-height:1.5;color:#2d3134;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>");background-origin:content-box;background-position:right -1.0526315789rem center;background-repeat:no-repeat;background-size:9px 6px;padding-right:1.5789473684rem;transition:box-shadow .5s,border-color .25s ease-in-out}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{outline:0;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{height:auto;background-image:none}.is-invalid-input:not(:focus){border-color:#cc4b37;background-color:#f9ecea}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.is-invalid-label{color:#cc4b37}.form-error{display:none;margin-top:-.5263157895rem;margin-bottom:1.0526315789rem;font-size:.7894736842rem;font-weight:700;color:#cc4b37}.form-error.is-visible{display:block}.hide{display:none!important}.invisible{visibility:hidden}@media screen and (max-width:39.9375em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.9375em){.show-for-medium{display:none!important}}@media screen and (min-width:40em) and (max-width:63.9375em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.9375em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.9375em){.show-for-large{display:none!important}}@media screen and (min-width:64em) and (max-width:74.9375em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.9375em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{position:absolute!important;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;clip-path:inset(50%);border:0}.show-on-focus:active,.show-on-focus:focus{position:static!important;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;clip-path:none}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-right:auto;margin-left:auto}.clearfix::after,.clearfix::before{display:table;content:' ';flex-basis:0;order:1}.clearfix::after{clear:both}.close-button{position:absolute;color:#8a8a8a;cursor:pointer}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#2d3134}.close-button.small{right:.66rem;top:.33em;font-size:1.5em;line-height:1}.close-button,.close-button.medium{right:1rem;top:.5rem;font-size:2em;line-height:1}.label{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#1779ba;color:#fefefe}.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#2d3134}.label.warning{background:#ffae00;color:#2d3134}.label.alert{background:#cc4b37;color:#fefefe}table{border-collapse:collapse;width:100%;margin-bottom:1rem;border-radius:0}tbody,tfoot,thead{border:1px solid #f1f1f1;background-color:#fefefe}caption{padding:.5263157895rem .6578947368rem .6578947368rem;font-weight:700}thead{background:#f8f8f8;color:#2d3134}tfoot{background:#f1f1f1;color:#2d3134}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{padding:.5263157895rem .6578947368rem .6578947368rem;font-weight:700;text-align:left}tbody td,tbody th{padding:.5263157895rem .6578947368rem .6578947368rem}tbody tr:nth-child(even){border-bottom:0;background-color:#f1f1f1}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{border-bottom:0;border-bottom:1px solid #f1f1f1;background-color:#fefefe}@media screen and (max-width:63.9375em){table.stack thead{display:none}table.stack tfoot{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;width:100%;overflow-x:auto}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(even):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.table-scroll table{width:auto} \ No newline at end of file
diff --git a/support/doc/api/html/stylesheets/spectacle.css b/support/doc/api/html/stylesheets/spectacle.css
deleted file mode 100644
index fe9b945d1..000000000
--- a/support/doc/api/html/stylesheets/spectacle.css
+++ /dev/null
@@ -1,1375 +0,0 @@
1@charset "UTF-8";
2/**
3 * Foundation for Sites by ZURB
4 * Version 6.4.1
5 * foundation.zurb.com
6 * Licensed under MIT Open Source
7 */
8#spectacle {
9 /*
10
11Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
12
13*/ }
14 #spectacle .swagger-operation-path:before {
15 content: "Path";
16 display: block;
17 margin-bottom: 0.5em;
18 color: #f68b1f;
19 text-transform: uppercase;
20 font-size: 0.9rem; }
21 #spectacle .swagger-operation-description:before {
22 content: "Description";
23 display: block;
24 margin-bottom: 0.5em;
25 color: #f68b1f;
26 text-transform: uppercase;
27 font-size: 0.9rem; }
28 #spectacle .swagger-request-params:before {
29 content: "Request parameters";
30 display: block;
31 margin-bottom: 0.5em;
32 color: #f68b1f;
33 text-transform: uppercase;
34 font-size: 0.9rem; }
35 #spectacle .swagger-request-body:before {
36 content: "Request body";
37 display: block;
38 margin-bottom: 0.5em;
39 color: #f68b1f;
40 text-transform: uppercase;
41 font-size: 0.9rem; }
42 #spectacle .swagger-request-body .json-schema-properties:before {
43 display: none; }
44 #spectacle .swagger-responses:before {
45 content: "Responses";
46 display: block;
47 margin-bottom: 0.5em;
48 color: #f68b1f;
49 text-transform: uppercase;
50 font-size: 0.9rem; }
51 #spectacle .swagger-global:before {
52 display: inline-block;
53 padding: 0.33333rem 0.5rem;
54 border-radius: 0;
55 font-size: 0.8rem;
56 line-height: 1;
57 white-space: nowrap;
58 cursor: default;
59 background: #cc4b37;
60 color: #fefefe;
61 font-size: 0.75rem;
62 border-radius: 4px;
63 padding: 3px 6px;
64 content: "global"; }
65 #spectacle table.table th.swagger-param-key {
66 width: auto; }
67 #spectacle table.table th.swagger-param-key:before {
68 content: "Key"; }
69 #spectacle table.table th.swagger-param-name {
70 width: auto; }
71 #spectacle table.table th.swagger-param-name:before {
72 content: "Name"; }
73 #spectacle table.table th.swagger-param-description {
74 width: auto; }
75 #spectacle table.table th.swagger-param-description:before {
76 content: "Description"; }
77 #spectacle table.table th.swagger-param-data-type {
78 width: auto; }
79 #spectacle table.table th.swagger-param-data-type:before {
80 content: "Data type"; }
81 #spectacle table.table th.swagger-param-type {
82 width: auto; }
83 #spectacle table.table th.swagger-param-type:before {
84 content: "Type"; }
85 #spectacle table.table th.swagger-request-security-schema {
86 width: auto; }
87 #spectacle table.table th.swagger-request-security-schema:before {
88 content: "Schema"; }
89 #spectacle table.table th.swagger-request-security-scopes {
90 width: auto; }
91 #spectacle table.table th.swagger-request-security-scopes:before {
92 content: "Scopes"; }
93 #spectacle table.table th.swagger-response-header-name {
94 width: auto; }
95 #spectacle table.table th.swagger-response-header-name:before {
96 content: "Header"; }
97 #spectacle table.table th.swagger-response-header-description {
98 width: auto; }
99 #spectacle table.table th.swagger-response-header-description:before {
100 content: "Description"; }
101 #spectacle table.table th.swagger-response-header-data-type {
102 width: auto; }
103 #spectacle table.table th.swagger-response-header-data-type:before {
104 content: "Data type"; }
105 #spectacle table.table th.swagger-response-code {
106 width: auto; }
107 #spectacle table.table th.swagger-response-code:before {
108 content: "Code"; }
109 #spectacle table.table th.swagger-response-description {
110 width: auto; }
111 #spectacle table.table th.swagger-response-description:before {
112 content: "Description"; }
113 #spectacle table.table th.swagger-response-schema {
114 width: auto; }
115 #spectacle table.table th.swagger-response-schema:before {
116 content: "Schema"; }
117 #spectacle .swagger-response-name-value {
118 font-weight: bold; }
119 #spectacle .swagger-response-description-text {
120 padding-bottom: 0.5em; }
121 #spectacle .swagger-request-security:before {
122 content: "Security";
123 display: block;
124 margin-bottom: 0.5em;
125 color: #f68b1f;
126 text-transform: uppercase;
127 font-size: 0.9rem; }
128 #spectacle .swagger-security-definition-basic:before {
129 color: #cacaca;
130 content: "(HTTP Basic Authentication)"; }
131 #spectacle .swagger-security-definition-oauth2:before {
132 color: #cacaca;
133 content: "(OAuth2 Authentication)"; }
134 #spectacle .swagger-security-definition-apiKey:before {
135 color: #cacaca;
136 content: "(API Key Authentication)"; }
137 #spectacle .json-schema-description:before {
138 content: "Description";
139 display: block;
140 margin-bottom: 0.5em;
141 color: #f68b1f;
142 text-transform: uppercase;
143 font-size: 0.9rem; }
144 #spectacle .json-schema-properties:before {
145 content: "Properties";
146 display: block;
147 margin-bottom: 0.5em;
148 color: #f68b1f;
149 text-transform: uppercase;
150 font-size: 0.9rem; }
151 #spectacle .json-schema-properties dl {
152 margin: 0; }
153 #spectacle .json-schema-properties dt {
154 margin-bottom: .25rem; }
155 #spectacle .json-schema-properties dt.has-description {
156 margin-bottom: 0; }
157 #spectacle .json-schema-properties dd {
158 color: #8a8a8a; }
159 #spectacle .json-schema-properties dd:not(:last-child) {
160 padding-bottom: 0.5rem; }
161 #spectacle .json-schema-description + .json-schema-properties {
162 margin-top: 1.5rem; }
163 #spectacle .json-schema-ref-array:before {
164 color: #8a8a8a;
165 content: "Array<"; }
166 #spectacle .json-schema-ref-array:after {
167 color: #8a8a8a;
168 content: ">"; }
169 #spectacle .json-schema-example:before {
170 content: "Example";
171 display: block;
172 margin-bottom: 0.5em;
173 color: #f68b1f;
174 text-transform: uppercase;
175 font-size: 0.9rem; }
176 #spectacle .json-schema-array-items:before {
177 content: "Items";
178 display: block;
179 margin-bottom: 0.5em;
180 color: #f68b1f;
181 text-transform: uppercase;
182 font-size: 0.9rem; }
183 #spectacle .json-schema-allOf-inherited:before {
184 content: "Inherited";
185 display: block;
186 margin-bottom: 0.5em;
187 color: #f68b1f;
188 text-transform: uppercase;
189 font-size: 0.9rem; }
190 #spectacle .json-schema-anyOf > dl {
191 padding-left: 1em; }
192 #spectacle .json-schema-anyOf > dl dt:not(:first-child):before {
193 content: "or "; }
194 #spectacle .json-schema-anyOf > dl dt:first-child:before {
195 content: "either "; }
196 #spectacle .json-schema-additionalProperties:before {
197 content: "Additional properties";
198 display: block;
199 margin-bottom: 0.5em;
200 color: #f68b1f;
201 text-transform: uppercase;
202 font-size: 0.9rem; }
203 #spectacle .json-inner-schema .json-schema-properties,
204 #spectacle .json-inner-schema .json-schema-array-items,
205 #spectacle .json-inner-schema .json-schema-description,
206 #spectacle .json-inner-schema .json-schema-example {
207 padding-left: 1em;
208 margin-top: 0.5em;
209 padding-bottom: 0.5em; }
210 #spectacle .json-property-discriminator:before {
211 display: inline-block;
212 padding: 0.33333rem 0.5rem;
213 border-radius: 0;
214 font-size: 0.8rem;
215 line-height: 1;
216 white-space: nowrap;
217 cursor: default;
218 background: #cc4b37;
219 color: #fefefe;
220 font-size: 0.75rem;
221 border-radius: 4px;
222 padding: 3px 6px;
223 content: "discriminator"; }
224 #spectacle .json-property-required:before {
225 display: inline-block;
226 padding: 0.33333rem 0.5rem;
227 border-radius: 0;
228 font-size: 0.8rem;
229 line-height: 1;
230 white-space: nowrap;
231 cursor: default;
232 background: #cc4b37;
233 color: #fefefe;
234 font-size: 0.75rem;
235 border-radius: 4px;
236 padding: 3px 6px;
237 content: "required"; }
238 #spectacle .json-property-read-only:before {
239 display: inline-block;
240 padding: 0.33333rem 0.5rem;
241 border-radius: 0;
242 font-size: 0.8rem;
243 line-height: 1;
244 white-space: nowrap;
245 cursor: default;
246 background: #cc4b37;
247 color: #fefefe;
248 font-size: 0.75rem;
249 border-radius: 4px;
250 padding: 3px 6px;
251 content: "read only"; }
252 #spectacle .json-property-format {
253 font-style: italic; }
254 #spectacle .json-property-enum:before {
255 content: 'enum: ['; }
256 #spectacle .json-property-enum:after {
257 content: ']'; }
258 #spectacle .json-property-default-value:before {
259 content: 'default: '; }
260 #spectacle .json-property-range:empty {
261 display: none !important; }
262 #spectacle .json-property-range:before {
263 content: 'range: '; }
264 #spectacle .json-property-enum-item {
265 font-weight: lighter;
266 font-size: small; }
267 #spectacle .json-schema-reference {
268 font-size: 90%; }
269 #spectacle .no-padding {
270 padding: 0 !important; }
271 #spectacle .no-margin {
272 margin: 0 !important; }
273 #spectacle button:focus {
274 outline: none; }
275 #spectacle .default-label {
276 display: inline-block;
277 padding: 0.33333rem 0.5rem;
278 border-radius: 0;
279 font-size: 0.8rem;
280 line-height: 1;
281 white-space: nowrap;
282 cursor: default;
283 background: #767676;
284 color: #fefefe;
285 font-size: 0.75rem;
286 border-radius: 4px;
287 padding: 3px 6px; }
288 #spectacle #logo {
289 text-align: center;
290 padding-right: 0.5rem;
291 padding-top: 1rem;
292 padding-bottom: 0.25rem; }
293 #spectacle #logo img {
294 max-height: 75px; }
295 #spectacle .row, #spectacle article .prop-row, #spectacle article .doc-row {
296 max-width: auto;
297 margin-right: auto;
298 margin-left: auto; }
299 #spectacle .row::before, #spectacle article .prop-row::before, #spectacle article .doc-row::before, #spectacle .row::after, #spectacle article .prop-row::after, #spectacle article .doc-row::after {
300 display: table;
301 content: ' ';
302 flex-basis: 0;
303 order: 1; }
304 #spectacle .row::after, #spectacle article .prop-row::after, #spectacle article .doc-row::after {
305 clear: both; }
306 #spectacle .row.collapse > .column, #spectacle article .prop-row > .column, #spectacle article .doc-row > .column, #spectacle .row.collapse > .columns, #spectacle article .prop-row > .columns, #spectacle article .doc-row > .columns, #spectacle article .prop-row .row.collapse > .prop-name, #spectacle article .prop-row > .prop-name, #spectacle article .prop-row .doc-row > .prop-name, #spectacle article .prop-row .row.collapse > .prop-value, #spectacle article .prop-row > .prop-value, #spectacle article .prop-row .doc-row > .prop-value, #spectacle article .row.collapse > .doc-copy, #spectacle article .prop-row > .doc-copy, #spectacle article .doc-row > .doc-copy, #spectacle article .row.collapse > .doc-examples, #spectacle article .prop-row > .doc-examples, #spectacle article .doc-row > .doc-examples {
307 padding-right: 0;
308 padding-left: 0; }
309 #spectacle .row .row, #spectacle article .prop-row .row, #spectacle article .doc-row .row, #spectacle .row article .prop-row, #spectacle article .row .prop-row, #spectacle article .prop-row .prop-row, #spectacle article .doc-row .prop-row, #spectacle .row article .doc-row, #spectacle article .row .doc-row, #spectacle article .prop-row .doc-row, #spectacle article .doc-row .doc-row {
310 margin-right: -0.6578947368rem;
311 margin-left: -0.6578947368rem; }
312 @media print, screen and (min-width: 40em) {
313 #spectacle .row .row, #spectacle article .prop-row .row, #spectacle article .doc-row .row, #spectacle .row article .prop-row, #spectacle article .row .prop-row, #spectacle article .prop-row .prop-row, #spectacle article .doc-row .prop-row, #spectacle .row article .doc-row, #spectacle article .row .doc-row, #spectacle article .prop-row .doc-row, #spectacle article .doc-row .doc-row {
314 margin-right: -0.9868421053rem;
315 margin-left: -0.9868421053rem; } }
316 @media print, screen and (min-width: 64em) {
317 #spectacle .row .row, #spectacle article .prop-row .row, #spectacle article .doc-row .row, #spectacle .row article .prop-row, #spectacle article .row .prop-row, #spectacle article .prop-row .prop-row, #spectacle article .doc-row .prop-row, #spectacle .row article .doc-row, #spectacle article .row .doc-row, #spectacle article .prop-row .doc-row, #spectacle article .doc-row .doc-row {
318 margin-right: -0.9868421053rem;
319 margin-left: -0.9868421053rem; } }
320 #spectacle .row .row.collapse, #spectacle article .prop-row .row.collapse, #spectacle article .doc-row .row.collapse, #spectacle .row article .prop-row, #spectacle article .row .prop-row, #spectacle article .prop-row .prop-row, #spectacle article .doc-row .prop-row, #spectacle .row article .doc-row, #spectacle article .row .doc-row, #spectacle article .prop-row .doc-row, #spectacle article .doc-row .doc-row {
321 margin-right: 0;
322 margin-left: 0; }
323 #spectacle .row.expanded, #spectacle article .expanded.prop-row, #spectacle article .expanded.doc-row {
324 max-width: none; }
325 #spectacle .row.expanded .row, #spectacle article .expanded.prop-row .row, #spectacle article .expanded.doc-row .row, #spectacle .row.expanded article .prop-row, #spectacle article .row.expanded .prop-row, #spectacle article .expanded.prop-row .prop-row, #spectacle article .expanded.doc-row .prop-row, #spectacle .row.expanded article .doc-row, #spectacle article .row.expanded .doc-row, #spectacle article .expanded.prop-row .doc-row, #spectacle article .expanded.doc-row .doc-row {
326 margin-right: auto;
327 margin-left: auto; }
328 #spectacle .row:not(.expanded) .row, #spectacle article .prop-row:not(.expanded) .row, #spectacle article .doc-row:not(.expanded) .row, #spectacle .row:not(.expanded) article .prop-row, #spectacle article .row:not(.expanded) .prop-row, #spectacle article .prop-row:not(.expanded) .prop-row, #spectacle article .doc-row:not(.expanded) .prop-row, #spectacle .row:not(.expanded) article .doc-row, #spectacle article .row:not(.expanded) .doc-row, #spectacle article .prop-row:not(.expanded) .doc-row, #spectacle article .doc-row:not(.expanded) .doc-row {
329 max-width: none; }
330 #spectacle .row.gutter-small > .column, #spectacle article .gutter-small.prop-row > .column, #spectacle article .gutter-small.doc-row > .column, #spectacle .row.gutter-small > .columns, #spectacle article .gutter-small.prop-row > .columns, #spectacle article .gutter-small.doc-row > .columns, #spectacle article .prop-row .row.gutter-small > .prop-name, #spectacle article .gutter-small.prop-row > .prop-name, #spectacle article .prop-row .gutter-small.doc-row > .prop-name, #spectacle article .prop-row .row.gutter-small > .prop-value, #spectacle article .gutter-small.prop-row > .prop-value, #spectacle article .prop-row .gutter-small.doc-row > .prop-value, #spectacle article .row.gutter-small > .doc-copy, #spectacle article .gutter-small.prop-row > .doc-copy, #spectacle article .gutter-small.doc-row > .doc-copy, #spectacle article .row.gutter-small > .doc-examples, #spectacle article .gutter-small.prop-row > .doc-examples, #spectacle article .gutter-small.doc-row > .doc-examples {
331 padding-right: 0.6578947368rem;
332 padding-left: 0.6578947368rem; }
333 #spectacle .row.gutter-medium > .column, #spectacle article .gutter-medium.prop-row > .column, #spectacle article .gutter-medium.doc-row > .column, #spectacle .row.gutter-medium > .columns, #spectacle article .gutter-medium.prop-row > .columns, #spectacle article .gutter-medium.doc-row > .columns, #spectacle article .prop-row .row.gutter-medium > .prop-name, #spectacle article .gutter-medium.prop-row > .prop-name, #spectacle article .prop-row .gutter-medium.doc-row > .prop-name, #spectacle article .prop-row .row.gutter-medium > .prop-value, #spectacle article .gutter-medium.prop-row > .prop-value, #spectacle article .prop-row .gutter-medium.doc-row > .prop-value, #spectacle article .row.gutter-medium > .doc-copy, #spectacle article .gutter-medium.prop-row > .doc-copy, #spectacle article .gutter-medium.doc-row > .doc-copy, #spectacle article .row.gutter-medium > .doc-examples, #spectacle article .gutter-medium.prop-row > .doc-examples, #spectacle article .gutter-medium.doc-row > .doc-examples {
334 padding-right: 0.9868421053rem;
335 padding-left: 0.9868421053rem; }
336 #spectacle .column, #spectacle .columns, #spectacle article .prop-row .prop-name, #spectacle article .prop-row .prop-value, #spectacle article .doc-copy, #spectacle article .doc-examples {
337 width: 100%;
338 float: left;
339 padding-right: 0.6578947368rem;
340 padding-left: 0.6578947368rem; }
341 @media print, screen and (min-width: 40em) {
342 #spectacle .column, #spectacle .columns, #spectacle article .prop-row .prop-name, #spectacle article .prop-row .prop-value, #spectacle article .doc-copy, #spectacle article .doc-examples {
343 padding-right: 0.9868421053rem;
344 padding-left: 0.9868421053rem; } }
345 #spectacle .column:last-child:not(:first-child), #spectacle .columns:last-child:not(:first-child), #spectacle article .prop-row .prop-name:last-child:not(:first-child), #spectacle article .prop-row .prop-value:last-child:not(:first-child), #spectacle article .doc-copy:last-child:not(:first-child), #spectacle article .doc-examples:last-child:not(:first-child) {
346 float: right; }
347 #spectacle .column.end:last-child:last-child, #spectacle .end.columns:last-child:last-child, #spectacle article .prop-row .end.prop-name:last-child:last-child, #spectacle article .prop-row .end.prop-value:last-child:last-child, #spectacle article .end.doc-copy:last-child:last-child, #spectacle article .end.doc-examples:last-child:last-child {
348 float: left; }
349 #spectacle .column.row.row, #spectacle .row.row.columns, #spectacle article .columns.prop-row, #spectacle article .prop-row .prop-row.prop-name, #spectacle article .prop-row .prop-row.prop-value, #spectacle article .prop-row.doc-copy, #spectacle article .prop-row.doc-examples, #spectacle article .prop-row .row.row.prop-name, #spectacle article .prop-row .prop-name.doc-row, #spectacle article .prop-row .row.row.prop-value, #spectacle article .prop-row .prop-value.doc-row, #spectacle article .columns.doc-row, #spectacle article .doc-row.doc-copy, #spectacle article .doc-row.doc-examples, #spectacle article .row.row.doc-copy, #spectacle article .row.row.doc-examples, #spectacle article .column.prop-row, #spectacle article .column.doc-row {
350 float: none; }
351 #spectacle .row .column.row.row, #spectacle article .prop-row .column.row.row, #spectacle article .doc-row .column.row.row, #spectacle .row .row.row.columns, #spectacle article .prop-row .row.row.columns, #spectacle article .doc-row .row.row.columns, #spectacle .row article .columns.prop-row, #spectacle article .row .columns.prop-row, #spectacle article .prop-row .columns.prop-row, #spectacle article .doc-row .columns.prop-row, #spectacle .row article .prop-row .prop-row.prop-name, #spectacle article .prop-row .row .prop-row.prop-name, #spectacle article .prop-row .prop-row.prop-name, #spectacle .row article .prop-row .prop-row.prop-value, #spectacle article .prop-row .row .prop-row.prop-value, #spectacle article .prop-row .prop-row.prop-value, #spectacle .row article .prop-row.doc-copy, #spectacle article .row .prop-row.doc-copy, #spectacle article .prop-row .prop-row.doc-copy, #spectacle article .doc-row .prop-row.doc-copy, #spectacle .row article .prop-row.doc-examples, #spectacle article .row .prop-row.doc-examples, #spectacle article .prop-row .prop-row.doc-examples, #spectacle article .doc-row .prop-row.doc-examples, #spectacle article .prop-row .row.row.prop-name, #spectacle .row article .prop-row .prop-name.doc-row, #spectacle article .prop-row .row .prop-name.doc-row, #spectacle article .prop-row .prop-name.doc-row, #spectacle article .prop-row .row.row.prop-value, #spectacle .row article .prop-row .prop-value.doc-row, #spectacle article .prop-row .row .prop-value.doc-row, #spectacle article .prop-row .prop-value.doc-row, #spectacle .row article .columns.doc-row, #spectacle article .row .columns.doc-row, #spectacle article .prop-row .columns.doc-row, #spectacle article .doc-row .columns.doc-row, #spectacle .row article .doc-row.doc-copy, #spectacle article .row .doc-row.doc-copy, #spectacle article .prop-row .doc-row.doc-copy, #spectacle article .doc-row .doc-row.doc-copy, #spectacle .row article .doc-row.doc-examples, #spectacle article .row .doc-row.doc-examples, #spectacle article .prop-row .doc-row.doc-examples, #spectacle article .doc-row .doc-row.doc-examples, #spectacle .row article .row.row.doc-copy, #spectacle article .row .row.row.doc-copy, #spectacle article .prop-row .row.row.doc-copy, #spectacle article .doc-row .row.row.doc-copy, #spectacle .row article .row.row.doc-examples, #spectacle article .row .row.row.doc-examples, #spectacle article .prop-row .row.row.doc-examples, #spectacle article .doc-row .row.row.doc-examples, #spectacle .row article .column.prop-row, #spectacle article .row .column.prop-row, #spectacle article .prop-row .column.prop-row, #spectacle article .doc-row .column.prop-row, #spectacle .row article .column.doc-row, #spectacle article .row .column.doc-row, #spectacle article .prop-row .column.doc-row, #spectacle article .doc-row .column.doc-row {
352 margin-right: 0;
353 margin-left: 0;
354 padding-right: 0;
355 padding-left: 0; }
356 #spectacle .small-1 {
357 width: 8.3333333333%; }
358 #spectacle .small-push-1 {
359 position: relative;
360 left: 8.3333333333%; }
361 #spectacle .small-pull-1 {
362 position: relative;
363 left: -8.3333333333%; }
364 #spectacle .small-offset-0 {
365 margin-left: 0%; }
366 #spectacle .small-2 {
367 width: 16.6666666667%; }
368 #spectacle .small-push-2 {
369 position: relative;
370 left: 16.6666666667%; }
371 #spectacle .small-pull-2 {
372 position: relative;
373 left: -16.6666666667%; }
374 #spectacle .small-offset-1 {
375 margin-left: 8.3333333333%; }
376 #spectacle .small-3 {
377 width: 25%; }
378 #spectacle .small-push-3 {
379 position: relative;
380 left: 25%; }
381 #spectacle .small-pull-3 {
382 position: relative;
383 left: -25%; }
384 #spectacle .small-offset-2 {
385 margin-left: 16.6666666667%; }
386 #spectacle .small-4 {
387 width: 33.3333333333%; }
388 #spectacle .small-push-4 {
389 position: relative;
390 left: 33.3333333333%; }
391 #spectacle .small-pull-4 {
392 position: relative;
393 left: -33.3333333333%; }
394 #spectacle .small-offset-3 {
395 margin-left: 25%; }
396 #spectacle .small-5, #spectacle article .prop-row .prop-name {
397 width: 41.6666666667%; }
398 #spectacle .small-push-5 {
399 position: relative;
400 left: 41.6666666667%; }
401 #spectacle .small-pull-5 {
402 position: relative;
403 left: -41.6666666667%; }
404 #spectacle .small-offset-4 {
405 margin-left: 33.3333333333%; }
406 #spectacle .small-6 {
407 width: 50%; }
408 #spectacle .small-push-6 {
409 position: relative;
410 left: 50%; }
411 #spectacle .small-pull-6 {
412 position: relative;
413 left: -50%; }
414 #spectacle .small-offset-5 {
415 margin-left: 41.6666666667%; }
416 #spectacle .small-7, #spectacle article .prop-row .prop-value {
417 width: 58.3333333333%; }
418 #spectacle .small-push-7 {
419 position: relative;
420 left: 58.3333333333%; }
421 #spectacle .small-pull-7 {
422 position: relative;
423 left: -58.3333333333%; }
424 #spectacle .small-offset-6 {
425 margin-left: 50%; }
426 #spectacle .small-8 {
427 width: 66.6666666667%; }
428 #spectacle .small-push-8 {
429 position: relative;
430 left: 66.6666666667%; }
431 #spectacle .small-pull-8 {
432 position: relative;
433 left: -66.6666666667%; }
434 #spectacle .small-offset-7 {
435 margin-left: 58.3333333333%; }
436 #spectacle .small-9 {
437 width: 75%; }
438 #spectacle .small-push-9 {
439 position: relative;
440 left: 75%; }
441 #spectacle .small-pull-9 {
442 position: relative;
443 left: -75%; }
444 #spectacle .small-offset-8 {
445 margin-left: 66.6666666667%; }
446 #spectacle .small-10 {
447 width: 83.3333333333%; }
448 #spectacle .small-push-10 {
449 position: relative;
450 left: 83.3333333333%; }
451 #spectacle .small-pull-10 {
452 position: relative;
453 left: -83.3333333333%; }
454 #spectacle .small-offset-9 {
455 margin-left: 75%; }
456 #spectacle .small-11 {
457 width: 91.6666666667%; }
458 #spectacle .small-push-11 {
459 position: relative;
460 left: 91.6666666667%; }
461 #spectacle .small-pull-11 {
462 position: relative;
463 left: -91.6666666667%; }
464 #spectacle .small-offset-10 {
465 margin-left: 83.3333333333%; }
466 #spectacle .small-12 {
467 width: 100%; }
468 #spectacle .small-offset-11 {
469 margin-left: 91.6666666667%; }
470 #spectacle .small-up-1 > .column, #spectacle .small-up-1 > .columns, #spectacle article .prop-row .small-up-1 > .prop-name, #spectacle article .prop-row .small-up-1 > .prop-value, #spectacle article .small-up-1 > .doc-copy, #spectacle article .small-up-1 > .doc-examples {
471 float: left;
472 width: 100%; }
473 #spectacle .small-up-1 > .column:nth-of-type(1n), #spectacle .small-up-1 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-1 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-1 > .prop-value:nth-of-type(1n), #spectacle article .small-up-1 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-1 > .doc-examples:nth-of-type(1n) {
474 clear: none; }
475 #spectacle .small-up-1 > .column:nth-of-type(1n+1), #spectacle .small-up-1 > .columns:nth-of-type(1n+1), #spectacle article .prop-row .small-up-1 > .prop-name:nth-of-type(1n+1), #spectacle article .prop-row .small-up-1 > .prop-value:nth-of-type(1n+1), #spectacle article .small-up-1 > .doc-copy:nth-of-type(1n+1), #spectacle article .small-up-1 > .doc-examples:nth-of-type(1n+1) {
476 clear: both; }
477 #spectacle .small-up-1 > .column:last-child, #spectacle .small-up-1 > .columns:last-child, #spectacle article .prop-row .small-up-1 > .prop-name:last-child, #spectacle article .prop-row .small-up-1 > .prop-value:last-child, #spectacle article .small-up-1 > .doc-copy:last-child, #spectacle article .small-up-1 > .doc-examples:last-child {
478 float: left; }
479 #spectacle .small-up-2 > .column, #spectacle .small-up-2 > .columns, #spectacle article .prop-row .small-up-2 > .prop-name, #spectacle article .prop-row .small-up-2 > .prop-value, #spectacle article .small-up-2 > .doc-copy, #spectacle article .small-up-2 > .doc-examples {
480 float: left;
481 width: 50%; }
482 #spectacle .small-up-2 > .column:nth-of-type(1n), #spectacle .small-up-2 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-2 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-2 > .prop-value:nth-of-type(1n), #spectacle article .small-up-2 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-2 > .doc-examples:nth-of-type(1n) {
483 clear: none; }
484 #spectacle .small-up-2 > .column:nth-of-type(2n+1), #spectacle .small-up-2 > .columns:nth-of-type(2n+1), #spectacle article .prop-row .small-up-2 > .prop-name:nth-of-type(2n+1), #spectacle article .prop-row .small-up-2 > .prop-value:nth-of-type(2n+1), #spectacle article .small-up-2 > .doc-copy:nth-of-type(2n+1), #spectacle article .small-up-2 > .doc-examples:nth-of-type(2n+1) {
485 clear: both; }
486 #spectacle .small-up-2 > .column:last-child, #spectacle .small-up-2 > .columns:last-child, #spectacle article .prop-row .small-up-2 > .prop-name:last-child, #spectacle article .prop-row .small-up-2 > .prop-value:last-child, #spectacle article .small-up-2 > .doc-copy:last-child, #spectacle article .small-up-2 > .doc-examples:last-child {
487 float: left; }
488 #spectacle .small-up-3 > .column, #spectacle .small-up-3 > .columns, #spectacle article .prop-row .small-up-3 > .prop-name, #spectacle article .prop-row .small-up-3 > .prop-value, #spectacle article .small-up-3 > .doc-copy, #spectacle article .small-up-3 > .doc-examples {
489 float: left;
490 width: 33.3333333333%; }
491 #spectacle .small-up-3 > .column:nth-of-type(1n), #spectacle .small-up-3 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-3 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-3 > .prop-value:nth-of-type(1n), #spectacle article .small-up-3 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-3 > .doc-examples:nth-of-type(1n) {
492 clear: none; }
493 #spectacle .small-up-3 > .column:nth-of-type(3n+1), #spectacle .small-up-3 > .columns:nth-of-type(3n+1), #spectacle article .prop-row .small-up-3 > .prop-name:nth-of-type(3n+1), #spectacle article .prop-row .small-up-3 > .prop-value:nth-of-type(3n+1), #spectacle article .small-up-3 > .doc-copy:nth-of-type(3n+1), #spectacle article .small-up-3 > .doc-examples:nth-of-type(3n+1) {
494 clear: both; }
495 #spectacle .small-up-3 > .column:last-child, #spectacle .small-up-3 > .columns:last-child, #spectacle article .prop-row .small-up-3 > .prop-name:last-child, #spectacle article .prop-row .small-up-3 > .prop-value:last-child, #spectacle article .small-up-3 > .doc-copy:last-child, #spectacle article .small-up-3 > .doc-examples:last-child {
496 float: left; }
497 #spectacle .small-up-4 > .column, #spectacle .small-up-4 > .columns, #spectacle article .prop-row .small-up-4 > .prop-name, #spectacle article .prop-row .small-up-4 > .prop-value, #spectacle article .small-up-4 > .doc-copy, #spectacle article .small-up-4 > .doc-examples {
498 float: left;
499 width: 25%; }
500 #spectacle .small-up-4 > .column:nth-of-type(1n), #spectacle .small-up-4 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-4 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-4 > .prop-value:nth-of-type(1n), #spectacle article .small-up-4 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-4 > .doc-examples:nth-of-type(1n) {
501 clear: none; }
502 #spectacle .small-up-4 > .column:nth-of-type(4n+1), #spectacle .small-up-4 > .columns:nth-of-type(4n+1), #spectacle article .prop-row .small-up-4 > .prop-name:nth-of-type(4n+1), #spectacle article .prop-row .small-up-4 > .prop-value:nth-of-type(4n+1), #spectacle article .small-up-4 > .doc-copy:nth-of-type(4n+1), #spectacle article .small-up-4 > .doc-examples:nth-of-type(4n+1) {
503 clear: both; }
504 #spectacle .small-up-4 > .column:last-child, #spectacle .small-up-4 > .columns:last-child, #spectacle article .prop-row .small-up-4 > .prop-name:last-child, #spectacle article .prop-row .small-up-4 > .prop-value:last-child, #spectacle article .small-up-4 > .doc-copy:last-child, #spectacle article .small-up-4 > .doc-examples:last-child {
505 float: left; }
506 #spectacle .small-up-5 > .column, #spectacle .small-up-5 > .columns, #spectacle article .prop-row .small-up-5 > .prop-name, #spectacle article .prop-row .small-up-5 > .prop-value, #spectacle article .small-up-5 > .doc-copy, #spectacle article .small-up-5 > .doc-examples {
507 float: left;
508 width: 20%; }
509 #spectacle .small-up-5 > .column:nth-of-type(1n), #spectacle .small-up-5 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-5 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-5 > .prop-value:nth-of-type(1n), #spectacle article .small-up-5 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-5 > .doc-examples:nth-of-type(1n) {
510 clear: none; }
511 #spectacle .small-up-5 > .column:nth-of-type(5n+1), #spectacle .small-up-5 > .columns:nth-of-type(5n+1), #spectacle article .prop-row .small-up-5 > .prop-name:nth-of-type(5n+1), #spectacle article .prop-row .small-up-5 > .prop-value:nth-of-type(5n+1), #spectacle article .small-up-5 > .doc-copy:nth-of-type(5n+1), #spectacle article .small-up-5 > .doc-examples:nth-of-type(5n+1) {
512 clear: both; }
513 #spectacle .small-up-5 > .column:last-child, #spectacle .small-up-5 > .columns:last-child, #spectacle article .prop-row .small-up-5 > .prop-name:last-child, #spectacle article .prop-row .small-up-5 > .prop-value:last-child, #spectacle article .small-up-5 > .doc-copy:last-child, #spectacle article .small-up-5 > .doc-examples:last-child {
514 float: left; }
515 #spectacle .small-up-6 > .column, #spectacle .small-up-6 > .columns, #spectacle article .prop-row .small-up-6 > .prop-name, #spectacle article .prop-row .small-up-6 > .prop-value, #spectacle article .small-up-6 > .doc-copy, #spectacle article .small-up-6 > .doc-examples {
516 float: left;
517 width: 16.6666666667%; }
518 #spectacle .small-up-6 > .column:nth-of-type(1n), #spectacle .small-up-6 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-6 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-6 > .prop-value:nth-of-type(1n), #spectacle article .small-up-6 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-6 > .doc-examples:nth-of-type(1n) {
519 clear: none; }
520 #spectacle .small-up-6 > .column:nth-of-type(6n+1), #spectacle .small-up-6 > .columns:nth-of-type(6n+1), #spectacle article .prop-row .small-up-6 > .prop-name:nth-of-type(6n+1), #spectacle article .prop-row .small-up-6 > .prop-value:nth-of-type(6n+1), #spectacle article .small-up-6 > .doc-copy:nth-of-type(6n+1), #spectacle article .small-up-6 > .doc-examples:nth-of-type(6n+1) {
521 clear: both; }
522 #spectacle .small-up-6 > .column:last-child, #spectacle .small-up-6 > .columns:last-child, #spectacle article .prop-row .small-up-6 > .prop-name:last-child, #spectacle article .prop-row .small-up-6 > .prop-value:last-child, #spectacle article .small-up-6 > .doc-copy:last-child, #spectacle article .small-up-6 > .doc-examples:last-child {
523 float: left; }
524 #spectacle .small-up-7 > .column, #spectacle .small-up-7 > .columns, #spectacle article .prop-row .small-up-7 > .prop-name, #spectacle article .prop-row .small-up-7 > .prop-value, #spectacle article .small-up-7 > .doc-copy, #spectacle article .small-up-7 > .doc-examples {
525 float: left;
526 width: 14.2857142857%; }
527 #spectacle .small-up-7 > .column:nth-of-type(1n), #spectacle .small-up-7 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-7 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-7 > .prop-value:nth-of-type(1n), #spectacle article .small-up-7 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-7 > .doc-examples:nth-of-type(1n) {
528 clear: none; }
529 #spectacle .small-up-7 > .column:nth-of-type(7n+1), #spectacle .small-up-7 > .columns:nth-of-type(7n+1), #spectacle article .prop-row .small-up-7 > .prop-name:nth-of-type(7n+1), #spectacle article .prop-row .small-up-7 > .prop-value:nth-of-type(7n+1), #spectacle article .small-up-7 > .doc-copy:nth-of-type(7n+1), #spectacle article .small-up-7 > .doc-examples:nth-of-type(7n+1) {
530 clear: both; }
531 #spectacle .small-up-7 > .column:last-child, #spectacle .small-up-7 > .columns:last-child, #spectacle article .prop-row .small-up-7 > .prop-name:last-child, #spectacle article .prop-row .small-up-7 > .prop-value:last-child, #spectacle article .small-up-7 > .doc-copy:last-child, #spectacle article .small-up-7 > .doc-examples:last-child {
532 float: left; }
533 #spectacle .small-up-8 > .column, #spectacle .small-up-8 > .columns, #spectacle article .prop-row .small-up-8 > .prop-name, #spectacle article .prop-row .small-up-8 > .prop-value, #spectacle article .small-up-8 > .doc-copy, #spectacle article .small-up-8 > .doc-examples {
534 float: left;
535 width: 12.5%; }
536 #spectacle .small-up-8 > .column:nth-of-type(1n), #spectacle .small-up-8 > .columns:nth-of-type(1n), #spectacle article .prop-row .small-up-8 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .small-up-8 > .prop-value:nth-of-type(1n), #spectacle article .small-up-8 > .doc-copy:nth-of-type(1n), #spectacle article .small-up-8 > .doc-examples:nth-of-type(1n) {
537 clear: none; }
538 #spectacle .small-up-8 > .column:nth-of-type(8n+1), #spectacle .small-up-8 > .columns:nth-of-type(8n+1), #spectacle article .prop-row .small-up-8 > .prop-name:nth-of-type(8n+1), #spectacle article .prop-row .small-up-8 > .prop-value:nth-of-type(8n+1), #spectacle article .small-up-8 > .doc-copy:nth-of-type(8n+1), #spectacle article .small-up-8 > .doc-examples:nth-of-type(8n+1) {
539 clear: both; }
540 #spectacle .small-up-8 > .column:last-child, #spectacle .small-up-8 > .columns:last-child, #spectacle article .prop-row .small-up-8 > .prop-name:last-child, #spectacle article .prop-row .small-up-8 > .prop-value:last-child, #spectacle article .small-up-8 > .doc-copy:last-child, #spectacle article .small-up-8 > .doc-examples:last-child {
541 float: left; }
542 #spectacle .small-collapse > .column, #spectacle .small-collapse > .columns, #spectacle article .prop-row .small-collapse > .prop-name, #spectacle article .prop-row .small-collapse > .prop-value, #spectacle article .small-collapse > .doc-copy, #spectacle article .small-collapse > .doc-examples {
543 padding-right: 0;
544 padding-left: 0; }
545 #spectacle .small-collapse .row, #spectacle .small-collapse article .prop-row, #spectacle article .small-collapse .prop-row, #spectacle .small-collapse article .doc-row, #spectacle article .small-collapse .doc-row {
546 margin-right: 0;
547 margin-left: 0; }
548 #spectacle .expanded.row .small-collapse.row, #spectacle article .expanded.prop-row .small-collapse.row, #spectacle article .expanded.doc-row .small-collapse.row, #spectacle .expanded.row article .small-collapse.prop-row, #spectacle article .expanded.row .small-collapse.prop-row, #spectacle article .expanded.prop-row .small-collapse.prop-row, #spectacle article .expanded.doc-row .small-collapse.prop-row, #spectacle .expanded.row article .small-collapse.doc-row, #spectacle article .expanded.row .small-collapse.doc-row, #spectacle article .expanded.prop-row .small-collapse.doc-row, #spectacle article .expanded.doc-row .small-collapse.doc-row {
549 margin-right: 0;
550 margin-left: 0; }
551 #spectacle .small-uncollapse > .column, #spectacle .small-uncollapse > .columns, #spectacle article .prop-row .small-uncollapse > .prop-name, #spectacle article .prop-row .small-uncollapse > .prop-value, #spectacle article .small-uncollapse > .doc-copy, #spectacle article .small-uncollapse > .doc-examples {
552 padding-right: 0.6578947368rem;
553 padding-left: 0.6578947368rem; }
554 #spectacle .small-centered {
555 margin-right: auto;
556 margin-left: auto; }
557 #spectacle .small-centered, #spectacle .small-centered:last-child:not(:first-child) {
558 float: none;
559 clear: both; }
560 #spectacle .small-uncentered,
561 #spectacle .small-push-0,
562 #spectacle .small-pull-0 {
563 position: static;
564 float: left;
565 margin-right: 0;
566 margin-left: 0; }
567 @media print, screen and (min-width: 40em) {
568 #spectacle .medium-1 {
569 width: 8.3333333333%; }
570 #spectacle .medium-push-1 {
571 position: relative;
572 left: 8.3333333333%; }
573 #spectacle .medium-pull-1 {
574 position: relative;
575 left: -8.3333333333%; }
576 #spectacle .medium-offset-0 {
577 margin-left: 0%; }
578 #spectacle .medium-2 {
579 width: 16.6666666667%; }
580 #spectacle .medium-push-2 {
581 position: relative;
582 left: 16.6666666667%; }
583 #spectacle .medium-pull-2 {
584 position: relative;
585 left: -16.6666666667%; }
586 #spectacle .medium-offset-1 {
587 margin-left: 8.3333333333%; }
588 #spectacle .medium-3 {
589 width: 25%; }
590 #spectacle .medium-push-3 {
591 position: relative;
592 left: 25%; }
593 #spectacle .medium-pull-3 {
594 position: relative;
595 left: -25%; }
596 #spectacle .medium-offset-2 {
597 margin-left: 16.6666666667%; }
598 #spectacle .medium-4 {
599 width: 33.3333333333%; }
600 #spectacle .medium-push-4 {
601 position: relative;
602 left: 33.3333333333%; }
603 #spectacle .medium-pull-4 {
604 position: relative;
605 left: -33.3333333333%; }
606 #spectacle .medium-offset-3 {
607 margin-left: 25%; }
608 #spectacle .medium-5 {
609 width: 41.6666666667%; }
610 #spectacle .medium-push-5 {
611 position: relative;
612 left: 41.6666666667%; }
613 #spectacle .medium-pull-5 {
614 position: relative;
615 left: -41.6666666667%; }
616 #spectacle .medium-offset-4 {
617 margin-left: 33.3333333333%; }
618 #spectacle .medium-6 {
619 width: 50%; }
620 #spectacle .medium-push-6 {
621 position: relative;
622 left: 50%; }
623 #spectacle .medium-pull-6 {
624 position: relative;
625 left: -50%; }
626 #spectacle .medium-offset-5 {
627 margin-left: 41.6666666667%; }
628 #spectacle .medium-7 {
629 width: 58.3333333333%; }
630 #spectacle .medium-push-7 {
631 position: relative;
632 left: 58.3333333333%; }
633 #spectacle .medium-pull-7 {
634 position: relative;
635 left: -58.3333333333%; }
636 #spectacle .medium-offset-6 {
637 margin-left: 50%; }
638 #spectacle .medium-8 {
639 width: 66.6666666667%; }
640 #spectacle .medium-push-8 {
641 position: relative;
642 left: 66.6666666667%; }
643 #spectacle .medium-pull-8 {
644 position: relative;
645 left: -66.6666666667%; }
646 #spectacle .medium-offset-7 {
647 margin-left: 58.3333333333%; }
648 #spectacle .medium-9 {
649 width: 75%; }
650 #spectacle .medium-push-9 {
651 position: relative;
652 left: 75%; }
653 #spectacle .medium-pull-9 {
654 position: relative;
655 left: -75%; }
656 #spectacle .medium-offset-8 {
657 margin-left: 66.6666666667%; }
658 #spectacle .medium-10 {
659 width: 83.3333333333%; }
660 #spectacle .medium-push-10 {
661 position: relative;
662 left: 83.3333333333%; }
663 #spectacle .medium-pull-10 {
664 position: relative;
665 left: -83.3333333333%; }
666 #spectacle .medium-offset-9 {
667 margin-left: 75%; }
668 #spectacle .medium-11 {
669 width: 91.6666666667%; }
670 #spectacle .medium-push-11 {
671 position: relative;
672 left: 91.6666666667%; }
673 #spectacle .medium-pull-11 {
674 position: relative;
675 left: -91.6666666667%; }
676 #spectacle .medium-offset-10 {
677 margin-left: 83.3333333333%; }
678 #spectacle .medium-12 {
679 width: 100%; }
680 #spectacle .medium-offset-11 {
681 margin-left: 91.6666666667%; }
682 #spectacle .medium-up-1 > .column, #spectacle .medium-up-1 > .columns, #spectacle article .prop-row .medium-up-1 > .prop-name, #spectacle article .prop-row .medium-up-1 > .prop-value, #spectacle article .medium-up-1 > .doc-copy, #spectacle article .medium-up-1 > .doc-examples {
683 float: left;
684 width: 100%; }
685 #spectacle .medium-up-1 > .column:nth-of-type(1n), #spectacle .medium-up-1 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-1 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-1 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-1 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-1 > .doc-examples:nth-of-type(1n) {
686 clear: none; }
687 #spectacle .medium-up-1 > .column:nth-of-type(1n+1), #spectacle .medium-up-1 > .columns:nth-of-type(1n+1), #spectacle article .prop-row .medium-up-1 > .prop-name:nth-of-type(1n+1), #spectacle article .prop-row .medium-up-1 > .prop-value:nth-of-type(1n+1), #spectacle article .medium-up-1 > .doc-copy:nth-of-type(1n+1), #spectacle article .medium-up-1 > .doc-examples:nth-of-type(1n+1) {
688 clear: both; }
689 #spectacle .medium-up-1 > .column:last-child, #spectacle .medium-up-1 > .columns:last-child, #spectacle article .prop-row .medium-up-1 > .prop-name:last-child, #spectacle article .prop-row .medium-up-1 > .prop-value:last-child, #spectacle article .medium-up-1 > .doc-copy:last-child, #spectacle article .medium-up-1 > .doc-examples:last-child {
690 float: left; }
691 #spectacle .medium-up-2 > .column, #spectacle .medium-up-2 > .columns, #spectacle article .prop-row .medium-up-2 > .prop-name, #spectacle article .prop-row .medium-up-2 > .prop-value, #spectacle article .medium-up-2 > .doc-copy, #spectacle article .medium-up-2 > .doc-examples {
692 float: left;
693 width: 50%; }
694 #spectacle .medium-up-2 > .column:nth-of-type(1n), #spectacle .medium-up-2 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-2 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-2 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-2 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-2 > .doc-examples:nth-of-type(1n) {
695 clear: none; }
696 #spectacle .medium-up-2 > .column:nth-of-type(2n+1), #spectacle .medium-up-2 > .columns:nth-of-type(2n+1), #spectacle article .prop-row .medium-up-2 > .prop-name:nth-of-type(2n+1), #spectacle article .prop-row .medium-up-2 > .prop-value:nth-of-type(2n+1), #spectacle article .medium-up-2 > .doc-copy:nth-of-type(2n+1), #spectacle article .medium-up-2 > .doc-examples:nth-of-type(2n+1) {
697 clear: both; }
698 #spectacle .medium-up-2 > .column:last-child, #spectacle .medium-up-2 > .columns:last-child, #spectacle article .prop-row .medium-up-2 > .prop-name:last-child, #spectacle article .prop-row .medium-up-2 > .prop-value:last-child, #spectacle article .medium-up-2 > .doc-copy:last-child, #spectacle article .medium-up-2 > .doc-examples:last-child {
699 float: left; }
700 #spectacle .medium-up-3 > .column, #spectacle .medium-up-3 > .columns, #spectacle article .prop-row .medium-up-3 > .prop-name, #spectacle article .prop-row .medium-up-3 > .prop-value, #spectacle article .medium-up-3 > .doc-copy, #spectacle article .medium-up-3 > .doc-examples {
701 float: left;
702 width: 33.3333333333%; }
703 #spectacle .medium-up-3 > .column:nth-of-type(1n), #spectacle .medium-up-3 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-3 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-3 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-3 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-3 > .doc-examples:nth-of-type(1n) {
704 clear: none; }
705 #spectacle .medium-up-3 > .column:nth-of-type(3n+1), #spectacle .medium-up-3 > .columns:nth-of-type(3n+1), #spectacle article .prop-row .medium-up-3 > .prop-name:nth-of-type(3n+1), #spectacle article .prop-row .medium-up-3 > .prop-value:nth-of-type(3n+1), #spectacle article .medium-up-3 > .doc-copy:nth-of-type(3n+1), #spectacle article .medium-up-3 > .doc-examples:nth-of-type(3n+1) {
706 clear: both; }
707 #spectacle .medium-up-3 > .column:last-child, #spectacle .medium-up-3 > .columns:last-child, #spectacle article .prop-row .medium-up-3 > .prop-name:last-child, #spectacle article .prop-row .medium-up-3 > .prop-value:last-child, #spectacle article .medium-up-3 > .doc-copy:last-child, #spectacle article .medium-up-3 > .doc-examples:last-child {
708 float: left; }
709 #spectacle .medium-up-4 > .column, #spectacle .medium-up-4 > .columns, #spectacle article .prop-row .medium-up-4 > .prop-name, #spectacle article .prop-row .medium-up-4 > .prop-value, #spectacle article .medium-up-4 > .doc-copy, #spectacle article .medium-up-4 > .doc-examples {
710 float: left;
711 width: 25%; }
712 #spectacle .medium-up-4 > .column:nth-of-type(1n), #spectacle .medium-up-4 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-4 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-4 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-4 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-4 > .doc-examples:nth-of-type(1n) {
713 clear: none; }
714 #spectacle .medium-up-4 > .column:nth-of-type(4n+1), #spectacle .medium-up-4 > .columns:nth-of-type(4n+1), #spectacle article .prop-row .medium-up-4 > .prop-name:nth-of-type(4n+1), #spectacle article .prop-row .medium-up-4 > .prop-value:nth-of-type(4n+1), #spectacle article .medium-up-4 > .doc-copy:nth-of-type(4n+1), #spectacle article .medium-up-4 > .doc-examples:nth-of-type(4n+1) {
715 clear: both; }
716 #spectacle .medium-up-4 > .column:last-child, #spectacle .medium-up-4 > .columns:last-child, #spectacle article .prop-row .medium-up-4 > .prop-name:last-child, #spectacle article .prop-row .medium-up-4 > .prop-value:last-child, #spectacle article .medium-up-4 > .doc-copy:last-child, #spectacle article .medium-up-4 > .doc-examples:last-child {
717 float: left; }
718 #spectacle .medium-up-5 > .column, #spectacle .medium-up-5 > .columns, #spectacle article .prop-row .medium-up-5 > .prop-name, #spectacle article .prop-row .medium-up-5 > .prop-value, #spectacle article .medium-up-5 > .doc-copy, #spectacle article .medium-up-5 > .doc-examples {
719 float: left;
720 width: 20%; }
721 #spectacle .medium-up-5 > .column:nth-of-type(1n), #spectacle .medium-up-5 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-5 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-5 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-5 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-5 > .doc-examples:nth-of-type(1n) {
722 clear: none; }
723 #spectacle .medium-up-5 > .column:nth-of-type(5n+1), #spectacle .medium-up-5 > .columns:nth-of-type(5n+1), #spectacle article .prop-row .medium-up-5 > .prop-name:nth-of-type(5n+1), #spectacle article .prop-row .medium-up-5 > .prop-value:nth-of-type(5n+1), #spectacle article .medium-up-5 > .doc-copy:nth-of-type(5n+1), #spectacle article .medium-up-5 > .doc-examples:nth-of-type(5n+1) {
724 clear: both; }
725 #spectacle .medium-up-5 > .column:last-child, #spectacle .medium-up-5 > .columns:last-child, #spectacle article .prop-row .medium-up-5 > .prop-name:last-child, #spectacle article .prop-row .medium-up-5 > .prop-value:last-child, #spectacle article .medium-up-5 > .doc-copy:last-child, #spectacle article .medium-up-5 > .doc-examples:last-child {
726 float: left; }
727 #spectacle .medium-up-6 > .column, #spectacle .medium-up-6 > .columns, #spectacle article .prop-row .medium-up-6 > .prop-name, #spectacle article .prop-row .medium-up-6 > .prop-value, #spectacle article .medium-up-6 > .doc-copy, #spectacle article .medium-up-6 > .doc-examples {
728 float: left;
729 width: 16.6666666667%; }
730 #spectacle .medium-up-6 > .column:nth-of-type(1n), #spectacle .medium-up-6 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-6 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-6 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-6 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-6 > .doc-examples:nth-of-type(1n) {
731 clear: none; }
732 #spectacle .medium-up-6 > .column:nth-of-type(6n+1), #spectacle .medium-up-6 > .columns:nth-of-type(6n+1), #spectacle article .prop-row .medium-up-6 > .prop-name:nth-of-type(6n+1), #spectacle article .prop-row .medium-up-6 > .prop-value:nth-of-type(6n+1), #spectacle article .medium-up-6 > .doc-copy:nth-of-type(6n+1), #spectacle article .medium-up-6 > .doc-examples:nth-of-type(6n+1) {
733 clear: both; }
734 #spectacle .medium-up-6 > .column:last-child, #spectacle .medium-up-6 > .columns:last-child, #spectacle article .prop-row .medium-up-6 > .prop-name:last-child, #spectacle article .prop-row .medium-up-6 > .prop-value:last-child, #spectacle article .medium-up-6 > .doc-copy:last-child, #spectacle article .medium-up-6 > .doc-examples:last-child {
735 float: left; }
736 #spectacle .medium-up-7 > .column, #spectacle .medium-up-7 > .columns, #spectacle article .prop-row .medium-up-7 > .prop-name, #spectacle article .prop-row .medium-up-7 > .prop-value, #spectacle article .medium-up-7 > .doc-copy, #spectacle article .medium-up-7 > .doc-examples {
737 float: left;
738 width: 14.2857142857%; }
739 #spectacle .medium-up-7 > .column:nth-of-type(1n), #spectacle .medium-up-7 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-7 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-7 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-7 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-7 > .doc-examples:nth-of-type(1n) {
740 clear: none; }
741 #spectacle .medium-up-7 > .column:nth-of-type(7n+1), #spectacle .medium-up-7 > .columns:nth-of-type(7n+1), #spectacle article .prop-row .medium-up-7 > .prop-name:nth-of-type(7n+1), #spectacle article .prop-row .medium-up-7 > .prop-value:nth-of-type(7n+1), #spectacle article .medium-up-7 > .doc-copy:nth-of-type(7n+1), #spectacle article .medium-up-7 > .doc-examples:nth-of-type(7n+1) {
742 clear: both; }
743 #spectacle .medium-up-7 > .column:last-child, #spectacle .medium-up-7 > .columns:last-child, #spectacle article .prop-row .medium-up-7 > .prop-name:last-child, #spectacle article .prop-row .medium-up-7 > .prop-value:last-child, #spectacle article .medium-up-7 > .doc-copy:last-child, #spectacle article .medium-up-7 > .doc-examples:last-child {
744 float: left; }
745 #spectacle .medium-up-8 > .column, #spectacle .medium-up-8 > .columns, #spectacle article .prop-row .medium-up-8 > .prop-name, #spectacle article .prop-row .medium-up-8 > .prop-value, #spectacle article .medium-up-8 > .doc-copy, #spectacle article .medium-up-8 > .doc-examples {
746 float: left;
747 width: 12.5%; }
748 #spectacle .medium-up-8 > .column:nth-of-type(1n), #spectacle .medium-up-8 > .columns:nth-of-type(1n), #spectacle article .prop-row .medium-up-8 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .medium-up-8 > .prop-value:nth-of-type(1n), #spectacle article .medium-up-8 > .doc-copy:nth-of-type(1n), #spectacle article .medium-up-8 > .doc-examples:nth-of-type(1n) {
749 clear: none; }
750 #spectacle .medium-up-8 > .column:nth-of-type(8n+1), #spectacle .medium-up-8 > .columns:nth-of-type(8n+1), #spectacle article .prop-row .medium-up-8 > .prop-name:nth-of-type(8n+1), #spectacle article .prop-row .medium-up-8 > .prop-value:nth-of-type(8n+1), #spectacle article .medium-up-8 > .doc-copy:nth-of-type(8n+1), #spectacle article .medium-up-8 > .doc-examples:nth-of-type(8n+1) {
751 clear: both; }
752 #spectacle .medium-up-8 > .column:last-child, #spectacle .medium-up-8 > .columns:last-child, #spectacle article .prop-row .medium-up-8 > .prop-name:last-child, #spectacle article .prop-row .medium-up-8 > .prop-value:last-child, #spectacle article .medium-up-8 > .doc-copy:last-child, #spectacle article .medium-up-8 > .doc-examples:last-child {
753 float: left; }
754 #spectacle .medium-collapse > .column, #spectacle .medium-collapse > .columns, #spectacle article .prop-row .medium-collapse > .prop-name, #spectacle article .prop-row .medium-collapse > .prop-value, #spectacle article .medium-collapse > .doc-copy, #spectacle article .medium-collapse > .doc-examples {
755 padding-right: 0;
756 padding-left: 0; }
757 #spectacle .medium-collapse .row, #spectacle .medium-collapse article .prop-row, #spectacle article .medium-collapse .prop-row, #spectacle .medium-collapse article .doc-row, #spectacle article .medium-collapse .doc-row {
758 margin-right: 0;
759 margin-left: 0; }
760 #spectacle .expanded.row .medium-collapse.row, #spectacle article .expanded.prop-row .medium-collapse.row, #spectacle article .expanded.doc-row .medium-collapse.row, #spectacle .expanded.row article .medium-collapse.prop-row, #spectacle article .expanded.row .medium-collapse.prop-row, #spectacle article .expanded.prop-row .medium-collapse.prop-row, #spectacle article .expanded.doc-row .medium-collapse.prop-row, #spectacle .expanded.row article .medium-collapse.doc-row, #spectacle article .expanded.row .medium-collapse.doc-row, #spectacle article .expanded.prop-row .medium-collapse.doc-row, #spectacle article .expanded.doc-row .medium-collapse.doc-row {
761 margin-right: 0;
762 margin-left: 0; }
763 #spectacle .medium-uncollapse > .column, #spectacle .medium-uncollapse > .columns, #spectacle article .prop-row .medium-uncollapse > .prop-name, #spectacle article .prop-row .medium-uncollapse > .prop-value, #spectacle article .medium-uncollapse > .doc-copy, #spectacle article .medium-uncollapse > .doc-examples {
764 padding-right: 0.9868421053rem;
765 padding-left: 0.9868421053rem; }
766 #spectacle .medium-centered {
767 margin-right: auto;
768 margin-left: auto; }
769 #spectacle .medium-centered, #spectacle .medium-centered:last-child:not(:first-child) {
770 float: none;
771 clear: both; }
772 #spectacle .medium-uncentered,
773 #spectacle .medium-push-0,
774 #spectacle .medium-pull-0 {
775 position: static;
776 float: left;
777 margin-right: 0;
778 margin-left: 0; } }
779 @media print, screen and (min-width: 64em) {
780 #spectacle .large-1 {
781 width: 8.3333333333%; }
782 #spectacle .large-push-1 {
783 position: relative;
784 left: 8.3333333333%; }
785 #spectacle .large-pull-1 {
786 position: relative;
787 left: -8.3333333333%; }
788 #spectacle .large-offset-0 {
789 margin-left: 0%; }
790 #spectacle .large-2 {
791 width: 16.6666666667%; }
792 #spectacle .large-push-2 {
793 position: relative;
794 left: 16.6666666667%; }
795 #spectacle .large-pull-2 {
796 position: relative;
797 left: -16.6666666667%; }
798 #spectacle .large-offset-1 {
799 margin-left: 8.3333333333%; }
800 #spectacle .large-3 {
801 width: 25%; }
802 #spectacle .large-push-3 {
803 position: relative;
804 left: 25%; }
805 #spectacle .large-pull-3 {
806 position: relative;
807 left: -25%; }
808 #spectacle .large-offset-2 {
809 margin-left: 16.6666666667%; }
810 #spectacle .large-4 {
811 width: 33.3333333333%; }
812 #spectacle .large-push-4 {
813 position: relative;
814 left: 33.3333333333%; }
815 #spectacle .large-pull-4 {
816 position: relative;
817 left: -33.3333333333%; }
818 #spectacle .large-offset-3 {
819 margin-left: 25%; }
820 #spectacle .large-5 {
821 width: 41.6666666667%; }
822 #spectacle .large-push-5 {
823 position: relative;
824 left: 41.6666666667%; }
825 #spectacle .large-pull-5 {
826 position: relative;
827 left: -41.6666666667%; }
828 #spectacle .large-offset-4 {
829 margin-left: 33.3333333333%; }
830 #spectacle .large-6, #spectacle .doc-content, #spectacle article h1.doc-title, #spectacle article > h1, #spectacle article > h2, #spectacle article .panel > h2, #spectacle article .panel > h3, #spectacle article .doc-copy, #spectacle article .doc-examples {
831 width: 50%; }
832 #spectacle .large-push-6 {
833 position: relative;
834 left: 50%; }
835 #spectacle .large-pull-6 {
836 position: relative;
837 left: -50%; }
838 #spectacle .large-offset-5 {
839 margin-left: 41.6666666667%; }
840 #spectacle .large-7 {
841 width: 58.3333333333%; }
842 #spectacle .large-push-7 {
843 position: relative;
844 left: 58.3333333333%; }
845 #spectacle .large-pull-7 {
846 position: relative;
847 left: -58.3333333333%; }
848 #spectacle .large-offset-6 {
849 margin-left: 50%; }
850 #spectacle .large-8 {
851 width: 66.6666666667%; }
852 #spectacle .large-push-8 {
853 position: relative;
854 left: 66.6666666667%; }
855 #spectacle .large-pull-8 {
856 position: relative;
857 left: -66.6666666667%; }
858 #spectacle .large-offset-7 {
859 margin-left: 58.3333333333%; }
860 #spectacle .large-9 {
861 width: 75%; }
862 #spectacle .large-push-9 {
863 position: relative;
864 left: 75%; }
865 #spectacle .large-pull-9 {
866 position: relative;
867 left: -75%; }
868 #spectacle .large-offset-8 {
869 margin-left: 66.6666666667%; }
870 #spectacle .large-10 {
871 width: 83.3333333333%; }
872 #spectacle .large-push-10 {
873 position: relative;
874 left: 83.3333333333%; }
875 #spectacle .large-pull-10 {
876 position: relative;
877 left: -83.3333333333%; }
878 #spectacle .large-offset-9 {
879 margin-left: 75%; }
880 #spectacle .large-11 {
881 width: 91.6666666667%; }
882 #spectacle .large-push-11 {
883 position: relative;
884 left: 91.6666666667%; }
885 #spectacle .large-pull-11 {
886 position: relative;
887 left: -91.6666666667%; }
888 #spectacle .large-offset-10 {
889 margin-left: 83.3333333333%; }
890 #spectacle .large-12 {
891 width: 100%; }
892 #spectacle .large-offset-11 {
893 margin-left: 91.6666666667%; }
894 #spectacle .large-up-1 > .column, #spectacle .large-up-1 > .columns, #spectacle article .prop-row .large-up-1 > .prop-name, #spectacle article .prop-row .large-up-1 > .prop-value, #spectacle article .large-up-1 > .doc-copy, #spectacle article .large-up-1 > .doc-examples {
895 float: left;
896 width: 100%; }
897 #spectacle .large-up-1 > .column:nth-of-type(1n), #spectacle .large-up-1 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-1 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-1 > .prop-value:nth-of-type(1n), #spectacle article .large-up-1 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-1 > .doc-examples:nth-of-type(1n) {
898 clear: none; }
899 #spectacle .large-up-1 > .column:nth-of-type(1n+1), #spectacle .large-up-1 > .columns:nth-of-type(1n+1), #spectacle article .prop-row .large-up-1 > .prop-name:nth-of-type(1n+1), #spectacle article .prop-row .large-up-1 > .prop-value:nth-of-type(1n+1), #spectacle article .large-up-1 > .doc-copy:nth-of-type(1n+1), #spectacle article .large-up-1 > .doc-examples:nth-of-type(1n+1) {
900 clear: both; }
901 #spectacle .large-up-1 > .column:last-child, #spectacle .large-up-1 > .columns:last-child, #spectacle article .prop-row .large-up-1 > .prop-name:last-child, #spectacle article .prop-row .large-up-1 > .prop-value:last-child, #spectacle article .large-up-1 > .doc-copy:last-child, #spectacle article .large-up-1 > .doc-examples:last-child {
902 float: left; }
903 #spectacle .large-up-2 > .column, #spectacle .large-up-2 > .columns, #spectacle article .prop-row .large-up-2 > .prop-name, #spectacle article .prop-row .large-up-2 > .prop-value, #spectacle article .large-up-2 > .doc-copy, #spectacle article .large-up-2 > .doc-examples {
904 float: left;
905 width: 50%; }
906 #spectacle .large-up-2 > .column:nth-of-type(1n), #spectacle .large-up-2 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-2 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-2 > .prop-value:nth-of-type(1n), #spectacle article .large-up-2 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-2 > .doc-examples:nth-of-type(1n) {
907 clear: none; }
908 #spectacle .large-up-2 > .column:nth-of-type(2n+1), #spectacle .large-up-2 > .columns:nth-of-type(2n+1), #spectacle article .prop-row .large-up-2 > .prop-name:nth-of-type(2n+1), #spectacle article .prop-row .large-up-2 > .prop-value:nth-of-type(2n+1), #spectacle article .large-up-2 > .doc-copy:nth-of-type(2n+1), #spectacle article .large-up-2 > .doc-examples:nth-of-type(2n+1) {
909 clear: both; }
910 #spectacle .large-up-2 > .column:last-child, #spectacle .large-up-2 > .columns:last-child, #spectacle article .prop-row .large-up-2 > .prop-name:last-child, #spectacle article .prop-row .large-up-2 > .prop-value:last-child, #spectacle article .large-up-2 > .doc-copy:last-child, #spectacle article .large-up-2 > .doc-examples:last-child {
911 float: left; }
912 #spectacle .large-up-3 > .column, #spectacle .large-up-3 > .columns, #spectacle article .prop-row .large-up-3 > .prop-name, #spectacle article .prop-row .large-up-3 > .prop-value, #spectacle article .large-up-3 > .doc-copy, #spectacle article .large-up-3 > .doc-examples {
913 float: left;
914 width: 33.3333333333%; }
915 #spectacle .large-up-3 > .column:nth-of-type(1n), #spectacle .large-up-3 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-3 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-3 > .prop-value:nth-of-type(1n), #spectacle article .large-up-3 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-3 > .doc-examples:nth-of-type(1n) {
916 clear: none; }
917 #spectacle .large-up-3 > .column:nth-of-type(3n+1), #spectacle .large-up-3 > .columns:nth-of-type(3n+1), #spectacle article .prop-row .large-up-3 > .prop-name:nth-of-type(3n+1), #spectacle article .prop-row .large-up-3 > .prop-value:nth-of-type(3n+1), #spectacle article .large-up-3 > .doc-copy:nth-of-type(3n+1), #spectacle article .large-up-3 > .doc-examples:nth-of-type(3n+1) {
918 clear: both; }
919 #spectacle .large-up-3 > .column:last-child, #spectacle .large-up-3 > .columns:last-child, #spectacle article .prop-row .large-up-3 > .prop-name:last-child, #spectacle article .prop-row .large-up-3 > .prop-value:last-child, #spectacle article .large-up-3 > .doc-copy:last-child, #spectacle article .large-up-3 > .doc-examples:last-child {
920 float: left; }
921 #spectacle .large-up-4 > .column, #spectacle .large-up-4 > .columns, #spectacle article .prop-row .large-up-4 > .prop-name, #spectacle article .prop-row .large-up-4 > .prop-value, #spectacle article .large-up-4 > .doc-copy, #spectacle article .large-up-4 > .doc-examples {
922 float: left;
923 width: 25%; }
924 #spectacle .large-up-4 > .column:nth-of-type(1n), #spectacle .large-up-4 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-4 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-4 > .prop-value:nth-of-type(1n), #spectacle article .large-up-4 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-4 > .doc-examples:nth-of-type(1n) {
925 clear: none; }
926 #spectacle .large-up-4 > .column:nth-of-type(4n+1), #spectacle .large-up-4 > .columns:nth-of-type(4n+1), #spectacle article .prop-row .large-up-4 > .prop-name:nth-of-type(4n+1), #spectacle article .prop-row .large-up-4 > .prop-value:nth-of-type(4n+1), #spectacle article .large-up-4 > .doc-copy:nth-of-type(4n+1), #spectacle article .large-up-4 > .doc-examples:nth-of-type(4n+1) {
927 clear: both; }
928 #spectacle .large-up-4 > .column:last-child, #spectacle .large-up-4 > .columns:last-child, #spectacle article .prop-row .large-up-4 > .prop-name:last-child, #spectacle article .prop-row .large-up-4 > .prop-value:last-child, #spectacle article .large-up-4 > .doc-copy:last-child, #spectacle article .large-up-4 > .doc-examples:last-child {
929 float: left; }
930 #spectacle .large-up-5 > .column, #spectacle .large-up-5 > .columns, #spectacle article .prop-row .large-up-5 > .prop-name, #spectacle article .prop-row .large-up-5 > .prop-value, #spectacle article .large-up-5 > .doc-copy, #spectacle article .large-up-5 > .doc-examples {
931 float: left;
932 width: 20%; }
933 #spectacle .large-up-5 > .column:nth-of-type(1n), #spectacle .large-up-5 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-5 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-5 > .prop-value:nth-of-type(1n), #spectacle article .large-up-5 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-5 > .doc-examples:nth-of-type(1n) {
934 clear: none; }
935 #spectacle .large-up-5 > .column:nth-of-type(5n+1), #spectacle .large-up-5 > .columns:nth-of-type(5n+1), #spectacle article .prop-row .large-up-5 > .prop-name:nth-of-type(5n+1), #spectacle article .prop-row .large-up-5 > .prop-value:nth-of-type(5n+1), #spectacle article .large-up-5 > .doc-copy:nth-of-type(5n+1), #spectacle article .large-up-5 > .doc-examples:nth-of-type(5n+1) {
936 clear: both; }
937 #spectacle .large-up-5 > .column:last-child, #spectacle .large-up-5 > .columns:last-child, #spectacle article .prop-row .large-up-5 > .prop-name:last-child, #spectacle article .prop-row .large-up-5 > .prop-value:last-child, #spectacle article .large-up-5 > .doc-copy:last-child, #spectacle article .large-up-5 > .doc-examples:last-child {
938 float: left; }
939 #spectacle .large-up-6 > .column, #spectacle .large-up-6 > .columns, #spectacle article .prop-row .large-up-6 > .prop-name, #spectacle article .prop-row .large-up-6 > .prop-value, #spectacle article .large-up-6 > .doc-copy, #spectacle article .large-up-6 > .doc-examples {
940 float: left;
941 width: 16.6666666667%; }
942 #spectacle .large-up-6 > .column:nth-of-type(1n), #spectacle .large-up-6 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-6 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-6 > .prop-value:nth-of-type(1n), #spectacle article .large-up-6 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-6 > .doc-examples:nth-of-type(1n) {
943 clear: none; }
944 #spectacle .large-up-6 > .column:nth-of-type(6n+1), #spectacle .large-up-6 > .columns:nth-of-type(6n+1), #spectacle article .prop-row .large-up-6 > .prop-name:nth-of-type(6n+1), #spectacle article .prop-row .large-up-6 > .prop-value:nth-of-type(6n+1), #spectacle article .large-up-6 > .doc-copy:nth-of-type(6n+1), #spectacle article .large-up-6 > .doc-examples:nth-of-type(6n+1) {
945 clear: both; }
946 #spectacle .large-up-6 > .column:last-child, #spectacle .large-up-6 > .columns:last-child, #spectacle article .prop-row .large-up-6 > .prop-name:last-child, #spectacle article .prop-row .large-up-6 > .prop-value:last-child, #spectacle article .large-up-6 > .doc-copy:last-child, #spectacle article .large-up-6 > .doc-examples:last-child {
947 float: left; }
948 #spectacle .large-up-7 > .column, #spectacle .large-up-7 > .columns, #spectacle article .prop-row .large-up-7 > .prop-name, #spectacle article .prop-row .large-up-7 > .prop-value, #spectacle article .large-up-7 > .doc-copy, #spectacle article .large-up-7 > .doc-examples {
949 float: left;
950 width: 14.2857142857%; }
951 #spectacle .large-up-7 > .column:nth-of-type(1n), #spectacle .large-up-7 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-7 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-7 > .prop-value:nth-of-type(1n), #spectacle article .large-up-7 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-7 > .doc-examples:nth-of-type(1n) {
952 clear: none; }
953 #spectacle .large-up-7 > .column:nth-of-type(7n+1), #spectacle .large-up-7 > .columns:nth-of-type(7n+1), #spectacle article .prop-row .large-up-7 > .prop-name:nth-of-type(7n+1), #spectacle article .prop-row .large-up-7 > .prop-value:nth-of-type(7n+1), #spectacle article .large-up-7 > .doc-copy:nth-of-type(7n+1), #spectacle article .large-up-7 > .doc-examples:nth-of-type(7n+1) {
954 clear: both; }
955 #spectacle .large-up-7 > .column:last-child, #spectacle .large-up-7 > .columns:last-child, #spectacle article .prop-row .large-up-7 > .prop-name:last-child, #spectacle article .prop-row .large-up-7 > .prop-value:last-child, #spectacle article .large-up-7 > .doc-copy:last-child, #spectacle article .large-up-7 > .doc-examples:last-child {
956 float: left; }
957 #spectacle .large-up-8 > .column, #spectacle .large-up-8 > .columns, #spectacle article .prop-row .large-up-8 > .prop-name, #spectacle article .prop-row .large-up-8 > .prop-value, #spectacle article .large-up-8 > .doc-copy, #spectacle article .large-up-8 > .doc-examples {
958 float: left;
959 width: 12.5%; }
960 #spectacle .large-up-8 > .column:nth-of-type(1n), #spectacle .large-up-8 > .columns:nth-of-type(1n), #spectacle article .prop-row .large-up-8 > .prop-name:nth-of-type(1n), #spectacle article .prop-row .large-up-8 > .prop-value:nth-of-type(1n), #spectacle article .large-up-8 > .doc-copy:nth-of-type(1n), #spectacle article .large-up-8 > .doc-examples:nth-of-type(1n) {
961 clear: none; }
962 #spectacle .large-up-8 > .column:nth-of-type(8n+1), #spectacle .large-up-8 > .columns:nth-of-type(8n+1), #spectacle article .prop-row .large-up-8 > .prop-name:nth-of-type(8n+1), #spectacle article .prop-row .large-up-8 > .prop-value:nth-of-type(8n+1), #spectacle article .large-up-8 > .doc-copy:nth-of-type(8n+1), #spectacle article .large-up-8 > .doc-examples:nth-of-type(8n+1) {
963 clear: both; }
964 #spectacle .large-up-8 > .column:last-child, #spectacle .large-up-8 > .columns:last-child, #spectacle article .prop-row .large-up-8 > .prop-name:last-child, #spectacle article .prop-row .large-up-8 > .prop-value:last-child, #spectacle article .large-up-8 > .doc-copy:last-child, #spectacle article .large-up-8 > .doc-examples:last-child {
965 float: left; }
966 #spectacle .large-collapse > .column, #spectacle .large-collapse > .columns, #spectacle article .prop-row .large-collapse > .prop-name, #spectacle article .prop-row .large-collapse > .prop-value, #spectacle article .large-collapse > .doc-copy, #spectacle article .large-collapse > .doc-examples {
967 padding-right: 0;
968 padding-left: 0; }
969 #spectacle .large-collapse .row, #spectacle .large-collapse article .prop-row, #spectacle article .large-collapse .prop-row, #spectacle .large-collapse article .doc-row, #spectacle article .large-collapse .doc-row {
970 margin-right: 0;
971 margin-left: 0; }
972 #spectacle .expanded.row .large-collapse.row, #spectacle article .expanded.prop-row .large-collapse.row, #spectacle article .expanded.doc-row .large-collapse.row, #spectacle .expanded.row article .large-collapse.prop-row, #spectacle article .expanded.row .large-collapse.prop-row, #spectacle article .expanded.prop-row .large-collapse.prop-row, #spectacle article .expanded.doc-row .large-collapse.prop-row, #spectacle .expanded.row article .large-collapse.doc-row, #spectacle article .expanded.row .large-collapse.doc-row, #spectacle article .expanded.prop-row .large-collapse.doc-row, #spectacle article .expanded.doc-row .large-collapse.doc-row {
973 margin-right: 0;
974 margin-left: 0; }
975 #spectacle .large-uncollapse > .column, #spectacle .large-uncollapse > .columns, #spectacle article .prop-row .large-uncollapse > .prop-name, #spectacle article .prop-row .large-uncollapse > .prop-value, #spectacle article .large-uncollapse > .doc-copy, #spectacle article .large-uncollapse > .doc-examples {
976 padding-right: 0.9868421053rem;
977 padding-left: 0.9868421053rem; }
978 #spectacle .large-centered {
979 margin-right: auto;
980 margin-left: auto; }
981 #spectacle .large-centered, #spectacle .large-centered:last-child:not(:first-child) {
982 float: none;
983 clear: both; }
984 #spectacle .large-uncentered,
985 #spectacle .large-push-0,
986 #spectacle .large-pull-0 {
987 position: static;
988 float: left;
989 margin-right: 0;
990 margin-left: 0; } }
991 #spectacle .column-block {
992 margin-bottom: 1.3157894737rem; }
993 #spectacle .column-block > :last-child {
994 margin-bottom: 0; }
995 @media print, screen and (min-width: 40em) {
996 #spectacle .column-block {
997 margin-bottom: 1.9736842105rem; }
998 #spectacle .column-block > :last-child {
999 margin-bottom: 0; } }
1000 #spectacle #sidebar {
1001 padding-top: 1.5rem;
1002 padding-left: 1.5rem;
1003 padding-right: 1rem;
1004 padding-bottom: 2rem;
1005 border-right: 1px solid #eee;
1006 background-color: #f6f6f6;
1007 height: 100vh;
1008 overflow: auto;
1009 position: fixed;
1010 bottom: 0;
1011 left: 0;
1012 top: 0;
1013 width: 250px; }
1014 #spectacle #sidebar h5 {
1015 margin: 1.5rem 0 0.65rem;
1016 text-transform: uppercase;
1017 color: #b6b6b6;
1018 font-size: 0.9rem; }
1019 #spectacle #sidebar a {
1020 display: block;
1021 margin: 0 0 0.25rem;
1022 color: #4a5055;
1023 white-space: nowrap;
1024 overflow: hidden;
1025 -o-text-overflow: ellipsis;
1026 text-overflow: ellipsis; }
1027 #spectacle #sidebar a.active {
1028 color: #1779ba; }
1029 #spectacle #sidebar ul {
1030 list-style-type: none;
1031 padding: 0;
1032 margin: 0 0 0.75rem 0.75rem; }
1033 #spectacle #sidebar section > ul {
1034 display: none; }
1035 #spectacle #sidebar section.expand > ul {
1036 display: block; }
1037 #spectacle #sidebar .close-button {
1038 opacity: 0.5; }
1039 #spectacle .doc-content, #spectacle article h1.doc-title, #spectacle article > h1, #spectacle article > h2, #spectacle article .panel > h2, #spectacle article .panel > h3, #spectacle article .doc-copy, #spectacle article .doc-examples {
1040 padding-left: 2.25rem !important;
1041 padding-right: 2.25rem !important; }
1042 #spectacle .doc-separator, #spectacle article h2 {
1043 margin-top: 2em;
1044 padding-top: 2em;
1045 padding-bottom: 2em;
1046 border-top: 1px solid #e2e2e2; }
1047 #spectacle #docs {
1048 background: #fefefe;
1049 overflow: hidden;
1050 position: relative; }
1051 #spectacle #docs .example-box {
1052 display: none; }
1053 @media print, screen and (min-width: 64em) {
1054 #spectacle #docs .example-box {
1055 display: block;
1056 background-color: #2d3134;
1057 position: absolute;
1058 right: 0;
1059 top: 0;
1060 bottom: 0; } }
1061 #spectacle article {
1062 position: relative; }
1063 #spectacle article .no-description {
1064 color: #8a8a8a; }
1065 #spectacle article dt {
1066 color: #2d3134; }
1067 #spectacle article table.table {
1068 width: 100%; }
1069 #spectacle article code {
1070 font-size: 0.9em;
1071 border-radius: 3px; }
1072 #spectacle article p:last-child:first-child {
1073 margin-bottom: 0; }
1074 #spectacle article h1 {
1075 margin: 2.5rem 0 0;
1076 padding-top: 0.75rem;
1077 padding-bottom: 0.75rem;
1078 padding-left: 2.25rem;
1079 padding-right: 2.25rem;
1080 border-top: 1px solid #e8e8e8;
1081 border-bottom: 1px solid #e2e2e2;
1082 background-color: #f6f6f6; }
1083 #spectacle article h1.doc-title {
1084 margin: 0;
1085 padding-top: 2.15rem;
1086 padding-bottom: 0;
1087 font-weight: bold;
1088 background: transparent;
1089 border: none;
1090 color: #535b60; }
1091 #spectacle article h1.doc-title span {
1092 display: none;
1093 opacity: 0.65;
1094 margin-left: 5px;
1095 font-weight: normal; }
1096 #spectacle article h2 {
1097 margin-bottom: 0;
1098 padding-left: 2.25rem;
1099 padding-right: 2.25rem;
1100 padding-bottom: 0.25rem;
1101 background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgi…gd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g");
1102 background-size: 100%;
1103 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255, 255, 255, 0.4)), color-stop(100%, rgba(255, 255, 255, 0)));
1104 background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0));
1105 background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0));
1106 background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0)); }
1107 #spectacle article h3 {
1108 margin: 0rem 0 0.75rem; }
1109 #spectacle article h1 + .panel > h2 {
1110 margin-top: 0;
1111 border-top: none; }
1112 #spectacle article h1 + .tag-description + .panel > h2 {
1113 margin-top: 2rem; }
1114 #spectacle article h1 + .panel h3 {
1115 margin-top: 1rem; }
1116 #spectacle article .panel {
1117 position: relative; }
1118 #spectacle article .prop-row {
1119 padding-top: 0.75em;
1120 padding-bottom: 0.75em;
1121 border-top: 1px solid #eee; }
1122 #spectacle article .prop-row:first-child, #spectacle article .prop-row.prop-group {
1123 border-top: 1px solid #ddd; }
1124 #spectacle article .prop-row .prop-title {
1125 font-weight: bold; }
1126 #spectacle article .prop-row .prop-type {
1127 font-weight: 400; }
1128 #spectacle article .prop-row .prop-subtitle {
1129 font-weight: 400;
1130 font-size: 80%; }
1131 #spectacle article .prop-row .prop-name {
1132 text-align: right;
1133 padding-right: 0.85rem !important;
1134 word-break: break-word; }
1135 #spectacle article .prop-row .prop-value {
1136 padding-left: 0.85rem !important;
1137 word-wrap: break-word; }
1138 #spectacle article .prop-row.prop-inner {
1139 padding-top: 0.5em;
1140 padding-bottom: 0.5em;
1141 font-size: 80%; }
1142 #spectacle article .prop-row.prop-inner .prop-name {
1143 color: #8a8a8a; }
1144 #spectacle article .prop-row.prop-inner .prop-value > span {
1145 display: block; }
1146 #spectacle article .prop-row.prop-inner .prop-value > span:before {
1147 color: #8a8a8a; }
1148 #spectacle article .prop-row.prop-inner .prop-value > span:after {
1149 color: #8a8a8a; }
1150 #spectacle article .prop-row.prop-inner .prop-value > span.json-property-type, #spectacle article .prop-row.prop-inner .prop-value > span.json-property-format {
1151 display: inline-block; }
1152 #spectacle article .doc-row {
1153 margin: 2rem 0 20px; }
1154 #spectacle article .doc-examples {
1155 padding-left: 2.25rem !important;
1156 padding-right: 2.25rem !important;
1157 color: #fefefe;
1158 background-color: #2d3134; }
1159 #spectacle article .doc-examples h5 {
1160 color: #fefefe;
1161 font-size: 1rem;
1162 opacity: 0.8; }
1163 #spectacle article .doc-examples h5 span {
1164 opacity: 0.5; }
1165 @media screen and (max-width: 63.9375em) {
1166 #spectacle article .doc-examples:not(:empty) {
1167 margin-top: 1.5rem;
1168 padding-top: 1.5rem;
1169 padding-bottom: 0.5rem; } }
1170 #spectacle article .doc-examples code {
1171 display: block;
1172 margin-bottom: 1.5rem;
1173 padding: 1.5rem;
1174 font-family: Consolas, "Liberation Mono", Courier, monospace;
1175 font-weight: inherit;
1176 color: inherit;
1177 background-color: transparent;
1178 border: none;
1179 border-top: 1px solid #000;
1180 border-bottom: 1px solid #404040;
1181 border-radius: 5px;
1182 box-shadow: 0 0 200px rgba(0, 0, 0, 0.33) inset;
1183 word-spacing: normal;
1184 white-space: pre-wrap;
1185 word-break: normal; }
1186 #spectacle article .doc-examples tbody tr:nth-child(even) {
1187 border-bottom: 0;
1188 background-color: #353a3d; }
1189 #spectacle article .doc-examples tbody, #spectacle article .doc-examples tfoot, #spectacle article .doc-examples thead {
1190 color: #FFFFFF;
1191 background-color: #2d3134;
1192 border: 0px; }
1193 #spectacle article .doc-examples thead {
1194 background-color: #2d3134; }
1195 #spectacle article .doc-examples .swagger-response-headers {
1196 background-color: transparent;
1197 border: none;
1198 border-top: 1px solid #000;
1199 border-bottom: 1px solid #404040;
1200 border-radius: 5px;
1201 box-shadow: 0 0 200px rgba(0, 0, 0, 0.33) inset;
1202 margin-bottom: 1.5rem; }
1203 #spectacle article .doc-examples .swagger-response-headers thead {
1204 color: #fefefe;
1205 font-size: 1rem;
1206 opacity: 0.8;
1207 background-color: transparent;
1208 border: none; }
1209 #spectacle article .doc-examples .swagger-response-headers tbody {
1210 border: none;
1211 background-color: transparent; }
1212 #spectacle article .doc-examples .swagger-response-headers tbody tr {
1213 background-color: transparent;
1214 border-top: 1px solid #404040; }
1215 #spectacle article .powered-by {
1216 font-size: 80%;
1217 color: #cacaca; }
1218 #spectacle article .powered-by span {
1219 color: #f68b1f; }
1220 #spectacle article .operation .operation-tags {
1221 position: absolute;
1222 top: 0;
1223 text-align: right;
1224 right: 0; }
1225 #spectacle article .operation .operation-tags .label {
1226 cursor: pointer; }
1227 #spectacle article .operation .operation-tags .label:hover {
1228 color: #e6e6e6; }
1229 @media print, screen and (min-width: 64em) {
1230 #spectacle article .operation .operation-tags {
1231 right: 50%; } }
1232 #spectacle article .operation .operation-path {
1233 word-break: break-all; }
1234 #spectacle article .security-definition-description {
1235 margin-top: 1.5rem;
1236 margin-bottom: .5rem; }
1237 #spectacle article .security-definition-scope-description {
1238 color: #8a8a8a;
1239 margin-bottom: .5rem; }
1240 #spectacle article .definition .doc-examples h5 {
1241 margin-top: -1rem; }
1242 #spectacle article .definition .doc-copy > section {
1243 margin-bottom: 1rem; }
1244 #spectacle article .definition .doc-copy > section > .json-property-type {
1245 display: none; }
1246 #spectacle article .definition dl dt {
1247 font-weight: normal; }
1248 #spectacle article .definition dl dd {
1249 font-style: italic; }
1250 #spectacle article .definition .json-property-name {
1251 font-weight: bold; }
1252 #spectacle article .hljs {
1253 line-height: 1.25;
1254 overflow-x: auto;
1255 padding: 1.5rem;
1256 margin-bottom: 1rem;
1257 border: none; }
1258 #spectacle .drawer-layout .drawer {
1259 box-shadow: 0 0 10px rgba(45, 49, 52, 0.5);
1260 transition: transform 0.5s ease;
1261 backface-visibility: hidden; }
1262 #spectacle .drawer-layout .drawer.slide-left {
1263 transform: translateX(-250px); }
1264 #spectacle .drawer-layout .drawer.slide-right {
1265 transform: translateX(250px); }
1266 #spectacle .drawer-layout .drawer .drawer-overlay {
1267 position: absolute;
1268 top: 0;
1269 left: 0;
1270 right: 0;
1271 bottom: 0;
1272 background-color: rgba(254, 254, 254, 0.25); }
1273 @media print, screen and (min-width: 64em) {
1274 #spectacle .drawer-layout .drawer.slide-left {
1275 transform: none;
1276 margin-left: -250px; }
1277 #spectacle .drawer-layout .drawer.slide-right {
1278 transform: none;
1279 margin-left: 250px; }
1280 #spectacle .drawer-layout .drawer .drawer-overlay {
1281 display: none; } }
1282 @media print, screen and (min-width: 64em) {
1283 #spectacle .drawer-layout.drawer-slide-left-large .drawer {
1284 margin-left: -250px; }
1285 #spectacle .drawer-layout.drawer-slide-left-large .floating-menu-icon {
1286 opacity: 0; }
1287 #spectacle .drawer-layout.drawer-slide-right-large .drawer {
1288 margin-left: 250px; }
1289 #spectacle .drawer-layout.drawer-slide-right-large .floating-menu-icon {
1290 opacity: 0; } }
1291 #spectacle .drawer-layout.drawer-open .floating-menu-icon {
1292 opacity: 0; }
1293 #spectacle .drawer-layout .floating-menu-icon {
1294 position: fixed;
1295 top: 0.75rem;
1296 right: 0.75rem;
1297 background-color: rgba(45, 49, 52, 0.75);
1298 padding: 0.65rem;
1299 z-index: 1;
1300 border-radius: 5px;
1301 transition: opacity 0.5s linear; }
1302 #spectacle .drawer-layout .floating-menu-icon .hamburger {
1303 position: relative;
1304 display: inline-block;
1305 vertical-align: middle;
1306 width: 20px;
1307 height: 16px;
1308 cursor: pointer; }
1309 #spectacle .drawer-layout .floating-menu-icon .hamburger::after {
1310 position: absolute;
1311 top: 0;
1312 left: 0;
1313 display: block;
1314 width: 100%;
1315 height: 2px;
1316 background: #fefefe;
1317 box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe;
1318 content: ''; }
1319 #spectacle .drawer-layout .floating-menu-icon .hamburger:hover::after {
1320 background: #cacaca;
1321 box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; }
1322 #spectacle .hljs {
1323 display: block;
1324 overflow-x: auto;
1325 padding: 0.5em;
1326 background: #23241f; }
1327 #spectacle .hljs,
1328 #spectacle .hljs-tag,
1329 #spectacle .hljs-subst {
1330 color: #f8f8f2; }
1331 #spectacle .hljs-strong,
1332 #spectacle .hljs-emphasis {
1333 color: #a8a8a2; }
1334 #spectacle .hljs-bullet,
1335 #spectacle .hljs-quote,
1336 #spectacle .hljs-number,
1337 #spectacle .hljs-regexp,
1338 #spectacle .hljs-literal,
1339 #spectacle .hljs-link {
1340 color: #ae81ff; }
1341 #spectacle .hljs-code,
1342 #spectacle .hljs-title,
1343 #spectacle .hljs-section,
1344 #spectacle .hljs-selector-class {
1345 color: #a6e22e; }
1346 #spectacle .hljs-strong {
1347 font-weight: bold; }
1348 #spectacle .hljs-emphasis {
1349 font-style: italic; }
1350 #spectacle .hljs-keyword,
1351 #spectacle .hljs-selector-tag,
1352 #spectacle .hljs-name,
1353 #spectacle .hljs-attr {
1354 color: #f92672; }
1355 #spectacle .hljs-symbol,
1356 #spectacle .hljs-attribute {
1357 color: #66d9ef; }
1358 #spectacle .hljs-params,
1359 #spectacle .hljs-class .hljs-title {
1360 color: #f8f8f2; }
1361 #spectacle .hljs-string,
1362 #spectacle .hljs-type,
1363 #spectacle .hljs-built_in,
1364 #spectacle .hljs-builtin-name,
1365 #spectacle .hljs-selector-id,
1366 #spectacle .hljs-selector-attr,
1367 #spectacle .hljs-selector-pseudo,
1368 #spectacle .hljs-addition,
1369 #spectacle .hljs-variable,
1370 #spectacle .hljs-template-variable {
1371 color: #e6db74; }
1372 #spectacle .hljs-comment,
1373 #spectacle .hljs-deletion,
1374 #spectacle .hljs-meta {
1375 color: #75715e; }
diff --git a/support/doc/api/html/stylesheets/spectacle.min.css b/support/doc/api/html/stylesheets/spectacle.min.css
deleted file mode 100644
index 802d2ef69..000000000
--- a/support/doc/api/html/stylesheets/spectacle.min.css
+++ /dev/null
@@ -1 +0,0 @@
1@charset "UTF-8";#spectacle .swagger-operation-path:before{content:"Path";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-operation-description:before{content:"Description";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-request-params:before{content:"Request parameters";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-request-body:before{content:"Request body";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-request-body .json-schema-properties:before{display:none}#spectacle .swagger-responses:before{content:"Responses";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-global:before{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#cc4b37;color:#fefefe;font-size:.75rem;border-radius:4px;padding:3px 6px;content:"global"}#spectacle table.table th.swagger-param-key{width:auto}#spectacle table.table th.swagger-param-key:before{content:"Key"}#spectacle table.table th.swagger-param-name{width:auto}#spectacle table.table th.swagger-param-name:before{content:"Name"}#spectacle table.table th.swagger-param-description{width:auto}#spectacle table.table th.swagger-param-description:before{content:"Description"}#spectacle table.table th.swagger-param-data-type{width:auto}#spectacle table.table th.swagger-param-data-type:before{content:"Data type"}#spectacle table.table th.swagger-param-type{width:auto}#spectacle table.table th.swagger-param-type:before{content:"Type"}#spectacle table.table th.swagger-request-security-schema{width:auto}#spectacle table.table th.swagger-request-security-schema:before{content:"Schema"}#spectacle table.table th.swagger-request-security-scopes{width:auto}#spectacle table.table th.swagger-request-security-scopes:before{content:"Scopes"}#spectacle table.table th.swagger-response-header-name{width:auto}#spectacle table.table th.swagger-response-header-name:before{content:"Header"}#spectacle table.table th.swagger-response-header-description{width:auto}#spectacle table.table th.swagger-response-header-description:before{content:"Description"}#spectacle table.table th.swagger-response-header-data-type{width:auto}#spectacle table.table th.swagger-response-header-data-type:before{content:"Data type"}#spectacle table.table th.swagger-response-code{width:auto}#spectacle table.table th.swagger-response-code:before{content:"Code"}#spectacle table.table th.swagger-response-description{width:auto}#spectacle table.table th.swagger-response-description:before{content:"Description"}#spectacle table.table th.swagger-response-schema{width:auto}#spectacle table.table th.swagger-response-schema:before{content:"Schema"}#spectacle .swagger-response-name-value{font-weight:700}#spectacle .swagger-response-description-text{padding-bottom:.5em}#spectacle .swagger-request-security:before{content:"Security";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .swagger-security-definition-basic:before{color:#cacaca;content:"(HTTP Basic Authentication)"}#spectacle .swagger-security-definition-oauth2:before{color:#cacaca;content:"(OAuth2 Authentication)"}#spectacle .swagger-security-definition-apiKey:before{color:#cacaca;content:"(API Key Authentication)"}#spectacle .json-schema-description:before{content:"Description";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-schema-properties:before{content:"Properties";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-schema-properties dl{margin:0}#spectacle .json-schema-properties dt{margin-bottom:.25rem}#spectacle .json-schema-properties dt.has-description{margin-bottom:0}#spectacle .json-schema-properties dd{color:#8a8a8a}#spectacle .json-schema-properties dd:not(:last-child){padding-bottom:.5rem}#spectacle .json-schema-description+.json-schema-properties{margin-top:1.5rem}#spectacle .json-schema-ref-array:before{color:#8a8a8a;content:"Array<"}#spectacle .json-schema-ref-array:after{color:#8a8a8a;content:">"}#spectacle .json-schema-example:before{content:"Example";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-schema-array-items:before{content:"Items";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-schema-allOf-inherited:before{content:"Inherited";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-schema-anyOf>dl{padding-left:1em}#spectacle .json-schema-anyOf>dl dt:not(:first-child):before{content:"or "}#spectacle .json-schema-anyOf>dl dt:first-child:before{content:"either "}#spectacle .json-schema-additionalProperties:before{content:"Additional properties";display:block;margin-bottom:.5em;color:#f68b1f;text-transform:uppercase;font-size:.9rem}#spectacle .json-inner-schema .json-schema-array-items,#spectacle .json-inner-schema .json-schema-description,#spectacle .json-inner-schema .json-schema-example,#spectacle .json-inner-schema .json-schema-properties{padding-left:1em;margin-top:.5em;padding-bottom:.5em}#spectacle .json-property-discriminator:before{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#cc4b37;color:#fefefe;font-size:.75rem;border-radius:4px;padding:3px 6px;content:"discriminator"}#spectacle .json-property-required:before{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#cc4b37;color:#fefefe;font-size:.75rem;border-radius:4px;padding:3px 6px;content:"required"}#spectacle .json-property-read-only:before{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#cc4b37;color:#fefefe;font-size:.75rem;border-radius:4px;padding:3px 6px;content:"read only"}#spectacle .json-property-format{font-style:italic}#spectacle .json-property-enum:before{content:'enum: ['}#spectacle .json-property-enum:after{content:']'}#spectacle .json-property-default-value:before{content:'default: '}#spectacle .json-property-range:empty{display:none!important}#spectacle .json-property-range:before{content:'range: '}#spectacle .json-property-enum-item{font-weight:lighter;font-size:small}#spectacle .json-schema-reference{font-size:90%}#spectacle .no-padding{padding:0!important}#spectacle .no-margin{margin:0!important}#spectacle button:focus{outline:0}#spectacle .default-label{display:inline-block;padding:.33333rem .5rem;border-radius:0;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#767676;color:#fefefe;font-size:.75rem;border-radius:4px;padding:3px 6px}#spectacle #logo{text-align:center;padding-right:.5rem;padding-top:1rem;padding-bottom:.25rem}#spectacle #logo img{max-height:75px}#spectacle .row,#spectacle article .doc-row,#spectacle article .prop-row{max-width:auto;margin-right:auto;margin-left:auto}#spectacle .row::after,#spectacle .row::before,#spectacle article .doc-row::after,#spectacle article .doc-row::before,#spectacle article .prop-row::after,#spectacle article .prop-row::before{display:table;content:' ';flex-basis:0;order:1}#spectacle .row::after,#spectacle article .doc-row::after,#spectacle article .prop-row::after{clear:both}#spectacle .row.collapse>.column,#spectacle .row.collapse>.columns,#spectacle article .doc-row>.column,#spectacle article .doc-row>.columns,#spectacle article .doc-row>.doc-copy,#spectacle article .doc-row>.doc-examples,#spectacle article .prop-row .doc-row>.prop-name,#spectacle article .prop-row .doc-row>.prop-value,#spectacle article .prop-row .row.collapse>.prop-name,#spectacle article .prop-row .row.collapse>.prop-value,#spectacle article .prop-row>.column,#spectacle article .prop-row>.columns,#spectacle article .prop-row>.doc-copy,#spectacle article .prop-row>.doc-examples,#spectacle article .prop-row>.prop-name,#spectacle article .prop-row>.prop-value,#spectacle article .row.collapse>.doc-copy,#spectacle article .row.collapse>.doc-examples{padding-right:0;padding-left:0}#spectacle .row .row,#spectacle .row article .doc-row,#spectacle .row article .prop-row,#spectacle article .doc-row .doc-row,#spectacle article .doc-row .prop-row,#spectacle article .doc-row .row,#spectacle article .prop-row .doc-row,#spectacle article .prop-row .prop-row,#spectacle article .prop-row .row,#spectacle article .row .doc-row,#spectacle article .row .prop-row{margin-right:-.6578947368rem;margin-left:-.6578947368rem}@media print,screen and (min-width:40em){#spectacle .row .row,#spectacle .row article .doc-row,#spectacle .row article .prop-row,#spectacle article .doc-row .doc-row,#spectacle article .doc-row .prop-row,#spectacle article .doc-row .row,#spectacle article .prop-row .doc-row,#spectacle article .prop-row .prop-row,#spectacle article .prop-row .row,#spectacle article .row .doc-row,#spectacle article .row .prop-row{margin-right:-.9868421053rem;margin-left:-.9868421053rem}}@media print,screen and (min-width:64em){#spectacle .row .row,#spectacle .row article .doc-row,#spectacle .row article .prop-row,#spectacle article .doc-row .doc-row,#spectacle article .doc-row .prop-row,#spectacle article .doc-row .row,#spectacle article .prop-row .doc-row,#spectacle article .prop-row .prop-row,#spectacle article .prop-row .row,#spectacle article .row .doc-row,#spectacle article .row .prop-row{margin-right:-.9868421053rem;margin-left:-.9868421053rem}}#spectacle .row .row.collapse,#spectacle .row article .doc-row,#spectacle .row article .prop-row,#spectacle article .doc-row .doc-row,#spectacle article .doc-row .prop-row,#spectacle article .doc-row .row.collapse,#spectacle article .prop-row .doc-row,#spectacle article .prop-row .prop-row,#spectacle article .prop-row .row.collapse,#spectacle article .row .doc-row,#spectacle article .row .prop-row{margin-right:0;margin-left:0}#spectacle .row.expanded,#spectacle article .expanded.doc-row,#spectacle article .expanded.prop-row{max-width:none}#spectacle .row.expanded .row,#spectacle .row.expanded article .doc-row,#spectacle .row.expanded article .prop-row,#spectacle article .expanded.doc-row .doc-row,#spectacle article .expanded.doc-row .prop-row,#spectacle article .expanded.doc-row .row,#spectacle article .expanded.prop-row .doc-row,#spectacle article .expanded.prop-row .prop-row,#spectacle article .expanded.prop-row .row,#spectacle article .row.expanded .doc-row,#spectacle article .row.expanded .prop-row{margin-right:auto;margin-left:auto}#spectacle .row:not(.expanded) .row,#spectacle .row:not(.expanded) article .doc-row,#spectacle .row:not(.expanded) article .prop-row,#spectacle article .doc-row:not(.expanded) .doc-row,#spectacle article .doc-row:not(.expanded) .prop-row,#spectacle article .doc-row:not(.expanded) .row,#spectacle article .prop-row:not(.expanded) .doc-row,#spectacle article .prop-row:not(.expanded) .prop-row,#spectacle article .prop-row:not(.expanded) .row,#spectacle article .row:not(.expanded) .doc-row,#spectacle article .row:not(.expanded) .prop-row{max-width:none}#spectacle .row.gutter-small>.column,#spectacle .row.gutter-small>.columns,#spectacle article .gutter-small.doc-row>.column,#spectacle article .gutter-small.doc-row>.columns,#spectacle article .gutter-small.doc-row>.doc-copy,#spectacle article .gutter-small.doc-row>.doc-examples,#spectacle article .gutter-small.prop-row>.column,#spectacle article .gutter-small.prop-row>.columns,#spectacle article .gutter-small.prop-row>.doc-copy,#spectacle article .gutter-small.prop-row>.doc-examples,#spectacle article .gutter-small.prop-row>.prop-name,#spectacle article .gutter-small.prop-row>.prop-value,#spectacle article .prop-row .gutter-small.doc-row>.prop-name,#spectacle article .prop-row .gutter-small.doc-row>.prop-value,#spectacle article .prop-row .row.gutter-small>.prop-name,#spectacle article .prop-row .row.gutter-small>.prop-value,#spectacle article .row.gutter-small>.doc-copy,#spectacle article .row.gutter-small>.doc-examples{padding-right:.6578947368rem;padding-left:.6578947368rem}#spectacle .row.gutter-medium>.column,#spectacle .row.gutter-medium>.columns,#spectacle article .gutter-medium.doc-row>.column,#spectacle article .gutter-medium.doc-row>.columns,#spectacle article .gutter-medium.doc-row>.doc-copy,#spectacle article .gutter-medium.doc-row>.doc-examples,#spectacle article .gutter-medium.prop-row>.column,#spectacle article .gutter-medium.prop-row>.columns,#spectacle article .gutter-medium.prop-row>.doc-copy,#spectacle article .gutter-medium.prop-row>.doc-examples,#spectacle article .gutter-medium.prop-row>.prop-name,#spectacle article .gutter-medium.prop-row>.prop-value,#spectacle article .prop-row .gutter-medium.doc-row>.prop-name,#spectacle article .prop-row .gutter-medium.doc-row>.prop-value,#spectacle article .prop-row .row.gutter-medium>.prop-name,#spectacle article .prop-row .row.gutter-medium>.prop-value,#spectacle article .row.gutter-medium>.doc-copy,#spectacle article .row.gutter-medium>.doc-examples{padding-right:.9868421053rem;padding-left:.9868421053rem}#spectacle .column,#spectacle .columns,#spectacle article .doc-copy,#spectacle article .doc-examples,#spectacle article .prop-row .prop-name,#spectacle article .prop-row .prop-value{width:100%;float:left;padding-right:.6578947368rem;padding-left:.6578947368rem}@media print,screen and (min-width:40em){#spectacle .column,#spectacle .columns,#spectacle article .doc-copy,#spectacle article .doc-examples,#spectacle article .prop-row .prop-name,#spectacle article .prop-row .prop-value{padding-right:.9868421053rem;padding-left:.9868421053rem}}#spectacle .column:last-child:not(:first-child),#spectacle .columns:last-child:not(:first-child),#spectacle article .doc-copy:last-child:not(:first-child),#spectacle article .doc-examples:last-child:not(:first-child),#spectacle article .prop-row .prop-name:last-child:not(:first-child),#spectacle article .prop-row .prop-value:last-child:not(:first-child){float:right}#spectacle .column.end:last-child:last-child,#spectacle .end.columns:last-child:last-child,#spectacle article .end.doc-copy:last-child:last-child,#spectacle article .end.doc-examples:last-child:last-child,#spectacle article .prop-row .end.prop-name:last-child:last-child,#spectacle article .prop-row .end.prop-value:last-child:last-child{float:left}#spectacle .column.row.row,#spectacle .row.row.columns,#spectacle article .column.doc-row,#spectacle article .column.prop-row,#spectacle article .columns.doc-row,#spectacle article .columns.prop-row,#spectacle article .doc-row.doc-copy,#spectacle article .doc-row.doc-examples,#spectacle article .prop-row .prop-name.doc-row,#spectacle article .prop-row .prop-row.prop-name,#spectacle article .prop-row .prop-row.prop-value,#spectacle article .prop-row .prop-value.doc-row,#spectacle article .prop-row .row.row.prop-name,#spectacle article .prop-row .row.row.prop-value,#spectacle article .prop-row.doc-copy,#spectacle article .prop-row.doc-examples,#spectacle article .row.row.doc-copy,#spectacle article .row.row.doc-examples{float:none}#spectacle .row .column.row.row,#spectacle .row .row.row.columns,#spectacle .row article .column.doc-row,#spectacle .row article .column.prop-row,#spectacle .row article .columns.doc-row,#spectacle .row article .columns.prop-row,#spectacle .row article .doc-row.doc-copy,#spectacle .row article .doc-row.doc-examples,#spectacle .row article .prop-row .prop-name.doc-row,#spectacle .row article .prop-row .prop-row.prop-name,#spectacle .row article .prop-row .prop-row.prop-value,#spectacle .row article .prop-row .prop-value.doc-row,#spectacle .row article .prop-row.doc-copy,#spectacle .row article .prop-row.doc-examples,#spectacle .row article .row.row.doc-copy,#spectacle .row article .row.row.doc-examples,#spectacle article .doc-row .column.doc-row,#spectacle article .doc-row .column.prop-row,#spectacle article .doc-row .column.row.row,#spectacle article .doc-row .columns.doc-row,#spectacle article .doc-row .columns.prop-row,#spectacle article .doc-row .doc-row.doc-copy,#spectacle article .doc-row .doc-row.doc-examples,#spectacle article .doc-row .prop-row.doc-copy,#spectacle article .doc-row .prop-row.doc-examples,#spectacle article .doc-row .row.row.columns,#spectacle article .doc-row .row.row.doc-copy,#spectacle article .doc-row .row.row.doc-examples,#spectacle article .prop-row .column.doc-row,#spectacle article .prop-row .column.prop-row,#spectacle article .prop-row .column.row.row,#spectacle article .prop-row .columns.doc-row,#spectacle article .prop-row .columns.prop-row,#spectacle article .prop-row .doc-row.doc-copy,#spectacle article .prop-row .doc-row.doc-examples,#spectacle article .prop-row .prop-name.doc-row,#spectacle article .prop-row .prop-row.doc-copy,#spectacle article .prop-row .prop-row.doc-examples,#spectacle article .prop-row .prop-row.prop-name,#spectacle article .prop-row .prop-row.prop-value,#spectacle article .prop-row .prop-value.doc-row,#spectacle article .prop-row .row .prop-name.doc-row,#spectacle article .prop-row .row .prop-row.prop-name,#spectacle article .prop-row .row .prop-row.prop-value,#spectacle article .prop-row .row .prop-value.doc-row,#spectacle article .prop-row .row.row.columns,#spectacle article .prop-row .row.row.doc-copy,#spectacle article .prop-row .row.row.doc-examples,#spectacle article .prop-row .row.row.prop-name,#spectacle article .prop-row .row.row.prop-value,#spectacle article .row .column.doc-row,#spectacle article .row .column.prop-row,#spectacle article .row .columns.doc-row,#spectacle article .row .columns.prop-row,#spectacle article .row .doc-row.doc-copy,#spectacle article .row .doc-row.doc-examples,#spectacle article .row .prop-row.doc-copy,#spectacle article .row .prop-row.doc-examples,#spectacle article .row .row.row.doc-copy,#spectacle article .row .row.row.doc-examples{margin-right:0;margin-left:0;padding-right:0;padding-left:0}#spectacle .small-1{width:8.3333333333%}#spectacle .small-push-1{position:relative;left:8.3333333333%}#spectacle .small-pull-1{position:relative;left:-8.3333333333%}#spectacle .small-offset-0{margin-left:0}#spectacle .small-2{width:16.6666666667%}#spectacle .small-push-2{position:relative;left:16.6666666667%}#spectacle .small-pull-2{position:relative;left:-16.6666666667%}#spectacle .small-offset-1{margin-left:8.3333333333%}#spectacle .small-3{width:25%}#spectacle .small-push-3{position:relative;left:25%}#spectacle .small-pull-3{position:relative;left:-25%}#spectacle .small-offset-2{margin-left:16.6666666667%}#spectacle .small-4{width:33.3333333333%}#spectacle .small-push-4{position:relative;left:33.3333333333%}#spectacle .small-pull-4{position:relative;left:-33.3333333333%}#spectacle .small-offset-3{margin-left:25%}#spectacle .small-5,#spectacle article .prop-row .prop-name{width:41.6666666667%}#spectacle .small-push-5{position:relative;left:41.6666666667%}#spectacle .small-pull-5{position:relative;left:-41.6666666667%}#spectacle .small-offset-4{margin-left:33.3333333333%}#spectacle .small-6{width:50%}#spectacle .small-push-6{position:relative;left:50%}#spectacle .small-pull-6{position:relative;left:-50%}#spectacle .small-offset-5{margin-left:41.6666666667%}#spectacle .small-7,#spectacle article .prop-row .prop-value{width:58.3333333333%}#spectacle .small-push-7{position:relative;left:58.3333333333%}#spectacle .small-pull-7{position:relative;left:-58.3333333333%}#spectacle .small-offset-6{margin-left:50%}#spectacle .small-8{width:66.6666666667%}#spectacle .small-push-8{position:relative;left:66.6666666667%}#spectacle .small-pull-8{position:relative;left:-66.6666666667%}#spectacle .small-offset-7{margin-left:58.3333333333%}#spectacle .small-9{width:75%}#spectacle .small-push-9{position:relative;left:75%}#spectacle .small-pull-9{position:relative;left:-75%}#spectacle .small-offset-8{margin-left:66.6666666667%}#spectacle .small-10{width:83.3333333333%}#spectacle .small-push-10{position:relative;left:83.3333333333%}#spectacle .small-pull-10{position:relative;left:-83.3333333333%}#spectacle .small-offset-9{margin-left:75%}#spectacle .small-11{width:91.6666666667%}#spectacle .small-push-11{position:relative;left:91.6666666667%}#spectacle .small-pull-11{position:relative;left:-91.6666666667%}#spectacle .small-offset-10{margin-left:83.3333333333%}#spectacle .small-12{width:100%}#spectacle .small-offset-11{margin-left:91.6666666667%}#spectacle .small-up-1>.column,#spectacle .small-up-1>.columns,#spectacle article .prop-row .small-up-1>.prop-name,#spectacle article .prop-row .small-up-1>.prop-value,#spectacle article .small-up-1>.doc-copy,#spectacle article .small-up-1>.doc-examples{float:left;width:100%}#spectacle .small-up-1>.column:nth-of-type(1n),#spectacle .small-up-1>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-1>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-1>.prop-value:nth-of-type(1n),#spectacle article .small-up-1>.doc-copy:nth-of-type(1n),#spectacle article .small-up-1>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-1>.column:nth-of-type(1n+1),#spectacle .small-up-1>.columns:nth-of-type(1n+1),#spectacle article .prop-row .small-up-1>.prop-name:nth-of-type(1n+1),#spectacle article .prop-row .small-up-1>.prop-value:nth-of-type(1n+1),#spectacle article .small-up-1>.doc-copy:nth-of-type(1n+1),#spectacle article .small-up-1>.doc-examples:nth-of-type(1n+1){clear:both}#spectacle .small-up-1>.column:last-child,#spectacle .small-up-1>.columns:last-child,#spectacle article .prop-row .small-up-1>.prop-name:last-child,#spectacle article .prop-row .small-up-1>.prop-value:last-child,#spectacle article .small-up-1>.doc-copy:last-child,#spectacle article .small-up-1>.doc-examples:last-child{float:left}#spectacle .small-up-2>.column,#spectacle .small-up-2>.columns,#spectacle article .prop-row .small-up-2>.prop-name,#spectacle article .prop-row .small-up-2>.prop-value,#spectacle article .small-up-2>.doc-copy,#spectacle article .small-up-2>.doc-examples{float:left;width:50%}#spectacle .small-up-2>.column:nth-of-type(1n),#spectacle .small-up-2>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-2>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-2>.prop-value:nth-of-type(1n),#spectacle article .small-up-2>.doc-copy:nth-of-type(1n),#spectacle article .small-up-2>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-2>.column:nth-of-type(2n+1),#spectacle .small-up-2>.columns:nth-of-type(2n+1),#spectacle article .prop-row .small-up-2>.prop-name:nth-of-type(2n+1),#spectacle article .prop-row .small-up-2>.prop-value:nth-of-type(2n+1),#spectacle article .small-up-2>.doc-copy:nth-of-type(2n+1),#spectacle article .small-up-2>.doc-examples:nth-of-type(2n+1){clear:both}#spectacle .small-up-2>.column:last-child,#spectacle .small-up-2>.columns:last-child,#spectacle article .prop-row .small-up-2>.prop-name:last-child,#spectacle article .prop-row .small-up-2>.prop-value:last-child,#spectacle article .small-up-2>.doc-copy:last-child,#spectacle article .small-up-2>.doc-examples:last-child{float:left}#spectacle .small-up-3>.column,#spectacle .small-up-3>.columns,#spectacle article .prop-row .small-up-3>.prop-name,#spectacle article .prop-row .small-up-3>.prop-value,#spectacle article .small-up-3>.doc-copy,#spectacle article .small-up-3>.doc-examples{float:left;width:33.3333333333%}#spectacle .small-up-3>.column:nth-of-type(1n),#spectacle .small-up-3>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-3>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-3>.prop-value:nth-of-type(1n),#spectacle article .small-up-3>.doc-copy:nth-of-type(1n),#spectacle article .small-up-3>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-3>.column:nth-of-type(3n+1),#spectacle .small-up-3>.columns:nth-of-type(3n+1),#spectacle article .prop-row .small-up-3>.prop-name:nth-of-type(3n+1),#spectacle article .prop-row .small-up-3>.prop-value:nth-of-type(3n+1),#spectacle article .small-up-3>.doc-copy:nth-of-type(3n+1),#spectacle article .small-up-3>.doc-examples:nth-of-type(3n+1){clear:both}#spectacle .small-up-3>.column:last-child,#spectacle .small-up-3>.columns:last-child,#spectacle article .prop-row .small-up-3>.prop-name:last-child,#spectacle article .prop-row .small-up-3>.prop-value:last-child,#spectacle article .small-up-3>.doc-copy:last-child,#spectacle article .small-up-3>.doc-examples:last-child{float:left}#spectacle .small-up-4>.column,#spectacle .small-up-4>.columns,#spectacle article .prop-row .small-up-4>.prop-name,#spectacle article .prop-row .small-up-4>.prop-value,#spectacle article .small-up-4>.doc-copy,#spectacle article .small-up-4>.doc-examples{float:left;width:25%}#spectacle .small-up-4>.column:nth-of-type(1n),#spectacle .small-up-4>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-4>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-4>.prop-value:nth-of-type(1n),#spectacle article .small-up-4>.doc-copy:nth-of-type(1n),#spectacle article .small-up-4>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-4>.column:nth-of-type(4n+1),#spectacle .small-up-4>.columns:nth-of-type(4n+1),#spectacle article .prop-row .small-up-4>.prop-name:nth-of-type(4n+1),#spectacle article .prop-row .small-up-4>.prop-value:nth-of-type(4n+1),#spectacle article .small-up-4>.doc-copy:nth-of-type(4n+1),#spectacle article .small-up-4>.doc-examples:nth-of-type(4n+1){clear:both}#spectacle .small-up-4>.column:last-child,#spectacle .small-up-4>.columns:last-child,#spectacle article .prop-row .small-up-4>.prop-name:last-child,#spectacle article .prop-row .small-up-4>.prop-value:last-child,#spectacle article .small-up-4>.doc-copy:last-child,#spectacle article .small-up-4>.doc-examples:last-child{float:left}#spectacle .small-up-5>.column,#spectacle .small-up-5>.columns,#spectacle article .prop-row .small-up-5>.prop-name,#spectacle article .prop-row .small-up-5>.prop-value,#spectacle article .small-up-5>.doc-copy,#spectacle article .small-up-5>.doc-examples{float:left;width:20%}#spectacle .small-up-5>.column:nth-of-type(1n),#spectacle .small-up-5>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-5>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-5>.prop-value:nth-of-type(1n),#spectacle article .small-up-5>.doc-copy:nth-of-type(1n),#spectacle article .small-up-5>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-5>.column:nth-of-type(5n+1),#spectacle .small-up-5>.columns:nth-of-type(5n+1),#spectacle article .prop-row .small-up-5>.prop-name:nth-of-type(5n+1),#spectacle article .prop-row .small-up-5>.prop-value:nth-of-type(5n+1),#spectacle article .small-up-5>.doc-copy:nth-of-type(5n+1),#spectacle article .small-up-5>.doc-examples:nth-of-type(5n+1){clear:both}#spectacle .small-up-5>.column:last-child,#spectacle .small-up-5>.columns:last-child,#spectacle article .prop-row .small-up-5>.prop-name:last-child,#spectacle article .prop-row .small-up-5>.prop-value:last-child,#spectacle article .small-up-5>.doc-copy:last-child,#spectacle article .small-up-5>.doc-examples:last-child{float:left}#spectacle .small-up-6>.column,#spectacle .small-up-6>.columns,#spectacle article .prop-row .small-up-6>.prop-name,#spectacle article .prop-row .small-up-6>.prop-value,#spectacle article .small-up-6>.doc-copy,#spectacle article .small-up-6>.doc-examples{float:left;width:16.6666666667%}#spectacle .small-up-6>.column:nth-of-type(1n),#spectacle .small-up-6>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-6>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-6>.prop-value:nth-of-type(1n),#spectacle article .small-up-6>.doc-copy:nth-of-type(1n),#spectacle article .small-up-6>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-6>.column:nth-of-type(6n+1),#spectacle .small-up-6>.columns:nth-of-type(6n+1),#spectacle article .prop-row .small-up-6>.prop-name:nth-of-type(6n+1),#spectacle article .prop-row .small-up-6>.prop-value:nth-of-type(6n+1),#spectacle article .small-up-6>.doc-copy:nth-of-type(6n+1),#spectacle article .small-up-6>.doc-examples:nth-of-type(6n+1){clear:both}#spectacle .small-up-6>.column:last-child,#spectacle .small-up-6>.columns:last-child,#spectacle article .prop-row .small-up-6>.prop-name:last-child,#spectacle article .prop-row .small-up-6>.prop-value:last-child,#spectacle article .small-up-6>.doc-copy:last-child,#spectacle article .small-up-6>.doc-examples:last-child{float:left}#spectacle .small-up-7>.column,#spectacle .small-up-7>.columns,#spectacle article .prop-row .small-up-7>.prop-name,#spectacle article .prop-row .small-up-7>.prop-value,#spectacle article .small-up-7>.doc-copy,#spectacle article .small-up-7>.doc-examples{float:left;width:14.2857142857%}#spectacle .small-up-7>.column:nth-of-type(1n),#spectacle .small-up-7>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-7>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-7>.prop-value:nth-of-type(1n),#spectacle article .small-up-7>.doc-copy:nth-of-type(1n),#spectacle article .small-up-7>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-7>.column:nth-of-type(7n+1),#spectacle .small-up-7>.columns:nth-of-type(7n+1),#spectacle article .prop-row .small-up-7>.prop-name:nth-of-type(7n+1),#spectacle article .prop-row .small-up-7>.prop-value:nth-of-type(7n+1),#spectacle article .small-up-7>.doc-copy:nth-of-type(7n+1),#spectacle article .small-up-7>.doc-examples:nth-of-type(7n+1){clear:both}#spectacle .small-up-7>.column:last-child,#spectacle .small-up-7>.columns:last-child,#spectacle article .prop-row .small-up-7>.prop-name:last-child,#spectacle article .prop-row .small-up-7>.prop-value:last-child,#spectacle article .small-up-7>.doc-copy:last-child,#spectacle article .small-up-7>.doc-examples:last-child{float:left}#spectacle .small-up-8>.column,#spectacle .small-up-8>.columns,#spectacle article .prop-row .small-up-8>.prop-name,#spectacle article .prop-row .small-up-8>.prop-value,#spectacle article .small-up-8>.doc-copy,#spectacle article .small-up-8>.doc-examples{float:left;width:12.5%}#spectacle .small-up-8>.column:nth-of-type(1n),#spectacle .small-up-8>.columns:nth-of-type(1n),#spectacle article .prop-row .small-up-8>.prop-name:nth-of-type(1n),#spectacle article .prop-row .small-up-8>.prop-value:nth-of-type(1n),#spectacle article .small-up-8>.doc-copy:nth-of-type(1n),#spectacle article .small-up-8>.doc-examples:nth-of-type(1n){clear:none}#spectacle .small-up-8>.column:nth-of-type(8n+1),#spectacle .small-up-8>.columns:nth-of-type(8n+1),#spectacle article .prop-row .small-up-8>.prop-name:nth-of-type(8n+1),#spectacle article .prop-row .small-up-8>.prop-value:nth-of-type(8n+1),#spectacle article .small-up-8>.doc-copy:nth-of-type(8n+1),#spectacle article .small-up-8>.doc-examples:nth-of-type(8n+1){clear:both}#spectacle .small-up-8>.column:last-child,#spectacle .small-up-8>.columns:last-child,#spectacle article .prop-row .small-up-8>.prop-name:last-child,#spectacle article .prop-row .small-up-8>.prop-value:last-child,#spectacle article .small-up-8>.doc-copy:last-child,#spectacle article .small-up-8>.doc-examples:last-child{float:left}#spectacle .small-collapse>.column,#spectacle .small-collapse>.columns,#spectacle article .prop-row .small-collapse>.prop-name,#spectacle article .prop-row .small-collapse>.prop-value,#spectacle article .small-collapse>.doc-copy,#spectacle article .small-collapse>.doc-examples{padding-right:0;padding-left:0}#spectacle .small-collapse .row,#spectacle .small-collapse article .doc-row,#spectacle .small-collapse article .prop-row,#spectacle article .small-collapse .doc-row,#spectacle article .small-collapse .prop-row{margin-right:0;margin-left:0}#spectacle .expanded.row .small-collapse.row,#spectacle .expanded.row article .small-collapse.doc-row,#spectacle .expanded.row article .small-collapse.prop-row,#spectacle article .expanded.doc-row .small-collapse.doc-row,#spectacle article .expanded.doc-row .small-collapse.prop-row,#spectacle article .expanded.doc-row .small-collapse.row,#spectacle article .expanded.prop-row .small-collapse.doc-row,#spectacle article .expanded.prop-row .small-collapse.prop-row,#spectacle article .expanded.prop-row .small-collapse.row,#spectacle article .expanded.row .small-collapse.doc-row,#spectacle article .expanded.row .small-collapse.prop-row{margin-right:0;margin-left:0}#spectacle .small-uncollapse>.column,#spectacle .small-uncollapse>.columns,#spectacle article .prop-row .small-uncollapse>.prop-name,#spectacle article .prop-row .small-uncollapse>.prop-value,#spectacle article .small-uncollapse>.doc-copy,#spectacle article .small-uncollapse>.doc-examples{padding-right:.6578947368rem;padding-left:.6578947368rem}#spectacle .small-centered{margin-right:auto;margin-left:auto}#spectacle .small-centered,#spectacle .small-centered:last-child:not(:first-child){float:none;clear:both}#spectacle .small-pull-0,#spectacle .small-push-0,#spectacle .small-uncentered{position:static;float:left;margin-right:0;margin-left:0}@media print,screen and (min-width:40em){#spectacle .medium-1{width:8.3333333333%}#spectacle .medium-push-1{position:relative;left:8.3333333333%}#spectacle .medium-pull-1{position:relative;left:-8.3333333333%}#spectacle .medium-offset-0{margin-left:0}#spectacle .medium-2{width:16.6666666667%}#spectacle .medium-push-2{position:relative;left:16.6666666667%}#spectacle .medium-pull-2{position:relative;left:-16.6666666667%}#spectacle .medium-offset-1{margin-left:8.3333333333%}#spectacle .medium-3{width:25%}#spectacle .medium-push-3{position:relative;left:25%}#spectacle .medium-pull-3{position:relative;left:-25%}#spectacle .medium-offset-2{margin-left:16.6666666667%}#spectacle .medium-4{width:33.3333333333%}#spectacle .medium-push-4{position:relative;left:33.3333333333%}#spectacle .medium-pull-4{position:relative;left:-33.3333333333%}#spectacle .medium-offset-3{margin-left:25%}#spectacle .medium-5{width:41.6666666667%}#spectacle .medium-push-5{position:relative;left:41.6666666667%}#spectacle .medium-pull-5{position:relative;left:-41.6666666667%}#spectacle .medium-offset-4{margin-left:33.3333333333%}#spectacle .medium-6{width:50%}#spectacle .medium-push-6{position:relative;left:50%}#spectacle .medium-pull-6{position:relative;left:-50%}#spectacle .medium-offset-5{margin-left:41.6666666667%}#spectacle .medium-7{width:58.3333333333%}#spectacle .medium-push-7{position:relative;left:58.3333333333%}#spectacle .medium-pull-7{position:relative;left:-58.3333333333%}#spectacle .medium-offset-6{margin-left:50%}#spectacle .medium-8{width:66.6666666667%}#spectacle .medium-push-8{position:relative;left:66.6666666667%}#spectacle .medium-pull-8{position:relative;left:-66.6666666667%}#spectacle .medium-offset-7{margin-left:58.3333333333%}#spectacle .medium-9{width:75%}#spectacle .medium-push-9{position:relative;left:75%}#spectacle .medium-pull-9{position:relative;left:-75%}#spectacle .medium-offset-8{margin-left:66.6666666667%}#spectacle .medium-10{width:83.3333333333%}#spectacle .medium-push-10{position:relative;left:83.3333333333%}#spectacle .medium-pull-10{position:relative;left:-83.3333333333%}#spectacle .medium-offset-9{margin-left:75%}#spectacle .medium-11{width:91.6666666667%}#spectacle .medium-push-11{position:relative;left:91.6666666667%}#spectacle .medium-pull-11{position:relative;left:-91.6666666667%}#spectacle .medium-offset-10{margin-left:83.3333333333%}#spectacle .medium-12{width:100%}#spectacle .medium-offset-11{margin-left:91.6666666667%}#spectacle .medium-up-1>.column,#spectacle .medium-up-1>.columns,#spectacle article .medium-up-1>.doc-copy,#spectacle article .medium-up-1>.doc-examples,#spectacle article .prop-row .medium-up-1>.prop-name,#spectacle article .prop-row .medium-up-1>.prop-value{float:left;width:100%}#spectacle .medium-up-1>.column:nth-of-type(1n),#spectacle .medium-up-1>.columns:nth-of-type(1n),#spectacle article .medium-up-1>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-1>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-1>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-1>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-1>.column:nth-of-type(1n+1),#spectacle .medium-up-1>.columns:nth-of-type(1n+1),#spectacle article .medium-up-1>.doc-copy:nth-of-type(1n+1),#spectacle article .medium-up-1>.doc-examples:nth-of-type(1n+1),#spectacle article .prop-row .medium-up-1>.prop-name:nth-of-type(1n+1),#spectacle article .prop-row .medium-up-1>.prop-value:nth-of-type(1n+1){clear:both}#spectacle .medium-up-1>.column:last-child,#spectacle .medium-up-1>.columns:last-child,#spectacle article .medium-up-1>.doc-copy:last-child,#spectacle article .medium-up-1>.doc-examples:last-child,#spectacle article .prop-row .medium-up-1>.prop-name:last-child,#spectacle article .prop-row .medium-up-1>.prop-value:last-child{float:left}#spectacle .medium-up-2>.column,#spectacle .medium-up-2>.columns,#spectacle article .medium-up-2>.doc-copy,#spectacle article .medium-up-2>.doc-examples,#spectacle article .prop-row .medium-up-2>.prop-name,#spectacle article .prop-row .medium-up-2>.prop-value{float:left;width:50%}#spectacle .medium-up-2>.column:nth-of-type(1n),#spectacle .medium-up-2>.columns:nth-of-type(1n),#spectacle article .medium-up-2>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-2>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-2>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-2>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-2>.column:nth-of-type(2n+1),#spectacle .medium-up-2>.columns:nth-of-type(2n+1),#spectacle article .medium-up-2>.doc-copy:nth-of-type(2n+1),#spectacle article .medium-up-2>.doc-examples:nth-of-type(2n+1),#spectacle article .prop-row .medium-up-2>.prop-name:nth-of-type(2n+1),#spectacle article .prop-row .medium-up-2>.prop-value:nth-of-type(2n+1){clear:both}#spectacle .medium-up-2>.column:last-child,#spectacle .medium-up-2>.columns:last-child,#spectacle article .medium-up-2>.doc-copy:last-child,#spectacle article .medium-up-2>.doc-examples:last-child,#spectacle article .prop-row .medium-up-2>.prop-name:last-child,#spectacle article .prop-row .medium-up-2>.prop-value:last-child{float:left}#spectacle .medium-up-3>.column,#spectacle .medium-up-3>.columns,#spectacle article .medium-up-3>.doc-copy,#spectacle article .medium-up-3>.doc-examples,#spectacle article .prop-row .medium-up-3>.prop-name,#spectacle article .prop-row .medium-up-3>.prop-value{float:left;width:33.3333333333%}#spectacle .medium-up-3>.column:nth-of-type(1n),#spectacle .medium-up-3>.columns:nth-of-type(1n),#spectacle article .medium-up-3>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-3>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-3>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-3>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-3>.column:nth-of-type(3n+1),#spectacle .medium-up-3>.columns:nth-of-type(3n+1),#spectacle article .medium-up-3>.doc-copy:nth-of-type(3n+1),#spectacle article .medium-up-3>.doc-examples:nth-of-type(3n+1),#spectacle article .prop-row .medium-up-3>.prop-name:nth-of-type(3n+1),#spectacle article .prop-row .medium-up-3>.prop-value:nth-of-type(3n+1){clear:both}#spectacle .medium-up-3>.column:last-child,#spectacle .medium-up-3>.columns:last-child,#spectacle article .medium-up-3>.doc-copy:last-child,#spectacle article .medium-up-3>.doc-examples:last-child,#spectacle article .prop-row .medium-up-3>.prop-name:last-child,#spectacle article .prop-row .medium-up-3>.prop-value:last-child{float:left}#spectacle .medium-up-4>.column,#spectacle .medium-up-4>.columns,#spectacle article .medium-up-4>.doc-copy,#spectacle article .medium-up-4>.doc-examples,#spectacle article .prop-row .medium-up-4>.prop-name,#spectacle article .prop-row .medium-up-4>.prop-value{float:left;width:25%}#spectacle .medium-up-4>.column:nth-of-type(1n),#spectacle .medium-up-4>.columns:nth-of-type(1n),#spectacle article .medium-up-4>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-4>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-4>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-4>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-4>.column:nth-of-type(4n+1),#spectacle .medium-up-4>.columns:nth-of-type(4n+1),#spectacle article .medium-up-4>.doc-copy:nth-of-type(4n+1),#spectacle article .medium-up-4>.doc-examples:nth-of-type(4n+1),#spectacle article .prop-row .medium-up-4>.prop-name:nth-of-type(4n+1),#spectacle article .prop-row .medium-up-4>.prop-value:nth-of-type(4n+1){clear:both}#spectacle .medium-up-4>.column:last-child,#spectacle .medium-up-4>.columns:last-child,#spectacle article .medium-up-4>.doc-copy:last-child,#spectacle article .medium-up-4>.doc-examples:last-child,#spectacle article .prop-row .medium-up-4>.prop-name:last-child,#spectacle article .prop-row .medium-up-4>.prop-value:last-child{float:left}#spectacle .medium-up-5>.column,#spectacle .medium-up-5>.columns,#spectacle article .medium-up-5>.doc-copy,#spectacle article .medium-up-5>.doc-examples,#spectacle article .prop-row .medium-up-5>.prop-name,#spectacle article .prop-row .medium-up-5>.prop-value{float:left;width:20%}#spectacle .medium-up-5>.column:nth-of-type(1n),#spectacle .medium-up-5>.columns:nth-of-type(1n),#spectacle article .medium-up-5>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-5>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-5>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-5>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-5>.column:nth-of-type(5n+1),#spectacle .medium-up-5>.columns:nth-of-type(5n+1),#spectacle article .medium-up-5>.doc-copy:nth-of-type(5n+1),#spectacle article .medium-up-5>.doc-examples:nth-of-type(5n+1),#spectacle article .prop-row .medium-up-5>.prop-name:nth-of-type(5n+1),#spectacle article .prop-row .medium-up-5>.prop-value:nth-of-type(5n+1){clear:both}#spectacle .medium-up-5>.column:last-child,#spectacle .medium-up-5>.columns:last-child,#spectacle article .medium-up-5>.doc-copy:last-child,#spectacle article .medium-up-5>.doc-examples:last-child,#spectacle article .prop-row .medium-up-5>.prop-name:last-child,#spectacle article .prop-row .medium-up-5>.prop-value:last-child{float:left}#spectacle .medium-up-6>.column,#spectacle .medium-up-6>.columns,#spectacle article .medium-up-6>.doc-copy,#spectacle article .medium-up-6>.doc-examples,#spectacle article .prop-row .medium-up-6>.prop-name,#spectacle article .prop-row .medium-up-6>.prop-value{float:left;width:16.6666666667%}#spectacle .medium-up-6>.column:nth-of-type(1n),#spectacle .medium-up-6>.columns:nth-of-type(1n),#spectacle article .medium-up-6>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-6>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-6>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-6>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-6>.column:nth-of-type(6n+1),#spectacle .medium-up-6>.columns:nth-of-type(6n+1),#spectacle article .medium-up-6>.doc-copy:nth-of-type(6n+1),#spectacle article .medium-up-6>.doc-examples:nth-of-type(6n+1),#spectacle article .prop-row .medium-up-6>.prop-name:nth-of-type(6n+1),#spectacle article .prop-row .medium-up-6>.prop-value:nth-of-type(6n+1){clear:both}#spectacle .medium-up-6>.column:last-child,#spectacle .medium-up-6>.columns:last-child,#spectacle article .medium-up-6>.doc-copy:last-child,#spectacle article .medium-up-6>.doc-examples:last-child,#spectacle article .prop-row .medium-up-6>.prop-name:last-child,#spectacle article .prop-row .medium-up-6>.prop-value:last-child{float:left}#spectacle .medium-up-7>.column,#spectacle .medium-up-7>.columns,#spectacle article .medium-up-7>.doc-copy,#spectacle article .medium-up-7>.doc-examples,#spectacle article .prop-row .medium-up-7>.prop-name,#spectacle article .prop-row .medium-up-7>.prop-value{float:left;width:14.2857142857%}#spectacle .medium-up-7>.column:nth-of-type(1n),#spectacle .medium-up-7>.columns:nth-of-type(1n),#spectacle article .medium-up-7>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-7>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-7>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-7>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-7>.column:nth-of-type(7n+1),#spectacle .medium-up-7>.columns:nth-of-type(7n+1),#spectacle article .medium-up-7>.doc-copy:nth-of-type(7n+1),#spectacle article .medium-up-7>.doc-examples:nth-of-type(7n+1),#spectacle article .prop-row .medium-up-7>.prop-name:nth-of-type(7n+1),#spectacle article .prop-row .medium-up-7>.prop-value:nth-of-type(7n+1){clear:both}#spectacle .medium-up-7>.column:last-child,#spectacle .medium-up-7>.columns:last-child,#spectacle article .medium-up-7>.doc-copy:last-child,#spectacle article .medium-up-7>.doc-examples:last-child,#spectacle article .prop-row .medium-up-7>.prop-name:last-child,#spectacle article .prop-row .medium-up-7>.prop-value:last-child{float:left}#spectacle .medium-up-8>.column,#spectacle .medium-up-8>.columns,#spectacle article .medium-up-8>.doc-copy,#spectacle article .medium-up-8>.doc-examples,#spectacle article .prop-row .medium-up-8>.prop-name,#spectacle article .prop-row .medium-up-8>.prop-value{float:left;width:12.5%}#spectacle .medium-up-8>.column:nth-of-type(1n),#spectacle .medium-up-8>.columns:nth-of-type(1n),#spectacle article .medium-up-8>.doc-copy:nth-of-type(1n),#spectacle article .medium-up-8>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .medium-up-8>.prop-name:nth-of-type(1n),#spectacle article .prop-row .medium-up-8>.prop-value:nth-of-type(1n){clear:none}#spectacle .medium-up-8>.column:nth-of-type(8n+1),#spectacle .medium-up-8>.columns:nth-of-type(8n+1),#spectacle article .medium-up-8>.doc-copy:nth-of-type(8n+1),#spectacle article .medium-up-8>.doc-examples:nth-of-type(8n+1),#spectacle article .prop-row .medium-up-8>.prop-name:nth-of-type(8n+1),#spectacle article .prop-row .medium-up-8>.prop-value:nth-of-type(8n+1){clear:both}#spectacle .medium-up-8>.column:last-child,#spectacle .medium-up-8>.columns:last-child,#spectacle article .medium-up-8>.doc-copy:last-child,#spectacle article .medium-up-8>.doc-examples:last-child,#spectacle article .prop-row .medium-up-8>.prop-name:last-child,#spectacle article .prop-row .medium-up-8>.prop-value:last-child{float:left}#spectacle .medium-collapse>.column,#spectacle .medium-collapse>.columns,#spectacle article .medium-collapse>.doc-copy,#spectacle article .medium-collapse>.doc-examples,#spectacle article .prop-row .medium-collapse>.prop-name,#spectacle article .prop-row .medium-collapse>.prop-value{padding-right:0;padding-left:0}#spectacle .medium-collapse .row,#spectacle .medium-collapse article .doc-row,#spectacle .medium-collapse article .prop-row,#spectacle article .medium-collapse .doc-row,#spectacle article .medium-collapse .prop-row{margin-right:0;margin-left:0}#spectacle .expanded.row .medium-collapse.row,#spectacle .expanded.row article .medium-collapse.doc-row,#spectacle .expanded.row article .medium-collapse.prop-row,#spectacle article .expanded.doc-row .medium-collapse.doc-row,#spectacle article .expanded.doc-row .medium-collapse.prop-row,#spectacle article .expanded.doc-row .medium-collapse.row,#spectacle article .expanded.prop-row .medium-collapse.doc-row,#spectacle article .expanded.prop-row .medium-collapse.prop-row,#spectacle article .expanded.prop-row .medium-collapse.row,#spectacle article .expanded.row .medium-collapse.doc-row,#spectacle article .expanded.row .medium-collapse.prop-row{margin-right:0;margin-left:0}#spectacle .medium-uncollapse>.column,#spectacle .medium-uncollapse>.columns,#spectacle article .medium-uncollapse>.doc-copy,#spectacle article .medium-uncollapse>.doc-examples,#spectacle article .prop-row .medium-uncollapse>.prop-name,#spectacle article .prop-row .medium-uncollapse>.prop-value{padding-right:.9868421053rem;padding-left:.9868421053rem}#spectacle .medium-centered{margin-right:auto;margin-left:auto}#spectacle .medium-centered,#spectacle .medium-centered:last-child:not(:first-child){float:none;clear:both}#spectacle .medium-pull-0,#spectacle .medium-push-0,#spectacle .medium-uncentered{position:static;float:left;margin-right:0;margin-left:0}}@media print,screen and (min-width:64em){#spectacle .large-1{width:8.3333333333%}#spectacle .large-push-1{position:relative;left:8.3333333333%}#spectacle .large-pull-1{position:relative;left:-8.3333333333%}#spectacle .large-offset-0{margin-left:0}#spectacle .large-2{width:16.6666666667%}#spectacle .large-push-2{position:relative;left:16.6666666667%}#spectacle .large-pull-2{position:relative;left:-16.6666666667%}#spectacle .large-offset-1{margin-left:8.3333333333%}#spectacle .large-3{width:25%}#spectacle .large-push-3{position:relative;left:25%}#spectacle .large-pull-3{position:relative;left:-25%}#spectacle .large-offset-2{margin-left:16.6666666667%}#spectacle .large-4{width:33.3333333333%}#spectacle .large-push-4{position:relative;left:33.3333333333%}#spectacle .large-pull-4{position:relative;left:-33.3333333333%}#spectacle .large-offset-3{margin-left:25%}#spectacle .large-5{width:41.6666666667%}#spectacle .large-push-5{position:relative;left:41.6666666667%}#spectacle .large-pull-5{position:relative;left:-41.6666666667%}#spectacle .large-offset-4{margin-left:33.3333333333%}#spectacle .doc-content,#spectacle .large-6,#spectacle article .doc-copy,#spectacle article .doc-examples,#spectacle article .panel>h2,#spectacle article .panel>h3,#spectacle article h1.doc-title,#spectacle article>h1,#spectacle article>h2{width:50%}#spectacle .large-push-6{position:relative;left:50%}#spectacle .large-pull-6{position:relative;left:-50%}#spectacle .large-offset-5{margin-left:41.6666666667%}#spectacle .large-7{width:58.3333333333%}#spectacle .large-push-7{position:relative;left:58.3333333333%}#spectacle .large-pull-7{position:relative;left:-58.3333333333%}#spectacle .large-offset-6{margin-left:50%}#spectacle .large-8{width:66.6666666667%}#spectacle .large-push-8{position:relative;left:66.6666666667%}#spectacle .large-pull-8{position:relative;left:-66.6666666667%}#spectacle .large-offset-7{margin-left:58.3333333333%}#spectacle .large-9{width:75%}#spectacle .large-push-9{position:relative;left:75%}#spectacle .large-pull-9{position:relative;left:-75%}#spectacle .large-offset-8{margin-left:66.6666666667%}#spectacle .large-10{width:83.3333333333%}#spectacle .large-push-10{position:relative;left:83.3333333333%}#spectacle .large-pull-10{position:relative;left:-83.3333333333%}#spectacle .large-offset-9{margin-left:75%}#spectacle .large-11{width:91.6666666667%}#spectacle .large-push-11{position:relative;left:91.6666666667%}#spectacle .large-pull-11{position:relative;left:-91.6666666667%}#spectacle .large-offset-10{margin-left:83.3333333333%}#spectacle .large-12{width:100%}#spectacle .large-offset-11{margin-left:91.6666666667%}#spectacle .large-up-1>.column,#spectacle .large-up-1>.columns,#spectacle article .large-up-1>.doc-copy,#spectacle article .large-up-1>.doc-examples,#spectacle article .prop-row .large-up-1>.prop-name,#spectacle article .prop-row .large-up-1>.prop-value{float:left;width:100%}#spectacle .large-up-1>.column:nth-of-type(1n),#spectacle .large-up-1>.columns:nth-of-type(1n),#spectacle article .large-up-1>.doc-copy:nth-of-type(1n),#spectacle article .large-up-1>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-1>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-1>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-1>.column:nth-of-type(1n+1),#spectacle .large-up-1>.columns:nth-of-type(1n+1),#spectacle article .large-up-1>.doc-copy:nth-of-type(1n+1),#spectacle article .large-up-1>.doc-examples:nth-of-type(1n+1),#spectacle article .prop-row .large-up-1>.prop-name:nth-of-type(1n+1),#spectacle article .prop-row .large-up-1>.prop-value:nth-of-type(1n+1){clear:both}#spectacle .large-up-1>.column:last-child,#spectacle .large-up-1>.columns:last-child,#spectacle article .large-up-1>.doc-copy:last-child,#spectacle article .large-up-1>.doc-examples:last-child,#spectacle article .prop-row .large-up-1>.prop-name:last-child,#spectacle article .prop-row .large-up-1>.prop-value:last-child{float:left}#spectacle .large-up-2>.column,#spectacle .large-up-2>.columns,#spectacle article .large-up-2>.doc-copy,#spectacle article .large-up-2>.doc-examples,#spectacle article .prop-row .large-up-2>.prop-name,#spectacle article .prop-row .large-up-2>.prop-value{float:left;width:50%}#spectacle .large-up-2>.column:nth-of-type(1n),#spectacle .large-up-2>.columns:nth-of-type(1n),#spectacle article .large-up-2>.doc-copy:nth-of-type(1n),#spectacle article .large-up-2>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-2>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-2>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-2>.column:nth-of-type(2n+1),#spectacle .large-up-2>.columns:nth-of-type(2n+1),#spectacle article .large-up-2>.doc-copy:nth-of-type(2n+1),#spectacle article .large-up-2>.doc-examples:nth-of-type(2n+1),#spectacle article .prop-row .large-up-2>.prop-name:nth-of-type(2n+1),#spectacle article .prop-row .large-up-2>.prop-value:nth-of-type(2n+1){clear:both}#spectacle .large-up-2>.column:last-child,#spectacle .large-up-2>.columns:last-child,#spectacle article .large-up-2>.doc-copy:last-child,#spectacle article .large-up-2>.doc-examples:last-child,#spectacle article .prop-row .large-up-2>.prop-name:last-child,#spectacle article .prop-row .large-up-2>.prop-value:last-child{float:left}#spectacle .large-up-3>.column,#spectacle .large-up-3>.columns,#spectacle article .large-up-3>.doc-copy,#spectacle article .large-up-3>.doc-examples,#spectacle article .prop-row .large-up-3>.prop-name,#spectacle article .prop-row .large-up-3>.prop-value{float:left;width:33.3333333333%}#spectacle .large-up-3>.column:nth-of-type(1n),#spectacle .large-up-3>.columns:nth-of-type(1n),#spectacle article .large-up-3>.doc-copy:nth-of-type(1n),#spectacle article .large-up-3>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-3>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-3>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-3>.column:nth-of-type(3n+1),#spectacle .large-up-3>.columns:nth-of-type(3n+1),#spectacle article .large-up-3>.doc-copy:nth-of-type(3n+1),#spectacle article .large-up-3>.doc-examples:nth-of-type(3n+1),#spectacle article .prop-row .large-up-3>.prop-name:nth-of-type(3n+1),#spectacle article .prop-row .large-up-3>.prop-value:nth-of-type(3n+1){clear:both}#spectacle .large-up-3>.column:last-child,#spectacle .large-up-3>.columns:last-child,#spectacle article .large-up-3>.doc-copy:last-child,#spectacle article .large-up-3>.doc-examples:last-child,#spectacle article .prop-row .large-up-3>.prop-name:last-child,#spectacle article .prop-row .large-up-3>.prop-value:last-child{float:left}#spectacle .large-up-4>.column,#spectacle .large-up-4>.columns,#spectacle article .large-up-4>.doc-copy,#spectacle article .large-up-4>.doc-examples,#spectacle article .prop-row .large-up-4>.prop-name,#spectacle article .prop-row .large-up-4>.prop-value{float:left;width:25%}#spectacle .large-up-4>.column:nth-of-type(1n),#spectacle .large-up-4>.columns:nth-of-type(1n),#spectacle article .large-up-4>.doc-copy:nth-of-type(1n),#spectacle article .large-up-4>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-4>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-4>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-4>.column:nth-of-type(4n+1),#spectacle .large-up-4>.columns:nth-of-type(4n+1),#spectacle article .large-up-4>.doc-copy:nth-of-type(4n+1),#spectacle article .large-up-4>.doc-examples:nth-of-type(4n+1),#spectacle article .prop-row .large-up-4>.prop-name:nth-of-type(4n+1),#spectacle article .prop-row .large-up-4>.prop-value:nth-of-type(4n+1){clear:both}#spectacle .large-up-4>.column:last-child,#spectacle .large-up-4>.columns:last-child,#spectacle article .large-up-4>.doc-copy:last-child,#spectacle article .large-up-4>.doc-examples:last-child,#spectacle article .prop-row .large-up-4>.prop-name:last-child,#spectacle article .prop-row .large-up-4>.prop-value:last-child{float:left}#spectacle .large-up-5>.column,#spectacle .large-up-5>.columns,#spectacle article .large-up-5>.doc-copy,#spectacle article .large-up-5>.doc-examples,#spectacle article .prop-row .large-up-5>.prop-name,#spectacle article .prop-row .large-up-5>.prop-value{float:left;width:20%}#spectacle .large-up-5>.column:nth-of-type(1n),#spectacle .large-up-5>.columns:nth-of-type(1n),#spectacle article .large-up-5>.doc-copy:nth-of-type(1n),#spectacle article .large-up-5>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-5>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-5>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-5>.column:nth-of-type(5n+1),#spectacle .large-up-5>.columns:nth-of-type(5n+1),#spectacle article .large-up-5>.doc-copy:nth-of-type(5n+1),#spectacle article .large-up-5>.doc-examples:nth-of-type(5n+1),#spectacle article .prop-row .large-up-5>.prop-name:nth-of-type(5n+1),#spectacle article .prop-row .large-up-5>.prop-value:nth-of-type(5n+1){clear:both}#spectacle .large-up-5>.column:last-child,#spectacle .large-up-5>.columns:last-child,#spectacle article .large-up-5>.doc-copy:last-child,#spectacle article .large-up-5>.doc-examples:last-child,#spectacle article .prop-row .large-up-5>.prop-name:last-child,#spectacle article .prop-row .large-up-5>.prop-value:last-child{float:left}#spectacle .large-up-6>.column,#spectacle .large-up-6>.columns,#spectacle article .large-up-6>.doc-copy,#spectacle article .large-up-6>.doc-examples,#spectacle article .prop-row .large-up-6>.prop-name,#spectacle article .prop-row .large-up-6>.prop-value{float:left;width:16.6666666667%}#spectacle .large-up-6>.column:nth-of-type(1n),#spectacle .large-up-6>.columns:nth-of-type(1n),#spectacle article .large-up-6>.doc-copy:nth-of-type(1n),#spectacle article .large-up-6>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-6>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-6>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-6>.column:nth-of-type(6n+1),#spectacle .large-up-6>.columns:nth-of-type(6n+1),#spectacle article .large-up-6>.doc-copy:nth-of-type(6n+1),#spectacle article .large-up-6>.doc-examples:nth-of-type(6n+1),#spectacle article .prop-row .large-up-6>.prop-name:nth-of-type(6n+1),#spectacle article .prop-row .large-up-6>.prop-value:nth-of-type(6n+1){clear:both}#spectacle .large-up-6>.column:last-child,#spectacle .large-up-6>.columns:last-child,#spectacle article .large-up-6>.doc-copy:last-child,#spectacle article .large-up-6>.doc-examples:last-child,#spectacle article .prop-row .large-up-6>.prop-name:last-child,#spectacle article .prop-row .large-up-6>.prop-value:last-child{float:left}#spectacle .large-up-7>.column,#spectacle .large-up-7>.columns,#spectacle article .large-up-7>.doc-copy,#spectacle article .large-up-7>.doc-examples,#spectacle article .prop-row .large-up-7>.prop-name,#spectacle article .prop-row .large-up-7>.prop-value{float:left;width:14.2857142857%}#spectacle .large-up-7>.column:nth-of-type(1n),#spectacle .large-up-7>.columns:nth-of-type(1n),#spectacle article .large-up-7>.doc-copy:nth-of-type(1n),#spectacle article .large-up-7>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-7>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-7>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-7>.column:nth-of-type(7n+1),#spectacle .large-up-7>.columns:nth-of-type(7n+1),#spectacle article .large-up-7>.doc-copy:nth-of-type(7n+1),#spectacle article .large-up-7>.doc-examples:nth-of-type(7n+1),#spectacle article .prop-row .large-up-7>.prop-name:nth-of-type(7n+1),#spectacle article .prop-row .large-up-7>.prop-value:nth-of-type(7n+1){clear:both}#spectacle .large-up-7>.column:last-child,#spectacle .large-up-7>.columns:last-child,#spectacle article .large-up-7>.doc-copy:last-child,#spectacle article .large-up-7>.doc-examples:last-child,#spectacle article .prop-row .large-up-7>.prop-name:last-child,#spectacle article .prop-row .large-up-7>.prop-value:last-child{float:left}#spectacle .large-up-8>.column,#spectacle .large-up-8>.columns,#spectacle article .large-up-8>.doc-copy,#spectacle article .large-up-8>.doc-examples,#spectacle article .prop-row .large-up-8>.prop-name,#spectacle article .prop-row .large-up-8>.prop-value{float:left;width:12.5%}#spectacle .large-up-8>.column:nth-of-type(1n),#spectacle .large-up-8>.columns:nth-of-type(1n),#spectacle article .large-up-8>.doc-copy:nth-of-type(1n),#spectacle article .large-up-8>.doc-examples:nth-of-type(1n),#spectacle article .prop-row .large-up-8>.prop-name:nth-of-type(1n),#spectacle article .prop-row .large-up-8>.prop-value:nth-of-type(1n){clear:none}#spectacle .large-up-8>.column:nth-of-type(8n+1),#spectacle .large-up-8>.columns:nth-of-type(8n+1),#spectacle article .large-up-8>.doc-copy:nth-of-type(8n+1),#spectacle article .large-up-8>.doc-examples:nth-of-type(8n+1),#spectacle article .prop-row .large-up-8>.prop-name:nth-of-type(8n+1),#spectacle article .prop-row .large-up-8>.prop-value:nth-of-type(8n+1){clear:both}#spectacle .large-up-8>.column:last-child,#spectacle .large-up-8>.columns:last-child,#spectacle article .large-up-8>.doc-copy:last-child,#spectacle article .large-up-8>.doc-examples:last-child,#spectacle article .prop-row .large-up-8>.prop-name:last-child,#spectacle article .prop-row .large-up-8>.prop-value:last-child{float:left}#spectacle .large-collapse>.column,#spectacle .large-collapse>.columns,#spectacle article .large-collapse>.doc-copy,#spectacle article .large-collapse>.doc-examples,#spectacle article .prop-row .large-collapse>.prop-name,#spectacle article .prop-row .large-collapse>.prop-value{padding-right:0;padding-left:0}#spectacle .large-collapse .row,#spectacle .large-collapse article .doc-row,#spectacle .large-collapse article .prop-row,#spectacle article .large-collapse .doc-row,#spectacle article .large-collapse .prop-row{margin-right:0;margin-left:0}#spectacle .expanded.row .large-collapse.row,#spectacle .expanded.row article .large-collapse.doc-row,#spectacle .expanded.row article .large-collapse.prop-row,#spectacle article .expanded.doc-row .large-collapse.doc-row,#spectacle article .expanded.doc-row .large-collapse.prop-row,#spectacle article .expanded.doc-row .large-collapse.row,#spectacle article .expanded.prop-row .large-collapse.doc-row,#spectacle article .expanded.prop-row .large-collapse.prop-row,#spectacle article .expanded.prop-row .large-collapse.row,#spectacle article .expanded.row .large-collapse.doc-row,#spectacle article .expanded.row .large-collapse.prop-row{margin-right:0;margin-left:0}#spectacle .large-uncollapse>.column,#spectacle .large-uncollapse>.columns,#spectacle article .large-uncollapse>.doc-copy,#spectacle article .large-uncollapse>.doc-examples,#spectacle article .prop-row .large-uncollapse>.prop-name,#spectacle article .prop-row .large-uncollapse>.prop-value{padding-right:.9868421053rem;padding-left:.9868421053rem}#spectacle .large-centered{margin-right:auto;margin-left:auto}#spectacle .large-centered,#spectacle .large-centered:last-child:not(:first-child){float:none;clear:both}#spectacle .large-pull-0,#spectacle .large-push-0,#spectacle .large-uncentered{position:static;float:left;margin-right:0;margin-left:0}}#spectacle .column-block{margin-bottom:1.3157894737rem}#spectacle .column-block>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){#spectacle .column-block{margin-bottom:1.9736842105rem}#spectacle .column-block>:last-child{margin-bottom:0}}#spectacle #sidebar{padding-top:1.5rem;padding-left:1.5rem;padding-right:1rem;padding-bottom:2rem;border-right:1px solid #eee;background-color:#f6f6f6;height:100vh;overflow:auto;position:fixed;bottom:0;left:0;top:0;width:250px}#spectacle #sidebar h5{margin:1.5rem 0 .65rem;text-transform:uppercase;color:#b6b6b6;font-size:.9rem}#spectacle #sidebar a{display:block;margin:0 0 .25rem;color:#4a5055;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}#spectacle #sidebar a.active{color:#1779ba}#spectacle #sidebar ul{list-style-type:none;padding:0;margin:0 0 .75rem .75rem}#spectacle #sidebar section>ul{display:none}#spectacle #sidebar section.expand>ul{display:block}#spectacle #sidebar .close-button{opacity:.5}#spectacle .doc-content,#spectacle article .doc-copy,#spectacle article .doc-examples,#spectacle article .panel>h2,#spectacle article .panel>h3,#spectacle article h1.doc-title,#spectacle article>h1,#spectacle article>h2{padding-left:2.25rem!important;padding-right:2.25rem!important}#spectacle .doc-separator,#spectacle article h2{margin-top:2em;padding-top:2em;padding-bottom:2em;border-top:1px solid #e2e2e2}#spectacle #docs{background:#fefefe;overflow:hidden;position:relative}#spectacle #docs .example-box{display:none}@media print,screen and (min-width:64em){#spectacle #docs .example-box{display:block;background-color:#2d3134;position:absolute;right:0;top:0;bottom:0}}#spectacle article{position:relative}#spectacle article .no-description{color:#8a8a8a}#spectacle article dt{color:#2d3134}#spectacle article table.table{width:100%}#spectacle article code{font-size:.9em;border-radius:3px}#spectacle article p:last-child:first-child{margin-bottom:0}#spectacle article h1{margin:2.5rem 0 0;padding-top:.75rem;padding-bottom:.75rem;padding-left:2.25rem;padding-right:2.25rem;border-top:1px solid #e8e8e8;border-bottom:1px solid #e2e2e2;background-color:#f6f6f6}#spectacle article h1.doc-title{margin:0;padding-top:2.15rem;padding-bottom:0;font-weight:700;background:0 0;border:none;color:#535b60}#spectacle article h1.doc-title span{display:none;opacity:.65;margin-left:5px;font-weight:400}#spectacle article h2{margin-bottom:0;padding-left:2.25rem;padding-right:2.25rem;padding-bottom:.25rem;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgi…gd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g);background-size:100%;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,rgba(255,255,255,.4)),color-stop(100%,rgba(255,255,255,0)));background-image:-moz-linear-gradient(top,rgba(255,255,255,.4),rgba(255,255,255,0));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.4),rgba(255,255,255,0));background-image:linear-gradient(to bottom,rgba(255,255,255,.4),rgba(255,255,255,0))}#spectacle article h3{margin:0 0 .75rem}#spectacle article h1+.panel>h2{margin-top:0;border-top:none}#spectacle article h1+.tag-description+.panel>h2{margin-top:2rem}#spectacle article h1+.panel h3{margin-top:1rem}#spectacle article .panel{position:relative}#spectacle article .prop-row{padding-top:.75em;padding-bottom:.75em;border-top:1px solid #eee}#spectacle article .prop-row.prop-group,#spectacle article .prop-row:first-child{border-top:1px solid #ddd}#spectacle article .prop-row .prop-title{font-weight:700}#spectacle article .prop-row .prop-type{font-weight:400}#spectacle article .prop-row .prop-subtitle{font-weight:400;font-size:80%}#spectacle article .prop-row .prop-name{text-align:right;padding-right:.85rem!important;word-break:break-word}#spectacle article .prop-row .prop-value{padding-left:.85rem!important;word-wrap:break-word}#spectacle article .prop-row.prop-inner{padding-top:.5em;padding-bottom:.5em;font-size:80%}#spectacle article .prop-row.prop-inner .prop-name{color:#8a8a8a}#spectacle article .prop-row.prop-inner .prop-value>span{display:block}#spectacle article .prop-row.prop-inner .prop-value>span:before{color:#8a8a8a}#spectacle article .prop-row.prop-inner .prop-value>span:after{color:#8a8a8a}#spectacle article .prop-row.prop-inner .prop-value>span.json-property-format,#spectacle article .prop-row.prop-inner .prop-value>span.json-property-type{display:inline-block}#spectacle article .doc-row{margin:2rem 0 20px}#spectacle article .doc-examples{padding-left:2.25rem!important;padding-right:2.25rem!important;color:#fefefe;background-color:#2d3134}#spectacle article .doc-examples h5{color:#fefefe;font-size:1rem;opacity:.8}#spectacle article .doc-examples h5 span{opacity:.5}@media screen and (max-width:63.9375em){#spectacle article .doc-examples:not(:empty){margin-top:1.5rem;padding-top:1.5rem;padding-bottom:.5rem}}#spectacle article .doc-examples code{display:block;margin-bottom:1.5rem;padding:1.5rem;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:inherit;color:inherit;background-color:transparent;border:none;border-top:1px solid #000;border-bottom:1px solid #404040;border-radius:5px;box-shadow:0 0 200px rgba(0,0,0,.33) inset;word-spacing:normal;white-space:pre-wrap;word-break:normal}#spectacle article .doc-examples tbody tr:nth-child(even){border-bottom:0;background-color:#353a3d}#spectacle article .doc-examples tbody,#spectacle article .doc-examples tfoot,#spectacle article .doc-examples thead{color:#fff;background-color:#2d3134;border:0}#spectacle article .doc-examples thead{background-color:#2d3134}#spectacle article .doc-examples .swagger-response-headers{background-color:transparent;border:none;border-top:1px solid #000;border-bottom:1px solid #404040;border-radius:5px;box-shadow:0 0 200px rgba(0,0,0,.33) inset;margin-bottom:1.5rem}#spectacle article .doc-examples .swagger-response-headers thead{color:#fefefe;font-size:1rem;opacity:.8;background-color:transparent;border:none}#spectacle article .doc-examples .swagger-response-headers tbody{border:none;background-color:transparent}#spectacle article .doc-examples .swagger-response-headers tbody tr{background-color:transparent;border-top:1px solid #404040}#spectacle article .powered-by{font-size:80%;color:#cacaca}#spectacle article .powered-by span{color:#f68b1f}#spectacle article .operation .operation-tags{position:absolute;top:0;text-align:right;right:0}#spectacle article .operation .operation-tags .label{cursor:pointer}#spectacle article .operation .operation-tags .label:hover{color:#e6e6e6}@media print,screen and (min-width:64em){#spectacle article .operation .operation-tags{right:50%}}#spectacle article .operation .operation-path{word-break:break-all}#spectacle article .security-definition-description{margin-top:1.5rem;margin-bottom:.5rem}#spectacle article .security-definition-scope-description{color:#8a8a8a;margin-bottom:.5rem}#spectacle article .definition .doc-examples h5{margin-top:-1rem}#spectacle article .definition .doc-copy>section{margin-bottom:1rem}#spectacle article .definition .doc-copy>section>.json-property-type{display:none}#spectacle article .definition dl dt{font-weight:400}#spectacle article .definition dl dd{font-style:italic}#spectacle article .definition .json-property-name{font-weight:700}#spectacle article .hljs{line-height:1.25;overflow-x:auto;padding:1.5rem;margin-bottom:1rem;border:none}#spectacle .drawer-layout .drawer{box-shadow:0 0 10px rgba(45,49,52,.5);transition:transform .5s ease;backface-visibility:hidden}#spectacle .drawer-layout .drawer.slide-left{transform:translateX(-250px)}#spectacle .drawer-layout .drawer.slide-right{transform:translateX(250px)}#spectacle .drawer-layout .drawer .drawer-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(254,254,254,.25)}@media print,screen and (min-width:64em){#spectacle .drawer-layout .drawer.slide-left{transform:none;margin-left:-250px}#spectacle .drawer-layout .drawer.slide-right{transform:none;margin-left:250px}#spectacle .drawer-layout .drawer .drawer-overlay{display:none}}@media print,screen and (min-width:64em){#spectacle .drawer-layout.drawer-slide-left-large .drawer{margin-left:-250px}#spectacle .drawer-layout.drawer-slide-left-large .floating-menu-icon{opacity:0}#spectacle .drawer-layout.drawer-slide-right-large .drawer{margin-left:250px}#spectacle .drawer-layout.drawer-slide-right-large .floating-menu-icon{opacity:0}}#spectacle .drawer-layout.drawer-open .floating-menu-icon{opacity:0}#spectacle .drawer-layout .floating-menu-icon{position:fixed;top:.75rem;right:.75rem;background-color:rgba(45,49,52,.75);padding:.65rem;z-index:1;border-radius:5px;transition:opacity .5s linear}#spectacle .drawer-layout .floating-menu-icon .hamburger{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}#spectacle .drawer-layout .floating-menu-icon .hamburger::after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:''}#spectacle .drawer-layout .floating-menu-icon .hamburger:hover::after{background:#cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}#spectacle .hljs{display:block;overflow-x:auto;padding:.5em;background:#23241f}#spectacle .hljs,#spectacle .hljs-subst,#spectacle .hljs-tag{color:#f8f8f2}#spectacle .hljs-emphasis,#spectacle .hljs-strong{color:#a8a8a2}#spectacle .hljs-bullet,#spectacle .hljs-link,#spectacle .hljs-literal,#spectacle .hljs-number,#spectacle .hljs-quote,#spectacle .hljs-regexp{color:#ae81ff}#spectacle .hljs-code,#spectacle .hljs-section,#spectacle .hljs-selector-class,#spectacle .hljs-title{color:#a6e22e}#spectacle .hljs-strong{font-weight:700}#spectacle .hljs-emphasis{font-style:italic}#spectacle .hljs-attr,#spectacle .hljs-keyword,#spectacle .hljs-name,#spectacle .hljs-selector-tag{color:#f92672}#spectacle .hljs-attribute,#spectacle .hljs-symbol{color:#66d9ef}#spectacle .hljs-class .hljs-title,#spectacle .hljs-params{color:#f8f8f2}#spectacle .hljs-addition,#spectacle .hljs-built_in,#spectacle .hljs-builtin-name,#spectacle .hljs-selector-attr,#spectacle .hljs-selector-id,#spectacle .hljs-selector-pseudo,#spectacle .hljs-string,#spectacle .hljs-template-variable,#spectacle .hljs-type,#spectacle .hljs-variable{color:#e6db74}#spectacle .hljs-comment,#spectacle .hljs-deletion,#spectacle .hljs-meta{color:#75715e} \ No newline at end of file
diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml
index 8ff81d317..f2bb945f9 100644
--- a/support/doc/api/openapi.yaml
+++ b/support/doc/api/openapi.yaml
@@ -1,1388 +1,2089 @@
1swagger: '2.0' 1openapi: 3.0.0
2info: 2info:
3 title: PeerTube 3 title: PeerTube
4 version: 1.0.0-beta 4 version: 1.2.0
5 description: Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular. 5 contact:
6host: peertube.example.com 6 name: PeerTube Community
7securityDefinitions: 7 url: 'https://joinpeertube.org'
8 OAuth2: 8 license:
9 description: 'In the header: *Authorization: Bearer mytoken*' 9 name: AGPLv3.0
10 type: oauth2 10 url: 'https://github.com/Chocobozzz/PeerTube/blob/master/LICENSE'
11 flow: password 11 x-logo:
12 # Not implemented yet 12 url: 'https://joinpeertube.org/img/brand.png'
13 # authorizationUrl: https://example.com/oauth/authorize 13 altText: PeerTube Project Homepage
14 tokenUrl: https://peertube.example.com/api/v1/users/token 14 description: |
15basePath: '/api/v1' 15 # Introduction
16schemes: 16 The PeerTube API is built on HTTP(S). Our API is RESTful. It has predictable
17 - https 17 resource URLs. It returns HTTP response codes to indicate errors. It also
18 accepts and returns JSON in the HTTP body. You can use your favorite
19 HTTP/REST library for your programming language to use PeerTube. No official
20 SDK is currently provided, but the spec API is fully compatible with
21 [openapi-generator](https://github.com/OpenAPITools/openapi-generator/wiki/API-client-generator-HOWTO)
22 which generates a client SDK in the language of your choice.
23
24 # Authentication
25 When you sign up for an account, you are given the possibility to generate
26 sessions, and authenticate using this session token. One session token can
27 currently be used at a time.
28
29 # Errors
30 The API uses standard HTTP status codes to indicate the success or failure
31 of the API call. The body of the response will be JSON in the following
32 format.
33
34 ```
35 {
36 "code": "unauthorized_request", // example inner error code
37 "error": "Token is invalid." // example exposed error message
38 }
39 ```
40externalDocs:
41 url: https://docs.joinpeertube.org/api.html
42tags:
43 - name: Accounts
44 description: >
45 Using some features of PeerTube require authentication, for which Accounts
46 provide different levels of permission as well as associated user
47 information. Accounts also encompass remote accounts discovered across the federation.
48 - name: Config
49 description: >
50 Each server exposes public information regarding supported videos and
51 options.
52 - name: Feeds
53 description: |
54 Feeds of videos and feeds of comments allow to see updates and get them in
55 an aggregator or script of your choice.
56 - name: Job
57 description: >
58 Jobs are long-running tasks enqueued and processed by the instance
59 itself. No additional worker registration is currently available.
60 - name: Server Following
61 description: >
62 Managing servers which the instance interacts with is crucial to the
63 concept of federation in PeerTube and external video indexation. The PeerTube
64 server then deals with inter-server ActivityPub operations and propagates
65 information across its social graph by posting activities to actors' inbox
66 endpoints.
67 - name: Video Abuse
68 description: |
69 Video abuses deal with reports of local or remote videos alike.
70 - name: Video
71 description: |
72 Operations dealing with listing, uploading, fetching or modifying videos.
73 - name: Search
74 description: |
75 The search helps to find _videos_ from within the instance and beyond.
76 Videos from other instances federated by the instance (that is, instances
77 followed by the instance) can be found via keywords and other criteria of
78 the advanced search.
79 - name: Video Comment
80 description: >
81 Operations dealing with comments to a video. Comments are organized in
82 threads.
83 - name: Video Channel
84 description: >
85 Operations dealing with creation, modification and video listing of a
86 user's channels.
87 - name: Video Blacklist
88 description: >
89 Operations dealing with blacklisting videos (removing them from view and
90 preventing interactions).
91 - name: Video Rate
92 description: >
93 Voting for a video.
94x-tagGroups:
95 - name: Accounts
96 tags:
97 - Accounts
98 - User
99 - name: Videos
100 tags:
101 - Video
102 - Video Channel
103 - Video Comment
104 - Video Following
105 - Video Rate
106 - name: Moderation
107 tags:
108 - Video Abuse
109 - Video Blacklist
110 - name: Instance Configuration
111 tags:
112 - Config
113 - Server Following
114 - name: Notifications
115 tags:
116 - Feeds
117 - name: Jobs
118 tags:
119 - Job
120 - name: Search
121 tags:
122 - Search
18paths: 123paths:
19 '/accounts/{name}': 124 '/accounts/{name}':
20 get: 125 get:
21 tags: 126 tags:
22 - Accounts 127 - Accounts
23 consumes: 128 summary: Get the account by name
24 - application/json
25 produces:
26 - application/json
27 parameters: 129 parameters:
28 - $ref: "accounts.yaml#/parameters/name" 130 - $ref: '#/components/parameters/name'
29 - $ref: "commons.yaml#/parameters/start" 131 - $ref: '#/components/parameters/start'
30 - $ref: "commons.yaml#/parameters/count" 132 - $ref: '#/components/parameters/count'
31 - $ref: "commons.yaml#/parameters/sort" 133 - $ref: '#/components/parameters/sort'
32 responses: 134 responses:
33 '200': 135 '200':
34 description: successful operation 136 description: successful operation
35 schema: 137 content:
36 $ref: '#/definitions/Account' 138 application/json:
139 schema:
140 $ref: '#/components/schemas/Account'
37 '/accounts/{name}/videos': 141 '/accounts/{name}/videos':
38 get: 142 get:
39 tags: 143 tags:
40 - Accounts 144 - Accounts
41 consumes: 145 - Video
42 - application/json 146 summary: 'Get videos for an account, provided the name of that account'
43 produces:
44 - application/json
45 parameters: 147 parameters:
46 - $ref: "accounts.yaml#/parameters/name" 148 - $ref: '#/components/parameters/name'
47 responses: 149 responses:
48 '200': 150 '200':
49 description: successful operation 151 description: successful operation
50 schema: 152 content:
51 $ref: '#/definitions/Video' 153 application/json:
154 schema:
155 $ref: '#/components/schemas/Video'
156 x-code-samples:
157 - lang: JavaScript
158 source: |
159 fetch('https://peertube2.cpy.re/api/v1/accounts/{name}/videos')
160 .then(function(response) {
161 return response.json()
162 }).then(function(data) {
163 console.log(data)
164 })
165 - lang: Shell
166 source: |
167 # pip install httpie
168 http -b GET https://peertube2.cpy.re/api/v1/accounts/{name}/videos
169 - lang: Ruby
170 source: |
171 require 'uri'
172 require 'net/http'
173
174 url = URI("https://peertube2.cpy.re/api/v1/accounts/{name}/videos")
175
176 http = Net::HTTP.new(url.host, url.port)
177 http.use_ssl = true
178 http.verify_mode = OpenSSL::SSL::VERIFY_NONE
179
180 request = Net::HTTP::Post.new(url)
181 request["content-type"] = 'application/json'
182 response = http.request(request)
183 puts response.read_body
184 - lang: Python
185 source: |
186 import http.client
187
188 conn = http.client.HTTPSConnection("https://peertube2.cpy.re/api/v1")
189
190 headers = {
191 'content-type': "application/json"
192 }
193
194 conn.request("POST", "/accounts/{name}/videos", None, headers)
195
196 res = conn.getresponse()
197 data = res.read()
198
199 print(data.decode("utf-8"))
52 /accounts: 200 /accounts:
53 get: 201 get:
54 tags: 202 tags:
55 - Accounts 203 - Accounts
56 consumes: 204 summary: Get all accounts
57 - application/json
58 produces:
59 - application/json
60 responses: 205 responses:
61 '200': 206 '200':
62 description: successful operation 207 description: successful operation
63 schema: 208 content:
64 type: array 209 'application/json':
65 items: 210 schema:
66 $ref: '#/definitions/Account' 211 type: array
212 items:
213 $ref: '#/components/schemas/Account'
67 /config: 214 /config:
68 get: 215 get:
69 tags: 216 tags:
70 - Config 217 - Config
71 consumes: 218 summary: Get the public configuration of the server
72 - application/json
73 produces:
74 - application/json
75 responses: 219 responses:
76 '200': 220 '200':
77 description: successful operation 221 description: successful operation
78 schema: 222 content:
79 $ref: '#/definitions/ServerConfig' 223 application/json:
80 /feeds/videos.{format}: 224 schema:
225 $ref: '#/components/schemas/ServerConfig'
226 /config/about:
227 get:
228 summary: Get the instance about page content
229 tags:
230 - Config
231 responses:
232 '200':
233 description: successful operation
234 /config/custom:
81 get: 235 get:
236 summary: Get the runtime configuration of the server
237 tags:
238 - Config
239 security:
240 - OAuth2:
241 - admin
242 responses:
243 '200':
244 description: successful operation
245 put:
246 summary: Set the runtime configuration of the server
247 tags:
248 - Config
249 security:
250 - OAuth2:
251 - admin
252 responses:
253 '200':
254 description: successful operation
255 delete:
256 summary: Delete the runtime configuration of the server
257 tags:
258 - Config
259 security:
260 - OAuth2:
261 - admin
262 responses:
263 '200':
264 description: successful operation
265 '/feeds/videos.{format}':
266 get:
267 summary: >-
268 Get the feed of videos for the server, with optional filter by account
269 name or id
82 tags: 270 tags:
83 - Feeds 271 - Feeds
84 produces:
85 - application/atom+xml
86 - application/rss+xml
87 - application/json
88 parameters: 272 parameters:
89 - name: format 273 - name: format
90 in: path 274 in: path
91 required: true 275 required: true
92 type: string 276 description: >-
93 enum: [ 'xml', 'atom', 'json'] 277 The format expected (xml defaults to RSS 2.0, atom to ATOM 1.0 and
94 default: 'xml' 278 json to JSON FEED 1.0
95 description: 'The format expected (xml defaults to RSS 2.0, atom to ATOM 1.0 and json to JSON FEED 1.0' 279 schema:
280 type: string
281 enum:
282 - xml
283 - atom
284 - json
285 default: xml
96 - name: accountId 286 - name: accountId
97 in: query 287 in: query
98 required: false 288 required: false
99 type: number 289 description: >-
100 description: 'The id of the local account to filter to (beware, users IDs and not actors IDs which will return empty feeds' 290 The id of the local account to filter to (beware, users IDs and not
291 actors IDs which will return empty feeds
292 schema:
293 type: number
101 - name: accountName 294 - name: accountName
102 in: query 295 in: query
103 required: false 296 required: false
104 type: string 297 description: The name of the local account to filter to
105 description: 'The name of the local account to filter to' 298 schema:
299 type: string
106 responses: 300 responses:
107 '200': 301 '200':
108 description: successful operation 302 description: successful operation
109 /jobs: 303 /jobs/{state}:
110 get: 304 get:
305 summary: Get list of jobs
111 security: 306 security:
112 - OAuth2: [ ] 307 - OAuth2:
308 - admin
113 tags: 309 tags:
114 - Job 310 - Job
115 consumes:
116 - application/json
117 produces:
118 - application/json
119 parameters: 311 parameters:
120 - name: state 312 - name: state
121 in: path 313 in: path
122 required: true 314 required: true
123 type: string 315 description: The state of the job
124 description: 'The state of the job' 316 schema:
125 - $ref: "commons.yaml#/parameters/start" 317 type: string
126 - $ref: "commons.yaml#/parameters/count" 318 enum:
127 - $ref: "commons.yaml#/parameters/sort" 319 - active
320 - completed
321 - failed
322 - waiting
323 - delayed
324 - $ref: '#/components/parameters/start'
325 - $ref: '#/components/parameters/count'
326 - $ref: '#/components/parameters/sort'
128 responses: 327 responses:
129 '200': 328 '200':
130 description: successful operation 329 description: successful operation
131 schema: 330 content:
132 type: array 331 application/json:
133 items: 332 schema:
134 $ref: '#/definitions/Job' 333 type: array
334 items:
335 $ref: '#/components/schemas/Job'
135 '/server/following/{host}': 336 '/server/following/{host}':
136 delete: 337 delete:
137 security: 338 security:
138 - OAuth2: [ ] 339 - OAuth2:
340 - admin
139 tags: 341 tags:
140 - ServerFollowing 342 - Server Following
141 consumes: 343 summary: Unfollow a server by hostname
142 - application/json
143 produces:
144 - application/json
145 parameters: 344 parameters:
146 - name: host 345 - name: host
147 in: path 346 in: path
148 required: true 347 required: true
149 type: string
150 description: 'The host to unfollow ' 348 description: 'The host to unfollow '
349 schema:
350 type: string
151 responses: 351 responses:
152 '201': 352 '201':
153 description: successful operation 353 description: successful operation
154 /server/followers: 354 /server/followers:
155 get: 355 get:
156 tags: 356 tags:
157 - ServerFollowing 357 - Server Following
158 consumes: 358 summary: Get followers of the server
159 - application/json
160 produces:
161 - application/json
162 parameters: 359 parameters:
163 - $ref: "commons.yaml#/parameters/start" 360 - $ref: '#/components/parameters/start'
164 - $ref: "commons.yaml#/parameters/count" 361 - $ref: '#/components/parameters/count'
165 - $ref: "commons.yaml#/parameters/sort" 362 - $ref: '#/components/parameters/sort'
166 responses: 363 responses:
167 '200': 364 '200':
168 description: successful operation 365 description: successful operation
169 schema: 366 content:
170 type: array 367 application/json:
171 items: 368 schema:
172 $ref: '#/definitions/Follow' 369 type: array
370 items:
371 $ref: '#/components/schemas/Follow'
173 /server/following: 372 /server/following:
174 get: 373 get:
175 tags: 374 tags:
176 - ServerFollowing 375 - Server Following
177 consumes: 376 summary: Get servers followed by the server
178 - application/json
179 produces:
180 - application/json
181 parameters: 377 parameters:
182 - $ref: "commons.yaml#/parameters/start" 378 - $ref: '#/components/parameters/start'
183 - $ref: "commons.yaml#/parameters/count" 379 - $ref: '#/components/parameters/count'
184 - $ref: "commons.yaml#/parameters/sort" 380 - $ref: '#/components/parameters/sort'
185 responses: 381 responses:
186 '200': 382 '200':
187 description: successful operation 383 description: successful operation
188 schema: 384 content:
189 type: array 385 application/json:
190 items: 386 schema:
191 $ref: '#/definitions/Follow' 387 type: array
388 items:
389 $ref: '#/components/schemas/Follow'
192 post: 390 post:
193 security: 391 security:
194 - OAuth2: [ ] 392 - OAuth2:
393 - admin
195 tags: 394 tags:
196 - ServerFollowing 395 - Server Following
197 consumes: 396 summary: Follow a server
198 - application/json
199 produces:
200 - application/json
201 parameters:
202 - in: body
203 name: body
204 schema:
205 $ref: '#/definitions/Follow'
206 responses: 397 responses:
207 '204': 398 '204':
208 $ref: "commons.yaml#/responses/emptySuccess" 399 $ref: '#/paths/~1users~1me/put/responses/204'
400 requestBody:
401 content:
402 application/json:
403 schema:
404 $ref: '#/components/schemas/Follow'
209 /users: 405 /users:
210 post: 406 post:
407 summary: Creates user
211 security: 408 security:
212 - OAuth2: [ ] 409 - OAuth2:
410 - admin
213 tags: 411 tags:
214 - User 412 - User
215 consumes:
216 - application/json
217 produces:
218 - application/json
219 parameters:
220 - in: body
221 name: body
222 required: true
223 description: 'User to create'
224 schema:
225 $ref: '#/definitions/AddUser'
226 responses: 413 responses:
227 '200': 414 '200':
228 description: successful operation 415 description: successful operation
229 schema: 416 content:
230 $ref: '#/definitions/AddUserResponse' 417 application/json:
418 schema:
419 $ref: '#/components/schemas/AddUserResponse'
420 requestBody:
421 content:
422 application/json:
423 schema:
424 $ref: '#/components/schemas/AddUser'
425 description: User to create
426 required: true
231 get: 427 get:
428 summary: Get a list of users
232 security: 429 security:
233 - OAuth2: [ ] 430 - OAuth2: []
234 tags: 431 tags:
235 - User 432 - User
236 consumes:
237 - application/json
238 produces:
239 - application/json
240 parameters: 433 parameters:
241 - $ref: "commons.yaml#/parameters/start" 434 - $ref: '#/components/parameters/start'
242 - $ref: "commons.yaml#/parameters/count" 435 - $ref: '#/components/parameters/count'
243 - $ref: "commons.yaml#/parameters/sort" 436 - $ref: '#/components/parameters/usersSort'
244 responses: 437 responses:
245 '200': 438 '200':
246 description: successful operation 439 description: successful operation
247 schema: 440 content:
248 type: array 441 application/json:
249 items: 442 schema:
250 $ref: '#/definitions/User' 443 type: array
444 items:
445 $ref: '#/components/schemas/User'
251 '/users/{id}': 446 '/users/{id}':
252 delete: 447 delete:
448 summary: Delete a user by its id
253 security: 449 security:
254 - OAuth2: [ ] 450 - OAuth2:
451 - admin
255 tags: 452 tags:
256 - User 453 - User
257 consumes:
258 - application/json
259 produces:
260 - application/json
261 parameters: 454 parameters:
262 - $ref: "users.yaml#/parameters/id" 455 - $ref: '#/components/parameters/id'
263 responses: 456 responses:
264 '204': 457 '204':
265 $ref: "commons.yaml#/responses/emptySuccess" 458 $ref: '#/paths/~1users~1me/put/responses/204'
266 get: 459 get:
460 summary: Get user by its id
267 security: 461 security:
268 - OAuth2: [ ] 462 - OAuth2: []
269 tags: 463 tags:
270 - User 464 - User
271 consumes:
272 - application/json
273 produces:
274 - application/json
275 parameters: 465 parameters:
276 - $ref: "users.yaml#/parameters/id" 466 - $ref: '#/components/parameters/id'
277 responses: 467 responses:
278 '200': 468 '200':
279 description: successful operation 469 description: successful operation
280 schema: 470 content:
281 $ref: '#/definitions/User' 471 application/json:
472 schema:
473 $ref: '#/components/schemas/User'
282 put: 474 put:
475 summary: Update user profile by its id
283 security: 476 security:
284 - OAuth2: [ ] 477 - OAuth2: []
285 tags: 478 tags:
286 - User 479 - User
287 consumes:
288 - application/json
289 produces:
290 - application/json
291 parameters: 480 parameters:
292 - $ref: "users.yaml#/parameters/id" 481 - $ref: '#/components/parameters/id'
293 - in: body
294 name: body
295 required: true
296 schema:
297 $ref: '#/definitions/UpdateUser'
298 responses: 482 responses:
299 '204': 483 '204':
300 $ref: "commons.yaml#/responses/emptySuccess" 484 $ref: '#/paths/~1users~1me/put/responses/204'
485 requestBody:
486 content:
487 application/json:
488 schema:
489 $ref: '#/components/schemas/UpdateUser'
490 required: true
301 /users/me: 491 /users/me:
302 get: 492 get:
493 summary: Get current user information
303 security: 494 security:
304 - OAuth2: [ ] 495 - OAuth2:
496 - user
305 tags: 497 tags:
306 - User 498 - User
307 consumes:
308 - application/json
309 produces:
310 - application/json
311 responses: 499 responses:
312 '200': 500 '200':
313 description: successful operation 501 description: successful operation
314 schema: 502 content:
315 type: array 503 application/json:
316 items: 504 schema:
317 $ref: '#/definitions/User' 505 type: array
506 items:
507 $ref: '#/components/schemas/User'
318 put: 508 put:
509 summary: Update current user information
319 security: 510 security:
320 - OAuth2: [ ] 511 - OAuth2:
512 - user
321 tags: 513 tags:
322 - User 514 - User
323 consumes:
324 - application/json
325 produces:
326 - application/json
327 parameters:
328 - in: body
329 name: body
330 required: true
331 schema:
332 $ref: '#/definitions/UpdateMe'
333 responses: 515 responses:
334 '204': 516 '204':
335 $ref: "commons.yaml#/responses/emptySuccess" 517 description: Successful operation
518 requestBody:
519 content:
520 application/json:
521 schema:
522 $ref: '#/components/schemas/UpdateMe'
523 required: true
336 /users/me/video-quota-used: 524 /users/me/video-quota-used:
337 get: 525 get:
526 summary: Get current user used quota
338 security: 527 security:
339 - OAuth2: [ ] 528 - OAuth2:
529 - user
340 tags: 530 tags:
341 - User 531 - User
342 consumes:
343 - application/json
344 produces:
345 - application/json
346 parameters: []
347 responses: 532 responses:
348 '200': 533 '200':
349 description: successful operation 534 description: successful operation
350 schema: 535 content:
351 type: number 536 application/json:
537 schema:
538 type: number
352 '/users/me/videos/{videoId}/rating': 539 '/users/me/videos/{videoId}/rating':
353 get: 540 get:
541 summary: 'Get rating of video by its id, among those of the current user'
354 security: 542 security:
355 - OAuth2: [ ] 543 - OAuth2: []
356 tags: 544 tags:
357 - User 545 - User
358 consumes:
359 - application/json
360 produces:
361 - application/json
362 parameters: 546 parameters:
363 - name: videoId 547 - name: videoId
364 in: path 548 in: path
365 required: true 549 required: true
366 type: string
367 description: 'The video id ' 550 description: 'The video id '
551 schema:
552 type: string
368 responses: 553 responses:
369 '200': 554 '200':
370 description: successful operation 555 description: successful operation
371 schema: 556 content:
372 $ref: '#/definitions/GetMeVideoRating' 557 application/json:
558 schema:
559 $ref: '#/components/schemas/GetMeVideoRating'
373 /users/me/videos: 560 /users/me/videos:
374 get: 561 get:
562 summary: Get videos of the current user
375 security: 563 security:
376 - OAuth2: [ ] 564 - OAuth2:
565 - user
377 tags: 566 tags:
378 - User 567 - User
379 consumes:
380 - application/json
381 produces:
382 - application/json
383 parameters: 568 parameters:
384 - $ref: "commons.yaml#/parameters/start" 569 - $ref: '#/components/parameters/start'
385 - $ref: "commons.yaml#/parameters/count" 570 - $ref: '#/components/parameters/count'
386 - $ref: "commons.yaml#/parameters/sort" 571 - $ref: '#/components/parameters/sort'
572 responses:
573 '200':
574 description: successful operation
575 content:
576 application/json:
577 schema:
578 type: array
579 items:
580 $ref: '#/components/schemas/Video'
581 /users/me/subscriptions:
582 get:
583 summary: Get subscriptions of the current user
584 security:
585 - OAuth2:
586 - user
587 tags:
588 - User
589 parameters:
590 - $ref: '#/components/parameters/start'
591 - $ref: '#/components/parameters/count'
592 - $ref: '#/components/parameters/sort'
387 responses: 593 responses:
388 '200': 594 '200':
389 description: successful operation 595 description: successful operation
390 schema:
391 type: array
392 items:
393 $ref: '#/definitions/Video'
394 /users/register:
395 post: 596 post:
597 summary: Add subscription to the current user
598 security:
599 - OAuth2:
600 - user
601 tags:
602 - User
603 responses:
604 '200':
605 description: successful operation
606 /users/me/subscriptions/exist:
607 get:
608 summary: Get if subscriptions exist for the current user
609 security:
610 - OAuth2:
611 - user
396 tags: 612 tags:
397 - User 613 - User
398 consumes:
399 - application/json
400 produces:
401 - application/json
402 parameters: 614 parameters:
403 - in: body 615 - $ref: '#/components/parameters/subscriptionsUris'
404 name: body 616 responses:
405 required: true 617 '200':
406 schema: 618 description: successful operation
407 $ref: '#/definitions/RegisterUser' 619 content:
620 application/json:
621 schema:
622 type: object
623 /users/me/subscriptions/videos:
624 get:
625 summary: Get videos of subscriptions of the current user
626 security:
627 - OAuth2:
628 - user
629 tags:
630 - User
631 parameters:
632 - $ref: '#/components/parameters/start'
633 - $ref: '#/components/parameters/count'
634 - $ref: '#/components/parameters/sort'
635 responses:
636 '200':
637 description: successful operation
638 content:
639 application/json:
640 schema:
641 type: array
642 items:
643 $ref: '#/components/schemas/Video'
644 '/users/me/subscriptions/{uri}':
645 get:
646 summary: Get subscription of the current user for a given uri
647 security:
648 - OAuth2:
649 - user
650 tags:
651 - User
652 responses:
653 '200':
654 description: successful operation
655 content:
656 application/json:
657 schema:
658 $ref: '#/components/schemas/VideoChannel'
659 delete:
660 summary: Delete subscription of the current user for a given uri
661 security:
662 - OAuth2:
663 - user
664 tags:
665 - User
666 responses:
667 '200':
668 description: successful operation
669 /users/register:
670 post:
671 summary: Register a user
672 tags:
673 - User
408 responses: 674 responses:
409 '204': 675 '204':
410 $ref: "commons.yaml#/responses/emptySuccess" 676 $ref: '#/paths/~1users~1me/put/responses/204'
677 requestBody:
678 content:
679 application/json:
680 schema:
681 $ref: '#/components/schemas/RegisterUser'
682 required: true
411 /users/me/avatar/pick: 683 /users/me/avatar/pick:
412 post: 684 post:
685 summary: Update current user avatar
413 security: 686 security:
414 - OAuth2: [ ] 687 - OAuth2: []
415 tags: 688 tags:
416 - User 689 - User
417 consumes:
418 - multipart/form-data
419 produces:
420 - application/json
421 parameters:
422 - in: formData
423 name: avatarfile
424 type: file
425 description: The file to upload.
426 responses: 690 responses:
427 '200': 691 '200':
428 description: successful operation 692 description: successful operation
429 schema: 693 content:
430 $ref: '#/definitions/Avatar' 694 application/json:
695 schema:
696 $ref: '#/components/schemas/Avatar'
697 requestBody:
698 content:
699 multipart/form-data:
700 schema:
701 type: object
702 properties:
703 avatarfile:
704 description: The file to upload.
705 type: string
706 format: binary
707 encoding:
708 profileImage:
709 # only accept png/jpeg
710 contentType: image/png, image/jpeg
431 /videos: 711 /videos:
432 get: 712 get:
713 summary: Get list of videos
433 tags: 714 tags:
434 - Video 715 - Video
435 consumes:
436 - application/json
437 produces:
438 - application/json
439 parameters: 716 parameters:
440 - name: category 717 - $ref: '#/components/parameters/categoryOneOf'
441 in: query 718 - $ref: '#/components/parameters/tagsOneOf'
442 required: false 719 - $ref: '#/components/parameters/tagsAllOf'
443 type: number 720 - $ref: '#/components/parameters/licenceOneOf'
444 description: category id of the video 721 - $ref: '#/components/parameters/languageOneOf'
445 - $ref: "commons.yaml#/parameters/start" 722 - $ref: '#/components/parameters/nsfw'
446 - $ref: "commons.yaml#/parameters/count" 723 - $ref: '#/components/parameters/filter'
447 - $ref: "commons.yaml#/parameters/sort" 724 - $ref: '#/components/parameters/start'
725 - $ref: '#/components/parameters/count'
726 - $ref: '#/components/parameters/videosSort'
448 responses: 727 responses:
449 '200': 728 '200':
450 description: successful operation 729 description: successful operation
451 schema: 730 content:
452 type: array 731 application/json:
453 items: 732 schema:
454 $ref: '#/definitions/Video' 733 type: array
734 items:
735 $ref: '#/components/schemas/Video'
455 /videos/categories: 736 /videos/categories:
456 get: 737 get:
738 summary: Get list of video licences known by the server
457 tags: 739 tags:
458 - Video 740 - Video
459 consumes:
460 - application/json
461 produces:
462 - application/json
463 responses: 741 responses:
464 '200': 742 '200':
465 description: successful operation 743 description: successful operation
466 schema: 744 content:
467 type: array 745 application/json:
468 items: 746 schema:
469 type: string 747 type: array
748 items:
749 type: string
470 /videos/licences: 750 /videos/licences:
471 get: 751 get:
752 summary: Get list of video licences known by the server
472 tags: 753 tags:
473 - Video 754 - Video
474 consumes:
475 - application/json
476 produces:
477 - application/json
478 responses: 755 responses:
479 '200': 756 '200':
480 description: successful operation 757 description: successful operation
481 schema: 758 content:
482 type: array 759 application/json:
483 items: 760 schema:
484 type: string 761 type: array
762 items:
763 type: string
485 /videos/languages: 764 /videos/languages:
486 get: 765 get:
766 summary: Get list of languages known by the server
487 tags: 767 tags:
488 - Video 768 - Video
489 consumes:
490 - application/json
491 produces:
492 - application/json
493 responses: 769 responses:
494 '200': 770 '200':
495 description: successful operation 771 description: successful operation
496 schema: 772 content:
497 type: array 773 application/json:
498 items: 774 schema:
499 type: string 775 type: array
776 items:
777 type: string
500 /videos/privacies: 778 /videos/privacies:
501 get: 779 get:
780 summary: Get list of privacy policies supported by the server
502 tags: 781 tags:
503 - Video 782 - Video
504 consumes:
505 - application/json
506 produces:
507 - application/json
508 responses: 783 responses:
509 '200': 784 '200':
510 description: successful operation 785 description: successful operation
511 schema: 786 content:
512 type: array 787 application/json:
513 items: 788 schema:
514 type: string 789 type: array
515 "/videos/{id}": 790 items:
791 type: string
792 '/videos/{id}':
516 put: 793 put:
794 summary: Update metadata for a video by its id
517 security: 795 security:
518 - OAuth2: [ ] 796 - OAuth2: []
519 tags: 797 tags:
520 - Video 798 - Video
521 consumes:
522 - multipart/form-data
523 produces:
524 - application/json
525 parameters: 799 parameters:
526 - $ref: "videos.yaml#/parameters/id" 800 - $ref: '#/components/parameters/id2'
527 - $ref: "videos.yaml#/parameters/thumbnailfile"
528 - $ref: "videos.yaml#/parameters/previewfile"
529 - $ref: "videos.yaml#/parameters/category"
530 - $ref: "videos.yaml#/parameters/licence"
531 - $ref: "videos.yaml#/parameters/language"
532 - $ref: "videos.yaml#/parameters/description"
533 - $ref: "videos.yaml#/parameters/waitTranscoding"
534 - $ref: "videos.yaml#/parameters/support"
535 - $ref: "videos.yaml#/parameters/nsfw"
536 - $ref: "videos.yaml#/parameters/name"
537 - $ref: "videos.yaml#/parameters/tags"
538 - $ref: "videos.yaml#/parameters/commentsEnabled"
539 - $ref: "videos.yaml#/parameters/downloadEnabled"
540 - $ref: "videos.yaml#/parameters/privacy"
541 - $ref: "videos.yaml#/parameters/scheduleUpdate"
542 responses: 801 responses:
543 '200': 802 '200':
544 description: successful operation 803 description: successful operation
545 schema: 804 content:
546 $ref: '#/definitions/Video' 805 application/json:
806 schema:
807 $ref: '#/components/schemas/Video'
808 requestBody:
809 content:
810 multipart/form-data:
811 schema:
812 type: object
813 properties:
814 thumbnailfile:
815 description: Video thumbnail file
816 type: string
817 previewfile:
818 description: Video preview file
819 type: string
820 category:
821 description: Video category
822 type: string
823 licence:
824 description: Video licence
825 type: string
826 language:
827 description: Video language
828 type: string
829 description:
830 description: Video description
831 type: string
832 waitTranscoding:
833 description: Whether or not we wait transcoding before publish the video
834 type: string
835 support:
836 description: Text describing how to support the video uploader
837 type: string
838 nsfw:
839 description: Whether or not this video contains sensitive content
840 type: string
841 name:
842 description: Video name
843 type: string
844 tags:
845 description: Video tags
846 type: array
847 items:
848 type: string
849 commentsEnabled:
850 description: Enable or disable comments for this video
851 type: string
852 scheduleUpdate: &ref_0
853 type: object
854 properties:
855 privacy:
856 type: string
857 enum:
858 - Public
859 - Unlisted
860 description: Video privacy target
861 updateAt:
862 type: string
863 format: date
864 description: When to update the video
865 required:
866 - updateAt
547 get: 867 get:
868 summary: Get a video by its id
548 tags: 869 tags:
549 - Video 870 - Video
550 consumes:
551 - application/json
552 produces:
553 - application/json
554 parameters: 871 parameters:
555 - $ref: "videos.yaml#/parameters/id" 872 - $ref: '#/components/parameters/id2'
556 responses: 873 responses:
557 '200': 874 '200':
558 description: successful operation 875 description: successful operation
559 schema: 876 content:
560 $ref: '#/definitions/Video' 877 application/json:
878 schema:
879 $ref: '#/components/schemas/Video'
561 delete: 880 delete:
881 summary: Delete a video by its id
562 security: 882 security:
563 - OAuth2: [ ] 883 - OAuth2: []
564 tags: 884 tags:
565 - Video 885 - Video
566 consumes:
567 - application/json
568 produces:
569 - application/json
570 parameters: 886 parameters:
571 - $ref: "videos.yaml#/parameters/id" 887 - $ref: '#/components/parameters/id2'
572 responses: 888 responses:
573 '204': 889 '204':
574 $ref: "commons.yaml#/responses/emptySuccess" 890 $ref: '#/paths/~1users~1me/put/responses/204'
575 "/videos/{id}/description": 891 '/videos/{id}/description':
576 get: 892 get:
893 summary: Get a video description by its id
577 tags: 894 tags:
578 - Video 895 - Video
579 consumes:
580 - application/json
581 produces:
582 - application/json
583 parameters: 896 parameters:
584 - $ref: "videos.yaml#/parameters/id" 897 - $ref: '#/components/parameters/id2'
585 responses: 898 responses:
586 '200': 899 '200':
587 description: successful operation 900 description: successful operation
588 schema: 901 content:
589 type: string 902 application/json:
590 "/videos/{id}/views": 903 schema:
904 type: string
905 '/videos/{id}/views':
591 post: 906 post:
907 summary: Add a view to the video by its id
592 tags: 908 tags:
593 - Video 909 - Video
594 consumes:
595 - application/json
596 produces:
597 - application/json
598 parameters: 910 parameters:
599 - $ref: "videos.yaml#/parameters/id" 911 - $ref: '#/components/parameters/id2'
600 responses: 912 responses:
601 '204': 913 '204':
602 $ref: "commons.yaml#/responses/emptySuccess" 914 $ref: '#/paths/~1users~1me/put/responses/204'
603 /videos/upload: 915 '/videos/{id}/watching':
916 put:
917 summary: Set watching progress of a video by its id for a user
918 tags:
919 - Video
920 security:
921 - OAuth2: []
922 parameters:
923 - $ref: '#/components/parameters/id2'
924 requestBody:
925 content:
926 application/json:
927 schema:
928 $ref: '#/components/schemas/UserWatchingVideo'
929 required: true
930 responses:
931 '204':
932 $ref: '#/paths/~1users~1me/put/responses/204'
933 /videos/ownership:
934 get:
935 summary: Get list of video ownership changes requests
936 tags:
937 - Video
938 security:
939 - OAuth2: []
940 parameters:
941 - $ref: '#/components/parameters/id2'
942 responses:
943 '200':
944 description: successful operation
945 '/videos/ownership/{id}/accept':
604 post: 946 post:
947 summary: Refuse ownership change request for video by its id
948 tags:
949 - Video
605 security: 950 security:
606 - OAuth2: [ ] 951 - OAuth2: []
952 parameters:
953 - $ref: '#/components/parameters/id2'
954 responses:
955 '204':
956 $ref: '#/paths/~1users~1me/put/responses/204'
957 '/videos/ownership/{id}/refuse':
958 post:
959 summary: Accept ownership change request for video by its id
607 tags: 960 tags:
608 - Video 961 - Video
609 consumes: 962 security:
610 - multipart/form-data 963 - OAuth2: []
611 produces:
612 - application/json
613 parameters: 964 parameters:
614 - name: videofile 965 - $ref: '#/components/parameters/id2'
615 in: formData 966 responses:
616 type: file 967 '204':
617 required: true 968 $ref: '#/paths/~1users~1me/put/responses/204'
618 description: 'Video file' 969 '/videos/{id}/give-ownership':
619 - name: channelId 970 post:
620 in: formData 971 summary: Request change of ownership for a video you own, by its id
621 required: true 972 tags:
622 type: number 973 - Video
623 description: 'Channel id that will contain this video' 974 security:
624 - $ref: "videos.yaml#/parameters/thumbnailfile" 975 - OAuth2: []
625 - $ref: "videos.yaml#/parameters/previewfile" 976 parameters:
626 - $ref: "videos.yaml#/parameters/category" 977 - $ref: '#/components/parameters/id2'
627 - $ref: "videos.yaml#/parameters/licence" 978 requestBody:
628 - $ref: "videos.yaml#/parameters/language" 979 required: true
629 - $ref: "videos.yaml#/parameters/description" 980 content:
630 - $ref: "videos.yaml#/parameters/waitTranscoding" 981 application/x-www-form-urlencoded:
631 - $ref: "videos.yaml#/parameters/support" 982 schema:
632 - $ref: "videos.yaml#/parameters/nsfw" 983 type: object
633 - $ref: "videos.yaml#/parameters/name" 984 properties:
634 - $ref: "videos.yaml#/parameters/tags" 985 username:
635 - $ref: "videos.yaml#/parameters/commentsEnabled" 986 type: string
636 - $ref: "videos.yaml#/parameters/downloadEnabled" 987 required:
637 - $ref: "videos.yaml#/parameters/privacy" 988 - username
638 - $ref: "videos.yaml#/parameters/scheduleUpdate" 989 responses:
990 '204':
991 $ref: '#/paths/~1users~1me/put/responses/204'
992 '400':
993 description: 'Changing video ownership to a remote account is not supported yet'
994 /videos/upload:
995 post:
996 summary: Upload a video file with its metadata
997 security:
998 - OAuth2: []
999 tags:
1000 - Video
639 responses: 1001 responses:
640 '200': 1002 '200':
641 description: successful operation 1003 description: successful operation
642 schema: 1004 content:
643 $ref: '#/definitions/VideoUploadResponse' 1005 application/json:
1006 schema:
1007 $ref: '#/components/schemas/VideoUploadResponse'
1008 requestBody:
1009 content:
1010 multipart/form-data:
1011 schema:
1012 type: object
1013 properties:
1014 videofile:
1015 description: Video file
1016 type: string
1017 format: binary
1018 channelId:
1019 description: Channel id that will contain this video
1020 type: number
1021 thumbnailfile:
1022 description: Video thumbnail file
1023 type: string
1024 previewfile:
1025 description: Video preview file
1026 type: string
1027 privacy:
1028 $ref: '#/components/schemas/VideoPrivacy'
1029 category:
1030 description: Video category
1031 type: string
1032 licence:
1033 description: Video licence
1034 type: string
1035 language:
1036 description: Video language
1037 type: string
1038 description:
1039 description: Video description
1040 type: string
1041 waitTranscoding:
1042 description: Whether or not we wait transcoding before publish the video
1043 type: string
1044 support:
1045 description: Text describing how to support the video uploader
1046 type: string
1047 nsfw:
1048 description: Whether or not this video contains sensitive content
1049 type: string
1050 name:
1051 description: Video name
1052 type: string
1053 tags:
1054 description: Video tags
1055 type: array
1056 items:
1057 type: string
1058 commentsEnabled:
1059 description: Enable or disable comments for this video
1060 type: string
1061 scheduleUpdate: *ref_0
1062 required:
1063 - videofile
1064 - channelId
1065 - name
1066 x-code-samples:
1067 - lang: Shell
1068 source: |
1069 ## DEPENDENCIES: httpie, jq
1070 # pip install httpie
1071 USERNAME="<your_username>"
1072 PASSWORD="<your_password>"
1073 FILE_PATH="<your_file_path>"
1074 CHANNEL_ID="<your_channel_id>"
1075 NAME="<video_name>"
1076
1077 API_PATH="https://peertube2.cpy.re/api/v1"
1078 ## AUTH
1079 client_id=$(http -b GET "$API_PATH/oauth-clients/local" | jq -r ".client_id")
1080 client_secret=$(http -b GET "$API_PATH/oauth-clients/local" | jq -r ".client_secret")
1081 token=$(http -b --form POST "$API_PATH/users/token" \
1082 client_id="$client_id" client_secret="$client_secret" grant_type=password response_type=code \
1083 username=$USERNAME \
1084 password=$PASSWORD \
1085 | jq -r ".access_token")
1086 ## VIDEO UPLOAD
1087 http -b --form POST "$API_PATH/videos/upload" \
1088 videofile@$FILE_PATH \
1089 channelId=$CHANNEL_ID \
1090 name=$NAME \
1091 "Authorization:Bearer $token"
644 /videos/abuse: 1092 /videos/abuse:
645 get: 1093 get:
1094 summary: Get list of reported video abuses
646 security: 1095 security:
647 - OAuth2: [ ] 1096 - OAuth2: []
648 tags: 1097 tags:
649 - VideoAbuse 1098 - Video Abuse
650 consumes:
651 - application/json
652 produces:
653 - application/json
654 parameters: 1099 parameters:
655 - $ref: "commons.yaml#/parameters/start" 1100 - $ref: '#/components/parameters/start'
656 - $ref: "commons.yaml#/parameters/count" 1101 - $ref: '#/components/parameters/count'
657 - $ref: "commons.yaml#/parameters/sort" 1102 - $ref: '#/components/parameters/abusesSort'
658 responses: 1103 responses:
659 '200': 1104 '200':
660 description: successful operation 1105 description: successful operation
661 schema: 1106 content:
662 type: array 1107 application/json:
663 items: 1108 schema:
664 $ref: '#/definitions/VideoAbuse' 1109 type: array
665 "/videos/{id}/abuse": 1110 items:
1111 $ref: '#/components/schemas/VideoAbuse'
1112 '/videos/{id}/abuse':
666 post: 1113 post:
1114 summary: 'Report an abuse, on a video by its id'
667 security: 1115 security:
668 - OAuth2: [ ] 1116 - OAuth2: []
669 tags: 1117 tags:
670 - VideoAbuse 1118 - Video Abuse
671 consumes:
672 - application/json
673 produces:
674 - application/json
675 parameters: 1119 parameters:
676 - $ref: "videos.yaml#/parameters/id" 1120 - $ref: '#/components/parameters/id2'
677 responses: 1121 responses:
678 '204': 1122 '204':
679 $ref: "commons.yaml#/responses/emptySuccess" 1123 $ref: '#/paths/~1users~1me/put/responses/204'
680 "/videos/{id}/blacklist": 1124 '/videos/{id}/blacklist':
681 post: 1125 post:
1126 summary: Put on blacklist a video by its id
682 security: 1127 security:
683 - OAuth2: [ ] 1128 - OAuth2:
1129 - admin
1130 - moderator
684 tags: 1131 tags:
685 - VideoBlacklist 1132 - Video Blacklist
686 consumes:
687 - application/json
688 produces:
689 - application/json
690 parameters: 1133 parameters:
691 - $ref: "videos.yaml#/parameters/id" 1134 - $ref: '#/components/parameters/id2'
692 responses: 1135 responses:
693 '204': 1136 '204':
694 $ref: "commons.yaml#/responses/emptySuccess" 1137 $ref: '#/paths/~1users~1me/put/responses/204'
695 delete: 1138 delete:
1139 summary: Delete an entry of the blacklist of a video by its id
696 security: 1140 security:
697 - OAuth2: [ ] 1141 - OAuth2:
1142 - admin
1143 - moderator
698 tags: 1144 tags:
699 - VideoBlacklist 1145 - Video Blacklist
700 consumes:
701 - application/json
702 produces:
703 - application/json
704 parameters: 1146 parameters:
705 - $ref: "videos.yaml#/parameters/id" 1147 - $ref: '#/components/parameters/id2'
706 responses: 1148 responses:
707 '204': 1149 '204':
708 $ref: "commons.yaml#/responses/emptySuccess" 1150 $ref: '#/paths/~1users~1me/put/responses/204'
709 /videos/blacklist: 1151 /videos/blacklist:
710 get: 1152 get:
1153 summary: Get list of videos on blacklist
711 security: 1154 security:
712 - OAuth2: [ ] 1155 - OAuth2:
1156 - admin
1157 - moderator
713 tags: 1158 tags:
714 - VideoBlacklist 1159 - Video Blacklist
715 consumes:
716 - application/json
717 produces:
718 - application/json
719 parameters: 1160 parameters:
720 - $ref: "commons.yaml#/parameters/start" 1161 - $ref: '#/components/parameters/start'
721 - $ref: "commons.yaml#/parameters/count" 1162 - $ref: '#/components/parameters/count'
722 - $ref: "commons.yaml#/parameters/sort" 1163 - $ref: '#/components/parameters/blacklistsSort'
723 responses: 1164 responses:
724 '200': 1165 '200':
725 description: successful operation 1166 description: successful operation
726 schema: 1167 content:
727 type: array 1168 application/json:
728 items: 1169 schema:
729 $ref: '#/definitions/VideoBlacklist' 1170 type: array
1171 items:
1172 $ref: '#/components/schemas/VideoBlacklist'
730 /video-channels: 1173 /video-channels:
731 get: 1174 get:
1175 summary: Get list of video channels
732 tags: 1176 tags:
733 - VideoChannel 1177 - Video Channel
734 consumes:
735 - application/json
736 produces:
737 - application/json
738 parameters: 1178 parameters:
739 - $ref: "commons.yaml#/parameters/start" 1179 - $ref: '#/components/parameters/start'
740 - $ref: "commons.yaml#/parameters/count" 1180 - $ref: '#/components/parameters/count'
741 - $ref: "commons.yaml#/parameters/sort" 1181 - $ref: '#/components/parameters/sort'
742 responses: 1182 responses:
743 '200': 1183 '200':
744 description: successful operation 1184 description: successful operation
745 schema: 1185 content:
746 type: array 1186 application/json:
747 items: 1187 schema:
748 $ref: '#/definitions/VideoChannel' 1188 type: array
1189 items:
1190 $ref: '#/components/schemas/VideoChannel'
749 post: 1191 post:
1192 summary: Creates a video channel for the current user
750 security: 1193 security:
751 - OAuth2: [ ] 1194 - OAuth2: []
752 tags: 1195 tags:
753 - VideoChannel 1196 - Video Channel
754 consumes:
755 - application/json
756 produces:
757 - application/json
758 parameters:
759 - in: body
760 name: body
761 schema:
762 $ref: '#/definitions/VideoChannelInput'
763 responses: 1197 responses:
764 '204': 1198 '204':
765 $ref: "commons.yaml#/responses/emptySuccess" 1199 $ref: '#/paths/~1users~1me/put/responses/204'
766 "/video-channels/{id}": 1200 requestBody:
1201 $ref: '#/components/requestBodies/VideoChannelInput'
1202 '/video-channels/{id}':
767 get: 1203 get:
1204 summary: Get a video channel by its id
768 tags: 1205 tags:
769 - VideoChannel 1206 - Video Channel
770 consumes:
771 - application/json
772 produces:
773 - application/json
774 parameters: 1207 parameters:
775 - $ref: "video-channels.yaml#/parameters/id" 1208 - $ref: '#/components/parameters/id3'
776 responses: 1209 responses:
777 '200': 1210 '200':
778 description: successful operation 1211 description: successful operation
779 schema: 1212 content:
780 $ref: '#/definitions/VideoChannel' 1213 application/json:
1214 schema:
1215 $ref: '#/components/schemas/VideoChannel'
781 put: 1216 put:
1217 summary: Update a video channel by its id
782 security: 1218 security:
783 - OAuth2: [ ] 1219 - OAuth2: []
784 tags: 1220 tags:
785 - VideoChannel 1221 - Video Channel
786 consumes:
787 - application/json
788 produces:
789 - application/json
790 parameters: 1222 parameters:
791 - $ref: "video-channels.yaml#/parameters/id" 1223 - $ref: '#/components/parameters/id3'
792 - in: body
793 name: body
794 schema:
795 $ref: '#/definitions/VideoChannelInput'
796 responses: 1224 responses:
797 '204': 1225 '204':
798 $ref: "commons.yaml#/responses/emptySuccess" 1226 $ref: '#/paths/~1users~1me/put/responses/204'
1227 requestBody:
1228 $ref: '#/components/requestBodies/VideoChannelInput'
799 delete: 1229 delete:
1230 summary: Delete a video channel by its id
800 security: 1231 security:
801 - OAuth2: [ ] 1232 - OAuth2: []
802 tags: 1233 tags:
803 - VideoChannel 1234 - Video Channel
804 consumes:
805 - application/json
806 produces:
807 - application/json
808 parameters: 1235 parameters:
809 - $ref: "video-channels.yaml#/parameters/id" 1236 - $ref: '#/components/parameters/id3'
810 responses: 1237 responses:
811 '204': 1238 '204':
812 $ref: "commons.yaml#/responses/emptySuccess" 1239 $ref: '#/paths/~1users~1me/put/responses/204'
813 "/video-channels/{id}/videos": 1240 '/video-channels/{id}/videos':
814 get: 1241 get:
1242 summary: Get videos of a video channel by its id
815 tags: 1243 tags:
816 - VideoChannel 1244 - Video Channel
817 consumes:
818 - application/json
819 produces:
820 - application/json
821 parameters: 1245 parameters:
822 - $ref: "video-channels.yaml#/parameters/id" 1246 - $ref: '#/components/parameters/id3'
823 responses: 1247 responses:
824 '200': 1248 '200':
825 description: successful operation 1249 description: successful operation
826 schema: 1250 content:
827 $ref: '#/definitions/Video' 1251 application/json:
828 /accounts/{name}/video-channels: 1252 schema:
1253 $ref: '#/components/schemas/Video'
1254 '/accounts/{name}/video-channels':
829 get: 1255 get:
1256 summary: Get video channels of an account by its name
830 tags: 1257 tags:
831 - VideoChannel 1258 - Video Channel
832 consumes:
833 - application/json
834 produces:
835 - application/json
836 parameters: 1259 parameters:
837 - $ref: "accounts.yaml#/parameters/name" 1260 - $ref: '#/components/parameters/name'
838 responses: 1261 responses:
839 '200': 1262 '200':
840 description: successful operation 1263 description: successful operation
841 schema: 1264 content:
842 type: array 1265 application/json:
843 items: 1266 schema:
844 $ref: '#/definitions/VideoChannel' 1267 type: array
845 "/videos/{id}/comment-threads": 1268 items:
1269 $ref: '#/components/schemas/VideoChannel'
1270 '/videos/{id}/comment-threads':
846 get: 1271 get:
1272 summary: Get the comment threads of a video by its id
847 tags: 1273 tags:
848 - VideoComment 1274 - Video Comment
849 consumes:
850 - application/json
851 produces:
852 - application/json
853 parameters: 1275 parameters:
854 - $ref: "videos.yaml#/parameters/id" 1276 - $ref: '#/components/parameters/id2'
855 - $ref: "commons.yaml#/parameters/start" 1277 - $ref: '#/components/parameters/start'
856 - $ref: "commons.yaml#/parameters/count" 1278 - $ref: '#/components/parameters/count'
857 - $ref: "commons.yaml#/parameters/sort" 1279 - $ref: '#/components/parameters/sort'
858 responses: 1280 responses:
859 '200': 1281 '200':
860 description: successful operation 1282 description: successful operation
861 schema: 1283 content:
862 $ref: '#/definitions/CommentThreadResponse' 1284 application/json:
1285 schema:
1286 $ref: '#/components/schemas/CommentThreadResponse'
863 post: 1287 post:
1288 summary: 'Creates a comment thread, on a video by its id'
864 security: 1289 security:
865 - OAuth2: [ ] 1290 - OAuth2: []
866 tags: 1291 tags:
867 - VideoComment 1292 - Video Comment
868 consumes:
869 - application/json
870 produces:
871 - application/json
872 parameters: 1293 parameters:
873 - $ref: "videos.yaml#/parameters/id" 1294 - $ref: '#/components/parameters/id2'
874 responses: 1295 responses:
875 '200': 1296 '200':
876 description: successful operation 1297 description: successful operation
877 schema: 1298 content:
878 $ref: '#/definitions/CommentThreadPostResponse' 1299 application/json:
879 "/videos/{id}/comment-threads/{threadId}": 1300 schema:
1301 $ref: '#/components/schemas/CommentThreadPostResponse'
1302 '/videos/{id}/comment-threads/{threadId}':
880 get: 1303 get:
1304 summary: 'Get the comment thread by its id, of a video by its id'
881 tags: 1305 tags:
882 - VideoComment 1306 - Video Comment
883 consumes:
884 - application/json
885 produces:
886 - application/json
887 parameters: 1307 parameters:
888 - $ref: "videos.yaml#/parameters/id" 1308 - $ref: '#/components/parameters/id2'
889 - $ref: "video-comments.yaml#/parameters/threadId" 1309 - name: threadId
1310 in: path
1311 required: true
1312 description: The thread id (root comment id)
1313 schema:
1314 type: number
890 responses: 1315 responses:
891 '200': 1316 '200':
892 description: successful operation 1317 description: successful operation
893 schema: 1318 content:
894 $ref: '#/definitions/VideoCommentThreadTree' 1319 application/json:
895 "/videos/{id}/comments/{commentId}": 1320 schema:
1321 $ref: '#/components/schemas/VideoCommentThreadTree'
1322 '/videos/{id}/comments/{commentId}':
896 post: 1323 post:
1324 summary: 'Creates a comment in a comment thread by its id, of a video by its id'
897 security: 1325 security:
898 - OAuth2: [ ] 1326 - OAuth2: []
899 tags: 1327 tags:
900 - VideoComment 1328 - Video Comment
901 consumes:
902 - application/json
903 produces:
904 - application/json
905 parameters: 1329 parameters:
906 - $ref: "videos.yaml#/parameters/id" 1330 - $ref: '#/components/parameters/id2'
907 - $ref: "video-comments.yaml#/parameters/commentId" 1331 - $ref: '#/components/parameters/commentId'
908 responses: 1332 responses:
909 '200': 1333 '200':
910 description: successful operation 1334 description: successful operation
911 schema: 1335 content:
912 $ref: '#/definitions/CommentThreadPostResponse' 1336 application/json:
1337 schema:
1338 $ref: '#/components/schemas/CommentThreadPostResponse'
913 delete: 1339 delete:
1340 summary: 'Delete a comment in a comment therad by its id, of a video by its id'
914 security: 1341 security:
915 - OAuth2: [ ] 1342 - OAuth2: []
916 tags: 1343 tags:
917 - VideoComment 1344 - Video Comment
918 consumes:
919 - application/json
920 produces:
921 - application/json
922 parameters: 1345 parameters:
923 - $ref: "videos.yaml#/parameters/id" 1346 - $ref: '#/components/parameters/id2'
924 - $ref: "video-comments.yaml#/parameters/commentId" 1347 - $ref: '#/components/parameters/commentId'
925 responses: 1348 responses:
926 '204': 1349 '204':
927 $ref: "commons.yaml#/responses/emptySuccess" 1350 $ref: '#/paths/~1users~1me/put/responses/204'
928 "/videos/{id}/rate": 1351 '/videos/{id}/rate':
929 put: 1352 put:
1353 summary: Vote for a video by its id
930 security: 1354 security:
931 - OAuth2: [ ] 1355 - OAuth2: []
932 tags: 1356 tags:
933 - VideoRate 1357 - Video Rate
934 consumes:
935 - application/json
936 produces:
937 - application/json
938 parameters: 1358 parameters:
939 - $ref: "videos.yaml#/parameters/id" 1359 - $ref: '#/components/parameters/id2'
940 responses: 1360 responses:
941 '204': 1361 '204':
942 $ref: "commons.yaml#/responses/emptySuccess" 1362 $ref: '#/paths/~1users~1me/put/responses/204'
943 /search/videos: 1363 /search/videos:
944 get: 1364 get:
945 tags: 1365 tags:
946 - Search 1366 - Search
947 consumes: 1367 summary: Get the videos corresponding to a given query
948 - application/json
949 produces:
950 - application/json
951 parameters: 1368 parameters:
952 - $ref: "commons.yaml#/parameters/start" 1369 - $ref: '#/components/parameters/start'
953 - $ref: "commons.yaml#/parameters/count" 1370 - $ref: '#/components/parameters/count'
954 - $ref: "commons.yaml#/parameters/sort" 1371 - $ref: '#/components/parameters/videosSearchSort'
955 - name: search 1372 - name: search
956 in: query 1373 in: query
957 required: true 1374 required: true
958 type: string 1375 description: String to search
959 description: 'String to search' 1376 schema:
1377 type: string
960 responses: 1378 responses:
961 '200': 1379 '200':
962 description: successful operation 1380 description: successful operation
963 schema: 1381 content:
964 type: array 1382 application/json:
965 items: 1383 schema:
966 $ref: '#/definitions/Video' 1384 type: array
967definitions: 1385 items:
968 VideoConstantNumber: 1386 $ref: '#/components/schemas/Video'
969 properties: 1387servers:
970 id: 1388 - url: 'https://peertube.cpy.re/api/v1'
971 type: number 1389 description: Live Test Server (live data - stable version)
972 label: 1390 - url: 'https://peertube2.cpy.re/api/v1'
973 type: string 1391 description: Live Test Server (live data - bleeding edge version)
974 VideoConstantString: 1392 - url: 'https://peertube3.cpy.re/api/v1'
975 properties: 1393 description: Live Test Server (live data - bleeding edge version)
976 id: 1394components:
977 type: string 1395 parameters:
978 label: 1396 start:
979 type: string 1397 name: start
980 VideoPrivacy: 1398 in: query
981 type: string 1399 required: false
982 enum: [Public, Unlisted, Private] 1400 description: Offset
983 Video: 1401 schema:
984 properties:
985 id:
986 type: number
987 uuid:
988 type: string
989 createdAt:
990 type: string
991 publishedAt:
992 type: string
993 updatedAt:
994 type: string
995 category:
996 $ref: "#/definitions/VideoConstantNumber"
997 licence:
998 $ref: "#/definitions/VideoConstantNumber"
999 language:
1000 $ref: "#/definitions/VideoConstantString"
1001 privacy:
1002 $ref: "#/definitions/VideoPrivacy"
1003 description:
1004 type: string
1005 duration:
1006 type: number
1007 isLocal:
1008 type: boolean
1009 name:
1010 type: string
1011 thumbnailPath:
1012 type: string
1013 previewPath:
1014 type: string
1015 embedPath:
1016 type: string
1017 views:
1018 type: number 1402 type: number
1019 likes: 1403 count:
1404 name: count
1405 in: query
1406 required: false
1407 description: Number of items
1408 schema:
1020 type: number 1409 type: number
1021 dislikes: 1410 sort:
1411 name: sort
1412 in: query
1413 required: false
1414 description: Sort column (-createdAt for example)
1415 schema:
1416 type: string
1417 videosSort:
1418 name: sort
1419 in: query
1420 required: false
1421 description: Sort videos by criteria
1422 schema:
1423 type: string
1424 enum:
1425 - -name
1426 - -duration
1427 - -createdAt
1428 - -publishedAt
1429 - -views
1430 - -likes
1431 - -trending
1432 videosSearchSort:
1433 name: sort
1434 in: query
1435 required: false
1436 description: Sort videos by criteria
1437 schema:
1438 type: string
1439 enum:
1440 - -name
1441 - -duration
1442 - -createdAt
1443 - -publishedAt
1444 - -views
1445 - -likes
1446 - -match
1447 blacklistsSort:
1448 name: sort
1449 in: query
1450 required: false
1451 description: Sort blacklists by criteria
1452 schema:
1453 type: string
1454 enum:
1455 - -id
1456 - -name
1457 - -duration
1458 - -views
1459 - -likes
1460 - -dislikes
1461 - -uuid
1462 - -createdAt
1463 usersSort:
1464 name: sort
1465 in: query
1466 required: false
1467 description: Sort users by criteria
1468 schema:
1469 type: string
1470 enum:
1471 - -id
1472 - -username
1473 - -createdAt
1474 abusesSort:
1475 name: sort
1476 in: query
1477 required: false
1478 description: Sort abuses by criteria
1479 schema:
1480 type: string
1481 enum:
1482 - -id
1483 - -createdAt
1484 - -state
1485 name:
1486 name: name
1487 in: path
1488 required: true
1489 description: >-
1490 The name of the account (chocobozzz or chocobozzz@peertube.cpy.re for
1491 example)
1492 schema:
1493 type: string
1494 id:
1495 name: id
1496 in: path
1497 required: true
1498 description: The user id
1499 schema:
1022 type: number 1500 type: number
1023 nsfw: 1501 id2:
1024 type: boolean 1502 name: id
1025 account: 1503 in: path
1026 type: object 1504 required: true
1027 properties: 1505 description: The video id or uuid
1028 name: 1506 schema:
1029 type: string 1507 type: string
1030 displayName: 1508 id3:
1031 type: string 1509 name: id
1032 url: 1510 in: path
1033 type: string 1511 required: true
1034 host: 1512 description: The video channel id or uuid
1035 type: string 1513 schema:
1036 avatar: 1514 type: string
1037 $ref: "#/definitions/Avatar" 1515 commentId:
1038 VideoAbuse: 1516 name: threadId
1039 properties: 1517 in: path
1040 id: 1518 required: true
1519 description: The comment id
1520 schema:
1041 type: number 1521 type: number
1042 reason: 1522 categoryOneOf:
1043 type: string 1523 name: categoryOneOf
1044 reporterAccount: 1524 in: query
1045 $ref: "#/definitions/Account" 1525 required: false
1046 video: 1526 description: category id of the video
1047 type: object 1527 schema:
1048 properties: 1528 oneOf:
1049 id: 1529 - type: number
1530 - type: array
1531 items:
1050 type: number 1532 type: number
1051 name: 1533 style: form
1534 explode: false
1535 tagsOneOf:
1536 name: tagsOneOf
1537 in: query
1538 required: false
1539 description: tag(s) of the video
1540 schema:
1541 oneOf:
1542 - type: string
1543 - type: array
1544 items:
1052 type: string 1545 type: string
1053 uuid: 1546 style: form
1547 explode: false
1548 tagsAllOf:
1549 name: tagsAllOf
1550 in: query
1551 required: false
1552 description: tag(s) of the video, where all should be present in the video
1553 schema:
1554 oneOf:
1555 - type: string
1556 - type: array
1557 items:
1054 type: string 1558 type: string
1055 url: 1559 style: form
1560 explode: false
1561 languageOneOf:
1562 name: languageOneOf
1563 in: query
1564 required: false
1565 description: language id of the video
1566 schema:
1567 oneOf:
1568 - type: string
1569 - type: array
1570 items:
1056 type: string 1571 type: string
1057 createdAt: 1572 style: form
1058 type: string 1573 explode: false
1059 VideoBlacklist: 1574 licenceOneOf:
1060 properties: 1575 name: licenceOneOf
1061 id: 1576 in: query
1062 type: number 1577 required: false
1063 videoId: 1578 description: licence id of the video
1064 type: number 1579 schema:
1065 createdAt: 1580 oneOf:
1066 type: string 1581 - type: number
1067 updatedAt: 1582 - type: array
1068 type: string 1583 items:
1069 name:
1070 type: string
1071 uuid:
1072 type: string
1073 description:
1074 type: string
1075 duration:
1076 type: number
1077 views:
1078 type: number
1079 likes:
1080 type: number
1081 dislikes:
1082 type: number
1083 nsfw:
1084 type: boolean
1085 VideoChannel:
1086 properties:
1087 displayName:
1088 type: string
1089 description:
1090 type: string
1091 isLocal:
1092 type: boolean
1093 ownerAccount:
1094 type: object
1095 properties:
1096 id:
1097 type: number 1584 type: number
1098 uuid: 1585 style: form
1099 type: string 1586 explode: false
1100 VideoComment: 1587 nsfw:
1101 properties: 1588 name: nsfw
1102 id: 1589 in: query
1103 type: number 1590 required: false
1104 url: 1591 description: whether to include nsfw videos, if any
1105 type: string 1592 schema:
1106 text: 1593 type: string
1107 type: string 1594 enum:
1108 threadId: 1595 - 'true'
1109 type: number 1596 - 'false'
1110 inReplyToCommentId: 1597 filter:
1111 type: number 1598 name: filter
1112 videoId: 1599 in: query
1113 type: number 1600 required: false
1114 createdAt: 1601 description: >
1115 type: string 1602 Special filters (local for instance) which might require special rights:
1116 updatedAt: 1603 * `local` - only videos local to the instance
1117 type: string 1604 * `all-local` - only videos local to the instance, but showing private and unlisted videos (requires Admin privileges)
1118 totalReplies: 1605 schema:
1119 type: number 1606 type: string
1120 account: 1607 enum:
1121 $ref: "#/definitions/Account" 1608 - local
1122 VideoCommentThreadTree: 1609 - all-local
1123 properties: 1610 subscriptionsUris:
1124 comment: 1611 name: uris
1125 $ref: "#/definitions/VideoComment" 1612 in: query
1126 children: 1613 required: true
1614 description: list of uris to check if each is part of the user subscriptions
1615 schema:
1127 type: array 1616 type: array
1128 items: 1617 items:
1129 $ref: "#/definitions/VideoCommentThreadTree" 1618 type: string
1130 Avatar: 1619 requestBodies:
1131 properties: 1620 VideoChannelInput:
1132 path: 1621 content:
1133 type: string 1622 application/json:
1134 createdAt: 1623 schema:
1135 type: string 1624 $ref: '#/components/schemas/VideoChannelInput'
1136 updatedAt: 1625 securitySchemes:
1137 type: string 1626 OAuth2:
1138 Actor: 1627 description: >
1139 properties: 1628 In the header: *Authorization: Bearer <token\>*
1140 id: 1629
1141 type: number 1630
1142 uuid: 1631 Authenticating via OAuth requires the following steps:
1143 type: string 1632
1144 url: 1633
1145 type: string 1634 - Have an account with sufficient authorization levels
1146 name: 1635
1147 type: string 1636 - [Generate](https://docs.joinpeertube.org/lang/en/devdocs/rest.html) a
1148 host: 1637 Bearer Token
1149 type: string 1638
1150 followingCount: 1639 - Make Authenticated Requests
1151 type: number 1640 type: oauth2
1152 followersCount: 1641 flows:
1153 type: number 1642 password:
1154 createdAt: 1643 tokenUrl: 'https://peertube.example.com/api/v1/users/token'
1155 type: string 1644 scopes:
1156 updatedAt: 1645 admin: Admin scope
1157 type: string 1646 moderator: Moderator scope
1158 avatar: 1647 user: User scope
1159 $ref: "#/definitions/Avatar" 1648 schemas:
1160 Account: 1649 VideoConstantNumber:
1161 allOf: 1650 properties:
1162 - $ref: "#/definitions/Actor" 1651 id:
1163 - properties: 1652 type: number
1164 displayName: 1653 label:
1165 type: string 1654 type: string
1166 User: 1655 VideoConstantString:
1167 properties: 1656 properties:
1168 id: 1657 id:
1169 type: number 1658 type: string
1170 username: 1659 label:
1171 type: string 1660 type: string
1172 email: 1661 VideoPrivacy:
1173 type: string 1662 type: string
1174 displayNSFW: 1663 enum:
1175 type: boolean 1664 - Public
1176 autoPlayVideo: 1665 - Unlisted
1177 type: boolean 1666 - Private
1178 role: 1667 Video:
1179 type: string 1668 properties:
1180 enum: [User, Moderator, Administrator] 1669 id:
1181 videoQuota: 1670 type: number
1182 type: number 1671 uuid:
1183 createdAt: 1672 type: string
1184 type: string 1673 createdAt:
1185 account: 1674 type: string
1186 $ref: "#/definitions/Account" 1675 publishedAt:
1187 videoChannels: 1676 type: string
1188 type: array 1677 updatedAt:
1189 items: 1678 type: string
1190 $ref: "#/definitions/VideoChannel" 1679 category:
1191 ServerConfig: 1680 $ref: '#/components/schemas/VideoConstantNumber'
1192 properties: 1681 licence:
1193 signup: 1682 $ref: '#/components/schemas/VideoConstantNumber'
1194 type: object 1683 language:
1195 properties: 1684 $ref: '#/components/schemas/VideoConstantString'
1196 allowed: 1685 privacy:
1197 type: boolean 1686 $ref: '#/components/schemas/VideoPrivacy'
1198 transcoding: 1687 description:
1199 type: object 1688 type: string
1200 properties: 1689 duration:
1201 enabledResolutions: 1690 type: number
1202 type: array 1691 isLocal:
1203 items: 1692 type: boolean
1693 name:
1694 type: string
1695 thumbnailPath:
1696 type: string
1697 previewPath:
1698 type: string
1699 embedPath:
1700 type: string
1701 views:
1702 type: number
1703 likes:
1704 type: number
1705 dislikes:
1706 type: number
1707 nsfw:
1708 type: boolean
1709 account:
1710 type: object
1711 properties:
1712 name:
1713 type: string
1714 displayName:
1715 type: string
1716 url:
1717 type: string
1718 host:
1719 type: string
1720 avatar:
1721 $ref: '#/components/schemas/Avatar'
1722 VideoAbuse:
1723 properties:
1724 id:
1725 type: number
1726 reason:
1727 type: string
1728 reporterAccount:
1729 $ref: '#/components/schemas/Account'
1730 video:
1731 type: object
1732 properties:
1733 id:
1204 type: number 1734 type: number
1205 avatar: 1735 name:
1206 type: object
1207 properties:
1208 file:
1209 type: object
1210 properties:
1211 size:
1212 type: object
1213 properties:
1214 max:
1215 type: number
1216 extensions:
1217 type: array
1218 items:
1219 type: string 1736 type: string
1220 video: 1737 uuid:
1221 type: object 1738 type: string
1222 properties: 1739 url:
1223 file: 1740 type: string
1224 type: object 1741 createdAt:
1225 properties: 1742 type: string
1226 extensions: 1743 VideoBlacklist:
1227 type: array 1744 properties:
1228 items: 1745 id:
1229 type: string 1746 type: number
1230 Follow: 1747 videoId:
1231 properties: 1748 type: number
1232 id: 1749 createdAt:
1233 type: number 1750 type: string
1234 follower: 1751 updatedAt:
1235 $ref: "#/definitions/Actor" 1752 type: string
1236 following: 1753 name:
1237 $ref: "#/definitions/Actor" 1754 type: string
1238 score: 1755 uuid:
1239 type: number 1756 type: string
1240 state: 1757 description:
1241 type: string 1758 type: string
1242 enum: [pending, accepted] 1759 duration:
1243 createdAt: 1760 type: number
1244 type: string 1761 views:
1245 updatedAt: 1762 type: number
1246 type: string 1763 likes:
1247 Job: 1764 type: number
1248 properties: 1765 dislikes:
1249 id: 1766 type: number
1250 type: number 1767 nsfw:
1251 state: 1768 type: boolean
1252 type: string 1769 VideoChannel:
1253 enum: [pending, processing, error, success] 1770 properties:
1254 category: 1771 displayName:
1255 type: string 1772 type: string
1256 enum: [transcoding, activitypub-http] 1773 description:
1257 handlerName: 1774 type: string
1258 type: string 1775 isLocal:
1259 handlerInputData: 1776 type: boolean
1260 type: string 1777 ownerAccount:
1261 createdAt: 1778 type: object
1262 type: string 1779 properties:
1263 updatedAt: 1780 id:
1264 type: string 1781 type: number
1265 1782 uuid:
1266# Api responses 1783 type: string
1267 AddUserResponse: 1784 VideoComment:
1268 properties: 1785 properties:
1269 id: 1786 id:
1270 type: number 1787 type: number
1271 uuid: 1788 url:
1272 type: string 1789 type: string
1273 VideoUploadResponse: 1790 text:
1274 properties: 1791 type: string
1275 video: 1792 threadId:
1276 type: object 1793 type: number
1277 properties: 1794 inReplyToCommentId:
1278 id: 1795 type: number
1279 type: number 1796 videoId:
1280 uuid: 1797 type: number
1281 type: string 1798 createdAt:
1282 CommentThreadResponse: 1799 type: string
1283 properties: 1800 updatedAt:
1284 total: 1801 type: string
1285 type: number 1802 totalReplies:
1286 data: 1803 type: number
1287 type: array 1804 account:
1288 items: 1805 $ref: '#/components/schemas/Account'
1289 $ref: "#/definitions/VideoComment" 1806 VideoCommentThreadTree:
1290 CommentThreadPostResponse: 1807 properties:
1291 properties: 1808 comment:
1292 comment: 1809 $ref: '#/components/schemas/VideoComment'
1293 $ref: "#/definitions/VideoComment" 1810 children:
1811 type: array
1812 items:
1813 $ref: '#/components/schemas/VideoCommentThreadTree'
1814 Avatar:
1815 properties:
1816 path:
1817 type: string
1818 createdAt:
1819 type: string
1820 updatedAt:
1821 type: string
1822 Actor:
1823 properties:
1824 id:
1825 type: number
1826 uuid:
1827 type: string
1828 url:
1829 type: string
1830 name:
1831 type: string
1832 host:
1833 type: string
1834 followingCount:
1835 type: number
1836 followersCount:
1837 type: number
1838 createdAt:
1839 type: string
1840 updatedAt:
1841 type: string
1842 avatar:
1843 $ref: '#/components/schemas/Avatar'
1844 Account:
1845 allOf:
1846 - $ref: '#/components/schemas/Actor'
1847 - properties:
1848 displayName:
1849 type: string
1850 User:
1851 properties:
1852 id:
1853 type: number
1854 username:
1855 type: string
1856 email:
1857 type: string
1858 displayNSFW:
1859 type: boolean
1860 autoPlayVideo:
1861 type: boolean
1862 role:
1863 type: string
1864 enum:
1865 - User
1866 - Moderator
1867 - Administrator
1868 videoQuota:
1869 type: number
1870 createdAt:
1871 type: string
1872 account:
1873 $ref: '#/components/schemas/Account'
1874 videoChannels:
1875 type: array
1876 items:
1877 $ref: '#/components/schemas/VideoChannel'
1878 UserWatchingVideo:
1879 properties:
1880 currentTime:
1881 type: number
1882 ServerConfig:
1883 properties:
1884 signup:
1885 type: object
1886 properties:
1887 allowed:
1888 type: boolean
1889 transcoding:
1890 type: object
1891 properties:
1892 enabledResolutions:
1893 type: array
1894 items:
1895 type: number
1896 avatar:
1897 type: object
1898 properties:
1899 file:
1900 type: object
1901 properties:
1902 size:
1903 type: object
1904 properties:
1905 max:
1906 type: number
1907 extensions:
1908 type: array
1909 items:
1910 type: string
1911 video:
1912 type: object
1913 properties:
1914 file:
1915 type: object
1916 properties:
1917 extensions:
1918 type: array
1919 items:
1920 type: string
1921 Follow:
1922 properties:
1923 id:
1924 type: number
1925 follower:
1926 $ref: '#/components/schemas/Actor'
1927 following:
1928 $ref: '#/components/schemas/Actor'
1929 score:
1930 type: number
1931 state:
1932 type: string
1933 enum:
1934 - pending
1935 - accepted
1936 createdAt:
1937 type: string
1938 updatedAt:
1939 type: string
1940 Job:
1941 properties:
1942 id:
1943 type: number
1944 state:
1945 type: string
1946 enum:
1947 - pending
1948 - processing
1949 - error
1950 - success
1951 category:
1952 type: string
1953 enum:
1954 - transcoding
1955 - activitypub-http
1956 handlerName:
1957 type: string
1958 handlerInputData:
1959 type: string
1960 createdAt:
1961 type: string
1962 updatedAt:
1963 type: string
1964 AddUserResponse:
1965 properties:
1966 id:
1967 type: number
1968 uuid:
1969 type: string
1970 VideoUploadResponse:
1971 properties:
1972 video:
1973 type: object
1974 properties:
1975 id:
1976 type: number
1977 uuid:
1978 type: string
1979 CommentThreadResponse:
1980 properties:
1981 total:
1982 type: number
1983 data:
1984 type: array
1985 items:
1986 $ref: '#/components/schemas/VideoComment'
1987 CommentThreadPostResponse:
1988 properties:
1989 comment:
1990 $ref: '#/components/schemas/VideoComment'
1991 AddUser:
1992 properties:
1993 username:
1994 type: string
1995 description: 'The user username '
1996 password:
1997 type: string
1998 description: 'The user password '
1999 email:
2000 type: string
2001 description: 'The user email '
2002 videoQuota:
2003 type: string
2004 description: 'The user videoQuota '
2005 role:
2006 type: integer
2007 format: int32
2008 enum:
2009 - 0
2010 - 1
2011 - 2
2012 description: 'The user role '
2013 required:
2014 - username
2015 - password
2016 - email
2017 - videoQuota
2018 - role
2019 UpdateUser:
2020 properties:
2021 id:
2022 type: string
2023 description: 'The user id '
2024 email:
2025 type: string
2026 description: 'The updated email of the user '
2027 videoQuota:
2028 type: string
2029 description: 'The updated videoQuota of the user '
2030 role:
2031 type: string
2032 description: 'The updated role of the user '
2033 required:
2034 - id
2035 - email
2036 - videoQuota
2037 - role
2038 UpdateMe:
2039 properties:
2040 password:
2041 type: string
2042 description: 'Your new password '
2043 email:
2044 type: string
2045 description: 'Your new email '
2046 displayNSFW:
2047 type: string
2048 description: 'Your new displayNSFW '
2049 autoPlayVideo:
2050 type: string
2051 description: 'Your new autoPlayVideo '
2052 required:
2053 - password
2054 - email
2055 - displayNSFW
2056 - autoPlayVideo
2057 GetMeVideoRating:
2058 properties:
2059 id:
2060 type: string
2061 description: 'Id of the video '
2062 rating:
2063 type: number
2064 description: 'Rating of the video '
2065 required:
2066 - id
2067 - rating
2068 RegisterUser:
2069 properties:
2070 username:
2071 type: string
2072 description: 'The username of the user '
2073 password:
2074 type: string
2075 description: 'The password of the user '
2076 email:
2077 type: string
2078 description: 'The email of the user '
2079 required:
2080 - username
2081 - password
2082 - email
2083 VideoChannelInput:
2084 properties:
2085 name:
2086 type: string
2087 description:
2088 type: string
1294 2089
1295# Request bodies
1296 AddUser:
1297 properties:
1298 username:
1299 type: string
1300 description: 'The user username '
1301 password:
1302 type: string
1303 description: 'The user password '
1304 email:
1305 type: string
1306 description: 'The user email '
1307 videoQuota:
1308 type: string
1309 description: 'The user videoQuota '
1310 role:
1311 type: string
1312 description: 'The user role '
1313 required:
1314 - username
1315 - password
1316 - email
1317 - videoQuota
1318 - role
1319 UpdateUser:
1320 properties:
1321 id:
1322 type: string
1323 description: 'The user id '
1324 email:
1325 type: string
1326 description: 'The updated email of the user '
1327 videoQuota:
1328 type: string
1329 description: 'The updated videoQuota of the user '
1330 role:
1331 type: string
1332 description: 'The updated role of the user '
1333 required:
1334 - id
1335 - email
1336 - videoQuota
1337 - role
1338 UpdateMe:
1339 properties:
1340 password:
1341 type: string
1342 description: 'Your new password '
1343 email:
1344 type: string
1345 description: 'Your new email '
1346 displayNSFW:
1347 type: string
1348 description: 'Your new displayNSFW '
1349 autoPlayVideo:
1350 type: string
1351 description: 'Your new autoPlayVideo '
1352 required:
1353 - password
1354 - email
1355 - displayNSFW
1356 - autoPlayVideo
1357 GetMeVideoRating:
1358 properties:
1359 id:
1360 type: string
1361 description: 'Id of the video '
1362 rating:
1363 type: number
1364 description: 'Rating of the video '
1365 required:
1366 - id
1367 - rating
1368 RegisterUser:
1369 properties:
1370 username:
1371 type: string
1372 description: 'The username of the user '
1373 password:
1374 type: string
1375 description: 'The password of the user '
1376 email:
1377 type: string
1378 description: 'The email of the user '
1379 required:
1380 - username
1381 - password
1382 - email
1383 VideoChannelInput:
1384 properties:
1385 name:
1386 type: string
1387 description:
1388 type: string \ No newline at end of file
diff --git a/support/doc/api/quickstart.md b/support/doc/api/quickstart.md
index 844248a7f..00874a1c9 100644
--- a/support/doc/api/quickstart.md
+++ b/support/doc/api/quickstart.md
@@ -6,13 +6,13 @@
6 6
7Some endpoints need authentication. We use OAuth 2.0 so first fetch the client tokens: 7Some endpoints need authentication. We use OAuth 2.0 so first fetch the client tokens:
8 8
9``` 9```bash
10$ curl https://peertube.example.com/api/v1/oauth-clients/local 10$ curl https://peertube.example.com/api/v1/oauth-clients/local
11``` 11```
12 12
13Response example: 13Response example:
14 14
15``` 15```json
16{ 16{
17 "client_id": "v1ikx5hnfop4mdpnci8nsqh93c45rldf", 17 "client_id": "v1ikx5hnfop4mdpnci8nsqh93c45rldf",
18 "client_secret": "AjWiOapPltI6EnsWQwlFarRtLh4u8tDt" 18 "client_secret": "AjWiOapPltI6EnsWQwlFarRtLh4u8tDt"
@@ -23,7 +23,7 @@ Response example:
23 23
24Now you can fetch the user token: 24Now you can fetch the user token:
25 25
26``` 26```bash
27$ curl -X POST \ 27$ curl -X POST \
28 -d "client_id=v1ikx5hnfop4mdpnci8nsqh93c45rldf&client_secret=AjWiOapPltI6EnsWQwlFarRtLh4u8tDt&grant_type=password&response_type=code&username=your_user&password=your_password" \ 28 -d "client_id=v1ikx5hnfop4mdpnci8nsqh93c45rldf&client_secret=AjWiOapPltI6EnsWQwlFarRtLh4u8tDt&grant_type=password&response_type=code&username=your_user&password=your_password" \
29 https://peertube.example.com/api/v1/users/token 29 https://peertube.example.com/api/v1/users/token
@@ -31,7 +31,7 @@ $ curl -X POST \
31 31
32Response example: 32Response example:
33 33
34``` 34```json
35{ 35{
36 "access_token": "90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0", 36 "access_token": "90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0",
37 "token_type": "Bearer", 37 "token_type": "Bearer",
@@ -42,13 +42,13 @@ Response example:
42 42
43Just use the `access_token` in the `Authorization` header: 43Just use the `access_token` in the `Authorization` header:
44 44
45``` 45```bash
46$ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https://peertube.example.com/api/v1/jobs/complete 46$ curl -H 'Authorization: Bearer 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0' https://peertube.example.com/api/v1/jobs/completed
47``` 47```
48 48
49 49
50### List videos 50### List videos
51 51
52``` 52```bash
53$ curl https://peertube.example.com/api/v1/videos 53$ curl https://peertube.example.com/api/v1/videos
54``` \ No newline at end of file 54```
diff --git a/support/doc/api/users.yaml b/support/doc/api/users.yaml
deleted file mode 100644
index 84e963261..000000000
--- a/support/doc/api/users.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
1parameters:
2 id:
3 name: id
4 in: path
5 required: true
6 type: number
7 description: 'The user id' \ No newline at end of file
diff --git a/support/doc/api/video-channels.yaml b/support/doc/api/video-channels.yaml
deleted file mode 100644
index bbfffc81f..000000000
--- a/support/doc/api/video-channels.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
1parameters:
2 id:
3 name: id
4 in: path
5 required: true
6 type: string
7 description: 'The video channel id or uuid' \ No newline at end of file
diff --git a/support/doc/api/video-comments.yaml b/support/doc/api/video-comments.yaml
deleted file mode 100644
index 0085eccbc..000000000
--- a/support/doc/api/video-comments.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
1parameters:
2 threadId:
3 name: threadId
4 in: path
5 required: true
6 type: number
7 description: 'The thread id (root comment id)'
8 commentId:
9 name: threadId
10 in: path
11 required: true
12 type: number
13 description: 'The comment id' \ No newline at end of file
diff --git a/support/doc/api/videos.yaml b/support/doc/api/videos.yaml
deleted file mode 100644
index 0c611e3a8..000000000
--- a/support/doc/api/videos.yaml
+++ /dev/null
@@ -1,92 +0,0 @@
1parameters:
2 id:
3 name: id
4 in: path
5 required: true
6 type: string
7 description: 'The video id or uuid'
8 thumbnailfile:
9 name: thumbnailfile
10 in: formData
11 type: file
12 description: 'Video thumbnail file'
13 previewfile:
14 name: previewfile
15 in: formData
16 type: file
17 description: 'Video preview file'
18 category:
19 name: category
20 in: formData
21 type: number
22 description: 'Video category'
23 licence:
24 name: licence
25 in: formData
26 type: number
27 description: 'Video licence'
28 language:
29 name: language
30 in: formData
31 type: string
32 description: 'Video language'
33 description:
34 name: description
35 in: formData
36 type: string
37 description: 'Video description'
38 waitTranscoding:
39 name: waitTranscoding
40 in: formData
41 type: boolean
42 description: 'Whether or not we wait transcoding before publish the video'
43 support:
44 name: support
45 in: formData
46 type: string
47 description: 'Text describing how to support the video uploader'
48 nsfw:
49 name: nsfw
50 in: formData
51 type: boolean
52 description: 'Whether or not this video contains sensitive content'
53 name:
54 name: name
55 in: formData
56 type: string
57 description: 'Video name'
58 tags:
59 name: tags
60 in: formData
61 type: string[]
62 description: 'Video tags'
63 commentsEnabled:
64 name: commentsEnabled
65 in: formData
66 type: boolean
67 description: 'Enable or disable comments for this video'
68 downloadEnabled:
69 name: downloadEnabled
70 in: formData
71 type: boolean
72 description: 'Enable or disable downloading for this video'
73 privacy:
74 name: privacy
75 in: formData
76 type: string
77 enum: [Public, Unlisted]
78 description: 'Video privacy'
79 scheduleUpdate:
80 name: scheduleUpdate
81 in: formData
82 required: false
83 description: 'Schedule an update at a specific datetime'
84 properties:
85 updateAt:
86 type: dateTime
87 description: 'When to update the video'
88 required: true
89 privacy:
90 type: string
91 enum: [Public, Unlisted]
92 description: 'Video privacy target'
diff --git a/support/doc/development/server/code.md b/support/doc/development/server/code.md
index e9ab7373c..3894c2542 100644
--- a/support/doc/development/server/code.md
+++ b/support/doc/development/server/code.md
@@ -41,18 +41,18 @@ Uses [JavaScript Standard Style](http://standardjs.com/).
41 41
42The server is composed by: 42The server is composed by:
43 43
44 * a REST API (Express framework) 44 * a REST API (relying on the Express framework) documented on http://docs.joinpeertube.org/api.html
45 * a WebTorrent Tracker 45 * a WebTorrent Tracker (slightly custom version of [webtorrent/bittorrent-tracker](https://github.com/webtorrent/bittorrent-tracker#server))
46 46
47A video is seeded by the server with the [WebSeed](http://www.bittorrent.org/beps/bep_0019.html) protocol (HTTP). 47A video is seeded by the server with the [WebSeed](http://www.bittorrent.org/beps/bep_0019.html) protocol (HTTP).
48 48
49![Architecture scheme](/support/doc/development/server/upload-video.png) 49![Architecture scheme](/support/doc/development/server/upload-video.png)
50 50
51When a user uploads a video, the rest API create the torrent file and then adds it to its database. 51When a user uploads a video, the REST API creates the torrent file and then adds it to its database.
52 52
53If a user wants to watch the video, the tracker will indicate all other users that are watching the video + the HTTP url for the WebSeed. 53If a user wants to watch the video, the tracker will indicate all other users that are watching the video + the HTTP url for the WebSeed.
54 54
55## Newcomers 55## Newcomers
56 56
57The server entrypoint is [server.ts](/server.ts). You can begin to look at this file. 57The server entrypoint is [server.ts](/server.ts). Looking at this file is a good start.
58Then you can try to understand the [controllers](/server/controllers): they are the entrypoint of each API request. 58Then you can try to understand the [controllers](/server/controllers): they are the entrypoints of each API request.
diff --git a/support/doc/docker.md b/support/doc/docker.md
index cab336344..c20746486 100644
--- a/support/doc/docker.md
+++ b/support/doc/docker.md
@@ -63,7 +63,6 @@ Pull the latest images and rerun PeerTube:
63 63
64```shell 64```shell
65$ cd /your/peertube/directory 65$ cd /your/peertube/directory
66$ docker-compose down
67$ docker-compose pull 66$ docker-compose pull
68$ docker-compose up -d 67$ docker-compose up -d
69``` 68```
diff --git a/support/doc/production.md b/support/doc/production.md
index 35c7de3b5..16efe17c4 100644
--- a/support/doc/production.md
+++ b/support/doc/production.md
@@ -185,9 +185,8 @@ $ sudo journalctl -feu peertube
185On FreeBSD, copy the startup script and update rc.conf: 185On FreeBSD, copy the startup script and update rc.conf:
186 186
187``` 187```
188$ sudo cp /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/ 188$ sudo install -m 0555 /var/www/peertube/peertube-latest/support/freebsd/peertube /usr/local/etc/rc.d/
189$ sudo chmod +x /usr/local/etc/rc.d/peertube 189$ sudo sysrc peertube_enable="YES"
190$ sudo echo peertube_enable="YES" >> /etc/rc.conf
191``` 190```
192 191
193Run: 192Run:
diff --git a/support/doc/redundancy.md b/support/doc/redundancy.md
deleted file mode 100644
index 00442fd85..000000000
--- a/support/doc/redundancy.md
+++ /dev/null
@@ -1,52 +0,0 @@
1# Redundancy
2
3A PeerTube instance can cache other PeerTube videos to improve bandwidth of popular videos or small instances.
4
5## How it works
6
7The instance administrator can choose between multiple redundancy strategies (cache trending videos or recently uploaded videos etc), set their maximum size and the minimum duplication lifetime.
8Then, they choose the instances they want to cache in `Manage follows -> Following` admin table.
9
10<p align="center">
11
12<img src="user/redundancy.png" alt="Redundancy" />
13
14</p>
15
16Videos are kept in the cache for at least `min_lifetime`, and then evicted when the cache is full.
17
18When PeerTube chooses a video to duplicate, it imports all the resolution files (to avoid consistency issues) using their magnet URI and put them in the `storage.videos` directory.
19Then it sends a `Create -> CacheFile` ActivityPub message to other federated instances. This new instance is injected as [WebSeed](https://github.com/Chocobozzz/PeerTube/blob/develop/FAQ.md#what-is-webseed) in the magnet URI by instances that received this ActivityPub message.
20
21## Stats
22
23See the `/api/v1/server/stats` endpoint. For example:
24
25```
26{
27 ...
28 "videosRedundancy": [
29 {
30 "totalUsed": 0,
31 "totalVideos": 0,
32 "totalVideoFiles": 0,
33 "strategy": "most-views",
34 "totalSize": 104857600
35 },
36 {
37 "totalUsed": 0,
38 "totalVideos": 0,
39 "totalVideoFiles": 0,
40 "strategy": "trending",
41 "totalSize": 104857600
42 },
43 {
44 "totalUsed": 0,
45 "totalVideos": 0,
46 "totalVideoFiles": 0,
47 "strategy": "recently-added",
48 "totalSize": 104857600
49 }
50 ]
51}
52```
diff --git a/support/doc/tools.md b/support/doc/tools.md
index 1db29edc0..1a9ba7d2b 100644
--- a/support/doc/tools.md
+++ b/support/doc/tools.md
@@ -1,18 +1,66 @@
1# CLI tools guide 1# CLI tools guide
2 - [CLI wrapper](#cli-wrapper)
3 - [Remote tools](#remote-tools)
4 - [peertube-import-videos.js](#peertube-import-videosjs)
5 - [peertube-upload.js](#peertube-uploadjs)
6 - [peertube-watch.js](#peertube-watch)
7 - [Server tools](#server-tools)
8 - [parse-log](#parse-log)
9 - [create-transcoding-job.js](#create-transcoding-jobjs)
10 - [create-import-video-file-job.js](#create-import-video-file-jobjs)
11 - [prune-storage.js](#prune-storagejs)
12 2
13## CLI wrapper 3<!-- START doctoc generated TOC please keep comment here to allow auto update -->
4<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
5**Table of Contents**
6
7- [Remote Tools](#remote-tools)
8 - [Dependencies](#dependencies)
9 - [Installation](#installation)
10 - [CLI wrapper](#cli-wrapper)
11 - [peertube-import-videos.js](#peertube-import-videosjs)
12 - [peertube-upload.js](#peertube-uploadjs)
13 - [peertube-watch.js](#peertube-watchjs)
14- [Server tools](#server-tools)
15 - [parse-log](#parse-log)
16 - [create-transcoding-job.js](#create-transcoding-jobjs)
17 - [create-import-video-file-job.js](#create-import-video-file-jobjs)
18 - [prune-storage.js](#prune-storagejs)
19 - [optimize-old-videos.js](#optimize-old-videosjs)
20 - [update-host.js](#update-hostjs)
21 - [REPL (Read Eval Print Loop)](#repl-read-eval-print-loop)
22 - [.help](#help)
23 - [Lodash example](#lodash-example)
24 - [YoutubeDL example](#youtubedl-example)
25 - [Models examples](#models-examples)
26
27<!-- END doctoc generated TOC please keep comment here to allow auto update -->
14 28
15The wrapper provides a convenient interface to most scripts, and requires the [same dependencies](#dependencies). You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="node ${PEERTUBE_PATH}/dist/server/tools/peertube.js"`: 29## Remote Tools
30
31You need at least 512MB RAM to run the script.
32Scripts can be launched directly from a PeerTube server, or from a separate server, even a desktop PC.
33You need to follow all the following steps even if you are on a PeerTube server (including cloning the git repository in a different directory than your production installation because the scripts utilize non-production dependencies).
34
35### Dependencies
36
37Install the [PeerTube dependencies](dependencies.md).
38
39### Installation
40
41Clone the PeerTube repo to get the latest version (even if you are on your PeerTube server):
42
43```
44$ git clone https://github.com/Chocobozzz/PeerTube.git
45$ CLONE="$(pwd)/PeerTube"
46```
47
48Run ``yarn install --pure-lockfile``
49```
50$ cd ${CLONE}
51$ yarn install --pure-lockfile
52```
53
54Build server tools:
55```
56$ cd ${CLONE}
57$ npm run build:server
58```
59
60### CLI wrapper
61
62The wrapper provides a convenient interface to the following scripts.
63You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="cd /your/peertube/directory/ && node ./dist/server/tools/peertube.js"` (you have to keep the `cd` command):
16 64
17``` 65```
18 Usage: peertube [command] [options] 66 Usage: peertube [command] [options]
@@ -28,18 +76,19 @@ The wrapper provides a convenient interface to most scripts, and requires the [s
28 upload|up upload a video 76 upload|up upload a video
29 import-videos|import import a video from a streaming platform 77 import-videos|import import a video from a streaming platform
30 watch|w watch a video in the terminal ✩°。⋆ 78 watch|w watch a video in the terminal ✩°。⋆
79 repl initiate a REPL to access internals
31 help [cmd] display help for [cmd] 80 help [cmd] display help for [cmd]
32``` 81```
33 82
34The wrapper can keep track of instances you have an account on. We limit to one account per instance for now. 83The wrapper can keep track of instances you have an account on. We limit to one account per instance for now.
35 84
36```bash 85```bash
37$ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD" 86$ peertube auth add -u 'PEERTUBE_URL' -U 'PEERTUBE_USER' --password 'PEERTUBE_PASSWORD'
38$ peertube auth list 87$ peertube auth list
39┌──────────────────────────────┬──────────────────────────────┠88┌──────────────────────────────┬──────────────────────────────â”
40│ instance │ login │ 89│ instance │ login │
41├──────────────────────────────┼──────────────────────────────┤ 90├──────────────────────────────┼──────────────────────────────┤
42│ "PEERTUBE_URL" │ "PEERTUBE_USER" │ 91│ 'PEERTUBE_URL' │ 'PEERTUBE_USER' │
43└──────────────────────────────┴──────────────────────────────┘ 92└──────────────────────────────┴──────────────────────────────┘
44``` 93```
45 94
@@ -55,53 +104,22 @@ And now that your video is online, you can watch it from the confort of your ter
55$ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10 104$ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10
56``` 105```
57 106
58## Remote Tools 107#### peertube-import-videos.js
59
60You need at least 512MB RAM to run the script.
61Scripts can be launched directly from a PeerTube server, or from a separate server, even a desktop PC.
62You need to follow all the following steps even if you are on a PeerTube server (including cloning the git repository in a different directory than your production installation because the scripts utilize non-production dependencies).
63
64### Dependencies
65
66Install the [PeerTube dependencies](dependencies.md).
67
68### Installation
69
70Clone the PeerTube repo to get the latest version (even if you are on your PeerTube server):
71
72```
73$ git clone https://github.com/Chocobozzz/PeerTube.git
74$ CLONE="$(pwd)/PeerTube"
75```
76
77Run ``yarn install``
78```
79$ cd ${CLONE}
80$ yarn install
81```
82
83Build server tools:
84```
85$ cd ${CLONE}
86$ npm run build:server
87```
88
89### peertube-import-videos.js
90 108
91You can use this script to import videos from all [supported sites of youtube-dl](https://rg3.github.io/youtube-dl/supportedsites.html) into PeerTube. 109You can use this script to import videos from all [supported sites of youtube-dl](https://rg3.github.io/youtube-dl/supportedsites.html) into PeerTube.
92Be sure you own the videos or have the author's authorization to do so. 110Be sure you own the videos or have the author's authorization to do so.
93 111
94```sh 112```sh
95$ node dist/server/tools/peertube-import-videos.js \ 113$ node dist/server/tools/peertube-import-videos.js \
96 -u "PEERTUBE_URL" \ 114 -u 'PEERTUBE_URL' \
97 -U "PEERTUBE_USER" \ 115 -U 'PEERTUBE_USER' \
98 --password "PEERTUBE_PASSWORD" \ 116 --password 'PEERTUBE_PASSWORD' \
99 -t "TARGET_URL" 117 -t 'TARGET_URL'
100``` 118```
101 119
102* `PEERTUBE_URL` : the full URL of your PeerTube server where you want to import, eg: https://peertube.cpy.re 120* `PEERTUBE_URL` : the full URL of your PeerTube server where you want to import, eg: https://peertube.cpy.re
103* `PEERTUBE_USER` : your PeerTube account where videos will be uploaded 121* `PEERTUBE_USER` : your PeerTube account where videos will be uploaded
104* `PEERTUBE_PASSWORD` : password of your PeerTube account (if omitted, you will be prompted for it) 122* `PEERTUBE_PASSWORD` : password of your PeerTube account (if `PEERTUBE_PASSWORD` is omitted, you will be prompted for it)
105* `TARGET_URL` : the target url you want to import. Examples: 123* `TARGET_URL` : the target url you want to import. Examples:
106 * YouTube: 124 * YouTube:
107 * Channel: https://www.youtube.com/channel/ChannelId 125 * Channel: https://www.youtube.com/channel/ChannelId
@@ -116,7 +134,7 @@ Already downloaded videos will not be uploaded twice, so you can run and re-run
116Videos will be publicly available after transcoding (you can see them before that in your account on the web interface). 134Videos will be publicly available after transcoding (you can see them before that in your account on the web interface).
117 135
118 136
119### peertube-upload.js 137#### peertube-upload.js
120 138
121You can use this script to import videos directly from the CLI. 139You can use this script to import videos directly from the CLI.
122 140
@@ -127,7 +145,7 @@ $ cd ${CLONE}
127$ node dist/server/tools/peertube-upload.js --help 145$ node dist/server/tools/peertube-upload.js --help
128``` 146```
129 147
130### peertube-watch.js 148#### peertube-watch.js
131 149
132You can use this script to play videos directly from the CLI. 150You can use this script to play videos directly from the CLI.
133 151
@@ -159,7 +177,7 @@ $ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production
159 177
160### create-transcoding-job.js 178### create-transcoding-job.js
161 179
162You can use this script to force transcoding of an existing video. 180You can use this script to force transcoding of an existing video. PeerTube needs to be running.
163 181
164``` 182```
165$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-transcoding-job -- -v [videoUUID] 183$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-transcoding-job -- -v [videoUUID]
@@ -172,7 +190,7 @@ $ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production
172 190
173### create-import-video-file-job.js 191### create-import-video-file-job.js
174 192
175You can use this script to import a video file to replace an already uploaded file or to add a new resolution to a video. 193You can use this script to import a video file to replace an already uploaded file or to add a new resolution to a video. PeerTube needs to be running.
176 194
177``` 195```
178$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-import-video-file-job -- -v [videoUUID] -i [videoFile] 196$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-import-video-file-job -- -v [videoUUID] -i [videoFile]
@@ -181,17 +199,161 @@ $ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production
181### prune-storage.js 199### prune-storage.js
182 200
183Some transcoded videos or shutdown at a bad time can leave some unused files on your storage. 201Some transcoded videos or shutdown at a bad time can leave some unused files on your storage.
184To delete them (a confirmation will be demanded first): 202Stop PeerTube and delete these files (a confirmation will be demanded first):
185 203
186``` 204```
187$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run prune-storage 205$ sudo systemctl stop peertube && sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run prune-storage
188``` 206```
189 207
208### optimize-old-videos.js
209
210Before version v1.0.0-beta.16, Peertube did not specify a bitrate for the
211transcoding of uploaded videos. This means that videos might be encoded into
212very large files that are too large for streaming. This script re-transcodes
213these videos so that they can be watched properly, even on slow connections.
214
215```
216$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run optimize-old-videos
217```
218
219
190### update-host.js 220### update-host.js
191 221
192If you started PeerTube with a domain, and then changed it you will have invalid torrent files and invalid URLs in your database. 222If you started PeerTube with a domain, and then changed it you will have
193To fix this, you have to run: 223invalid torrent files and invalid URLs in your database. To fix this, you have
224to run:
194 225
195``` 226```
196$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host 227$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host
197``` 228```
229
230### REPL ([Read Eval Print Loop](https://nodejs.org/docs/latest-v8.x/api/repl.html))
231
232If you want to interact with the application libraries and objects even when PeerTube is not running, there is a REPL for that.
233
234usage: `node ./dist/server/tools/peertube-repl.js`
235
236"The default evaluator will, by default, assign the result of the most recently evaluated expression to the special variable `_` (underscore). Explicitly setting `_` to a value will disable this behavior."
237
238- type `.help` to list commands available in the repl, notice it starts with a dot
239- type `.exit` to exit, note that you still have to press CTRL-C to actually exit, or press CTRL-C (3 times) without typing `.exit` to exit
240- type `context` to list all available objects and libraries in the context, note: `Promise` is also available but it's not listed in the context, in case you need promises for something
241- type `env` to see the loaded environment variables
242- type `path` to access path library
243- type `lodash` to access lodash library
244- type `uuidv1` to access uuid/v1 library
245- type `uuidv3` to access uuid/v3 library
246- type `uuidv4` to access uuid/v4 library
247- type `uuidv5` to access uuid/v5 library
248- type `YoutubeDL` to access youtube-dl library
249- type `cli` to access the cli helpers object
250- type `logger` to access the logger; if you log to it, it will write to stdout and to the peertube.log file
251- type `constants` to access the constants loaded by the server
252- type `coreUtils` to access the core-utils helpers object
253- type `ffmpegUtils` to access the ffmpeg-utils helpers object
254- type `peertubeCryptoUtils` to access the peertube-crypto helpers object
255- type `signupUtils` to access the signup helpers object
256- type `utils` to access the utils helpers object
257- type `YoutubeDLUtils` to access the youtube-dl helpers object
258- type `sequelizeTypescript` to access sequelizeTypescript
259- type `modelsUtils` to access the models/utils
260- type `models` to access the shortcut to sequelizeTypescript.models
261- type `transaction` to access the shortcut to sequelizeTypescript.transaction
262- type `query` to access the shortcut to sequelizeTypescript.query
263- type `queryInterface` to access the shortcut to sequelizeTypescript.queryInterface
264
265#### .help
266
267```
268PeerTube [1.0.0] (b10eb595)> .help
269.break Sometimes you get stuck, this gets you out
270.clear Break, and also clear the local context
271.editor Enter editor mode
272.exit Exit the repl
273.help Print this help message
274.load Load JS from a file into the REPL session
275.r Reset REPL
276.reset Reset REPL
277.save Save all evaluated commands in this REPL session to a file
278PeerTube [1.0.0] (b10eb595)>
279```
280
281#### Lodash example
282
283```
284PeerTube [1.0.0] (b10eb595)> lodash.keys(context)
285[ 'global',
286 'console',
287 'DTRACE_NET_SERVER_CONNECTION',
288 'DTRACE_NET_STREAM_END',
289 'DTRACE_HTTP_SERVER_REQUEST',
290 'DTRACE_HTTP_SERVER_RESPONSE',
291 'DTRACE_HTTP_CLIENT_REQUEST',
292 'DTRACE_HTTP_CLIENT_RESPONSE',
293 'process',
294 'Buffer',
295 'clearImmediate',
296 'clearInterval',
297 'clearTimeout',
298 'setImmediate',
299 'setInterval',
300 'setTimeout',
301 'XMLHttpRequest',
302 'compact2string',
303 'module',
304 'require',
305 'path',
306 'repl',
307 'context',
308 'env',
309 'lodash',
310 'uuidv1',
311 'uuidv3',
312 'uuidv4',
313 'uuidv5',
314 'cli',
315 'logger',
316 'constants',
317 'Sequelize',
318 'sequelizeTypescript',
319 'modelsUtils',
320 'models',
321 'transaction',
322 'query',
323 'queryInterface',
324 'YoutubeDL',
325 'coreUtils',
326 'ffmpegUtils',
327 'peertubeCryptoUtils',
328 'signupUtils',
329 'utils',
330 'YoutubeDLUtils' ]
331PeerTube [1.0.0] (b10eb595)>
332```
333
334#### YoutubeDL example
335```
336YoutubeDL.getInfo('https://www.youtube.com/watch?v=I5ZN289jjDo', function(err, data) {console.log(err, data)})
337```
338
339#### Models examples
340```
341PeerTube [1.0.0] (b10eb595)> new models.ActorModel({id: 3}).getVideoChannel().then(function(data){console.log(data.dataValues.name)})
342Promise {
343 _bitField: 0,
344 _fulfillmentHandler0: undefined,
345 _rejectionHandler0: undefined,
346 _promise0: undefined,
347 _receiver0: undefined }
348PeerTube [1.0.0] (b10eb595)> Main root channel
349PeerTube [1.0.0] (b10eb595)> let out; new models.UserModel({id: 1}).getAccount().then(function (data) {out = data.dataValues.id})
350Promise {
351 _bitField: 0,
352 _fulfillmentHandler0: undefined,
353 _rejectionHandler0: undefined,
354 _promise0: undefined,
355 _receiver0: undefined }
356PeerTube [1.0.0] (b10eb595)> out
3572
358PeerTube [1.0.0] (b10eb595)>
359```
diff --git a/support/doc/user/decentralized.png b/support/doc/user/decentralized.png
deleted file mode 100644
index 8c23e2832..000000000
--- a/support/doc/user/decentralized.png
+++ /dev/null
Binary files differ
diff --git a/support/doc/user/decentralized.xml b/support/doc/user/decentralized.xml
deleted file mode 100644
index 952b9f4e7..000000000
--- a/support/doc/user/decentralized.xml
+++ /dev/null
@@ -1 +0,0 @@
1<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0" version="9.1.8" editor="www.draw.io" type="device"><diagram id="2f5eda5b-dbab-6be5-4dc5-833b4d942388" name="Page-1">7Vptb9owEP41kdYPQ4lNAv24vm37sGkaq7p9NMlBooaYOaZAf/3sxM6rw2gVKFuL1Co+n8/O85zvzgYLXy42HxlZhl9oALGF7GBj4SsLoRGyxX8p2OaC4VAJ5iwKcpFTCibRIyihVltFAaQ1RU5pzKNlXejTJAGf12SEMbquq81oXJ91SebQEkx8Ereld1HAw1w6du1S/gmieahndmzVMyX+/ZzRVaLmsxCeZZ+8e0G0LaWfhiSg64oIX1v4klHK86fF5hJiCa2GLR9309FbrJtBwvcZMM4HPJB4BXrF2br4VmORvQ1IfdvCF+sw4jBZEl/2rgX5QhbyRSxajnhMOaP3cEljyrLR2M4+RY9GU+rOojiuaM5m4Pm+lNOEmyyQOJonQuaLdwPRedF+WfX+D8A4bCoi9fIfgS6As61Q0b2eGqIdVRO5Lml3NVlhlXJPCYlytXlhu4RbPCjEzeiPTgf9gMB49tLoj/cEH6MewMct8CfAxNqFbBcNzuFoSGgCR2bAdeoMOAb/d0wU9OH+w24G8KthANkvyIDXYuA2lfj3iv0YTbHn7RWEXBgHwyMTgJspwDsiAbrg2ZUCIAk+yJqm9M+UE8a1zI9Jmkb+8zYA2gG2gJRtf6rMkzV+ycbAlc1NxH/WWr+KmcXabqJYr0SsXrXsXXyldMV8qMUFYWgOSkuhAkGtbmtzWs0cBsq0jEFMePRQr/ZMPKoZvtFIrLczb3m44Qr526hR1fKrYQg1wq87bhjKMWgZEtyTbUVtKRXS7gWjxoKxUysLxUNusfTZAtP93FjvulN2Y+cpbvwMt8Vvbtuz27qjw7ot6i5ANL//fwHSzH+mKvxw+a9dA+4KHEfIdXkk0GHC6QwSO8PCiWz4od1R2jx1wzcN4eF+G/45e7Jdk1rIiwUwF0H0IB7nPEM+F021AA+0SEwwLdXsiXCfVNqLAqBynmRG2UKgSpO0MsRguyJ695UswEJi8fYPyjK6kX37/fNgMDiz5N4w2+nvLF9kzBMLHkPPqzmGc94OHucHih3G65OGW6But1CBPuWUgXQQkgSyCZC5Cw+h4jTv7mA6ET1nr4JTXOcU43E7IbjDA5FqupFskOp0kZofXu3VMqYkY5GIvwTWJZP/P3toVGfPdKPpOAfakth0nH0L3v+IqxwzeGPTiTEnQkJQw977vaK6432afVn0QZbo3nJTdmriLoh/DzKUF6zm9l4PrZ7e3Tp+6xxdoXVkulXvg9b2rXo/tN4wofXG698i+8F4NZ3TnsYrcky8XoGEiAm8HiHIsjVfU3ZfpAjWDOyvkPgiCOsTepv3Iib3HqddA/F/vdk7idN5x/Xi7gvqgKRhcckjG98IF0QmmUReC2lGG0d8A8UvdupHzsCtR4pnn/tbpvo7+Ytm+TuHXL38LQm+/gM=</diagram></mxfile> \ No newline at end of file
diff --git a/support/doc/user/redundancy.png b/support/doc/user/redundancy.png
deleted file mode 100644
index 0184fb78e..000000000
--- a/support/doc/user/redundancy.png
+++ /dev/null
Binary files differ
diff --git a/support/doc/user/redundancy.xml b/support/doc/user/redundancy.xml
deleted file mode 100644
index c501b63d5..000000000
--- a/support/doc/user/redundancy.xml
+++ /dev/null
@@ -1 +0,0 @@
1<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0" version="9.1.8" editor="www.draw.io" type="device"><diagram id="2f5eda5b-dbab-6be5-4dc5-833b4d942388" name="Page-1">7Vpbc5s4FP41zLQP8YAE2HmM3aa7D7vTadpp+yiDMJpg5AU5tvfXrwQSFyG8xMWJJ25m2jFHQpfzHX3nIiy4WO8/ZWgT/0VDnFjADvcW/GABMJva/H8hOJQC15WCVUbCUuTUggfyL5ZC1W1LQpy3OjJKE0Y2bWFA0xQHrCVDWUZ37W4RTdqzbtAKdwQPAUq60u8kZLHclmfX8j8wWcVqZseWLUsUPK4yuk3lfBaAUfFXNq+RGkv2z2MU0l1DBD9acJFRyspf6/0CJ0K1Sm3le/c9rdW6M5yyIS/MyheeULLFasXFuthB6aLYDRb9bQvOdzFh+GGDAtG64+BzWczWCX9y+M+cZfQRL2hCs+JtaBd/VYvSpugbkSRp9Iwi7AeBkNOUmUZACVmlXBbwvWHeOO9uVu7/CWcM7xsiuflPmK4xyw68i2r15SvKUBWQuxp2T4EVNyH3pRBJU1tVY9fq5j+kxs3an16O9kOEZ9Fra382UPkQjKB82FH+A8742rnsGAzO+WBIaYpfGAHPaSPgGOzfMUEwhvm7/QjAq0EA2K+IgN9B4Fsu9D+q7mdgCX1/EAl5eBa6LwwA1F2A/4IAqIDnmAvAaXgnYpraPnOGMqZkQYLynASnHQBwRNlcpdnhh/Q8xcNP8TDxxOOesB+tp59yZr7aeyL2W7zWi09Ot1mAWzzAN7XCspfUAg5bcVoXw6anMECkZBlOECNP7ejOhJuc4TMlfL29fsqHGvTlbuRbzXBLGwhodOvNtIFKHXQG4lijQ6PbRnTI+xcMtAVDpxUG8h/liLWNVjodZrbqlF2y2TrPMdtibdJwTzRj+NuMRzZjb3peMwb9AYjC9+0HILr/M0Xh5/N/3RjwGJG8gK+bAK/JG06LNUCTNgYTg3/pxOA6fssEXB3aocSgDwTdYcRwytntxq4W8BOumHlInvjPFSvwKUVLJYATJeITLOtudnXyc25vuRiYhJiKCdOIZmuuXprmjXcNkzRE7/5Ga2wBvgv7K80K6wD2ty9/TiaT98IUxMARTRK6I+mqmFTMXo2/zPSx9RnHKxNUzvnSeMmdcS/dYiaVFjaZyYXnYSZjcUYzJjDAmHBhTCzGDZN69x0vH3jL+2vA0YUaJ8DZy/kXY4FTQ9HpQ7HMhe3tJqGoQBHxfyne1Ui+ffTArW1m9AZ6tybPdPvr4EFTllEiJVTQ0r3/z5aqhpu8uFC4E2Gcv9nXjQrbOQoeOcs3YC/Hux5y9R0NVt/vwDo1wKpnDCfB2q28jgPrfcZ7/ca1FckZqolnw9UUyz8PV+CYcP2CQw4USoPD0fjo2rDWqRl0oa586Nh+FXonRd9un6u9N8TCwiKuNvgFbWyNtwImvzvKzdiAe8lude98Gfm0k5GHKI+rUox4+IwY131aSETxxlxs/BqT1Dq51tfM36ULu5T8XbOW0/N3qBXcvGH5+7MLexp1qe9Dxirswf6wv0EkCxSItGxgSi9ztoGcxM85ax+KDHM/h5ZFB2FnUke8tze3vA8mIhF8QQKU3MmGNQlD8f48QUuczKtvTTSi6lpwdaJ1Aqo+oZELs5qfoZiIyZ44vj9tgXfjjGLE0NfS/Zsq/1eD0CjK8a8WjuDtZbFbt974Kuz21qgMaFTW+WBnrKs297xUpoY/I5U9u9p4YeSmDvQFk9sN1IcFZ6A296Rr2ZGpreeW9zgtDaC8QXEZeJtk5qo6ZlWF08xnvHsV938yO1sd5DpPT3DEuln7De8b0l0qiqeWrJgWpXBaKDvZWGV5fDgLnbqKlDISCdTLKjzNyIp7SpVoCmuISRCLQUNVrF+XuuUMUhKrLSmz9wboClJSCNoOVd3dNlPS6W3/YXpGSsof62+gSyOuvzOHH/8D</diagram></mxfile> \ No newline at end of file
diff --git a/support/doc/user/watch-p2p.png b/support/doc/user/watch-p2p.png
deleted file mode 100644
index 873309434..000000000
--- a/support/doc/user/watch-p2p.png
+++ /dev/null
Binary files differ
diff --git a/support/doc/user/watch-p2p.xml b/support/doc/user/watch-p2p.xml
deleted file mode 100644
index 7f2cdb627..000000000
--- a/support/doc/user/watch-p2p.xml
+++ /dev/null
@@ -1 +0,0 @@
1<mxfile userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0" version="9.1.0" editor="www.draw.io" type="device"><diagram id="cb5ce52d-ab91-b6cb-bd1a-da918a399df8" name="Page-1">7VpLc5swEP41nmkO7YAEmB5jN2kvncnU6aQ5yrA2TDByhfzqr68EEpiHiRNjx23sQ5BWK2l3v88rsXEPD2frr4zMg+/Uh6iHDH/dw196CJkWssRDSjaZpG+bmWDKQl8pFYJR+AeU0FDSRehDUlLklEY8nJeFHo1j8HhJRhijq7LahEblXedkCjXByCNRXfoQ+jzIpK5tFPJvEE4DvbNpqJEx8Z6mjC5itV8P4Un6yYZnRK+l9JOA+HS1JcI3PTxklPKsNVsPIZKx1WHL5t3uGM3tZhDzfSYonJYkWoC2OLWLb3QsUm9A6hs9PFgFIYfRnHhydCXQF7KAzyLRM0Uz4Yw+wZBGlKWzsZF+8hEdTak7CaNoS3MyAcfzpJzGvGkFEoXTWMg84RuIwYGyHRiH9U7/zTyqgq1AZ8DZRqjoCY6aoohqaSBXBey2BivYgjxHkCiqTfO1i3CLhop4c/Tt84m+T8CdvHX0Rfj3i77pdBB9txb9n4nwDBm4BQXzFSi4aIwdZy8UbHB968Qo2KjyHbDrKJhNKHQBgmnWUBgBW6Y4mB3jsOe3IaYxnBgCXP0iOKeEoCkNORFXMSgh4PxeUD3wMUnP7WuJlDNfF4OiNZXPgTgMQZyEajFhR7ZeNtplqlOQnR2ujr7QbDTOTg3XfgOsuAtYnSPBesuE1gXX564Nx8IV1TOmOrfabg//4blVTZonPbf0Va2OQten1pmjkDv8JijscYMWmepavhJKvyOSJKGXxpIwXhe/4vaAWuItQsg2v2Ti+yQsVf1HtQGsQ56N2ar3qFJk5gL4tXfUCibCTbpgHpQZKTybQv5i2ozd9v26ARotYxARHi7LZjThpXa4o2F6sOTX+3KWdKrpLzNfzdp+S60shCrp1nYrC2U+1xYSAJPNltpcKiS7DUaVjIJdo9Uu/LlVXzQyCwou5xjsR++mI/ws6X18dusy0IXdpeT4QkL1/xVC9Y/OKPdCqAPTpe2+LF1a9pHTZb2ic6bs3pPcZqfpMovGhd17stuqlMVsq53dqOJgRf9wdn++sLuF3e5bkttCFezNsyd3K1mfTfVdk1sngwu5m+4ll8x90L3k+cx9ZHLXK3YvrsTipkrsA+FeAIkMjSzHGgmAL3s8ANkjM/lYhj5Q8fzwAOORUOghYbAhOj/uh1l7EPJ7yiQpr7RdY1aUc99tlRdbFb42lbaayrxdlLYwPhJpRiWSVNlx9Y7xzkv2+v1EL3GKUiY+/N81yNyZJKRxBdo7EO5iN+lRLP7cobv3zKRKYdB065kjZ82BTBLd4vdC2elU/CgL3/wF</diagram></mxfile> \ No newline at end of file
diff --git a/support/doc/user/watch-video.png b/support/doc/user/watch-video.png
deleted file mode 100644
index 8744c793c..000000000
--- a/support/doc/user/watch-video.png
+++ /dev/null
Binary files differ
diff --git a/support/doc/user/watch-video.xml b/support/doc/user/watch-video.xml
deleted file mode 100644
index e2b46aa8b..000000000
--- a/support/doc/user/watch-video.xml
+++ /dev/null
@@ -1 +0,0 @@
1<mxfile userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0" version="9.1.0" editor="www.draw.io" type="device"><diagram id="067b0f1f-1608-c9cb-8da6-67e6cbc055e3" name="Page-1">7Vpbc5s6EP41PNYDEmD8mKRN25l2pnPcTk4fZVgDE4xcgWP7/PojgYSRgNTxJUnr+CERq+t+37IX2Ra+WWw+MrJMvtIIMgvZ0cbC7y2EHBe5/J+QbGvJ2HNqQczSSA7aCabpfyCFtpSu0ggKbWBJaVamS10Y0jyHsNRkhDG61ofNaabvuiQxdATTkGRd6V0alUktDTx7J/8EaZyonR1b9sxIeB8zusrlfhbC8+pTdy+IWkuOLxIS0XVLhD9Y+IZRWtatxeYGMoGtgq2edzvQ25ybQV7uMwHVEx5ItgJ14upc5VZhUWkDYrxt4et1kpYwXZJQ9K45+1yWlIuMPzm8WZSM3sMNzSirZmO7+jQ9Ck0xdp5mWWvkfA5+GAo5zcu+FUiWxjmXhVw34J3X8uzAStgM6u80qHJrBbqAkm35EDXBl1OkobqKyPWOdk+RlbQp96WQSFOLm7V3cPOGRLwfffx60I8IBPOXRj/YE3yMTgC+2wF/Coyrw2WP0eCcj4ac5vDMDHiOzoDTY/9OHwWnMH9vmAF8MQwg+wUZ8DsM/CgE/ifFPkAz7Pt7OSEPgsh9ZgKwGQL8ZyRg/PsIAHl0JVIaoXZGiiINKygJK7viA14B9AjcHEG2/VfGnurhp3gYeeJxk5ZV12isHn/KrWsVIDJyrIKuWAjaq8+1iEHCOdmbuHZ46OFFyRhkpEwf9EP0kSV3+EZTvvFgcPKxwXetj5zVzrGMhZDhY73AWKhGobMQp5dsW8OWYkAxfGA0sbV9sKPlfrxRr7gzzAbTvWw1+DNs1XnMVtEBtuq+2erJbdVz9X1ObauT4dRCMfz3pxZmZOvLr88W2VQp/we6i8N8gvfmE/SFDnht1U5PNpqzJT4yYigDcYajib2f5fivP5pgI5FwTX+wr+Xgia97efd8ltMt5y3kZxyY6xlvxKLhjJSIr9ZI+aSr4t4St4QiPBCxSBoBtZo7upPcxkj///qChGOQ3VN/BueKEd36UzEkINCw93+tqOp4V1Q3xlcimvvLza5TcXpNwnvuJ1p01+spxv9+Wn2DVlGBm7SO+67WTkFrX1V7ClpvGR/1xuvvXtez8XpoBXi+6DzWorN90L1EB3w9YE+6Adt/2bxOt4Aj8jp9oXPmdd16rBOd0VB0/p6AwJ+yiiZk//jns1i6qAK0TxbiPa7mjUajRnAxDsE1zKHJsZ4hfqsM6dU6hHa67rS8gUzdB0rNSnybZuqIXIXW02FepCftdy/aizz1xsg3vidxx55hqsfdGKG+0tNwUXjART0xt3H7cpvOZrV76+x2R8owgaJVpZQJd2txwlt3MJsCDKdHtThKH44/5nHKwmIGkXDEHP+84HoIQ8j5n0/fv37x2rqRuAGGmWcY0I+LKxUvJyl0A73OdgPciQFOnzM5SRDofo37VCNBTp+RVJYuK/JiCWE65965MY2LrQDMr3lQN943vB7JNX/c/RSp9qm733vhD/8D</diagram></mxfile> \ No newline at end of file
diff --git a/support/docker/dev/Dockerfile b/support/docker/dev/Dockerfile
index 2b4f2b215..8e049f3f6 100644
--- a/support/docker/dev/Dockerfile
+++ b/support/docker/dev/Dockerfile
@@ -1,32 +1,46 @@
1FROM janitortechnology/ubuntu-dev 1FROM ubuntu:bionic
2
3# Avoid tzdata interactive dialog
4ENV DEBIAN_FRONTEND=noninteractive
2 5
3# Install PeerTube's dependencies. 6# Install PeerTube's dependencies.
4# Packages are from https://github.com/Chocobozzz/PeerTube#dependencies 7# Packages are from https://github.com/Chocobozzz/PeerTube#dependencies
5RUN sudo apt-get update -q && sudo apt-get install -qy \ 8RUN apt-get update -q && apt-get install -qy \
6 ffmpeg \ 9 curl \
7 postgresql \ 10 ffmpeg \
8 openssl 11 g++ \
12 git \
13 gnupg \
14 make \
15 nano \
16 openssl \
17 postgresql \
18 postgresql-contrib \
19 redis-server \
20 && curl -sL https://deb.nodesource.com/setup_8.x | bash - \
21 && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
22 && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
23 && apt-get update \
24 && apt-get install -qy nodejs yarn \
25 && rm -rf /var/lib/apt/lists/*
9 26
10# Download PeerTube's source code. 27# Download PeerTube's source code.
11RUN git clone -b develop https://github.com/Chocobozzz/PeerTube /home/user/PeerTube 28RUN git clone -b develop https://github.com/Chocobozzz/PeerTube /home/user/PeerTube
12WORKDIR /home/user/PeerTube 29WORKDIR /home/user/PeerTube
13 30
14# Configure the IDEs to use Janitor's source directory as workspace. 31# Copy postgresql setup script
15ENV WORKSPACE /home/user/PeerTube/ 32COPY setup_postgres.sql /tmp/
16
17# Install dependencies.
18RUN yarn install --pure-lockfile
19 33
20# Configure Janitor for PeerTube. 34# Install Node.js dependencies and setup PostgreSQL
21COPY --chown=user:user janitor.json /home/user/ 35RUN yarn install --pure-lockfile \
36 && service postgresql start \
37 && su postgres -c "psql --file=/tmp/setup_postgres.sql"
22 38
23# Configure and build PeerTube. 39# Expose PeerTube sources as a volume
24COPY create_user.sql /tmp/ 40VOLUME /home/user/PeerTube
25RUN sudo service postgresql start \
26 && sudo -u postgres psql --file=/tmp/create_user.sql \
27 && npm run build
28
29COPY --chown=user:user supervisord.conf /tmp/supervisord-extra.conf
30RUN cat /tmp/supervisord-extra.conf | sudo tee -a /etc/supervisord.conf
31 41
42# Expose API and frontend
32EXPOSE 3000 9000 43EXPOSE 3000 9000
44
45# Start PostgreSQL and Redis
46CMD ["service postgresql start && redis-server"]
diff --git a/support/docker/dev/setup_postgres.sql b/support/docker/dev/setup_postgres.sql
new file mode 100644
index 000000000..0937f9d19
--- /dev/null
+++ b/support/docker/dev/setup_postgres.sql
@@ -0,0 +1,6 @@
1create database peertube_dev;
2create user peertube password 'peertube';
3grant all privileges on database peertube_dev to peertube;
4\c peertube_dev
5CREATE EXTENSION pg_trgm;
6CREATE EXTENSION unaccent;
diff --git a/support/docker/dev/usage.md b/support/docker/dev/usage.md
new file mode 100644
index 000000000..319d7db30
--- /dev/null
+++ b/support/docker/dev/usage.md
@@ -0,0 +1,20 @@
1### Usage
21. Build the image:
3 ```
4 docker build -t my_peertube_dev .
5 ```
61. Start the container:
7 ```
8 docker run -d -i -p 3000:3000 -p 9000:9000 --name peertube my_peertube_dev
9 ```
10 This will create a new Docker volume containing PeerTube sources.
11
121. Start PeerTube inside the container:
13 ```
14 docker exec -it peertube npm run dev
15 ```
161. In another window, find the path to the Docker volume
17 ```
18 docker inspect peertube | less +/Mounts
19 ```
20 You can now make changes to the files. They should be automatically recompiled.
diff --git a/support/docker/janitor/Dockerfile b/support/docker/janitor/Dockerfile
new file mode 100644
index 000000000..2b4f2b215
--- /dev/null
+++ b/support/docker/janitor/Dockerfile
@@ -0,0 +1,32 @@
1FROM janitortechnology/ubuntu-dev
2
3# Install PeerTube's dependencies.
4# Packages are from https://github.com/Chocobozzz/PeerTube#dependencies
5RUN sudo apt-get update -q && sudo apt-get install -qy \
6 ffmpeg \
7 postgresql \
8 openssl
9
10# Download PeerTube's source code.
11RUN git clone -b develop https://github.com/Chocobozzz/PeerTube /home/user/PeerTube
12WORKDIR /home/user/PeerTube
13
14# Configure the IDEs to use Janitor's source directory as workspace.
15ENV WORKSPACE /home/user/PeerTube/
16
17# Install dependencies.
18RUN yarn install --pure-lockfile
19
20# Configure Janitor for PeerTube.
21COPY --chown=user:user janitor.json /home/user/
22
23# Configure and build PeerTube.
24COPY create_user.sql /tmp/
25RUN sudo service postgresql start \
26 && sudo -u postgres psql --file=/tmp/create_user.sql \
27 && npm run build
28
29COPY --chown=user:user supervisord.conf /tmp/supervisord-extra.conf
30RUN cat /tmp/supervisord-extra.conf | sudo tee -a /etc/supervisord.conf
31
32EXPOSE 3000 9000
diff --git a/support/docker/dev/create_user.sql b/support/docker/janitor/create_user.sql
index c2fbcf27e..c2fbcf27e 100644
--- a/support/docker/dev/create_user.sql
+++ b/support/docker/janitor/create_user.sql
diff --git a/support/docker/dev/janitor.json b/support/docker/janitor/janitor.json
index 5acdf3060..5acdf3060 100644
--- a/support/docker/dev/janitor.json
+++ b/support/docker/janitor/janitor.json
diff --git a/support/docker/dev/supervisord.conf b/support/docker/janitor/supervisord.conf
index b2e1682df..b2e1682df 100644
--- a/support/docker/dev/supervisord.conf
+++ b/support/docker/janitor/supervisord.conf
diff --git a/support/docker/production/.env b/support/docker/production/.env
index 8af161b2a..802d6b2ca 100644
--- a/support/docker/production/.env
+++ b/support/docker/production/.env
@@ -3,10 +3,13 @@ PEERTUBE_DB_PASSWORD=postgres_password
3PEERTUBE_WEBSERVER_HOSTNAME=domain.tld 3PEERTUBE_WEBSERVER_HOSTNAME=domain.tld
4PEERTUBE_WEBSERVER_PORT=443 4PEERTUBE_WEBSERVER_PORT=443
5PEERTUBE_WEBSERVER_HTTPS=true 5PEERTUBE_WEBSERVER_HTTPS=true
6PEERTUBE_TRUST_PROXY=127.0.0.1 6# If you need more than one IP as trust_proxy
7# pass them as a comma separated array:
8PEERTUBE_TRUST_PROXY=["127.0.0.1"]
9#PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "192.168.1.0/24"]
7PEERTUBE_SMTP_USERNAME= 10PEERTUBE_SMTP_USERNAME=
8PEERTUBE_SMTP_PASSWORD= 11PEERTUBE_SMTP_PASSWORD=
9PEERTUBE_SMTP_HOSTNAME= 12PEERTUBE_SMTP_HOSTNAME=postfix
10PEERTUBE_SMTP_PORT=25 13PEERTUBE_SMTP_PORT=25
11PEERTUBE_SMTP_FROM=noreply@domain.tld 14PEERTUBE_SMTP_FROM=noreply@domain.tld
12PEERTUBE_SMTP_TLS=true 15PEERTUBE_SMTP_TLS=true
@@ -15,3 +18,4 @@ PEERTUBE_ADMIN_EMAIL=admin@domain.tld
15# /!\ Prefer to use the PeerTube admin interface to set the following configurations /!\ 18# /!\ Prefer to use the PeerTube admin interface to set the following configurations /!\
16#PEERTUBE_SIGNUP_ENABLED=true 19#PEERTUBE_SIGNUP_ENABLED=true
17#PEERTUBE_TRANSCODING_ENABLED=true 20#PEERTUBE_TRANSCODING_ENABLED=true
21#PEERTUBE_CONTACT_FORM_ENABLED=true
diff --git a/support/docker/production/Dockerfile.stretch b/support/docker/production/Dockerfile.stretch
index 911d064f6..81468bb4f 100644
--- a/support/docker/production/Dockerfile.stretch
+++ b/support/docker/production/Dockerfile.stretch
@@ -20,32 +20,11 @@ RUN groupadd -r peertube \
20 && useradd -r -g peertube -m peertube 20 && useradd -r -g peertube -m peertube
21 21
22# grab gosu for easy step-down from root 22# grab gosu for easy step-down from root
23# https://github.com/tianon/gosu/releases 23RUN set -eux; \
24ENV GOSU_VERSION 1.10 24 apt-get update; \
25RUN set -ex; \ 25 apt-get install -y gosu; \
26 \ 26 rm -rf /var/lib/apt/lists/*; \
27 fetchDeps='ca-certificates wget'; \ 27 gosu nobody true
28 apt-get update; \
29 apt-get install -y --no-install-recommends $fetchDeps; \
30 rm -rf /var/lib/apt/lists/*; \
31 \
32 dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
33 wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
34 wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
35 export GNUPGHOME="$(mktemp -d)"; \
36 for server in $(shuf -e ha.pool.sks-keyservers.net \
37 hkp://p80.pool.sks-keyservers.net:80 \
38 keyserver.ubuntu.com \
39 hkp://keyserver.ubuntu.com:80 \
40 pgp.mit.edu) ; do \
41 gpg --keyserver "$server" --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && break || : ; \
42 done; \
43 gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
44 rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
45 chmod +x /usr/local/bin/gosu; \
46 gosu nobody true; \
47 \
48 apt-get purge -y --auto-remove wget
49 28
50# Install PeerTube 29# Install PeerTube
51WORKDIR /app 30WORKDIR /app
diff --git a/support/docker/production/config/custom-environment-variables.yaml b/support/docker/production/config/custom-environment-variables.yaml
index daf885813..8604939aa 100644
--- a/support/docker/production/config/custom-environment-variables.yaml
+++ b/support/docker/production/config/custom-environment-variables.yaml
@@ -7,7 +7,9 @@ webserver:
7 __name: "PEERTUBE_WEBSERVER_HTTPS" 7 __name: "PEERTUBE_WEBSERVER_HTTPS"
8 __format: "json" 8 __format: "json"
9 9
10trust_proxy: "PEERTUBE_TRUST_PROXY" 10trust_proxy:
11 __name: "PEERTUBE_TRUST_PROXY"
12 __format: "json"
11 13
12database: 14database:
13 hostname: "PEERTUBE_DB_HOSTNAME" 15 hostname: "PEERTUBE_DB_HOSTNAME"
@@ -48,6 +50,11 @@ user:
48admin: 50admin:
49 email: "PEERTUBE_ADMIN_EMAIL" 51 email: "PEERTUBE_ADMIN_EMAIL"
50 52
53contact_form:
54 enabled:
55 __name: "PEERTUBE_CONTACT_FORM_ENABLED"
56 __format: "json"
57
51signup: 58signup:
52 enabled: 59 enabled:
53 __name: "PEERTUBE_SIGNUP_ENABLED" 60 __name: "PEERTUBE_SIGNUP_ENABLED"
@@ -56,6 +63,26 @@ signup:
56 __name: "PEERTUBE_SIGNUP_LIMIT" 63 __name: "PEERTUBE_SIGNUP_LIMIT"
57 __format: "json" 64 __format: "json"
58 65
66search:
67 remote_uri:
68 users:
69 __name: "PEERTUBE_SEARCH_REMOTEURI_USERS"
70 __format: "json"
71 anonymous:
72 __name: "PEERTUBE_SEARCH_REMOTEURI_ANONYMOUS"
73 __format: "json"
74
75import:
76 videos:
77 http:
78 enabled:
79 __name: "PEERTUBE_IMPORT_VIDEOS_HTTP"
80 __format: "json"
81 torrent:
82 enabled:
83 __name: "PEERTUBE_IMPORT_VIDEOS_TORRENT"
84 __format: "json"
85
59transcoding: 86transcoding:
60 enabled: 87 enabled:
61 __name: "PEERTUBE_TRANSCODING_ENABLED" 88 __name: "PEERTUBE_TRANSCODING_ENABLED"
@@ -79,9 +106,11 @@ transcoding:
79 1080: 106 1080:
80 __name: "PEERTUBE_TRANSCODING_1080P" 107 __name: "PEERTUBE_TRANSCODING_1080P"
81 __format: "json" 108 __format: "json"
82
83 109
84instance: 110instance:
85 name: "PEERTUBE_INSTANCE_NAME" 111 name: "PEERTUBE_INSTANCE_NAME"
86 description: "PEERTUBE_INSTANCE_DESCRIPTION" 112 description: "PEERTUBE_INSTANCE_DESCRIPTION"
87 terms: "PEERTUBE_INSTANCE_TERMS" 113 terms: "PEERTUBE_INSTANCE_TERMS"
114
115services:
116 csp-logger: "PEERTUBE_SERVICES_CSPLOGGER"
diff --git a/support/docker/production/config/production.yaml b/support/docker/production/config/production.yaml
index 4970bbcca..846c838e8 100644
--- a/support/docker/production/config/production.yaml
+++ b/support/docker/production/config/production.yaml
@@ -32,8 +32,10 @@ redis:
32 32
33# From the project root directory 33# From the project root directory
34storage: 34storage:
35 tmp: '../data/tmp/'
35 avatars: '../data/avatars/' 36 avatars: '../data/avatars/'
36 videos: '../data/videos/' 37 videos: '../data/videos/'
38 redundancy: '../data/redundancy/'
37 logs: '../data/logs/' 39 logs: '../data/logs/'
38 previews: '../data/previews/' 40 previews: '../data/previews/'
39 thumbnails: '../data/thumbnails/' 41 thumbnails: '../data/thumbnails/'
diff --git a/support/docker/production/config/traefik.toml b/support/docker/production/config/traefik.toml
index 882c95548..6abced3db 100644
--- a/support/docker/production/config/traefik.toml
+++ b/support/docker/production/config/traefik.toml
@@ -1,9 +1,12 @@
1# Uncomment this line in order to enable debugging through logs 1# Uncomment this line in order to enable debugging through logs
2# debug = true 2# debug = true
3defaultEntryPoints = ["http", "https"] 3defaultEntryPoints = ["http", "https"]
4
4[entryPoints] 5[entryPoints]
5 [entryPoints.http] 6 [entryPoints.http]
6 address = ":80" 7 address = ":80"
8 [entryPoints.http.redirect]
9 entryPoint = "https"
7 [entryPoints.https] 10 [entryPoints.https]
8 address = ":443" 11 address = ":443"
9 [entryPoints.https.tls] 12 [entryPoints.https.tls]
diff --git a/support/docker/production/docker-compose.yml b/support/docker/production/docker-compose.yml
index 220c19fba..1b0a28ffb 100644
--- a/support/docker/production/docker-compose.yml
+++ b/support/docker/production/docker-compose.yml
@@ -4,16 +4,19 @@ services:
4 4
5 reverse-proxy: 5 reverse-proxy:
6 image: traefik 6 image: traefik
7 command: --api --docker # Enables the web UI and tells Træfik to listen to docker 7 command: --docker # Tells Træfik to listen to docker
8 ports: 8 ports:
9 - "80:80" # The HTTP port 9 - "80:80" # The HTTP port
10 - "443:443" # The HTTPS port 10 - "443:443" # The HTTPS port
11 - "8080:8080" # The Web UI (enabled by --api)
12 volumes: 11 volumes:
13 - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events 12 - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
14 - ./docker-volume/traefik/acme.json:/etc/acme.json 13 - ./docker-volume/traefik/acme.json:/etc/acme.json
15 - ./docker-volume/traefik/traefik.toml:/traefik.toml 14 - ./docker-volume/traefik/traefik.toml:/traefik.toml
16 restart: "always" 15 restart: "always"
16 # If you want to use the Traefik dashboard, you should expose it on a
17 # subdomain with HTTPS and authentification:
18 # https://medium.com/@xavier.priour/secure-traefik-dashboard-with-https-and-password-in-docker-5b657e2aa15f
19 # https://github.com/containous/traefik/issues/880#issuecomment-310301168
17 20
18 peertube: 21 peertube:
19 # If you don't want to use the official image and build one from sources 22 # If you don't want to use the official image and build one from sources
@@ -38,6 +41,7 @@ services:
38 depends_on: 41 depends_on:
39 - postgres 42 - postgres
40 - redis 43 - redis
44 - postfix
41 restart: "always" 45 restart: "always"
42 46
43 postgres: 47 postgres:
@@ -59,3 +63,11 @@ services:
59 restart: "always" 63 restart: "always"
60 labels: 64 labels:
61 traefik.enable: "false" 65 traefik.enable: "false"
66
67 postfix:
68 image: mwader/postfix-relay
69 environment:
70 - POSTFIX_myhostname=${PEERTUBE_WEBSERVER_HOSTNAME}
71 labels:
72 traefik.enable: "false"
73 restart: "always"
diff --git a/support/docker/production/docker-entrypoint.sh b/support/docker/production/docker-entrypoint.sh
index 6dbbfddf6..7dd626b9f 100755
--- a/support/docker/production/docker-entrypoint.sh
+++ b/support/docker/production/docker-entrypoint.sh
@@ -9,7 +9,7 @@ fi
9# Always copy default and custom env configuration file, in cases where new keys were added 9# Always copy default and custom env configuration file, in cases where new keys were added
10cp /app/config/default.yaml /config 10cp /app/config/default.yaml /config
11cp /app/support/docker/production/config/custom-environment-variables.yaml /config 11cp /app/support/docker/production/config/custom-environment-variables.yaml /config
12chown -R peertube:peertube /config 12find /config ! -user peertube -exec chown peertube:peertube {} \;
13 13
14# first arg is `-f` or `--some-option` 14# first arg is `-f` or `--some-option`
15# or first arg is `something.conf` 15# or first arg is `something.conf`
@@ -19,7 +19,7 @@ fi
19 19
20# allow the container to be started with `--user` 20# allow the container to be started with `--user`
21if [ "$1" = 'npm' -a "$(id -u)" = '0' ]; then 21if [ "$1" = 'npm' -a "$(id -u)" = '0' ]; then
22 chown -R peertube:peertube /data 22 find /data ! -user peertube -exec chown peertube:peertube {} \;
23 exec gosu peertube "$0" "$@" 23 exec gosu peertube "$0" "$@"
24fi 24fi
25 25
diff --git a/support/freebsd/peertube b/support/freebsd/peertube
index 78fdf5848..5d14c58ae 100755
--- a/support/freebsd/peertube
+++ b/support/freebsd/peertube
@@ -16,6 +16,7 @@ load_rc_config $name
16 16
17: ${peertube_enable:=NO} 17: ${peertube_enable:=NO}
18 18
19sig_stop=-KILL
19peertube_chdir="/var/www/peertube/peertube-latest" 20peertube_chdir="/var/www/peertube/peertube-latest"
20peertube_env="HOME=/var/www/peertube \ 21peertube_env="HOME=/var/www/peertube \
21NODE_ENV=production \ 22NODE_ENV=production \
@@ -23,7 +24,7 @@ NODE_CONFIG_DIR=/var/www/peertube/config \
23USER=peertube" 24USER=peertube"
24peertube_user=peertube 25peertube_user=peertube
25 26
26command="/usr/local/bin/npm" 27command="/usr/local/bin/node"
27command_args="start >> /var/log/peertube/${name}.log 2>&1 &" 28command_args="dist/server >> /var/log/peertube/${name}.log 2>&1 &"
28 29
29run_rc_command "$1" 30run_rc_command "$1"
diff --git a/support/nginx/peertube b/support/nginx/peertube
index b00031133..fee0f5d1c 100644
--- a/support/nginx/peertube
+++ b/support/nginx/peertube
@@ -41,7 +41,7 @@ server {
41 # It might be nice to compress JSON, but leaving that out to protect against potential 41 # It might be nice to compress JSON, but leaving that out to protect against potential
42 # compression+encryption information leak attacks like BREACH. 42 # compression+encryption information leak attacks like BREACH.
43 gzip on; 43 gzip on;
44 gzip_types text/css text/html application/javascript; 44 gzip_types text/css application/javascript;
45 gzip_vary on; 45 gzip_vary on;
46 46
47 # Enable HSTS 47 # Enable HSTS
@@ -96,8 +96,18 @@ server {
96 proxy_set_header Host $host; 96 proxy_set_header Host $host;
97 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 97 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
98 98
99 # Hard limit, PeerTube does not support videos > 8GB 99 # This is the maximum upload size, which roughly matches the maximum size of a video file
100 # you can send via the API or the web interface. By default this is 8GB, but administrators
101 # can increase or decrease the limit. Currently there's no way to communicate this limit
102 # to users automatically, so you may want to leave a note in your instance 'about' page if
103 # you change this.
104 #
105 # Note that temporary space is needed equal to the total size of all concurrent uploads.
106 # This data gets stored in /var/lib/nginx by default, so you may want to put this directory
107 # on a dedicated filesystem.
108 #
100 client_max_body_size 8G; 109 client_max_body_size 8G;
110
101 proxy_connect_timeout 600; 111 proxy_connect_timeout 600;
102 proxy_send_timeout 600; 112 proxy_send_timeout 600;
103 proxy_read_timeout 600; 113 proxy_read_timeout 600;
@@ -105,7 +115,7 @@ server {
105 } 115 }
106 116
107 # Bypass PeerTube for performance reasons. Could be removed 117 # Bypass PeerTube for performance reasons. Could be removed
108 location /static/webseed { 118 location ~ ^/static/(webseed|redundancy)/ {
109 # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client 119 # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client
110 limit_rate 800k; 120 limit_rate 800k;
111 121
@@ -128,7 +138,12 @@ server {
128 access_log off; 138 access_log off;
129 } 139 }
130 140
131 alias /var/www/peertube/storage/videos; 141 root /var/www/peertube/storage;
142
143 rewrite ^/static/webseed/(.*)$ /videos/$1 break;
144 rewrite ^/static/redundancy/(.*)$ /redundancy/$1 break;
145
146 try_files $uri /;
132 } 147 }
133 148
134 # Websocket tracker 149 # Websocket tracker
@@ -143,4 +158,16 @@ server {
143 proxy_set_header Host $host; 158 proxy_set_header Host $host;
144 proxy_pass http://localhost:9000; 159 proxy_pass http://localhost:9000;
145 } 160 }
161
162 location /socket.io {
163 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
164 proxy_set_header Host $host;
165
166 proxy_pass http://localhost:9000;
167
168 # enable WebSockets
169 proxy_http_version 1.1;
170 proxy_set_header Upgrade $http_upgrade;
171 proxy_set_header Connection "upgrade";
172 }
146} 173}
diff --git a/support/systemd/peertube.service b/support/systemd/peertube.service
index 88856385c..fba644788 100644
--- a/support/systemd/peertube.service
+++ b/support/systemd/peertube.service
@@ -15,5 +15,24 @@ StandardError=syslog
15SyslogIdentifier=peertube 15SyslogIdentifier=peertube
16Restart=always 16Restart=always
17 17
18; Some security directives.
19; Use private /tmp and /var/tmp folders inside a new file system namespace,
20; which are discarded after the process stops.
21PrivateTmp=true
22; Mount /usr, /boot, and /etc as read-only for processes invoked by this service.
23ProtectSystem=full
24; Sets up a new /dev mount for the process and only adds API pseudo devices
25; like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled
26; by default because it may not work on devices like the Raspberry Pi.
27PrivateDevices=false
28; Ensures that the service process and all its children can never gain new
29; privileges through execve().
30NoNewPrivileges=true
31; This makes /home, /root, and /run/user inaccessible and empty for processes invoked
32; by this unit. Make sure that you do not depend on data inside these folders.
33ProtectHome=true
34; Drops the sys admin capability from the daemon.
35CapabilityBoundingSet=~CAP_SYS_ADMIN
36
18[Install] 37[Install]
19WantedBy=multi-user.target 38WantedBy=multi-user.target
diff --git a/tslint.json b/tslint.json
index 92d0bd2b1..6828f4325 100644
--- a/tslint.json
+++ b/tslint.json
@@ -4,7 +4,7 @@
4 "await-promise": [true, "Bluebird"], 4 "await-promise": [true, "Bluebird"],
5 "no-inferrable-types": true, 5 "no-inferrable-types": true,
6 "eofline": true, 6 "eofline": true,
7 "indent": ["spaces"], 7 "indent": [true, "spaces"],
8 "ter-indent": [true, 2], 8 "ter-indent": [true, 2],
9 "max-line-length": [true, 140], 9 "max-line-length": [true, 140],
10 "no-unused-variable": false, // Memory issues 10 "no-unused-variable": false, // Memory issues
diff --git a/yarn.lock b/yarn.lock
index 5a67caf25..1e759af1b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,44 +2,66 @@
2# yarn lockfile v1 2# yarn lockfile v1
3 3
4 4
5"@iamstarkov/listr-update-renderer@0.4.1":
6 version "0.4.1"
7 resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e"
8 integrity sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA==
9 dependencies:
10 chalk "^1.1.3"
11 cli-truncate "^0.2.1"
12 elegant-spinner "^1.0.1"
13 figures "^1.7.0"
14 indent-string "^3.0.0"
15 log-symbols "^1.0.2"
16 log-update "^2.3.0"
17 strip-ansi "^3.0.1"
18
5"@samverschueren/stream-to-observable@^0.3.0": 19"@samverschueren/stream-to-observable@^0.3.0":
6 version "0.3.0" 20 version "0.3.0"
7 resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" 21 resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
22 integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==
8 dependencies: 23 dependencies:
9 any-observable "^0.3.0" 24 any-observable "^0.3.0"
10 25
11"@types/async-lock@^1.1.0": 26"@types/async-lock@^1.1.0":
12 version "1.1.0" 27 version "1.1.0"
13 resolved "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-1.1.0.tgz#002b1ebeebd382aff66b68bed70a74c7bdd06e3e" 28 resolved "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-1.1.0.tgz#002b1ebeebd382aff66b68bed70a74c7bdd06e3e"
29 integrity sha512-Eo8EXiqmChtkt0ETf6AQ8aiDHT3Tht6OuMSa3/9nfuyqFimp7ZwPMiufsA56A7ZUGBuwFzH860jO0d8n0lETtg==
14 30
15"@types/async@^2.0.40": 31"@types/async@^2.0.40":
16 version "2.0.49" 32 version "2.0.50"
17 resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.49.tgz#92e33d13f74c895cb9a7f38ba97db8431ed14bc0" 33 resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.50.tgz#117540e026d64e1846093abbd5adc7e27fda7bcb"
34 integrity sha512-VMhZMMQgV1zsR+lX/0IBfAk+8Eb7dPVMWiQGFAt3qjo5x7Ml6b77jUo0e1C3ToD+XRDXqtrfw+6AB0uUsPEr3Q==
18 35
19"@types/bcrypt@^2.0.0": 36"@types/bcrypt@^3.0.0":
20 version "2.0.0" 37 version "3.0.0"
21 resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-2.0.0.tgz#74cccef82026341fd786cf2eb9c912c7f9107c55" 38 resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-3.0.0.tgz#851489a9065a067cb7f3c9cbe4ce9bed8bba0876"
39 integrity sha512-nohgNyv+1ViVcubKBh0+XiNJ3dO8nYu///9aJ4cgSqv70gBL+94SNy/iC2NLzKPT2Zt/QavrOkBVbZRLZmw6NQ==
22 40
23"@types/bittorrent-protocol@*": 41"@types/bittorrent-protocol@*":
24 version "2.2.2" 42 version "2.2.2"
25 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83" 43 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83"
44 integrity sha512-VAPyW8eGh8FjyGxBSKyPSH60Qkxo3r2W4sDYXCQJYfYD49UnA1SUP+5GQ/4MgbdiEDSp9YW4yuebpIR/vstD5Q==
26 dependencies: 45 dependencies:
27 "@types/node" "*" 46 "@types/node" "*"
28 47
29"@types/bluebird@*", "@types/bluebird@3.5.18", "@types/bluebird@3.5.21": 48"@types/bluebird@*", "@types/bluebird@3.5.18", "@types/bluebird@3.5.21":
30 version "3.5.21" 49 version "3.5.21"
31 resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634" 50 resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634"
51 integrity sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==
32 52
33"@types/body-parser@*", "@types/body-parser@^1.16.3": 53"@types/body-parser@*", "@types/body-parser@^1.16.3":
34 version "1.17.0" 54 version "1.17.0"
35 resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 55 resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
56 integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==
36 dependencies: 57 dependencies:
37 "@types/connect" "*" 58 "@types/connect" "*"
38 "@types/node" "*" 59 "@types/node" "*"
39 60
40"@types/bull@^3.3.12": 61"@types/bull@3.4.0":
41 version "3.3.20" 62 version "3.4.0"
42 resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.3.20.tgz#c61a597def297252419cf16ac4effdfb4d82d9c9" 63 resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.4.0.tgz#18ffefefa4dd1cfbdbdc8ca7df56c934459f6b9d"
64 integrity sha512-NVD2X+cUu1qNv6blsOfCr2fVsD3+O13U19dFuy9Du7PWfn1/gjFZEDk220uBuRSH5JyaP4nV6S8BLjsT5/bXUg==
43 dependencies: 65 dependencies:
44 "@types/bluebird" "*" 66 "@types/bluebird" "*"
45 "@types/ioredis" "*" 67 "@types/ioredis" "*"
@@ -47,60 +69,72 @@
47"@types/bytes@^3.0.0": 69"@types/bytes@^3.0.0":
48 version "3.0.0" 70 version "3.0.0"
49 resolved "https://registry.yarnpkg.com/@types/bytes/-/bytes-3.0.0.tgz#549eeacd0a8fecfaa459334583a4edcee738e6db" 71 resolved "https://registry.yarnpkg.com/@types/bytes/-/bytes-3.0.0.tgz#549eeacd0a8fecfaa459334583a4edcee738e6db"
72 integrity sha512-ZF43+CIIlzngQe8/Zo7L1kpY9W8O6rO006VDz3c5iM21ddtXWxCEyOXyft+q4pVF2tGqvrVuVrEDH1+gJEi1fQ==
50 73
51"@types/caseless@*": 74"@types/caseless@*":
52 version "0.12.1" 75 version "0.12.1"
53 resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" 76 resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
77 integrity sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==
54 78
55"@types/chai-json-schema@^1.4.3": 79"@types/chai-json-schema@^1.4.3":
56 version "1.4.3" 80 version "1.4.3"
57 resolved "https://registry.yarnpkg.com/@types/chai-json-schema/-/chai-json-schema-1.4.3.tgz#1dd1e88ae911dd6e6e1c3c2d0e0397328aab0bfb" 81 resolved "https://registry.yarnpkg.com/@types/chai-json-schema/-/chai-json-schema-1.4.3.tgz#1dd1e88ae911dd6e6e1c3c2d0e0397328aab0bfb"
82 integrity sha1-HdHoiukR3W5uHDwtDgOXMoqrC/s=
58 dependencies: 83 dependencies:
59 "@types/tv4" "*" 84 "@types/tv4" "*"
60 85
61"@types/chai-xml@^0.3.1": 86"@types/chai-xml@^0.3.1":
62 version "0.3.1" 87 version "0.3.1"
63 resolved "https://registry.yarnpkg.com/@types/chai-xml/-/chai-xml-0.3.1.tgz#a9cc5812bd67e9c9221d1e9b4dfb0cca797fd40a" 88 resolved "https://registry.yarnpkg.com/@types/chai-xml/-/chai-xml-0.3.1.tgz#a9cc5812bd67e9c9221d1e9b4dfb0cca797fd40a"
89 integrity sha1-qcxYEr1n6ckiHR6bTfsMynl/1Ao=
64 dependencies: 90 dependencies:
65 "@types/chai" "*" 91 "@types/chai" "*"
66 92
67"@types/chai@*", "@types/chai@^4.0.4": 93"@types/chai@*", "@types/chai@^4.0.4":
68 version "4.1.5" 94 version "4.1.7"
69 resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.5.tgz#6163dc60078d215ec46186dc76062ef6ed68d39c" 95 resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
96 integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
70 97
71"@types/config@^0.0.34": 98"@types/config@^0.0.34":
72 version "0.0.34" 99 version "0.0.34"
73 resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.34.tgz#123f91bdb5afdd702294b9de9ca04d9ea11137b0" 100 resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.34.tgz#123f91bdb5afdd702294b9de9ca04d9ea11137b0"
101 integrity sha512-jWi9DXx77hnzN4kHCNEvP/kab+nchRLTg9yjXYxjTcMBkuc5iBb3QuwJ4sPrb+nzy1GQjrfyfMqZOdR4i7opRQ==
74 102
75"@types/connect@*": 103"@types/connect@*":
76 version "3.4.32" 104 version "3.4.32"
77 resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 105 resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
106 integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==
78 dependencies: 107 dependencies:
79 "@types/node" "*" 108 "@types/node" "*"
80 109
81"@types/continuation-local-storage@*": 110"@types/continuation-local-storage@*":
82 version "3.2.1" 111 version "3.2.1"
83 resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#a33e0df9dce9b424d1c98fc4fdebd8578dceec7e" 112 resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#a33e0df9dce9b424d1c98fc4fdebd8578dceec7e"
113 integrity sha1-oz4N+dzptCTRyY/E/evYV43O7H4=
84 dependencies: 114 dependencies:
85 "@types/node" "*" 115 "@types/node" "*"
86 116
87"@types/cookiejar@*": 117"@types/cookiejar@*":
88 version "2.1.0" 118 version "2.1.0"
89 resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.0.tgz#4b7daf2c51696cfc70b942c11690528229d1a1ce" 119 resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.0.tgz#4b7daf2c51696cfc70b942c11690528229d1a1ce"
120 integrity sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA==
90 121
91"@types/events@*": 122"@types/events@*":
92 version "1.2.0" 123 version "1.2.0"
93 resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" 124 resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
125 integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==
94 126
95"@types/express-rate-limit@^2.9.3": 127"@types/express-rate-limit@^2.9.3":
96 version "2.9.3" 128 version "2.9.3"
97 resolved "https://registry.yarnpkg.com/@types/express-rate-limit/-/express-rate-limit-2.9.3.tgz#e83a548bf251ad12ca49055c22d3f2da4e16b62d" 129 resolved "https://registry.yarnpkg.com/@types/express-rate-limit/-/express-rate-limit-2.9.3.tgz#e83a548bf251ad12ca49055c22d3f2da4e16b62d"
130 integrity sha512-KIiEnkemd20SpTHUvN8Yqr11nddpD1xch3hY5G9GnuaURQ9EnoAi1N2DJQK8n8V0vHBJOcmwnMdufLdWn1GYhQ==
98 dependencies: 131 dependencies:
99 "@types/express" "*" 132 "@types/express" "*"
100 133
101"@types/express-serve-static-core@*": 134"@types/express-serve-static-core@*":
102 version "4.16.0" 135 version "4.16.0"
103 resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" 136 resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7"
137 integrity sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==
104 dependencies: 138 dependencies:
105 "@types/events" "*" 139 "@types/events" "*"
106 "@types/node" "*" 140 "@types/node" "*"
@@ -109,116 +143,145 @@
109"@types/express@*", "@types/express@^4.0.35": 143"@types/express@*", "@types/express@^4.0.35":
110 version "4.16.0" 144 version "4.16.0"
111 resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" 145 resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19"
146 integrity sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==
112 dependencies: 147 dependencies:
113 "@types/body-parser" "*" 148 "@types/body-parser" "*"
114 "@types/express-serve-static-core" "*" 149 "@types/express-serve-static-core" "*"
115 "@types/serve-static" "*" 150 "@types/serve-static" "*"
116 151
152"@types/fluent-ffmpeg@^2.1.8":
153 version "2.1.8"
154 resolved "https://registry.yarnpkg.com/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.8.tgz#a9ffff2140d641ec898ebdddaa1e6e7e962d7943"
155 integrity sha512-dbEJwEPpKlJPujNTSj7HM03T9rurGDEdrbh/BHR5lJ1A6uYx9VrOP+/GjJMsO5hXjf2hpk/41wBC/H9TmKIm9A==
156 dependencies:
157 "@types/events" "*"
158 "@types/node" "*"
159
117"@types/form-data@*": 160"@types/form-data@*":
118 version "2.2.1" 161 version "2.2.1"
119 resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" 162 resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
163 integrity sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==
120 dependencies: 164 dependencies:
121 "@types/node" "*" 165 "@types/node" "*"
122 166
123"@types/fs-extra@^5.0.4": 167"@types/fs-extra@^5.0.4":
124 version "5.0.4" 168 version "5.0.4"
125 resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.4.tgz#b971134d162cc0497d221adde3dbb67502225599" 169 resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.4.tgz#b971134d162cc0497d221adde3dbb67502225599"
170 integrity sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==
126 dependencies: 171 dependencies:
127 "@types/node" "*" 172 "@types/node" "*"
128 173
129"@types/geojson@^1.0.0": 174"@types/geojson@^1.0.0":
130 version "1.0.6" 175 version "1.0.6"
131 resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" 176 resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf"
177 integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==
132 178
133"@types/ioredis@*": 179"@types/ioredis@*":
134 version "4.0.1" 180 version "4.0.4"
135 resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.0.1.tgz#dfe9de0d5dce54193975c1909f0d082e5574e2f2" 181 resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.0.4.tgz#c0a809064c05e4c2663803128d46042e73c92558"
182 integrity sha512-QdJTMFrmKkphjoGIxItTMhP++8/6INLbgSIxB8kd9N+3OuiuiaZ2knt+OR4gFQrloac/ctwaQA1PCzISmD9afQ==
136 dependencies: 183 dependencies:
137 "@types/node" "*" 184 "@types/node" "*"
138 185
139"@types/libxmljs@^0.18.0": 186"@types/libxmljs@^0.18.0":
140 version "0.18.2" 187 version "0.18.2"
141 resolved "https://registry.yarnpkg.com/@types/libxmljs/-/libxmljs-0.18.2.tgz#c424173a07477a7552173d7c779d5ffe77dd8efc" 188 resolved "https://registry.yarnpkg.com/@types/libxmljs/-/libxmljs-0.18.2.tgz#c424173a07477a7552173d7c779d5ffe77dd8efc"
189 integrity sha512-D0S5gpn0AFGckaBJj803zFpAOgERx/SiBfCI63U/mUEADr+wuKkDQdsWJadAxUikBSAZ7/ekibaDnjkECUYSBQ==
142 dependencies: 190 dependencies:
143 "@types/events" "*" 191 "@types/events" "*"
144 "@types/node" "*" 192 "@types/node" "*"
145 193
146"@types/lodash@*", "@types/lodash@^4.14.64": 194"@types/lodash@*", "@types/lodash@^4.14.64":
147 version "4.14.116" 195 version "4.14.118"
148 resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" 196 resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27"
197 integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw==
149 198
150"@types/magnet-uri@*", "@types/magnet-uri@^5.1.1": 199"@types/magnet-uri@*", "@types/magnet-uri@^5.1.1":
151 version "5.1.1" 200 version "5.1.1"
152 resolved "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz#861aaf64c92a3137dd848fefc55cd352a8ea851a" 201 resolved "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz#861aaf64c92a3137dd848fefc55cd352a8ea851a"
202 integrity sha1-hhqvZMkqMTfdhI/vxVzTUqjqhRo=
153 dependencies: 203 dependencies:
154 "@types/node" "*" 204 "@types/node" "*"
155 205
156"@types/maildev@^0.0.1": 206"@types/maildev@^0.0.1":
157 version "0.0.1" 207 version "0.0.1"
158 resolved "https://registry.yarnpkg.com/@types/maildev/-/maildev-0.0.1.tgz#9fe4fa05610f6c6afc10224bcca6b67bc3c56fc0" 208 resolved "https://registry.yarnpkg.com/@types/maildev/-/maildev-0.0.1.tgz#9fe4fa05610f6c6afc10224bcca6b67bc3c56fc0"
209 integrity sha512-hh2pmc+7TSO2/xCmjhkEc7JQCpHUjJPrXx4OPNF+oXlv5ratDTGp+YamZvxlf8PSVdPLI11ihmcF6VFuzwA5OQ==
159 dependencies: 210 dependencies:
160 "@types/node" "*" 211 "@types/node" "*"
161 212
162"@types/memoizee@^0.4.2": 213"@types/memoizee@^0.4.2":
163 version "0.4.2" 214 version "0.4.2"
164 resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.2.tgz#a500158999a8144a9b46cf9a9fb49b15f1853573" 215 resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.2.tgz#a500158999a8144a9b46cf9a9fb49b15f1853573"
216 integrity sha512-bhdZXZWKfpkQuuiQjVjnPiNeBHpIAC6rfOFqlJXKD3VC35mCcolfVfXYTnk9Ppee5Mkmmz3Llgec7xCdJAbzWw==
165 217
166"@types/mime@*": 218"@types/mime@*":
167 version "2.0.0" 219 version "2.0.0"
168 resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 220 resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
221 integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==
169 222
170"@types/mkdirp@^0.5.1": 223"@types/mkdirp@^0.5.1":
171 version "0.5.2" 224 version "0.5.2"
172 resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" 225 resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
226 integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==
173 dependencies: 227 dependencies:
174 "@types/node" "*" 228 "@types/node" "*"
175 229
176"@types/mocha@^5.0.0": 230"@types/mocha@^5.0.0":
177 version "5.2.5" 231 version "5.2.5"
178 resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" 232 resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073"
233 integrity sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==
179 234
180"@types/morgan@^1.7.32": 235"@types/morgan@^1.7.32":
181 version "1.7.35" 236 version "1.7.35"
182 resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.7.35.tgz#6358f502931cc2583d7a94248c41518baa688494" 237 resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.7.35.tgz#6358f502931cc2583d7a94248c41518baa688494"
238 integrity sha512-E9qFi0seOkdlQnCTPv54brNfGWeFdRaEhI5tSue4pdx/V+xfxvMETsxXhOEcj1cYL+0n/jcTEmj/jD2gjzCwMg==
183 dependencies: 239 dependencies:
184 "@types/express" "*" 240 "@types/express" "*"
185 241
186"@types/multer@^1.3.3": 242"@types/multer@^1.3.3":
187 version "1.3.7" 243 version "1.3.7"
188 resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.3.7.tgz#9fe1de9f44f401ff2eaf0d4468cf16935a9c6866" 244 resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.3.7.tgz#9fe1de9f44f401ff2eaf0d4468cf16935a9c6866"
245 integrity sha512-Lx4rNtGajRGtcVwJe1sKPAkAuBBWq8TOuimKJfOfK7ayY1Jc+18Lx00GjagLeIwaH2+OvFJvCv8tz+pvbt3OoA==
189 dependencies: 246 dependencies:
190 "@types/express" "*" 247 "@types/express" "*"
191 248
192"@types/node@*", "@types/node@^10.0.8": 249"@types/node@*", "@types/node@^10.0.8":
193 version "10.10.1" 250 version "10.12.12"
194 resolved "https://registry.yarnpkg.com/@types/node/-/node-10.10.1.tgz#d5c96ca246a418404914d180b7fdd625ad18eca6" 251 resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47"
252 integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==
195 253
196"@types/node@6.0.41": 254"@types/node@6.0.41":
197 version "6.0.41" 255 version "6.0.41"
198 resolved "http://registry.npmjs.org/@types/node/-/node-6.0.41.tgz#578cf53aaec65887bcaf16792f8722932e8ff8ea" 256 resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.41.tgz#578cf53aaec65887bcaf16792f8722932e8ff8ea"
257 integrity sha1-V4z1Oq7GWIe8rxZ5L4ciky6P+Oo=
199 258
200"@types/nodemailer@^4.3.1": 259"@types/nodemailer@^4.3.1":
201 version "4.6.5" 260 version "4.6.5"
202 resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-4.6.5.tgz#8bb799202f8cfcc8200a1c1627f6a8a74fe71da6" 261 resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-4.6.5.tgz#8bb799202f8cfcc8200a1c1627f6a8a74fe71da6"
262 integrity sha512-cbs2HFLj33TBqzcCqTrs+6/mgTX3xl0odbApv3vTdF2+JERLxh5rDZCasXhvy+YqaiUNBr2I1RjNCdbKGs1Bnw==
203 dependencies: 263 dependencies:
204 "@types/events" "*" 264 "@types/events" "*"
205 "@types/node" "*" 265 "@types/node" "*"
206 266
207"@types/oauth2-server@^3.0.8": 267"@types/oauth2-server@^3.0.8":
208 version "3.0.8" 268 version "3.0.10"
209 resolved "https://registry.yarnpkg.com/@types/oauth2-server/-/oauth2-server-3.0.8.tgz#0b7f5083790732ea00bf8c5e0b04b9fa1f22f22c" 269 resolved "https://registry.yarnpkg.com/@types/oauth2-server/-/oauth2-server-3.0.10.tgz#ea671a6ad3d02062aac5f7c1ba1fb9c468314db0"
270 integrity sha512-1XYQdBrBuGimRhGLk9XavjGY2h5IYmT0rTi3pDAWzq6xRWZp+LCAwNm8YNYdDwQxBp//eogtZePe8mS7QPDiNg==
210 dependencies: 271 dependencies:
211 "@types/express" "*" 272 "@types/express" "*"
212 273
213"@types/parse-torrent-file@*": 274"@types/parse-torrent-file@*":
214 version "4.0.1" 275 version "4.0.1"
215 resolved "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz#056a6c18f3fac0cd7c6c74540f00496a3225976b" 276 resolved "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz#056a6c18f3fac0cd7c6c74540f00496a3225976b"
277 integrity sha1-BWpsGPP6wM18bHRUDwBJajIll2s=
216 dependencies: 278 dependencies:
217 "@types/node" "*" 279 "@types/node" "*"
218 280
219"@types/parse-torrent@*": 281"@types/parse-torrent@*":
220 version "5.8.2" 282 version "5.8.2"
221 resolved "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.2.tgz#53ab880e38ced2005a79948f0df0c8762539323e" 283 resolved "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.2.tgz#53ab880e38ced2005a79948f0df0c8762539323e"
284 integrity sha512-wfXO0N2vNkk/W1CEiPbT+7GPiOe3fnRLecdFBw/HNxPyx6czOGqUYi8bw2dbjEmYqWSsqhMdrajEd6o5ry2p4w==
222 dependencies: 285 dependencies:
223 "@types/magnet-uri" "*" 286 "@types/magnet-uri" "*"
224 "@types/node" "*" 287 "@types/node" "*"
@@ -227,21 +290,24 @@
227"@types/pem@^1.9.3": 290"@types/pem@^1.9.3":
228 version "1.9.3" 291 version "1.9.3"
229 resolved "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.3.tgz#0c864c8b79e43fef6367db895f60fd1edd10e86c" 292 resolved "https://registry.yarnpkg.com/@types/pem/-/pem-1.9.3.tgz#0c864c8b79e43fef6367db895f60fd1edd10e86c"
293 integrity sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==
230 294
231"@types/range-parser@*": 295"@types/range-parser@*":
232 version "1.2.2" 296 version "1.2.2"
233 resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" 297 resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d"
298 integrity sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==
234 299
235"@types/redis@^2.8.5": 300"@types/redis@^2.8.5":
236 version "2.8.6" 301 version "2.8.8"
237 resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.6.tgz#3674d07a13ad76bccda4c37dc3909e4e95757e7e" 302 resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.8.tgz#70855e79a6020080cca3cb5f1f5ee7f11b49a979"
303 integrity sha512-o/1ufNVPA92uum9HFbEiXXIHBuLywSwHQtAZoACMc1FhPXS5YftybBC1EI0zjdbUb273VVWF0Ivll/bq4g+gyw==
238 dependencies: 304 dependencies:
239 "@types/events" "*"
240 "@types/node" "*" 305 "@types/node" "*"
241 306
242"@types/request@^2.0.3": 307"@types/request@^2.0.3":
243 version "2.47.1" 308 version "2.48.1"
244 resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.1.tgz#25410d3afbdac04c91a94ad9efc9824100735824" 309 resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.1.tgz#e402d691aa6670fbbff1957b15f1270230ab42fa"
310 integrity sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==
245 dependencies: 311 dependencies:
246 "@types/caseless" "*" 312 "@types/caseless" "*"
247 "@types/form-data" "*" 313 "@types/form-data" "*"
@@ -251,6 +317,7 @@
251"@types/sequelize@4.27.24": 317"@types/sequelize@4.27.24":
252 version "4.27.24" 318 version "4.27.24"
253 resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.27.24.tgz#7d593c062c368f570c68b0217f5c1d4c892ead48" 319 resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.27.24.tgz#7d593c062c368f570c68b0217f5c1d4c892ead48"
320 integrity sha512-5uMFsMa/0hU/7/8znyfBKSJy2Mbd57uRpYk5X1+Phz9dN0MRZLbTbj1JMeB3CJ4R9b1coNQGfp2kXh4OjI9UyA==
254 dependencies: 321 dependencies:
255 "@types/bluebird" "*" 322 "@types/bluebird" "*"
256 "@types/continuation-local-storage" "*" 323 "@types/continuation-local-storage" "*"
@@ -260,50 +327,66 @@
260"@types/serve-static@*": 327"@types/serve-static@*":
261 version "1.13.2" 328 version "1.13.2"
262 resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 329 resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
330 integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==
263 dependencies: 331 dependencies:
264 "@types/express-serve-static-core" "*" 332 "@types/express-serve-static-core" "*"
265 "@types/mime" "*" 333 "@types/mime" "*"
266 334
267"@types/sharp@^0.17.6": 335"@types/sharp@^0.21.0":
268 version "0.17.10" 336 version "0.21.0"
269 resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.17.10.tgz#4f546861c53fae2b1bffcdd1ae7e691cc68afa52" 337 resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.21.0.tgz#e364b345c70e5924a5c626aaccaa236e0cfc2455"
338 integrity sha512-BmsCha5/lx2Afz2zwNo9F2txlkZ9HQf49N94lzSFmj5Oc7NfRMZguwVIhytb65qdY2zNF+azovzDNso6JUZpOw==
270 dependencies: 339 dependencies:
271 "@types/node" "*" 340 "@types/node" "*"
272 341
273"@types/simple-peer@*": 342"@types/simple-peer@*":
274 version "6.1.5" 343 version "6.1.5"
275 resolved "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.5.tgz#9353f84cefd052a9684b9a5662c983fc2bcfab41" 344 resolved "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.5.tgz#9353f84cefd052a9684b9a5662c983fc2bcfab41"
345 integrity sha512-huXri3g0rQpIO5jkG630a2sBrh1WXgsd2Gsoc9MqWTRZ0AWqyMEcMCfLXmw5i8AvrZbjAT6BIxW2gEqvpqSYwA==
346 dependencies:
347 "@types/node" "*"
348
349"@types/socket.io@^2.1.2":
350 version "2.1.2"
351 resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.2.tgz#7165c2587cc3b86b44aa78e2a0060140551de211"
352 integrity sha512-Ind+4qMNfQ62llyB4IMs1D8znMEBsMKohZBPqfBUIXqLQ9bdtWIbNTBWwtdcBWJKnokMZGcmWOOKslatni5vtA==
276 dependencies: 353 dependencies:
277 "@types/node" "*" 354 "@types/node" "*"
278 355
279"@types/superagent@*": 356"@types/superagent@*":
280 version "3.8.4" 357 version "3.8.4"
281 resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-3.8.4.tgz#24a5973c7d1a9c024b4bbda742a79267c33fb86a" 358 resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-3.8.4.tgz#24a5973c7d1a9c024b4bbda742a79267c33fb86a"
359 integrity sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ==
282 dependencies: 360 dependencies:
283 "@types/cookiejar" "*" 361 "@types/cookiejar" "*"
284 "@types/node" "*" 362 "@types/node" "*"
285 363
286"@types/supertest@^2.0.3": 364"@types/supertest@^2.0.3":
287 version "2.0.6" 365 version "2.0.7"
288 resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.6.tgz#a0665350c0e36315e1bccdf4785f2b76fcb71b6b" 366 resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.7.tgz#46ff6508075cd4519736be060f0d6331a5c8ca7b"
367 integrity sha512-GibTh4OTkal71btYe2fpZP/rVHIPnnUsYphEaoywVHo+mo2a/LhlOFkIm5wdN0H0DA0Hx8x+tKgCYMD9elHu5w==
289 dependencies: 368 dependencies:
290 "@types/superagent" "*" 369 "@types/superagent" "*"
291 370
292"@types/tough-cookie@*": 371"@types/tough-cookie@*":
293 version "2.3.3" 372 version "2.3.4"
294 resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.3.tgz#7f226d67d654ec9070e755f46daebf014628e9d9" 373 resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.4.tgz#821878b81bfab971b93a265a561d54ea61f9059f"
374 integrity sha512-Set5ZdrAaKI/qHdFlVMgm/GsAv/wkXhSTuZFkJ+JI7HK+wIkIlOaUXSXieIvJ0+OvGIqtREFoE+NHJtEq0gtEw==
295 375
296"@types/tv4@*": 376"@types/tv4@*":
297 version "1.2.29" 377 version "1.2.29"
298 resolved "https://registry.yarnpkg.com/@types/tv4/-/tv4-1.2.29.tgz#4c6d2222b03245dd2104f4fd67f54d1658985911" 378 resolved "https://registry.yarnpkg.com/@types/tv4/-/tv4-1.2.29.tgz#4c6d2222b03245dd2104f4fd67f54d1658985911"
379 integrity sha512-NtJmi+XbYocrLb5Au4Q64srX4FlCPDvrSF/OnK3H0QJwrw40tIUoQPDoUHnZ5wpAB2KThtVyeS+kOEQyZabORg==
299 380
300"@types/validator@*", "@types/validator@^9.4.0": 381"@types/validator@*", "@types/validator@^9.4.0":
301 version "9.4.2" 382 version "9.4.3"
302 resolved "https://registry.yarnpkg.com/@types/validator/-/validator-9.4.2.tgz#9fec264b35f0ea21d0967eeec2dcd6a798b34350" 383 resolved "https://registry.yarnpkg.com/@types/validator/-/validator-9.4.3.tgz#11321eae0546b20f13020131ff890c294df72ecb"
384 integrity sha512-D4zRrAs2pTg5cva6+hJ6GrQlb/UX5NxNtk/da3Gw27enoLvbRMTTloZ1w6CCqc+kHyZvT3DsyWQZ8baTGgSg0g==
303 385
304"@types/webtorrent@^0.98.4": 386"@types/webtorrent@^0.98.4":
305 version "0.98.4" 387 version "0.98.4"
306 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4" 388 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4"
389 integrity sha1-z42+IuPVz2kVMF9/lwtSvKAb+LQ=
307 dependencies: 390 dependencies:
308 "@types/bittorrent-protocol" "*" 391 "@types/bittorrent-protocol" "*"
309 "@types/node" "*" 392 "@types/node" "*"
@@ -313,13 +396,15 @@
313"@types/ws@^6.0.0": 396"@types/ws@^6.0.0":
314 version "6.0.1" 397 version "6.0.1"
315 resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" 398 resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28"
399 integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==
316 dependencies: 400 dependencies:
317 "@types/events" "*" 401 "@types/events" "*"
318 "@types/node" "*" 402 "@types/node" "*"
319 403
320JSONStream@^1.3.4: 404JSONStream@^1.3.4:
321 version "1.3.4" 405 version "1.3.5"
322 resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e" 406 resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
407 integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
323 dependencies: 408 dependencies:
324 jsonparse "^1.2.0" 409 jsonparse "^1.2.0"
325 through ">=2.2.7 <3" 410 through ">=2.2.7 <3"
@@ -327,10 +412,12 @@ JSONStream@^1.3.4:
327abbrev@1, abbrev@~1.1.1: 412abbrev@1, abbrev@~1.1.1:
328 version "1.1.1" 413 version "1.1.1"
329 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 414 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
415 integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
330 416
331accepts@1.3.3: 417accepts@1.3.3:
332 version "1.3.3" 418 version "1.3.3"
333 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 419 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
420 integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=
334 dependencies: 421 dependencies:
335 mime-types "~2.1.11" 422 mime-types "~2.1.11"
336 negotiator "0.6.1" 423 negotiator "0.6.1"
@@ -338,6 +425,7 @@ accepts@1.3.3:
338accepts@~1.2.12: 425accepts@~1.2.12:
339 version "1.2.13" 426 version "1.2.13"
340 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" 427 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea"
428 integrity sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=
341 dependencies: 429 dependencies:
342 mime-types "~2.1.6" 430 mime-types "~2.1.6"
343 negotiator "0.5.3" 431 negotiator "0.5.3"
@@ -345,6 +433,7 @@ accepts@~1.2.12:
345accepts@~1.3.4, accepts@~1.3.5: 433accepts@~1.3.4, accepts@~1.3.5:
346 version "1.3.5" 434 version "1.3.5"
347 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 435 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
436 integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I=
348 dependencies: 437 dependencies:
349 mime-types "~2.1.18" 438 mime-types "~2.1.18"
350 negotiator "0.6.1" 439 negotiator "0.6.1"
@@ -352,130 +441,148 @@ accepts@~1.3.4, accepts@~1.3.5:
352acorn-jsx@^3.0.0: 441acorn-jsx@^3.0.0:
353 version "3.0.1" 442 version "3.0.1"
354 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 443 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
444 integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
355 dependencies: 445 dependencies:
356 acorn "^3.0.4" 446 acorn "^3.0.4"
357 447
358acorn@^3.0.4: 448acorn@^3.0.4:
359 version "3.3.0" 449 version "3.3.0"
360 resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 450 resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
451 integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
361 452
362acorn@^5.5.0: 453acorn@^5.5.0:
363 version "5.7.3" 454 version "5.7.3"
364 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 455 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
456 integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
365 457
366addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2: 458addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2:
367 version "1.5.1" 459 version "1.5.1"
368 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208" 460 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208"
461 integrity sha512-bA+dyydTNuQtrEDJ0g9eR7XabNhvrM5yZY0hvTbNK3yvoeC73ZqMES6E1cEqH9WPxs4uMtMsOjfwS4FmluhsAA==
369 462
370addressparser@~1.0.1: 463addressparser@~1.0.1:
371 version "1.0.1" 464 version "1.0.1"
372 resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" 465 resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746"
466 integrity sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=
373 467
374after@0.8.2: 468after@0.8.2:
375 version "0.8.2" 469 version "0.8.2"
376 resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 470 resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
471 integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
377 472
378agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: 473agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0:
379 version "4.2.1" 474 version "4.2.1"
380 resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 475 resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
476 integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
381 dependencies: 477 dependencies:
382 es6-promisify "^5.0.0" 478 es6-promisify "^5.0.0"
383 479
384agentkeepalive@^3.4.1: 480agentkeepalive@^3.4.1:
385 version "3.5.1" 481 version "3.5.2"
386 resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.1.tgz#4eba75cf2ad258fc09efd506cdb8d8c2971d35a4" 482 resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
483 integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
387 dependencies: 484 dependencies:
388 humanize-ms "^1.2.1" 485 humanize-ms "^1.2.1"
389 486
390ajv-keywords@^1.0.0: 487ajv-keywords@^1.0.0:
391 version "1.5.1" 488 version "1.5.1"
392 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 489 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
490 integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw=
393 491
394ajv@^4.7.0: 492ajv@^4.7.0:
395 version "4.11.8" 493 version "4.11.8"
396 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 494 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
495 integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
397 dependencies: 496 dependencies:
398 co "^4.6.0" 497 co "^4.6.0"
399 json-stable-stringify "^1.0.1" 498 json-stable-stringify "^1.0.1"
400 499
401ajv@^5.1.0, ajv@^5.3.0: 500ajv@^6.5.5:
402 version "5.5.2" 501 version "6.6.1"
403 resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 502 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
503 integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==
404 dependencies: 504 dependencies:
405 co "^4.6.0" 505 fast-deep-equal "^2.0.1"
406 fast-deep-equal "^1.0.0"
407 fast-json-stable-stringify "^2.0.0" 506 fast-json-stable-stringify "^2.0.0"
408 json-schema-traverse "^0.3.0" 507 json-schema-traverse "^0.4.1"
409 508 uri-js "^4.2.2"
410alce@^1.0.0:
411 version "1.2.0"
412 resolved "https://registry.yarnpkg.com/alce/-/alce-1.2.0.tgz#a8be2dacaac42494612f18dc09db691f3dea4aab"
413 dependencies:
414 esprima "^1.2.0"
415 estraverse "^1.5.0"
416
417amdefine@>=0.0.4:
418 version "1.0.1"
419 resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
420 509
421ansi-align@^2.0.0: 510ansi-align@^2.0.0:
422 version "2.0.0" 511 version "2.0.0"
423 resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 512 resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
513 integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
424 dependencies: 514 dependencies:
425 string-width "^2.0.0" 515 string-width "^2.0.0"
426 516
427ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: 517ansi-escapes@^1.1.0:
428 version "1.4.0" 518 version "1.4.0"
429 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 519 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
520 integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
521
522ansi-escapes@^3.0.0:
523 version "3.1.0"
524 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
525 integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==
430 526
431ansi-regex@^2.0.0: 527ansi-regex@^2.0.0:
432 version "2.1.1" 528 version "2.1.1"
433 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 529 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
530 integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
434 531
435ansi-regex@^3.0.0: 532ansi-regex@^3.0.0:
436 version "3.0.0" 533 version "3.0.0"
437 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 534 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
535 integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
438 536
439ansi-styles@^2.2.1: 537ansi-styles@^2.2.1:
440 version "2.2.1" 538 version "2.2.1"
441 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 539 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
540 integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
442 541
443ansi-styles@^3.2.0, ansi-styles@^3.2.1: 542ansi-styles@^3.2.0, ansi-styles@^3.2.1:
444 version "3.2.1" 543 version "3.2.1"
445 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 544 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
545 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
446 dependencies: 546 dependencies:
447 color-convert "^1.9.0" 547 color-convert "^1.9.0"
448 548
449ansicolors@~0.3.2: 549ansicolors@~0.3.2:
450 version "0.3.2" 550 version "0.3.2"
451 resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" 551 resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
552 integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
452 553
453ansistyles@~0.1.3: 554ansistyles@~0.1.3:
454 version "0.1.3" 555 version "0.1.3"
455 resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" 556 resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
557 integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
456 558
457any-observable@^0.3.0: 559any-observable@^0.3.0:
458 version "0.3.0" 560 version "0.3.0"
459 resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" 561 resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
562 integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==
460 563
461anymatch@^2.0.0: 564anymatch@^2.0.0:
462 version "2.0.0" 565 version "2.0.0"
463 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 566 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
567 integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
464 dependencies: 568 dependencies:
465 micromatch "^3.1.4" 569 micromatch "^3.1.4"
466 normalize-path "^2.1.1" 570 normalize-path "^2.1.1"
467 571
468append-field@^0.1.0: 572append-field@^1.0.0:
469 version "0.1.0" 573 version "1.0.0"
470 resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" 574 resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
575 integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=
471 576
472application-config-path@^0.1.0: 577application-config-path@^0.1.0:
473 version "0.1.0" 578 version "0.1.0"
474 resolved "https://registry.yarnpkg.com/application-config-path/-/application-config-path-0.1.0.tgz#193c5f0a86541a4c66fba1e2dc38583362ea5e8f" 579 resolved "https://registry.yarnpkg.com/application-config-path/-/application-config-path-0.1.0.tgz#193c5f0a86541a4c66fba1e2dc38583362ea5e8f"
580 integrity sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=
475 581
476application-config@^1.0.1: 582application-config@^1.0.1:
477 version "1.0.1" 583 version "1.0.1"
478 resolved "https://registry.yarnpkg.com/application-config/-/application-config-1.0.1.tgz#5aa2e2a5ed6abd2e5d1d473d3596f574044fe9e7" 584 resolved "https://registry.yarnpkg.com/application-config/-/application-config-1.0.1.tgz#5aa2e2a5ed6abd2e5d1d473d3596f574044fe9e7"
585 integrity sha1-WqLipe1qvS5dHUc9NZb1dARP6ec=
479 dependencies: 586 dependencies:
480 application-config-path "^0.1.0" 587 application-config-path "^0.1.0"
481 mkdirp "^0.5.1" 588 mkdirp "^0.5.1"
@@ -483,173 +590,185 @@ application-config@^1.0.1:
483aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2, aproba@~1.2.0: 590aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2, aproba@~1.2.0:
484 version "1.2.0" 591 version "1.2.0"
485 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 592 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
593 integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
486 594
487"aproba@^1.1.2 || 2": 595"aproba@^1.1.2 || 2":
488 version "2.0.0" 596 version "2.0.0"
489 resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" 597 resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
598 integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
490 599
491archy@~1.0.0: 600archy@~1.0.0:
492 version "1.0.0" 601 version "1.0.0"
493 resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 602 resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
603 integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
494 604
495are-we-there-yet@~1.1.2: 605are-we-there-yet@~1.1.2:
496 version "1.1.5" 606 version "1.1.5"
497 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 607 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
608 integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
498 dependencies: 609 dependencies:
499 delegates "^1.0.0" 610 delegates "^1.0.0"
500 readable-stream "^2.0.6" 611 readable-stream "^2.0.6"
501 612
502argparse@^1.0.2, argparse@^1.0.7: 613argparse@^1.0.7:
503 version "1.0.10" 614 version "1.0.10"
504 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 615 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
616 integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
505 dependencies: 617 dependencies:
506 sprintf-js "~1.0.2" 618 sprintf-js "~1.0.2"
507 619
508arr-diff@^4.0.0: 620arr-diff@^4.0.0:
509 version "4.0.0" 621 version "4.0.0"
510 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 622 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
623 integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
511 624
512arr-flatten@^1.1.0: 625arr-flatten@^1.1.0:
513 version "1.1.0" 626 version "1.1.0"
514 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 627 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
628 integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
515 629
516arr-union@^3.1.0: 630arr-union@^3.1.0:
517 version "3.1.0" 631 version "3.1.0"
518 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 632 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
519 633 integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
520array-differ@^0.1.0:
521 version "0.1.0"
522 resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-0.1.0.tgz#12e2c9b706bed47c8b483b57e487473fb0861f3a"
523
524array-find-index@^1.0.1:
525 version "1.0.2"
526 resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
527 634
528array-flatten@1.1.1: 635array-flatten@1.1.1:
529 version "1.1.1" 636 version "1.1.1"
530 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 637 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
531 638 integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
532array-union@^0.1.0:
533 version "0.1.0"
534 resolved "https://registry.yarnpkg.com/array-union/-/array-union-0.1.0.tgz#ede98088330665e699e1ebf0227cbc6034e627db"
535 dependencies:
536 array-uniq "^0.1.0"
537 639
538array-union@^1.0.1: 640array-union@^1.0.1:
539 version "1.0.2" 641 version "1.0.2"
540 resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 642 resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
643 integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
541 dependencies: 644 dependencies:
542 array-uniq "^1.0.1" 645 array-uniq "^1.0.1"
543 646
544array-uniq@^0.1.0:
545 version "0.1.1"
546 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-0.1.1.tgz#5861f3ed4e4bb6175597a4e078e8aa78ebe958c7"
547
548array-uniq@^1.0.1: 647array-uniq@^1.0.1:
549 version "1.0.3" 648 version "1.0.3"
550 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 649 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
650 integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
551 651
552array-unique@^0.3.2: 652array-unique@^0.3.2:
553 version "0.3.2" 653 version "0.3.2"
554 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 654 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
655 integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
555 656
556arraybuffer.slice@0.0.6: 657arraybuffer.slice@0.0.6:
557 version "0.0.6" 658 version "0.0.6"
558 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" 659 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
660 integrity sha1-8zshWfBTKj8xB6JywMz70a0peco=
559 661
560arrify@^1.0.0: 662arraybuffer.slice@~0.0.7:
663 version "0.0.7"
664 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
665 integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
666
667arrify@^1.0.0, arrify@^1.0.1:
561 version "1.0.1" 668 version "1.0.1"
562 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 669 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
670 integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
563 671
564asap@^2.0.0, asap@~2.0.3: 672asap@^2.0.0:
565 version "2.0.6" 673 version "2.0.6"
566 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 674 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
675 integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
567 676
568asn1@~0.2.3: 677asn1@~0.2.3:
569 version "0.2.4" 678 version "0.2.4"
570 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 679 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
680 integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
571 dependencies: 681 dependencies:
572 safer-buffer "~2.1.0" 682 safer-buffer "~2.1.0"
573 683
574assert-plus@1.0.0, assert-plus@^1.0.0: 684assert-plus@1.0.0, assert-plus@^1.0.0:
575 version "1.0.0" 685 version "1.0.0"
576 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 686 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
687 integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
577 688
578assertion-error@1.0.0: 689assertion-error@1.0.0:
579 version "1.0.0" 690 version "1.0.0"
580 resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b" 691 resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b"
692 integrity sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=
581 693
582assertion-error@^1.0.1: 694assertion-error@^1.1.0:
583 version "1.1.0" 695 version "1.1.0"
584 resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 696 resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
697 integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
585 698
586assign-symbols@^1.0.0: 699assign-symbols@^1.0.0:
587 version "1.0.0" 700 version "1.0.0"
588 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 701 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
702 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
589 703
590async-each@^1.0.0: 704async-each@^1.0.0:
591 version "1.0.1" 705 version "1.0.1"
592 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 706 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
593 707 integrity sha1-GdOGodntxufByF04iu28xW0zYC0=
594async-foreach@^0.1.3:
595 version "0.1.3"
596 resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
597 708
598async-limiter@~1.0.0: 709async-limiter@~1.0.0:
599 version "1.0.0" 710 version "1.0.0"
600 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 711 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
712 integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
601 713
602async-lock@^1.1.2: 714async-lock@^1.1.2:
603 version "1.1.3" 715 version "1.1.3"
604 resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.1.3.tgz#e47f1cbb6bec765b73e27ed8961d58006457ec08" 716 resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.1.3.tgz#e47f1cbb6bec765b73e27ed8961d58006457ec08"
717 integrity sha512-nxlfFLGfCJ1r7p9zhR5OuL6jYkDd9P7FqSitfLji+C1NdyhCz4+rWW3kiPiyPASHhN7VlsKEvRWWbnME9lYngw==
605 718
606async-lru@^1.1.1: 719async-lru@^1.1.1:
607 version "1.1.2" 720 version "1.1.2"
608 resolved "https://registry.yarnpkg.com/async-lru/-/async-lru-1.1.2.tgz#abe831f3a52123c87d44273615e203b1ef04692e" 721 resolved "https://registry.yarnpkg.com/async-lru/-/async-lru-1.1.2.tgz#abe831f3a52123c87d44273615e203b1ef04692e"
722 integrity sha512-CXwKC9Wu0GnywJRc8kxjg2HnDHhomhL99DmNGhyV7gna1MmKTJAibE8zp0+ugWEhnIA29xwnZ+FbdEE7yNNkUA==
609 dependencies: 723 dependencies:
610 lru "^3.1.0" 724 lru "^3.1.0"
611 725
612async@1.5.1: 726async@1.5.1:
613 version "1.5.1" 727 version "1.5.1"
614 resolved "https://registry.yarnpkg.com/async/-/async-1.5.1.tgz#b05714f4b11b357bf79adaffdd06da42d0766c10" 728 resolved "https://registry.yarnpkg.com/async/-/async-1.5.1.tgz#b05714f4b11b357bf79adaffdd06da42d0766c10"
729 integrity sha1-sFcU9LEbNXv3mtr/3QbaQtB2bBA=
615 730
616async@1.5.2, async@^1.5.2, async@~1.5.2: 731async@>=0.2.9, async@^2.0.0, async@^2.6.0, async@^2.6.1:
617 version "1.5.2"
618 resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
619
620async@>=0.2.9, async@^2.0.0, async@^2.5.0, async@^2.6.0:
621 version "2.6.1" 732 version "2.6.1"
622 resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" 733 resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
734 integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
623 dependencies: 735 dependencies:
624 lodash "^4.17.10" 736 lodash "^4.17.10"
625 737
626async@^0.9.0, async@~0.9.0: 738async@~0.9.0:
627 version "0.9.2" 739 version "0.9.2"
628 resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 740 resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
741 integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
629 742
630async@~1.0.0: 743async@~1.0.0:
631 version "1.0.0" 744 version "1.0.0"
632 resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" 745 resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
746 integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
633 747
634asynckit@^0.4.0: 748asynckit@^0.4.0:
635 version "0.4.0" 749 version "0.4.0"
636 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 750 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
751 integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
637 752
638atob@^2.1.1: 753atob@^2.1.1:
639 version "2.1.2" 754 version "2.1.2"
640 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 755 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
756 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
641 757
642aws-sign2@~0.7.0: 758aws-sign2@~0.7.0:
643 version "0.7.0" 759 version "0.7.0"
644 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 760 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
761 integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
645 762
646aws4@^1.6.0, aws4@^1.8.0: 763aws4@^1.8.0:
647 version "1.8.0" 764 version "1.8.0"
648 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 765 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
766 integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
649 767
650babel-code-frame@^6.22.0: 768babel-code-frame@^6.22.0:
651 version "6.26.0" 769 version "6.26.0"
652 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 770 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
771 integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
653 dependencies: 772 dependencies:
654 chalk "^1.1.3" 773 chalk "^1.1.3"
655 esutils "^2.0.2" 774 esutils "^2.0.2"
@@ -658,26 +777,27 @@ babel-code-frame@^6.22.0:
658backo2@1.0.2: 777backo2@1.0.2:
659 version "1.0.2" 778 version "1.0.2"
660 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 779 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
780 integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
661 781
662balanced-match@^1.0.0: 782balanced-match@^1.0.0:
663 version "1.0.0" 783 version "1.0.0"
664 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 784 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
785 integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
665 786
666base64-arraybuffer@0.1.5: 787base64-arraybuffer@0.1.5:
667 version "0.1.5" 788 version "0.1.5"
668 resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 789 resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
669 790 integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
670base64-js@~0.0.6:
671 version "0.0.8"
672 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
673 791
674base64id@1.0.0: 792base64id@1.0.0:
675 version "1.0.0" 793 version "1.0.0"
676 resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 794 resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
795 integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=
677 796
678base@^0.11.1: 797base@^0.11.1:
679 version "0.11.2" 798 version "0.11.2"
680 resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 799 resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
800 integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
681 dependencies: 801 dependencies:
682 cache-base "^1.0.1" 802 cache-base "^1.0.1"
683 class-utils "^0.3.5" 803 class-utils "^0.3.5"
@@ -689,46 +809,49 @@ base@^0.11.1:
689 809
690basic-auth@1.1.0: 810basic-auth@1.1.0:
691 version "1.1.0" 811 version "1.1.0"
692 resolved "http://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" 812 resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
813 integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=
693 814
694basic-auth@~2.0.0: 815basic-auth@~2.0.0:
695 version "2.0.1" 816 version "2.0.1"
696 resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 817 resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
818 integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
697 dependencies: 819 dependencies:
698 safe-buffer "5.1.2" 820 safe-buffer "5.1.2"
699 821
700batch@0.6.1:
701 version "0.6.1"
702 resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
703
704bcrypt-pbkdf@^1.0.0: 822bcrypt-pbkdf@^1.0.0:
705 version "1.0.2" 823 version "1.0.2"
706 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 824 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
825 integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
707 dependencies: 826 dependencies:
708 tweetnacl "^0.14.3" 827 tweetnacl "^0.14.3"
709 828
710bcrypt@2: 829bcrypt@3.0.2:
711 version "2.0.1" 830 version "3.0.2"
712 resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-2.0.1.tgz#229c5afe09379789f918efe86e5e5b682e509f85" 831 resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.2.tgz#3c575c49ccbfdf0875eb42aa1453f5654092a33d"
832 integrity sha512-kE1IaaRchCgdrmzQX/eBQKcsuL4jRHZ+O11sMvEUrI/HgFTQYAGvxlj9z7kb3zfFuwljQ5y8/NrbnXtgx5oJLg==
713 dependencies: 833 dependencies:
714 nan "2.10.0" 834 nan "2.11.1"
715 node-pre-gyp "0.9.1" 835 node-pre-gyp "0.11.0"
716 836
717bencode@^2.0.0: 837bencode@^2.0.0:
718 version "2.0.0" 838 version "2.0.0"
719 resolved "https://registry.yarnpkg.com/bencode/-/bencode-2.0.0.tgz#e72e6b3691d824bd03ea7aa9d752cd1d49a50027" 839 resolved "https://registry.yarnpkg.com/bencode/-/bencode-2.0.0.tgz#e72e6b3691d824bd03ea7aa9d752cd1d49a50027"
840 integrity sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==
720 dependencies: 841 dependencies:
721 safe-buffer "^5.1.1" 842 safe-buffer "^5.1.1"
722 843
723better-assert@~1.0.0: 844better-assert@~1.0.0:
724 version "1.0.2" 845 version "1.0.2"
725 resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 846 resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
847 integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
726 dependencies: 848 dependencies:
727 callsite "1.0.0" 849 callsite "1.0.0"
728 850
729bin-links@^1.1.2: 851bin-links@^1.1.2:
730 version "1.1.2" 852 version "1.1.2"
731 resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" 853 resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757"
854 integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==
732 dependencies: 855 dependencies:
733 bluebird "^3.5.0" 856 bluebird "^3.5.0"
734 cmd-shim "^2.0.2" 857 cmd-shim "^2.0.2"
@@ -739,22 +862,27 @@ bin-links@^1.1.2:
739binary-extensions@^1.0.0: 862binary-extensions@^1.0.0:
740 version "1.12.0" 863 version "1.12.0"
741 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" 864 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
865 integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
742 866
743binary-search@^1.3.4: 867binary-search@^1.3.4:
744 version "1.3.4" 868 version "1.3.4"
745 resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.4.tgz#d15f44ff9226ef309d85247fa0dbfbf659955f56" 869 resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.4.tgz#d15f44ff9226ef309d85247fa0dbfbf659955f56"
870 integrity sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==
746 871
747bindings@^1.3.0, bindings@~1.3.0: 872bindings@^1.3.0, bindings@~1.3.0:
748 version "1.3.0" 873 version "1.3.1"
749 resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" 874 resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5"
875 integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew==
750 876
751bindings@~1.2.1: 877bindings@~1.2.1:
752 version "1.2.1" 878 version "1.2.1"
753 resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" 879 resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
880 integrity sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=
754 881
755bitcore-lib@^0.13.7: 882bitcore-lib@^0.13.7:
756 version "0.13.19" 883 version "0.13.19"
757 resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.13.19.tgz#48af1e9bda10067c1ab16263472b5add2000f3dc" 884 resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.13.19.tgz#48af1e9bda10067c1ab16263472b5add2000f3dc"
885 integrity sha1-SK8em9oQBnwasWJjRyta3SAA89w=
758 dependencies: 886 dependencies:
759 bn.js "=2.0.4" 887 bn.js "=2.0.4"
760 bs58 "=2.0.0" 888 bs58 "=2.0.0"
@@ -772,10 +900,12 @@ bitcore-lib@^0.13.7:
772bitfield@^2.0.0: 900bitfield@^2.0.0:
773 version "2.0.0" 901 version "2.0.0"
774 resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837" 902 resolved "https://registry.yarnpkg.com/bitfield/-/bitfield-2.0.0.tgz#fbe6767592fe5b4c87ecf1d04126294cc1bfa837"
903 integrity sha512-4xM4DYejOHQ/qWBfeqBXNA4mJ12PwcOibFYnH1kYh5U9BHciCqEJBqGNVnMJXUhm8mflujNRLSv7IiVQxovgjw==
775 904
776bittorrent-dht@^9.0.0: 905bittorrent-dht@^9.0.0:
777 version "9.0.0" 906 version "9.0.0"
778 resolved "https://registry.yarnpkg.com/bittorrent-dht/-/bittorrent-dht-9.0.0.tgz#08d5ebb51ed91d7e3eea5c275554f4323fb523e5" 907 resolved "https://registry.yarnpkg.com/bittorrent-dht/-/bittorrent-dht-9.0.0.tgz#08d5ebb51ed91d7e3eea5c275554f4323fb523e5"
908 integrity sha512-X5ax4G/PLtEPfqOUjqDZ2nmPENndWRMK4sT2jcQ4sXor904zhR40r4KqTyTvWYAljh5/hPPqM9DCUUtqWzRXoQ==
779 dependencies: 909 dependencies:
780 bencode "^2.0.0" 910 bencode "^2.0.0"
781 buffer-equals "^1.0.3" 911 buffer-equals "^1.0.3"
@@ -793,10 +923,12 @@ bittorrent-dht@^9.0.0:
793bittorrent-peerid@^1.0.2: 923bittorrent-peerid@^1.0.2:
794 version "1.3.0" 924 version "1.3.0"
795 resolved "https://registry.yarnpkg.com/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz#a435d3b267c887c586c528b53359845905d7c158" 925 resolved "https://registry.yarnpkg.com/bittorrent-peerid/-/bittorrent-peerid-1.3.0.tgz#a435d3b267c887c586c528b53359845905d7c158"
926 integrity sha512-SYd5H3RbN1ex+TrWAKXkEkASFWxAR7Tk6iLt9tfAT9ehBvZb/Y3AQDVRVJynlrixcWpnmsLYKI7tkRWgp7ORoQ==
796 927
797bittorrent-protocol@^3.0.0: 928bittorrent-protocol@^3.0.0:
798 version "3.0.1" 929 version "3.0.1"
799 resolved "https://registry.yarnpkg.com/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz#d3948f4d2b09d538095f7e5f93f64ba5df6b5c2a" 930 resolved "https://registry.yarnpkg.com/bittorrent-protocol/-/bittorrent-protocol-3.0.1.tgz#d3948f4d2b09d538095f7e5f93f64ba5df6b5c2a"
931 integrity sha512-hnvOzAu9u+2H0OLLL5byoFdz6oz5f3bx5f7R+ItUohTHMq9TgUhEJfcjo7xWtQHSKOVciYWwYTJ4EjczF5RX2A==
800 dependencies: 932 dependencies:
801 bencode "^2.0.0" 933 bencode "^2.0.0"
802 bitfield "^2.0.0" 934 bitfield "^2.0.0"
@@ -810,6 +942,7 @@ bittorrent-protocol@^3.0.0:
810bittorrent-tracker@^9.0.0: 942bittorrent-tracker@^9.0.0:
811 version "9.10.1" 943 version "9.10.1"
812 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11" 944 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11"
945 integrity sha512-n5zTL/g6Wt0rb2EnkiyiaGYhth7I/N0/xMqGUpvGX/7g1scDGBVPhJnXR8lfp3/OMj681fv40o4q/otECMtZSA==
813 dependencies: 946 dependencies:
814 bencode "^2.0.0" 947 bencode "^2.0.0"
815 bittorrent-peerid "^1.0.2" 948 bittorrent-peerid "^1.0.2"
@@ -841,6 +974,7 @@ bittorrent-tracker@^9.0.0:
841bl@^1.0.0: 974bl@^1.0.0:
842 version "1.2.2" 975 version "1.2.2"
843 resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" 976 resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
977 integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
844 dependencies: 978 dependencies:
845 readable-stream "^2.3.5" 979 readable-stream "^2.3.5"
846 safe-buffer "^5.1.1" 980 safe-buffer "^5.1.1"
@@ -848,14 +982,22 @@ bl@^1.0.0:
848blob-to-buffer@^1.2.6: 982blob-to-buffer@^1.2.6:
849 version "1.2.8" 983 version "1.2.8"
850 resolved "https://registry.yarnpkg.com/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz#78eeeb332f1280ed0ca6fb2b60693a8c6d36903a" 984 resolved "https://registry.yarnpkg.com/blob-to-buffer/-/blob-to-buffer-1.2.8.tgz#78eeeb332f1280ed0ca6fb2b60693a8c6d36903a"
985 integrity sha512-re0AIxakF504MgeMtIyJkVcZ8T5aUxtp/QmTMlmjyb3P44E1BEv5x3LATBGApWAJATyXHtkXRD+gWTmeyYLiQA==
851 986
852blob@0.0.4: 987blob@0.0.4:
853 version "0.0.4" 988 version "0.0.4"
854 resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" 989 resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
990 integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=
991
992blob@0.0.5:
993 version "0.0.5"
994 resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
995 integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
855 996
856block-stream2@^1.0.0: 997block-stream2@^1.0.0:
857 version "1.1.0" 998 version "1.1.0"
858 resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz#c738e3a91ba977ebb5e1fef431e13ca11d8639e2" 999 resolved "https://registry.yarnpkg.com/block-stream2/-/block-stream2-1.1.0.tgz#c738e3a91ba977ebb5e1fef431e13ca11d8639e2"
1000 integrity sha1-xzjjqRupd+u14f70MeE8oR2GOeI=
859 dependencies: 1001 dependencies:
860 defined "^1.0.0" 1002 defined "^1.0.0"
861 inherits "^2.0.1" 1003 inherits "^2.0.1"
@@ -864,51 +1006,44 @@ block-stream2@^1.0.0:
864block-stream@*: 1006block-stream@*:
865 version "0.0.9" 1007 version "0.0.9"
866 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 1008 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
1009 integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
867 dependencies: 1010 dependencies:
868 inherits "~2.0.0" 1011 inherits "~2.0.0"
869 1012
870bluebird@3.5.0: 1013bluebird@3.5.0:
871 version "3.5.0" 1014 version "3.5.0"
872 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 1015 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
1016 integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=
873 1017
874bluebird@^2.10.0: 1018bluebird@^2.10.0:
875 version "2.11.0" 1019 version "2.11.0"
876 resolved "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" 1020 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
1021 integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
877 1022
878bluebird@^3.0.5, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@~3.5.1: 1023bluebird@^3.0.5, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@~3.5.1:
879 version "3.5.2" 1024 version "3.5.3"
880 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" 1025 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
1026 integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
881 1027
882bn.js@=2.0.4: 1028bn.js@=2.0.4:
883 version "2.0.4" 1029 version "2.0.4"
884 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz#220a7cd677f7f1bfa93627ff4193776fe7819480" 1030 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz#220a7cd677f7f1bfa93627ff4193776fe7819480"
1031 integrity sha1-Igp81nf38b+pNif/QZN3b+eBlIA=
885 1032
886bn.js@^2.0.0: 1033bn.js@^2.0.0:
887 version "2.2.0" 1034 version "2.2.0"
888 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" 1035 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625"
1036 integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU=
889 1037
890bn.js@^4.4.0: 1038bn.js@^4.4.0:
891 version "4.11.8" 1039 version "4.11.8"
892 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 1040 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
1041 integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
893 1042
894body-parser@1.18.2: 1043body-parser@1.18.3, body-parser@^1.12.4:
895 version "1.18.2"
896 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
897 dependencies:
898 bytes "3.0.0"
899 content-type "~1.0.4"
900 debug "2.6.9"
901 depd "~1.1.1"
902 http-errors "~1.6.2"
903 iconv-lite "0.4.19"
904 on-finished "~2.3.0"
905 qs "6.5.1"
906 raw-body "2.3.2"
907 type-is "~1.6.15"
908
909body-parser@^1.12.4:
910 version "1.18.3" 1044 version "1.18.3"
911 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 1045 resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
1046 integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=
912 dependencies: 1047 dependencies:
913 bytes "3.0.0" 1048 bytes "3.0.0"
914 content-type "~1.0.4" 1049 content-type "~1.0.4"
@@ -921,22 +1056,10 @@ body-parser@^1.12.4:
921 raw-body "2.3.3" 1056 raw-body "2.3.3"
922 type-is "~1.6.16" 1057 type-is "~1.6.16"
923 1058
924body@^5.1.0:
925 version "5.1.0"
926 resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069"
927 dependencies:
928 continuable-cache "^0.3.1"
929 error "^7.0.0"
930 raw-body "~1.1.0"
931 safe-json-parse "~1.0.1"
932
933boolbase@~1.0.0:
934 version "1.0.0"
935 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
936
937boxen@^1.2.1: 1059boxen@^1.2.1:
938 version "1.3.0" 1060 version "1.3.0"
939 resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 1061 resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
1062 integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
940 dependencies: 1063 dependencies:
941 ansi-align "^2.0.0" 1064 ansi-align "^2.0.0"
942 camelcase "^4.0.0" 1065 camelcase "^4.0.0"
@@ -946,9 +1069,10 @@ boxen@^1.2.1:
946 term-size "^1.2.0" 1069 term-size "^1.2.0"
947 widest-line "^2.0.0" 1070 widest-line "^2.0.0"
948 1071
949brace-expansion@^1.0.0, brace-expansion@^1.1.7: 1072brace-expansion@^1.1.7:
950 version "1.1.11" 1073 version "1.1.11"
951 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 1074 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
1075 integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
952 dependencies: 1076 dependencies:
953 balanced-match "^1.0.0" 1077 balanced-match "^1.0.0"
954 concat-map "0.0.1" 1078 concat-map "0.0.1"
@@ -956,6 +1080,7 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7:
956braces@^2.3.0, braces@^2.3.1: 1080braces@^2.3.0, braces@^2.3.1:
957 version "2.3.2" 1081 version "2.3.2"
958 resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 1082 resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
1083 integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
959 dependencies: 1084 dependencies:
960 arr-flatten "^1.1.0" 1085 arr-flatten "^1.1.0"
961 array-unique "^0.3.2" 1086 array-unique "^0.3.2"
@@ -971,26 +1096,32 @@ braces@^2.3.0, braces@^2.3.1:
971brorand@^1.0.1: 1096brorand@^1.0.1:
972 version "1.1.0" 1097 version "1.1.0"
973 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 1098 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
1099 integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
974 1100
975browser-stdout@1.3.1: 1101browser-stdout@1.3.1:
976 version "1.3.1" 1102 version "1.3.1"
977 resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 1103 resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
1104 integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
978 1105
979browserify-package-json@^1.0.0: 1106browserify-package-json@^1.0.0:
980 version "1.0.1" 1107 version "1.0.1"
981 resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea" 1108 resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea"
1109 integrity sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=
982 1110
983bs58@=2.0.0: 1111bs58@=2.0.0:
984 version "2.0.0" 1112 version "2.0.0"
985 resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz#72b713bed223a0ac518bbda0e3ce3f4817f39eb5" 1113 resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz#72b713bed223a0ac518bbda0e3ce3f4817f39eb5"
1114 integrity sha1-crcTvtIjoKxRi72g484/SBfznrU=
986 1115
987buffer-alloc-unsafe@^1.1.0: 1116buffer-alloc-unsafe@^1.1.0:
988 version "1.1.0" 1117 version "1.1.0"
989 resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 1118 resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
1119 integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
990 1120
991buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: 1121buffer-alloc@^1.1.0, buffer-alloc@^1.2.0:
992 version "1.2.0" 1122 version "1.2.0"
993 resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 1123 resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
1124 integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
994 dependencies: 1125 dependencies:
995 buffer-alloc-unsafe "^1.1.0" 1126 buffer-alloc-unsafe "^1.1.0"
996 buffer-fill "^1.0.0" 1127 buffer-fill "^1.0.0"
@@ -998,56 +1129,67 @@ buffer-alloc@^1.1.0, buffer-alloc@^1.2.0:
998buffer-compare@=1.0.0: 1129buffer-compare@=1.0.0:
999 version "1.0.0" 1130 version "1.0.0"
1000 resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz#acaa7a966e98eee9fae14b31c39a5f158fb3c4a2" 1131 resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz#acaa7a966e98eee9fae14b31c39a5f158fb3c4a2"
1132 integrity sha1-rKp6lm6Y7un64Usxw5pfFY+zxKI=
1001 1133
1002buffer-equal-constant-time@1.0.1: 1134buffer-equal-constant-time@1.0.1:
1003 version "1.0.1" 1135 version "1.0.1"
1004 resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 1136 resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
1137 integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
1005 1138
1006buffer-equals@^1.0.3, buffer-equals@^1.0.4: 1139buffer-equals@^1.0.3, buffer-equals@^1.0.4:
1007 version "1.0.4" 1140 version "1.0.4"
1008 resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" 1141 resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5"
1142 integrity sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=
1009 1143
1010buffer-fill@^1.0.0: 1144buffer-fill@^1.0.0:
1011 version "1.0.0" 1145 version "1.0.0"
1012 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 1146 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
1147 integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
1013 1148
1014buffer-from@^1.0.0, buffer-from@^1.1.0: 1149buffer-from@^1.0.0, buffer-from@^1.1.0:
1015 version "1.1.1" 1150 version "1.1.1"
1016 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 1151 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
1152 integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
1017 1153
1018buffer-writer@1.0.1: 1154buffer-writer@2.0.0:
1019 version "1.0.1" 1155 version "2.0.0"
1020 resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" 1156 resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
1157 integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
1021 1158
1022bufferutil@^4.0.0: 1159bufferutil@^4.0.0:
1023 version "4.0.0" 1160 version "4.0.0"
1024 resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.0.tgz#a5078160e443751a4e83b6f4d6d7e26c058326a0" 1161 resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.0.tgz#a5078160e443751a4e83b6f4d6d7e26c058326a0"
1162 integrity sha512-jpnqMVLo7sqfUY2W92RC4jjj9TuiOSkjB0k43TxPcrBSntZwXUOl8Krfd3eVEdApuScpSTwYKntm/dXU2T8gnw==
1025 dependencies: 1163 dependencies:
1026 node-gyp-build "~3.4.0" 1164 node-gyp-build "~3.4.0"
1027 1165
1028builtin-modules@^1.0.0, builtin-modules@^1.1.1: 1166builtin-modules@^1.0.0, builtin-modules@^1.1.1:
1029 version "1.1.1" 1167 version "1.1.1"
1030 resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 1168 resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
1169 integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
1031 1170
1032builtins@^1.0.3: 1171builtins@^1.0.3:
1033 version "1.0.3" 1172 version "1.0.3"
1034 resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" 1173 resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
1174 integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
1035 1175
1036bull@^3.4.2: 1176bull@^3.4.2:
1037 version "3.4.8" 1177 version "3.5.2"
1038 resolved "https://registry.yarnpkg.com/bull/-/bull-3.4.8.tgz#bd25ae82f47e0a092c0b06b6a13b875fa5b41bc0" 1178 resolved "https://registry.yarnpkg.com/bull/-/bull-3.5.2.tgz#9c85f205b17686efab2ee28aaa4388887360de32"
1179 integrity sha512-tuL4Uj0kUeaQ7Cow3POkca20fk+VSsR8AiTFeNkyMmuicBnE1ZMwvF1NRDY7vIH43pD9PiMCSEP4Li/934Pw1w==
1039 dependencies: 1180 dependencies:
1040 bluebird "^3.5.0" 1181 bluebird "^3.5.3"
1041 cron-parser "^2.5.0" 1182 cron-parser "^2.5.0"
1042 debuglog "^1.0.0" 1183 debuglog "^1.0.0"
1043 ioredis "^3.1.4" 1184 ioredis "^3.1.4"
1044 lodash "^4.17.4" 1185 lodash "^4.17.11"
1045 semver "^5.5.0" 1186 semver "^5.6.0"
1046 uuid "^3.2.1" 1187 uuid "^3.2.1"
1047 1188
1048busboy@^0.2.11: 1189busboy@^0.2.11:
1049 version "0.2.14" 1190 version "0.2.14"
1050 resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" 1191 resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
1192 integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=
1051 dependencies: 1193 dependencies:
1052 dicer "0.2.5" 1194 dicer "0.2.5"
1053 readable-stream "1.1.x" 1195 readable-stream "1.1.x"
@@ -1055,22 +1197,22 @@ busboy@^0.2.11:
1055byline@^5.0.0: 1197byline@^5.0.0:
1056 version "5.0.0" 1198 version "5.0.0"
1057 resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" 1199 resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
1200 integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
1058 1201
1059byte-size@^4.0.3: 1202byte-size@^4.0.3:
1060 version "4.0.3" 1203 version "4.0.4"
1061 resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.3.tgz#b7c095efc68eadf82985fccd9a2df43a74fa2ccd" 1204 resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.4.tgz#29d381709f41aae0d89c631f1c81aec88cd40b23"
1062 1205 integrity sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==
1063bytes@1:
1064 version "1.0.0"
1065 resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
1066 1206
1067bytes@3.0.0, bytes@^3.0.0: 1207bytes@3.0.0, bytes@^3.0.0:
1068 version "3.0.0" 1208 version "3.0.0"
1069 resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 1209 resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
1210 integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
1070 1211
1071cacache@^10.0.4: 1212cacache@^10.0.4:
1072 version "10.0.4" 1213 version "10.0.4"
1073 resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" 1214 resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
1215 integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
1074 dependencies: 1216 dependencies:
1075 bluebird "^3.5.1" 1217 bluebird "^3.5.1"
1076 chownr "^1.0.1" 1218 chownr "^1.0.1"
@@ -1087,8 +1229,9 @@ cacache@^10.0.4:
1087 y18n "^4.0.0" 1229 y18n "^4.0.0"
1088 1230
1089cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: 1231cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0:
1090 version "11.2.0" 1232 version "11.3.1"
1091 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" 1233 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f"
1234 integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==
1092 dependencies: 1235 dependencies:
1093 bluebird "^3.5.1" 1236 bluebird "^3.5.1"
1094 chownr "^1.0.1" 1237 chownr "^1.0.1"
@@ -1108,6 +1251,7 @@ cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0:
1108cache-base@^1.0.1: 1251cache-base@^1.0.1:
1109 version "1.0.1" 1252 version "1.0.1"
1110 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 1253 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
1254 integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
1111 dependencies: 1255 dependencies:
1112 collection-visit "^1.0.0" 1256 collection-visit "^1.0.0"
1113 component-emitter "^1.2.1" 1257 component-emitter "^1.2.1"
@@ -1122,59 +1266,78 @@ cache-base@^1.0.1:
1122call-limit@~1.1.0: 1266call-limit@~1.1.0:
1123 version "1.1.0" 1267 version "1.1.0"
1124 resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" 1268 resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea"
1269 integrity sha1-b9YbA/PaQqLNDsK2DwK9DnGZH+o=
1270
1271call-me-maybe@^1.0.1:
1272 version "1.0.1"
1273 resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
1274 integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
1275
1276caller-callsite@^2.0.0:
1277 version "2.0.0"
1278 resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
1279 integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
1280 dependencies:
1281 callsites "^2.0.0"
1125 1282
1126caller-path@^0.1.0: 1283caller-path@^0.1.0:
1127 version "0.1.0" 1284 version "0.1.0"
1128 resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 1285 resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
1286 integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
1129 dependencies: 1287 dependencies:
1130 callsites "^0.2.0" 1288 callsites "^0.2.0"
1131 1289
1290caller-path@^2.0.0:
1291 version "2.0.0"
1292 resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
1293 integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
1294 dependencies:
1295 caller-callsite "^2.0.0"
1296
1132callsite@1.0.0: 1297callsite@1.0.0:
1133 version "1.0.0" 1298 version "1.0.0"
1134 resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 1299 resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
1300 integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
1135 1301
1136callsites@^0.2.0: 1302callsites@^0.2.0:
1137 version "0.2.0" 1303 version "0.2.0"
1138 resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 1304 resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
1305 integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
1139 1306
1140camelcase-keys@^2.0.0: 1307callsites@^2.0.0:
1141 version "2.1.0" 1308 version "2.0.0"
1142 resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 1309 resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
1143 dependencies: 1310 integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
1144 camelcase "^2.0.0"
1145 map-obj "^1.0.0"
1146
1147camelcase@^2.0.0:
1148 version "2.1.1"
1149 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
1150
1151camelcase@^3.0.0:
1152 version "3.0.0"
1153 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
1154 1311
1155camelcase@^4.0.0, camelcase@^4.1.0: 1312camelcase@^4.0.0, camelcase@^4.1.0:
1156 version "4.1.0" 1313 version "4.1.0"
1157 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 1314 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
1315 integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
1316
1317camelcase@^5.0.0:
1318 version "5.0.0"
1319 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
1320 integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
1158 1321
1159camelize@1.0.0: 1322camelize@1.0.0:
1160 version "1.0.0" 1323 version "1.0.0"
1161 resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" 1324 resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
1325 integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=
1162 1326
1163capture-stack-trace@^1.0.0: 1327capture-stack-trace@^1.0.0:
1164 version "1.0.1" 1328 version "1.0.1"
1165 resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 1329 resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
1166 1330 integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
1167caseless@~0.11.0:
1168 version "0.11.0"
1169 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
1170 1331
1171caseless@~0.12.0: 1332caseless@~0.12.0:
1172 version "0.12.0" 1333 version "0.12.0"
1173 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 1334 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
1335 integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
1174 1336
1175chai-json-schema@^1.5.0: 1337chai-json-schema@^1.5.0:
1176 version "1.5.0" 1338 version "1.5.0"
1177 resolved "https://registry.yarnpkg.com/chai-json-schema/-/chai-json-schema-1.5.0.tgz#6960719e40f71fd5b377c9282e5c9a46799474f6" 1339 resolved "https://registry.yarnpkg.com/chai-json-schema/-/chai-json-schema-1.5.0.tgz#6960719e40f71fd5b377c9282e5c9a46799474f6"
1340 integrity sha1-aWBxnkD3H9Wzd8koLlyaRnmUdPY=
1178 dependencies: 1341 dependencies:
1179 jsonpointer.js "0.4.0" 1342 jsonpointer.js "0.4.0"
1180 tv4 "~1.2.7" 1343 tv4 "~1.2.7"
@@ -1182,6 +1345,7 @@ chai-json-schema@^1.5.0:
1182chai-xml@^0.3.2: 1345chai-xml@^0.3.2:
1183 version "0.3.2" 1346 version "0.3.2"
1184 resolved "https://registry.yarnpkg.com/chai-xml/-/chai-xml-0.3.2.tgz#61d0776aa8fd936a2178769adcaabf3bfb52b8b1" 1347 resolved "https://registry.yarnpkg.com/chai-xml/-/chai-xml-0.3.2.tgz#61d0776aa8fd936a2178769adcaabf3bfb52b8b1"
1348 integrity sha512-HAyFPmJE0MEleo+sjWhJUxj+/aYBoUQg5EF/eGhbv1IZtx8mNGyGKD4jKlohhD4DsZaH5jay+Y/xtzBacBLdHw==
1185 dependencies: 1349 dependencies:
1186 chai "^1.9.1" 1350 chai "^1.9.1"
1187 xml2js "^0.4.4" 1351 xml2js "^0.4.4"
@@ -1189,24 +1353,27 @@ chai-xml@^0.3.2:
1189chai@^1.9.1: 1353chai@^1.9.1:
1190 version "1.10.0" 1354 version "1.10.0"
1191 resolved "https://registry.yarnpkg.com/chai/-/chai-1.10.0.tgz#e4031cc87654461a75943e5a35ab46eaf39c1eb9" 1355 resolved "https://registry.yarnpkg.com/chai/-/chai-1.10.0.tgz#e4031cc87654461a75943e5a35ab46eaf39c1eb9"
1356 integrity sha1-5AMcyHZURhp1lD5aNatG6vOcHrk=
1192 dependencies: 1357 dependencies:
1193 assertion-error "1.0.0" 1358 assertion-error "1.0.0"
1194 deep-eql "0.1.3" 1359 deep-eql "0.1.3"
1195 1360
1196chai@^4.1.1: 1361chai@^4.1.1:
1197 version "4.1.2" 1362 version "4.2.0"
1198 resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" 1363 resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
1364 integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
1199 dependencies: 1365 dependencies:
1200 assertion-error "^1.0.1" 1366 assertion-error "^1.1.0"
1201 check-error "^1.0.1" 1367 check-error "^1.0.2"
1202 deep-eql "^3.0.0" 1368 deep-eql "^3.0.1"
1203 get-func-name "^2.0.0" 1369 get-func-name "^2.0.0"
1204 pathval "^1.0.0" 1370 pathval "^1.1.0"
1205 type-detect "^4.0.0" 1371 type-detect "^4.0.5"
1206 1372
1207chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 1373chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
1208 version "1.1.3" 1374 version "1.1.3"
1209 resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 1375 resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
1376 integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
1210 dependencies: 1377 dependencies:
1211 ansi-styles "^2.2.1" 1378 ansi-styles "^2.2.1"
1212 escape-string-regexp "^1.0.2" 1379 escape-string-regexp "^1.0.2"
@@ -1214,9 +1381,10 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
1214 strip-ansi "^3.0.0" 1381 strip-ansi "^3.0.0"
1215 supports-color "^2.0.0" 1382 supports-color "^2.0.0"
1216 1383
1217chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@~2.4.1: 1384chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1:
1218 version "2.4.1" 1385 version "2.4.1"
1219 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 1386 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
1387 integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
1220 dependencies: 1388 dependencies:
1221 ansi-styles "^3.2.1" 1389 ansi-styles "^3.2.1"
1222 escape-string-regexp "^1.0.5" 1390 escape-string-regexp "^1.0.5"
@@ -1225,28 +1393,22 @@ chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@~2.4.1:
1225charenc@~0.0.1: 1393charenc@~0.0.1:
1226 version "0.0.2" 1394 version "0.0.2"
1227 resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 1395 resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
1396 integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
1228 1397
1229charset-detector@0.0.2: 1398charset-detector@0.0.2:
1230 version "0.0.2" 1399 version "0.0.2"
1231 resolved "https://registry.yarnpkg.com/charset-detector/-/charset-detector-0.0.2.tgz#1cd5ddaf56e83259c6ef8e906ccf06f75fe9a1b2" 1400 resolved "https://registry.yarnpkg.com/charset-detector/-/charset-detector-0.0.2.tgz#1cd5ddaf56e83259c6ef8e906ccf06f75fe9a1b2"
1401 integrity sha1-HNXdr1boMlnG746QbM8G91/pobI=
1232 1402
1233check-error@^1.0.1: 1403check-error@^1.0.2:
1234 version "1.0.2" 1404 version "1.0.2"
1235 resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 1405 resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
1406 integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
1236 1407
1237cheerio@^0.19.0: 1408chokidar@^2.0.4:
1238 version "0.19.0"
1239 resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925"
1240 dependencies:
1241 css-select "~1.0.0"
1242 dom-serializer "~0.1.0"
1243 entities "~1.1.1"
1244 htmlparser2 "~3.8.1"
1245 lodash "^3.2.0"
1246
1247chokidar@^2.0.2:
1248 version "2.0.4" 1409 version "2.0.4"
1249 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 1410 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
1411 integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==
1250 dependencies: 1412 dependencies:
1251 anymatch "^2.0.0" 1413 anymatch "^2.0.0"
1252 async-each "^1.0.0" 1414 async-each "^1.0.0"
@@ -1263,17 +1425,20 @@ chokidar@^2.0.2:
1263 optionalDependencies: 1425 optionalDependencies:
1264 fsevents "^1.2.2" 1426 fsevents "^1.2.2"
1265 1427
1266chownr@^1.0.1: 1428chownr@^1.0.1, chownr@^1.1.1:
1267 version "1.1.1" 1429 version "1.1.1"
1268 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 1430 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
1431 integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
1269 1432
1270chownr@~1.0.1: 1433chownr@~1.0.1:
1271 version "1.0.1" 1434 version "1.0.1"
1272 resolved "http://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 1435 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
1436 integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=
1273 1437
1274chunk-store-stream@^3.0.1: 1438chunk-store-stream@^3.0.1:
1275 version "3.0.1" 1439 version "3.0.1"
1276 resolved "https://registry.yarnpkg.com/chunk-store-stream/-/chunk-store-stream-3.0.1.tgz#8e0d739226dcb386f44447b82a005b597a1d41d9" 1440 resolved "https://registry.yarnpkg.com/chunk-store-stream/-/chunk-store-stream-3.0.1.tgz#8e0d739226dcb386f44447b82a005b597a1d41d9"
1441 integrity sha512-GA1NIFDZKElhkjiO6QOyzfK1QbUt6M3gFhUU/aR05JYaDqXbU5d7U92cLvGKdItJEDfojky6NQefy5VL5PpDBA==
1277 dependencies: 1442 dependencies:
1278 block-stream2 "^1.0.0" 1443 block-stream2 "^1.0.0"
1279 readable-stream "^2.0.5" 1444 readable-stream "^2.0.5"
@@ -1281,58 +1446,61 @@ chunk-store-stream@^3.0.1:
1281ci-info@^1.4.0, ci-info@^1.5.0: 1446ci-info@^1.4.0, ci-info@^1.5.0:
1282 version "1.6.0" 1447 version "1.6.0"
1283 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 1448 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
1449 integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
1284 1450
1285cidr-regex@^2.0.10: 1451cidr-regex@^2.0.10:
1286 version "2.0.10" 1452 version "2.0.10"
1287 resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d" 1453 resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d"
1454 integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==
1288 dependencies: 1455 dependencies:
1289 ip-regex "^2.1.0" 1456 ip-regex "^2.1.0"
1290 1457
1291circular-json@^0.3.1: 1458circular-json@^0.3.1:
1292 version "0.3.3" 1459 version "0.3.3"
1293 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 1460 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
1294 1461 integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
1295clarify@^1.0.5:
1296 version "1.0.5"
1297 resolved "https://registry.yarnpkg.com/clarify/-/clarify-1.0.5.tgz#3ac7b2341a21615e8fca6e28301fcf9598c61466"
1298 dependencies:
1299 stack-chain "1.3.x"
1300 1462
1301class-utils@^0.3.5: 1463class-utils@^0.3.5:
1302 version "0.3.6" 1464 version "0.3.6"
1303 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 1465 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
1466 integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
1304 dependencies: 1467 dependencies:
1305 arr-union "^3.1.0" 1468 arr-union "^3.1.0"
1306 define-property "^0.2.5" 1469 define-property "^0.2.5"
1307 isobject "^3.0.0" 1470 isobject "^3.0.0"
1308 static-extend "^0.1.1" 1471 static-extend "^0.1.1"
1309 1472
1310clean-css@~4.1.1:
1311 version "4.1.11"
1312 resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
1313 dependencies:
1314 source-map "0.5.x"
1315
1316cli-boxes@^1.0.0: 1473cli-boxes@^1.0.0:
1317 version "1.0.0" 1474 version "1.0.0"
1318 resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 1475 resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
1476 integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
1319 1477
1320cli-columns@^3.1.2: 1478cli-columns@^3.1.2:
1321 version "3.1.2" 1479 version "3.1.2"
1322 resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" 1480 resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e"
1481 integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=
1323 dependencies: 1482 dependencies:
1324 string-width "^2.0.0" 1483 string-width "^2.0.0"
1325 strip-ansi "^3.0.1" 1484 strip-ansi "^3.0.1"
1326 1485
1327cli-cursor@^1.0.1, cli-cursor@^1.0.2: 1486cli-cursor@^1.0.1:
1328 version "1.0.2" 1487 version "1.0.2"
1329 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 1488 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
1489 integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
1330 dependencies: 1490 dependencies:
1331 restore-cursor "^1.0.1" 1491 restore-cursor "^1.0.1"
1332 1492
1493cli-cursor@^2.0.0, cli-cursor@^2.1.0:
1494 version "2.1.0"
1495 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
1496 integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
1497 dependencies:
1498 restore-cursor "^2.0.0"
1499
1333cli-table3@^0.5.0: 1500cli-table3@^0.5.0:
1334 version "0.5.1" 1501 version "0.5.1"
1335 resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" 1502 resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
1503 integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
1336 dependencies: 1504 dependencies:
1337 object-assign "^4.1.0" 1505 object-assign "^4.1.0"
1338 string-width "^2.1.1" 1506 string-width "^2.1.1"
@@ -1342,12 +1510,14 @@ cli-table3@^0.5.0:
1342cli-table@^0.3.1: 1510cli-table@^0.3.1:
1343 version "0.3.1" 1511 version "0.3.1"
1344 resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" 1512 resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
1513 integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM=
1345 dependencies: 1514 dependencies:
1346 colors "1.0.3" 1515 colors "1.0.3"
1347 1516
1348cli-truncate@^0.2.1: 1517cli-truncate@^0.2.1:
1349 version "0.2.1" 1518 version "0.2.1"
1350 resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" 1519 resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
1520 integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=
1351 dependencies: 1521 dependencies:
1352 slice-ansi "0.0.4" 1522 slice-ansi "0.0.4"
1353 string-width "^1.0.1" 1523 string-width "^1.0.1"
@@ -1355,25 +1525,12 @@ cli-truncate@^0.2.1:
1355cli-width@^2.0.0: 1525cli-width@^2.0.0:
1356 version "2.2.0" 1526 version "2.2.0"
1357 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 1527 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
1358 1528 integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
1359cli@~1.0.0:
1360 version "1.0.1"
1361 resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
1362 dependencies:
1363 exit "0.1.2"
1364 glob "^7.1.1"
1365
1366cliui@^3.2.0:
1367 version "3.2.0"
1368 resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
1369 dependencies:
1370 string-width "^1.0.1"
1371 strip-ansi "^3.0.1"
1372 wrap-ansi "^2.0.0"
1373 1529
1374cliui@^4.0.0: 1530cliui@^4.0.0:
1375 version "4.1.0" 1531 version "4.1.0"
1376 resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 1532 resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
1533 integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
1377 dependencies: 1534 dependencies:
1378 string-width "^2.1.1" 1535 string-width "^2.1.1"
1379 strip-ansi "^4.0.0" 1536 strip-ansi "^4.0.0"
@@ -1382,14 +1539,17 @@ cliui@^4.0.0:
1382clone@^1.0.2: 1539clone@^1.0.2:
1383 version "1.0.4" 1540 version "1.0.4"
1384 resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 1541 resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
1542 integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
1385 1543
1386closest-to@~2.0.0: 1544closest-to@~2.0.0:
1387 version "2.0.0" 1545 version "2.0.0"
1388 resolved "https://registry.yarnpkg.com/closest-to/-/closest-to-2.0.0.tgz#bb2a860edb7769b62d04821748ae50da24dbefaa" 1546 resolved "https://registry.yarnpkg.com/closest-to/-/closest-to-2.0.0.tgz#bb2a860edb7769b62d04821748ae50da24dbefaa"
1547 integrity sha1-uyqGDtt3abYtBIIXSK5Q2iTb76o=
1389 1548
1390cls-bluebird@^2.1.0: 1549cls-bluebird@^2.1.0:
1391 version "2.1.0" 1550 version "2.1.0"
1392 resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" 1551 resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee"
1552 integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=
1393 dependencies: 1553 dependencies:
1394 is-bluebird "^1.0.2" 1554 is-bluebird "^1.0.2"
1395 shimmer "^1.1.0" 1555 shimmer "^1.1.0"
@@ -1397,10 +1557,12 @@ cls-bluebird@^2.1.0:
1397cluster-key-slot@^1.0.6: 1557cluster-key-slot@^1.0.6:
1398 version "1.0.12" 1558 version "1.0.12"
1399 resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz#d5deff2a520717bc98313979b687309b2d368e29" 1559 resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz#d5deff2a520717bc98313979b687309b2d368e29"
1560 integrity sha512-21O0kGmvED5OJ7ZTdqQ5lQQ+sjuez33R+d35jZKLwqUb5mqcPHUsxOSzj61+LHVtxGZd1kShbQM3MjB/gBJkVg==
1400 1561
1401cmd-shim@^2.0.2, cmd-shim@~2.0.2: 1562cmd-shim@^2.0.2, cmd-shim@~2.0.2:
1402 version "2.0.2" 1563 version "2.0.2"
1403 resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" 1564 resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb"
1565 integrity sha1-b8vamUg6j9FdfTChlspp1oii79s=
1404 dependencies: 1566 dependencies:
1405 graceful-fs "^4.1.2" 1567 graceful-fs "^4.1.2"
1406 mkdirp "~0.5.0" 1568 mkdirp "~0.5.0"
@@ -1408,6 +1570,7 @@ cmd-shim@^2.0.2, cmd-shim@~2.0.2:
1408co-bluebird@^1.1.0: 1570co-bluebird@^1.1.0:
1409 version "1.1.0" 1571 version "1.1.0"
1410 resolved "https://registry.yarnpkg.com/co-bluebird/-/co-bluebird-1.1.0.tgz#c8b9f3a9320a7ed30987dcca1a5c3cff59655c7c" 1572 resolved "https://registry.yarnpkg.com/co-bluebird/-/co-bluebird-1.1.0.tgz#c8b9f3a9320a7ed30987dcca1a5c3cff59655c7c"
1573 integrity sha1-yLnzqTIKftMJh9zKGlw8/1llXHw=
1411 dependencies: 1574 dependencies:
1412 bluebird "^2.10.0" 1575 bluebird "^2.10.0"
1413 co-use "^1.1.0" 1576 co-use "^1.1.0"
@@ -1415,28 +1578,22 @@ co-bluebird@^1.1.0:
1415co-use@^1.1.0: 1578co-use@^1.1.0:
1416 version "1.1.0" 1579 version "1.1.0"
1417 resolved "https://registry.yarnpkg.com/co-use/-/co-use-1.1.0.tgz#c6bb3cdf10cb735ecaa9daeeda46d725c94a4e62" 1580 resolved "https://registry.yarnpkg.com/co-use/-/co-use-1.1.0.tgz#c6bb3cdf10cb735ecaa9daeeda46d725c94a4e62"
1581 integrity sha1-xrs83xDLc17Kqdru2kbXJclKTmI=
1418 1582
1419co@^4.6.0: 1583co@^4.6.0:
1420 version "4.6.0" 1584 version "4.6.0"
1421 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 1585 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
1586 integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
1422 1587
1423code-point-at@^1.0.0: 1588code-point-at@^1.0.0:
1424 version "1.1.0" 1589 version "1.1.0"
1425 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 1590 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
1426 1591 integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
1427coffee-script@~1.7.1:
1428 version "1.7.1"
1429 resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.7.1.tgz#62996a861780c75e6d5069d13822723b73404bfc"
1430 dependencies:
1431 mkdirp "~0.3.5"
1432
1433coffeescript@~1.10.0:
1434 version "1.10.0"
1435 resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e"
1436 1592
1437collection-visit@^1.0.0: 1593collection-visit@^1.0.0:
1438 version "1.0.0" 1594 version "1.0.0"
1439 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 1595 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
1596 integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
1440 dependencies: 1597 dependencies:
1441 map-visit "^1.0.0" 1598 map-visit "^1.0.0"
1442 object-visit "^1.0.0" 1599 object-visit "^1.0.0"
@@ -1444,23 +1601,40 @@ collection-visit@^1.0.0:
1444color-convert@^1.9.0, color-convert@^1.9.1: 1601color-convert@^1.9.0, color-convert@^1.9.1:
1445 version "1.9.3" 1602 version "1.9.3"
1446 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 1603 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1604 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1447 dependencies: 1605 dependencies:
1448 color-name "1.1.3" 1606 color-name "1.1.3"
1449 1607
1450color-name@1.1.3, color-name@^1.0.0: 1608color-name@1.1.3:
1451 version "1.1.3" 1609 version "1.1.3"
1452 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 1610 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1611 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1612
1613color-name@^1.0.0:
1614 version "1.1.4"
1615 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1616 integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1453 1617
1454color-string@^1.5.2: 1618color-string@^1.5.2:
1455 version "1.5.3" 1619 version "1.5.3"
1456 resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" 1620 resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
1621 integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==
1457 dependencies: 1622 dependencies:
1458 color-name "^1.0.0" 1623 color-name "^1.0.0"
1459 simple-swizzle "^0.2.2" 1624 simple-swizzle "^0.2.2"
1460 1625
1461color@3.0.x, color@^3.0.0: 1626color@3.0.x:
1462 version "3.0.0" 1627 version "3.0.0"
1463 resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" 1628 resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a"
1629 integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==
1630 dependencies:
1631 color-convert "^1.9.1"
1632 color-string "^1.5.2"
1633
1634color@^3.0.0:
1635 version "3.1.0"
1636 resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc"
1637 integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==
1464 dependencies: 1638 dependencies:
1465 color-convert "^1.9.1" 1639 color-convert "^1.9.1"
1466 color-string "^1.5.2" 1640 color-string "^1.5.2"
@@ -1468,22 +1642,22 @@ color@3.0.x, color@^3.0.0:
1468colornames@^1.1.1: 1642colornames@^1.1.1:
1469 version "1.1.1" 1643 version "1.1.1"
1470 resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" 1644 resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
1645 integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=
1471 1646
1472colors@1.0.3, colors@1.0.x: 1647colors@1.0.3, colors@1.0.x:
1473 version "1.0.3" 1648 version "1.0.3"
1474 resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 1649 resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
1650 integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
1475 1651
1476colors@^1.1.2, colors@^1.2.1: 1652colors@^1.1.2, colors@^1.2.1:
1477 version "1.3.2" 1653 version "1.3.2"
1478 resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" 1654 resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b"
1479 1655 integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==
1480colors@~1.1.2:
1481 version "1.1.2"
1482 resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
1483 1656
1484colorspace@1.1.x: 1657colorspace@1.1.x:
1485 version "1.1.1" 1658 version "1.1.1"
1486 resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" 1659 resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972"
1660 integrity sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==
1487 dependencies: 1661 dependencies:
1488 color "3.0.x" 1662 color "3.0.x"
1489 text-hex "1.0.x" 1663 text-hex "1.0.x"
@@ -1491,73 +1665,71 @@ colorspace@1.1.x:
1491columnify@~1.5.4: 1665columnify@~1.5.4:
1492 version "1.5.4" 1666 version "1.5.4"
1493 resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" 1667 resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
1668 integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
1494 dependencies: 1669 dependencies:
1495 strip-ansi "^3.0.0" 1670 strip-ansi "^3.0.0"
1496 wcwidth "^1.0.0" 1671 wcwidth "^1.0.0"
1497 1672
1498combined-stream@1.0.6: 1673combined-stream@^1.0.6, combined-stream@~1.0.6:
1499 version "1.0.6"
1500 resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
1501 dependencies:
1502 delayed-stream "~1.0.0"
1503
1504combined-stream@~1.0.5, combined-stream@~1.0.6:
1505 version "1.0.7" 1674 version "1.0.7"
1506 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 1675 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
1676 integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
1507 dependencies: 1677 dependencies:
1508 delayed-stream "~1.0.0" 1678 delayed-stream "~1.0.0"
1509 1679
1510command-exists@^1.2.2:
1511 version "1.2.7"
1512 resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8"
1513
1514commander@*, commander@^2.12.1, commander@^2.13.0, commander@^2.14.1, commander@^2.8.1, commander@^2.9.0:
1515 version "2.18.0"
1516 resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
1517
1518commander@2.15.1: 1680commander@2.15.1:
1519 version "2.15.1" 1681 version "2.15.1"
1520 resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 1682 resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
1683 integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
1521 1684
1522commander@2.9.0: 1685commander@2.9.0:
1523 version "2.9.0" 1686 version "2.9.0"
1524 resolved "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 1687 resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
1688 integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
1525 dependencies: 1689 dependencies:
1526 graceful-readlink ">= 1.0.0" 1690 graceful-readlink ">= 1.0.0"
1527 1691
1528commander@~2.17.1: 1692commander@^2.12.1, commander@^2.13.0, commander@^2.14.1, commander@^2.7.1, commander@^2.8.1, commander@^2.9.0:
1529 version "2.17.1" 1693 version "2.19.0"
1530 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" 1694 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
1695 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
1531 1696
1532compact2string@^1.2.0: 1697compact2string@^1.2.0:
1533 version "1.4.0" 1698 version "1.4.0"
1534 resolved "https://registry.yarnpkg.com/compact2string/-/compact2string-1.4.0.tgz#a99cd96ea000525684b269683ae2222d6eea7b49" 1699 resolved "https://registry.yarnpkg.com/compact2string/-/compact2string-1.4.0.tgz#a99cd96ea000525684b269683ae2222d6eea7b49"
1700 integrity sha1-qZzZbqAAUlaEsmloOuIiLW7qe0k=
1535 dependencies: 1701 dependencies:
1536 ipaddr.js ">= 0.1.5" 1702 ipaddr.js ">= 0.1.5"
1537 1703
1538component-bind@1.0.0: 1704component-bind@1.0.0:
1539 version "1.0.0" 1705 version "1.0.0"
1540 resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 1706 resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
1707 integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
1541 1708
1542component-emitter@1.1.2: 1709component-emitter@1.1.2:
1543 version "1.1.2" 1710 version "1.1.2"
1544 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" 1711 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
1712 integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=
1545 1713
1546component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1: 1714component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1:
1547 version "1.2.1" 1715 version "1.2.1"
1548 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 1716 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
1717 integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
1549 1718
1550component-inherit@0.0.3: 1719component-inherit@0.0.3:
1551 version "0.0.3" 1720 version "0.0.3"
1552 resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 1721 resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
1722 integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
1553 1723
1554concat-map@0.0.1: 1724concat-map@0.0.1:
1555 version "0.0.1" 1725 version "0.0.1"
1556 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1726 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
1727 integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
1557 1728
1558concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: 1729concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.5.2:
1559 version "1.6.2" 1730 version "1.6.2"
1560 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 1731 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
1732 integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
1561 dependencies: 1733 dependencies:
1562 buffer-from "^1.0.0" 1734 buffer-from "^1.0.0"
1563 inherits "^2.0.3" 1735 inherits "^2.0.3"
@@ -1565,35 +1737,39 @@ concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^
1565 typedarray "^0.0.6" 1737 typedarray "^0.0.6"
1566 1738
1567concurrently@^4.0.1: 1739concurrently@^4.0.1:
1568 version "4.0.1" 1740 version "4.1.0"
1569 resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.0.1.tgz#f6310fbadf2f476dd95df952edb5c0ab789f672c" 1741 resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz#17fdf067da71210685d9ea554423ef239da30d33"
1742 integrity sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg==
1570 dependencies: 1743 dependencies:
1571 chalk "^2.4.1" 1744 chalk "^2.4.1"
1572 date-fns "^1.23.0" 1745 date-fns "^1.23.0"
1573 lodash "^4.17.10" 1746 lodash "^4.17.10"
1574 read-pkg "^4.0.1" 1747 read-pkg "^4.0.1"
1575 rxjs "6.2.2" 1748 rxjs "^6.3.3"
1576 spawn-command "^0.0.2-1" 1749 spawn-command "^0.0.2-1"
1577 supports-color "^4.5.0" 1750 supports-color "^4.5.0"
1578 tree-kill "^1.1.0" 1751 tree-kill "^1.1.0"
1579 yargs "^12.0.1" 1752 yargs "^12.0.1"
1580 1753
1581config-chain@~1.1.11, config-chain@~1.1.5: 1754config-chain@~1.1.11:
1582 version "1.1.12" 1755 version "1.1.12"
1583 resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" 1756 resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
1757 integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
1584 dependencies: 1758 dependencies:
1585 ini "^1.3.4" 1759 ini "^1.3.4"
1586 proto-list "~1.2.1" 1760 proto-list "~1.2.1"
1587 1761
1588config@^2.0.1: 1762config@^3.0.0:
1589 version "2.0.1" 1763 version "3.0.0"
1590 resolved "https://registry.yarnpkg.com/config/-/config-2.0.1.tgz#995ccc8175460578d646ac0a2e4018ffa44ca046" 1764 resolved "https://registry.yarnpkg.com/config/-/config-3.0.0.tgz#a71cdbb22d225df9eff20b95178d65a63c452367"
1765 integrity sha512-QMr3BCOcHdgXx8t8cLfBhWtHcIAAMikaxUc2XASuH2A93g9kOIRch7sXFQdSvdMxhQobnctWm2y68YJYRttJlw==
1591 dependencies: 1766 dependencies:
1592 json5 "^1.0.1" 1767 json5 "^1.0.1"
1593 1768
1594configstore@^3.0.0: 1769configstore@^3.0.0:
1595 version "3.1.2" 1770 version "3.1.2"
1596 resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 1771 resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
1772 integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
1597 dependencies: 1773 dependencies:
1598 dot-prop "^4.1.0" 1774 dot-prop "^4.1.0"
1599 graceful-fs "^4.1.2" 1775 graceful-fs "^4.1.2"
@@ -1602,52 +1778,35 @@ configstore@^3.0.0:
1602 write-file-atomic "^2.0.0" 1778 write-file-atomic "^2.0.0"
1603 xdg-basedir "^3.0.0" 1779 xdg-basedir "^3.0.0"
1604 1780
1605connect-livereload@^0.5.0:
1606 version "0.5.4"
1607 resolved "https://registry.yarnpkg.com/connect-livereload/-/connect-livereload-0.5.4.tgz#80157d1371c9f37cc14039ab1895970d119dc3bc"
1608
1609connect@^3.4.0:
1610 version "3.6.6"
1611 resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
1612 dependencies:
1613 debug "2.6.9"
1614 finalhandler "1.1.0"
1615 parseurl "~1.3.2"
1616 utils-merge "1.0.1"
1617
1618console-browserify@1.1.x:
1619 version "1.1.0"
1620 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
1621 dependencies:
1622 date-now "^0.1.4"
1623
1624console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: 1781console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
1625 version "1.1.0" 1782 version "1.1.0"
1626 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 1783 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
1784 integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
1627 1785
1628content-disposition@0.5.1: 1786content-disposition@0.5.1:
1629 version "0.5.1" 1787 version "0.5.1"
1630 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" 1788 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b"
1789 integrity sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs=
1631 1790
1632content-disposition@0.5.2: 1791content-disposition@0.5.2:
1633 version "0.5.2" 1792 version "0.5.2"
1634 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 1793 resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
1794 integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=
1635 1795
1636content-security-policy-builder@2.0.0: 1796content-security-policy-builder@2.0.0:
1637 version "2.0.0" 1797 version "2.0.0"
1638 resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz#8749a1d542fcbe82237281ea9f716ce68b394dd2" 1798 resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz#8749a1d542fcbe82237281ea9f716ce68b394dd2"
1799 integrity sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==
1639 1800
1640content-type@~1.0.1, content-type@~1.0.4: 1801content-type@~1.0.1, content-type@~1.0.4:
1641 version "1.0.4" 1802 version "1.0.4"
1642 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 1803 resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
1643 1804 integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
1644continuable-cache@^0.3.1:
1645 version "0.3.1"
1646 resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
1647 1805
1648cookie-parser@^1.4.3: 1806cookie-parser@^1.4.3:
1649 version "1.4.3" 1807 version "1.4.3"
1650 resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" 1808 resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5"
1809 integrity sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=
1651 dependencies: 1810 dependencies:
1652 cookie "0.3.1" 1811 cookie "0.3.1"
1653 cookie-signature "1.0.6" 1812 cookie-signature "1.0.6"
@@ -1655,22 +1814,27 @@ cookie-parser@^1.4.3:
1655cookie-signature@1.0.6: 1814cookie-signature@1.0.6:
1656 version "1.0.6" 1815 version "1.0.6"
1657 resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 1816 resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
1817 integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
1658 1818
1659cookie@0.1.5: 1819cookie@0.1.5:
1660 version "0.1.5" 1820 version "0.1.5"
1661 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.5.tgz#6ab9948a4b1ae21952cd2588530a4722d4044d7c" 1821 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.5.tgz#6ab9948a4b1ae21952cd2588530a4722d4044d7c"
1822 integrity sha1-armUiksa4hlSzSWIUwpHItQETXw=
1662 1823
1663cookie@0.3.1: 1824cookie@0.3.1:
1664 version "0.3.1" 1825 version "0.3.1"
1665 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 1826 resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
1827 integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
1666 1828
1667cookiejar@^2.1.0: 1829cookiejar@^2.1.0:
1668 version "2.1.2" 1830 version "2.1.2"
1669 resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 1831 resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
1832 integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
1670 1833
1671copy-concurrently@^1.0.0: 1834copy-concurrently@^1.0.0:
1672 version "1.0.5" 1835 version "1.0.5"
1673 resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 1836 resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
1837 integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
1674 dependencies: 1838 dependencies:
1675 aproba "^1.1.1" 1839 aproba "^1.1.1"
1676 fs-write-stream-atomic "^1.0.8" 1840 fs-write-stream-atomic "^1.0.8"
@@ -1682,22 +1846,41 @@ copy-concurrently@^1.0.0:
1682copy-descriptor@^0.1.0: 1846copy-descriptor@^0.1.0:
1683 version "0.1.1" 1847 version "0.1.1"
1684 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 1848 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
1849 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
1850
1851core-js@^2.5.7:
1852 version "2.5.7"
1853 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
1854 integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
1685 1855
1686core-util-is@1.0.2, core-util-is@~1.0.0: 1856core-util-is@1.0.2, core-util-is@~1.0.0:
1687 version "1.0.2" 1857 version "1.0.2"
1688 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1858 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
1859 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
1689 1860
1690cors@^2.8.1: 1861cors@^2.8.1:
1691 version "2.8.4" 1862 version "2.8.5"
1692 resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" 1863 resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
1864 integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
1693 dependencies: 1865 dependencies:
1694 object-assign "^4" 1866 object-assign "^4"
1695 vary "^1" 1867 vary "^1"
1696 1868
1697cosmiconfig@^5.0.2, cosmiconfig@^5.0.6: 1869cosmiconfig@5.0.6:
1698 version "5.0.6" 1870 version "5.0.6"
1699 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" 1871 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39"
1872 integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==
1873 dependencies:
1874 is-directory "^0.3.1"
1875 js-yaml "^3.9.0"
1876 parse-json "^4.0.0"
1877
1878cosmiconfig@^5.0.6:
1879 version "5.0.7"
1880 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
1881 integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
1700 dependencies: 1882 dependencies:
1883 import-fresh "^2.0.0"
1701 is-directory "^0.3.1" 1884 is-directory "^0.3.1"
1702 js-yaml "^3.9.0" 1885 js-yaml "^3.9.0"
1703 parse-json "^4.0.0" 1886 parse-json "^4.0.0"
@@ -1705,12 +1888,14 @@ cosmiconfig@^5.0.2, cosmiconfig@^5.0.6:
1705create-error-class@^3.0.0: 1888create-error-class@^3.0.0:
1706 version "3.0.2" 1889 version "3.0.2"
1707 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 1890 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
1891 integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
1708 dependencies: 1892 dependencies:
1709 capture-stack-trace "^1.0.0" 1893 capture-stack-trace "^1.0.0"
1710 1894
1711create-torrent@^3.24.5, create-torrent@^3.33.0: 1895create-torrent@^3.24.5, create-torrent@^3.33.0:
1712 version "3.33.0" 1896 version "3.33.0"
1713 resolved "https://registry.yarnpkg.com/create-torrent/-/create-torrent-3.33.0.tgz#8a7a2aa2213a799c266c40e4c12f1468ede25105" 1897 resolved "https://registry.yarnpkg.com/create-torrent/-/create-torrent-3.33.0.tgz#8a7a2aa2213a799c266c40e4c12f1468ede25105"
1898 integrity sha512-KMd0KuvwVUg1grlRd5skG9ZkSbBYDDkAjDUMLnvxdRn0rL7ph3IwoOk7I8u1yLX4HYjGiLVlWYO55YWNNPjJFA==
1714 dependencies: 1899 dependencies:
1715 bencode "^2.0.0" 1900 bencode "^2.0.0"
1716 block-stream2 "^1.0.0" 1901 block-stream2 "^1.0.0"
@@ -1727,22 +1912,17 @@ create-torrent@^3.24.5, create-torrent@^3.33.0:
1727 simple-sha1 "^2.0.0" 1912 simple-sha1 "^2.0.0"
1728 1913
1729cron-parser@^2.5.0: 1914cron-parser@^2.5.0:
1730 version "2.6.0" 1915 version "2.7.3"
1731 resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.6.0.tgz#ae2514ceda9ccb540256e201bdd23ae814e03674" 1916 resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.7.3.tgz#12603f89f5375af353a9357be2543d3172eac651"
1917 integrity sha512-t9Kc7HWBWPndBzvbdQ1YG9rpPRB37Tb/tTviziUOh1qs3TARGh3b1p+tnkOHNe1K5iI3oheBPgLqwotMM7+lpg==
1732 dependencies: 1918 dependencies:
1733 is-nan "^1.2.1" 1919 is-nan "^1.2.1"
1734 moment-timezone "^0.5.0" 1920 moment-timezone "^0.5.23"
1735
1736cross-spawn@^3.0.0:
1737 version "3.0.1"
1738 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
1739 dependencies:
1740 lru-cache "^4.0.1"
1741 which "^1.2.9"
1742 1921
1743cross-spawn@^5.0.1: 1922cross-spawn@^5.0.1:
1744 version "5.1.0" 1923 version "5.1.0"
1745 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 1924 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
1925 integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
1746 dependencies: 1926 dependencies:
1747 lru-cache "^4.0.1" 1927 lru-cache "^4.0.1"
1748 shebang-command "^1.2.0" 1928 shebang-command "^1.2.0"
@@ -1751,6 +1931,7 @@ cross-spawn@^5.0.1:
1751cross-spawn@^6.0.0: 1931cross-spawn@^6.0.0:
1752 version "6.0.5" 1932 version "6.0.5"
1753 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 1933 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
1934 integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
1754 dependencies: 1935 dependencies:
1755 nice-try "^1.0.4" 1936 nice-try "^1.0.4"
1756 path-key "^2.0.1" 1937 path-key "^2.0.1"
@@ -1761,189 +1942,197 @@ cross-spawn@^6.0.0:
1761crypt@~0.0.1: 1942crypt@~0.0.1:
1762 version "0.0.2" 1943 version "0.0.2"
1763 resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 1944 resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
1945 integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
1764 1946
1765crypto-random-string@^1.0.0: 1947crypto-random-string@^1.0.0:
1766 version "1.0.0" 1948 version "1.0.0"
1767 resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 1949 resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
1768 1950 integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
1769css-select@~1.0.0:
1770 version "1.0.0"
1771 resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0"
1772 dependencies:
1773 boolbase "~1.0.0"
1774 css-what "1.0"
1775 domutils "1.4"
1776 nth-check "~1.0.0"
1777
1778css-what@1.0:
1779 version "1.0.0"
1780 resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c"
1781
1782currently-unhandled@^0.4.1:
1783 version "0.4.1"
1784 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
1785 dependencies:
1786 array-find-index "^1.0.1"
1787 1951
1788cycle@1.0.x: 1952cycle@1.0.x:
1789 version "1.0.3" 1953 version "1.0.3"
1790 resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" 1954 resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
1955 integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
1791 1956
1792cyclist@~0.2.2: 1957cyclist@~0.2.2:
1793 version "0.2.2" 1958 version "0.2.2"
1794 resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" 1959 resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
1960 integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
1795 1961
1796d@1: 1962d@1:
1797 version "1.0.0" 1963 version "1.0.0"
1798 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 1964 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
1965 integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=
1799 dependencies: 1966 dependencies:
1800 es5-ext "^0.10.9" 1967 es5-ext "^0.10.9"
1801 1968
1802dashdash@^1.12.0: 1969dashdash@^1.12.0:
1803 version "1.14.1" 1970 version "1.14.1"
1804 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 1971 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
1972 integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
1805 dependencies: 1973 dependencies:
1806 assert-plus "^1.0.0" 1974 assert-plus "^1.0.0"
1807 1975
1808dasherize@2.0.0: 1976dasherize@2.0.0:
1809 version "2.0.0" 1977 version "2.0.0"
1810 resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" 1978 resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308"
1979 integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=
1811 1980
1812date-fns@^1.23.0, date-fns@^1.27.2: 1981date-fns@^1.23.0, date-fns@^1.27.2:
1813 version "1.29.0" 1982 version "1.29.0"
1814 resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" 1983 resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
1815 1984 integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==
1816date-now@^0.1.4:
1817 version "0.1.4"
1818 resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
1819
1820dateformat@~1.0.12:
1821 version "1.0.12"
1822 resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
1823 dependencies:
1824 get-stdin "^4.0.1"
1825 meow "^3.3.0"
1826 1985
1827deasync@^0.1.4: 1986deasync@^0.1.4:
1828 version "0.1.13" 1987 version "0.1.14"
1829 resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.13.tgz#815c2b69bbd1117cae570152cd895661c09f20ea" 1988 resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.14.tgz#232ea2252b443948cad033d792eb3b24b0a3d828"
1989 integrity sha512-wN8sIuEqIwyQh72AG7oY6YQODCxIp1eXzEZlZznBuwDF8Q03Tdy9QNp1BNZXeadXoklNrw+Ip1fch+KXo/+ASw==
1830 dependencies: 1990 dependencies:
1831 bindings "~1.2.1" 1991 bindings "~1.2.1"
1832 nan "^2.0.7" 1992 node-addon-api "^1.6.0"
1833 1993
1834debug@2.2.0, debug@~2.2.0: 1994debug@2.2.0, debug@~2.2.0:
1835 version "2.2.0" 1995 version "2.2.0"
1836 resolved "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 1996 resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
1997 integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=
1837 dependencies: 1998 dependencies:
1838 ms "0.7.1" 1999 ms "0.7.1"
1839 2000
1840debug@2.3.3: 2001debug@2.3.3:
1841 version "2.3.3" 2002 version "2.3.3"
1842 resolved "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" 2003 resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
2004 integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=
1843 dependencies: 2005 dependencies:
1844 ms "0.7.2" 2006 ms "0.7.2"
1845 2007
1846debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: 2008debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
1847 version "2.6.9" 2009 version "2.6.9"
1848 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 2010 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
2011 integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
1849 dependencies: 2012 dependencies:
1850 ms "2.0.0" 2013 ms "2.0.0"
1851 2014
1852debug@3.1.0: 2015debug@3.1.0, debug@~3.1.0:
1853 version "3.1.0" 2016 version "3.1.0"
1854 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 2017 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
2018 integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
1855 dependencies: 2019 dependencies:
1856 ms "2.0.0" 2020 ms "2.0.0"
1857 2021
1858debug@^3.1.0: 2022debug@^3.1.0:
1859 version "3.2.5" 2023 version "3.2.6"
1860 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" 2024 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
2025 integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
2026 dependencies:
2027 ms "^2.1.1"
2028
2029debug@^4.0.1:
2030 version "4.1.0"
2031 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87"
2032 integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==
2033 dependencies:
2034 ms "^2.1.1"
2035
2036debug@~4.1.0:
2037 version "4.1.1"
2038 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
2039 integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
1861 dependencies: 2040 dependencies:
1862 ms "^2.1.1" 2041 ms "^2.1.1"
1863 2042
1864debuglog@^1.0.0, debuglog@^1.0.1: 2043debuglog@^1.0.0, debuglog@^1.0.1:
1865 version "1.0.1" 2044 version "1.0.1"
1866 resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" 2045 resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
2046 integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
1867 2047
1868decamelize@^1.1.1, decamelize@^1.1.2: 2048decamelize@^1.1.1, decamelize@^1.2.0:
1869 version "1.2.0" 2049 version "1.2.0"
1870 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 2050 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
1871 2051 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
1872decamelize@^2.0.0:
1873 version "2.0.0"
1874 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
1875 dependencies:
1876 xregexp "4.0.0"
1877 2052
1878decode-uri-component@^0.2.0: 2053decode-uri-component@^0.2.0:
1879 version "0.2.0" 2054 version "0.2.0"
1880 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 2055 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
2056 integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
1881 2057
1882decompress-response@^3.3.0: 2058decompress-response@^3.3.0:
1883 version "3.3.0" 2059 version "3.3.0"
1884 resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 2060 resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
2061 integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
1885 dependencies: 2062 dependencies:
1886 mimic-response "^1.0.0" 2063 mimic-response "^1.0.0"
1887 2064
1888dedent@^0.7.0: 2065dedent@^0.7.0:
1889 version "0.7.0" 2066 version "0.7.0"
1890 resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" 2067 resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
2068 integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
1891 2069
1892deep-eql@0.1.3: 2070deep-eql@0.1.3:
1893 version "0.1.3" 2071 version "0.1.3"
1894 resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 2072 resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
2073 integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=
1895 dependencies: 2074 dependencies:
1896 type-detect "0.1.1" 2075 type-detect "0.1.1"
1897 2076
1898deep-eql@^3.0.0: 2077deep-eql@^3.0.1:
1899 version "3.0.1" 2078 version "3.0.1"
1900 resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 2079 resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
2080 integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
1901 dependencies: 2081 dependencies:
1902 type-detect "^4.0.0" 2082 type-detect "^4.0.0"
1903 2083
1904deep-equal@~0.2.1: 2084deep-equal@~0.2.1:
1905 version "0.2.2" 2085 version "0.2.2"
1906 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" 2086 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d"
2087 integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=
1907 2088
1908deep-extend@^0.6.0: 2089deep-extend@^0.6.0:
1909 version "0.6.0" 2090 version "0.6.0"
1910 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 2091 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
2092 integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
1911 2093
1912deep-is@~0.1.3: 2094deep-is@~0.1.3:
1913 version "0.1.3" 2095 version "0.1.3"
1914 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 2096 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
2097 integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
1915 2098
1916deep-object-diff@^1.1.0: 2099deep-object-diff@^1.1.0:
1917 version "1.1.0" 2100 version "1.1.0"
1918 resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" 2101 resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a"
2102 integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==
1919 2103
1920defaults@^1.0.3: 2104defaults@^1.0.3:
1921 version "1.0.3" 2105 version "1.0.3"
1922 resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 2106 resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
2107 integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
1923 dependencies: 2108 dependencies:
1924 clone "^1.0.2" 2109 clone "^1.0.2"
1925 2110
1926define-properties@^1.1.1: 2111define-properties@^1.1.1:
1927 version "1.1.3" 2112 version "1.1.3"
1928 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 2113 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
2114 integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
1929 dependencies: 2115 dependencies:
1930 object-keys "^1.0.12" 2116 object-keys "^1.0.12"
1931 2117
1932define-property@^0.2.5: 2118define-property@^0.2.5:
1933 version "0.2.5" 2119 version "0.2.5"
1934 resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 2120 resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
2121 integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
1935 dependencies: 2122 dependencies:
1936 is-descriptor "^0.1.0" 2123 is-descriptor "^0.1.0"
1937 2124
1938define-property@^1.0.0: 2125define-property@^1.0.0:
1939 version "1.0.0" 2126 version "1.0.0"
1940 resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 2127 resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
2128 integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
1941 dependencies: 2129 dependencies:
1942 is-descriptor "^1.0.0" 2130 is-descriptor "^1.0.0"
1943 2131
1944define-property@^2.0.2: 2132define-property@^2.0.2:
1945 version "2.0.2" 2133 version "2.0.2"
1946 resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 2134 resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
2135 integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
1947 dependencies: 2136 dependencies:
1948 is-descriptor "^1.0.2" 2137 is-descriptor "^1.0.2"
1949 isobject "^3.0.1" 2138 isobject "^3.0.1"
@@ -1951,64 +2140,71 @@ define-property@^2.0.2:
1951defined@^1.0.0: 2140defined@^1.0.0:
1952 version "1.0.0" 2141 version "1.0.0"
1953 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 2142 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
2143 integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
1954 2144
1955del@^2.0.2: 2145del@^3.0.0:
1956 version "2.2.2" 2146 version "3.0.0"
1957 resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 2147 resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
2148 integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=
1958 dependencies: 2149 dependencies:
1959 globby "^5.0.0" 2150 globby "^6.1.0"
1960 is-path-cwd "^1.0.0" 2151 is-path-cwd "^1.0.0"
1961 is-path-in-cwd "^1.0.0" 2152 is-path-in-cwd "^1.0.0"
1962 object-assign "^4.0.1" 2153 p-map "^1.1.1"
1963 pify "^2.0.0" 2154 pify "^3.0.0"
1964 pinkie-promise "^2.0.0"
1965 rimraf "^2.2.8" 2155 rimraf "^2.2.8"
1966 2156
1967delayed-stream@~1.0.0: 2157delayed-stream@~1.0.0:
1968 version "1.0.0" 2158 version "1.0.0"
1969 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 2159 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
2160 integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
1970 2161
1971delegates@^1.0.0: 2162delegates@^1.0.0:
1972 version "1.0.0" 2163 version "1.0.0"
1973 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 2164 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
2165 integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
1974 2166
1975denque@^1.1.0: 2167denque@^1.1.0:
1976 version "1.3.0" 2168 version "1.4.0"
1977 resolved "https://registry.yarnpkg.com/denque/-/denque-1.3.0.tgz#681092ef44a630246d3f6edb2a199230eae8e76b" 2169 resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.0.tgz#79e2f0490195502107f24d9553f374837dabc916"
1978 2170 integrity sha512-gh513ac7aiKrAgjiIBWZG0EASyDF9p4JMWwKA8YU5s9figrL5SRNEMT6FDynsegakuhWd1wVqTvqvqAoDxw7wQ==
1979depd@1.1.1:
1980 version "1.1.1"
1981 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
1982 2171
1983depd@^1.1.0, depd@~1.1.0, depd@~1.1.1, depd@~1.1.2: 2172depd@^1.1.0, depd@~1.1.0, depd@~1.1.2:
1984 version "1.1.2" 2173 version "1.1.2"
1985 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 2174 resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
2175 integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
1986 2176
1987descrevit@^0.1.1: 2177descrevit@^0.1.1:
1988 version "0.1.1" 2178 version "0.1.1"
1989 resolved "https://registry.yarnpkg.com/descrevit/-/descrevit-0.1.1.tgz#c0f5840de0a0f7b1b8b4078569b173327947d5da" 2179 resolved "https://registry.yarnpkg.com/descrevit/-/descrevit-0.1.1.tgz#c0f5840de0a0f7b1b8b4078569b173327947d5da"
2180 integrity sha1-wPWEDeCg97G4tAeFabFzMnlH1do=
1990 dependencies: 2181 dependencies:
1991 deasync "^0.1.4" 2182 deasync "^0.1.4"
1992 2183
1993destroy@~1.0.4: 2184destroy@~1.0.4:
1994 version "1.0.4" 2185 version "1.0.4"
1995 resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 2186 resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
2187 integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
1996 2188
1997detect-indent@~5.0.0: 2189detect-indent@~5.0.0:
1998 version "5.0.0" 2190 version "5.0.0"
1999 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" 2191 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
2192 integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
2000 2193
2001detect-libc@^1.0.2, detect-libc@^1.0.3: 2194detect-libc@^1.0.2, detect-libc@^1.0.3:
2002 version "1.0.3" 2195 version "1.0.3"
2003 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 2196 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
2197 integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
2004 2198
2005detect-newline@^2.1.0: 2199detect-newline@^2.1.0:
2006 version "2.1.0" 2200 version "2.1.0"
2007 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" 2201 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
2202 integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
2008 2203
2009dezalgo@^1.0.0, dezalgo@~1.0.3: 2204dezalgo@^1.0.0, dezalgo@~1.0.3:
2010 version "1.0.3" 2205 version "1.0.3"
2011 resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" 2206 resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
2207 integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
2012 dependencies: 2208 dependencies:
2013 asap "^2.0.0" 2209 asap "^2.0.0"
2014 wrappy "1" 2210 wrappy "1"
@@ -2016,6 +2212,7 @@ dezalgo@^1.0.0, dezalgo@~1.0.3:
2016diagnostics@^1.1.1: 2212diagnostics@^1.1.1:
2017 version "1.1.1" 2213 version "1.1.1"
2018 resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" 2214 resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a"
2215 integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==
2019 dependencies: 2216 dependencies:
2020 colorspace "1.1.x" 2217 colorspace "1.1.x"
2021 enabled "1.0.x" 2218 enabled "1.0.x"
@@ -2024,6 +2221,7 @@ diagnostics@^1.1.1:
2024dicer@0.2.5: 2221dicer@0.2.5:
2025 version "0.2.5" 2222 version "0.2.5"
2026 resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" 2223 resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
2224 integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=
2027 dependencies: 2225 dependencies:
2028 readable-stream "1.1.x" 2226 readable-stream "1.1.x"
2029 streamsearch "0.1.2" 2227 streamsearch "0.1.2"
@@ -2031,18 +2229,22 @@ dicer@0.2.5:
2031diff@3.5.0, diff@^3.1.0, diff@^3.2.0: 2229diff@3.5.0, diff@^3.1.0, diff@^3.2.0:
2032 version "3.5.0" 2230 version "3.5.0"
2033 resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 2231 resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
2232 integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
2034 2233
2035dns-prefetch-control@0.1.0: 2234dns-prefetch-control@0.1.0:
2036 version "0.1.0" 2235 version "0.1.0"
2037 resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" 2236 resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2"
2237 integrity sha1-YN20V3dOF48flBXwyrsOhbCzALI=
2038 2238
2039docopt@~0.6.2: 2239docopt@~0.6.2:
2040 version "0.6.2" 2240 version "0.6.2"
2041 resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11" 2241 resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11"
2242 integrity sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=
2042 2243
2043doctrine@0.7.2: 2244doctrine@0.7.2:
2044 version "0.7.2" 2245 version "0.7.2"
2045 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" 2246 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
2247 integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=
2046 dependencies: 2248 dependencies:
2047 esutils "^1.1.6" 2249 esutils "^1.1.6"
2048 isarray "0.0.1" 2250 isarray "0.0.1"
@@ -2050,63 +2252,20 @@ doctrine@0.7.2:
2050doctrine@^1.2.2: 2252doctrine@^1.2.2:
2051 version "1.5.0" 2253 version "1.5.0"
2052 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 2254 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
2255 integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
2053 dependencies: 2256 dependencies:
2054 esutils "^2.0.2" 2257 esutils "^2.0.2"
2055 isarray "^1.0.0" 2258 isarray "^1.0.0"
2056 2259
2057dom-serializer@0, dom-serializer@~0.1.0:
2058 version "0.1.0"
2059 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
2060 dependencies:
2061 domelementtype "~1.1.1"
2062 entities "~1.1.1"
2063
2064domelementtype@1:
2065 version "1.3.0"
2066 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
2067
2068domelementtype@~1.1.1:
2069 version "1.1.3"
2070 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
2071
2072domhandler@2.2:
2073 version "2.2.1"
2074 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.2.1.tgz#59df9dcd227e808b365ae73e1f6684ac3d946fc2"
2075 dependencies:
2076 domelementtype "1"
2077
2078domhandler@2.3:
2079 version "2.3.0"
2080 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
2081 dependencies:
2082 domelementtype "1"
2083
2084domutils@1.3:
2085 version "1.3.0"
2086 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.3.0.tgz#9ad4d59b5af6ca684c62fe6d768ef170e70df192"
2087 dependencies:
2088 domelementtype "1"
2089
2090domutils@1.4:
2091 version "1.4.3"
2092 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f"
2093 dependencies:
2094 domelementtype "1"
2095
2096domutils@1.5:
2097 version "1.5.1"
2098 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
2099 dependencies:
2100 dom-serializer "0"
2101 domelementtype "1"
2102
2103dont-sniff-mimetype@1.0.0: 2260dont-sniff-mimetype@1.0.0:
2104 version "1.0.0" 2261 version "1.0.0"
2105 resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" 2262 resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58"
2263 integrity sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=
2106 2264
2107dot-json@^1.0.3: 2265dot-json@^1.0.3:
2108 version "1.0.4" 2266 version "1.0.4"
2109 resolved "https://registry.yarnpkg.com/dot-json/-/dot-json-1.0.4.tgz#b5c5818eb526a7917ac02df017fe9fba37b11195" 2267 resolved "https://registry.yarnpkg.com/dot-json/-/dot-json-1.0.4.tgz#b5c5818eb526a7917ac02df017fe9fba37b11195"
2268 integrity sha1-tcWBjrUmp5F6wC3wF/6fujexEZU=
2110 dependencies: 2269 dependencies:
2111 docopt "~0.6.2" 2270 docopt "~0.6.2"
2112 underscore-keypath "~0.0.22" 2271 underscore-keypath "~0.0.22"
@@ -2114,32 +2273,34 @@ dot-json@^1.0.3:
2114dot-prop@^4.1.0: 2273dot-prop@^4.1.0:
2115 version "4.2.0" 2274 version "4.2.0"
2116 resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 2275 resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
2276 integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
2117 dependencies: 2277 dependencies:
2118 is-obj "^1.0.0" 2278 is-obj "^1.0.0"
2119 2279
2120dotenv@^5.0.1: 2280dotenv@^5.0.1:
2121 version "5.0.1" 2281 version "5.0.1"
2122 resolved "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" 2282 resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
2283 integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==
2123 2284
2124dottie@^2.0.0: 2285dottie@^2.0.0:
2125 version "2.0.0" 2286 version "2.0.1"
2126 resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.0.tgz#da191981c8b8d713ca0115d5898cf397c2f0ddd0" 2287 resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.1.tgz#697ad9d72004db7574d21f892466a3c285893659"
2288 integrity sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==
2127 2289
2128double-ended-queue@^2.1.0-0: 2290double-ended-queue@^2.1.0-0:
2129 version "2.1.0-0" 2291 version "2.1.0-0"
2130 resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" 2292 resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
2293 integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
2131 2294
2132duplexer3@^0.1.4: 2295duplexer3@^0.1.4:
2133 version "0.1.4" 2296 version "0.1.4"
2134 resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 2297 resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
2135 2298 integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
2136duplexer@^0.1.1, duplexer@~0.1.1:
2137 version "0.1.1"
2138 resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
2139 2299
2140duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: 2300duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0:
2141 version "3.6.0" 2301 version "3.6.1"
2142 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" 2302 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125"
2303 integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==
2143 dependencies: 2304 dependencies:
2144 end-of-stream "^1.0.0" 2305 end-of-stream "^1.0.0"
2145 inherits "^2.0.1" 2306 inherits "^2.0.1"
@@ -2149,6 +2310,7 @@ duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0:
2149ecc-jsbn@~0.1.1: 2310ecc-jsbn@~0.1.1:
2150 version "0.1.2" 2311 version "0.1.2"
2151 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 2312 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
2313 integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
2152 dependencies: 2314 dependencies:
2153 jsbn "~0.1.0" 2315 jsbn "~0.1.0"
2154 safer-buffer "^2.1.0" 2316 safer-buffer "^2.1.0"
@@ -2156,24 +2318,29 @@ ecc-jsbn@~0.1.1:
2156ecdsa-sig-formatter@1.0.10: 2318ecdsa-sig-formatter@1.0.10:
2157 version "1.0.10" 2319 version "1.0.10"
2158 resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" 2320 resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3"
2321 integrity sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=
2159 dependencies: 2322 dependencies:
2160 safe-buffer "^5.0.1" 2323 safe-buffer "^5.0.1"
2161 2324
2162editor@~1.0.0: 2325editor@~1.0.0:
2163 version "1.0.0" 2326 version "1.0.0"
2164 resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" 2327 resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
2328 integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=
2165 2329
2166ee-first@1.1.1: 2330ee-first@1.1.1:
2167 version "1.1.1" 2331 version "1.1.1"
2168 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 2332 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
2333 integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
2169 2334
2170elegant-spinner@^1.0.1: 2335elegant-spinner@^1.0.1:
2171 version "1.0.1" 2336 version "1.0.1"
2172 resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" 2337 resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
2338 integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
2173 2339
2174elliptic@=3.0.3: 2340elliptic@=3.0.3:
2175 version "3.0.3" 2341 version "3.0.3"
2176 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-3.0.3.tgz#865c9b420bfbe55006b9f969f97a0d2c44966595" 2342 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-3.0.3.tgz#865c9b420bfbe55006b9f969f97a0d2c44966595"
2343 integrity sha1-hlybQgv75VAGuflp+XoNLESWZZU=
2177 dependencies: 2344 dependencies:
2178 bn.js "^2.0.0" 2345 bn.js "^2.0.0"
2179 brorand "^1.0.1" 2346 brorand "^1.0.1"
@@ -2183,28 +2350,33 @@ elliptic@=3.0.3:
2183enabled@1.0.x: 2350enabled@1.0.x:
2184 version "1.0.2" 2351 version "1.0.2"
2185 resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" 2352 resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93"
2353 integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=
2186 dependencies: 2354 dependencies:
2187 env-variable "0.0.x" 2355 env-variable "0.0.x"
2188 2356
2189encodeurl@~1.0.1, encodeurl@~1.0.2: 2357encodeurl@~1.0.2:
2190 version "1.0.2" 2358 version "1.0.2"
2191 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 2359 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
2360 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
2192 2361
2193encoding@^0.1.11, encoding@^0.1.12, encoding@~0.1.12: 2362encoding@^0.1.11, encoding@^0.1.12, encoding@~0.1.12:
2194 version "0.1.12" 2363 version "0.1.12"
2195 resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 2364 resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
2365 integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
2196 dependencies: 2366 dependencies:
2197 iconv-lite "~0.4.13" 2367 iconv-lite "~0.4.13"
2198 2368
2199end-of-stream@^1.0.0, end-of-stream@^1.1.0: 2369end-of-stream@^1.0.0, end-of-stream@^1.1.0:
2200 version "1.4.1" 2370 version "1.4.1"
2201 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 2371 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
2372 integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
2202 dependencies: 2373 dependencies:
2203 once "^1.4.0" 2374 once "^1.4.0"
2204 2375
2205engine.io-client@1.8.3: 2376engine.io-client@1.8.3:
2206 version "1.8.3" 2377 version "1.8.3"
2207 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" 2378 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab"
2379 integrity sha1-F5jtk0USRkU9TG9jXXogH+lA1as=
2208 dependencies: 2380 dependencies:
2209 component-emitter "1.2.1" 2381 component-emitter "1.2.1"
2210 component-inherit "0.0.3" 2382 component-inherit "0.0.3"
@@ -2219,9 +2391,27 @@ engine.io-client@1.8.3:
2219 xmlhttprequest-ssl "1.5.3" 2391 xmlhttprequest-ssl "1.5.3"
2220 yeast "0.1.2" 2392 yeast "0.1.2"
2221 2393
2394engine.io-client@~3.3.1:
2395 version "3.3.1"
2396 resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03"
2397 integrity sha512-q66JBFuQcy7CSlfAz9L3jH+v7DTT3i6ZEadYcVj2pOs8/0uJHLxKX3WBkGTvULJMdz0tUCyJag0aKT/dpXL9BQ==
2398 dependencies:
2399 component-emitter "1.2.1"
2400 component-inherit "0.0.3"
2401 debug "~3.1.0"
2402 engine.io-parser "~2.1.1"
2403 has-cors "1.1.0"
2404 indexof "0.0.1"
2405 parseqs "0.0.5"
2406 parseuri "0.0.5"
2407 ws "~6.1.0"
2408 xmlhttprequest-ssl "~1.5.4"
2409 yeast "0.1.2"
2410
2222engine.io-parser@1.3.2: 2411engine.io-parser@1.3.2:
2223 version "1.3.2" 2412 version "1.3.2"
2224 resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" 2413 resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
2414 integrity sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=
2225 dependencies: 2415 dependencies:
2226 after "0.8.2" 2416 after "0.8.2"
2227 arraybuffer.slice "0.0.6" 2417 arraybuffer.slice "0.0.6"
@@ -2230,9 +2420,21 @@ engine.io-parser@1.3.2:
2230 has-binary "0.1.7" 2420 has-binary "0.1.7"
2231 wtf-8 "1.0.0" 2421 wtf-8 "1.0.0"
2232 2422
2423engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
2424 version "2.1.3"
2425 resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6"
2426 integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==
2427 dependencies:
2428 after "0.8.2"
2429 arraybuffer.slice "~0.0.7"
2430 base64-arraybuffer "0.1.5"
2431 blob "0.0.5"
2432 has-binary2 "~1.0.2"
2433
2233engine.io@1.8.3: 2434engine.io@1.8.3:
2234 version "1.8.3" 2435 version "1.8.3"
2235 resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" 2436 resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4"
2437 integrity sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=
2236 dependencies: 2438 dependencies:
2237 accepts "1.3.3" 2439 accepts "1.3.3"
2238 base64id "1.0.0" 2440 base64id "1.0.0"
@@ -2241,44 +2443,46 @@ engine.io@1.8.3:
2241 engine.io-parser "1.3.2" 2443 engine.io-parser "1.3.2"
2242 ws "1.1.2" 2444 ws "1.1.2"
2243 2445
2244entities@1.0: 2446engine.io@~3.3.1:
2245 version "1.0.0" 2447 version "3.3.2"
2246 resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" 2448 resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59"
2247 2449 integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==
2248entities@~1.1.1: 2450 dependencies:
2249 version "1.1.1" 2451 accepts "~1.3.4"
2250 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" 2452 base64id "1.0.0"
2453 cookie "0.3.1"
2454 debug "~3.1.0"
2455 engine.io-parser "~2.1.0"
2456 ws "~6.1.0"
2251 2457
2252env-variable@0.0.x: 2458env-variable@0.0.x:
2253 version "0.0.4" 2459 version "0.0.5"
2254 resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.4.tgz#0d6280cf507d84242befe35a512b5ae4be77c54e" 2460 resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88"
2461 integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==
2255 2462
2256err-code@^1.0.0: 2463err-code@^1.0.0:
2257 version "1.1.2" 2464 version "1.1.2"
2258 resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" 2465 resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
2466 integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
2259 2467
2260errno@~0.1.7: 2468errno@~0.1.7:
2261 version "0.1.7" 2469 version "0.1.7"
2262 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" 2470 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
2471 integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
2263 dependencies: 2472 dependencies:
2264 prr "~1.0.1" 2473 prr "~1.0.1"
2265 2474
2266error-ex@^1.2.0, error-ex@^1.3.1: 2475error-ex@^1.3.1:
2267 version "1.3.2" 2476 version "1.3.2"
2268 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 2477 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
2478 integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
2269 dependencies: 2479 dependencies:
2270 is-arrayish "^0.2.1" 2480 is-arrayish "^0.2.1"
2271 2481
2272error@^7.0.0: 2482es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
2273 version "7.0.2"
2274 resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02"
2275 dependencies:
2276 string-template "~0.2.1"
2277 xtend "~4.0.0"
2278
2279es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2:
2280 version "0.10.46" 2483 version "0.10.46"
2281 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" 2484 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572"
2485 integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==
2282 dependencies: 2486 dependencies:
2283 es6-iterator "~2.0.3" 2487 es6-iterator "~2.0.3"
2284 es6-symbol "~3.1.1" 2488 es6-symbol "~3.1.1"
@@ -2287,6 +2491,7 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~
2287es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: 2491es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
2288 version "2.0.3" 2492 version "2.0.3"
2289 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 2493 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
2494 integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
2290 dependencies: 2495 dependencies:
2291 d "1" 2496 d "1"
2292 es5-ext "^0.10.35" 2497 es5-ext "^0.10.35"
@@ -2295,6 +2500,7 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
2295es6-map@^0.1.3: 2500es6-map@^0.1.3:
2296 version "0.1.5" 2501 version "0.1.5"
2297 resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" 2502 resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
2503 integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
2298 dependencies: 2504 dependencies:
2299 d "1" 2505 d "1"
2300 es5-ext "~0.10.14" 2506 es5-ext "~0.10.14"
@@ -2306,20 +2512,24 @@ es6-map@^0.1.3:
2306es6-promise@^4.0.3: 2512es6-promise@^4.0.3:
2307 version "4.2.5" 2513 version "4.2.5"
2308 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" 2514 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
2515 integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
2309 2516
2310es6-promisify@^5.0.0: 2517es6-promisify@^5.0.0:
2311 version "5.0.0" 2518 version "5.0.0"
2312 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 2519 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
2520 integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
2313 dependencies: 2521 dependencies:
2314 es6-promise "^4.0.3" 2522 es6-promise "^4.0.3"
2315 2523
2316es6-promisify@^6.0.0: 2524es6-promisify@^6.0.0:
2317 version "6.0.0" 2525 version "6.0.1"
2318 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.0.tgz#b526a75eaa5ca600e960bf3d5ad98c40d75c7203" 2526 resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.1.tgz#6edaa45f3bd570ffe08febce66f7116be4b1cdb6"
2527 integrity sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw==
2319 2528
2320es6-set@~0.1.5: 2529es6-set@~0.1.5:
2321 version "0.1.5" 2530 version "0.1.5"
2322 resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" 2531 resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
2532 integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
2323 dependencies: 2533 dependencies:
2324 d "1" 2534 d "1"
2325 es5-ext "~0.10.14" 2535 es5-ext "~0.10.14"
@@ -2330,10 +2540,12 @@ es6-set@~0.1.5:
2330es6-shim@0.35.3: 2540es6-shim@0.35.3:
2331 version "0.35.3" 2541 version "0.35.3"
2332 resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26" 2542 resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26"
2543 integrity sha1-m/tzY/7//4emzbbNk+QF7DxLbyY=
2333 2544
2334es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: 2545es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
2335 version "3.1.1" 2546 version "3.1.1"
2336 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 2547 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
2548 integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
2337 dependencies: 2549 dependencies:
2338 d "1" 2550 d "1"
2339 es5-ext "~0.10.14" 2551 es5-ext "~0.10.14"
@@ -2341,6 +2553,7 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
2341es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: 2553es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
2342 version "2.0.2" 2554 version "2.0.2"
2343 resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" 2555 resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
2556 integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=
2344 dependencies: 2557 dependencies:
2345 d "1" 2558 d "1"
2346 es5-ext "^0.10.14" 2559 es5-ext "^0.10.14"
@@ -2350,14 +2563,17 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
2350escape-html@~1.0.3: 2563escape-html@~1.0.3:
2351 version "1.0.3" 2564 version "1.0.3"
2352 resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 2565 resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
2566 integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
2353 2567
2354escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: 2568escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5:
2355 version "1.0.5" 2569 version "1.0.5"
2356 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 2570 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
2571 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
2357 2572
2358escope@^3.6.0: 2573escope@^3.6.0:
2359 version "3.6.0" 2574 version "3.6.0"
2360 resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 2575 resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
2576 integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
2361 dependencies: 2577 dependencies:
2362 es6-map "^0.1.3" 2578 es6-map "^0.1.3"
2363 es6-weak-map "^2.0.1" 2579 es6-weak-map "^2.0.1"
@@ -2366,7 +2582,8 @@ escope@^3.6.0:
2366 2582
2367eslint@^2.7.0: 2583eslint@^2.7.0:
2368 version "2.13.1" 2584 version "2.13.1"
2369 resolved "http://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11" 2585 resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11"
2586 integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=
2370 dependencies: 2587 dependencies:
2371 chalk "^1.1.3" 2588 chalk "^1.1.3"
2372 concat-stream "^1.4.6" 2589 concat-stream "^1.4.6"
@@ -2405,79 +2622,60 @@ eslint@^2.7.0:
2405espree@^3.1.6: 2622espree@^3.1.6:
2406 version "3.5.4" 2623 version "3.5.4"
2407 resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 2624 resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
2625 integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
2408 dependencies: 2626 dependencies:
2409 acorn "^5.5.0" 2627 acorn "^5.5.0"
2410 acorn-jsx "^3.0.0" 2628 acorn-jsx "^3.0.0"
2411 2629
2412esprima@^1.2.0:
2413 version "1.2.5"
2414 resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9"
2415
2416esprima@^2.6.0:
2417 version "2.7.3"
2418 resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
2419
2420esprima@^4.0.0: 2630esprima@^4.0.0:
2421 version "4.0.1" 2631 version "4.0.1"
2422 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 2632 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
2633 integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2423 2634
2424esrecurse@^4.1.0: 2635esrecurse@^4.1.0:
2425 version "4.2.1" 2636 version "4.2.1"
2426 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 2637 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
2638 integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
2427 dependencies: 2639 dependencies:
2428 estraverse "^4.1.0" 2640 estraverse "^4.1.0"
2429 2641
2430estraverse@^1.5.0:
2431 version "1.9.3"
2432 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
2433
2434estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 2642estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
2435 version "4.2.0" 2643 version "4.2.0"
2436 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 2644 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
2645 integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
2437 2646
2438esutils@^1.1.6: 2647esutils@^1.1.6:
2439 version "1.1.6" 2648 version "1.1.6"
2440 resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" 2649 resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
2650 integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=
2441 2651
2442esutils@^2.0.2: 2652esutils@^2.0.2:
2443 version "2.0.2" 2653 version "2.0.2"
2444 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 2654 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
2655 integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
2445 2656
2446etag@~1.7.0: 2657etag@~1.7.0:
2447 version "1.7.0" 2658 version "1.7.0"
2448 resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" 2659 resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
2660 integrity sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=
2449 2661
2450etag@~1.8.1: 2662etag@~1.8.1:
2451 version "1.8.1" 2663 version "1.8.1"
2452 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 2664 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
2665 integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
2453 2666
2454event-emitter@^0.3.5, event-emitter@~0.3.5: 2667event-emitter@^0.3.5, event-emitter@~0.3.5:
2455 version "0.3.5" 2668 version "0.3.5"
2456 resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 2669 resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
2670 integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
2457 dependencies: 2671 dependencies:
2458 d "1" 2672 d "1"
2459 es5-ext "~0.10.14" 2673 es5-ext "~0.10.14"
2460 2674
2461event-stream@~3.3.0:
2462 version "3.3.6"
2463 resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef"
2464 dependencies:
2465 duplexer "^0.1.1"
2466 flatmap-stream "^0.1.0"
2467 from "^0.1.7"
2468 map-stream "0.0.7"
2469 pause-stream "^0.0.11"
2470 split "^1.0.1"
2471 stream-combiner "^0.2.2"
2472 through "^2.3.8"
2473
2474eventemitter2@~0.4.13:
2475 version "0.4.14"
2476 resolved "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
2477
2478execa@^0.10.0: 2675execa@^0.10.0:
2479 version "0.10.0" 2676 version "0.10.0"
2480 resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" 2677 resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
2678 integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
2481 dependencies: 2679 dependencies:
2482 cross-spawn "^6.0.0" 2680 cross-spawn "^6.0.0"
2483 get-stream "^3.0.0" 2681 get-stream "^3.0.0"
@@ -2490,6 +2688,7 @@ execa@^0.10.0:
2490execa@^0.7.0: 2688execa@^0.7.0:
2491 version "0.7.0" 2689 version "0.7.0"
2492 resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 2690 resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
2691 integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
2493 dependencies: 2692 dependencies:
2494 cross-spawn "^5.0.1" 2693 cross-spawn "^5.0.1"
2495 get-stream "^3.0.0" 2694 get-stream "^3.0.0"
@@ -2499,12 +2698,13 @@ execa@^0.7.0:
2499 signal-exit "^3.0.0" 2698 signal-exit "^3.0.0"
2500 strip-eof "^1.0.0" 2699 strip-eof "^1.0.0"
2501 2700
2502execa@^0.9.0: 2701execa@^1.0.0:
2503 version "0.9.0" 2702 version "1.0.0"
2504 resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" 2703 resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
2704 integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
2505 dependencies: 2705 dependencies:
2506 cross-spawn "^5.0.1" 2706 cross-spawn "^6.0.0"
2507 get-stream "^3.0.0" 2707 get-stream "^4.0.0"
2508 is-stream "^1.1.0" 2708 is-stream "^1.1.0"
2509 npm-run-path "^2.0.0" 2709 npm-run-path "^2.0.0"
2510 p-finally "^1.0.0" 2710 p-finally "^1.0.0"
@@ -2514,14 +2714,12 @@ execa@^0.9.0:
2514exit-hook@^1.0.0: 2714exit-hook@^1.0.0:
2515 version "1.1.1" 2715 version "1.1.1"
2516 resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 2716 resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
2517 2717 integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
2518exit@0.1.2, exit@0.1.x, exit@~0.1.1:
2519 version "0.1.2"
2520 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
2521 2718
2522expand-brackets@^2.1.4: 2719expand-brackets@^2.1.4:
2523 version "2.1.4" 2720 version "2.1.4"
2524 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 2721 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
2722 integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
2525 dependencies: 2723 dependencies:
2526 debug "^2.3.3" 2724 debug "^2.3.3"
2527 define-property "^0.2.5" 2725 define-property "^0.2.5"
@@ -2531,38 +2729,44 @@ expand-brackets@^2.1.4:
2531 snapdragon "^0.8.1" 2729 snapdragon "^0.8.1"
2532 to-regex "^3.0.1" 2730 to-regex "^3.0.1"
2533 2731
2534expand-template@^1.0.2: 2732expand-template@^2.0.3:
2535 version "1.1.1" 2733 version "2.0.3"
2536 resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" 2734 resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
2735 integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
2537 2736
2538expect-ct@0.1.1: 2737expect-ct@0.1.1:
2539 version "0.1.1" 2738 version "0.1.1"
2540 resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.1.tgz#de84476a2dbcb85000d5903737e9bc8a5ba7b897" 2739 resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.1.tgz#de84476a2dbcb85000d5903737e9bc8a5ba7b897"
2740 integrity sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==
2541 2741
2542express-oauth-server@^2.0.0: 2742express-oauth-server@^2.0.0:
2543 version "2.0.0" 2743 version "2.0.0"
2544 resolved "https://registry.yarnpkg.com/express-oauth-server/-/express-oauth-server-2.0.0.tgz#57b08665c1201532f52c4c02f19709238b99a48d" 2744 resolved "https://registry.yarnpkg.com/express-oauth-server/-/express-oauth-server-2.0.0.tgz#57b08665c1201532f52c4c02f19709238b99a48d"
2745 integrity sha1-V7CGZcEgFTL1LEwC8ZcJI4uZpI0=
2545 dependencies: 2746 dependencies:
2546 bluebird "^3.0.5" 2747 bluebird "^3.0.5"
2547 express "^4.13.3" 2748 express "^4.13.3"
2548 oauth2-server "3.0.0" 2749 oauth2-server "3.0.0"
2549 2750
2550express-rate-limit@^3.1.0: 2751express-rate-limit@^3.1.0:
2551 version "3.2.0" 2752 version "3.3.2"
2552 resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-3.2.0.tgz#92368aab15a6b17c68399d4d4b4289850f13c4fe" 2753 resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-3.3.2.tgz#c5b2fc770d533878ce01a5dbbfadca340f3b8915"
2754 integrity sha512-JZnnTf6ZX9ntQalCZiPHsOG9zhxyRGqfaur+WD4yIcdqzf5FJQao5dmxXbWHk093K8WRSYwNwnzkFXVYnBNudg==
2553 dependencies: 2755 dependencies:
2554 defaults "^1.0.3" 2756 defaults "^1.0.3"
2555 2757
2556express-validator@^5.0.0: 2758express-validator@^5.0.0:
2557 version "5.3.0" 2759 version "5.3.0"
2558 resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-5.3.0.tgz#18a4e4a6e6410e3b9d492fb4ffcb4556fec51806" 2760 resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-5.3.0.tgz#18a4e4a6e6410e3b9d492fb4ffcb4556fec51806"
2761 integrity sha512-HYVtPt21zp2bHS4+xwxYNF63dlq/23kh+ZRVfyo7SBObhOpRyZ0vWolm/v9KPUfCyLqX8j7ZP42dbB0MWjCCcA==
2559 dependencies: 2762 dependencies:
2560 lodash "^4.17.10" 2763 lodash "^4.17.10"
2561 validator "^10.4.0" 2764 validator "^10.4.0"
2562 2765
2563express@4.13.4: 2766express@4.13.4:
2564 version "4.13.4" 2767 version "4.13.4"
2565 resolved "http://registry.npmjs.org/express/-/express-4.13.4.tgz#3c0b76f3c77590c8345739061ec0bd3ba067ec24" 2768 resolved "https://registry.yarnpkg.com/express/-/express-4.13.4.tgz#3c0b76f3c77590c8345739061ec0bd3ba067ec24"
2769 integrity sha1-PAt288d1kMg0VzkGHsC9O6Bn7CQ=
2566 dependencies: 2770 dependencies:
2567 accepts "~1.2.12" 2771 accepts "~1.2.12"
2568 array-flatten "1.1.1" 2772 array-flatten "1.1.1"
@@ -2591,12 +2795,13 @@ express@4.13.4:
2591 vary "~1.0.1" 2795 vary "~1.0.1"
2592 2796
2593express@^4.12.4, express@^4.13.3: 2797express@^4.12.4, express@^4.13.3:
2594 version "4.16.3" 2798 version "4.16.4"
2595 resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" 2799 resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
2800 integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
2596 dependencies: 2801 dependencies:
2597 accepts "~1.3.5" 2802 accepts "~1.3.5"
2598 array-flatten "1.1.1" 2803 array-flatten "1.1.1"
2599 body-parser "1.18.2" 2804 body-parser "1.18.3"
2600 content-disposition "0.5.2" 2805 content-disposition "0.5.2"
2601 content-type "~1.0.4" 2806 content-type "~1.0.4"
2602 cookie "0.3.1" 2807 cookie "0.3.1"
@@ -2613,10 +2818,10 @@ express@^4.12.4, express@^4.13.3:
2613 on-finished "~2.3.0" 2818 on-finished "~2.3.0"
2614 parseurl "~1.3.2" 2819 parseurl "~1.3.2"
2615 path-to-regexp "0.1.7" 2820 path-to-regexp "0.1.7"
2616 proxy-addr "~2.0.3" 2821 proxy-addr "~2.0.4"
2617 qs "6.5.1" 2822 qs "6.5.2"
2618 range-parser "~1.2.0" 2823 range-parser "~1.2.0"
2619 safe-buffer "5.1.1" 2824 safe-buffer "5.1.2"
2620 send "0.16.2" 2825 send "0.16.2"
2621 serve-static "1.13.2" 2826 serve-static "1.13.2"
2622 setprototypeof "1.1.0" 2827 setprototypeof "1.1.0"
@@ -2628,23 +2833,27 @@ express@^4.12.4, express@^4.13.3:
2628extend-shallow@^2.0.1: 2833extend-shallow@^2.0.1:
2629 version "2.0.1" 2834 version "2.0.1"
2630 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 2835 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
2836 integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
2631 dependencies: 2837 dependencies:
2632 is-extendable "^0.1.0" 2838 is-extendable "^0.1.0"
2633 2839
2634extend-shallow@^3.0.0, extend-shallow@^3.0.2: 2840extend-shallow@^3.0.0, extend-shallow@^3.0.2:
2635 version "3.0.2" 2841 version "3.0.2"
2636 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 2842 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
2843 integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
2637 dependencies: 2844 dependencies:
2638 assign-symbols "^1.0.0" 2845 assign-symbols "^1.0.0"
2639 is-extendable "^1.0.1" 2846 is-extendable "^1.0.1"
2640 2847
2641extend@^3.0.0, extend@~3.0.0, extend@~3.0.1, extend@~3.0.2: 2848extend@^3.0.0, extend@~3.0.0, extend@~3.0.2:
2642 version "3.0.2" 2849 version "3.0.2"
2643 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 2850 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
2851 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
2644 2852
2645extglob@^2.0.4: 2853extglob@^2.0.4:
2646 version "2.0.4" 2854 version "2.0.4"
2647 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 2855 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
2856 integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
2648 dependencies: 2857 dependencies:
2649 array-unique "^0.3.2" 2858 array-unique "^0.3.2"
2650 define-property "^1.0.0" 2859 define-property "^1.0.0"
@@ -2655,84 +2864,83 @@ extglob@^2.0.4:
2655 snapdragon "^0.8.1" 2864 snapdragon "^0.8.1"
2656 to-regex "^3.0.1" 2865 to-regex "^3.0.1"
2657 2866
2658extract-zip@^1.6.5:
2659 version "1.6.7"
2660 resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
2661 dependencies:
2662 concat-stream "1.6.2"
2663 debug "2.6.9"
2664 mkdirp "0.5.1"
2665 yauzl "2.4.1"
2666
2667extsprintf@1.3.0: 2867extsprintf@1.3.0:
2668 version "1.3.0" 2868 version "1.3.0"
2669 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 2869 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
2870 integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
2670 2871
2671extsprintf@^1.2.0: 2872extsprintf@^1.2.0:
2672 version "1.4.0" 2873 version "1.4.0"
2673 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 2874 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
2875 integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
2674 2876
2675eyes@0.1.x: 2877eyes@0.1.x:
2676 version "0.1.8" 2878 version "0.1.8"
2677 resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 2879 resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
2880 integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
2678 2881
2679fast-deep-equal@^1.0.0: 2882fast-deep-equal@^2.0.1:
2680 version "1.1.0" 2883 version "2.0.1"
2681 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 2884 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
2885 integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
2682 2886
2683fast-json-stable-stringify@^2.0.0: 2887fast-json-stable-stringify@^2.0.0:
2684 version "2.0.0" 2888 version "2.0.0"
2685 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 2889 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
2890 integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
2686 2891
2687fast-levenshtein@~2.0.4: 2892fast-levenshtein@~2.0.4:
2688 version "2.0.6" 2893 version "2.0.6"
2689 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 2894 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
2895 integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
2690 2896
2691fast-safe-stringify@^2.0.4: 2897fast-safe-stringify@^2.0.4:
2692 version "2.0.6" 2898 version "2.0.6"
2693 resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" 2899 resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
2900 integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==
2694 2901
2695faye-websocket@~0.10.0: 2902feature-policy@0.2.0:
2696 version "0.10.0" 2903 version "0.2.0"
2697 resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" 2904 resolved "https://registry.yarnpkg.com/feature-policy/-/feature-policy-0.2.0.tgz#22096de49ab240176878ffe2bde2f6ff04d48c43"
2698 dependencies: 2905 integrity sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw==
2699 websocket-driver ">=0.5.1"
2700
2701fd-slicer@~1.0.1:
2702 version "1.0.1"
2703 resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
2704 dependencies:
2705 pend "~1.2.0"
2706 2906
2707fecha@^2.3.3: 2907fecha@^2.3.3:
2708 version "2.3.3" 2908 version "2.3.3"
2709 resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" 2909 resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
2910 integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==
2710 2911
2711figgy-pudding@^3.0.0, figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: 2912figgy-pudding@^3.0.0, figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
2712 version "3.5.1" 2913 version "3.5.1"
2713 resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" 2914 resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
2915 integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
2714 2916
2715figures@^1.0.1, figures@^1.3.5, figures@^1.7.0: 2917figures@^1.3.5, figures@^1.7.0:
2716 version "1.7.0" 2918 version "1.7.0"
2717 resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 2919 resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
2920 integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
2718 dependencies: 2921 dependencies:
2719 escape-string-regexp "^1.0.5" 2922 escape-string-regexp "^1.0.5"
2720 object-assign "^4.1.0" 2923 object-assign "^4.1.0"
2721 2924
2925figures@^2.0.0:
2926 version "2.0.0"
2927 resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
2928 integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
2929 dependencies:
2930 escape-string-regexp "^1.0.5"
2931
2722file-entry-cache@^1.1.1: 2932file-entry-cache@^1.1.1:
2723 version "1.3.1" 2933 version "1.3.1"
2724 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" 2934 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8"
2935 integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=
2725 dependencies: 2936 dependencies:
2726 flat-cache "^1.2.1" 2937 flat-cache "^1.2.1"
2727 object-assign "^4.0.1" 2938 object-assign "^4.0.1"
2728 2939
2729file-sync-cmp@^0.1.0:
2730 version "0.1.1"
2731 resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"
2732
2733filestream@^4.0.0: 2940filestream@^4.0.0:
2734 version "4.1.3" 2941 version "4.1.3"
2735 resolved "https://registry.yarnpkg.com/filestream/-/filestream-4.1.3.tgz#948fcaade8221f715f5ecaddc54862faaacc9325" 2942 resolved "https://registry.yarnpkg.com/filestream/-/filestream-4.1.3.tgz#948fcaade8221f715f5ecaddc54862faaacc9325"
2943 integrity sha1-lI/KregiH3FfXsrdxUhi+qrMkyU=
2736 dependencies: 2944 dependencies:
2737 inherits "^2.0.1" 2945 inherits "^2.0.1"
2738 readable-stream "^2.0.5" 2946 readable-stream "^2.0.5"
@@ -2742,6 +2950,7 @@ filestream@^4.0.0:
2742fill-range@^4.0.0: 2950fill-range@^4.0.0:
2743 version "4.0.0" 2951 version "4.0.0"
2744 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 2952 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
2953 integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
2745 dependencies: 2954 dependencies:
2746 extend-shallow "^2.0.1" 2955 extend-shallow "^2.0.1"
2747 is-number "^3.0.0" 2956 is-number "^3.0.0"
@@ -2751,27 +2960,17 @@ fill-range@^4.0.0:
2751finalhandler@0.4.1: 2960finalhandler@0.4.1:
2752 version "0.4.1" 2961 version "0.4.1"
2753 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d" 2962 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d"
2963 integrity sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=
2754 dependencies: 2964 dependencies:
2755 debug "~2.2.0" 2965 debug "~2.2.0"
2756 escape-html "~1.0.3" 2966 escape-html "~1.0.3"
2757 on-finished "~2.3.0" 2967 on-finished "~2.3.0"
2758 unpipe "~1.0.0" 2968 unpipe "~1.0.0"
2759 2969
2760finalhandler@1.1.0:
2761 version "1.1.0"
2762 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
2763 dependencies:
2764 debug "2.6.9"
2765 encodeurl "~1.0.1"
2766 escape-html "~1.0.3"
2767 on-finished "~2.3.0"
2768 parseurl "~1.3.2"
2769 statuses "~1.3.1"
2770 unpipe "~1.0.0"
2771
2772finalhandler@1.1.1: 2970finalhandler@1.1.1:
2773 version "1.1.1" 2971 version "1.1.1"
2774 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 2972 resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
2973 integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==
2775 dependencies: 2974 dependencies:
2776 debug "2.6.9" 2975 debug "2.6.9"
2777 encodeurl "~1.0.2" 2976 encodeurl "~1.0.2"
@@ -2784,66 +2983,58 @@ finalhandler@1.1.1:
2784find-npm-prefix@^1.0.2: 2983find-npm-prefix@^1.0.2:
2785 version "1.0.2" 2984 version "1.0.2"
2786 resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" 2985 resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
2986 integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==
2787 2987
2788find-parent-dir@^0.3.0: 2988find-parent-dir@^0.3.0:
2789 version "0.3.0" 2989 version "0.3.0"
2790 resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 2990 resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
2791 2991 integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=
2792find-up@^1.0.0:
2793 version "1.1.2"
2794 resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
2795 dependencies:
2796 path-exists "^2.0.0"
2797 pinkie-promise "^2.0.0"
2798 2992
2799find-up@^2.1.0: 2993find-up@^2.1.0:
2800 version "2.1.0" 2994 version "2.1.0"
2801 resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 2995 resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
2996 integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
2802 dependencies: 2997 dependencies:
2803 locate-path "^2.0.0" 2998 locate-path "^2.0.0"
2804 2999
2805find-up@^3.0.0: 3000find-up@^3.0.0:
2806 version "3.0.0" 3001 version "3.0.0"
2807 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 3002 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
3003 integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
2808 dependencies: 3004 dependencies:
2809 locate-path "^3.0.0" 3005 locate-path "^3.0.0"
2810 3006
2811findup-sync@~0.3.0:
2812 version "0.3.0"
2813 resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
2814 dependencies:
2815 glob "~5.0.0"
2816
2817flat-cache@^1.2.1: 3007flat-cache@^1.2.1:
2818 version "1.3.0" 3008 version "1.3.4"
2819 resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 3009 resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
3010 integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
2820 dependencies: 3011 dependencies:
2821 circular-json "^0.3.1" 3012 circular-json "^0.3.1"
2822 del "^2.0.2"
2823 graceful-fs "^4.1.2" 3013 graceful-fs "^4.1.2"
3014 rimraf "~2.6.2"
2824 write "^0.2.1" 3015 write "^0.2.1"
2825 3016
2826flat@^4.1.0: 3017flat@^4.1.0:
2827 version "4.1.0" 3018 version "4.1.0"
2828 resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 3019 resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2"
3020 integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==
2829 dependencies: 3021 dependencies:
2830 is-buffer "~2.0.3" 3022 is-buffer "~2.0.3"
2831 3023
2832flatmap-stream@^0.1.0:
2833 version "0.1.0"
2834 resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1"
2835
2836flatten@^1.0.2: 3024flatten@^1.0.2:
2837 version "1.0.2" 3025 version "1.0.2"
2838 resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 3026 resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
3027 integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
2839 3028
2840flexbuffer@0.0.6: 3029flexbuffer@0.0.6:
2841 version "0.0.6" 3030 version "0.0.6"
2842 resolved "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30" 3031 resolved "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30"
3032 integrity sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA=
2843 3033
2844fluent-ffmpeg@^2.1.0: 3034fluent-ffmpeg@^2.1.0:
2845 version "2.1.2" 3035 version "2.1.2"
2846 resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74" 3036 resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74"
3037 integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=
2847 dependencies: 3038 dependencies:
2848 async ">=0.2.9" 3039 async ">=0.2.9"
2849 which "^1.1.1" 3040 which "^1.1.1"
@@ -2851,6 +3042,7 @@ fluent-ffmpeg@^2.1.0:
2851flush-write-stream@^1.0.0: 3042flush-write-stream@^1.0.0:
2852 version "1.0.3" 3043 version "1.0.3"
2853 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" 3044 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
3045 integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==
2854 dependencies: 3046 dependencies:
2855 inherits "^2.0.1" 3047 inherits "^2.0.1"
2856 readable-stream "^2.0.4" 3048 readable-stream "^2.0.4"
@@ -2858,55 +3050,63 @@ flush-write-stream@^1.0.0:
2858for-in@^1.0.2: 3050for-in@^1.0.2:
2859 version "1.0.2" 3051 version "1.0.2"
2860 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 3052 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
3053 integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
2861 3054
2862forever-agent@~0.6.1: 3055forever-agent@~0.6.1:
2863 version "0.6.1" 3056 version "0.6.1"
2864 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 3057 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
3058 integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
2865 3059
2866form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: 3060form-data@^2.3.1, form-data@~2.3.2:
2867 version "2.3.2" 3061 version "2.3.3"
2868 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 3062 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
3063 integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
2869 dependencies: 3064 dependencies:
2870 asynckit "^0.4.0" 3065 asynckit "^0.4.0"
2871 combined-stream "1.0.6" 3066 combined-stream "^1.0.6"
2872 mime-types "^2.1.12" 3067 mime-types "^2.1.12"
2873 3068
3069format-util@^1.0.3:
3070 version "1.0.3"
3071 resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95"
3072 integrity sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU=
3073
2874formidable@^1.2.0: 3074formidable@^1.2.0:
2875 version "1.2.1" 3075 version "1.2.1"
2876 resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" 3076 resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
3077 integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==
2877 3078
2878forwarded@~0.1.0, forwarded@~0.1.2: 3079forwarded@~0.1.0, forwarded@~0.1.2:
2879 version "0.1.2" 3080 version "0.1.2"
2880 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 3081 resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
2881 3082 integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
2882foundation-sites@^6.4.1:
2883 version "6.4.3"
2884 resolved "https://registry.yarnpkg.com/foundation-sites/-/foundation-sites-6.4.3.tgz#ea89eb599badf6f03dd526c51f00bdb942a844f6"
2885 dependencies:
2886 jquery ">=3.0.0"
2887 what-input "^4.1.3"
2888 3083
2889fragment-cache@^0.2.1: 3084fragment-cache@^0.2.1:
2890 version "0.2.1" 3085 version "0.2.1"
2891 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 3086 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
3087 integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
2892 dependencies: 3088 dependencies:
2893 map-cache "^0.2.2" 3089 map-cache "^0.2.2"
2894 3090
2895frameguard@3.0.0: 3091frameguard@3.0.0:
2896 version "3.0.0" 3092 version "3.0.0"
2897 resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz#7bcad469ee7b96e91d12ceb3959c78235a9272e9" 3093 resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz#7bcad469ee7b96e91d12ceb3959c78235a9272e9"
3094 integrity sha1-e8rUae57lukdEs6zlZx4I1qScuk=
2898 3095
2899fresh@0.3.0: 3096fresh@0.3.0:
2900 version "0.3.0" 3097 version "0.3.0"
2901 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" 3098 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
3099 integrity sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=
2902 3100
2903fresh@0.5.2: 3101fresh@0.5.2:
2904 version "0.5.2" 3102 version "0.5.2"
2905 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 3103 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
3104 integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
2906 3105
2907from2@^1.3.0: 3106from2@^1.3.0:
2908 version "1.3.0" 3107 version "1.3.0"
2909 resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" 3108 resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd"
3109 integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=
2910 dependencies: 3110 dependencies:
2911 inherits "~2.0.1" 3111 inherits "~2.0.1"
2912 readable-stream "~1.1.10" 3112 readable-stream "~1.1.10"
@@ -2914,23 +3114,22 @@ from2@^1.3.0:
2914from2@^2.1.0: 3114from2@^2.1.0:
2915 version "2.3.0" 3115 version "2.3.0"
2916 resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 3116 resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
3117 integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
2917 dependencies: 3118 dependencies:
2918 inherits "^2.0.1" 3119 inherits "^2.0.1"
2919 readable-stream "^2.0.0" 3120 readable-stream "^2.0.0"
2920 3121
2921from@^0.1.7:
2922 version "0.1.7"
2923 resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
2924
2925front-matter@2.1.2: 3122front-matter@2.1.2:
2926 version "2.1.2" 3123 version "2.1.2"
2927 resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" 3124 resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb"
3125 integrity sha1-91mDufL0E75ljJPf172M5AePXNs=
2928 dependencies: 3126 dependencies:
2929 js-yaml "^3.4.6" 3127 js-yaml "^3.4.6"
2930 3128
2931fs-chunk-store@^1.6.2: 3129fs-chunk-store@^1.6.2:
2932 version "1.7.0" 3130 version "1.7.0"
2933 resolved "https://registry.yarnpkg.com/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz#1c4bcbe93c99af10aa04b65348f2bb27377a4010" 3131 resolved "https://registry.yarnpkg.com/fs-chunk-store/-/fs-chunk-store-1.7.0.tgz#1c4bcbe93c99af10aa04b65348f2bb27377a4010"
3132 integrity sha512-KhjJmZAs2eqfhCb6PdPx4RcZtheGTz86tpTC5JTvqBn/xda+Nb+0C7dCyjOSN7T76H6a56LvH0SVXQMchLXDRw==
2934 dependencies: 3133 dependencies:
2935 mkdirp "^0.5.1" 3134 mkdirp "^0.5.1"
2936 random-access-file "^2.0.1" 3135 random-access-file "^2.0.1"
@@ -2942,30 +3141,26 @@ fs-chunk-store@^1.6.2:
2942fs-constants@^1.0.0: 3141fs-constants@^1.0.0:
2943 version "1.0.0" 3142 version "1.0.0"
2944 resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 3143 resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
3144 integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
2945 3145
2946fs-copy-file-sync@^1.1.1: 3146fs-copy-file-sync@^1.1.1:
2947 version "1.1.1" 3147 version "1.1.1"
2948 resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" 3148 resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918"
2949 3149 integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==
2950fs-extra@^1.0.0:
2951 version "1.0.0"
2952 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
2953 dependencies:
2954 graceful-fs "^4.1.2"
2955 jsonfile "^2.1.0"
2956 klaw "^1.0.0"
2957 3150
2958fs-extra@^3.0.1: 3151fs-extra@^3.0.1:
2959 version "3.0.1" 3152 version "3.0.1"
2960 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" 3153 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
3154 integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=
2961 dependencies: 3155 dependencies:
2962 graceful-fs "^4.1.2" 3156 graceful-fs "^4.1.2"
2963 jsonfile "^3.0.0" 3157 jsonfile "^3.0.0"
2964 universalify "^0.1.0" 3158 universalify "^0.1.0"
2965 3159
2966fs-extra@^7.0.0: 3160fs-extra@^7.0.0:
2967 version "7.0.0" 3161 version "7.0.1"
2968 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" 3162 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
3163 integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
2969 dependencies: 3164 dependencies:
2970 graceful-fs "^4.1.2" 3165 graceful-fs "^4.1.2"
2971 jsonfile "^4.0.0" 3166 jsonfile "^4.0.0"
@@ -2974,12 +3169,14 @@ fs-extra@^7.0.0:
2974fs-minipass@^1.2.5: 3169fs-minipass@^1.2.5:
2975 version "1.2.5" 3170 version "1.2.5"
2976 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 3171 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
3172 integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
2977 dependencies: 3173 dependencies:
2978 minipass "^2.2.1" 3174 minipass "^2.2.1"
2979 3175
2980fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: 3176fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
2981 version "1.2.10" 3177 version "1.2.10"
2982 resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" 3178 resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
3179 integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY=
2983 dependencies: 3180 dependencies:
2984 graceful-fs "^4.1.2" 3181 graceful-fs "^4.1.2"
2985 path-is-inside "^1.0.1" 3182 path-is-inside "^1.0.1"
@@ -2988,6 +3185,7 @@ fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
2988fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: 3185fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
2989 version "1.0.10" 3186 version "1.0.10"
2990 resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 3187 resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
3188 integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
2991 dependencies: 3189 dependencies:
2992 graceful-fs "^4.1.2" 3190 graceful-fs "^4.1.2"
2993 iferr "^0.1.5" 3191 iferr "^0.1.5"
@@ -2997,10 +3195,12 @@ fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
2997fs.realpath@^1.0.0: 3195fs.realpath@^1.0.0:
2998 version "1.0.0" 3196 version "1.0.0"
2999 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 3197 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
3198 integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
3000 3199
3001fsevents@^1.2.2: 3200fsevents@^1.2.2:
3002 version "1.2.4" 3201 version "1.2.4"
3003 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 3202 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
3203 integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==
3004 dependencies: 3204 dependencies:
3005 nan "^2.9.2" 3205 nan "^2.9.2"
3006 node-pre-gyp "^0.10.0" 3206 node-pre-gyp "^0.10.0"
@@ -3008,15 +3208,26 @@ fsevents@^1.2.2:
3008fstream@^1.0.0, fstream@^1.0.2: 3208fstream@^1.0.0, fstream@^1.0.2:
3009 version "1.0.11" 3209 version "1.0.11"
3010 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 3210 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
3211 integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
3011 dependencies: 3212 dependencies:
3012 graceful-fs "^4.1.2" 3213 graceful-fs "^4.1.2"
3013 inherits "~2.0.0" 3214 inherits "~2.0.0"
3014 mkdirp ">=0.5 0" 3215 mkdirp ">=0.5 0"
3015 rimraf "2" 3216 rimraf "2"
3016 3217
3218g-status@^2.0.2:
3219 version "2.0.2"
3220 resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97"
3221 integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==
3222 dependencies:
3223 arrify "^1.0.1"
3224 matcher "^1.0.0"
3225 simple-git "^1.85.0"
3226
3017gauge@~2.7.3: 3227gauge@~2.7.3:
3018 version "2.7.4" 3228 version "2.7.4"
3019 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 3229 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
3230 integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
3020 dependencies: 3231 dependencies:
3021 aproba "^1.0.3" 3232 aproba "^1.0.3"
3022 console-control-strings "^1.0.0" 3233 console-control-strings "^1.0.0"
@@ -3027,35 +3238,34 @@ gauge@~2.7.3:
3027 strip-ansi "^3.0.1" 3238 strip-ansi "^3.0.1"
3028 wide-align "^1.1.0" 3239 wide-align "^1.1.0"
3029 3240
3030gaze@^1.0.0, gaze@^1.1.0:
3031 version "1.1.3"
3032 resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
3033 dependencies:
3034 globule "^1.0.0"
3035
3036generate-function@^2.0.0: 3241generate-function@^2.0.0:
3037 version "2.3.1" 3242 version "2.3.1"
3038 resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" 3243 resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
3244 integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
3039 dependencies: 3245 dependencies:
3040 is-property "^1.0.2" 3246 is-property "^1.0.2"
3041 3247
3042generate-object-property@^1.1.0: 3248generate-object-property@^1.1.0:
3043 version "1.2.0" 3249 version "1.2.0"
3044 resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 3250 resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
3251 integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
3045 dependencies: 3252 dependencies:
3046 is-property "^1.0.0" 3253 is-property "^1.0.0"
3047 3254
3048generic-pool@^3.4.0: 3255generic-pool@^3.4.0:
3049 version "3.4.2" 3256 version "3.4.2"
3050 resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" 3257 resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59"
3258 integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==
3051 3259
3052genfun@^4.0.1: 3260genfun@^5.0.0:
3053 version "4.0.1" 3261 version "5.0.0"
3054 resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" 3262 resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
3263 integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
3055 3264
3056gentle-fs@^2.0.0, gentle-fs@^2.0.1: 3265gentle-fs@^2.0.0, gentle-fs@^2.0.1:
3057 version "2.0.1" 3266 version "2.0.1"
3058 resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" 3267 resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687"
3268 integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==
3059 dependencies: 3269 dependencies:
3060 aproba "^1.1.2" 3270 aproba "^1.1.2"
3061 fs-vacuum "^1.2.10" 3271 fs-vacuum "^1.2.10"
@@ -3069,56 +3279,61 @@ gentle-fs@^2.0.0, gentle-fs@^2.0.1:
3069get-browser-rtc@^1.0.0: 3279get-browser-rtc@^1.0.0:
3070 version "1.0.2" 3280 version "1.0.2"
3071 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9" 3281 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9"
3282 integrity sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=
3072 3283
3073get-caller-file@^1.0.1: 3284get-caller-file@^1.0.1:
3074 version "1.0.3" 3285 version "1.0.3"
3075 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 3286 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
3287 integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
3076 3288
3077get-func-name@^2.0.0: 3289get-func-name@^2.0.0:
3078 version "2.0.0" 3290 version "2.0.0"
3079 resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 3291 resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
3292 integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
3080 3293
3081get-own-enumerable-property-symbols@^2.0.1: 3294get-own-enumerable-property-symbols@^3.0.0:
3082 version "2.0.1" 3295 version "3.0.0"
3083 resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" 3296 resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
3084 3297 integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==
3085get-port@^3.1.0:
3086 version "3.2.0"
3087 resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
3088
3089get-stdin@^4.0.1:
3090 version "4.0.1"
3091 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
3092 3298
3093get-stdin@^6.0.0: 3299get-stdin@^6.0.0:
3094 version "6.0.0" 3300 version "6.0.0"
3095 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 3301 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
3302 integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
3096 3303
3097get-stream@^3.0.0: 3304get-stream@^3.0.0:
3098 version "3.0.0" 3305 version "3.0.0"
3099 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 3306 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
3307 integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
3308
3309get-stream@^4.0.0:
3310 version "4.1.0"
3311 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
3312 integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
3313 dependencies:
3314 pump "^3.0.0"
3100 3315
3101get-value@^2.0.3, get-value@^2.0.6: 3316get-value@^2.0.3, get-value@^2.0.6:
3102 version "2.0.6" 3317 version "2.0.6"
3103 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 3318 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
3104 3319 integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
3105getobject@~0.1.0:
3106 version "0.1.0"
3107 resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
3108 3320
3109getpass@^0.1.1: 3321getpass@^0.1.1:
3110 version "0.1.7" 3322 version "0.1.7"
3111 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 3323 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
3324 integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
3112 dependencies: 3325 dependencies:
3113 assert-plus "^1.0.0" 3326 assert-plus "^1.0.0"
3114 3327
3115github-from-package@0.0.0: 3328github-from-package@0.0.0:
3116 version "0.0.0" 3329 version "0.0.0"
3117 resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 3330 resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
3331 integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
3118 3332
3119glob-parent@^3.1.0: 3333glob-parent@^3.1.0:
3120 version "3.1.0" 3334 version "3.1.0"
3121 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 3335 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
3336 integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
3122 dependencies: 3337 dependencies:
3123 is-glob "^3.1.0" 3338 is-glob "^3.1.0"
3124 path-dirname "^1.0.0" 3339 path-dirname "^1.0.0"
@@ -3126,6 +3341,7 @@ glob-parent@^3.1.0:
3126glob@7.1.2: 3341glob@7.1.2:
3127 version "7.1.2" 3342 version "7.1.2"
3128 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 3343 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
3344 integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
3129 dependencies: 3345 dependencies:
3130 fs.realpath "^1.0.0" 3346 fs.realpath "^1.0.0"
3131 inflight "^1.0.4" 3347 inflight "^1.0.4"
@@ -3134,18 +3350,10 @@ glob@7.1.2:
3134 once "^1.3.0" 3350 once "^1.3.0"
3135 path-is-absolute "^1.0.0" 3351 path-is-absolute "^1.0.0"
3136 3352
3137glob@^4.0.2:
3138 version "4.5.3"
3139 resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
3140 dependencies:
3141 inflight "^1.0.4"
3142 inherits "2"
3143 minimatch "^2.0.1"
3144 once "^1.3.0"
3145
3146glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2: 3353glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2:
3147 version "7.1.3" 3354 version "7.1.3"
3148 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 3355 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
3356 integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
3149 dependencies: 3357 dependencies:
3150 fs.realpath "^1.0.0" 3358 fs.realpath "^1.0.0"
3151 inflight "^1.0.4" 3359 inflight "^1.0.4"
@@ -3154,52 +3362,24 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, gl
3154 once "^1.3.0" 3362 once "^1.3.0"
3155 path-is-absolute "^1.0.0" 3363 path-is-absolute "^1.0.0"
3156 3364
3157glob@~5.0.0:
3158 version "5.0.15"
3159 resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
3160 dependencies:
3161 inflight "^1.0.4"
3162 inherits "2"
3163 minimatch "2 || 3"
3164 once "^1.3.0"
3165 path-is-absolute "^1.0.0"
3166
3167glob@~7.0.0:
3168 version "7.0.6"
3169 resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
3170 dependencies:
3171 fs.realpath "^1.0.0"
3172 inflight "^1.0.4"
3173 inherits "2"
3174 minimatch "^3.0.2"
3175 once "^1.3.0"
3176 path-is-absolute "^1.0.0"
3177
3178global-dirs@^0.1.0: 3365global-dirs@^0.1.0:
3179 version "0.1.1" 3366 version "0.1.1"
3180 resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 3367 resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
3368 integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
3181 dependencies: 3369 dependencies:
3182 ini "^1.3.4" 3370 ini "^1.3.4"
3183 3371
3184globals@^9.2.0: 3372globals@^9.2.0:
3185 version "9.18.0" 3373 version "9.18.0"
3186 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 3374 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
3375 integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
3187 3376
3188globby@^0.1.1: 3377globby@^6.1.0:
3189 version "0.1.1" 3378 version "6.1.0"
3190 resolved "https://registry.yarnpkg.com/globby/-/globby-0.1.1.tgz#cbec63df724b4bea458b79a16cc0e3b1f2ca8620" 3379 resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
3191 dependencies: 3380 integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
3192 array-differ "^0.1.0"
3193 array-union "^0.1.0"
3194 async "^0.9.0"
3195 glob "^4.0.2"
3196
3197globby@^5.0.0:
3198 version "5.0.0"
3199 resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
3200 dependencies: 3381 dependencies:
3201 array-union "^1.0.1" 3382 array-union "^1.0.1"
3202 arrify "^1.0.0"
3203 glob "^7.0.3" 3383 glob "^7.0.3"
3204 object-assign "^4.0.1" 3384 object-assign "^4.0.1"
3205 pify "^2.0.0" 3385 pify "^2.0.0"
@@ -3208,6 +3388,7 @@ globby@^5.0.0:
3208globule@^1.0.0: 3388globule@^1.0.0:
3209 version "1.2.1" 3389 version "1.2.1"
3210 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" 3390 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
3391 integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
3211 dependencies: 3392 dependencies:
3212 glob "~7.1.1" 3393 glob "~7.1.1"
3213 lodash "~4.17.10" 3394 lodash "~4.17.10"
@@ -3216,12 +3397,14 @@ globule@^1.0.0:
3216gonzales-pe-sl@^4.2.3: 3397gonzales-pe-sl@^4.2.3:
3217 version "4.2.3" 3398 version "4.2.3"
3218 resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6" 3399 resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6"
3400 integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=
3219 dependencies: 3401 dependencies:
3220 minimist "1.1.x" 3402 minimist "1.1.x"
3221 3403
3222got@^6.7.1: 3404got@^6.7.1:
3223 version "6.7.1" 3405 version "6.7.1"
3224 resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 3406 resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
3407 integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
3225 dependencies: 3408 dependencies:
3226 create-error-class "^3.0.0" 3409 create-error-class "^3.0.0"
3227 duplexer3 "^0.1.4" 3410 duplexer3 "^0.1.4"
@@ -3235,262 +3418,79 @@ got@^6.7.1:
3235 unzip-response "^2.0.1" 3418 unzip-response "^2.0.1"
3236 url-parse-lax "^1.0.0" 3419 url-parse-lax "^1.0.0"
3237 3420
3238graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.11: 3421graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.11:
3239 version "4.1.11" 3422 version "4.1.15"
3240 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 3423 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
3241 3424 integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
3242graceful-fs@~2.0.2:
3243 version "2.0.3"
3244 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0"
3245 3425
3246"graceful-readlink@>= 1.0.0": 3426"graceful-readlink@>= 1.0.0":
3247 version "1.0.1" 3427 version "1.0.1"
3248 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 3428 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
3249 3429 integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
3250graphlib@^2.1.1:
3251 version "2.1.5"
3252 resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.5.tgz#6afe1afcc5148555ec799e499056795bd6938c87"
3253 dependencies:
3254 lodash "^4.11.1"
3255 3430
3256growl@1.10.5: 3431growl@1.10.5:
3257 version "1.10.5" 3432 version "1.10.5"
3258 resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 3433 resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
3259 3434 integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
3260grunt-cli@~1.2.0:
3261 version "1.2.0"
3262 resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
3263 dependencies:
3264 findup-sync "~0.3.0"
3265 grunt-known-options "~1.1.0"
3266 nopt "~3.0.6"
3267 resolve "~1.1.0"
3268
3269grunt-compile-handlebars@^2.0.0:
3270 version "2.0.2"
3271 resolved "https://registry.yarnpkg.com/grunt-compile-handlebars/-/grunt-compile-handlebars-2.0.2.tgz#b9f60263771f7dd7f17bcc05e6e1e329e2772cc3"
3272 dependencies:
3273 alce "^1.0.0"
3274 handlebars ">= 1"
3275 lodash.merge "^3.0.0"
3276 lodash.toarray "^3.0.0"
3277
3278grunt-contrib-clean@^1.1.0:
3279 version "1.1.0"
3280 resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz#564abf2d0378a983a15b9e3f30ee75b738c40638"
3281 dependencies:
3282 async "^1.5.2"
3283 rimraf "^2.5.1"
3284
3285grunt-contrib-concat@^1.0.1:
3286 version "1.0.1"
3287 resolved "https://registry.yarnpkg.com/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz#61509863084e871d7e86de48c015259ed97745bd"
3288 dependencies:
3289 chalk "^1.0.0"
3290 source-map "^0.5.3"
3291
3292grunt-contrib-connect@^1.0.2:
3293 version "1.0.2"
3294 resolved "http://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz#5cf933b91a67386044273c0b2444603cd98879ba"
3295 dependencies:
3296 async "^1.5.2"
3297 connect "^3.4.0"
3298 connect-livereload "^0.5.0"
3299 http2 "^3.3.4"
3300 morgan "^1.6.1"
3301 opn "^4.0.0"
3302 portscanner "^1.0.0"
3303 serve-index "^1.7.1"
3304 serve-static "^1.10.0"
3305
3306grunt-contrib-copy@^1.0.0:
3307 version "1.0.0"
3308 resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz#7060c6581e904b8ab0d00f076e0a8f6e3e7c3573"
3309 dependencies:
3310 chalk "^1.1.1"
3311 file-sync-cmp "^0.1.0"
3312
3313grunt-contrib-cssmin@^2.2.1:
3314 version "2.2.1"
3315 resolved "https://registry.yarnpkg.com/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz#64cbebe60134bc1270ca4154514ec4007cc16f7f"
3316 dependencies:
3317 chalk "^1.0.0"
3318 clean-css "~4.1.1"
3319 maxmin "^2.1.0"
3320
3321grunt-contrib-handlebars@^1.0.0:
3322 version "1.0.0"
3323 resolved "https://registry.yarnpkg.com/grunt-contrib-handlebars/-/grunt-contrib-handlebars-1.0.0.tgz#a683cdda9dbd5cfdf5291c7581add85125717a3d"
3324 dependencies:
3325 chalk "^1.0.0"
3326 handlebars "~4.0.0"
3327 nsdeclare "0.1.0"
3328
3329grunt-contrib-jshint@^1.1.0:
3330 version "1.1.0"
3331 resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz#369d909b2593c40e8be79940b21340850c7939ac"
3332 dependencies:
3333 chalk "^1.1.1"
3334 hooker "^0.2.3"
3335 jshint "~2.9.4"
3336
3337grunt-contrib-uglify@^3.3.0:
3338 version "3.4.0"
3339 resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-3.4.0.tgz#8a51ab330be05ef62b11b2833abd3e955e85af03"
3340 dependencies:
3341 chalk "^1.0.0"
3342 maxmin "^2.1.0"
3343 uglify-js "~3.4.0"
3344 uri-path "^1.0.0"
3345
3346grunt-contrib-watch@^1.1.0:
3347 version "1.1.0"
3348 resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz#c143ca5b824b288a024b856639a5345aedb78ed4"
3349 dependencies:
3350 async "^2.6.0"
3351 gaze "^1.1.0"
3352 lodash "^4.17.10"
3353 tiny-lr "^1.1.1"
3354
3355grunt-embed@^0.2.1:
3356 version "0.2.1"
3357 resolved "https://registry.yarnpkg.com/grunt-embed/-/grunt-embed-0.2.1.tgz#ea96e929e9b12f5aaf9479bf1a84f373c716b02e"
3358 dependencies:
3359 resource-embedder "~0.2.1"
3360
3361grunt-known-options@~1.1.0:
3362 version "1.1.1"
3363 resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
3364
3365grunt-legacy-log-utils@~2.0.0:
3366 version "2.0.1"
3367 resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e"
3368 dependencies:
3369 chalk "~2.4.1"
3370 lodash "~4.17.10"
3371
3372grunt-legacy-log@~2.0.0:
3373 version "2.0.0"
3374 resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9"
3375 dependencies:
3376 colors "~1.1.2"
3377 grunt-legacy-log-utils "~2.0.0"
3378 hooker "~0.2.3"
3379 lodash "~4.17.5"
3380
3381grunt-legacy-util@~1.1.1:
3382 version "1.1.1"
3383 resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42"
3384 dependencies:
3385 async "~1.5.2"
3386 exit "~0.1.1"
3387 getobject "~0.1.0"
3388 hooker "~0.2.3"
3389 lodash "~4.17.10"
3390 underscore.string "~3.3.4"
3391 which "~1.3.0"
3392
3393grunt-prettify@^0.4.0:
3394 version "0.4.0"
3395 resolved "https://registry.yarnpkg.com/grunt-prettify/-/grunt-prettify-0.4.0.tgz#fc853db4245d4908ab6e35afb5277213eddc194b"
3396 dependencies:
3397 async "~0.9.0"
3398 globby "^0.1.1"
3399 js-beautify "~1.5.4"
3400 lodash "~2.4.1"
3401 underscore.string "~2.3.3"
3402
3403grunt-sass@^3.0.0:
3404 version "3.0.1"
3405 resolved "https://registry.yarnpkg.com/grunt-sass/-/grunt-sass-3.0.1.tgz#2760207d7b78db84429d9fa77d22289a6fc903a0"
3406
3407grunt@^1.0.3:
3408 version "1.0.3"
3409 resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.3.tgz#b3c99260c51d1b42835766e796527b60f7bba374"
3410 dependencies:
3411 coffeescript "~1.10.0"
3412 dateformat "~1.0.12"
3413 eventemitter2 "~0.4.13"
3414 exit "~0.1.1"
3415 findup-sync "~0.3.0"
3416 glob "~7.0.0"
3417 grunt-cli "~1.2.0"
3418 grunt-known-options "~1.1.0"
3419 grunt-legacy-log "~2.0.0"
3420 grunt-legacy-util "~1.1.1"
3421 iconv-lite "~0.4.13"
3422 js-yaml "~3.5.2"
3423 minimatch "~3.0.2"
3424 mkdirp "~0.5.1"
3425 nopt "~3.0.6"
3426 path-is-absolute "~1.0.0"
3427 rimraf "~2.6.2"
3428
3429gzip-size@^3.0.0:
3430 version "3.0.0"
3431 resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
3432 dependencies:
3433 duplexer "^0.1.1"
3434
3435"handlebars@>= 1", handlebars@^4.0.5, handlebars@~4.0.0:
3436 version "4.0.12"
3437 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
3438 dependencies:
3439 async "^2.5.0"
3440 optimist "^0.6.1"
3441 source-map "^0.6.1"
3442 optionalDependencies:
3443 uglify-js "^3.1.4"
3444 3435
3445har-schema@^2.0.0: 3436har-schema@^2.0.0:
3446 version "2.0.0" 3437 version "2.0.0"
3447 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 3438 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
3448 3439 integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
3449har-validator@~5.0.3:
3450 version "5.0.3"
3451 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
3452 dependencies:
3453 ajv "^5.1.0"
3454 har-schema "^2.0.0"
3455 3440
3456har-validator@~5.1.0: 3441har-validator@~5.1.0:
3457 version "5.1.0" 3442 version "5.1.3"
3458 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" 3443 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
3444 integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
3459 dependencies: 3445 dependencies:
3460 ajv "^5.3.0" 3446 ajv "^6.5.5"
3461 har-schema "^2.0.0" 3447 har-schema "^2.0.0"
3462 3448
3463has-ansi@^2.0.0: 3449has-ansi@^2.0.0:
3464 version "2.0.0" 3450 version "2.0.0"
3465 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 3451 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
3452 integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
3466 dependencies: 3453 dependencies:
3467 ansi-regex "^2.0.0" 3454 ansi-regex "^2.0.0"
3468 3455
3456has-binary2@~1.0.2:
3457 version "1.0.3"
3458 resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
3459 integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
3460 dependencies:
3461 isarray "2.0.1"
3462
3469has-binary@0.1.7: 3463has-binary@0.1.7:
3470 version "0.1.7" 3464 version "0.1.7"
3471 resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" 3465 resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
3466 integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=
3472 dependencies: 3467 dependencies:
3473 isarray "0.0.1" 3468 isarray "0.0.1"
3474 3469
3475has-cors@1.1.0: 3470has-cors@1.1.0:
3476 version "1.1.0" 3471 version "1.1.0"
3477 resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 3472 resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
3473 integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
3478 3474
3479has-flag@^2.0.0: 3475has-flag@^2.0.0:
3480 version "2.0.0" 3476 version "2.0.0"
3481 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 3477 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
3478 integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
3482 3479
3483has-flag@^3.0.0: 3480has-flag@^3.0.0:
3484 version "3.0.0" 3481 version "3.0.0"
3485 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 3482 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
3483 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
3486 3484
3487has-unicode@^2.0.0, has-unicode@~2.0.1: 3485has-unicode@^2.0.0, has-unicode@~2.0.1:
3488 version "2.0.1" 3486 version "2.0.1"
3489 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 3487 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
3488 integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
3490 3489
3491has-value@^0.3.1: 3490has-value@^0.3.1:
3492 version "0.3.1" 3491 version "0.3.1"
3493 resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 3492 resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
3493 integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
3494 dependencies: 3494 dependencies:
3495 get-value "^2.0.3" 3495 get-value "^2.0.3"
3496 has-values "^0.1.4" 3496 has-values "^0.1.4"
@@ -3499,6 +3499,7 @@ has-value@^0.3.1:
3499has-value@^1.0.0: 3499has-value@^1.0.0:
3500 version "1.0.0" 3500 version "1.0.0"
3501 resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 3501 resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
3502 integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
3502 dependencies: 3503 dependencies:
3503 get-value "^2.0.6" 3504 get-value "^2.0.6"
3504 has-values "^1.0.0" 3505 has-values "^1.0.0"
@@ -3507,45 +3508,45 @@ has-value@^1.0.0:
3507has-values@^0.1.4: 3508has-values@^0.1.4:
3508 version "0.1.4" 3509 version "0.1.4"
3509 resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 3510 resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
3511 integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
3510 3512
3511has-values@^1.0.0: 3513has-values@^1.0.0:
3512 version "1.0.0" 3514 version "1.0.0"
3513 resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 3515 resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
3516 integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
3514 dependencies: 3517 dependencies:
3515 is-number "^3.0.0" 3518 is-number "^3.0.0"
3516 kind-of "^4.0.0" 3519 kind-of "^4.0.0"
3517 3520
3518hash.js@^1.0.0: 3521hash.js@^1.0.0:
3519 version "1.1.5" 3522 version "1.1.7"
3520 resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" 3523 resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
3524 integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
3521 dependencies: 3525 dependencies:
3522 inherits "^2.0.3" 3526 inherits "^2.0.3"
3523 minimalistic-assert "^1.0.1" 3527 minimalistic-assert "^1.0.1"
3524 3528
3525hasha@^2.2.0:
3526 version "2.2.0"
3527 resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
3528 dependencies:
3529 is-stream "^1.0.1"
3530 pinkie-promise "^2.0.0"
3531
3532hashish@~0.0.4: 3529hashish@~0.0.4:
3533 version "0.0.4" 3530 version "0.0.4"
3534 resolved "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz#6d60bc6ffaf711b6afd60e426d077988014e6554" 3531 resolved "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz#6d60bc6ffaf711b6afd60e426d077988014e6554"
3532 integrity sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=
3535 dependencies: 3533 dependencies:
3536 traverse ">=0.2.4" 3534 traverse ">=0.2.4"
3537 3535
3538he@1.1.1: 3536he@1.1.1:
3539 version "1.1.1" 3537 version "1.1.1"
3540 resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 3538 resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
3539 integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
3541 3540
3542helmet-crossdomain@0.3.0: 3541helmet-crossdomain@0.3.0:
3543 version "0.3.0" 3542 version "0.3.0"
3544 resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz#707e2df930f13ad61f76ed08e1bb51ab2b2e85fa" 3543 resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz#707e2df930f13ad61f76ed08e1bb51ab2b2e85fa"
3544 integrity sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg==
3545 3545
3546helmet-csp@2.7.1: 3546helmet-csp@2.7.1:
3547 version "2.7.1" 3547 version "2.7.1"
3548 resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.7.1.tgz#e8e0b5186ffd4db625cfcce523758adbfadb9dca" 3548 resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.7.1.tgz#e8e0b5186ffd4db625cfcce523758adbfadb9dca"
3549 integrity sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==
3549 dependencies: 3550 dependencies:
3550 camelize "1.0.0" 3551 camelize "1.0.0"
3551 content-security-policy-builder "2.0.0" 3552 content-security-policy-builder "2.0.0"
@@ -3553,12 +3554,14 @@ helmet-csp@2.7.1:
3553 platform "1.3.5" 3554 platform "1.3.5"
3554 3555
3555helmet@^3.12.1: 3556helmet@^3.12.1:
3556 version "3.13.0" 3557 version "3.15.0"
3557 resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.13.0.tgz#d6d46763538f77b437be77f06d0af42078b2c656" 3558 resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.15.0.tgz#fe0bb80e05d9eec589e3cbecaf5384409a3a64c9"
3559 integrity sha512-j9JjtAnWJj09lqe/PEICrhuDaX30TeokXJ9tW6ZPhVH0+LMoihDeJ58CdWeTGzM66p6EiIODmgAaWfdeIWI4Gg==
3558 dependencies: 3560 dependencies:
3559 dns-prefetch-control "0.1.0" 3561 dns-prefetch-control "0.1.0"
3560 dont-sniff-mimetype "1.0.0" 3562 dont-sniff-mimetype "1.0.0"
3561 expect-ct "0.1.1" 3563 expect-ct "0.1.1"
3564 feature-policy "0.2.0"
3562 frameguard "3.0.0" 3565 frameguard "3.0.0"
3563 helmet-crossdomain "0.3.0" 3566 helmet-crossdomain "0.3.0"
3564 helmet-csp "2.7.1" 3567 helmet-csp "2.7.1"
@@ -3573,76 +3576,39 @@ helmet@^3.12.1:
3573hh-mm-ss@^1.2.0: 3576hh-mm-ss@^1.2.0:
3574 version "1.2.0" 3577 version "1.2.0"
3575 resolved "https://registry.yarnpkg.com/hh-mm-ss/-/hh-mm-ss-1.2.0.tgz#6d0f0b8280824a634cb1d1f20e0bc7bc8b689948" 3578 resolved "https://registry.yarnpkg.com/hh-mm-ss/-/hh-mm-ss-1.2.0.tgz#6d0f0b8280824a634cb1d1f20e0bc7bc8b689948"
3579 integrity sha512-f4I9Hz1dLpX/3mrEs7yq30+FiuO3tt5NWAqAGeBTaoeoBfB8vhcQ3BphuDc5DjZb/K809agqrAaFlP0jhEU/8w==
3576 dependencies: 3580 dependencies:
3577 zero-fill "^2.2.3" 3581 zero-fill "^2.2.3"
3578 3582
3579hide-powered-by@1.0.0: 3583hide-powered-by@1.0.0:
3580 version "1.0.0" 3584 version "1.0.0"
3581 resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" 3585 resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b"
3582 3586 integrity sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=
3583highlight.js@^9.1.0:
3584 version "9.12.0"
3585 resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
3586
3587hooker@^0.2.3, hooker@~0.2.3:
3588 version "0.2.3"
3589 resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
3590 3587
3591hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: 3588hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1:
3592 version "2.7.1" 3589 version "2.7.1"
3593 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 3590 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
3591 integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
3594 3592
3595hpkp@2.0.0: 3593hpkp@2.0.0:
3596 version "2.0.0" 3594 version "2.0.0"
3597 resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" 3595 resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672"
3596 integrity sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=
3598 3597
3599hsts@2.1.0: 3598hsts@2.1.0:
3600 version "2.1.0" 3599 version "2.1.0"
3601 resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz#cbd6c918a2385fee1dd5680bfb2b3a194c0121cc" 3600 resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz#cbd6c918a2385fee1dd5680bfb2b3a194c0121cc"
3602 3601 integrity sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==
3603htmlparser2@3.8.x, htmlparser2@~3.8.1:
3604 version "3.8.3"
3605 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
3606 dependencies:
3607 domelementtype "1"
3608 domhandler "2.3"
3609 domutils "1.5"
3610 entities "1.0"
3611 readable-stream "1.1"
3612
3613htmlparser2@~3.5.0:
3614 version "3.5.1"
3615 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.5.1.tgz#6f42f7657dd19c13f7d65de9118417394a0be6d0"
3616 dependencies:
3617 domelementtype "1"
3618 domhandler "2.2"
3619 domutils "1.3"
3620 readable-stream "1.1"
3621
3622http-basic@^2.5.1:
3623 version "2.5.1"
3624 resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-2.5.1.tgz#8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb"
3625 dependencies:
3626 caseless "~0.11.0"
3627 concat-stream "^1.4.6"
3628 http-response-object "^1.0.0"
3629 3602
3630http-cache-semantics@^3.8.1: 3603http-cache-semantics@^3.8.1:
3631 version "3.8.1" 3604 version "3.8.1"
3632 resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" 3605 resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
3633 3606 integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
3634http-errors@1.6.2:
3635 version "1.6.2"
3636 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
3637 dependencies:
3638 depd "1.1.1"
3639 inherits "2.0.3"
3640 setprototypeof "1.0.3"
3641 statuses ">= 1.3.1 < 2"
3642 3607
3643http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 3608http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
3644 version "1.6.3" 3609 version "1.6.3"
3645 resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 3610 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
3611 integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
3646 dependencies: 3612 dependencies:
3647 depd "~1.1.2" 3613 depd "~1.1.2"
3648 inherits "2.0.3" 3614 inherits "2.0.3"
@@ -3651,41 +3617,33 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
3651 3617
3652http-errors@~1.3.1: 3618http-errors@~1.3.1:
3653 version "1.3.1" 3619 version "1.3.1"
3654 resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" 3620 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
3621 integrity sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=
3655 dependencies: 3622 dependencies:
3656 inherits "~2.0.1" 3623 inherits "~2.0.1"
3657 statuses "1" 3624 statuses "1"
3658 3625
3659http-parser-js@>=0.4.0:
3660 version "0.4.13"
3661 resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"
3662
3663http-proxy-agent@^2.1.0: 3626http-proxy-agent@^2.1.0:
3664 version "2.1.0" 3627 version "2.1.0"
3665 resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" 3628 resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
3629 integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
3666 dependencies: 3630 dependencies:
3667 agent-base "4" 3631 agent-base "4"
3668 debug "3.1.0" 3632 debug "3.1.0"
3669 3633
3670http-response-object@^1.0.0, http-response-object@^1.1.0: 3634http-signature@^1.2.0, http-signature@~1.2.0:
3671 version "1.1.0"
3672 resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-1.1.0.tgz#a7c4e75aae82f3bb4904e4f43f615673b4d518c3"
3673
3674http-signature@~1.2.0:
3675 version "1.2.0" 3635 version "1.2.0"
3676 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 3636 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
3637 integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
3677 dependencies: 3638 dependencies:
3678 assert-plus "^1.0.0" 3639 assert-plus "^1.0.0"
3679 jsprim "^1.2.2" 3640 jsprim "^1.2.2"
3680 sshpk "^1.7.0" 3641 sshpk "^1.7.0"
3681 3642
3682http2@^3.3.4:
3683 version "3.3.7"
3684 resolved "https://registry.yarnpkg.com/http2/-/http2-3.3.7.tgz#78396eb1e0bcd1db1f4b138d997c682e23414fbc"
3685
3686https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: 3643https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1:
3687 version "2.2.1" 3644 version "2.2.1"
3688 resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 3645 resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
3646 integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
3689 dependencies: 3647 dependencies:
3690 agent-base "^4.1.0" 3648 agent-base "^4.1.0"
3691 debug "^3.1.0" 3649 debug "^3.1.0"
@@ -3693,15 +3651,17 @@ https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1:
3693humanize-ms@^1.2.1: 3651humanize-ms@^1.2.1:
3694 version "1.2.1" 3652 version "1.2.1"
3695 resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 3653 resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
3654 integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
3696 dependencies: 3655 dependencies:
3697 ms "^2.0.0" 3656 ms "^2.0.0"
3698 3657
3699husky@^1.0.0-rc.4: 3658husky@^1.0.0-rc.4:
3700 version "1.0.0-rc.14" 3659 version "1.2.0"
3701 resolved "https://registry.yarnpkg.com/husky/-/husky-1.0.0-rc.14.tgz#e1380575fe4cf17e1ca98791395c1baafa8064c7" 3660 resolved "https://registry.yarnpkg.com/husky/-/husky-1.2.0.tgz#d631dda1e4a9ee8ba69a10b0c51a0e2c66e711e5"
3661 integrity sha512-/ib3+iycykXC0tYIxsyqierikVa9DA2DrT32UEirqNEFVqOj1bFMTgP3jAz8HM7FgC/C8pc/BTUa9MV2GEkZaA==
3702 dependencies: 3662 dependencies:
3703 cosmiconfig "^5.0.6" 3663 cosmiconfig "^5.0.6"
3704 execa "^0.9.0" 3664 execa "^1.0.0"
3705 find-up "^3.0.0" 3665 find-up "^3.0.0"
3706 get-stdin "^6.0.0" 3666 get-stdin "^6.0.0"
3707 is-ci "^1.2.1" 3667 is-ci "^1.2.1"
@@ -3714,86 +3674,96 @@ husky@^1.0.0-rc.4:
3714i@0.3.x: 3674i@0.3.x:
3715 version "0.3.6" 3675 version "0.3.6"
3716 resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" 3676 resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
3717 3677 integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=
3718iconv-lite@0.4.19:
3719 version "0.4.19"
3720 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
3721 3678
3722iconv-lite@0.4.23: 3679iconv-lite@0.4.23:
3723 version "0.4.23" 3680 version "0.4.23"
3724 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 3681 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
3682 integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==
3725 dependencies: 3683 dependencies:
3726 safer-buffer ">= 2.1.2 < 3" 3684 safer-buffer ">= 2.1.2 < 3"
3727 3685
3728iconv-lite@^0.4.4, iconv-lite@~0.4.13: 3686iconv-lite@^0.4.4, iconv-lite@~0.4.13:
3729 version "0.4.24" 3687 version "0.4.24"
3730 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 3688 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
3689 integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
3731 dependencies: 3690 dependencies:
3732 safer-buffer ">= 2.1.2 < 3" 3691 safer-buffer ">= 2.1.2 < 3"
3733 3692
3734ienoopen@1.0.0: 3693ienoopen@1.0.0:
3735 version "1.0.0" 3694 version "1.0.0"
3736 resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b" 3695 resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b"
3696 integrity sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=
3737 3697
3738iferr@^0.1.5: 3698iferr@^0.1.5:
3739 version "0.1.5" 3699 version "0.1.5"
3740 resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 3700 resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
3701 integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
3741 3702
3742iferr@^1.0.2: 3703iferr@^1.0.2:
3743 version "1.0.2" 3704 version "1.0.2"
3744 resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" 3705 resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d"
3706 integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==
3745 3707
3746ignore-by-default@^1.0.1: 3708ignore-by-default@^1.0.1:
3747 version "1.0.1" 3709 version "1.0.1"
3748 resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 3710 resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
3711 integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
3749 3712
3750ignore-walk@^3.0.1: 3713ignore-walk@^3.0.1:
3751 version "3.0.1" 3714 version "3.0.1"
3752 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 3715 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
3716 integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
3753 dependencies: 3717 dependencies:
3754 minimatch "^3.0.4" 3718 minimatch "^3.0.4"
3755 3719
3756ignore@^3.1.2: 3720ignore@^3.1.2:
3757 version "3.3.10" 3721 version "3.3.10"
3758 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 3722 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
3723 integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
3759 3724
3760immediate-chunk-store@^2.0.0: 3725immediate-chunk-store@^2.0.0:
3761 version "2.0.0" 3726 version "2.0.0"
3762 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.0.0.tgz#f313fd0cc71396d8911ad031179e1cccfda3da18" 3727 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.0.0.tgz#f313fd0cc71396d8911ad031179e1cccfda3da18"
3728 integrity sha512-5s6NiCGbtWc+OQA60jrre54w12U7tynIyUNjO5LJjNA5lWwvCv6640roq8Wk/wIuaqnd4Pgtp453OyJ7hbONkQ==
3729
3730import-fresh@^2.0.0:
3731 version "2.0.0"
3732 resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
3733 integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
3734 dependencies:
3735 caller-path "^2.0.0"
3736 resolve-from "^3.0.0"
3763 3737
3764import-lazy@^2.1.0: 3738import-lazy@^2.1.0:
3765 version "2.1.0" 3739 version "2.1.0"
3766 resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 3740 resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
3741 integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
3767 3742
3768imurmurhash@^0.1.4: 3743imurmurhash@^0.1.4:
3769 version "0.1.4" 3744 version "0.1.4"
3770 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 3745 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
3771 3746 integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
3772in-publish@^2.0.0:
3773 version "2.0.0"
3774 resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
3775
3776indent-string@^2.1.0:
3777 version "2.1.0"
3778 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
3779 dependencies:
3780 repeating "^2.0.0"
3781 3747
3782indent-string@^3.0.0: 3748indent-string@^3.0.0:
3783 version "3.2.0" 3749 version "3.2.0"
3784 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" 3750 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
3751 integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
3785 3752
3786indexof@0.0.1: 3753indexof@0.0.1:
3787 version "0.0.1" 3754 version "0.0.1"
3788 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 3755 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
3756 integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
3789 3757
3790inflection@1.12.0: 3758inflection@1.12.0:
3791 version "1.12.0" 3759 version "1.12.0"
3792 resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 3760 resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
3761 integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=
3793 3762
3794inflight@^1.0.4, inflight@~1.0.6: 3763inflight@^1.0.4, inflight@~1.0.6:
3795 version "1.0.6" 3764 version "1.0.6"
3796 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 3765 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
3766 integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
3797 dependencies: 3767 dependencies:
3798 once "^1.3.0" 3768 once "^1.3.0"
3799 wrappy "1" 3769 wrappy "1"
@@ -3801,18 +3771,22 @@ inflight@^1.0.4, inflight@~1.0.6:
3801inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 3771inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
3802 version "2.0.3" 3772 version "2.0.3"
3803 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 3773 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
3774 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3804 3775
3805inherits@=2.0.1: 3776inherits@=2.0.1:
3806 version "2.0.1" 3777 version "2.0.1"
3807 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 3778 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
3779 integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
3808 3780
3809ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: 3781ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
3810 version "1.3.5" 3782 version "1.3.5"
3811 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 3783 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
3784 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
3812 3785
3813init-package-json@^1.10.3: 3786init-package-json@^1.10.3:
3814 version "1.10.3" 3787 version "1.10.3"
3815 resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" 3788 resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
3789 integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==
3816 dependencies: 3790 dependencies:
3817 glob "^7.1.1" 3791 glob "^7.1.1"
3818 npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" 3792 npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
@@ -3825,7 +3799,8 @@ init-package-json@^1.10.3:
3825 3799
3826inquirer@^0.12.0: 3800inquirer@^0.12.0:
3827 version "0.12.0" 3801 version "0.12.0"
3828 resolved "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 3802 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
3803 integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=
3829 dependencies: 3804 dependencies:
3830 ansi-escapes "^1.1.0" 3805 ansi-escapes "^1.1.0"
3831 ansi-regex "^2.0.0" 3806 ansi-regex "^2.0.0"
@@ -3844,14 +3819,17 @@ inquirer@^0.12.0:
3844invert-kv@^1.0.0: 3819invert-kv@^1.0.0:
3845 version "1.0.0" 3820 version "1.0.0"
3846 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 3821 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
3822 integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
3847 3823
3848invert-kv@^2.0.0: 3824invert-kv@^2.0.0:
3849 version "2.0.0" 3825 version "2.0.0"
3850 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 3826 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
3827 integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
3851 3828
3852ioredis@^3.1.4: 3829ioredis@^3.1.4:
3853 version "3.2.2" 3830 version "3.2.2"
3854 resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-3.2.2.tgz#b7d5ff3afd77bb9718bb2821329b894b9a44c00b" 3831 resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-3.2.2.tgz#b7d5ff3afd77bb9718bb2821329b894b9a44c00b"
3832 integrity sha512-g+ShTQYLsCcOUkNOK6CCEZbj3aRDVPw3WOwXk+LxlUKvuS9ujEqP2MppBHyRVYrNNFW/vcPaTBUZ2ctGNSiOCA==
3855 dependencies: 3833 dependencies:
3856 bluebird "^3.3.4" 3834 bluebird "^3.3.4"
3857 cluster-key-slot "^1.0.6" 3835 cluster-key-slot "^1.0.6"
@@ -3880,112 +3858,142 @@ ioredis@^3.1.4:
3880ip-anonymize@^0.0.6: 3858ip-anonymize@^0.0.6:
3881 version "0.0.6" 3859 version "0.0.6"
3882 resolved "https://registry.yarnpkg.com/ip-anonymize/-/ip-anonymize-0.0.6.tgz#d2c513e448e874e8cc380d03404691b94b018e68" 3860 resolved "https://registry.yarnpkg.com/ip-anonymize/-/ip-anonymize-0.0.6.tgz#d2c513e448e874e8cc380d03404691b94b018e68"
3861 integrity sha1-0sUT5EjodOjMOA0DQEaRuUsBjmg=
3883 3862
3884ip-regex@^2.1.0: 3863ip-regex@^2.1.0:
3885 version "2.1.0" 3864 version "2.1.0"
3886 resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" 3865 resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
3866 integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
3887 3867
3888ip-set@^1.0.0: 3868ip-set@^1.0.0:
3889 version "1.0.1" 3869 version "1.0.1"
3890 resolved "https://registry.yarnpkg.com/ip-set/-/ip-set-1.0.1.tgz#633b66d0bd6c8d0de968d053263c9120d3b6727e" 3870 resolved "https://registry.yarnpkg.com/ip-set/-/ip-set-1.0.1.tgz#633b66d0bd6c8d0de968d053263c9120d3b6727e"
3871 integrity sha1-Yztm0L1sjQ3paNBTJjyRINO2cn4=
3891 dependencies: 3872 dependencies:
3892 ip "^1.1.3" 3873 ip "^1.1.3"
3893 3874
3894ip@^1.0.1, ip@^1.1.3, ip@^1.1.4, ip@^1.1.5: 3875ip@^1.0.1, ip@^1.1.3, ip@^1.1.4, ip@^1.1.5:
3895 version "1.1.5" 3876 version "1.1.5"
3896 resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" 3877 resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
3878 integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
3897 3879
3898ipaddr.js@1.0.5: 3880ipaddr.js@1.0.5:
3899 version "1.0.5" 3881 version "1.0.5"
3900 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.0.5.tgz#5fa78cf301b825c78abc3042d812723049ea23c7" 3882 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.0.5.tgz#5fa78cf301b825c78abc3042d812723049ea23c7"
3883 integrity sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c=
3901 3884
3902ipaddr.js@1.8.0: 3885ipaddr.js@1.8.0:
3903 version "1.8.0" 3886 version "1.8.0"
3904 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 3887 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
3888 integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
3905 3889
3906ipaddr.js@1.8.1, "ipaddr.js@>= 0.1.5", ipaddr.js@^1.0.1: 3890ipaddr.js@1.8.1, "ipaddr.js@>= 0.1.5", ipaddr.js@^1.0.1:
3907 version "1.8.1" 3891 version "1.8.1"
3908 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" 3892 resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427"
3893 integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc=
3909 3894
3910ipv6-normalize@^1.0.1: 3895ipv6-normalize@^1.0.1:
3911 version "1.0.1" 3896 version "1.0.1"
3912 resolved "https://registry.yarnpkg.com/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz#1b3258290d365fa83239e89907dde4592e7620a8" 3897 resolved "https://registry.yarnpkg.com/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz#1b3258290d365fa83239e89907dde4592e7620a8"
3898 integrity sha1-GzJYKQ02X6gyOeiZB93kWS52IKg=
3913 3899
3914is-accessor-descriptor@^0.1.6: 3900is-accessor-descriptor@^0.1.6:
3915 version "0.1.6" 3901 version "0.1.6"
3916 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 3902 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
3903 integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
3917 dependencies: 3904 dependencies:
3918 kind-of "^3.0.2" 3905 kind-of "^3.0.2"
3919 3906
3920is-accessor-descriptor@^1.0.0: 3907is-accessor-descriptor@^1.0.0:
3921 version "1.0.0" 3908 version "1.0.0"
3922 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 3909 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
3910 integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
3923 dependencies: 3911 dependencies:
3924 kind-of "^6.0.0" 3912 kind-of "^6.0.0"
3925 3913
3926is-arrayish@^0.2.1: 3914is-arrayish@^0.2.1:
3927 version "0.2.1" 3915 version "0.2.1"
3928 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 3916 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
3917 integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
3929 3918
3930is-arrayish@^0.3.1: 3919is-arrayish@^0.3.1:
3931 version "0.3.2" 3920 version "0.3.2"
3932 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 3921 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
3922 integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
3933 3923
3934is-ascii@^1.0.0: 3924is-ascii@^1.0.0:
3935 version "1.0.0" 3925 version "1.0.0"
3936 resolved "https://registry.yarnpkg.com/is-ascii/-/is-ascii-1.0.0.tgz#f02ad0259a0921cd199ff21ce1b09e0f6b4e3929" 3926 resolved "https://registry.yarnpkg.com/is-ascii/-/is-ascii-1.0.0.tgz#f02ad0259a0921cd199ff21ce1b09e0f6b4e3929"
3927 integrity sha1-8CrQJZoJIc0Zn/Ic4bCeD2tOOSk=
3937 3928
3938is-binary-path@^1.0.0: 3929is-binary-path@^1.0.0:
3939 version "1.0.1" 3930 version "1.0.1"
3940 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 3931 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
3932 integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
3941 dependencies: 3933 dependencies:
3942 binary-extensions "^1.0.0" 3934 binary-extensions "^1.0.0"
3943 3935
3944is-bluebird@^1.0.2: 3936is-bluebird@^1.0.2:
3945 version "1.0.2" 3937 version "1.0.2"
3946 resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" 3938 resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2"
3939 integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=
3947 3940
3948is-buffer@^1.1.5, is-buffer@~1.1.1: 3941is-buffer@^1.1.5, is-buffer@~1.1.1:
3949 version "1.1.6" 3942 version "1.1.6"
3950 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 3943 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
3944 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
3951 3945
3952is-buffer@~2.0.3: 3946is-buffer@~2.0.3:
3953 version "2.0.3" 3947 version "2.0.3"
3954 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 3948 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
3949 integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
3955 3950
3956is-builtin-module@^1.0.0: 3951is-builtin-module@^1.0.0:
3957 version "1.0.0" 3952 version "1.0.0"
3958 resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 3953 resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
3954 integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74=
3959 dependencies: 3955 dependencies:
3960 builtin-modules "^1.0.0" 3956 builtin-modules "^1.0.0"
3961 3957
3962is-ci@^1.0.10, is-ci@^1.2.1: 3958is-ci@^1.0.10, is-ci@^1.2.1:
3963 version "1.2.1" 3959 version "1.2.1"
3964 resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 3960 resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
3961 integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
3965 dependencies: 3962 dependencies:
3966 ci-info "^1.5.0" 3963 ci-info "^1.5.0"
3967 3964
3968is-cidr@^2.0.5, is-cidr@^2.0.6: 3965is-cidr@^2.0.6:
3969 version "2.0.7" 3966 version "2.0.7"
3970 resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-2.0.7.tgz#0fd4b863c26b2eb2d157ed21060c4f3f8dd356ce" 3967 resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-2.0.7.tgz#0fd4b863c26b2eb2d157ed21060c4f3f8dd356ce"
3968 integrity sha512-YfOm5liUO1RoYfFh+lhiGNYtbLzem7IXzFqvfjXh+zLCEuAiznTBlQ2QcMWxsgYeOFmjzljOxJfmZID4/cRBAQ==
3969 dependencies:
3970 cidr-regex "^2.0.10"
3971
3972is-cidr@^3.0.0:
3973 version "3.0.0"
3974 resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.0.0.tgz#1acf35c9e881063cd5f696d48959b30fed3eed56"
3975 integrity sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q==
3971 dependencies: 3976 dependencies:
3972 cidr-regex "^2.0.10" 3977 cidr-regex "^2.0.10"
3973 3978
3974is-data-descriptor@^0.1.4: 3979is-data-descriptor@^0.1.4:
3975 version "0.1.4" 3980 version "0.1.4"
3976 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 3981 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
3982 integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
3977 dependencies: 3983 dependencies:
3978 kind-of "^3.0.2" 3984 kind-of "^3.0.2"
3979 3985
3980is-data-descriptor@^1.0.0: 3986is-data-descriptor@^1.0.0:
3981 version "1.0.0" 3987 version "1.0.0"
3982 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 3988 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
3989 integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
3983 dependencies: 3990 dependencies:
3984 kind-of "^6.0.0" 3991 kind-of "^6.0.0"
3985 3992
3986is-descriptor@^0.1.0: 3993is-descriptor@^0.1.0:
3987 version "0.1.6" 3994 version "0.1.6"
3988 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 3995 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
3996 integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
3989 dependencies: 3997 dependencies:
3990 is-accessor-descriptor "^0.1.6" 3998 is-accessor-descriptor "^0.1.6"
3991 is-data-descriptor "^0.1.4" 3999 is-data-descriptor "^0.1.4"
@@ -3994,6 +4002,7 @@ is-descriptor@^0.1.0:
3994is-descriptor@^1.0.0, is-descriptor@^1.0.2: 4002is-descriptor@^1.0.0, is-descriptor@^1.0.2:
3995 version "1.0.2" 4003 version "1.0.2"
3996 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 4004 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
4005 integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
3997 dependencies: 4006 dependencies:
3998 is-accessor-descriptor "^1.0.0" 4007 is-accessor-descriptor "^1.0.0"
3999 is-data-descriptor "^1.0.0" 4008 is-data-descriptor "^1.0.0"
@@ -4002,60 +4011,65 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
4002is-directory@^0.3.1: 4011is-directory@^0.3.1:
4003 version "0.3.1" 4012 version "0.3.1"
4004 resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 4013 resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
4014 integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
4005 4015
4006is-extendable@^0.1.0, is-extendable@^0.1.1: 4016is-extendable@^0.1.0, is-extendable@^0.1.1:
4007 version "0.1.1" 4017 version "0.1.1"
4008 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 4018 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
4019 integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
4009 4020
4010is-extendable@^1.0.1: 4021is-extendable@^1.0.1:
4011 version "1.0.1" 4022 version "1.0.1"
4012 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 4023 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
4024 integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
4013 dependencies: 4025 dependencies:
4014 is-plain-object "^2.0.4" 4026 is-plain-object "^2.0.4"
4015 4027
4016is-extglob@^2.1.0, is-extglob@^2.1.1: 4028is-extglob@^2.1.0, is-extglob@^2.1.1:
4017 version "2.1.1" 4029 version "2.1.1"
4018 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 4030 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
4031 integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
4019 4032
4020is-file@^1.0.0: 4033is-file@^1.0.0:
4021 version "1.0.0" 4034 version "1.0.0"
4022 resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596" 4035 resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596"
4023 4036 integrity sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=
4024is-finite@^1.0.0:
4025 version "1.0.2"
4026 resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
4027 dependencies:
4028 number-is-nan "^1.0.0"
4029 4037
4030is-fullwidth-code-point@^1.0.0: 4038is-fullwidth-code-point@^1.0.0:
4031 version "1.0.0" 4039 version "1.0.0"
4032 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 4040 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
4041 integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
4033 dependencies: 4042 dependencies:
4034 number-is-nan "^1.0.0" 4043 number-is-nan "^1.0.0"
4035 4044
4036is-fullwidth-code-point@^2.0.0: 4045is-fullwidth-code-point@^2.0.0:
4037 version "2.0.0" 4046 version "2.0.0"
4038 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 4047 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
4048 integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
4039 4049
4040is-generator@^1.0.2: 4050is-generator@^1.0.2:
4041 version "1.0.3" 4051 version "1.0.3"
4042 resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" 4052 resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3"
4053 integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=
4043 4054
4044is-glob@^3.1.0: 4055is-glob@^3.1.0:
4045 version "3.1.0" 4056 version "3.1.0"
4046 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 4057 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
4058 integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
4047 dependencies: 4059 dependencies:
4048 is-extglob "^2.1.0" 4060 is-extglob "^2.1.0"
4049 4061
4050is-glob@^4.0.0: 4062is-glob@^4.0.0:
4051 version "4.0.0" 4063 version "4.0.0"
4052 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 4064 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
4065 integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=
4053 dependencies: 4066 dependencies:
4054 is-extglob "^2.1.1" 4067 is-extglob "^2.1.1"
4055 4068
4056is-installed-globally@^0.1.0: 4069is-installed-globally@^0.1.0:
4057 version "0.1.0" 4070 version "0.1.0"
4058 resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 4071 resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
4072 integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
4059 dependencies: 4073 dependencies:
4060 global-dirs "^0.1.0" 4074 global-dirs "^0.1.0"
4061 is-path-inside "^1.0.0" 4075 is-path-inside "^1.0.0"
@@ -4063,10 +4077,12 @@ is-installed-globally@^0.1.0:
4063is-my-ip-valid@^1.0.0: 4077is-my-ip-valid@^1.0.0:
4064 version "1.0.0" 4078 version "1.0.0"
4065 resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" 4079 resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
4080 integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==
4066 4081
4067is-my-json-valid@^2.10.0: 4082is-my-json-valid@^2.10.0:
4068 version "2.19.0" 4083 version "2.19.0"
4069 resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175" 4084 resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175"
4085 integrity sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==
4070 dependencies: 4086 dependencies:
4071 generate-function "^2.0.0" 4087 generate-function "^2.0.0"
4072 generate-object-property "^1.1.0" 4088 generate-object-property "^1.1.0"
@@ -4077,254 +4093,246 @@ is-my-json-valid@^2.10.0:
4077is-nan@^1.2.1: 4093is-nan@^1.2.1:
4078 version "1.2.1" 4094 version "1.2.1"
4079 resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2" 4095 resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2"
4096 integrity sha1-n69ltvttskt/XAYoR16nH5iEAeI=
4080 dependencies: 4097 dependencies:
4081 define-properties "^1.1.1" 4098 define-properties "^1.1.1"
4082 4099
4083is-npm@^1.0.0: 4100is-npm@^1.0.0:
4084 version "1.0.0" 4101 version "1.0.0"
4085 resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 4102 resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
4103 integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
4086 4104
4087is-number@^3.0.0: 4105is-number@^3.0.0:
4088 version "3.0.0" 4106 version "3.0.0"
4089 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 4107 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
4108 integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
4090 dependencies: 4109 dependencies:
4091 kind-of "^3.0.2" 4110 kind-of "^3.0.2"
4092 4111
4093is-obj@^1.0.0, is-obj@^1.0.1: 4112is-obj@^1.0.0, is-obj@^1.0.1:
4094 version "1.0.1" 4113 version "1.0.1"
4095 resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 4114 resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
4115 integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
4096 4116
4097is-observable@^1.1.0: 4117is-observable@^1.1.0:
4098 version "1.1.0" 4118 version "1.1.0"
4099 resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" 4119 resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
4120 integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==
4100 dependencies: 4121 dependencies:
4101 symbol-observable "^1.1.0" 4122 symbol-observable "^1.1.0"
4102 4123
4103is-path-cwd@^1.0.0: 4124is-path-cwd@^1.0.0:
4104 version "1.0.0" 4125 version "1.0.0"
4105 resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 4126 resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
4127 integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=
4106 4128
4107is-path-in-cwd@^1.0.0: 4129is-path-in-cwd@^1.0.0:
4108 version "1.0.1" 4130 version "1.0.1"
4109 resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 4131 resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
4132 integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==
4110 dependencies: 4133 dependencies:
4111 is-path-inside "^1.0.0" 4134 is-path-inside "^1.0.0"
4112 4135
4113is-path-inside@^1.0.0: 4136is-path-inside@^1.0.0:
4114 version "1.0.1" 4137 version "1.0.1"
4115 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 4138 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
4139 integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
4116 dependencies: 4140 dependencies:
4117 path-is-inside "^1.0.1" 4141 path-is-inside "^1.0.1"
4118 4142
4119is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 4143is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
4120 version "2.0.4" 4144 version "2.0.4"
4121 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 4145 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
4146 integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
4122 dependencies: 4147 dependencies:
4123 isobject "^3.0.1" 4148 isobject "^3.0.1"
4124 4149
4125is-promise@^2.1, is-promise@^2.1.0: 4150is-promise@^2.1, is-promise@^2.1.0:
4126 version "2.1.0" 4151 version "2.1.0"
4127 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 4152 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
4153 integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
4128 4154
4129is-property@^1.0.0, is-property@^1.0.2: 4155is-property@^1.0.0, is-property@^1.0.2:
4130 version "1.0.2" 4156 version "1.0.2"
4131 resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 4157 resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
4158 integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
4132 4159
4133is-redirect@^1.0.0: 4160is-redirect@^1.0.0:
4134 version "1.0.0" 4161 version "1.0.0"
4135 resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 4162 resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
4163 integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
4136 4164
4137is-regexp@^1.0.0: 4165is-regexp@^1.0.0:
4138 version "1.0.0" 4166 version "1.0.0"
4139 resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 4167 resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
4168 integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
4140 4169
4141is-resolvable@^1.0.0: 4170is-resolvable@^1.0.0:
4142 version "1.1.0" 4171 version "1.1.0"
4143 resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 4172 resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
4173 integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
4144 4174
4145is-retry-allowed@^1.0.0: 4175is-retry-allowed@^1.0.0:
4146 version "1.1.0" 4176 version "1.1.0"
4147 resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 4177 resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
4178 integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=
4148 4179
4149is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: 4180is-stream@^1.0.0, is-stream@^1.1.0:
4150 version "1.1.0" 4181 version "1.1.0"
4151 resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 4182 resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
4183 integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
4152 4184
4153is-typedarray@^1.0.0, is-typedarray@~1.0.0: 4185is-typedarray@^1.0.0, is-typedarray@~1.0.0:
4154 version "1.0.0" 4186 version "1.0.0"
4155 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 4187 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
4156 4188 integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
4157is-utf8@^0.2.0:
4158 version "0.2.1"
4159 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
4160 4189
4161is-windows@^1.0.2: 4190is-windows@^1.0.2:
4162 version "1.0.2" 4191 version "1.0.2"
4163 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 4192 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
4193 integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
4164 4194
4165isarray@0.0.1, isarray@~0.0.1: 4195isarray@0.0.1, isarray@~0.0.1:
4166 version "0.0.1" 4196 version "0.0.1"
4167 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 4197 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
4198 integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
4168 4199
4169isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 4200isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
4170 version "1.0.0" 4201 version "1.0.0"
4171 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 4202 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
4203 integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
4204
4205isarray@2.0.1:
4206 version "2.0.1"
4207 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
4208 integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
4172 4209
4173isexe@^2.0.0: 4210isexe@^2.0.0:
4174 version "2.0.0" 4211 version "2.0.0"
4175 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 4212 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
4213 integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
4176 4214
4177iso-639-3@^1.0.1: 4215iso-639-3@^1.0.1:
4178 version "1.1.0" 4216 version "1.1.0"
4179 resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" 4217 resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843"
4218 integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw==
4180 4219
4181isobject@^2.0.0: 4220isobject@^2.0.0:
4182 version "2.1.0" 4221 version "2.1.0"
4183 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 4222 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
4223 integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
4184 dependencies: 4224 dependencies:
4185 isarray "1.0.0" 4225 isarray "1.0.0"
4186 4226
4187isobject@^3.0.0, isobject@^3.0.1: 4227isobject@^3.0.0, isobject@^3.0.1:
4188 version "3.0.1" 4228 version "3.0.1"
4189 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 4229 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
4230 integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
4190 4231
4191isstream@0.1.x, isstream@~0.1.2: 4232isstream@0.1.x, isstream@~0.1.2:
4192 version "0.1.2" 4233 version "0.1.2"
4193 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 4234 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
4235 integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
4194 4236
4195jest-get-type@^22.1.0: 4237jest-get-type@^22.1.0:
4196 version "22.4.3" 4238 version "22.4.3"
4197 resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" 4239 resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
4240 integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==
4198 4241
4199jest-validate@^23.5.0: 4242jest-validate@^23.5.0:
4200 version "23.6.0" 4243 version "23.6.0"
4201 resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" 4244 resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474"
4245 integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==
4202 dependencies: 4246 dependencies:
4203 chalk "^2.0.1" 4247 chalk "^2.0.1"
4204 jest-get-type "^22.1.0" 4248 jest-get-type "^22.1.0"
4205 leven "^2.1.0" 4249 leven "^2.1.0"
4206 pretty-format "^23.6.0" 4250 pretty-format "^23.6.0"
4207 4251
4208jquery@>=3.0.0:
4209 version "3.3.1"
4210 resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
4211
4212js-base64@^2.1.8:
4213 version "2.4.9"
4214 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
4215
4216js-beautify@~1.5.4:
4217 version "1.5.10"
4218 resolved "http://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz#4d95371702699344a516ca26bf59f0a27bb75719"
4219 dependencies:
4220 config-chain "~1.1.5"
4221 mkdirp "~0.5.0"
4222 nopt "~3.0.1"
4223
4224js-tokens@^3.0.2: 4252js-tokens@^3.0.2:
4225 version "3.0.2" 4253 version "3.0.2"
4226 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 4254 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
4255 integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
4227 4256
4228js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.7.0, js-yaml@^3.8.2, js-yaml@^3.8.3, js-yaml@^3.9.0: 4257js-yaml@^3.12.0, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.7.0, js-yaml@^3.9.0:
4229 version "3.12.0" 4258 version "3.12.0"
4230 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 4259 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
4260 integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
4231 dependencies: 4261 dependencies:
4232 argparse "^1.0.7" 4262 argparse "^1.0.7"
4233 esprima "^4.0.0" 4263 esprima "^4.0.0"
4234 4264
4235js-yaml@~3.5.2:
4236 version "3.5.5"
4237 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe"
4238 dependencies:
4239 argparse "^1.0.2"
4240 esprima "^2.6.0"
4241
4242jsbn@~0.1.0: 4265jsbn@~0.1.0:
4243 version "0.1.1" 4266 version "0.1.1"
4244 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 4267 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
4245 4268 integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
4246jshint@~2.9.4:
4247 version "2.9.6"
4248 resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.6.tgz#19b34e578095a34928fe006135a6cb70137b9c08"
4249 dependencies:
4250 cli "~1.0.0"
4251 console-browserify "1.1.x"
4252 exit "0.1.x"
4253 htmlparser2 "3.8.x"
4254 lodash "~4.17.10"
4255 minimatch "~3.0.2"
4256 shelljs "0.3.x"
4257 strip-json-comments "1.0.x"
4258 unicode-5.2.0 "^0.7.5"
4259 optionalDependencies:
4260 phantom "~4.0.1"
4261 phantomjs-prebuilt "~2.1.7"
4262 4269
4263json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: 4270json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
4264 version "1.0.2" 4271 version "1.0.2"
4265 resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 4272 resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
4273 integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
4266 4274
4267json-refs@^2.1.6: 4275json-schema-ref-parser@^6.0.2:
4268 version "2.1.7" 4276 version "6.0.2"
4269 resolved "https://registry.yarnpkg.com/json-refs/-/json-refs-2.1.7.tgz#b9eb01fe29f5ea3e92878f15aea10ad38b5acf89" 4277 resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.0.2.tgz#c17bfed06fa7ff8f1ade36067d087b46f5465ef8"
4278 integrity sha512-EENU7mrmuBAdjSsAEJD8mMvodZyDhLBEfuSUBSIMuXqjs+cfMbFaxS8f6+ky675jetRzGzCdhzAU3y2VEtquvQ==
4270 dependencies: 4279 dependencies:
4271 commander "^2.9.0" 4280 call-me-maybe "^1.0.1"
4272 graphlib "^2.1.1" 4281 js-yaml "^3.12.0"
4273 js-yaml "^3.8.3" 4282 ono "^4.0.10"
4274 native-promise-only "^0.8.1"
4275 path-loader "^1.0.2"
4276 slash "^1.0.0"
4277 uri-js "^3.0.2"
4278 4283
4279json-schema-traverse@^0.3.0: 4284json-schema-traverse@^0.4.1:
4280 version "0.3.1" 4285 version "0.4.1"
4281 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 4286 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
4287 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
4282 4288
4283json-schema@0.2.3: 4289json-schema@0.2.3:
4284 version "0.2.3" 4290 version "0.2.3"
4285 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 4291 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
4292 integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
4286 4293
4287json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 4294json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
4288 version "1.0.1" 4295 version "1.0.1"
4289 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 4296 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
4297 integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
4290 dependencies: 4298 dependencies:
4291 jsonify "~0.0.0" 4299 jsonify "~0.0.0"
4292 4300
4293json-stringify-safe@~5.0.1: 4301json-stringify-safe@~5.0.1:
4294 version "5.0.1" 4302 version "5.0.1"
4295 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 4303 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
4304 integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
4296 4305
4297json3@3.3.2: 4306json3@3.3.2:
4298 version "3.3.2" 4307 version "3.3.2"
4299 resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 4308 resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
4309 integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=
4300 4310
4301json5@^1.0.1: 4311json5@^1.0.1:
4302 version "1.0.1" 4312 version "1.0.1"
4303 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 4313 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
4314 integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
4304 dependencies: 4315 dependencies:
4305 minimist "^1.2.0" 4316 minimist "^1.2.0"
4306 4317
4307jsonfile@^2.1.0:
4308 version "2.4.0"
4309 resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
4310 optionalDependencies:
4311 graceful-fs "^4.1.6"
4312
4313jsonfile@^3.0.0: 4318jsonfile@^3.0.0:
4314 version "3.0.1" 4319 version "3.0.1"
4315 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" 4320 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
4321 integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=
4316 optionalDependencies: 4322 optionalDependencies:
4317 graceful-fs "^4.1.6" 4323 graceful-fs "^4.1.6"
4318 4324
4319jsonfile@^4.0.0: 4325jsonfile@^4.0.0:
4320 version "4.0.0" 4326 version "4.0.0"
4321 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 4327 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
4328 integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
4322 optionalDependencies: 4329 optionalDependencies:
4323 graceful-fs "^4.1.6" 4330 graceful-fs "^4.1.6"
4324 4331
4325jsonify@~0.0.0: 4332jsonify@~0.0.0:
4326 version "0.0.0" 4333 version "0.0.0"
4327 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 4334 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
4335 integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
4328 4336
4329"jsonld-signatures@https://github.com/Chocobozzz/jsonld-signatures#rsa2017": 4337"jsonld-signatures@https://github.com/Chocobozzz/jsonld-signatures#rsa2017":
4330 version "1.2.2-2" 4338 version "1.2.2-2"
@@ -4337,7 +4345,8 @@ jsonify@~0.0.0:
4337 4345
4338jsonld@^0.5.12: 4346jsonld@^0.5.12:
4339 version "0.5.21" 4347 version "0.5.21"
4340 resolved "http://registry.npmjs.org/jsonld/-/jsonld-0.5.21.tgz#4d5b78d717eb92bcd1ac9d88e34efad95370c0bf" 4348 resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-0.5.21.tgz#4d5b78d717eb92bcd1ac9d88e34efad95370c0bf"
4349 integrity sha512-1dQhaw1Eb3p7Cz5ECE2DNPwLvTmK+f6D45hACBdonJaFKP1bN9zlKLZWbPZQeZtduAc/LNv10J4ML0IiTBVahw==
4341 dependencies: 4350 dependencies:
4342 rdf-canonize "^0.2.1" 4351 rdf-canonize "^0.2.1"
4343 request "^2.83.0" 4352 request "^2.83.0"
@@ -4347,6 +4356,7 @@ jsonld@^0.5.12:
4347jsonld@^1.0.1: 4356jsonld@^1.0.1:
4348 version "1.1.0" 4357 version "1.1.0"
4349 resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-1.1.0.tgz#afcb168c44557a7bddead4d4513c3cbcae3bc5b9" 4358 resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-1.1.0.tgz#afcb168c44557a7bddead4d4513c3cbcae3bc5b9"
4359 integrity sha512-tx87xNtu2hGabr7mhSyXTI8q+Fz3pl+50B/JislFPwAz8ud0KTTQpNjU74tJIegFAHve9UFYzzj4YVTIrac0Hw==
4350 dependencies: 4360 dependencies:
4351 rdf-canonize "^0.2.1" 4361 rdf-canonize "^0.2.1"
4352 request "^2.83.0" 4362 request "^2.83.0"
@@ -4356,18 +4366,32 @@ jsonld@^1.0.1:
4356jsonparse@^1.2.0: 4366jsonparse@^1.2.0:
4357 version "1.3.1" 4367 version "1.3.1"
4358 resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 4368 resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
4369 integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
4359 4370
4360jsonpointer.js@0.4.0: 4371jsonpointer.js@0.4.0:
4361 version "0.4.0" 4372 version "0.4.0"
4362 resolved "https://registry.yarnpkg.com/jsonpointer.js/-/jsonpointer.js-0.4.0.tgz#002cb123f767aafdeb0196132ce5c4f9941ccaba" 4373 resolved "https://registry.yarnpkg.com/jsonpointer.js/-/jsonpointer.js-0.4.0.tgz#002cb123f767aafdeb0196132ce5c4f9941ccaba"
4374 integrity sha1-ACyxI/dnqv3rAZYTLOXE+ZQcyro=
4363 4375
4364jsonpointer@^4.0.0: 4376jsonpointer@^4.0.0:
4365 version "4.0.1" 4377 version "4.0.1"
4366 resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 4378 resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
4379 integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk=
4380
4381jsonschema-draft4@^1.0.0:
4382 version "1.0.0"
4383 resolved "https://registry.yarnpkg.com/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz#f0af2005054f0f0ade7ea2118614b69dc512d865"
4384 integrity sha1-8K8gBQVPDwrefqIRhhS2ncUS2GU=
4385
4386jsonschema@1.2.4:
4387 version "1.2.4"
4388 resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz#a46bac5d3506a254465bc548876e267c6d0d6464"
4389 integrity sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==
4367 4390
4368jsprim@^1.2.2: 4391jsprim@^1.2.2:
4369 version "1.4.1" 4392 version "1.4.1"
4370 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 4393 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
4394 integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
4371 dependencies: 4395 dependencies:
4372 assert-plus "1.0.0" 4396 assert-plus "1.0.0"
4373 extsprintf "1.3.0" 4397 extsprintf "1.3.0"
@@ -4377,10 +4401,12 @@ jsprim@^1.2.2:
4377junk@^2.1.0: 4401junk@^2.1.0:
4378 version "2.1.0" 4402 version "2.1.0"
4379 resolved "https://registry.yarnpkg.com/junk/-/junk-2.1.0.tgz#f431b4b7f072dc500a5f10ce7f4ec71930e70134" 4403 resolved "https://registry.yarnpkg.com/junk/-/junk-2.1.0.tgz#f431b4b7f072dc500a5f10ce7f4ec71930e70134"
4404 integrity sha1-9DG0t/By3FAKXxDOf07HGTDnATQ=
4380 4405
4381jwa@^1.1.5: 4406jwa@^1.1.5:
4382 version "1.1.6" 4407 version "1.1.6"
4383 resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" 4408 resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6"
4409 integrity sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==
4384 dependencies: 4410 dependencies:
4385 buffer-equal-constant-time "1.0.1" 4411 buffer-equal-constant-time "1.0.1"
4386 ecdsa-sig-formatter "1.0.10" 4412 ecdsa-sig-formatter "1.0.10"
@@ -4389,6 +4415,7 @@ jwa@^1.1.5:
4389jws@^3.1.4: 4415jws@^3.1.4:
4390 version "3.1.5" 4416 version "3.1.5"
4391 resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" 4417 resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f"
4418 integrity sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==
4392 dependencies: 4419 dependencies:
4393 jwa "^1.1.5" 4420 jwa "^1.1.5"
4394 safe-buffer "^5.0.1" 4421 safe-buffer "^5.0.1"
@@ -4396,6 +4423,7 @@ jws@^3.1.4:
4396k-bucket@^4.0.0: 4423k-bucket@^4.0.0:
4397 version "4.0.1" 4424 version "4.0.1"
4398 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542" 4425 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-4.0.1.tgz#3fc2e5693f0b7bff90d7b6b476edd6087955d542"
4426 integrity sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==
4399 dependencies: 4427 dependencies:
4400 inherits "^2.0.1" 4428 inherits "^2.0.1"
4401 randombytes "^2.0.3" 4429 randombytes "^2.0.3"
@@ -4403,12 +4431,14 @@ k-bucket@^4.0.0:
4403k-bucket@^5.0.0: 4431k-bucket@^5.0.0:
4404 version "5.0.0" 4432 version "5.0.0"
4405 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.0.0.tgz#ef7a401fcd4c37cd31dceaa6ae4440ca91055e01" 4433 resolved "https://registry.yarnpkg.com/k-bucket/-/k-bucket-5.0.0.tgz#ef7a401fcd4c37cd31dceaa6ae4440ca91055e01"
4434 integrity sha512-r/q+wV/Kde62/tk+rqyttEJn6h0jR7x+incdMVSYTqK73zVxVrzJa70kJL49cIKen8XjIgUZKSvk8ktnrQbK4w==
4406 dependencies: 4435 dependencies:
4407 randombytes "^2.0.3" 4436 randombytes "^2.0.3"
4408 4437
4409k-rpc-socket@^1.7.2: 4438k-rpc-socket@^1.7.2:
4410 version "1.8.0" 4439 version "1.8.0"
4411 resolved "https://registry.yarnpkg.com/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz#9a4dd6a4f3795ed847ffa156579cc389990bd1f2" 4440 resolved "https://registry.yarnpkg.com/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz#9a4dd6a4f3795ed847ffa156579cc389990bd1f2"
4441 integrity sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==
4412 dependencies: 4442 dependencies:
4413 bencode "^2.0.0" 4443 bencode "^2.0.0"
4414 buffer-equals "^1.0.4" 4444 buffer-equals "^1.0.4"
@@ -4417,6 +4447,7 @@ k-rpc-socket@^1.7.2:
4417k-rpc@^5.0.0: 4447k-rpc@^5.0.0:
4418 version "5.0.0" 4448 version "5.0.0"
4419 resolved "https://registry.yarnpkg.com/k-rpc/-/k-rpc-5.0.0.tgz#a72651860c96db440579e4c9f38dce8a42b481a8" 4449 resolved "https://registry.yarnpkg.com/k-rpc/-/k-rpc-5.0.0.tgz#a72651860c96db440579e4c9f38dce8a42b481a8"
4450 integrity sha512-vCH2rQdfMOS+MlUuTSuar1pS2EMrltURf9LmAR9xR6Jik0XPlMX3vEixgqMn17wKmFVCublJqSJ4hJIP7oKZ3Q==
4420 dependencies: 4451 dependencies:
4421 buffer-equals "^1.0.3" 4452 buffer-equals "^1.0.3"
4422 k-bucket "^4.0.0" 4453 k-bucket "^4.0.0"
@@ -4424,79 +4455,82 @@ k-rpc@^5.0.0:
4424 randombytes "^2.0.5" 4455 randombytes "^2.0.5"
4425 safe-buffer "^5.1.1" 4456 safe-buffer "^5.1.1"
4426 4457
4427kew@^0.7.0:
4428 version "0.7.0"
4429 resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
4430
4431kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 4458kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
4432 version "3.2.2" 4459 version "3.2.2"
4433 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 4460 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
4461 integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
4434 dependencies: 4462 dependencies:
4435 is-buffer "^1.1.5" 4463 is-buffer "^1.1.5"
4436 4464
4437kind-of@^4.0.0: 4465kind-of@^4.0.0:
4438 version "4.0.0" 4466 version "4.0.0"
4439 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 4467 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
4468 integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
4440 dependencies: 4469 dependencies:
4441 is-buffer "^1.1.5" 4470 is-buffer "^1.1.5"
4442 4471
4443kind-of@^5.0.0: 4472kind-of@^5.0.0:
4444 version "5.1.0" 4473 version "5.1.0"
4445 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 4474 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
4475 integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
4446 4476
4447kind-of@^6.0.0, kind-of@^6.0.2: 4477kind-of@^6.0.0, kind-of@^6.0.2:
4448 version "6.0.2" 4478 version "6.0.2"
4449 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 4479 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
4450 4480 integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
4451klaw@^1.0.0:
4452 version "1.3.1"
4453 resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
4454 optionalDependencies:
4455 graceful-fs "^4.1.9"
4456 4481
4457known-css-properties@^0.3.0: 4482known-css-properties@^0.3.0:
4458 version "0.3.0" 4483 version "0.3.0"
4459 resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" 4484 resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4"
4485 integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==
4460 4486
4461kuler@1.0.x: 4487kuler@1.0.x:
4462 version "1.0.0" 4488 version "1.0.1"
4463 resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.0.tgz#904ad31c373b781695854d32be33818bf1d60250" 4489 resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6"
4490 integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==
4464 dependencies: 4491 dependencies:
4465 colornames "^1.1.1" 4492 colornames "^1.1.1"
4466 4493
4467last-one-wins@^1.0.4: 4494last-one-wins@^1.0.4:
4468 version "1.0.4" 4495 version "1.0.4"
4469 resolved "https://registry.yarnpkg.com/last-one-wins/-/last-one-wins-1.0.4.tgz#c1bfd0cbcb46790ec9156b8d1aee8fcb86cda22a" 4496 resolved "https://registry.yarnpkg.com/last-one-wins/-/last-one-wins-1.0.4.tgz#c1bfd0cbcb46790ec9156b8d1aee8fcb86cda22a"
4497 integrity sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=
4470 4498
4471latest-version@^3.0.0: 4499latest-version@^3.0.0:
4472 version "3.1.0" 4500 version "3.1.0"
4473 resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 4501 resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
4502 integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
4474 dependencies: 4503 dependencies:
4475 package-json "^4.0.0" 4504 package-json "^4.0.0"
4476 4505
4477lazy-property@~1.0.0: 4506lazy-property@~1.0.0:
4478 version "1.0.0" 4507 version "1.0.0"
4479 resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" 4508 resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
4509 integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
4480 4510
4481lcid@^1.0.0: 4511lcid@^1.0.0:
4482 version "1.0.0" 4512 version "1.0.0"
4483 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 4513 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
4514 integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
4484 dependencies: 4515 dependencies:
4485 invert-kv "^1.0.0" 4516 invert-kv "^1.0.0"
4486 4517
4487lcid@^2.0.0: 4518lcid@^2.0.0:
4488 version "2.0.0" 4519 version "2.0.0"
4489 resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 4520 resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
4521 integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
4490 dependencies: 4522 dependencies:
4491 invert-kv "^2.0.0" 4523 invert-kv "^2.0.0"
4492 4524
4493leven@^2.1.0: 4525leven@^2.1.0:
4494 version "2.1.0" 4526 version "2.1.0"
4495 resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 4527 resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
4528 integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
4496 4529
4497levn@^0.3.0, levn@~0.3.0: 4530levn@^0.3.0, levn@~0.3.0:
4498 version "0.3.0" 4531 version "0.3.0"
4499 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 4532 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
4533 integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
4500 dependencies: 4534 dependencies:
4501 prelude-ls "~1.1.2" 4535 prelude-ls "~1.1.2"
4502 type-check "~0.3.2" 4536 type-check "~0.3.2"
@@ -4504,6 +4538,7 @@ levn@^0.3.0, levn@~0.3.0:
4504libcipm@^2.0.2: 4538libcipm@^2.0.2:
4505 version "2.0.2" 4539 version "2.0.2"
4506 resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz#4f38c2b37acf2ec156936cef1cbf74636568fc7b" 4540 resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz#4f38c2b37acf2ec156936cef1cbf74636568fc7b"
4541 integrity sha512-9uZ6/LAflVEijksTRq/RX0e+pGA4mr8tND9Cmk2JMg7j2fFUBrs8PpFX2DOAJR/XoxPzz+5h8bkWmtIYLunKAg==
4507 dependencies: 4542 dependencies:
4508 bin-links "^1.1.2" 4543 bin-links "^1.1.2"
4509 bluebird "^3.5.1" 4544 bluebird "^3.5.1"
@@ -4523,6 +4558,7 @@ libcipm@^2.0.2:
4523libnpmhook@^4.0.1: 4558libnpmhook@^4.0.1:
4524 version "4.0.1" 4559 version "4.0.1"
4525 resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-4.0.1.tgz#63641654de772cbeb96a88527a7fd5456ec3c2d7" 4560 resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-4.0.1.tgz#63641654de772cbeb96a88527a7fd5456ec3c2d7"
4561 integrity sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==
4526 dependencies: 4562 dependencies:
4527 figgy-pudding "^3.1.0" 4563 figgy-pudding "^3.1.0"
4528 npm-registry-fetch "^3.0.0" 4564 npm-registry-fetch "^3.0.0"
@@ -4530,6 +4566,7 @@ libnpmhook@^4.0.1:
4530libnpx@^10.2.0: 4566libnpx@^10.2.0:
4531 version "10.2.0" 4567 version "10.2.0"
4532 resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" 4568 resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102"
4569 integrity sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ==
4533 dependencies: 4570 dependencies:
4534 dotenv "^5.0.1" 4571 dotenv "^5.0.1"
4535 npm-package-arg "^6.0.0" 4572 npm-package-arg "^6.0.0"
@@ -4540,29 +4577,34 @@ libnpx@^10.2.0:
4540 y18n "^4.0.0" 4577 y18n "^4.0.0"
4541 yargs "^11.0.0" 4578 yargs "^11.0.0"
4542 4579
4543libxmljs@0.19.3: 4580libxmljs@0.19.5:
4544 version "0.19.3" 4581 version "0.19.5"
4545 resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.19.3.tgz#3f7232a4123952b338f5334e55ea1396fa0d9cd2" 4582 resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.19.5.tgz#b2f34cc12fd6a3e43670c604c42a902f339ea54d"
4583 integrity sha512-mKlafbSIsgZCXcha6loyMN/Q1kcbNJ5N3VC/rS0vrJXdI99TzEI2i2rPp10HN/B70vSPh6bq6nHhoCT19eGtTw==
4546 dependencies: 4584 dependencies:
4547 bindings "~1.3.0" 4585 bindings "~1.3.0"
4548 nan "~2.10.0" 4586 nan "~2.10.0"
4549 node-pre-gyp "~0.11.0" 4587 node-pre-gyp "~0.11.0"
4550 4588
4551lint-staged@^7.1.0: 4589lint-staged@^8.0.4:
4552 version "7.3.0" 4590 version "8.1.0"
4553 resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.3.0.tgz#90ff33e5ca61ed3dbac35b6f6502dbefdc0db58d" 4591 resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.0.tgz#dbc3ae2565366d8f20efb9f9799d076da64863f2"
4592 integrity sha512-yfSkyJy7EuVsaoxtUSEhrD81spdJOe/gMTGea3XaV7HyoRhTb9Gdlp6/JppRZERvKSEYXP9bjcmq6CA5oL2lYQ==
4554 dependencies: 4593 dependencies:
4594 "@iamstarkov/listr-update-renderer" "0.4.1"
4555 chalk "^2.3.1" 4595 chalk "^2.3.1"
4556 commander "^2.14.1" 4596 commander "^2.14.1"
4557 cosmiconfig "^5.0.2" 4597 cosmiconfig "5.0.6"
4558 debug "^3.1.0" 4598 debug "^3.1.0"
4559 dedent "^0.7.0" 4599 dedent "^0.7.0"
4560 execa "^0.9.0" 4600 del "^3.0.0"
4601 execa "^1.0.0"
4561 find-parent-dir "^0.3.0" 4602 find-parent-dir "^0.3.0"
4603 g-status "^2.0.2"
4562 is-glob "^4.0.0" 4604 is-glob "^4.0.0"
4563 is-windows "^1.0.2" 4605 is-windows "^1.0.2"
4564 jest-validate "^23.5.0" 4606 jest-validate "^23.5.0"
4565 listr "^0.14.1" 4607 listr "^0.14.2"
4566 lodash "^4.17.5" 4608 lodash "^4.17.5"
4567 log-symbols "^2.2.0" 4609 log-symbols "^2.2.0"
4568 micromatch "^3.1.8" 4610 micromatch "^3.1.8"
@@ -4571,17 +4613,19 @@ lint-staged@^7.1.0:
4571 path-is-inside "^1.0.2" 4613 path-is-inside "^1.0.2"
4572 pify "^3.0.0" 4614 pify "^3.0.0"
4573 please-upgrade-node "^3.0.2" 4615 please-upgrade-node "^3.0.2"
4574 staged-git-files "1.1.1" 4616 staged-git-files "1.1.2"
4575 string-argv "^0.0.2" 4617 string-argv "^0.0.2"
4576 stringify-object "^3.2.2" 4618 stringify-object "^3.2.2"
4577 4619
4578listr-silent-renderer@^1.1.1: 4620listr-silent-renderer@^1.1.1:
4579 version "1.1.1" 4621 version "1.1.1"
4580 resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" 4622 resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
4623 integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=
4581 4624
4582listr-update-renderer@^0.4.0: 4625listr-update-renderer@^0.5.0:
4583 version "0.4.0" 4626 version "0.5.0"
4584 resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" 4627 resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2"
4628 integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==
4585 dependencies: 4629 dependencies:
4586 chalk "^1.1.3" 4630 chalk "^1.1.3"
4587 cli-truncate "^0.2.1" 4631 cli-truncate "^0.2.1"
@@ -4589,39 +4633,38 @@ listr-update-renderer@^0.4.0:
4589 figures "^1.7.0" 4633 figures "^1.7.0"
4590 indent-string "^3.0.0" 4634 indent-string "^3.0.0"
4591 log-symbols "^1.0.2" 4635 log-symbols "^1.0.2"
4592 log-update "^1.0.2" 4636 log-update "^2.3.0"
4593 strip-ansi "^3.0.1" 4637 strip-ansi "^3.0.1"
4594 4638
4595listr-verbose-renderer@^0.4.0: 4639listr-verbose-renderer@^0.5.0:
4596 version "0.4.1" 4640 version "0.5.0"
4597 resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" 4641 resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db"
4642 integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==
4598 dependencies: 4643 dependencies:
4599 chalk "^1.1.3" 4644 chalk "^2.4.1"
4600 cli-cursor "^1.0.2" 4645 cli-cursor "^2.1.0"
4601 date-fns "^1.27.2" 4646 date-fns "^1.27.2"
4602 figures "^1.7.0" 4647 figures "^2.0.0"
4603 4648
4604listr@^0.14.1: 4649listr@^0.14.2:
4605 version "0.14.2" 4650 version "0.14.3"
4606 resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.2.tgz#cbe44b021100a15376addfc2d79349ee430bfe14" 4651 resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586"
4652 integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==
4607 dependencies: 4653 dependencies:
4608 "@samverschueren/stream-to-observable" "^0.3.0" 4654 "@samverschueren/stream-to-observable" "^0.3.0"
4609 is-observable "^1.1.0" 4655 is-observable "^1.1.0"
4610 is-promise "^2.1.0" 4656 is-promise "^2.1.0"
4611 is-stream "^1.1.0" 4657 is-stream "^1.1.0"
4612 listr-silent-renderer "^1.1.1" 4658 listr-silent-renderer "^1.1.1"
4613 listr-update-renderer "^0.4.0" 4659 listr-update-renderer "^0.5.0"
4614 listr-verbose-renderer "^0.4.0" 4660 listr-verbose-renderer "^0.5.0"
4615 p-map "^1.1.1" 4661 p-map "^2.0.0"
4616 rxjs "^6.1.0" 4662 rxjs "^6.3.3"
4617
4618livereload-js@^2.3.0:
4619 version "2.3.0"
4620 resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a"
4621 4663
4622load-ip-set@^2.1.0: 4664load-ip-set@^2.1.0:
4623 version "2.1.0" 4665 version "2.1.0"
4624 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b" 4666 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b"
4667 integrity sha512-taz7U6B+F7Zq90dfIKwqsB1CrFKelSEmMGC68OUqem8Cgd1QZygQBYb2Fk9i6muBSfH4xwF/Pjt4KKlAdOyWZw==
4625 dependencies: 4668 dependencies:
4626 ip-set "^1.0.0" 4669 ip-set "^1.0.0"
4627 netmask "^1.0.6" 4670 netmask "^1.0.6"
@@ -4629,19 +4672,10 @@ load-ip-set@^2.1.0:
4629 simple-get "^3.0.0" 4672 simple-get "^3.0.0"
4630 split "^1.0.0" 4673 split "^1.0.0"
4631 4674
4632load-json-file@^1.0.0:
4633 version "1.1.0"
4634 resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
4635 dependencies:
4636 graceful-fs "^4.1.2"
4637 parse-json "^2.2.0"
4638 pify "^2.0.0"
4639 pinkie-promise "^2.0.0"
4640 strip-bom "^2.0.0"
4641
4642locate-path@^2.0.0: 4675locate-path@^2.0.0:
4643 version "2.0.0" 4676 version "2.0.0"
4644 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 4677 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
4678 integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
4645 dependencies: 4679 dependencies:
4646 p-locate "^2.0.0" 4680 p-locate "^2.0.0"
4647 path-exists "^3.0.0" 4681 path-exists "^3.0.0"
@@ -4649,6 +4683,7 @@ locate-path@^2.0.0:
4649locate-path@^3.0.0: 4683locate-path@^3.0.0:
4650 version "3.0.0" 4684 version "3.0.0"
4651 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 4685 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
4686 integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
4652 dependencies: 4687 dependencies:
4653 p-locate "^3.0.0" 4688 p-locate "^3.0.0"
4654 path-exists "^3.0.0" 4689 path-exists "^3.0.0"
@@ -4656,6 +4691,7 @@ locate-path@^3.0.0:
4656lock-verify@^2.0.2: 4691lock-verify@^2.0.2:
4657 version "2.0.2" 4692 version "2.0.2"
4658 resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.2.tgz#148e4f85974915c9e3c34d694b7de9ecb18ee7a8" 4693 resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.2.tgz#148e4f85974915c9e3c34d694b7de9ecb18ee7a8"
4694 integrity sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==
4659 dependencies: 4695 dependencies:
4660 npm-package-arg "^5.1.2 || 6" 4696 npm-package-arg "^5.1.2 || 6"
4661 semver "^5.4.1" 4697 semver "^5.4.1"
@@ -4663,264 +4699,190 @@ lock-verify@^2.0.2:
4663lockfile@^1.0.4: 4699lockfile@^1.0.4:
4664 version "1.0.4" 4700 version "1.0.4"
4665 resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" 4701 resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609"
4702 integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==
4666 dependencies: 4703 dependencies:
4667 signal-exit "^3.0.2" 4704 signal-exit "^3.0.2"
4668 4705
4669lodash._arraycopy@^3.0.0:
4670 version "3.0.0"
4671 resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
4672
4673lodash._arrayeach@^3.0.0:
4674 version "3.0.0"
4675 resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e"
4676
4677lodash._basecopy@^3.0.0:
4678 version "3.0.1"
4679 resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
4680
4681lodash._basefor@^3.0.0:
4682 version "3.0.3"
4683 resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2"
4684
4685lodash._baseuniq@~4.6.0: 4706lodash._baseuniq@~4.6.0:
4686 version "4.6.0" 4707 version "4.6.0"
4687 resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" 4708 resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
4709 integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=
4688 dependencies: 4710 dependencies:
4689 lodash._createset "~4.0.0" 4711 lodash._createset "~4.0.0"
4690 lodash._root "~3.0.0" 4712 lodash._root "~3.0.0"
4691 4713
4692lodash._basevalues@^3.0.0:
4693 version "3.0.0"
4694 resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
4695
4696lodash._bindcallback@^3.0.0:
4697 version "3.0.1"
4698 resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
4699
4700lodash._createassigner@^3.0.0:
4701 version "3.1.1"
4702 resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
4703 dependencies:
4704 lodash._bindcallback "^3.0.0"
4705 lodash._isiterateecall "^3.0.0"
4706 lodash.restparam "^3.0.0"
4707
4708lodash._createset@~4.0.0: 4714lodash._createset@~4.0.0:
4709 version "4.0.3" 4715 version "4.0.3"
4710 resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" 4716 resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
4711 4717 integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
4712lodash._getnative@^3.0.0:
4713 version "3.9.1"
4714 resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
4715
4716lodash._isiterateecall@^3.0.0:
4717 version "3.0.9"
4718 resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
4719 4718
4720lodash._root@~3.0.0: 4719lodash._root@~3.0.0:
4721 version "3.0.1" 4720 version "3.0.1"
4722 resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 4721 resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
4722 integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
4723 4723
4724lodash.assign@^4.2.0: 4724lodash.assign@^4.2.0:
4725 version "4.2.0" 4725 version "4.2.0"
4726 resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 4726 resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
4727 integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
4727 4728
4728lodash.bind@^4.2.1: 4729lodash.bind@^4.2.1:
4729 version "4.2.1" 4730 version "4.2.1"
4730 resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" 4731 resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
4732 integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=
4731 4733
4732lodash.capitalize@^4.1.0: 4734lodash.capitalize@^4.1.0:
4733 version "4.2.1" 4735 version "4.2.1"
4734 resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" 4736 resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
4737 integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
4735 4738
4736lodash.clone@^4.5.0: 4739lodash.clone@^4.5.0:
4737 version "4.5.0" 4740 version "4.5.0"
4738 resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" 4741 resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
4742 integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
4739 4743
4740lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: 4744lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
4741 version "4.5.0" 4745 version "4.5.0"
4742 resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 4746 resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
4747 integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
4743 4748
4744lodash.debounce@^4.0.8: 4749lodash.debounce@^4.0.8:
4745 version "4.0.8" 4750 version "4.0.8"
4746 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 4751 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
4752 integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
4747 4753
4748lodash.defaults@^4.2.0: 4754lodash.defaults@^4.2.0:
4749 version "4.2.0" 4755 version "4.2.0"
4750 resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 4756 resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
4757 integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
4751 4758
4752lodash.difference@^4.5.0: 4759lodash.difference@^4.5.0:
4753 version "4.5.0" 4760 version "4.5.0"
4754 resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" 4761 resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
4762 integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=
4755 4763
4756lodash.flatten@^4.4.0: 4764lodash.flatten@^4.4.0:
4757 version "4.4.0" 4765 version "4.4.0"
4758 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 4766 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
4767 integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
4759 4768
4760lodash.foreach@^4.5.0: 4769lodash.foreach@^4.5.0:
4761 version "4.5.0" 4770 version "4.5.0"
4762 resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" 4771 resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
4772 integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
4763 4773
4764lodash.isarguments@^3.0.0: 4774lodash.get@^4.0.0:
4765 version "3.1.0" 4775 version "4.4.2"
4766 resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 4776 resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
4767 4777 integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
4768lodash.isarray@^3.0.0:
4769 version "3.0.4"
4770 resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
4771 4778
4772lodash.isempty@^4.4.0: 4779lodash.isempty@^4.4.0:
4773 version "4.4.0" 4780 version "4.4.0"
4774 resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" 4781 resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
4782 integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=
4775 4783
4776lodash.isplainobject@^3.0.0: 4784lodash.isequal@^4.0.0:
4777 version "3.2.0" 4785 version "4.5.0"
4778 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5" 4786 resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
4779 dependencies: 4787 integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
4780 lodash._basefor "^3.0.0"
4781 lodash.isarguments "^3.0.0"
4782 lodash.keysin "^3.0.0"
4783
4784lodash.istypedarray@^3.0.0:
4785 version "3.0.6"
4786 resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62"
4787 4788
4788lodash.kebabcase@^4.0.0: 4789lodash.kebabcase@^4.0.0:
4789 version "4.1.1" 4790 version "4.1.1"
4790 resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 4791 resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
4791 4792 integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
4792lodash.keys@^3.0.0:
4793 version "3.1.2"
4794 resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
4795 dependencies:
4796 lodash._getnative "^3.0.0"
4797 lodash.isarguments "^3.0.0"
4798 lodash.isarray "^3.0.0"
4799 4793
4800lodash.keys@^4.2.0: 4794lodash.keys@^4.2.0:
4801 version "4.2.0" 4795 version "4.2.0"
4802 resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" 4796 resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205"
4803 4797 integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=
4804lodash.keysin@^3.0.0:
4805 version "3.0.8"
4806 resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f"
4807 dependencies:
4808 lodash.isarguments "^3.0.0"
4809 lodash.isarray "^3.0.0"
4810
4811lodash.merge@^3.0.0:
4812 version "3.3.2"
4813 resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-3.3.2.tgz#0d90d93ed637b1878437bb3e21601260d7afe994"
4814 dependencies:
4815 lodash._arraycopy "^3.0.0"
4816 lodash._arrayeach "^3.0.0"
4817 lodash._createassigner "^3.0.0"
4818 lodash._getnative "^3.0.0"
4819 lodash.isarguments "^3.0.0"
4820 lodash.isarray "^3.0.0"
4821 lodash.isplainobject "^3.0.0"
4822 lodash.istypedarray "^3.0.0"
4823 lodash.keys "^3.0.0"
4824 lodash.keysin "^3.0.0"
4825 lodash.toplainobject "^3.0.0"
4826
4827lodash.mergewith@^4.6.0:
4828 version "4.6.1"
4829 resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
4830 4798
4831lodash.noop@^3.0.1: 4799lodash.noop@^3.0.1:
4832 version "3.0.1" 4800 version "3.0.1"
4833 resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" 4801 resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c"
4802 integrity sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=
4834 4803
4835lodash.partial@^4.2.1: 4804lodash.partial@^4.2.1:
4836 version "4.2.1" 4805 version "4.2.1"
4837 resolved "https://registry.yarnpkg.com/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4" 4806 resolved "https://registry.yarnpkg.com/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4"
4807 integrity sha1-SfPYz9qjv/izqR0SfpIyRUGJYdQ=
4838 4808
4839lodash.pick@^4.4.0: 4809lodash.pick@^4.4.0:
4840 version "4.4.0" 4810 version "4.4.0"
4841 resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" 4811 resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
4842 4812 integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
4843lodash.restparam@^3.0.0:
4844 version "3.6.1"
4845 resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
4846 4813
4847lodash.sample@^4.2.1: 4814lodash.sample@^4.2.1:
4848 version "4.2.1" 4815 version "4.2.1"
4849 resolved "https://registry.yarnpkg.com/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d" 4816 resolved "https://registry.yarnpkg.com/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d"
4817 integrity sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20=
4850 4818
4851lodash.shuffle@^4.2.0: 4819lodash.shuffle@^4.2.0:
4852 version "4.2.0" 4820 version "4.2.0"
4853 resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" 4821 resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b"
4854 4822 integrity sha1-FFtQU8+HX29cKjP0i26ZSMbse0s=
4855lodash.toarray@^3.0.0:
4856 version "3.0.2"
4857 resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-3.0.2.tgz#2b204f0fa4f51c285c6f00c81d1cea5a23041179"
4858 dependencies:
4859 lodash._arraycopy "^3.0.0"
4860 lodash._basevalues "^3.0.0"
4861 lodash.keys "^3.0.0"
4862
4863lodash.toplainobject@^3.0.0:
4864 version "3.0.0"
4865 resolved "https://registry.yarnpkg.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz#28790ad942d293d78aa663a07ecf7f52ca04198d"
4866 dependencies:
4867 lodash._basecopy "^3.0.0"
4868 lodash.keysin "^3.0.0"
4869 4823
4870lodash.union@~4.6.0: 4824lodash.union@~4.6.0:
4871 version "4.6.0" 4825 version "4.6.0"
4872 resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" 4826 resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
4827 integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
4873 4828
4874lodash.uniq@~4.5.0: 4829lodash.uniq@~4.5.0:
4875 version "4.5.0" 4830 version "4.5.0"
4876 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 4831 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
4832 integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
4877 4833
4878lodash.values@^4.3.0: 4834lodash.values@^4.3.0:
4879 version "4.3.0" 4835 version "4.3.0"
4880 resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" 4836 resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
4837 integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
4881 4838
4882lodash.without@~4.4.0: 4839lodash.without@~4.4.0:
4883 version "4.4.0" 4840 version "4.4.0"
4884 resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" 4841 resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
4842 integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
4885 4843
4886lodash@4.17.4: 4844lodash@4.17.4:
4887 version "4.17.4" 4845 version "4.17.4"
4888 resolved "http://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 4846 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
4847 integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=
4889 4848
4890lodash@=3.10.1, lodash@^3.2.0: 4849lodash@=3.10.1:
4891 version "3.10.1" 4850 version "3.10.1"
4892 resolved "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 4851 resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
4852 integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
4893 4853
4894lodash@^4.0.0, lodash@^4.11.1, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.2, lodash@~4.17.10, lodash@~4.17.5: 4854lodash@^4.0.0, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.2, lodash@~4.17.10:
4895 version "4.17.11" 4855 version "4.17.11"
4896 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 4856 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
4897 4857 integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
4898lodash@~2.4.1:
4899 version "2.4.2"
4900 resolved "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
4901 4858
4902log-symbols@^1.0.2: 4859log-symbols@^1.0.2:
4903 version "1.0.2" 4860 version "1.0.2"
4904 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 4861 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
4862 integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=
4905 dependencies: 4863 dependencies:
4906 chalk "^1.0.0" 4864 chalk "^1.0.0"
4907 4865
4908log-symbols@^2.2.0: 4866log-symbols@^2.2.0:
4909 version "2.2.0" 4867 version "2.2.0"
4910 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 4868 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
4869 integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
4911 dependencies: 4870 dependencies:
4912 chalk "^2.0.1" 4871 chalk "^2.0.1"
4913 4872
4914log-update@^1.0.2: 4873log-update@^2.3.0:
4915 version "1.0.2" 4874 version "2.3.0"
4916 resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" 4875 resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
4876 integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg=
4917 dependencies: 4877 dependencies:
4918 ansi-escapes "^1.0.0" 4878 ansi-escapes "^3.0.0"
4919 cli-cursor "^1.0.2" 4879 cli-cursor "^2.0.0"
4880 wrap-ansi "^3.0.1"
4920 4881
4921logform@^1.9.1: 4882logform@^1.9.1:
4922 version "1.10.0" 4883 version "1.10.0"
4923 resolved "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e" 4884 resolved "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e"
4885 integrity sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==
4924 dependencies: 4886 dependencies:
4925 colors "^1.2.1" 4887 colors "^1.2.1"
4926 fast-safe-stringify "^2.0.4" 4888 fast-safe-stringify "^2.0.4"
@@ -4928,20 +4890,15 @@ logform@^1.9.1:
4928 ms "^2.1.1" 4890 ms "^2.1.1"
4929 triple-beam "^1.2.0" 4891 triple-beam "^1.2.0"
4930 4892
4931loud-rejection@^1.0.0:
4932 version "1.6.0"
4933 resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
4934 dependencies:
4935 currently-unhandled "^0.4.1"
4936 signal-exit "^3.0.0"
4937
4938lowercase-keys@^1.0.0: 4893lowercase-keys@^1.0.0:
4939 version "1.0.1" 4894 version "1.0.1"
4940 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 4895 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
4896 integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
4941 4897
4942lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: 4898lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3:
4943 version "4.1.3" 4899 version "4.1.5"
4944 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 4900 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
4901 integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
4945 dependencies: 4902 dependencies:
4946 pseudomap "^1.0.2" 4903 pseudomap "^1.0.2"
4947 yallist "^2.1.2" 4904 yallist "^2.1.2"
@@ -4949,18 +4906,21 @@ lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache
4949lru-queue@0.1: 4906lru-queue@0.1:
4950 version "0.1.0" 4907 version "0.1.0"
4951 resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 4908 resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
4909 integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
4952 dependencies: 4910 dependencies:
4953 es5-ext "~0.10.2" 4911 es5-ext "~0.10.2"
4954 4912
4955lru@^3.0.0, lru@^3.1.0: 4913lru@^3.0.0, lru@^3.1.0:
4956 version "3.1.0" 4914 version "3.1.0"
4957 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5" 4915 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5"
4916 integrity sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=
4958 dependencies: 4917 dependencies:
4959 inherits "^2.0.1" 4918 inherits "^2.0.1"
4960 4919
4961magnet-uri@^5.1.3, magnet-uri@^5.1.4: 4920magnet-uri@^5.1.3, magnet-uri@^5.1.4:
4962 version "5.2.4" 4921 version "5.2.4"
4963 resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz#7afe5b736af04445aff744c93a890a3710077688" 4922 resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz#7afe5b736af04445aff744c93a890a3710077688"
4923 integrity sha512-VYaJMxhr8B9BrCiNINUsuhaEe40YnG+AQBwcqUKO66lSVaI9I3A1iH/6EmEwRI8OYUg5Gt+4lLE7achg676lrg==
4964 dependencies: 4924 dependencies:
4965 thirty-two "^1.0.1" 4925 thirty-two "^1.0.1"
4966 uniq "^1.0.1" 4926 uniq "^1.0.1"
@@ -4968,6 +4928,7 @@ magnet-uri@^5.1.3, magnet-uri@^5.1.4:
4968maildev@^1.0.0-rc3: 4928maildev@^1.0.0-rc3:
4969 version "1.0.0-rc3" 4929 version "1.0.0-rc3"
4970 resolved "https://registry.yarnpkg.com/maildev/-/maildev-1.0.0-rc3.tgz#89429d47b07633e3269a74e484991eecdf3a3857" 4930 resolved "https://registry.yarnpkg.com/maildev/-/maildev-1.0.0-rc3.tgz#89429d47b07633e3269a74e484991eecdf3a3857"
4931 integrity sha512-5Ve6V3GlS8QOAwUtwsWzR1S0P7Kzw+p5syfgpGyUZXGOuGbfV+qDpZ9grg/FJqm49iqWeWjvYj1Va8XMNcLrxg==
4971 dependencies: 4932 dependencies:
4972 async "1.5.1" 4933 async "1.5.1"
4973 commander "2.9.0" 4934 commander "2.9.0"
@@ -4982,6 +4943,7 @@ maildev@^1.0.0-rc3:
4982mailparser@0.6.2: 4943mailparser@0.6.2:
4983 version "0.6.2" 4944 version "0.6.2"
4984 resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-0.6.2.tgz#03c486039bdf4df6cd3b6adcaaac4107dfdbc068" 4945 resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-0.6.2.tgz#03c486039bdf4df6cd3b6adcaaac4107dfdbc068"
4946 integrity sha1-A8SGA5vfTfbNO2rcqqxBB9/bwGg=
4985 dependencies: 4947 dependencies:
4986 encoding "^0.1.12" 4948 encoding "^0.1.12"
4987 mime "^1.3.4" 4949 mime "^1.3.4"
@@ -4991,16 +4953,19 @@ mailparser@0.6.2:
4991make-dir@^1.0.0: 4953make-dir@^1.0.0:
4992 version "1.3.0" 4954 version "1.3.0"
4993 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 4955 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
4956 integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
4994 dependencies: 4957 dependencies:
4995 pify "^3.0.0" 4958 pify "^3.0.0"
4996 4959
4997make-error@^1.1.1: 4960make-error@^1.1.1:
4998 version "1.3.5" 4961 version "1.3.5"
4999 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 4962 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
4963 integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
5000 4964
5001"make-fetch-happen@^2.5.0 || 3 || 4", make-fetch-happen@^4.0.1: 4965"make-fetch-happen@^2.5.0 || 3 || 4", make-fetch-happen@^4.0.1:
5002 version "4.0.1" 4966 version "4.0.1"
5003 resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" 4967 resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083"
4968 integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==
5004 dependencies: 4969 dependencies:
5005 agentkeepalive "^3.4.1" 4970 agentkeepalive "^3.4.1"
5006 cacache "^11.0.1" 4971 cacache "^11.0.1"
@@ -5017,6 +4982,7 @@ make-error@^1.1.1:
5017make-fetch-happen@^3.0.0: 4982make-fetch-happen@^3.0.0:
5018 version "3.0.0" 4983 version "3.0.0"
5019 resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz#7b661d2372fc4710ab5cc8e1fa3c290eea69a961" 4984 resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz#7b661d2372fc4710ab5cc8e1fa3c290eea69a961"
4985 integrity sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w==
5020 dependencies: 4986 dependencies:
5021 agentkeepalive "^3.4.1" 4987 agentkeepalive "^3.4.1"
5022 cacache "^10.0.4" 4988 cacache "^10.0.4"
@@ -5031,45 +4997,47 @@ make-fetch-happen@^3.0.0:
5031 ssri "^5.2.4" 4997 ssri "^5.2.4"
5032 4998
5033map-age-cleaner@^0.1.1: 4999map-age-cleaner@^0.1.1:
5034 version "0.1.2" 5000 version "0.1.3"
5035 resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" 5001 resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
5002 integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
5036 dependencies: 5003 dependencies:
5037 p-defer "^1.0.0" 5004 p-defer "^1.0.0"
5038 5005
5039map-cache@^0.2.2: 5006map-cache@^0.2.2:
5040 version "0.2.2" 5007 version "0.2.2"
5041 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 5008 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
5042 5009 integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
5043map-obj@^1.0.0, map-obj@^1.0.1:
5044 version "1.0.1"
5045 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
5046
5047map-stream@0.0.7:
5048 version "0.0.7"
5049 resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8"
5050 5010
5051map-visit@^1.0.0: 5011map-visit@^1.0.0:
5052 version "1.0.0" 5012 version "1.0.0"
5053 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 5013 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
5014 integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
5054 dependencies: 5015 dependencies:
5055 object-visit "^1.0.0" 5016 object-visit "^1.0.0"
5056 5017
5057marked@^0.3.5: 5018marked-man@^0.2.1:
5019 version "0.2.1"
5020 resolved "https://registry.yarnpkg.com/marked-man/-/marked-man-0.2.1.tgz#f259271481de3b507263489f5221b7c5acfd2383"
5021 integrity sha1-8lknFIHeO1ByY0ifUiG3xaz9I4M=
5022 dependencies:
5023 marked "^0.3.2"
5024
5025marked@^0.3.2:
5058 version "0.3.19" 5026 version "0.3.19"
5059 resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" 5027 resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
5028 integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
5060 5029
5061maxmin@^2.1.0: 5030matcher@^1.0.0:
5062 version "2.1.0" 5031 version "1.1.1"
5063 resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-2.1.0.tgz#4d3b220903d95eee7eb7ac7fa864e72dc09a3166" 5032 resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2"
5033 integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==
5064 dependencies: 5034 dependencies:
5065 chalk "^1.0.0" 5035 escape-string-regexp "^1.0.4"
5066 figures "^1.0.1"
5067 gzip-size "^3.0.0"
5068 pretty-bytes "^3.0.0"
5069 5036
5070md5@^2.2.1: 5037md5@^2.2.1:
5071 version "2.2.1" 5038 version "2.2.1"
5072 resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" 5039 resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
5040 integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=
5073 dependencies: 5041 dependencies:
5074 charenc "~0.0.1" 5042 charenc "~0.0.1"
5075 crypt "~0.0.1" 5043 crypt "~0.0.1"
@@ -5078,14 +5046,17 @@ md5@^2.2.1:
5078meant@~1.0.1: 5046meant@~1.0.1:
5079 version "1.0.1" 5047 version "1.0.1"
5080 resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" 5048 resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d"
5049 integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg==
5081 5050
5082media-typer@0.3.0: 5051media-typer@0.3.0:
5083 version "0.3.0" 5052 version "0.3.0"
5084 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 5053 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
5054 integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
5085 5055
5086mediasource@^2.0.0, mediasource@^2.1.0: 5056mediasource@^2.1.0, mediasource@^2.2.2:
5087 version "2.2.2" 5057 version "2.2.2"
5088 resolved "https://registry.yarnpkg.com/mediasource/-/mediasource-2.2.2.tgz#2fe826f14e51da97fa4bf87be7b808a0b11d3a4c" 5058 resolved "https://registry.yarnpkg.com/mediasource/-/mediasource-2.2.2.tgz#2fe826f14e51da97fa4bf87be7b808a0b11d3a4c"
5059 integrity sha512-yIyAJMcu1mudTkxZ0jDAKnZJJba4eWPCxxtZRMpoaA4/AI7m7nqbRjmdxmi+x3hKTohb5vC9Yd3IBF/SUzp1vQ==
5089 dependencies: 5060 dependencies:
5090 inherits "^2.0.1" 5061 inherits "^2.0.1"
5091 readable-stream "^2.0.5" 5062 readable-stream "^2.0.5"
@@ -5094,12 +5065,14 @@ mediasource@^2.0.0, mediasource@^2.1.0:
5094mem@^1.1.0: 5065mem@^1.1.0:
5095 version "1.1.0" 5066 version "1.1.0"
5096 resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 5067 resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
5068 integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
5097 dependencies: 5069 dependencies:
5098 mimic-fn "^1.0.0" 5070 mimic-fn "^1.0.0"
5099 5071
5100mem@^4.0.0: 5072mem@^4.0.0:
5101 version "4.0.0" 5073 version "4.0.0"
5102 resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" 5074 resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf"
5075 integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==
5103 dependencies: 5076 dependencies:
5104 map-age-cleaner "^0.1.1" 5077 map-age-cleaner "^0.1.1"
5105 mimic-fn "^1.0.0" 5078 mimic-fn "^1.0.0"
@@ -5108,6 +5081,7 @@ mem@^4.0.0:
5108memoizee@^0.4.14: 5081memoizee@^0.4.14:
5109 version "0.4.14" 5082 version "0.4.14"
5110 resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" 5083 resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
5084 integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==
5111 dependencies: 5085 dependencies:
5112 d "1" 5086 d "1"
5113 es5-ext "^0.10.45" 5087 es5-ext "^0.10.45"
@@ -5121,37 +5095,27 @@ memoizee@^0.4.14:
5121memory-chunk-store@^1.2.0: 5095memory-chunk-store@^1.2.0:
5122 version "1.3.0" 5096 version "1.3.0"
5123 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4" 5097 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4"
5124 5098 integrity sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA==
5125meow@^3.3.0, meow@^3.7.0:
5126 version "3.7.0"
5127 resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
5128 dependencies:
5129 camelcase-keys "^2.0.0"
5130 decamelize "^1.1.2"
5131 loud-rejection "^1.0.0"
5132 map-obj "^1.0.1"
5133 minimist "^1.1.3"
5134 normalize-package-data "^2.3.4"
5135 object-assign "^4.0.1"
5136 read-pkg-up "^1.0.1"
5137 redent "^1.0.0"
5138 trim-newlines "^1.0.0"
5139 5099
5140merge-descriptors@1.0.1: 5100merge-descriptors@1.0.1:
5141 version "1.0.1" 5101 version "1.0.1"
5142 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 5102 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
5103 integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
5143 5104
5144merge@^1.2.0: 5105merge@^1.2.0:
5145 version "1.2.0" 5106 version "1.2.1"
5146 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" 5107 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
5108 integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
5147 5109
5148methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: 5110methods@^1.1.1, methods@^1.1.2, methods@~1.1.2:
5149 version "1.1.2" 5111 version "1.1.2"
5150 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 5112 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
5113 integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
5151 5114
5152micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: 5115micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
5153 version "3.1.10" 5116 version "3.1.10"
5154 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 5117 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
5118 integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
5155 dependencies: 5119 dependencies:
5156 arr-diff "^4.0.0" 5120 arr-diff "^4.0.0"
5157 array-unique "^0.3.2" 5121 array-unique "^0.3.2"
@@ -5167,35 +5131,42 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
5167 snapdragon "^0.8.1" 5131 snapdragon "^0.8.1"
5168 to-regex "^3.0.2" 5132 to-regex "^3.0.2"
5169 5133
5170mime-db@~1.36.0: 5134mime-db@~1.37.0:
5171 version "1.36.0" 5135 version "1.37.0"
5172 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" 5136 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
5137 integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==
5173 5138
5174mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.6: 5139mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.6:
5175 version "2.1.20" 5140 version "2.1.21"
5176 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" 5141 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
5142 integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==
5177 dependencies: 5143 dependencies:
5178 mime-db "~1.36.0" 5144 mime-db "~1.37.0"
5179 5145
5180mime@1.3.4: 5146mime@1.3.4:
5181 version "1.3.4" 5147 version "1.3.4"
5182 resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 5148 resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
5149 integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=
5183 5150
5184mime@1.4.1: 5151mime@1.4.1:
5185 version "1.4.1" 5152 version "1.4.1"
5186 resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 5153 resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
5154 integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
5187 5155
5188mime@^1.3.4, mime@^1.4.1: 5156mime@^1.3.4, mime@^1.4.1:
5189 version "1.6.0" 5157 version "1.6.0"
5190 resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 5158 resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
5159 integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
5191 5160
5192mime@^2.2.0: 5161mime@^2.2.0:
5193 version "2.3.1" 5162 version "2.4.0"
5194 resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" 5163 resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
5164 integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==
5195 5165
5196mimelib@^0.3.0: 5166mimelib@^0.3.0:
5197 version "0.3.1" 5167 version "0.3.1"
5198 resolved "https://registry.yarnpkg.com/mimelib/-/mimelib-0.3.1.tgz#787add2415d827acb3af6ec4bca1ea9596418853" 5168 resolved "https://registry.yarnpkg.com/mimelib/-/mimelib-0.3.1.tgz#787add2415d827acb3af6ec4bca1ea9596418853"
5169 integrity sha1-eHrdJBXYJ6yzr27EvKHqlZZBiFM=
5199 dependencies: 5170 dependencies:
5200 addressparser "~1.0.1" 5171 addressparser "~1.0.1"
5201 encoding "~0.1.12" 5172 encoding "~0.1.12"
@@ -5203,59 +5174,59 @@ mimelib@^0.3.0:
5203mimic-fn@^1.0.0: 5174mimic-fn@^1.0.0:
5204 version "1.2.0" 5175 version "1.2.0"
5205 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 5176 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
5177 integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
5206 5178
5207mimic-response@^1.0.0: 5179mimic-response@^1.0.0:
5208 version "1.0.1" 5180 version "1.0.1"
5209 resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 5181 resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
5182 integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
5210 5183
5211minimalistic-assert@^1.0.1: 5184minimalistic-assert@^1.0.1:
5212 version "1.0.1" 5185 version "1.0.1"
5213 resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 5186 resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
5187 integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
5214 5188
5215"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: 5189minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
5216 version "3.0.4" 5190 version "3.0.4"
5217 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 5191 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
5192 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
5218 dependencies: 5193 dependencies:
5219 brace-expansion "^1.1.7" 5194 brace-expansion "^1.1.7"
5220 5195
5221minimatch@^2.0.1:
5222 version "2.0.10"
5223 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
5224 dependencies:
5225 brace-expansion "^1.0.0"
5226
5227minimist@0.0.8: 5196minimist@0.0.8:
5228 version "0.0.8" 5197 version "0.0.8"
5229 resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 5198 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
5199 integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
5230 5200
5231minimist@1.1.x: 5201minimist@1.1.x:
5232 version "1.1.3" 5202 version "1.1.3"
5233 resolved "http://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" 5203 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
5204 integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
5234 5205
5235minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: 5206minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
5236 version "1.2.0" 5207 version "1.2.0"
5237 resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 5208 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
5238 5209 integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
5239minimist@~0.0.1:
5240 version "0.0.10"
5241 resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
5242 5210
5243minipass@^2.2.1, minipass@^2.3.3: 5211minipass@^2.2.1, minipass@^2.3.3, minipass@^2.3.4:
5244 version "2.3.4" 5212 version "2.3.5"
5245 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" 5213 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
5214 integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
5246 dependencies: 5215 dependencies:
5247 safe-buffer "^5.1.2" 5216 safe-buffer "^5.1.2"
5248 yallist "^3.0.0" 5217 yallist "^3.0.0"
5249 5218
5250minizlib@^1.1.0: 5219minizlib@^1.1.1:
5251 version "1.1.0" 5220 version "1.1.1"
5252 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 5221 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
5222 integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==
5253 dependencies: 5223 dependencies:
5254 minipass "^2.2.1" 5224 minipass "^2.2.1"
5255 5225
5256mississippi@^2.0.0: 5226mississippi@^2.0.0:
5257 version "2.0.0" 5227 version "2.0.0"
5258 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" 5228 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
5229 integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
5259 dependencies: 5230 dependencies:
5260 concat-stream "^1.5.0" 5231 concat-stream "^1.5.0"
5261 duplexify "^3.4.2" 5232 duplexify "^3.4.2"
@@ -5271,6 +5242,7 @@ mississippi@^2.0.0:
5271mississippi@^3.0.0: 5242mississippi@^3.0.0:
5272 version "3.0.0" 5243 version "3.0.0"
5273 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" 5244 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
5245 integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
5274 dependencies: 5246 dependencies:
5275 concat-stream "^1.5.0" 5247 concat-stream "^1.5.0"
5276 duplexify "^3.4.2" 5248 duplexify "^3.4.2"
@@ -5286,23 +5258,22 @@ mississippi@^3.0.0:
5286mixin-deep@^1.2.0: 5258mixin-deep@^1.2.0:
5287 version "1.3.1" 5259 version "1.3.1"
5288 resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 5260 resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
5261 integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
5289 dependencies: 5262 dependencies:
5290 for-in "^1.0.2" 5263 for-in "^1.0.2"
5291 is-extendable "^1.0.1" 5264 is-extendable "^1.0.1"
5292 5265
5293mkdirp@0.5.1, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: 5266mkdirp@0.5.1, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
5294 version "0.5.1" 5267 version "0.5.1"
5295 resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 5268 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
5269 integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
5296 dependencies: 5270 dependencies:
5297 minimist "0.0.8" 5271 minimist "0.0.8"
5298 5272
5299mkdirp@~0.3.5:
5300 version "0.3.5"
5301 resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
5302
5303mocha@^5.0.0: 5273mocha@^5.0.0:
5304 version "5.2.0" 5274 version "5.2.0"
5305 resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 5275 resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
5276 integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
5306 dependencies: 5277 dependencies:
5307 browser-stdout "1.3.1" 5278 browser-stdout "1.3.1"
5308 commander "2.15.1" 5279 commander "2.15.1"
@@ -5316,19 +5287,22 @@ mocha@^5.0.0:
5316 mkdirp "0.5.1" 5287 mkdirp "0.5.1"
5317 supports-color "5.4.0" 5288 supports-color "5.4.0"
5318 5289
5319moment-timezone@^0.5.0, moment-timezone@^0.5.14: 5290moment-timezone@^0.5.14, moment-timezone@^0.5.23:
5320 version "0.5.21" 5291 version "0.5.23"
5321 resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.21.tgz#3cba247d84492174dbf71de2a9848fa13207b845" 5292 resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463"
5293 integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==
5322 dependencies: 5294 dependencies:
5323 moment ">= 2.9.0" 5295 moment ">= 2.9.0"
5324 5296
5325"moment@>= 2.9.0", moment@^2.20.0: 5297"moment@>= 2.9.0", moment@^2.20.0:
5326 version "2.22.2" 5298 version "2.22.2"
5327 resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 5299 resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
5300 integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=
5328 5301
5329morgan@^1.5.3, morgan@^1.6.1: 5302morgan@^1.5.3:
5330 version "1.9.1" 5303 version "1.9.1"
5331 resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" 5304 resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59"
5305 integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==
5332 dependencies: 5306 dependencies:
5333 basic-auth "~2.0.0" 5307 basic-auth "~2.0.0"
5334 debug "2.6.9" 5308 debug "2.6.9"
@@ -5339,6 +5313,7 @@ morgan@^1.5.3, morgan@^1.6.1:
5339move-concurrently@^1.0.1: 5313move-concurrently@^1.0.1:
5340 version "1.0.1" 5314 version "1.0.1"
5341 resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" 5315 resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
5316 integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
5342 dependencies: 5317 dependencies:
5343 aproba "^1.1.1" 5318 aproba "^1.1.1"
5344 copy-concurrently "^1.0.0" 5319 copy-concurrently "^1.0.0"
@@ -5350,6 +5325,7 @@ move-concurrently@^1.0.1:
5350mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0: 5325mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0:
5351 version "1.3.0" 5326 version "1.3.0"
5352 resolved "https://registry.yarnpkg.com/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz#2a6f750947ff68c3a498fd76cd6424c53d995d48" 5327 resolved "https://registry.yarnpkg.com/mp4-box-encoding/-/mp4-box-encoding-1.3.0.tgz#2a6f750947ff68c3a498fd76cd6424c53d995d48"
5328 integrity sha512-U4pMLpjT/UzB8d36dxj6Mf1bG9xypEvgbuRIa1fztRXNKKTCAtRxsnFZhNOd7YDFOKtjBgssYGvo4H/Q3ZY1MA==
5353 dependencies: 5329 dependencies:
5354 buffer-alloc "^1.2.0" 5330 buffer-alloc "^1.2.0"
5355 buffer-from "^1.1.0" 5331 buffer-from "^1.1.0"
@@ -5358,6 +5334,7 @@ mp4-box-encoding@^1.1.0, mp4-box-encoding@^1.3.0:
5358mp4-stream@^2.0.0: 5334mp4-stream@^2.0.0:
5359 version "2.0.3" 5335 version "2.0.3"
5360 resolved "https://registry.yarnpkg.com/mp4-stream/-/mp4-stream-2.0.3.tgz#30acee07709d323f8dcd87a07b3ce9c3c4bfb364" 5336 resolved "https://registry.yarnpkg.com/mp4-stream/-/mp4-stream-2.0.3.tgz#30acee07709d323f8dcd87a07b3ce9c3c4bfb364"
5337 integrity sha512-5NzgI0+bGakoZEwnIYINXqB3mnewkt3Y7jcvkXsTubnCNUSdM8cpP0Vemxf6FLg0qUN8fydTgNMVAc3QU8B92g==
5361 dependencies: 5338 dependencies:
5362 buffer-alloc "^1.1.0" 5339 buffer-alloc "^1.1.0"
5363 inherits "^2.0.1" 5340 inherits "^2.0.1"
@@ -5368,28 +5345,33 @@ mp4-stream@^2.0.0:
5368ms@0.7.1: 5345ms@0.7.1:
5369 version "0.7.1" 5346 version "0.7.1"
5370 resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 5347 resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
5348 integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=
5371 5349
5372ms@0.7.2: 5350ms@0.7.2:
5373 version "0.7.2" 5351 version "0.7.2"
5374 resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 5352 resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
5353 integrity sha1-riXPJRKziFodldfwN4aNhDESR2U=
5375 5354
5376ms@2.0.0: 5355ms@2.0.0:
5377 version "2.0.0" 5356 version "2.0.0"
5378 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 5357 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
5358 integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
5379 5359
5380ms@^2.0.0, ms@^2.1.1: 5360ms@^2.0.0, ms@^2.1.1:
5381 version "2.1.1" 5361 version "2.1.1"
5382 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 5362 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
5363 integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
5383 5364
5384multer@^1.1.0: 5365multer@^1.1.0:
5385 version "1.3.1" 5366 version "1.4.1"
5386 resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.1.tgz#c3fb3b35f50c7eefe873532f90d3dde02ce6e040" 5367 resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.1.tgz#24b12a416a22fec2ade810539184bf138720159e"
5368 integrity sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==
5387 dependencies: 5369 dependencies:
5388 append-field "^0.1.0" 5370 append-field "^1.0.0"
5389 busboy "^0.2.11" 5371 busboy "^0.2.11"
5390 concat-stream "^1.5.2" 5372 concat-stream "^1.5.2"
5391 mkdirp "^0.5.1" 5373 mkdirp "^0.5.1"
5392 object-assign "^3.0.0" 5374 object-assign "^4.1.1"
5393 on-finished "^2.3.0" 5375 on-finished "^2.3.0"
5394 type-is "^1.6.4" 5376 type-is "^1.6.4"
5395 xtend "^4.0.0" 5377 xtend "^4.0.0"
@@ -5397,6 +5379,7 @@ multer@^1.1.0:
5397multistream@^2.0.2, multistream@^2.0.5: 5379multistream@^2.0.2, multistream@^2.0.5:
5398 version "2.1.1" 5380 version "2.1.1"
5399 resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c" 5381 resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c"
5382 integrity sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==
5400 dependencies: 5383 dependencies:
5401 inherits "^2.0.1" 5384 inherits "^2.0.1"
5402 readable-stream "^2.0.5" 5385 readable-stream "^2.0.5"
@@ -5404,22 +5387,27 @@ multistream@^2.0.2, multistream@^2.0.5:
5404mute-stream@0.0.5: 5387mute-stream@0.0.5:
5405 version "0.0.5" 5388 version "0.0.5"
5406 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 5389 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
5390 integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
5407 5391
5408mute-stream@~0.0.4: 5392mute-stream@~0.0.4:
5409 version "0.0.7" 5393 version "0.0.7"
5410 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 5394 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
5395 integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
5396
5397nan@2.11.1, nan@^2.10.0, nan@^2.11.1, nan@^2.9.2:
5398 version "2.11.1"
5399 resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
5400 integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==
5411 5401
5412nan@2.10.0, nan@~2.10.0: 5402nan@~2.10.0:
5413 version "2.10.0" 5403 version "2.10.0"
5414 resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 5404 resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
5415 5405 integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==
5416nan@^2.0.7, nan@^2.10.0, nan@^2.11.0, nan@^2.9.2:
5417 version "2.11.0"
5418 resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099"
5419 5406
5420nanomatch@^1.2.9: 5407nanomatch@^1.2.9:
5421 version "1.2.13" 5408 version "1.2.13"
5422 resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 5409 resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
5410 integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
5423 dependencies: 5411 dependencies:
5424 arr-diff "^4.0.0" 5412 arr-diff "^4.0.0"
5425 array-unique "^0.3.2" 5413 array-unique "^0.3.2"
@@ -5433,17 +5421,20 @@ nanomatch@^1.2.9:
5433 snapdragon "^0.8.1" 5421 snapdragon "^0.8.1"
5434 to-regex "^3.0.1" 5422 to-regex "^3.0.1"
5435 5423
5436native-promise-only@^0.8.1: 5424napi-build-utils@^1.0.1:
5437 version "0.8.1" 5425 version "1.0.1"
5438 resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" 5426 resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508"
5427 integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==
5439 5428
5440ncp@1.0.x: 5429ncp@1.0.x:
5441 version "1.0.1" 5430 version "1.0.1"
5442 resolved "http://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" 5431 resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
5432 integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
5443 5433
5444needle@^2.2.0, needle@^2.2.1: 5434needle@^2.2.1:
5445 version "2.2.3" 5435 version "2.2.4"
5446 resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" 5436 resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
5437 integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==
5447 dependencies: 5438 dependencies:
5448 debug "^2.1.2" 5439 debug "^2.1.2"
5449 iconv-lite "^0.4.4" 5440 iconv-lite "^0.4.4"
@@ -5452,18 +5443,22 @@ needle@^2.2.0, needle@^2.2.1:
5452negotiator@0.5.3: 5443negotiator@0.5.3:
5453 version "0.5.3" 5444 version "0.5.3"
5454 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" 5445 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8"
5446 integrity sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=
5455 5447
5456negotiator@0.6.1: 5448negotiator@0.6.1:
5457 version "0.6.1" 5449 version "0.6.1"
5458 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 5450 resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
5451 integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
5459 5452
5460netmask@^1.0.6: 5453netmask@^1.0.6:
5461 version "1.0.6" 5454 version "1.0.6"
5462 resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" 5455 resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
5456 integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=
5463 5457
5464netrc-parser@^3.1.6: 5458netrc-parser@^3.1.6:
5465 version "3.1.6" 5459 version "3.1.6"
5466 resolved "https://registry.yarnpkg.com/netrc-parser/-/netrc-parser-3.1.6.tgz#7243c9ec850b8e805b9bdc7eae7b1450d4a96e72" 5460 resolved "https://registry.yarnpkg.com/netrc-parser/-/netrc-parser-3.1.6.tgz#7243c9ec850b8e805b9bdc7eae7b1450d4a96e72"
5461 integrity sha512-lY+fmkqSwntAAjfP63jB4z5p5WbuZwyMCD3pInT7dpHU/Gc6Vv90SAC6A0aNiqaRGHiuZFBtiwu+pu8W/Eyotw==
5467 dependencies: 5462 dependencies:
5468 debug "^3.1.0" 5463 debug "^3.1.0"
5469 execa "^0.10.0" 5464 execa "^0.10.0"
@@ -5471,28 +5466,39 @@ netrc-parser@^3.1.6:
5471next-event@^1.0.0: 5466next-event@^1.0.0:
5472 version "1.0.0" 5467 version "1.0.0"
5473 resolved "https://registry.yarnpkg.com/next-event/-/next-event-1.0.0.tgz#e7778acde2e55802e0ad1879c39cf6f75eda61d8" 5468 resolved "https://registry.yarnpkg.com/next-event/-/next-event-1.0.0.tgz#e7778acde2e55802e0ad1879c39cf6f75eda61d8"
5469 integrity sha1-53eKzeLlWALgrRh5w5z2917aYdg=
5474 5470
5475next-tick@1: 5471next-tick@1:
5476 version "1.0.0" 5472 version "1.0.0"
5477 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 5473 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
5474 integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
5478 5475
5479nice-try@^1.0.4: 5476nice-try@^1.0.4:
5480 version "1.0.5" 5477 version "1.0.5"
5481 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 5478 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
5479 integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
5482 5480
5483nocache@2.0.0: 5481nocache@2.0.0:
5484 version "2.0.0" 5482 version "2.0.0"
5485 resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" 5483 resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980"
5484 integrity sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=
5486 5485
5487node-abi@^2.2.0: 5486node-abi@^2.2.0:
5488 version "2.4.4" 5487 version "2.5.0"
5489 resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.4.tgz#410d8968809fe616dc078a181c44a370912f12fd" 5488 resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.5.0.tgz#942e1a78bce764bc0c1672d5821e492b9d032052"
5489 integrity sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==
5490 dependencies: 5490 dependencies:
5491 semver "^5.4.1" 5491 semver "^5.4.1"
5492 5492
5493node-addon-api@^1.6.0:
5494 version "1.6.2"
5495 resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.2.tgz#d8aad9781a5cfc4132cc2fecdbdd982534265217"
5496 integrity sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA==
5497
5493node-fetch-npm@^2.0.2: 5498node-fetch-npm@^2.0.2:
5494 version "2.0.2" 5499 version "2.0.2"
5495 resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" 5500 resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
5501 integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==
5496 dependencies: 5502 dependencies:
5497 encoding "^0.1.11" 5503 encoding "^0.1.11"
5498 json-parse-better-errors "^1.0.0" 5504 json-parse-better-errors "^1.0.0"
@@ -5501,14 +5507,17 @@ node-fetch-npm@^2.0.2:
5501node-forge@^0.7.1: 5507node-forge@^0.7.1:
5502 version "0.7.6" 5508 version "0.7.6"
5503 resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" 5509 resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
5510 integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==
5504 5511
5505node-gyp-build@~3.4.0: 5512node-gyp-build@~3.4.0:
5506 version "3.4.0" 5513 version "3.4.0"
5507 resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.4.0.tgz#f8f62507e65f152488b28aac25d04b9d79748cf7" 5514 resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.4.0.tgz#f8f62507e65f152488b28aac25d04b9d79748cf7"
5515 integrity sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw==
5508 5516
5509node-gyp@^3.8.0: 5517node-gyp@^3.8.0:
5510 version "3.8.0" 5518 version "3.8.0"
5511 resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 5519 resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
5520 integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
5512 dependencies: 5521 dependencies:
5513 fstream "^1.0.0" 5522 fstream "^1.0.0"
5514 glob "^7.0.3" 5523 glob "^7.0.3"
@@ -5523,17 +5532,18 @@ node-gyp@^3.8.0:
5523 tar "^2.0.0" 5532 tar "^2.0.0"
5524 which "1" 5533 which "1"
5525 5534
5526node-pre-gyp@0.9.1: 5535node-pre-gyp@0.11.0, node-pre-gyp@~0.11.0:
5527 version "0.9.1" 5536 version "0.11.0"
5528 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" 5537 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054"
5538 integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==
5529 dependencies: 5539 dependencies:
5530 detect-libc "^1.0.2" 5540 detect-libc "^1.0.2"
5531 mkdirp "^0.5.1" 5541 mkdirp "^0.5.1"
5532 needle "^2.2.0" 5542 needle "^2.2.1"
5533 nopt "^4.0.1" 5543 nopt "^4.0.1"
5534 npm-packlist "^1.1.6" 5544 npm-packlist "^1.1.6"
5535 npmlog "^4.0.2" 5545 npmlog "^4.0.2"
5536 rc "^1.1.7" 5546 rc "^1.2.7"
5537 rimraf "^2.6.1" 5547 rimraf "^2.6.1"
5538 semver "^5.3.0" 5548 semver "^5.3.0"
5539 tar "^4" 5549 tar "^4"
@@ -5541,6 +5551,7 @@ node-pre-gyp@0.9.1:
5541node-pre-gyp@^0.10.0: 5551node-pre-gyp@^0.10.0:
5542 version "0.10.3" 5552 version "0.10.3"
5543 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 5553 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
5554 integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==
5544 dependencies: 5555 dependencies:
5545 detect-libc "^1.0.2" 5556 detect-libc "^1.0.2"
5546 mkdirp "^0.5.1" 5557 mkdirp "^0.5.1"
@@ -5553,78 +5564,45 @@ node-pre-gyp@^0.10.0:
5553 semver "^5.3.0" 5564 semver "^5.3.0"
5554 tar "^4" 5565 tar "^4"
5555 5566
5556node-pre-gyp@~0.11.0:
5557 version "0.11.0"
5558 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054"
5559 dependencies:
5560 detect-libc "^1.0.2"
5561 mkdirp "^0.5.1"
5562 needle "^2.2.1"
5563 nopt "^4.0.1"
5564 npm-packlist "^1.1.6"
5565 npmlog "^4.0.2"
5566 rc "^1.2.7"
5567 rimraf "^2.6.1"
5568 semver "^5.3.0"
5569 tar "^4"
5570
5571node-sass@^4.9.0:
5572 version "4.9.3"
5573 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224"
5574 dependencies:
5575 async-foreach "^0.1.3"
5576 chalk "^1.1.1"
5577 cross-spawn "^3.0.0"
5578 gaze "^1.0.0"
5579 get-stdin "^4.0.1"
5580 glob "^7.0.3"
5581 in-publish "^2.0.0"
5582 lodash.assign "^4.2.0"
5583 lodash.clonedeep "^4.3.2"
5584 lodash.mergewith "^4.6.0"
5585 meow "^3.7.0"
5586 mkdirp "^0.5.1"
5587 nan "^2.10.0"
5588 node-gyp "^3.8.0"
5589 npmlog "^4.0.0"
5590 request "2.87.0"
5591 sass-graph "^2.2.4"
5592 stdout-stream "^1.4.0"
5593 "true-case-path" "^1.0.2"
5594
5595nodemailer-fetch@1.3.0: 5567nodemailer-fetch@1.3.0:
5596 version "1.3.0" 5568 version "1.3.0"
5597 resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz#9f37f6a5b80c1cb5d697ca2bfbde41a6582a50b0" 5569 resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz#9f37f6a5b80c1cb5d697ca2bfbde41a6582a50b0"
5570 integrity sha1-nzf2pbgMHLXWl8or+95BplgqULA=
5598 5571
5599nodemailer-fetch@1.6.0: 5572nodemailer-fetch@1.6.0:
5600 version "1.6.0" 5573 version "1.6.0"
5601 resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4" 5574 resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4"
5575 integrity sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=
5602 5576
5603nodemailer-shared@1.0.4: 5577nodemailer-shared@1.0.4:
5604 version "1.0.4" 5578 version "1.0.4"
5605 resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz#8b5c5c35bfb29a47dda7d38303f3a4fb47ba38ae" 5579 resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz#8b5c5c35bfb29a47dda7d38303f3a4fb47ba38ae"
5580 integrity sha1-i1xcNb+ymkfdp9ODA/Ok+0e6OK4=
5606 dependencies: 5581 dependencies:
5607 nodemailer-fetch "1.3.0" 5582 nodemailer-fetch "1.3.0"
5608 5583
5609nodemailer-shared@^1.1.0: 5584nodemailer-shared@^1.1.0:
5610 version "1.1.0" 5585 version "1.1.0"
5611 resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0" 5586 resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0"
5587 integrity sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=
5612 dependencies: 5588 dependencies:
5613 nodemailer-fetch "1.6.0" 5589 nodemailer-fetch "1.6.0"
5614 5590
5615nodemailer@^4.4.2: 5591nodemailer@^4.4.2:
5616 version "4.6.8" 5592 version "4.7.0"
5617 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.6.8.tgz#f82fb407828bf2e76d92acc34b823d83e774f89c" 5593 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.7.0.tgz#4420e06abfffd77d0618f184ea49047db84f4ad8"
5594 integrity sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw==
5618 5595
5619nodemon@^1.11.0: 5596nodemon@^1.18.6:
5620 version "1.18.4" 5597 version "1.18.7"
5621 resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.4.tgz#873f65fdb53220eb166180cf106b1354ac5d714d" 5598 resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.7.tgz#716b66bf3e89ac4fcfb38a9e61887a03fc82efbb"
5599 integrity sha512-xuC1V0F5EcEyKQ1VhHYD13owznQbUw29JKvZ8bVH7TmuvVNHvvbp9pLgE4PjTMRJVe0pJ8fGRvwR2nMiosIsPQ==
5622 dependencies: 5600 dependencies:
5623 chokidar "^2.0.2" 5601 chokidar "^2.0.4"
5624 debug "^3.1.0" 5602 debug "^3.1.0"
5625 ignore-by-default "^1.0.1" 5603 ignore-by-default "^1.0.1"
5626 minimatch "^3.0.4" 5604 minimatch "^3.0.4"
5627 pstree.remy "^1.1.0" 5605 pstree.remy "^1.1.2"
5628 semver "^5.5.0" 5606 semver "^5.5.0"
5629 supports-color "^5.2.0" 5607 supports-color "^5.2.0"
5630 touch "^3.1.0" 5608 touch "^3.1.0"
@@ -5634,16 +5612,19 @@ nodemon@^1.11.0:
5634noop-logger@^0.1.1: 5612noop-logger@^0.1.1:
5635 version "0.1.1" 5613 version "0.1.1"
5636 resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 5614 resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
5615 integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
5637 5616
5638"nopt@2 || 3", nopt@~3.0.1, nopt@~3.0.6: 5617"nopt@2 || 3":
5639 version "3.0.6" 5618 version "3.0.6"
5640 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 5619 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
5620 integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
5641 dependencies: 5621 dependencies:
5642 abbrev "1" 5622 abbrev "1"
5643 5623
5644nopt@^4.0.1, nopt@~4.0.1: 5624nopt@^4.0.1, nopt@~4.0.1:
5645 version "4.0.1" 5625 version "4.0.1"
5646 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 5626 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
5627 integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
5647 dependencies: 5628 dependencies:
5648 abbrev "1" 5629 abbrev "1"
5649 osenv "^0.1.4" 5630 osenv "^0.1.4"
@@ -5651,12 +5632,14 @@ nopt@^4.0.1, nopt@~4.0.1:
5651nopt@~1.0.10: 5632nopt@~1.0.10:
5652 version "1.0.10" 5633 version "1.0.10"
5653 resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 5634 resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
5635 integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
5654 dependencies: 5636 dependencies:
5655 abbrev "1" 5637 abbrev "1"
5656 5638
5657normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0: 5639normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0:
5658 version "2.4.0" 5640 version "2.4.0"
5659 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 5641 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
5642 integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==
5660 dependencies: 5643 dependencies:
5661 hosted-git-info "^2.1.4" 5644 hosted-git-info "^2.1.4"
5662 is-builtin-module "^1.0.0" 5645 is-builtin-module "^1.0.0"
@@ -5666,12 +5649,14 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-
5666normalize-path@^2.1.1: 5649normalize-path@^2.1.1:
5667 version "2.1.1" 5650 version "2.1.1"
5668 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 5651 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
5652 integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
5669 dependencies: 5653 dependencies:
5670 remove-trailing-separator "^1.0.1" 5654 remove-trailing-separator "^1.0.1"
5671 5655
5672npm-audit-report@^1.3.1: 5656npm-audit-report@^1.3.1:
5673 version "1.3.1" 5657 version "1.3.1"
5674 resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.1.tgz#e79ea1fcb5ffaf3031102b389d5222c2b0459632" 5658 resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.1.tgz#e79ea1fcb5ffaf3031102b389d5222c2b0459632"
5659 integrity sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==
5675 dependencies: 5660 dependencies:
5676 cli-table3 "^0.5.0" 5661 cli-table3 "^0.5.0"
5677 console-control-strings "^1.1.0" 5662 console-control-strings "^1.1.0"
@@ -5679,20 +5664,24 @@ npm-audit-report@^1.3.1:
5679npm-bundled@^1.0.1: 5664npm-bundled@^1.0.1:
5680 version "1.0.5" 5665 version "1.0.5"
5681 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 5666 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
5667 integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==
5682 5668
5683npm-cache-filename@~1.0.2: 5669npm-cache-filename@~1.0.2:
5684 version "1.0.2" 5670 version "1.0.2"
5685 resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" 5671 resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
5672 integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=
5686 5673
5687npm-install-checks@~3.0.0: 5674npm-install-checks@~3.0.0:
5688 version "3.0.0" 5675 version "3.0.0"
5689 resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" 5676 resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7"
5677 integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=
5690 dependencies: 5678 dependencies:
5691 semver "^2.3.0 || 3.x || 4 || 5" 5679 semver "^2.3.0 || 3.x || 4 || 5"
5692 5680
5693npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: 5681npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0:
5694 version "2.1.0" 5682 version "2.1.0"
5695 resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569" 5683 resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569"
5684 integrity sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g==
5696 dependencies: 5685 dependencies:
5697 byline "^5.0.0" 5686 byline "^5.0.0"
5698 graceful-fs "^4.1.11" 5687 graceful-fs "^4.1.11"
@@ -5706,10 +5695,12 @@ npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0:
5706npm-logical-tree@^1.2.1: 5695npm-logical-tree@^1.2.1:
5707 version "1.2.1" 5696 version "1.2.1"
5708 resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" 5697 resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88"
5698 integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==
5709 5699
5710"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^5.1.2 || 6", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: 5700"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^5.1.2 || 6", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
5711 version "6.1.0" 5701 version "6.1.0"
5712 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" 5702 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
5703 integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==
5713 dependencies: 5704 dependencies:
5714 hosted-git-info "^2.6.0" 5705 hosted-git-info "^2.6.0"
5715 osenv "^0.1.5" 5706 osenv "^0.1.5"
@@ -5717,8 +5708,9 @@ npm-logical-tree@^1.2.1:
5717 validate-npm-package-name "^3.0.0" 5708 validate-npm-package-name "^3.0.0"
5718 5709
5719npm-packlist@^1.1.10, npm-packlist@^1.1.11, npm-packlist@^1.1.6: 5710npm-packlist@^1.1.10, npm-packlist@^1.1.11, npm-packlist@^1.1.6:
5720 version "1.1.11" 5711 version "1.1.12"
5721 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" 5712 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
5713 integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==
5722 dependencies: 5714 dependencies:
5723 ignore-walk "^3.0.1" 5715 ignore-walk "^3.0.1"
5724 npm-bundled "^1.0.1" 5716 npm-bundled "^1.0.1"
@@ -5726,19 +5718,23 @@ npm-packlist@^1.1.10, npm-packlist@^1.1.11, npm-packlist@^1.1.6:
5726npm-path@^2.0.2: 5718npm-path@^2.0.2:
5727 version "2.0.4" 5719 version "2.0.4"
5728 resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" 5720 resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
5721 integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==
5729 dependencies: 5722 dependencies:
5730 which "^1.2.10" 5723 which "^1.2.10"
5731 5724
5732npm-pick-manifest@^2.1.0: 5725npm-pick-manifest@^2.1.0:
5733 version "2.1.0" 5726 version "2.2.3"
5734 resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz#dc381bdd670c35d81655e1d5a94aa3dd4d87fce5" 5727 resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40"
5728 integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==
5735 dependencies: 5729 dependencies:
5730 figgy-pudding "^3.5.1"
5736 npm-package-arg "^6.0.0" 5731 npm-package-arg "^6.0.0"
5737 semver "^5.4.1" 5732 semver "^5.4.1"
5738 5733
5739npm-profile@^3.0.2: 5734npm-profile@^3.0.2:
5740 version "3.0.2" 5735 version "3.0.2"
5741 resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-3.0.2.tgz#58d568f1b56ef769602fd0aed8c43fa0e0de0f57" 5736 resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-3.0.2.tgz#58d568f1b56ef769602fd0aed8c43fa0e0de0f57"
5737 integrity sha512-rEJOFR6PbwOvvhGa2YTNOJQKNuc6RovJ6T50xPU7pS9h/zKPNCJ+VHZY2OFXyZvEi+UQYtHRTp8O/YM3tUD20A==
5742 dependencies: 5738 dependencies:
5743 aproba "^1.1.2 || 2" 5739 aproba "^1.1.2 || 2"
5744 make-fetch-happen "^2.5.0 || 3 || 4" 5740 make-fetch-happen "^2.5.0 || 3 || 4"
@@ -5746,6 +5742,7 @@ npm-profile@^3.0.2:
5746npm-registry-client@^8.6.0: 5742npm-registry-client@^8.6.0:
5747 version "8.6.0" 5743 version "8.6.0"
5748 resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" 5744 resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4"
5745 integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==
5749 dependencies: 5746 dependencies:
5750 concat-stream "^1.5.2" 5747 concat-stream "^1.5.2"
5751 graceful-fs "^4.1.6" 5748 graceful-fs "^4.1.6"
@@ -5764,6 +5761,7 @@ npm-registry-client@^8.6.0:
5764npm-registry-fetch@^1.1.0: 5761npm-registry-fetch@^1.1.0:
5765 version "1.1.1" 5762 version "1.1.1"
5766 resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-1.1.1.tgz#710bc5947d9ee2c549375072dab6d5d17baf2eb2" 5763 resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-1.1.1.tgz#710bc5947d9ee2c549375072dab6d5d17baf2eb2"
5764 integrity sha512-ev+zxOXsgAqRsR8Rk+ErjgWOlbrXcqGdme94/VNdjDo1q8TSy10Pp8xgDv/ZmMk2jG/KvGtXUNG4GS3+l6xbDw==
5767 dependencies: 5765 dependencies:
5768 bluebird "^3.5.1" 5766 bluebird "^3.5.1"
5769 figgy-pudding "^3.0.0" 5767 figgy-pudding "^3.0.0"
@@ -5775,6 +5773,7 @@ npm-registry-fetch@^1.1.0:
5775npm-registry-fetch@^3.0.0: 5773npm-registry-fetch@^3.0.0:
5776 version "3.8.0" 5774 version "3.8.0"
5777 resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc" 5775 resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc"
5776 integrity sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==
5778 dependencies: 5777 dependencies:
5779 JSONStream "^1.3.4" 5778 JSONStream "^1.3.4"
5780 bluebird "^3.5.1" 5779 bluebird "^3.5.1"
@@ -5786,24 +5785,28 @@ npm-registry-fetch@^3.0.0:
5786npm-run-path@^2.0.0: 5785npm-run-path@^2.0.0:
5787 version "2.0.2" 5786 version "2.0.2"
5788 resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 5787 resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
5788 integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
5789 dependencies: 5789 dependencies:
5790 path-key "^2.0.0" 5790 path-key "^2.0.0"
5791 5791
5792npm-user-validate@~1.0.0: 5792npm-user-validate@~1.0.0:
5793 version "1.0.0" 5793 version "1.0.0"
5794 resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" 5794 resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951"
5795 integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE=
5795 5796
5796npm-which@^3.0.1: 5797npm-which@^3.0.1:
5797 version "3.0.1" 5798 version "3.0.1"
5798 resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" 5799 resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
5800 integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=
5799 dependencies: 5801 dependencies:
5800 commander "^2.9.0" 5802 commander "^2.9.0"
5801 npm-path "^2.0.2" 5803 npm-path "^2.0.2"
5802 which "^1.2.10" 5804 which "^1.2.10"
5803 5805
5804npm@^6.4.1: 5806npm@*:
5805 version "6.4.1" 5807 version "6.4.1"
5806 resolved "https://registry.yarnpkg.com/npm/-/npm-6.4.1.tgz#4f39f9337b557a28faed4a771d5c8802d6b4288b" 5808 resolved "https://registry.yarnpkg.com/npm/-/npm-6.4.1.tgz#4f39f9337b557a28faed4a771d5c8802d6b4288b"
5809 integrity sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==
5807 dependencies: 5810 dependencies:
5808 JSONStream "^1.3.4" 5811 JSONStream "^1.3.4"
5809 abbrev "~1.1.1" 5812 abbrev "~1.1.1"
@@ -5915,40 +5918,30 @@ npm@^6.4.1:
5915 worker-farm "^1.6.0" 5918 worker-farm "^1.6.0"
5916 write-file-atomic "^2.3.0" 5919 write-file-atomic "^2.3.0"
5917 5920
5918"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: 5921"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2:
5919 version "4.1.2" 5922 version "4.1.2"
5920 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 5923 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
5924 integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
5921 dependencies: 5925 dependencies:
5922 are-we-there-yet "~1.1.2" 5926 are-we-there-yet "~1.1.2"
5923 console-control-strings "~1.1.0" 5927 console-control-strings "~1.1.0"
5924 gauge "~2.7.3" 5928 gauge "~2.7.3"
5925 set-blocking "~2.0.0" 5929 set-blocking "~2.0.0"
5926 5930
5927nsdeclare@0.1.0:
5928 version "0.1.0"
5929 resolved "https://registry.yarnpkg.com/nsdeclare/-/nsdeclare-0.1.0.tgz#10daa153642382d3cf2c01a916f4eb20a128b19f"
5930
5931nth-check@~1.0.0:
5932 version "1.0.1"
5933 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
5934 dependencies:
5935 boolbase "~1.0.0"
5936
5937number-is-nan@^1.0.0: 5931number-is-nan@^1.0.0:
5938 version "1.0.1" 5932 version "1.0.1"
5939 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 5933 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
5940 5934 integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
5941oauth-sign@~0.8.2:
5942 version "0.8.2"
5943 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
5944 5935
5945oauth-sign@~0.9.0: 5936oauth-sign@~0.9.0:
5946 version "0.9.0" 5937 version "0.9.0"
5947 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 5938 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
5939 integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
5948 5940
5949oauth2-server@3.0.0: 5941oauth2-server@3.0.0:
5950 version "3.0.0" 5942 version "3.0.0"
5951 resolved "https://registry.yarnpkg.com/oauth2-server/-/oauth2-server-3.0.0.tgz#c46276b74c3d28634d59ee981f76b58a6459cc28" 5943 resolved "https://registry.yarnpkg.com/oauth2-server/-/oauth2-server-3.0.0.tgz#c46276b74c3d28634d59ee981f76b58a6459cc28"
5944 integrity sha1-xGJ2t0w9KGNNWe6YH3a1imRZzCg=
5952 dependencies: 5945 dependencies:
5953 basic-auth "1.1.0" 5946 basic-auth "1.1.0"
5954 bluebird "3.5.0" 5947 bluebird "3.5.0"
@@ -5960,22 +5953,22 @@ oauth2-server@3.0.0:
5960object-assign@4.1.0: 5953object-assign@4.1.0:
5961 version "4.1.0" 5954 version "4.1.0"
5962 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 5955 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
5956 integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A=
5963 5957
5964object-assign@^3.0.0: 5958object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
5965 version "3.0.0"
5966 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
5967
5968object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0:
5969 version "4.1.1" 5959 version "4.1.1"
5970 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 5960 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
5961 integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
5971 5962
5972object-component@0.0.3: 5963object-component@0.0.3:
5973 version "0.0.3" 5964 version "0.0.3"
5974 resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 5965 resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
5966 integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
5975 5967
5976object-copy@^0.1.0: 5968object-copy@^0.1.0:
5977 version "0.1.0" 5969 version "0.1.0"
5978 resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 5970 resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
5971 integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
5979 dependencies: 5972 dependencies:
5980 copy-descriptor "^0.1.0" 5973 copy-descriptor "^0.1.0"
5981 define-property "^0.2.5" 5974 define-property "^0.2.5"
@@ -5984,68 +5977,88 @@ object-copy@^0.1.0:
5984object-keys@^1.0.12: 5977object-keys@^1.0.12:
5985 version "1.0.12" 5978 version "1.0.12"
5986 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" 5979 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
5980 integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==
5987 5981
5988object-visit@^1.0.0: 5982object-visit@^1.0.0:
5989 version "1.0.1" 5983 version "1.0.1"
5990 resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 5984 resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
5985 integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
5991 dependencies: 5986 dependencies:
5992 isobject "^3.0.0" 5987 isobject "^3.0.0"
5993 5988
5994object.pick@^1.3.0: 5989object.pick@^1.3.0:
5995 version "1.3.0" 5990 version "1.3.0"
5996 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 5991 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
5992 integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
5997 dependencies: 5993 dependencies:
5998 isobject "^3.0.1" 5994 isobject "^3.0.1"
5999 5995
6000on-finished@^2.3.0, on-finished@~2.3.0: 5996on-finished@^2.3.0, on-finished@~2.3.0:
6001 version "2.3.0" 5997 version "2.3.0"
6002 resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 5998 resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
5999 integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
6003 dependencies: 6000 dependencies:
6004 ee-first "1.1.1" 6001 ee-first "1.1.1"
6005 6002
6006on-headers@~1.0.1: 6003on-headers@~1.0.1:
6007 version "1.0.1" 6004 version "1.0.1"
6008 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 6005 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
6006 integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=
6009 6007
6010once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: 6008once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0:
6011 version "1.4.0" 6009 version "1.4.0"
6012 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 6010 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
6011 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
6013 dependencies: 6012 dependencies:
6014 wrappy "1" 6013 wrappy "1"
6015 6014
6016one-time@0.0.4: 6015one-time@0.0.4:
6017 version "0.0.4" 6016 version "0.0.4"
6018 resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" 6017 resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
6018 integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=
6019 6019
6020onetime@^1.0.0: 6020onetime@^1.0.0:
6021 version "1.1.0" 6021 version "1.1.0"
6022 resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 6022 resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
6023 integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
6024
6025onetime@^2.0.0:
6026 version "2.0.1"
6027 resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
6028 integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
6029 dependencies:
6030 mimic-fn "^1.0.0"
6031
6032ono@^4.0.10:
6033 version "4.0.10"
6034 resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.10.tgz#f7f9c6d1b76270a499d8664c95a740d44175134c"
6035 integrity sha512-4Xz4hlbq7MzV0I3vKfZwRvyj8tCbXODqBNzFqtkjP+KTV93zzDRju8kw1qnf6P5kcZ2+xlIq6wSCqA+euSKxhA==
6036 dependencies:
6037 format-util "^1.0.3"
6023 6038
6024open@0.0.5: 6039open@0.0.5:
6025 version "0.0.5" 6040 version "0.0.5"
6026 resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" 6041 resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
6042 integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=
6043
6044openapi-schema-validation@^0.4.2:
6045 version "0.4.2"
6046 resolved "https://registry.yarnpkg.com/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz#895c29021be02e000f71c51f859da52118eb1e21"
6047 integrity sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==
6048 dependencies:
6049 jsonschema "1.2.4"
6050 jsonschema-draft4 "^1.0.0"
6051 swagger-schema-official "2.0.0-bab6bed"
6027 6052
6028opener@^1.5.0: 6053opener@^1.5.0:
6029 version "1.5.1" 6054 version "1.5.1"
6030 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" 6055 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
6031 6056 integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
6032opn@^4.0.0:
6033 version "4.0.2"
6034 resolved "http://registry.npmjs.org/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
6035 dependencies:
6036 object-assign "^4.0.1"
6037 pinkie-promise "^2.0.0"
6038
6039optimist@^0.6.1:
6040 version "0.6.1"
6041 resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
6042 dependencies:
6043 minimist "~0.0.1"
6044 wordwrap "~0.0.2"
6045 6057
6046optionator@^0.8.1: 6058optionator@^0.8.1:
6047 version "0.8.2" 6059 version "0.8.2"
6048 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 6060 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
6061 integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
6049 dependencies: 6062 dependencies:
6050 deep-is "~0.1.3" 6063 deep-is "~0.1.3"
6051 fast-levenshtein "~2.0.4" 6064 fast-levenshtein "~2.0.4"
@@ -6057,20 +6070,17 @@ optionator@^0.8.1:
6057options@>=0.0.5: 6070options@>=0.0.5:
6058 version "0.0.6" 6071 version "0.0.6"
6059 resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" 6072 resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
6073 integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=
6060 6074
6061os-homedir@^1.0.0, os-homedir@^1.0.1: 6075os-homedir@^1.0.0, os-homedir@^1.0.1:
6062 version "1.0.2" 6076 version "1.0.2"
6063 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 6077 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
6064 6078 integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
6065os-locale@^1.4.0:
6066 version "1.4.0"
6067 resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
6068 dependencies:
6069 lcid "^1.0.0"
6070 6079
6071os-locale@^2.0.0: 6080os-locale@^2.0.0:
6072 version "2.1.0" 6081 version "2.1.0"
6073 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 6082 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
6083 integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
6074 dependencies: 6084 dependencies:
6075 execa "^0.7.0" 6085 execa "^0.7.0"
6076 lcid "^1.0.0" 6086 lcid "^1.0.0"
@@ -6079,18 +6089,21 @@ os-locale@^2.0.0:
6079os-locale@^3.0.0: 6089os-locale@^3.0.0:
6080 version "3.0.1" 6090 version "3.0.1"
6081 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" 6091 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620"
6092 integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==
6082 dependencies: 6093 dependencies:
6083 execa "^0.10.0" 6094 execa "^0.10.0"
6084 lcid "^2.0.0" 6095 lcid "^2.0.0"
6085 mem "^4.0.0" 6096 mem "^4.0.0"
6086 6097
6087os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: 6098os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
6088 version "1.0.2" 6099 version "1.0.2"
6089 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 6100 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
6101 integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
6090 6102
6091osenv@0, osenv@^0.1.4, osenv@^0.1.5: 6103osenv@0, osenv@^0.1.4, osenv@^0.1.5:
6092 version "0.1.5" 6104 version "0.1.5"
6093 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 6105 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
6106 integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
6094 dependencies: 6107 dependencies:
6095 os-homedir "^1.0.0" 6108 os-homedir "^1.0.0"
6096 os-tmpdir "^1.0.0" 6109 os-tmpdir "^1.0.0"
@@ -6098,60 +6111,77 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5:
6098p-defer@^1.0.0: 6111p-defer@^1.0.0:
6099 version "1.0.0" 6112 version "1.0.0"
6100 resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 6113 resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
6114 integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
6101 6115
6102p-finally@^1.0.0: 6116p-finally@^1.0.0:
6103 version "1.0.0" 6117 version "1.0.0"
6104 resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 6118 resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
6119 integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
6105 6120
6106p-is-promise@^1.1.0: 6121p-is-promise@^1.1.0:
6107 version "1.1.0" 6122 version "1.1.0"
6108 resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" 6123 resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
6124 integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=
6109 6125
6110p-limit@^1.1.0: 6126p-limit@^1.1.0:
6111 version "1.3.0" 6127 version "1.3.0"
6112 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 6128 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
6129 integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
6113 dependencies: 6130 dependencies:
6114 p-try "^1.0.0" 6131 p-try "^1.0.0"
6115 6132
6116p-limit@^2.0.0: 6133p-limit@^2.0.0:
6117 version "2.0.0" 6134 version "2.0.0"
6118 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" 6135 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
6136 integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==
6119 dependencies: 6137 dependencies:
6120 p-try "^2.0.0" 6138 p-try "^2.0.0"
6121 6139
6122p-locate@^2.0.0: 6140p-locate@^2.0.0:
6123 version "2.0.0" 6141 version "2.0.0"
6124 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 6142 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
6143 integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
6125 dependencies: 6144 dependencies:
6126 p-limit "^1.1.0" 6145 p-limit "^1.1.0"
6127 6146
6128p-locate@^3.0.0: 6147p-locate@^3.0.0:
6129 version "3.0.0" 6148 version "3.0.0"
6130 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 6149 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
6150 integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
6131 dependencies: 6151 dependencies:
6132 p-limit "^2.0.0" 6152 p-limit "^2.0.0"
6133 6153
6134p-map@^1.1.1: 6154p-map@^1.1.1:
6135 version "1.2.0" 6155 version "1.2.0"
6136 resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 6156 resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
6157 integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
6158
6159p-map@^2.0.0:
6160 version "2.0.0"
6161 resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50"
6162 integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==
6137 6163
6138p-try@^1.0.0: 6164p-try@^1.0.0:
6139 version "1.0.0" 6165 version "1.0.0"
6140 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 6166 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
6167 integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
6141 6168
6142p-try@^2.0.0: 6169p-try@^2.0.0:
6143 version "2.0.0" 6170 version "2.0.0"
6144 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" 6171 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
6172 integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
6145 6173
6146package-json-versionify@^1.0.2: 6174package-json-versionify@^1.0.2:
6147 version "1.0.4" 6175 version "1.0.4"
6148 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17" 6176 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
6177 integrity sha1-WGBYepRIc6a35tJujlH/siMVvxc=
6149 dependencies: 6178 dependencies:
6150 browserify-package-json "^1.0.0" 6179 browserify-package-json "^1.0.0"
6151 6180
6152package-json@^4.0.0: 6181package-json@^4.0.0:
6153 version "4.0.1" 6182 version "4.0.1"
6154 resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 6183 resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
6184 integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
6155 dependencies: 6185 dependencies:
6156 got "^6.7.1" 6186 got "^6.7.1"
6157 registry-auth-token "^3.0.1" 6187 registry-auth-token "^3.0.1"
@@ -6161,10 +6191,12 @@ package-json@^4.0.0:
6161packet-reader@0.3.1: 6191packet-reader@0.3.1:
6162 version "0.3.1" 6192 version "0.3.1"
6163 resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" 6193 resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27"
6194 integrity sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=
6164 6195
6165pacote@^8.1.6: 6196pacote@^8.1.6:
6166 version "8.1.6" 6197 version "8.1.6"
6167 resolved "https://registry.yarnpkg.com/pacote/-/pacote-8.1.6.tgz#8e647564d38156367e7a9dc47a79ca1ab278d46e" 6198 resolved "https://registry.yarnpkg.com/pacote/-/pacote-8.1.6.tgz#8e647564d38156367e7a9dc47a79ca1ab278d46e"
6199 integrity sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw==
6168 dependencies: 6200 dependencies:
6169 bluebird "^3.5.1" 6201 bluebird "^3.5.1"
6170 cacache "^11.0.2" 6202 cacache "^11.0.2"
@@ -6195,20 +6227,16 @@ pacote@^8.1.6:
6195parallel-transform@^1.1.0: 6227parallel-transform@^1.1.0:
6196 version "1.1.0" 6228 version "1.1.0"
6197 resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" 6229 resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
6230 integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=
6198 dependencies: 6231 dependencies:
6199 cyclist "~0.2.2" 6232 cyclist "~0.2.2"
6200 inherits "^2.0.3" 6233 inherits "^2.0.3"
6201 readable-stream "^2.1.5" 6234 readable-stream "^2.1.5"
6202 6235
6203parse-json@^2.2.0:
6204 version "2.2.0"
6205 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
6206 dependencies:
6207 error-ex "^1.2.0"
6208
6209parse-json@^4.0.0: 6236parse-json@^4.0.0:
6210 version "4.0.0" 6237 version "4.0.0"
6211 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 6238 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
6239 integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
6212 dependencies: 6240 dependencies:
6213 error-ex "^1.3.1" 6241 error-ex "^1.3.1"
6214 json-parse-better-errors "^1.0.1" 6242 json-parse-better-errors "^1.0.1"
@@ -6216,10 +6244,12 @@ parse-json@^4.0.0:
6216parse-numeric-range@^0.0.2: 6244parse-numeric-range@^0.0.2:
6217 version "0.0.2" 6245 version "0.0.2"
6218 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz#b4f09d413c7adbcd987f6e9233c7b4b210c938e4" 6246 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz#b4f09d413c7adbcd987f6e9233c7b4b210c938e4"
6247 integrity sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=
6219 6248
6220parse-torrent@^6.0.0, parse-torrent@^6.1.2: 6249parse-torrent@^6.0.0, parse-torrent@^6.1.2:
6221 version "6.1.2" 6250 version "6.1.2"
6222 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-6.1.2.tgz#99da5bdd23435a1cb7e8e7a63847c4efb21b1956" 6251 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-6.1.2.tgz#99da5bdd23435a1cb7e8e7a63847c4efb21b1956"
6252 integrity sha512-Z/vig84sHwtrTEbOzisT4xnYTFlOgAaLQccPruMPgRahZUppVE/BUXzAos3jZM7c64o0lfukQdQ4ozWa5lN39w==
6223 dependencies: 6253 dependencies:
6224 bencode "^2.0.0" 6254 bencode "^2.0.0"
6225 blob-to-buffer "^1.2.6" 6255 blob-to-buffer "^1.2.6"
@@ -6232,142 +6262,126 @@ parse-torrent@^6.0.0, parse-torrent@^6.1.2:
6232parsejson@0.0.3: 6262parsejson@0.0.3:
6233 version "0.0.3" 6263 version "0.0.3"
6234 resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" 6264 resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
6265 integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=
6235 dependencies: 6266 dependencies:
6236 better-assert "~1.0.0" 6267 better-assert "~1.0.0"
6237 6268
6238parseqs@0.0.5: 6269parseqs@0.0.5:
6239 version "0.0.5" 6270 version "0.0.5"
6240 resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 6271 resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
6272 integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
6241 dependencies: 6273 dependencies:
6242 better-assert "~1.0.0" 6274 better-assert "~1.0.0"
6243 6275
6244parseuri@0.0.5: 6276parseuri@0.0.5:
6245 version "0.0.5" 6277 version "0.0.5"
6246 resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 6278 resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
6279 integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
6247 dependencies: 6280 dependencies:
6248 better-assert "~1.0.0" 6281 better-assert "~1.0.0"
6249 6282
6250parseurl@~1.3.1, parseurl@~1.3.2: 6283parseurl@~1.3.1, parseurl@~1.3.2:
6251 version "1.3.2" 6284 version "1.3.2"
6252 resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 6285 resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
6286 integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=
6253 6287
6254pascalcase@^0.1.1: 6288pascalcase@^0.1.1:
6255 version "0.1.1" 6289 version "0.1.1"
6256 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 6290 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
6291 integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
6257 6292
6258password-generator@^2.0.2: 6293password-generator@^2.0.2:
6259 version "2.2.0" 6294 version "2.2.0"
6260 resolved "https://registry.yarnpkg.com/password-generator/-/password-generator-2.2.0.tgz#fc75cff795110923e054a5a71623433240bf5e49" 6295 resolved "https://registry.yarnpkg.com/password-generator/-/password-generator-2.2.0.tgz#fc75cff795110923e054a5a71623433240bf5e49"
6296 integrity sha1-/HXP95URCSPgVKWnFiNDMkC/Xkk=
6261 dependencies: 6297 dependencies:
6262 yargs-parser "^8.0.0" 6298 yargs-parser "^8.0.0"
6263 6299
6264path-dirname@^1.0.0: 6300path-dirname@^1.0.0:
6265 version "1.0.2" 6301 version "1.0.2"
6266 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 6302 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
6267 6303 integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
6268path-exists@^2.0.0:
6269 version "2.1.0"
6270 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
6271 dependencies:
6272 pinkie-promise "^2.0.0"
6273 6304
6274path-exists@^3.0.0: 6305path-exists@^3.0.0:
6275 version "3.0.0" 6306 version "3.0.0"
6276 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 6307 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
6308 integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
6277 6309
6278path-is-absolute@^1.0.0, path-is-absolute@~1.0.0: 6310path-is-absolute@^1.0.0:
6279 version "1.0.1" 6311 version "1.0.1"
6280 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 6312 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
6313 integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
6281 6314
6282path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: 6315path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2:
6283 version "1.0.2" 6316 version "1.0.2"
6284 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 6317 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
6318 integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
6285 6319
6286path-key@^2.0.0, path-key@^2.0.1: 6320path-key@^2.0.0, path-key@^2.0.1:
6287 version "2.0.1" 6321 version "2.0.1"
6288 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 6322 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
6289 6323 integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
6290path-loader@^1.0.2:
6291 version "1.0.9"
6292 resolved "https://registry.yarnpkg.com/path-loader/-/path-loader-1.0.9.tgz#4f204ada1a477db2a572fce382029c3f24dc5237"
6293 dependencies:
6294 native-promise-only "^0.8.1"
6295 superagent "^3.8.3"
6296 6324
6297path-parse@^1.0.5: 6325path-parse@^1.0.5:
6298 version "1.0.6" 6326 version "1.0.6"
6299 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 6327 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
6328 integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
6300 6329
6301path-to-regexp@0.1.7: 6330path-to-regexp@0.1.7:
6302 version "0.1.7" 6331 version "0.1.7"
6303 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 6332 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
6333 integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
6304 6334
6305path-type@^1.0.0: 6335pathval@^1.1.0:
6306 version "1.1.0"
6307 resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
6308 dependencies:
6309 graceful-fs "^4.1.2"
6310 pify "^2.0.0"
6311 pinkie-promise "^2.0.0"
6312
6313pathval@^1.0.0:
6314 version "1.1.0" 6336 version "1.1.0"
6315 resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 6337 resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
6316 6338 integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
6317pause-stream@^0.0.11:
6318 version "0.0.11"
6319 resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
6320 dependencies:
6321 through "~2.3"
6322 6339
6323peek-stream@^1.1.1: 6340peek-stream@^1.1.1:
6324 version "1.1.3" 6341 version "1.1.3"
6325 resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" 6342 resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67"
6343 integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==
6326 dependencies: 6344 dependencies:
6327 buffer-from "^1.0.0" 6345 buffer-from "^1.0.0"
6328 duplexify "^3.5.0" 6346 duplexify "^3.5.0"
6329 through2 "^2.0.3" 6347 through2 "^2.0.3"
6330 6348
6331pem@^1.12.3: 6349pem@^1.12.3:
6332 version "1.13.1" 6350 version "1.13.2"
6333 resolved "https://registry.yarnpkg.com/pem/-/pem-1.13.1.tgz#57dd3e0c044fbcf709db026a737e1aad7dc8330f" 6351 resolved "https://registry.yarnpkg.com/pem/-/pem-1.13.2.tgz#7b68acbb590fdc13772bca487983cb84cd7b443e"
6352 integrity sha512-MPJWuEb/r6AG+GpZi2JnfNtGAZDeL/8+ERKwXEWRuST5i+4lq/Uy36B352OWIUSPQGH+HR1HEDcIDi+8cKxXNg==
6334 dependencies: 6353 dependencies:
6335 es6-promisify "^6.0.0" 6354 es6-promisify "^6.0.0"
6336 md5 "^2.2.1" 6355 md5 "^2.2.1"
6337 os-tmpdir "^1.0.1" 6356 os-tmpdir "^1.0.1"
6338 which "^1.3.1" 6357 which "^1.3.1"
6339 6358
6340pend@~1.2.0:
6341 version "1.2.0"
6342 resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
6343
6344performance-now@^2.1.0: 6359performance-now@^2.1.0:
6345 version "2.1.0" 6360 version "2.1.0"
6346 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 6361 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
6362 integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
6347 6363
6348pfeed@^1.1.6: 6364pfeed@^1.1.6:
6349 version "1.1.6" 6365 version "1.1.6"
6350 resolved "https://registry.yarnpkg.com/pfeed/-/pfeed-1.1.6.tgz#0de2a1c40b116fa236227237fa264c7956c185e8" 6366 resolved "https://registry.yarnpkg.com/pfeed/-/pfeed-1.1.6.tgz#0de2a1c40b116fa236227237fa264c7956c185e8"
6367 integrity sha512-C3WYILHWOXXlBNqsUhaYdg8ZCHfcEJj7VDbfEXZAru06jI5C9IeRFhSGTl3eRaC8jE8My1mM0xdIGfaEkGaHzA==
6351 dependencies: 6368 dependencies:
6352 xml "^1.0.1" 6369 xml "^1.0.1"
6353 6370
6354pg-connection-string@0.1.3: 6371pg-connection-string@0.1.3:
6355 version "0.1.3" 6372 version "0.1.3"
6356 resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" 6373 resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7"
6374 integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=
6357 6375
6358pg-hstore@^2.3.2: 6376pg-pool@^2.0.4:
6359 version "2.3.2" 6377 version "2.0.4"
6360 resolved "https://registry.yarnpkg.com/pg-hstore/-/pg-hstore-2.3.2.tgz#f7ef053e7b9b892ae986af2f7cbe86432dfcf24f" 6378 resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.4.tgz#05ad0f2d9437d89c94ccc4f4d0a44ac65ade865b"
6361 dependencies: 6379 integrity sha512-Mi2AsmlFkVMpI28NreaDkz5DkfxLOG16C/HNwi091LDlOiDiQACtAroLxSd1vIS2imBqxdjjO9cQZg2CwsOPbw==
6362 underscore "^1.7.0"
6363
6364pg-pool@~2.0.3:
6365 version "2.0.3"
6366 resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.3.tgz#c022032c8949f312a4f91fb6409ce04076be3257"
6367 6380
6368pg-types@~1.12.1: 6381pg-types@~1.12.1:
6369 version "1.12.1" 6382 version "1.12.1"
6370 resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2" 6383 resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2"
6384 integrity sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=
6371 dependencies: 6385 dependencies:
6372 postgres-array "~1.0.0" 6386 postgres-array "~1.0.0"
6373 postgres-bytea "~1.0.0" 6387 postgres-bytea "~1.0.0"
@@ -6375,13 +6389,14 @@ pg-types@~1.12.1:
6375 postgres-interval "^1.1.0" 6389 postgres-interval "^1.1.0"
6376 6390
6377pg@^7.4.1: 6391pg@^7.4.1:
6378 version "7.4.3" 6392 version "7.7.1"
6379 resolved "https://registry.yarnpkg.com/pg/-/pg-7.4.3.tgz#f7b6f93f5340ecc2596afbb94a13e3d6b609834b" 6393 resolved "https://registry.yarnpkg.com/pg/-/pg-7.7.1.tgz#546b192ff484322b69689391f885de3ba91a30d4"
6394 integrity sha512-p3I0mXOmUvCoVlCMFW6iYSrnguPol6q8He15NGgSIdM3sPGjFc+8JGCeKclw8ZR4ETd+Jxy2KNiaPUcocHZeMw==
6380 dependencies: 6395 dependencies:
6381 buffer-writer "1.0.1" 6396 buffer-writer "2.0.0"
6382 packet-reader "0.3.1" 6397 packet-reader "0.3.1"
6383 pg-connection-string "0.1.3" 6398 pg-connection-string "0.1.3"
6384 pg-pool "~2.0.3" 6399 pg-pool "^2.0.4"
6385 pg-types "~1.12.1" 6400 pg-types "~1.12.1"
6386 pgpass "1.x" 6401 pgpass "1.x"
6387 semver "4.3.2" 6402 semver "4.3.2"
@@ -6389,133 +6404,117 @@ pg@^7.4.1:
6389pgpass@1.x: 6404pgpass@1.x:
6390 version "1.0.2" 6405 version "1.0.2"
6391 resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" 6406 resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306"
6407 integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=
6392 dependencies: 6408 dependencies:
6393 split "^1.0.0" 6409 split "^1.0.0"
6394 6410
6395phantom@~4.0.1:
6396 version "4.0.12"
6397 resolved "https://registry.yarnpkg.com/phantom/-/phantom-4.0.12.tgz#78d18cf3f2a76fea4909f6160fcabf2742d7dbf0"
6398 dependencies:
6399 phantomjs-prebuilt "^2.1.16"
6400 split "^1.0.1"
6401 winston "^2.4.0"
6402
6403phantomjs-prebuilt@^2.1.16, phantomjs-prebuilt@~2.1.7:
6404 version "2.1.16"
6405 resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef"
6406 dependencies:
6407 es6-promise "^4.0.3"
6408 extract-zip "^1.6.5"
6409 fs-extra "^1.0.0"
6410 hasha "^2.2.0"
6411 kew "^0.7.0"
6412 progress "^1.1.8"
6413 request "^2.81.0"
6414 request-progress "^2.0.1"
6415 which "^1.2.10"
6416
6417piece-length@^1.0.0: 6411piece-length@^1.0.0:
6418 version "1.0.0" 6412 version "1.0.0"
6419 resolved "https://registry.yarnpkg.com/piece-length/-/piece-length-1.0.0.tgz#4db7167157fd69fef14caf7262cd39f189b24508" 6413 resolved "https://registry.yarnpkg.com/piece-length/-/piece-length-1.0.0.tgz#4db7167157fd69fef14caf7262cd39f189b24508"
6414 integrity sha1-TbcWcVf9af7xTK9yYs058YmyRQg=
6420 dependencies: 6415 dependencies:
6421 closest-to "~2.0.0" 6416 closest-to "~2.0.0"
6422 6417
6423pify@^2.0.0: 6418pify@^2.0.0:
6424 version "2.3.0" 6419 version "2.3.0"
6425 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 6420 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
6421 integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
6426 6422
6427pify@^3.0.0: 6423pify@^3.0.0:
6428 version "3.0.0" 6424 version "3.0.0"
6429 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 6425 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
6426 integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
6430 6427
6431pinkie-promise@^2.0.0: 6428pinkie-promise@^2.0.0:
6432 version "2.0.1" 6429 version "2.0.1"
6433 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 6430 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
6431 integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
6434 dependencies: 6432 dependencies:
6435 pinkie "^2.0.0" 6433 pinkie "^2.0.0"
6436 6434
6437pinkie@^2.0.0: 6435pinkie@^2.0.0:
6438 version "2.0.4" 6436 version "2.0.4"
6439 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 6437 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
6438 integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
6440 6439
6441pkg-dir@^3.0.0: 6440pkg-dir@^3.0.0:
6442 version "3.0.0" 6441 version "3.0.0"
6443 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" 6442 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
6443 integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
6444 dependencies: 6444 dependencies:
6445 find-up "^3.0.0" 6445 find-up "^3.0.0"
6446 6446
6447pkginfo@0.3.x: 6447pkginfo@0.3.x:
6448 version "0.3.1" 6448 version "0.3.1"
6449 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" 6449 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
6450 integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
6450 6451
6451pkginfo@0.x.x: 6452pkginfo@0.x.x:
6452 version "0.4.1" 6453 version "0.4.1"
6453 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" 6454 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
6455 integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=
6454 6456
6455platform@1.3.5: 6457platform@1.3.5:
6456 version "1.3.5" 6458 version "1.3.5"
6457 resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" 6459 resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444"
6460 integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==
6458 6461
6459please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: 6462please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1:
6460 version "3.1.1" 6463 version "3.1.1"
6461 resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" 6464 resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac"
6465 integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==
6462 dependencies: 6466 dependencies:
6463 semver-compare "^1.0.0" 6467 semver-compare "^1.0.0"
6464 6468
6465pluralize@^1.2.1: 6469pluralize@^1.2.1:
6466 version "1.2.1" 6470 version "1.2.1"
6467 resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 6471 resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
6468 6472 integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
6469portscanner@^1.0.0:
6470 version "1.2.0"
6471 resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-1.2.0.tgz#b14bbda257d14c310fa9cc09682af02d40961802"
6472 dependencies:
6473 async "1.5.2"
6474 6473
6475posix-character-classes@^0.1.0: 6474posix-character-classes@^0.1.0:
6476 version "0.1.1" 6475 version "0.1.1"
6477 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 6476 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
6478 6477 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
6479postcss@~0.3.2:
6480 version "0.3.5"
6481 resolved "https://registry.yarnpkg.com/postcss/-/postcss-0.3.5.tgz#5073a3d062ef3ce592ac4a5fe6b8c2862ab83ceb"
6482 dependencies:
6483 base64-js "~0.0.6"
6484 source-map "~0.1.33"
6485 6478
6486postgres-array@~1.0.0: 6479postgres-array@~1.0.0:
6487 version "1.0.3" 6480 version "1.0.3"
6488 resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5" 6481 resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5"
6482 integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==
6489 6483
6490postgres-bytea@~1.0.0: 6484postgres-bytea@~1.0.0:
6491 version "1.0.0" 6485 version "1.0.0"
6492 resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 6486 resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
6487 integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
6493 6488
6494postgres-date@~1.0.0: 6489postgres-date@~1.0.0:
6495 version "1.0.3" 6490 version "1.0.3"
6496 resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" 6491 resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8"
6492 integrity sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=
6497 6493
6498postgres-interval@^1.1.0: 6494postgres-interval@^1.1.0:
6499 version "1.1.2" 6495 version "1.1.2"
6500 resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz#bf71ff902635f21cb241a013fc421d81d1db15a9" 6496 resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz#bf71ff902635f21cb241a013fc421d81d1db15a9"
6497 integrity sha512-fC3xNHeTskCxL1dC8KOtxXt7YeFmlbTYtn7ul8MkVERuTmf7pI4DrkAxcw3kh1fQ9uz4wQmd03a1mRiXUZChfQ==
6501 dependencies: 6498 dependencies:
6502 xtend "^4.0.0" 6499 xtend "^4.0.0"
6503 6500
6504prebuild-install@^4.0.0: 6501prebuild-install@^5.2.0:
6505 version "4.0.0" 6502 version "5.2.2"
6506 resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-4.0.0.tgz#206ce8106ce5efa4b6cf062fc8a0a7d93c17f3a8" 6503 resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.2.tgz#237888f21bfda441d0ee5f5612484390bccd4046"
6504 integrity sha512-4e8VJnP3zJdZv/uP0eNWmr2r9urp4NECw7Mt1OSAi3rcLrbBRxGiAkfUFtre2MhQ5wfREAjRV+K1gubvs/GPsA==
6507 dependencies: 6505 dependencies:
6508 detect-libc "^1.0.3" 6506 detect-libc "^1.0.3"
6509 expand-template "^1.0.2" 6507 expand-template "^2.0.3"
6510 github-from-package "0.0.0" 6508 github-from-package "0.0.0"
6511 minimist "^1.2.0" 6509 minimist "^1.2.0"
6512 mkdirp "^0.5.1" 6510 mkdirp "^0.5.1"
6511 napi-build-utils "^1.0.1"
6513 node-abi "^2.2.0" 6512 node-abi "^2.2.0"
6514 noop-logger "^0.1.1" 6513 noop-logger "^0.1.1"
6515 npmlog "^4.0.1" 6514 npmlog "^4.0.1"
6516 os-homedir "^1.0.1" 6515 os-homedir "^1.0.1"
6517 pump "^2.0.1" 6516 pump "^2.0.1"
6518 rc "^1.1.6" 6517 rc "^1.2.7"
6519 simple-get "^2.7.0" 6518 simple-get "^2.7.0"
6520 tar-fs "^1.13.0" 6519 tar-fs "^1.13.0"
6521 tunnel-agent "^0.6.0" 6520 tunnel-agent "^0.6.0"
@@ -6524,20 +6523,17 @@ prebuild-install@^4.0.0:
6524prelude-ls@~1.1.2: 6523prelude-ls@~1.1.2:
6525 version "1.1.2" 6524 version "1.1.2"
6526 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 6525 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
6526 integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
6527 6527
6528prepend-http@^1.0.1: 6528prepend-http@^1.0.1:
6529 version "1.0.4" 6529 version "1.0.4"
6530 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 6530 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
6531 6531 integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
6532pretty-bytes@^3.0.0:
6533 version "3.0.1"
6534 resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf"
6535 dependencies:
6536 number-is-nan "^1.0.0"
6537 6532
6538pretty-format@^23.6.0: 6533pretty-format@^23.6.0:
6539 version "23.6.0" 6534 version "23.6.0"
6540 resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" 6535 resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
6536 integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
6541 dependencies: 6537 dependencies:
6542 ansi-regex "^3.0.0" 6538 ansi-regex "^3.0.0"
6543 ansi-styles "^3.2.0" 6539 ansi-styles "^3.2.0"
@@ -6545,31 +6541,30 @@ pretty-format@^23.6.0:
6545process-nextick-args@~2.0.0: 6541process-nextick-args@~2.0.0:
6546 version "2.0.0" 6542 version "2.0.0"
6547 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 6543 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
6544 integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
6548 6545
6549progress@^1.1.8: 6546progress@^1.1.8:
6550 version "1.1.8" 6547 version "1.1.8"
6551 resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 6548 resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
6549 integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
6552 6550
6553promise-inflight@^1.0.1, promise-inflight@~1.0.1: 6551promise-inflight@^1.0.1, promise-inflight@~1.0.1:
6554 version "1.0.1" 6552 version "1.0.1"
6555 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 6553 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
6554 integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
6556 6555
6557promise-retry@^1.1.1: 6556promise-retry@^1.1.1:
6558 version "1.1.1" 6557 version "1.1.1"
6559 resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" 6558 resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
6559 integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
6560 dependencies: 6560 dependencies:
6561 err-code "^1.0.0" 6561 err-code "^1.0.0"
6562 retry "^0.10.0" 6562 retry "^0.10.0"
6563 6563
6564promise@^7.1.1:
6565 version "7.3.1"
6566 resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
6567 dependencies:
6568 asap "~2.0.3"
6569
6570promisify-any@2.0.1: 6564promisify-any@2.0.1:
6571 version "2.0.1" 6565 version "2.0.1"
6572 resolved "https://registry.yarnpkg.com/promisify-any/-/promisify-any-2.0.1.tgz#403e00a8813f175242ab50fe33a69f8eece47305" 6566 resolved "https://registry.yarnpkg.com/promisify-any/-/promisify-any-2.0.1.tgz#403e00a8813f175242ab50fe33a69f8eece47305"
6567 integrity sha1-QD4AqIE/F1JCq1D+M6afjuzkcwU=
6573 dependencies: 6568 dependencies:
6574 bluebird "^2.10.0" 6569 bluebird "^2.10.0"
6575 co-bluebird "^1.1.0" 6570 co-bluebird "^1.1.0"
@@ -6578,6 +6573,7 @@ promisify-any@2.0.1:
6578prompt@^1.0.0: 6573prompt@^1.0.0:
6579 version "1.0.0" 6574 version "1.0.0"
6580 resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" 6575 resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe"
6576 integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=
6581 dependencies: 6577 dependencies:
6582 colors "^1.1.2" 6578 colors "^1.1.2"
6583 pkginfo "0.x.x" 6579 pkginfo "0.x.x"
@@ -6589,29 +6585,34 @@ prompt@^1.0.0:
6589promzard@^0.3.0: 6585promzard@^0.3.0:
6590 version "0.3.0" 6586 version "0.3.0"
6591 resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" 6587 resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
6588 integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
6592 dependencies: 6589 dependencies:
6593 read "1" 6590 read "1"
6594 6591
6595proto-list@~1.2.1: 6592proto-list@~1.2.1:
6596 version "1.2.4" 6593 version "1.2.4"
6597 resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 6594 resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
6595 integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
6598 6596
6599protoduck@^5.0.0: 6597protoduck@^5.0.0:
6600 version "5.0.0" 6598 version "5.0.1"
6601 resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.0.tgz#752145e6be0ad834cb25716f670a713c860dce70" 6599 resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
6600 integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
6602 dependencies: 6601 dependencies:
6603 genfun "^4.0.1" 6602 genfun "^5.0.0"
6604 6603
6605proxy-addr@~1.0.10: 6604proxy-addr@~1.0.10:
6606 version "1.0.10" 6605 version "1.0.10"
6607 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.0.10.tgz#0d40a82f801fc355567d2ecb65efe3f077f121c5" 6606 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.0.10.tgz#0d40a82f801fc355567d2ecb65efe3f077f121c5"
6607 integrity sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=
6608 dependencies: 6608 dependencies:
6609 forwarded "~0.1.0" 6609 forwarded "~0.1.0"
6610 ipaddr.js "1.0.5" 6610 ipaddr.js "1.0.5"
6611 6611
6612proxy-addr@~2.0.3: 6612proxy-addr@~2.0.4:
6613 version "2.0.4" 6613 version "2.0.4"
6614 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 6614 resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
6615 integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==
6615 dependencies: 6616 dependencies:
6616 forwarded "~0.1.2" 6617 forwarded "~0.1.2"
6617 ipaddr.js "1.8.0" 6618 ipaddr.js "1.8.0"
@@ -6619,30 +6620,27 @@ proxy-addr@~2.0.3:
6619prr@~1.0.1: 6620prr@~1.0.1:
6620 version "1.0.1" 6621 version "1.0.1"
6621 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 6622 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
6622 6623 integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
6623ps-tree@^1.1.0:
6624 version "1.1.0"
6625 resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014"
6626 dependencies:
6627 event-stream "~3.3.0"
6628 6624
6629pseudomap@^1.0.2: 6625pseudomap@^1.0.2:
6630 version "1.0.2" 6626 version "1.0.2"
6631 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 6627 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
6628 integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
6632 6629
6633psl@^1.1.24: 6630psl@^1.1.24:
6634 version "1.1.29" 6631 version "1.1.29"
6635 resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 6632 resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
6633 integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==
6636 6634
6637pstree.remy@^1.1.0: 6635pstree.remy@^1.1.2:
6638 version "1.1.0" 6636 version "1.1.2"
6639 resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" 6637 resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz#4448bbeb4b2af1fed242afc8dc7416a6f504951a"
6640 dependencies: 6638 integrity sha512-vL6NLxNHzkNTjGJUpMm5PLC+94/0tTlC1vkP9bdU0pOHih+EujMjgMTwfZopZvHWRFbqJ5Y73OMoau50PewDDA==
6641 ps-tree "^1.1.0"
6642 6639
6643pump@^1.0.0: 6640pump@^1.0.0:
6644 version "1.0.3" 6641 version "1.0.3"
6645 resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" 6642 resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
6643 integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==
6646 dependencies: 6644 dependencies:
6647 end-of-stream "^1.1.0" 6645 end-of-stream "^1.1.0"
6648 once "^1.3.1" 6646 once "^1.3.1"
@@ -6650,6 +6648,7 @@ pump@^1.0.0:
6650pump@^2.0.0, pump@^2.0.1: 6648pump@^2.0.0, pump@^2.0.1:
6651 version "2.0.1" 6649 version "2.0.1"
6652 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 6650 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
6651 integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
6653 dependencies: 6652 dependencies:
6654 end-of-stream "^1.1.0" 6653 end-of-stream "^1.1.0"
6655 once "^1.3.1" 6654 once "^1.3.1"
@@ -6657,6 +6656,7 @@ pump@^2.0.0, pump@^2.0.1:
6657pump@^3.0.0: 6656pump@^3.0.0:
6658 version "3.0.0" 6657 version "3.0.0"
6659 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 6658 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
6659 integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
6660 dependencies: 6660 dependencies:
6661 end-of-stream "^1.1.0" 6661 end-of-stream "^1.1.0"
6662 once "^1.3.1" 6662 once "^1.3.1"
@@ -6664,6 +6664,7 @@ pump@^3.0.0:
6664pumpify@^1.3.3: 6664pumpify@^1.3.3:
6665 version "1.5.1" 6665 version "1.5.1"
6666 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" 6666 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
6667 integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
6667 dependencies: 6668 dependencies:
6668 duplexify "^3.6.0" 6669 duplexify "^3.6.0"
6669 inherits "^2.0.3" 6670 inherits "^2.0.3"
@@ -6672,30 +6673,37 @@ pumpify@^1.3.3:
6672punycode@^1.4.1: 6673punycode@^1.4.1:
6673 version "1.4.1" 6674 version "1.4.1"
6674 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 6675 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
6676 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
6675 6677
6676punycode@^2.1.0: 6678punycode@^2.1.0:
6677 version "2.1.1" 6679 version "2.1.1"
6678 resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 6680 resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
6681 integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
6679 6682
6680qrcode-terminal@^0.12.0: 6683qrcode-terminal@^0.12.0:
6681 version "0.12.0" 6684 version "0.12.0"
6682 resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" 6685 resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
6686 integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
6683 6687
6684qs@4.0.0: 6688qs@4.0.0:
6685 version "4.0.0" 6689 version "4.0.0"
6686 resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" 6690 resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607"
6691 integrity sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=
6687 6692
6688qs@6.5.1: 6693qs@6.5.2, qs@~6.5.2:
6689 version "6.5.1"
6690 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
6691
6692qs@6.5.2, qs@^6.1.0, qs@^6.4.0, qs@^6.5.1, qs@~6.5.1, qs@~6.5.2:
6693 version "6.5.2" 6694 version "6.5.2"
6694 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 6695 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
6696 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
6697
6698qs@^6.5.1:
6699 version "6.6.0"
6700 resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2"
6701 integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==
6695 6702
6696query-string@^6.1.0: 6703query-string@^6.1.0:
6697 version "6.1.0" 6704 version "6.2.0"
6698 resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.1.0.tgz#01e7d69f6a0940dac67a937d6c6325647aa4532a" 6705 resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.2.0.tgz#468edeb542b7e0538f9f9b1aeb26f034f19c86e1"
6706 integrity sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==
6699 dependencies: 6707 dependencies:
6700 decode-uri-component "^0.2.0" 6708 decode-uri-component "^0.2.0"
6701 strict-uri-encode "^2.0.0" 6709 strict-uri-encode "^2.0.0"
@@ -6703,10 +6711,12 @@ query-string@^6.1.0:
6703qw@~1.0.1: 6711qw@~1.0.1:
6704 version "1.0.1" 6712 version "1.0.1"
6705 resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4" 6713 resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4"
6714 integrity sha1-77/cdA+a0FQwRCassYNBLMi5ltQ=
6706 6715
6707random-access-file@^2.0.1: 6716random-access-file@^2.0.1:
6708 version "2.0.1" 6717 version "2.0.1"
6709 resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb" 6718 resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb"
6719 integrity sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==
6710 dependencies: 6720 dependencies:
6711 mkdirp "^0.5.1" 6721 mkdirp "^0.5.1"
6712 random-access-storage "^1.1.1" 6722 random-access-storage "^1.1.1"
@@ -6714,62 +6724,53 @@ random-access-file@^2.0.1:
6714random-access-storage@^1.1.1: 6724random-access-storage@^1.1.1:
6715 version "1.3.0" 6725 version "1.3.0"
6716 resolved "https://registry.yarnpkg.com/random-access-storage/-/random-access-storage-1.3.0.tgz#d27e4d897b79dc4358afc2bbe553044e5c8cfe35" 6726 resolved "https://registry.yarnpkg.com/random-access-storage/-/random-access-storage-1.3.0.tgz#d27e4d897b79dc4358afc2bbe553044e5c8cfe35"
6727 integrity sha512-pdS9Mcb9TB7oICypPRALlheaSuszuAKmLVEPKJMuYor7R/zDuHh5ALuQoS+ox31XRwQUL+tDwWH2GPdyspwelA==
6717 dependencies: 6728 dependencies:
6718 inherits "^2.0.3" 6729 inherits "^2.0.3"
6719 6730
6720random-iterate@^1.0.1: 6731random-iterate@^1.0.1:
6721 version "1.0.1" 6732 version "1.0.1"
6722 resolved "https://registry.yarnpkg.com/random-iterate/-/random-iterate-1.0.1.tgz#f7d97d92dee6665ec5f6da08c7f963cad4b2ac99" 6733 resolved "https://registry.yarnpkg.com/random-iterate/-/random-iterate-1.0.1.tgz#f7d97d92dee6665ec5f6da08c7f963cad4b2ac99"
6734 integrity sha1-99l9kt7mZl7F9toIx/ljytSyrJk=
6723 6735
6724randombytes@^2.0.3, randombytes@^2.0.5: 6736randombytes@^2.0.3, randombytes@^2.0.5:
6725 version "2.0.6" 6737 version "2.0.6"
6726 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" 6738 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
6739 integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==
6727 dependencies: 6740 dependencies:
6728 safe-buffer "^5.1.0" 6741 safe-buffer "^5.1.0"
6729 6742
6730range-parser@^1.2.0, range-parser@~1.2.0: 6743range-parser@^1.2.0, range-parser@~1.2.0:
6731 version "1.2.0" 6744 version "1.2.0"
6732 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 6745 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
6746 integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=
6733 6747
6734range-parser@~1.0.3: 6748range-parser@~1.0.3:
6735 version "1.0.3" 6749 version "1.0.3"
6736 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" 6750 resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175"
6751 integrity sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=
6737 6752
6738range-slice-stream@^1.2.0: 6753range-slice-stream@^2.0.0:
6739 version "1.2.0" 6754 version "2.0.0"
6740 resolved "https://registry.yarnpkg.com/range-slice-stream/-/range-slice-stream-1.2.0.tgz#01ba954276052b783900e63d6118d8fcf3875d7f" 6755 resolved "https://registry.yarnpkg.com/range-slice-stream/-/range-slice-stream-2.0.0.tgz#1f25fc7a2cacf9ccd140c46f9cf670a1a7fe3ce6"
6741 dependencies: 6756 integrity sha512-PPYLwZ63lXi6Tv2EZ8w3M4FzC0rVqvxivaOVS8pXSp5FMIHFnvi4MWHL3UdFLhwSy50aNtJsgjY0mBC6oFL26Q==
6742 inherits "^2.0.1"
6743 readable-stream "^2.0.5"
6744
6745raw-body@2.3.2:
6746 version "2.3.2"
6747 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
6748 dependencies: 6757 dependencies:
6749 bytes "3.0.0" 6758 readable-stream "^3.0.2"
6750 http-errors "1.6.2"
6751 iconv-lite "0.4.19"
6752 unpipe "1.0.0"
6753 6759
6754raw-body@2.3.3: 6760raw-body@2.3.3:
6755 version "2.3.3" 6761 version "2.3.3"
6756 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 6762 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
6763 integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==
6757 dependencies: 6764 dependencies:
6758 bytes "3.0.0" 6765 bytes "3.0.0"
6759 http-errors "1.6.3" 6766 http-errors "1.6.3"
6760 iconv-lite "0.4.23" 6767 iconv-lite "0.4.23"
6761 unpipe "1.0.0" 6768 unpipe "1.0.0"
6762 6769
6763raw-body@~1.1.0: 6770rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
6764 version "1.1.7"
6765 resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425"
6766 dependencies:
6767 bytes "1"
6768 string_decoder "0.10"
6769
6770rc@^1.0.1, rc@^1.1.6, rc@^1.1.7, rc@^1.2.7:
6771 version "1.2.8" 6771 version "1.2.8"
6772 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 6772 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
6773 integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
6773 dependencies: 6774 dependencies:
6774 deep-extend "^0.6.0" 6775 deep-extend "^0.6.0"
6775 ini "~1.3.0" 6776 ini "~1.3.0"
@@ -6777,8 +6778,9 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7, rc@^1.2.7:
6777 strip-json-comments "~2.0.1" 6778 strip-json-comments "~2.0.1"
6778 6779
6779rdf-canonize@^0.2.1: 6780rdf-canonize@^0.2.1:
6780 version "0.2.4" 6781 version "0.2.5"
6781 resolved "https://registry.yarnpkg.com/rdf-canonize/-/rdf-canonize-0.2.4.tgz#1b46eb01500b6800348ac5fe0953c1be226b1446" 6782 resolved "https://registry.yarnpkg.com/rdf-canonize/-/rdf-canonize-0.2.5.tgz#dc761d42a2e9e6bf6eec7e0e352fd5b10ff4e75a"
6783 integrity sha512-ZSOcoziIkics9lZvFRoqRHUWoITLbXeKqXNxTuvchTf9c74/yOzzZCKxS+aTCGQp81fQZhnKUM/NsgyiBS0Mig==
6782 dependencies: 6784 dependencies:
6783 bindings "^1.3.0" 6785 bindings "^1.3.0"
6784 nan "^2.10.0" 6786 nan "^2.10.0"
@@ -6788,12 +6790,14 @@ rdf-canonize@^0.2.1:
6788read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: 6790read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1:
6789 version "1.0.1" 6791 version "1.0.1"
6790 resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" 6792 resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
6793 integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=
6791 dependencies: 6794 dependencies:
6792 graceful-fs "^4.1.2" 6795 graceful-fs "^4.1.2"
6793 6796
6794read-installed@~4.0.3: 6797read-installed@~4.0.3:
6795 version "4.0.3" 6798 version "4.0.3"
6796 resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" 6799 resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
6800 integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=
6797 dependencies: 6801 dependencies:
6798 debuglog "^1.0.1" 6802 debuglog "^1.0.1"
6799 read-package-json "^2.0.0" 6803 read-package-json "^2.0.0"
@@ -6807,6 +6811,7 @@ read-installed@~4.0.3:
6807"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: 6811"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13:
6808 version "2.0.13" 6812 version "2.0.13"
6809 resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" 6813 resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
6814 integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==
6810 dependencies: 6815 dependencies:
6811 glob "^7.1.1" 6816 glob "^7.1.1"
6812 json-parse-better-errors "^1.0.1" 6817 json-parse-better-errors "^1.0.1"
@@ -6818,6 +6823,7 @@ read-installed@~4.0.3:
6818read-package-tree@^5.2.1: 6823read-package-tree@^5.2.1:
6819 version "5.2.1" 6824 version "5.2.1"
6820 resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63" 6825 resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63"
6826 integrity sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==
6821 dependencies: 6827 dependencies:
6822 debuglog "^1.0.1" 6828 debuglog "^1.0.1"
6823 dezalgo "^1.0.0" 6829 dezalgo "^1.0.0"
@@ -6825,24 +6831,10 @@ read-package-tree@^5.2.1:
6825 read-package-json "^2.0.0" 6831 read-package-json "^2.0.0"
6826 readdir-scoped-modules "^1.0.0" 6832 readdir-scoped-modules "^1.0.0"
6827 6833
6828read-pkg-up@^1.0.1:
6829 version "1.0.1"
6830 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
6831 dependencies:
6832 find-up "^1.0.0"
6833 read-pkg "^1.0.0"
6834
6835read-pkg@^1.0.0:
6836 version "1.1.0"
6837 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
6838 dependencies:
6839 load-json-file "^1.0.0"
6840 normalize-package-data "^2.3.2"
6841 path-type "^1.0.0"
6842
6843read-pkg@^4.0.1: 6834read-pkg@^4.0.1:
6844 version "4.0.1" 6835 version "4.0.1"
6845 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" 6836 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237"
6837 integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc=
6846 dependencies: 6838 dependencies:
6847 normalize-package-data "^2.3.2" 6839 normalize-package-data "^2.3.2"
6848 parse-json "^4.0.0" 6840 parse-json "^4.0.0"
@@ -6851,12 +6843,14 @@ read-pkg@^4.0.1:
6851read@1, read@1.0.x, read@~1.0.1, read@~1.0.7: 6843read@1, read@1.0.x, read@~1.0.1, read@~1.0.7:
6852 version "1.0.7" 6844 version "1.0.7"
6853 resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 6845 resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
6846 integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
6854 dependencies: 6847 dependencies:
6855 mute-stream "~0.0.4" 6848 mute-stream "~0.0.4"
6856 6849
6857"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.4, readable-stream@^2.3.5, readable-stream@^2.3.6: 6850"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.4, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
6858 version "2.3.6" 6851 version "2.3.6"
6859 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 6852 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
6853 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
6860 dependencies: 6854 dependencies:
6861 core-util-is "~1.0.0" 6855 core-util-is "~1.0.0"
6862 inherits "~2.0.3" 6856 inherits "~2.0.3"
@@ -6866,18 +6860,10 @@ read@1, read@1.0.x, read@~1.0.1, read@~1.0.7:
6866 string_decoder "~1.1.1" 6860 string_decoder "~1.1.1"
6867 util-deprecate "~1.0.1" 6861 util-deprecate "~1.0.1"
6868 6862
6869readable-stream@1.1:
6870 version "1.1.13"
6871 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
6872 dependencies:
6873 core-util-is "~1.0.0"
6874 inherits "~2.0.1"
6875 isarray "0.0.1"
6876 string_decoder "~0.10.x"
6877
6878readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.1.13-1, readable-stream@~1.1.10: 6863readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.1.13-1, readable-stream@~1.1.10:
6879 version "1.1.14" 6864 version "1.1.14"
6880 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 6865 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
6866 integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
6881 dependencies: 6867 dependencies:
6882 core-util-is "~1.0.0" 6868 core-util-is "~1.0.0"
6883 inherits "~2.0.1" 6869 inherits "~2.0.1"
@@ -6886,7 +6872,8 @@ readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1
6886 6872
6887"readable-stream@>=1.0.33-1 <1.1.0-0": 6873"readable-stream@>=1.0.33-1 <1.1.0-0":
6888 version "1.0.34" 6874 version "1.0.34"
6889 resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 6875 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
6876 integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
6890 dependencies: 6877 dependencies:
6891 core-util-is "~1.0.0" 6878 core-util-is "~1.0.0"
6892 inherits "~2.0.1" 6879 inherits "~2.0.1"
@@ -6894,8 +6881,9 @@ readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1
6894 string_decoder "~0.10.x" 6881 string_decoder "~0.10.x"
6895 6882
6896readable-stream@^3.0.2: 6883readable-stream@^3.0.2:
6897 version "3.0.3" 6884 version "3.0.6"
6898 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.3.tgz#a4db8813e3e0b87abdc01d5d5dbae828e59744b5" 6885 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a"
6886 integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==
6899 dependencies: 6887 dependencies:
6900 inherits "^2.0.3" 6888 inherits "^2.0.3"
6901 string_decoder "^1.1.1" 6889 string_decoder "^1.1.1"
@@ -6904,12 +6892,14 @@ readable-stream@^3.0.2:
6904readable-wrap@^1.0.0: 6892readable-wrap@^1.0.0:
6905 version "1.0.0" 6893 version "1.0.0"
6906 resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff" 6894 resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff"
6895 integrity sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=
6907 dependencies: 6896 dependencies:
6908 readable-stream "^1.1.13-1" 6897 readable-stream "^1.1.13-1"
6909 6898
6910readdir-scoped-modules@^1.0.0: 6899readdir-scoped-modules@^1.0.0:
6911 version "1.0.2" 6900 version "1.0.2"
6912 resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" 6901 resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
6902 integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c=
6913 dependencies: 6903 dependencies:
6914 debuglog "^1.0.1" 6904 debuglog "^1.0.1"
6915 dezalgo "^1.0.0" 6905 dezalgo "^1.0.0"
@@ -6919,6 +6909,7 @@ readdir-scoped-modules@^1.0.0:
6919readdirp@^2.0.0: 6909readdirp@^2.0.0:
6920 version "2.2.1" 6910 version "2.2.1"
6921 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 6911 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
6912 integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
6922 dependencies: 6913 dependencies:
6923 graceful-fs "^4.1.11" 6914 graceful-fs "^4.1.11"
6924 micromatch "^3.1.10" 6915 micromatch "^3.1.10"
@@ -6927,6 +6918,7 @@ readdirp@^2.0.0:
6927readline2@^1.0.1: 6918readline2@^1.0.1:
6928 version "1.0.1" 6919 version "1.0.1"
6929 resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 6920 resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
6921 integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
6930 dependencies: 6922 dependencies:
6931 code-point-at "^1.0.0" 6923 code-point-at "^1.0.0"
6932 is-fullwidth-code-point "^1.0.0" 6924 is-fullwidth-code-point "^1.0.0"
@@ -6935,25 +6927,22 @@ readline2@^1.0.1:
6935record-cache@^1.0.2: 6927record-cache@^1.0.2:
6936 version "1.1.0" 6928 version "1.1.0"
6937 resolved "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz#f8a467a691a469584b26e88d36b18afdb3932037" 6929 resolved "https://registry.yarnpkg.com/record-cache/-/record-cache-1.1.0.tgz#f8a467a691a469584b26e88d36b18afdb3932037"
6938 6930 integrity sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==
6939redent@^1.0.0:
6940 version "1.0.0"
6941 resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
6942 dependencies:
6943 indent-string "^2.1.0"
6944 strip-indent "^1.0.1"
6945 6931
6946redis-commands@^1.2.0: 6932redis-commands@^1.2.0:
6947 version "1.3.5" 6933 version "1.4.0"
6948 resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" 6934 resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f"
6935 integrity sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==
6949 6936
6950redis-parser@^2.4.0, redis-parser@^2.6.0: 6937redis-parser@^2.4.0, redis-parser@^2.6.0:
6951 version "2.6.0" 6938 version "2.6.0"
6952 resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" 6939 resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
6940 integrity sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=
6953 6941
6954redis@^2.8.0: 6942redis@^2.8.0:
6955 version "2.8.0" 6943 version "2.8.0"
6956 resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" 6944 resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
6945 integrity sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==
6957 dependencies: 6946 dependencies:
6958 double-ended-queue "^2.1.0-0" 6947 double-ended-queue "^2.1.0-0"
6959 redis-commands "^1.2.0" 6948 redis-commands "^1.2.0"
@@ -6962,14 +6951,17 @@ redis@^2.8.0:
6962referrer-policy@1.1.0: 6951referrer-policy@1.1.0:
6963 version "1.1.0" 6952 version "1.1.0"
6964 resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79" 6953 resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79"
6954 integrity sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=
6965 6955
6966reflect-metadata@^0.1.10: 6956reflect-metadata@^0.1.12:
6967 version "0.1.12" 6957 version "0.1.12"
6968 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 6958 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2"
6959 integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==
6969 6960
6970regex-not@^1.0.0, regex-not@^1.0.2: 6961regex-not@^1.0.0, regex-not@^1.0.2:
6971 version "1.0.2" 6962 version "1.0.2"
6972 resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 6963 resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
6964 integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
6973 dependencies: 6965 dependencies:
6974 extend-shallow "^3.0.2" 6966 extend-shallow "^3.0.2"
6975 safe-regex "^1.1.0" 6967 safe-regex "^1.1.0"
@@ -6977,6 +6969,7 @@ regex-not@^1.0.0, regex-not@^1.0.2:
6977registry-auth-token@^3.0.1: 6969registry-auth-token@^3.0.1:
6978 version "3.3.2" 6970 version "3.3.2"
6979 resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" 6971 resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20"
6972 integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==
6980 dependencies: 6973 dependencies:
6981 rc "^1.1.6" 6974 rc "^1.1.6"
6982 safe-buffer "^5.0.1" 6975 safe-buffer "^5.0.1"
@@ -6984,16 +6977,19 @@ registry-auth-token@^3.0.1:
6984registry-url@^3.0.3: 6977registry-url@^3.0.3:
6985 version "3.1.0" 6978 version "3.1.0"
6986 resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 6979 resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
6980 integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
6987 dependencies: 6981 dependencies:
6988 rc "^1.0.1" 6982 rc "^1.0.1"
6989 6983
6990remove-trailing-separator@^1.0.1: 6984remove-trailing-separator@^1.0.1:
6991 version "1.1.0" 6985 version "1.1.0"
6992 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 6986 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
6987 integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
6993 6988
6994render-media@^3.0.0: 6989render-media@^3.0.0:
6995 version "3.1.3" 6990 version "3.1.3"
6996 resolved "https://registry.yarnpkg.com/render-media/-/render-media-3.1.3.tgz#aa8c8cd3f720049370067180709b551d3c566254" 6991 resolved "https://registry.yarnpkg.com/render-media/-/render-media-3.1.3.tgz#aa8c8cd3f720049370067180709b551d3c566254"
6992 integrity sha512-K7ziKKlIcgYpAovRsABDiSaNn7TzDDyyuFGpRwM52cloNcajInB6sCxFPUEzOuTJUeyvKCqT/k5INOjpKLCjhQ==
6997 dependencies: 6993 dependencies:
6998 debug "^3.1.0" 6994 debug "^3.1.0"
6999 is-ascii "^1.0.0" 6995 is-ascii "^1.0.0"
@@ -7001,60 +6997,20 @@ render-media@^3.0.0:
7001 stream-to-blob-url "^2.0.0" 6997 stream-to-blob-url "^2.0.0"
7002 videostream "^2.5.1" 6998 videostream "^2.5.1"
7003 6999
7004reorient-css@~0.2.1:
7005 version "0.2.2"
7006 resolved "https://registry.yarnpkg.com/reorient-css/-/reorient-css-0.2.2.tgz#6f66fc49f6a214400e0221d14c965d1abd21ac96"
7007 dependencies:
7008 postcss "~0.3.2"
7009
7010repeat-element@^1.1.2: 7000repeat-element@^1.1.2:
7011 version "1.1.3" 7001 version "1.1.3"
7012 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 7002 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
7003 integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
7013 7004
7014repeat-string@^1.6.1: 7005repeat-string@^1.6.1:
7015 version "1.6.1" 7006 version "1.6.1"
7016 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 7007 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
7017 7008 integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
7018repeating@^2.0.0:
7019 version "2.0.1"
7020 resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
7021 dependencies:
7022 is-finite "^1.0.0"
7023
7024request-progress@^2.0.1:
7025 version "2.0.1"
7026 resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
7027 dependencies:
7028 throttleit "^1.0.0"
7029
7030request@2.87.0:
7031 version "2.87.0"
7032 resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
7033 dependencies:
7034 aws-sign2 "~0.7.0"
7035 aws4 "^1.6.0"
7036 caseless "~0.12.0"
7037 combined-stream "~1.0.5"
7038 extend "~3.0.1"
7039 forever-agent "~0.6.1"
7040 form-data "~2.3.1"
7041 har-validator "~5.0.3"
7042 http-signature "~1.2.0"
7043 is-typedarray "~1.0.0"
7044 isstream "~0.1.2"
7045 json-stringify-safe "~5.0.1"
7046 mime-types "~2.1.17"
7047 oauth-sign "~0.8.2"
7048 performance-now "^2.1.0"
7049 qs "~6.5.1"
7050 safe-buffer "^5.1.1"
7051 tough-cookie "~2.3.3"
7052 tunnel-agent "^0.6.0"
7053 uuid "^3.1.0"
7054 7009
7055request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: 7010request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0:
7056 version "2.88.0" 7011 version "2.88.0"
7057 resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 7012 resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
7013 integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
7058 dependencies: 7014 dependencies:
7059 aws-sign2 "~0.7.0" 7015 aws-sign2 "~0.7.0"
7060 aws4 "^1.8.0" 7016 aws4 "^1.8.0"
@@ -7080,14 +7036,17 @@ request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.8
7080require-directory@^2.1.1: 7036require-directory@^2.1.1:
7081 version "2.1.1" 7037 version "2.1.1"
7082 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 7038 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
7039 integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
7083 7040
7084require-main-filename@^1.0.1: 7041require-main-filename@^1.0.1:
7085 version "1.0.1" 7042 version "1.0.1"
7086 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 7043 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
7044 integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
7087 7045
7088require-uncached@^1.0.2: 7046require-uncached@^1.0.2:
7089 version "1.0.3" 7047 version "1.0.3"
7090 resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 7048 resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
7049 integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
7091 dependencies: 7050 dependencies:
7092 caller-path "^0.1.0" 7051 caller-path "^0.1.0"
7093 resolve-from "^1.0.0" 7052 resolve-from "^1.0.0"
@@ -7095,49 +7054,67 @@ require-uncached@^1.0.2:
7095resolve-from@^1.0.0: 7054resolve-from@^1.0.0:
7096 version "1.0.1" 7055 version "1.0.1"
7097 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 7056 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
7057 integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
7058
7059resolve-from@^2.0.0:
7060 version "2.0.0"
7061 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
7062 integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
7063
7064resolve-from@^3.0.0:
7065 version "3.0.0"
7066 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
7067 integrity sha1-six699nWiBvItuZTM17rywoYh0g=
7098 7068
7099resolve-from@^4.0.0: 7069resolve-from@^4.0.0:
7100 version "4.0.0" 7070 version "4.0.0"
7101 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 7071 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
7072 integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
7073
7074resolve-pkg@^1.0.0:
7075 version "1.0.0"
7076 resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-1.0.0.tgz#e19a15e78aca2e124461dc92b2e3943ef93494d9"
7077 integrity sha1-4ZoV54rKLhJEYdySsuOUPvk0lNk=
7078 dependencies:
7079 resolve-from "^2.0.0"
7102 7080
7103resolve-url@^0.2.1: 7081resolve-url@^0.2.1:
7104 version "0.2.1" 7082 version "0.2.1"
7105 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 7083 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
7084 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
7106 7085
7107resolve@^1.3.2: 7086resolve@^1.3.2:
7108 version "1.8.1" 7087 version "1.8.1"
7109 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 7088 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
7089 integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==
7110 dependencies: 7090 dependencies:
7111 path-parse "^1.0.5" 7091 path-parse "^1.0.5"
7112 7092
7113resolve@~1.1.0:
7114 version "1.1.7"
7115 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
7116
7117resource-embedder@~0.2.1:
7118 version "0.2.2"
7119 resolved "https://registry.yarnpkg.com/resource-embedder/-/resource-embedder-0.2.2.tgz#20688fb5143737ec33a23b372c9144cb48196426"
7120 dependencies:
7121 coffee-script "~1.7.1"
7122 graceful-fs "~2.0.2"
7123 htmlparser2 "~3.5.0"
7124 lodash "~2.4.1"
7125 reorient-css "~0.2.1"
7126
7127restore-cursor@^1.0.1: 7093restore-cursor@^1.0.1:
7128 version "1.0.1" 7094 version "1.0.1"
7129 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 7095 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
7096 integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
7130 dependencies: 7097 dependencies:
7131 exit-hook "^1.0.0" 7098 exit-hook "^1.0.0"
7132 onetime "^1.0.0" 7099 onetime "^1.0.0"
7133 7100
7101restore-cursor@^2.0.0:
7102 version "2.0.0"
7103 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
7104 integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
7105 dependencies:
7106 onetime "^2.0.0"
7107 signal-exit "^3.0.2"
7108
7134ret@~0.1.10: 7109ret@~0.1.10:
7135 version "0.1.15" 7110 version "0.1.15"
7136 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 7111 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
7112 integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
7137 7113
7138retry-as-promised@^2.3.2: 7114retry-as-promised@^2.3.2:
7139 version "2.3.2" 7115 version "2.3.2"
7140 resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" 7116 resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7"
7117 integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=
7141 dependencies: 7118 dependencies:
7142 bluebird "^3.4.6" 7119 bluebird "^3.4.6"
7143 debug "^2.6.9" 7120 debug "^2.6.9"
@@ -7145,103 +7122,97 @@ retry-as-promised@^2.3.2:
7145retry@^0.10.0: 7122retry@^0.10.0:
7146 version "0.10.1" 7123 version "0.10.1"
7147 resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" 7124 resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
7125 integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
7148 7126
7149retry@^0.12.0: 7127retry@^0.12.0:
7150 version "0.12.0" 7128 version "0.12.0"
7151 resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 7129 resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
7130 integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
7152 7131
7153revalidator@0.1.x: 7132revalidator@0.1.x:
7154 version "0.1.8" 7133 version "0.1.8"
7155 resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" 7134 resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
7135 integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs=
7156 7136
7157rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: 7137rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2:
7158 version "2.6.2" 7138 version "2.6.2"
7159 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 7139 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
7140 integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
7160 dependencies: 7141 dependencies:
7161 glob "^7.0.5" 7142 glob "^7.0.5"
7162 7143
7163run-async@^0.1.0: 7144run-async@^0.1.0:
7164 version "0.1.0" 7145 version "0.1.0"
7165 resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 7146 resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
7147 integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
7166 dependencies: 7148 dependencies:
7167 once "^1.3.0" 7149 once "^1.3.0"
7168 7150
7169run-node@^1.0.0: 7151run-node@^1.0.0:
7170 version "1.0.0" 7152 version "1.0.0"
7171 resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" 7153 resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e"
7154 integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==
7172 7155
7173run-parallel-limit@^1.0.3: 7156run-parallel-limit@^1.0.3:
7174 version "1.0.5" 7157 version "1.0.5"
7175 resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz#c29a4fd17b4df358cb52a8a697811a63c984f1b7" 7158 resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.0.5.tgz#c29a4fd17b4df358cb52a8a697811a63c984f1b7"
7159 integrity sha512-NsY+oDngvrvMxKB3G8ijBzIema6aYbQMD2bHOamvN52BysbIGTnEY2xsNyfrcr9GhY995/t/0nQN3R3oZvaDlg==
7176 7160
7177run-parallel@^1.0.0, run-parallel@^1.1.2, run-parallel@^1.1.6: 7161run-parallel@^1.0.0, run-parallel@^1.1.2, run-parallel@^1.1.6:
7178 version "1.1.9" 7162 version "1.1.9"
7179 resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" 7163 resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
7164 integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
7180 7165
7181run-queue@^1.0.0, run-queue@^1.0.3: 7166run-queue@^1.0.0, run-queue@^1.0.3:
7182 version "1.0.3" 7167 version "1.0.3"
7183 resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" 7168 resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
7169 integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
7184 dependencies: 7170 dependencies:
7185 aproba "^1.1.1" 7171 aproba "^1.1.1"
7186 7172
7187run-series@^1.0.2: 7173run-series@^1.0.2:
7188 version "1.1.8" 7174 version "1.1.8"
7189 resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36" 7175 resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36"
7176 integrity sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==
7190 7177
7191rusha@^0.8.1: 7178rusha@^0.8.1:
7192 version "0.8.13" 7179 version "0.8.13"
7193 resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a" 7180 resolved "https://registry.yarnpkg.com/rusha/-/rusha-0.8.13.tgz#9a084e7b860b17bff3015b92c67a6a336191513a"
7181 integrity sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=
7194 7182
7195rx-lite@^3.1.2: 7183rx-lite@^3.1.2:
7196 version "3.1.2" 7184 version "3.1.2"
7197 resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 7185 resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
7186 integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
7198 7187
7199rxjs@6.2.2: 7188rxjs@^6.3.3:
7200 version "6.2.2" 7189 version "6.3.3"
7201 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" 7190 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
7191 integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==
7202 dependencies: 7192 dependencies:
7203 tslib "^1.9.0" 7193 tslib "^1.9.0"
7204 7194
7205rxjs@^6.1.0:
7206 version "6.3.2"
7207 resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f"
7208 dependencies:
7209 tslib "^1.9.0"
7210
7211safe-buffer@5.1.1:
7212 version "5.1.1"
7213 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
7214
7215safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 7195safe-buffer@5.1.2, safe-buffer@^5.0.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
7216 version "5.1.2" 7196 version "5.1.2"
7217 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 7197 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
7218 7198 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
7219safe-json-parse@~1.0.1:
7220 version "1.0.1"
7221 resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
7222 7199
7223safe-regex@^1.1.0: 7200safe-regex@^1.1.0:
7224 version "1.1.0" 7201 version "1.1.0"
7225 resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 7202 resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
7203 integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
7226 dependencies: 7204 dependencies:
7227 ret "~0.1.10" 7205 ret "~0.1.10"
7228 7206
7229"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 7207"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
7230 version "2.1.2" 7208 version "2.1.2"
7231 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 7209 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
7232 7210 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
7233sass-graph@^2.2.4:
7234 version "2.2.4"
7235 resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
7236 dependencies:
7237 glob "^7.0.0"
7238 lodash "^4.0.0"
7239 scss-tokenizer "^0.2.3"
7240 yargs "^7.0.0"
7241 7211
7242sass-lint@^1.12.1: 7212sass-lint@^1.12.1:
7243 version "1.12.1" 7213 version "1.12.1"
7244 resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.12.1.tgz#630f69c216aa206b8232fb2aa907bdf3336b6d83" 7214 resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.12.1.tgz#630f69c216aa206b8232fb2aa907bdf3336b6d83"
7215 integrity sha1-Yw9pwhaqIGuCMvsqqQe98zNrbYM=
7245 dependencies: 7216 dependencies:
7246 commander "^2.8.1" 7217 commander "^2.8.1"
7247 eslint "^2.7.0" 7218 eslint "^2.7.0"
@@ -7261,47 +7232,49 @@ sass-lint@^1.12.1:
7261sax@>=0.6.0, sax@^1.2.4: 7232sax@>=0.6.0, sax@^1.2.4:
7262 version "1.2.4" 7233 version "1.2.4"
7263 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 7234 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
7235 integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
7264 7236
7265scripty@^1.5.0: 7237scripty@^1.5.0:
7266 version "1.7.2" 7238 version "1.8.0"
7267 resolved "https://registry.yarnpkg.com/scripty/-/scripty-1.7.2.tgz#92367b724cb77b086729691f7b01aa57f3ddd356" 7239 resolved "https://registry.yarnpkg.com/scripty/-/scripty-1.8.0.tgz#951f0b4bc3e235844b7f5355f58d31e012e0b806"
7240 integrity sha512-KMbC6r/Afga4oWcdh5Rnr9eqsfvIPZqVnfrG9pxqwYUn4BJyBggzukagcHaDSbl1WHglAd2tVgGsoMpYtbbCMA==
7268 dependencies: 7241 dependencies:
7269 async "^1.5.2" 7242 async "^2.6.1"
7270 glob "^7.0.3" 7243 glob "^7.0.3"
7271 lodash "^4.8.2" 7244 lodash "^4.8.2"
7272 7245 resolve-pkg "^1.0.0"
7273scss-tokenizer@^0.2.3:
7274 version "0.2.3"
7275 resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
7276 dependencies:
7277 js-base64 "^2.1.8"
7278 source-map "^0.4.2"
7279 7246
7280semver-compare@^1.0.0: 7247semver-compare@^1.0.0:
7281 version "1.0.0" 7248 version "1.0.0"
7282 resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 7249 resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
7250 integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
7283 7251
7284semver-diff@^2.0.0: 7252semver-diff@^2.0.0:
7285 version "2.1.0" 7253 version "2.1.0"
7286 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 7254 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
7255 integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
7287 dependencies: 7256 dependencies:
7288 semver "^5.0.3" 7257 semver "^5.0.3"
7289 7258
7290"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: 7259"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
7291 version "5.5.1" 7260 version "5.6.0"
7292 resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 7261 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
7262 integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
7293 7263
7294semver@4.3.2: 7264semver@4.3.2:
7295 version "4.3.2" 7265 version "4.3.2"
7296 resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" 7266 resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
7267 integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
7297 7268
7298semver@~5.3.0: 7269semver@~5.3.0:
7299 version "5.3.0" 7270 version "5.3.0"
7300 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 7271 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
7272 integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
7301 7273
7302send@0.13.1: 7274send@0.13.1:
7303 version "0.13.1" 7275 version "0.13.1"
7304 resolved "https://registry.yarnpkg.com/send/-/send-0.13.1.tgz#a30d5f4c82c8a9bae9ad00a1d9b1bdbe6f199ed7" 7276 resolved "https://registry.yarnpkg.com/send/-/send-0.13.1.tgz#a30d5f4c82c8a9bae9ad00a1d9b1bdbe6f199ed7"
7277 integrity sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=
7305 dependencies: 7278 dependencies:
7306 debug "~2.2.0" 7279 debug "~2.2.0"
7307 depd "~1.1.0" 7280 depd "~1.1.0"
@@ -7319,6 +7292,7 @@ send@0.13.1:
7319send@0.13.2: 7292send@0.13.2:
7320 version "0.13.2" 7293 version "0.13.2"
7321 resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" 7294 resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
7295 integrity sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=
7322 dependencies: 7296 dependencies:
7323 debug "~2.2.0" 7297 debug "~2.2.0"
7324 depd "~1.1.0" 7298 depd "~1.1.0"
@@ -7336,6 +7310,7 @@ send@0.13.2:
7336send@0.16.2: 7310send@0.16.2:
7337 version "0.16.2" 7311 version "0.16.2"
7338 resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 7312 resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
7313 integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
7339 dependencies: 7314 dependencies:
7340 debug "2.6.9" 7315 debug "2.6.9"
7341 depd "~1.1.2" 7316 depd "~1.1.2"
@@ -7354,6 +7329,7 @@ send@0.16.2:
7354sequelize-typescript@0.6.6: 7329sequelize-typescript@0.6.6:
7355 version "0.6.6" 7330 version "0.6.6"
7356 resolved "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-0.6.6.tgz#926037b542dae9f4eff20609d095cc5e3a3640f3" 7331 resolved "https://registry.yarnpkg.com/sequelize-typescript/-/sequelize-typescript-0.6.6.tgz#926037b542dae9f4eff20609d095cc5e3a3640f3"
7332 integrity sha512-WGJTaNuHyYwUM8itxZvMVLeNEb7xSjisbVN1Q5rxLaIf2w67Xaf1GX6Jb+9840bjcNPvMsKgC2aR88zmw7UlcQ==
7357 dependencies: 7333 dependencies:
7358 "@types/bluebird" "3.5.18" 7334 "@types/bluebird" "3.5.18"
7359 "@types/node" "6.0.41" 7335 "@types/node" "6.0.41"
@@ -7361,9 +7337,10 @@ sequelize-typescript@0.6.6:
7361 es6-shim "0.35.3" 7337 es6-shim "0.35.3"
7362 glob "7.1.2" 7338 glob "7.1.2"
7363 7339
7364sequelize@4.38.0: 7340sequelize@4.41.2:
7365 version "4.38.0" 7341 version "4.41.2"
7366 resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.38.0.tgz#330c1aa445d4e46b80a97d895603c01666cdc357" 7342 resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.41.2.tgz#bb9ba30d72e9eeb883c9861cd0e2cac672010883"
7343 integrity sha512-8vPf2R0o9iEmtzkqNzwFdblO+0Mu+RNxOdLeYGGqWGlp3cushLpQucAeSGPQgf2hQVZP5yOCM1ouZKTQ5FTlvA==
7367 dependencies: 7344 dependencies:
7368 bluebird "^3.5.0" 7345 bluebird "^3.5.0"
7369 cls-bluebird "^2.1.0" 7346 cls-bluebird "^2.1.0"
@@ -7383,21 +7360,10 @@ sequelize@4.38.0:
7383 validator "^10.4.0" 7360 validator "^10.4.0"
7384 wkx "^0.4.1" 7361 wkx "^0.4.1"
7385 7362
7386serve-index@^1.7.1: 7363serve-static@1.13.2:
7387 version "1.9.1"
7388 resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
7389 dependencies:
7390 accepts "~1.3.4"
7391 batch "0.6.1"
7392 debug "2.6.9"
7393 escape-html "~1.0.3"
7394 http-errors "~1.6.2"
7395 mime-types "~2.1.17"
7396 parseurl "~1.3.2"
7397
7398serve-static@1.13.2, serve-static@^1.10.0:
7399 version "1.13.2" 7364 version "1.13.2"
7400 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 7365 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
7366 integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
7401 dependencies: 7367 dependencies:
7402 encodeurl "~1.0.2" 7368 encodeurl "~1.0.2"
7403 escape-html "~1.0.3" 7369 escape-html "~1.0.3"
@@ -7407,6 +7373,7 @@ serve-static@1.13.2, serve-static@^1.10.0:
7407serve-static@~1.10.2: 7373serve-static@~1.10.2:
7408 version "1.10.3" 7374 version "1.10.3"
7409 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" 7375 resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535"
7376 integrity sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=
7410 dependencies: 7377 dependencies:
7411 escape-html "~1.0.3" 7378 escape-html "~1.0.3"
7412 parseurl "~1.3.1" 7379 parseurl "~1.3.1"
@@ -7415,10 +7382,12 @@ serve-static@~1.10.2:
7415set-blocking@^2.0.0, set-blocking@~2.0.0: 7382set-blocking@^2.0.0, set-blocking@~2.0.0:
7416 version "2.0.0" 7383 version "2.0.0"
7417 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 7384 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
7385 integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
7418 7386
7419set-value@^0.4.3: 7387set-value@^0.4.3:
7420 version "0.4.3" 7388 version "0.4.3"
7421 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 7389 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
7390 integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
7422 dependencies: 7391 dependencies:
7423 extend-shallow "^2.0.1" 7392 extend-shallow "^2.0.1"
7424 is-extendable "^0.1.1" 7393 is-extendable "^0.1.1"
@@ -7428,91 +7397,103 @@ set-value@^0.4.3:
7428set-value@^2.0.0: 7397set-value@^2.0.0:
7429 version "2.0.0" 7398 version "2.0.0"
7430 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 7399 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
7400 integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
7431 dependencies: 7401 dependencies:
7432 extend-shallow "^2.0.1" 7402 extend-shallow "^2.0.1"
7433 is-extendable "^0.1.1" 7403 is-extendable "^0.1.1"
7434 is-plain-object "^2.0.3" 7404 is-plain-object "^2.0.3"
7435 split-string "^3.0.1" 7405 split-string "^3.0.1"
7436 7406
7437setprototypeof@1.0.3:
7438 version "1.0.3"
7439 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
7440
7441setprototypeof@1.1.0: 7407setprototypeof@1.1.0:
7442 version "1.1.0" 7408 version "1.1.0"
7443 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 7409 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
7410 integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
7444 7411
7445sha@~2.0.1: 7412sha@~2.0.1:
7446 version "2.0.1" 7413 version "2.0.1"
7447 resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" 7414 resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae"
7415 integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4=
7448 dependencies: 7416 dependencies:
7449 graceful-fs "^4.1.2" 7417 graceful-fs "^4.1.2"
7450 readable-stream "^2.0.2" 7418 readable-stream "^2.0.2"
7451 7419
7452sharp@^0.20.0: 7420sharp@^0.21.0:
7453 version "0.20.8" 7421 version "0.21.0"
7454 resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.20.8.tgz#e853f10b53b730824f0c3c5e453c79fa0812a48b" 7422 resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.21.0.tgz#e3cf2e4cb9382caf78efb3d45252381730e899c4"
7423 integrity sha512-qr6yMl0ju8EGMtjIj5U1Ojj8sKuZ99/DQaNKWmoFHxqg3692AFSrEiPI/yr0O05OWtGD8LuCw8WSGmnZcNrZaA==
7455 dependencies: 7424 dependencies:
7456 color "^3.0.0" 7425 color "^3.0.0"
7457 detect-libc "^1.0.3" 7426 detect-libc "^1.0.3"
7458 fs-copy-file-sync "^1.1.1" 7427 fs-copy-file-sync "^1.1.1"
7459 nan "^2.11.0" 7428 nan "^2.11.1"
7460 npmlog "^4.1.2" 7429 npmlog "^4.1.2"
7461 prebuild-install "^4.0.0" 7430 prebuild-install "^5.2.0"
7462 semver "^5.5.1" 7431 semver "^5.5.1"
7463 simple-get "^2.8.1" 7432 simple-get "^3.0.3"
7464 tar "^4.4.6" 7433 tar "^4.4.6"
7465 tunnel-agent "^0.6.0" 7434 tunnel-agent "^0.6.0"
7466 7435
7467shebang-command@^1.2.0: 7436shebang-command@^1.2.0:
7468 version "1.2.0" 7437 version "1.2.0"
7469 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 7438 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
7439 integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
7470 dependencies: 7440 dependencies:
7471 shebang-regex "^1.0.0" 7441 shebang-regex "^1.0.0"
7472 7442
7473shebang-regex@^1.0.0: 7443shebang-regex@^1.0.0:
7474 version "1.0.0" 7444 version "1.0.0"
7475 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 7445 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
7476 7446 integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
7477shelljs@0.3.x:
7478 version "0.3.0"
7479 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
7480 7447
7481shelljs@^0.6.0: 7448shelljs@^0.6.0:
7482 version "0.6.1" 7449 version "0.6.1"
7483 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" 7450 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8"
7451 integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=
7484 7452
7485shimmer@^1.1.0: 7453shimmer@^1.1.0:
7486 version "1.2.0" 7454 version "1.2.0"
7487 resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" 7455 resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665"
7456 integrity sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==
7488 7457
7489signal-exit@^3.0.0, signal-exit@^3.0.2: 7458signal-exit@^3.0.0, signal-exit@^3.0.2:
7490 version "3.0.2" 7459 version "3.0.2"
7491 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 7460 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
7461 integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
7492 7462
7493simple-concat@^1.0.0: 7463simple-concat@^1.0.0:
7494 version "1.0.0" 7464 version "1.0.0"
7495 resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 7465 resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
7466 integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
7496 7467
7497simple-get@^2.7.0, simple-get@^2.8.1: 7468simple-get@^2.7.0:
7498 version "2.8.1" 7469 version "2.8.1"
7499 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" 7470 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
7471 integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
7500 dependencies: 7472 dependencies:
7501 decompress-response "^3.3.0" 7473 decompress-response "^3.3.0"
7502 once "^1.3.1" 7474 once "^1.3.1"
7503 simple-concat "^1.0.0" 7475 simple-concat "^1.0.0"
7504 7476
7505simple-get@^3.0.0, simple-get@^3.0.1: 7477simple-get@^3.0.0, simple-get@^3.0.1, simple-get@^3.0.3:
7506 version "3.0.3" 7478 version "3.0.3"
7507 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" 7479 resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa"
7480 integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==
7508 dependencies: 7481 dependencies:
7509 decompress-response "^3.3.0" 7482 decompress-response "^3.3.0"
7510 once "^1.3.1" 7483 once "^1.3.1"
7511 simple-concat "^1.0.0" 7484 simple-concat "^1.0.0"
7512 7485
7486simple-git@^1.85.0:
7487 version "1.107.0"
7488 resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.107.0.tgz#12cffaf261c14d6f450f7fdb86c21ccee968b383"
7489 integrity sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==
7490 dependencies:
7491 debug "^4.0.1"
7492
7513simple-peer@^9.0.0: 7493simple-peer@^9.0.0:
7514 version "9.1.2" 7494 version "9.1.2"
7515 resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.1.2.tgz#f8afa5eb83f8a17d66e437e5ac54c1221eca4b39" 7495 resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.1.2.tgz#f8afa5eb83f8a17d66e437e5ac54c1221eca4b39"
7496 integrity sha512-MUWWno5o5cvISKOH4pYQ18PQJLpDaNWoKUbrPPKuspCLCkkh+zhtuQyTE8h2U2Ags+/OUN5wnUe92+9B8/Sm2Q==
7516 dependencies: 7497 dependencies:
7517 debug "^3.1.0" 7498 debug "^3.1.0"
7518 get-browser-rtc "^1.0.0" 7499 get-browser-rtc "^1.0.0"
@@ -7523,18 +7504,21 @@ simple-peer@^9.0.0:
7523simple-sha1@^2.0.0, simple-sha1@^2.0.8, simple-sha1@^2.1.0: 7504simple-sha1@^2.0.0, simple-sha1@^2.0.8, simple-sha1@^2.1.0:
7524 version "2.1.1" 7505 version "2.1.1"
7525 resolved "https://registry.yarnpkg.com/simple-sha1/-/simple-sha1-2.1.1.tgz#93f3b7f2e8dfdc056c32793e5d47b58d311b140d" 7506 resolved "https://registry.yarnpkg.com/simple-sha1/-/simple-sha1-2.1.1.tgz#93f3b7f2e8dfdc056c32793e5d47b58d311b140d"
7507 integrity sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==
7526 dependencies: 7508 dependencies:
7527 rusha "^0.8.1" 7509 rusha "^0.8.1"
7528 7510
7529simple-swizzle@^0.2.2: 7511simple-swizzle@^0.2.2:
7530 version "0.2.2" 7512 version "0.2.2"
7531 resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 7513 resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
7514 integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
7532 dependencies: 7515 dependencies:
7533 is-arrayish "^0.3.1" 7516 is-arrayish "^0.3.1"
7534 7517
7535simple-websocket@^7.0.1: 7518simple-websocket@^7.0.1:
7536 version "7.2.0" 7519 version "7.2.0"
7537 resolved "https://registry.yarnpkg.com/simple-websocket/-/simple-websocket-7.2.0.tgz#c3190555d74399372b96b51435f2d8c4b04611df" 7520 resolved "https://registry.yarnpkg.com/simple-websocket/-/simple-websocket-7.2.0.tgz#c3190555d74399372b96b51435f2d8c4b04611df"
7521 integrity sha512-wdxFg1fHw1yqFKWDcw+yNb4VIYqtl+vknZMlpLhvZSlR6l7/iVuwozqo+Qtl73mB1IH5QnXzonD1S+hAaLNTvQ==
7538 dependencies: 7522 dependencies:
7539 debug "^3.1.0" 7523 debug "^3.1.0"
7540 inherits "^2.0.1" 7524 inherits "^2.0.1"
@@ -7542,39 +7526,56 @@ simple-websocket@^7.0.1:
7542 readable-stream "^2.0.5" 7526 readable-stream "^2.0.5"
7543 ws "^6.0.0" 7527 ws "^6.0.0"
7544 7528
7529sitemap@^2.1.0:
7530 version "2.1.0"
7531 resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-2.1.0.tgz#1633cb88c196d755ad94becfb1c1bcacc6d3425a"
7532 integrity sha512-AkfA7RDVCITQo+j5CpXsMJlZ/8ENO2NtgMHYIh+YMvex2Hao/oe3MQgNa03p0aWY6srCfUA1Q02OgiWCAiuccA==
7533 dependencies:
7534 lodash "^4.17.10"
7535 url-join "^4.0.0"
7536 xmlbuilder "^10.0.0"
7537
7545slash@^1.0.0: 7538slash@^1.0.0:
7546 version "1.0.0" 7539 version "1.0.0"
7547 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 7540 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
7541 integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
7548 7542
7549slash@^2.0.0: 7543slash@^2.0.0:
7550 version "2.0.0" 7544 version "2.0.0"
7551 resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 7545 resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
7546 integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
7552 7547
7553slice-ansi@0.0.4: 7548slice-ansi@0.0.4:
7554 version "0.0.4" 7549 version "0.0.4"
7555 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 7550 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
7551 integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
7556 7552
7557slide@^1.1.3, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: 7553slide@^1.1.3, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
7558 version "1.1.6" 7554 version "1.1.6"
7559 resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 7555 resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
7556 integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
7560 7557
7561smart-buffer@^1.0.13: 7558smart-buffer@^1.0.13:
7562 version "1.1.15" 7559 version "1.1.15"
7563 resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" 7560 resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
7561 integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=
7564 7562
7565smart-buffer@^4.0.1: 7563smart-buffer@^4.0.1:
7566 version "4.0.1" 7564 version "4.0.1"
7567 resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" 7565 resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3"
7566 integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==
7568 7567
7569smtp-connection@2.3.1: 7568smtp-connection@2.3.1:
7570 version "2.3.1" 7569 version "2.3.1"
7571 resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.3.1.tgz#d169c8f1c9a73854134cdabe6fb818237dfc4fba" 7570 resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.3.1.tgz#d169c8f1c9a73854134cdabe6fb818237dfc4fba"
7571 integrity sha1-0WnI8cmnOFQTTNq+b7gYI338T7o=
7572 dependencies: 7572 dependencies:
7573 nodemailer-shared "1.0.4" 7573 nodemailer-shared "1.0.4"
7574 7574
7575smtp-server@1.16.1: 7575smtp-server@1.16.1:
7576 version "1.16.1" 7576 version "1.16.1"
7577 resolved "https://registry.yarnpkg.com/smtp-server/-/smtp-server-1.16.1.tgz#91d2dbd5e8bb9ed395b1a1774e8b60dd7b24e453" 7577 resolved "https://registry.yarnpkg.com/smtp-server/-/smtp-server-1.16.1.tgz#91d2dbd5e8bb9ed395b1a1774e8b60dd7b24e453"
7578 integrity sha1-kdLb1ei7ntOVsaF3Totg3Xsk5FM=
7578 dependencies: 7579 dependencies:
7579 ipv6-normalize "^1.0.1" 7580 ipv6-normalize "^1.0.1"
7580 nodemailer-shared "^1.1.0" 7581 nodemailer-shared "^1.1.0"
@@ -7582,6 +7583,7 @@ smtp-server@1.16.1:
7582snapdragon-node@^2.0.1: 7583snapdragon-node@^2.0.1:
7583 version "2.1.1" 7584 version "2.1.1"
7584 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 7585 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
7586 integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
7585 dependencies: 7587 dependencies:
7586 define-property "^1.0.0" 7588 define-property "^1.0.0"
7587 isobject "^3.0.0" 7589 isobject "^3.0.0"
@@ -7590,12 +7592,14 @@ snapdragon-node@^2.0.1:
7590snapdragon-util@^3.0.1: 7592snapdragon-util@^3.0.1:
7591 version "3.0.1" 7593 version "3.0.1"
7592 resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 7594 resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
7595 integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
7593 dependencies: 7596 dependencies:
7594 kind-of "^3.2.0" 7597 kind-of "^3.2.0"
7595 7598
7596snapdragon@^0.8.1: 7599snapdragon@^0.8.1:
7597 version "0.8.2" 7600 version "0.8.2"
7598 resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 7601 resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
7602 integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
7599 dependencies: 7603 dependencies:
7600 base "^0.11.1" 7604 base "^0.11.1"
7601 debug "^2.2.0" 7605 debug "^2.2.0"
@@ -7609,13 +7613,20 @@ snapdragon@^0.8.1:
7609socket.io-adapter@0.5.0: 7613socket.io-adapter@0.5.0:
7610 version "0.5.0" 7614 version "0.5.0"
7611 resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" 7615 resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
7616 integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=
7612 dependencies: 7617 dependencies:
7613 debug "2.3.3" 7618 debug "2.3.3"
7614 socket.io-parser "2.3.1" 7619 socket.io-parser "2.3.1"
7615 7620
7621socket.io-adapter@~1.1.0:
7622 version "1.1.1"
7623 resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
7624 integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=
7625
7616socket.io-client@1.7.3: 7626socket.io-client@1.7.3:
7617 version "1.7.3" 7627 version "1.7.3"
7618 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" 7628 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377"
7629 integrity sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=
7619 dependencies: 7630 dependencies:
7620 backo2 "1.0.2" 7631 backo2 "1.0.2"
7621 component-bind "1.0.0" 7632 component-bind "1.0.0"
@@ -7629,18 +7640,49 @@ socket.io-client@1.7.3:
7629 socket.io-parser "2.3.1" 7640 socket.io-parser "2.3.1"
7630 to-array "0.1.4" 7641 to-array "0.1.4"
7631 7642
7643socket.io-client@2.2.0:
7644 version "2.2.0"
7645 resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7"
7646 integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==
7647 dependencies:
7648 backo2 "1.0.2"
7649 base64-arraybuffer "0.1.5"
7650 component-bind "1.0.0"
7651 component-emitter "1.2.1"
7652 debug "~3.1.0"
7653 engine.io-client "~3.3.1"
7654 has-binary2 "~1.0.2"
7655 has-cors "1.1.0"
7656 indexof "0.0.1"
7657 object-component "0.0.3"
7658 parseqs "0.0.5"
7659 parseuri "0.0.5"
7660 socket.io-parser "~3.3.0"
7661 to-array "0.1.4"
7662
7632socket.io-parser@2.3.1: 7663socket.io-parser@2.3.1:
7633 version "2.3.1" 7664 version "2.3.1"
7634 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" 7665 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
7666 integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=
7635 dependencies: 7667 dependencies:
7636 component-emitter "1.1.2" 7668 component-emitter "1.1.2"
7637 debug "2.2.0" 7669 debug "2.2.0"
7638 isarray "0.0.1" 7670 isarray "0.0.1"
7639 json3 "3.3.2" 7671 json3 "3.3.2"
7640 7672
7673socket.io-parser@~3.3.0:
7674 version "3.3.0"
7675 resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
7676 integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
7677 dependencies:
7678 component-emitter "1.2.1"
7679 debug "~3.1.0"
7680 isarray "2.0.1"
7681
7641socket.io@1.7.3: 7682socket.io@1.7.3:
7642 version "1.7.3" 7683 version "1.7.3"
7643 resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" 7684 resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b"
7685 integrity sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=
7644 dependencies: 7686 dependencies:
7645 debug "2.3.3" 7687 debug "2.3.3"
7646 engine.io "1.8.3" 7688 engine.io "1.8.3"
@@ -7650,9 +7692,22 @@ socket.io@1.7.3:
7650 socket.io-client "1.7.3" 7692 socket.io-client "1.7.3"
7651 socket.io-parser "2.3.1" 7693 socket.io-parser "2.3.1"
7652 7694
7695socket.io@^2.2.0:
7696 version "2.2.0"
7697 resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b"
7698 integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==
7699 dependencies:
7700 debug "~4.1.0"
7701 engine.io "~3.3.1"
7702 has-binary2 "~1.0.2"
7703 socket.io-adapter "~1.1.0"
7704 socket.io-client "2.2.0"
7705 socket.io-parser "~3.3.0"
7706
7653socks-proxy-agent@^3.0.1: 7707socks-proxy-agent@^3.0.1:
7654 version "3.0.1" 7708 version "3.0.1"
7655 resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" 7709 resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659"
7710 integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==
7656 dependencies: 7711 dependencies:
7657 agent-base "^4.1.0" 7712 agent-base "^4.1.0"
7658 socks "^1.1.10" 7713 socks "^1.1.10"
@@ -7660,6 +7715,7 @@ socks-proxy-agent@^3.0.1:
7660socks-proxy-agent@^4.0.0: 7715socks-proxy-agent@^4.0.0:
7661 version "4.0.1" 7716 version "4.0.1"
7662 resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" 7717 resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473"
7718 integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==
7663 dependencies: 7719 dependencies:
7664 agent-base "~4.2.0" 7720 agent-base "~4.2.0"
7665 socks "~2.2.0" 7721 socks "~2.2.0"
@@ -7667,13 +7723,15 @@ socks-proxy-agent@^4.0.0:
7667socks@^1.1.10: 7723socks@^1.1.10:
7668 version "1.1.10" 7724 version "1.1.10"
7669 resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" 7725 resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
7726 integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=
7670 dependencies: 7727 dependencies:
7671 ip "^1.1.4" 7728 ip "^1.1.4"
7672 smart-buffer "^1.0.13" 7729 smart-buffer "^1.0.13"
7673 7730
7674socks@~2.2.0: 7731socks@~2.2.0:
7675 version "2.2.1" 7732 version "2.2.2"
7676 resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.1.tgz#68ad678b3642fbc5d99c64c165bc561eab0215f9" 7733 resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.2.tgz#f061219fc2d4d332afb4af93e865c84d3fa26e2b"
7734 integrity sha512-g6wjBnnMOZpE0ym6e0uHSddz9p3a+WsBaaYQaBaSCJYvrC4IXykQR9MNGjLQf38e9iIIhp3b1/Zk8YZI3KGJ0Q==
7677 dependencies: 7735 dependencies:
7678 ip "^1.1.5" 7736 ip "^1.1.5"
7679 smart-buffer "^4.0.1" 7737 smart-buffer "^4.0.1"
@@ -7681,10 +7739,12 @@ socks@~2.2.0:
7681sorted-object@~2.0.1: 7739sorted-object@~2.0.1:
7682 version "2.0.1" 7740 version "2.0.1"
7683 resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" 7741 resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
7742 integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=
7684 7743
7685sorted-union-stream@~2.1.3: 7744sorted-union-stream@~2.1.3:
7686 version "2.1.3" 7745 version "2.1.3"
7687 resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" 7746 resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7"
7747 integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=
7688 dependencies: 7748 dependencies:
7689 from2 "^1.3.0" 7749 from2 "^1.3.0"
7690 stream-iterate "^1.1.0" 7750 stream-iterate "^1.1.0"
@@ -7692,6 +7752,7 @@ sorted-union-stream@~2.1.3:
7692source-map-resolve@^0.5.0: 7752source-map-resolve@^0.5.0:
7693 version "0.5.2" 7753 version "0.5.2"
7694 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 7754 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
7755 integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
7695 dependencies: 7756 dependencies:
7696 atob "^2.1.1" 7757 atob "^2.1.1"
7697 decode-uri-component "^0.2.0" 7758 decode-uri-component "^0.2.0"
@@ -7702,6 +7763,7 @@ source-map-resolve@^0.5.0:
7702source-map-support@^0.5.0, source-map-support@^0.5.6: 7763source-map-support@^0.5.0, source-map-support@^0.5.6:
7703 version "0.5.9" 7764 version "0.5.9"
7704 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 7765 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
7766 integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
7705 dependencies: 7767 dependencies:
7706 buffer-from "^1.0.0" 7768 buffer-from "^1.0.0"
7707 source-map "^0.6.0" 7769 source-map "^0.6.0"
@@ -7709,121 +7771,84 @@ source-map-support@^0.5.0, source-map-support@^0.5.6:
7709source-map-url@^0.4.0: 7771source-map-url@^0.4.0:
7710 version "0.4.0" 7772 version "0.4.0"
7711 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 7773 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
7774 integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
7712 7775
7713source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6: 7776source-map@^0.5.6:
7714 version "0.5.7" 7777 version "0.5.7"
7715 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 7778 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
7779 integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
7716 7780
7717source-map@^0.4.2: 7781source-map@^0.6.0:
7718 version "0.4.4"
7719 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
7720 dependencies:
7721 amdefine ">=0.0.4"
7722
7723source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
7724 version "0.6.1" 7782 version "0.6.1"
7725 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 7783 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
7726 7784 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
7727source-map@~0.1.33:
7728 version "0.1.43"
7729 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
7730 dependencies:
7731 amdefine ">=0.0.4"
7732 7785
7733spawn-command@^0.0.2-1: 7786spawn-command@^0.0.2-1:
7734 version "0.0.2-1" 7787 version "0.0.2-1"
7735 resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" 7788 resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
7789 integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=
7736 7790
7737spdx-correct@^3.0.0: 7791spdx-correct@^3.0.0:
7738 version "3.0.0" 7792 version "3.0.2"
7739 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 7793 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
7794 integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==
7740 dependencies: 7795 dependencies:
7741 spdx-expression-parse "^3.0.0" 7796 spdx-expression-parse "^3.0.0"
7742 spdx-license-ids "^3.0.0" 7797 spdx-license-ids "^3.0.0"
7743 7798
7744spdx-exceptions@^2.1.0: 7799spdx-exceptions@^2.1.0:
7745 version "2.1.0" 7800 version "2.2.0"
7746 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 7801 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
7802 integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
7747 7803
7748spdx-expression-parse@^3.0.0: 7804spdx-expression-parse@^3.0.0:
7749 version "3.0.0" 7805 version "3.0.0"
7750 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 7806 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
7807 integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
7751 dependencies: 7808 dependencies:
7752 spdx-exceptions "^2.1.0" 7809 spdx-exceptions "^2.1.0"
7753 spdx-license-ids "^3.0.0" 7810 spdx-license-ids "^3.0.0"
7754 7811
7755spdx-license-ids@^3.0.0: 7812spdx-license-ids@^3.0.0:
7756 version "3.0.1" 7813 version "3.0.2"
7757 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" 7814 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
7758 7815 integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
7759spectacle-docs@^1.0.2:
7760 version "1.0.6"
7761 resolved "https://registry.yarnpkg.com/spectacle-docs/-/spectacle-docs-1.0.6.tgz#ab59e5ac4ed7474039ae7e2bc492e78cd9031ca4"
7762 dependencies:
7763 bluebird "^3.4.7"
7764 cheerio "^0.19.0"
7765 clarify "^1.0.5"
7766 commander "*"
7767 foundation-sites "^6.4.1"
7768 grunt "^1.0.3"
7769 grunt-compile-handlebars "^2.0.0"
7770 grunt-contrib-clean "^1.1.0"
7771 grunt-contrib-concat "^1.0.1"
7772 grunt-contrib-connect "^1.0.2"
7773 grunt-contrib-copy "^1.0.0"
7774 grunt-contrib-cssmin "^2.2.1"
7775 grunt-contrib-handlebars "^1.0.0"
7776 grunt-contrib-jshint "^1.1.0"
7777 grunt-contrib-uglify "^3.3.0"
7778 grunt-contrib-watch "^1.1.0"
7779 grunt-embed "^0.2.1"
7780 grunt-prettify "^0.4.0"
7781 grunt-sass "^3.0.0"
7782 handlebars "^4.0.5"
7783 highlight.js "^9.1.0"
7784 js-yaml "^3.8.2"
7785 json-refs "^2.1.6"
7786 json-stable-stringify "^1.0.1"
7787 lodash "^4.2.1"
7788 marked "^0.3.5"
7789 node-sass "^4.9.0"
7790 sync-request "^4.1.0"
7791 tmp "0.0.31"
7792 trace "^1.1.0"
7793 7816
7794speedometer@^1.0.0: 7817speedometer@^1.0.0:
7795 version "1.1.0" 7818 version "1.1.0"
7796 resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.1.0.tgz#a30b13abda45687a1a76977012c060f2ac8a7934" 7819 resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.1.0.tgz#a30b13abda45687a1a76977012c060f2ac8a7934"
7820 integrity sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==
7797 7821
7798split-string@^3.0.1, split-string@^3.0.2: 7822split-string@^3.0.1, split-string@^3.0.2:
7799 version "3.1.0" 7823 version "3.1.0"
7800 resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 7824 resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
7825 integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
7801 dependencies: 7826 dependencies:
7802 extend-shallow "^3.0.0" 7827 extend-shallow "^3.0.0"
7803 7828
7804split2@^0.2.1: 7829split2@^0.2.1:
7805 version "0.2.1" 7830 version "0.2.1"
7806 resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" 7831 resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900"
7832 integrity sha1-At2smtwD7Au3jBKC7Aecpuha6QA=
7807 dependencies: 7833 dependencies:
7808 through2 "~0.6.1" 7834 through2 "~0.6.1"
7809 7835
7810split@^1.0.0, split@^1.0.1: 7836split@^1.0.0:
7811 version "1.0.1" 7837 version "1.0.1"
7812 resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 7838 resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
7839 integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
7813 dependencies: 7840 dependencies:
7814 through "2" 7841 through "2"
7815 7842
7816sprintf-js@^1.0.3:
7817 version "1.1.1"
7818 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
7819
7820sprintf-js@~1.0.2: 7843sprintf-js@~1.0.2:
7821 version "1.0.3" 7844 version "1.0.3"
7822 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 7845 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
7846 integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
7823 7847
7824srt-to-vtt@^1.1.2: 7848srt-to-vtt@^1.1.2:
7825 version "1.1.3" 7849 version "1.1.3"
7826 resolved "https://registry.yarnpkg.com/srt-to-vtt/-/srt-to-vtt-1.1.3.tgz#a9bc16cde5412e000e59ffda469f3e9befed5dde" 7850 resolved "https://registry.yarnpkg.com/srt-to-vtt/-/srt-to-vtt-1.1.3.tgz#a9bc16cde5412e000e59ffda469f3e9befed5dde"
7851 integrity sha512-QHy2syDTGUzQiDtKwqSunVdh0H5dhtVt9bh/Z+yTcminD69UKk3RFVhUtBjoCh/W5OYX36Igwv5qy2JZPISwgQ==
7827 dependencies: 7852 dependencies:
7828 duplexify "^3.2.0" 7853 duplexify "^3.2.0"
7829 minimist "^1.1.0" 7854 minimist "^1.1.0"
@@ -7833,83 +7858,76 @@ srt-to-vtt@^1.1.2:
7833 to-utf-8 "^1.2.0" 7858 to-utf-8 "^1.2.0"
7834 7859
7835sshpk@^1.7.0: 7860sshpk@^1.7.0:
7836 version "1.14.2" 7861 version "1.15.2"
7837 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" 7862 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629"
7863 integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==
7838 dependencies: 7864 dependencies:
7839 asn1 "~0.2.3" 7865 asn1 "~0.2.3"
7840 assert-plus "^1.0.0" 7866 assert-plus "^1.0.0"
7841 dashdash "^1.12.0"
7842 getpass "^0.1.1"
7843 safer-buffer "^2.0.2"
7844 optionalDependencies:
7845 bcrypt-pbkdf "^1.0.0" 7867 bcrypt-pbkdf "^1.0.0"
7868 dashdash "^1.12.0"
7846 ecc-jsbn "~0.1.1" 7869 ecc-jsbn "~0.1.1"
7870 getpass "^0.1.1"
7847 jsbn "~0.1.0" 7871 jsbn "~0.1.0"
7872 safer-buffer "^2.0.2"
7848 tweetnacl "~0.14.0" 7873 tweetnacl "~0.14.0"
7849 7874
7850ssri@^5.2.4: 7875ssri@^5.2.4:
7851 version "5.3.0" 7876 version "5.3.0"
7852 resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" 7877 resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
7878 integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
7853 dependencies: 7879 dependencies:
7854 safe-buffer "^5.1.1" 7880 safe-buffer "^5.1.1"
7855 7881
7856ssri@^6.0.0: 7882ssri@^6.0.0:
7857 version "6.0.1" 7883 version "6.0.1"
7858 resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" 7884 resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
7885 integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
7859 dependencies: 7886 dependencies:
7860 figgy-pudding "^3.5.1" 7887 figgy-pudding "^3.5.1"
7861 7888
7862stack-chain@1.3.x, stack-chain@~1.3.1:
7863 version "1.3.7"
7864 resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285"
7865
7866stack-trace@0.0.x: 7889stack-trace@0.0.x:
7867 version "0.0.10" 7890 version "0.0.10"
7868 resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 7891 resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
7892 integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
7869 7893
7870staged-git-files@1.1.1: 7894staged-git-files@1.1.2:
7871 version "1.1.1" 7895 version "1.1.2"
7872 resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.1.tgz#37c2218ef0d6d26178b1310719309a16a59f8f7b" 7896 resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b"
7897 integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==
7873 7898
7874static-extend@^0.1.1: 7899static-extend@^0.1.1:
7875 version "0.1.2" 7900 version "0.1.2"
7876 resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 7901 resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
7902 integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
7877 dependencies: 7903 dependencies:
7878 define-property "^0.2.5" 7904 define-property "^0.2.5"
7879 object-copy "^0.1.0" 7905 object-copy "^0.1.0"
7880 7906
7881statuses@1, "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": 7907statuses@1, "statuses@>= 1.4.0 < 2":
7882 version "1.5.0" 7908 version "1.5.0"
7883 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 7909 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
7910 integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
7884 7911
7885statuses@1.3.1, statuses@~1.3.1: 7912statuses@1.3.1:
7886 version "1.3.1" 7913 version "1.3.1"
7887 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 7914 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
7915 integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=
7888 7916
7889statuses@~1.2.1: 7917statuses@~1.2.1:
7890 version "1.2.1" 7918 version "1.2.1"
7891 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" 7919 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28"
7920 integrity sha1-3e1FzBglbVHtQK7BQkidXGECbSg=
7892 7921
7893statuses@~1.4.0: 7922statuses@~1.4.0:
7894 version "1.4.0" 7923 version "1.4.0"
7895 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 7924 resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
7896 7925 integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
7897stdout-stream@^1.4.0:
7898 version "1.4.1"
7899 resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
7900 dependencies:
7901 readable-stream "^2.0.1"
7902
7903stream-combiner@^0.2.2:
7904 version "0.2.2"
7905 resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858"
7906 dependencies:
7907 duplexer "~0.1.1"
7908 through "~2.3.4"
7909 7926
7910stream-each@^1.1.0: 7927stream-each@^1.1.0:
7911 version "1.2.3" 7928 version "1.2.3"
7912 resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" 7929 resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
7930 integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
7913 dependencies: 7931 dependencies:
7914 end-of-stream "^1.1.0" 7932 end-of-stream "^1.1.0"
7915 stream-shift "^1.0.0" 7933 stream-shift "^1.0.0"
@@ -7917,6 +7935,7 @@ stream-each@^1.1.0:
7917stream-iterate@^1.1.0: 7935stream-iterate@^1.1.0:
7918 version "1.2.0" 7936 version "1.2.0"
7919 resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" 7937 resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1"
7938 integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=
7920 dependencies: 7939 dependencies:
7921 readable-stream "^2.1.5" 7940 readable-stream "^2.1.5"
7922 stream-shift "^1.0.0" 7941 stream-shift "^1.0.0"
@@ -7924,10 +7943,12 @@ stream-iterate@^1.1.0:
7924stream-shift@^1.0.0: 7943stream-shift@^1.0.0:
7925 version "1.0.0" 7944 version "1.0.0"
7926 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 7945 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
7946 integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
7927 7947
7928stream-splicer@^1.3.1: 7948stream-splicer@^1.3.1:
7929 version "1.3.2" 7949 version "1.3.2"
7930 resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661" 7950 resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661"
7951 integrity sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=
7931 dependencies: 7952 dependencies:
7932 indexof "0.0.1" 7953 indexof "0.0.1"
7933 inherits "^2.0.1" 7954 inherits "^2.0.1"
@@ -7939,46 +7960,50 @@ stream-splicer@^1.3.1:
7939stream-to-blob-url@^2.0.0, stream-to-blob-url@^2.1.0: 7960stream-to-blob-url@^2.0.0, stream-to-blob-url@^2.1.0:
7940 version "2.1.1" 7961 version "2.1.1"
7941 resolved "https://registry.yarnpkg.com/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz#e1ac97f86ca8e9f512329a48e7830ce9a50beef2" 7962 resolved "https://registry.yarnpkg.com/stream-to-blob-url/-/stream-to-blob-url-2.1.1.tgz#e1ac97f86ca8e9f512329a48e7830ce9a50beef2"
7963 integrity sha512-DKJPEmCmIZoBfGVle9IhSfERiWaN5cuOtmfPxP2dZbLDRZxkBWZ4QbYxEJOSALk1Kf+WjBgedAMO6qkkf7Lmrg==
7942 dependencies: 7964 dependencies:
7943 stream-to-blob "^1.0.0" 7965 stream-to-blob "^1.0.0"
7944 7966
7945stream-to-blob@^1.0.0: 7967stream-to-blob@^1.0.0:
7946 version "1.0.1" 7968 version "1.0.1"
7947 resolved "https://registry.yarnpkg.com/stream-to-blob/-/stream-to-blob-1.0.1.tgz#2dc1e09b71677a234d00445f8eb7ff70c4fe9948" 7969 resolved "https://registry.yarnpkg.com/stream-to-blob/-/stream-to-blob-1.0.1.tgz#2dc1e09b71677a234d00445f8eb7ff70c4fe9948"
7970 integrity sha512-aRy4neA4rf+qMtLT9fCRLPGWdrsIKtCx4kUdNTIPgPQ2hkHkdxbViVAvABMx9oRM6yCWfngHx6pwXfbYkVuPuw==
7948 dependencies: 7971 dependencies:
7949 once "^1.3.3" 7972 once "^1.3.3"
7950 7973
7951stream-with-known-length-to-buffer@^1.0.0: 7974stream-with-known-length-to-buffer@^1.0.0:
7952 version "1.0.2" 7975 version "1.0.2"
7953 resolved "https://registry.yarnpkg.com/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz#b8ea5a92086a1ed5d27fc4c529636682118c945b" 7976 resolved "https://registry.yarnpkg.com/stream-with-known-length-to-buffer/-/stream-with-known-length-to-buffer-1.0.2.tgz#b8ea5a92086a1ed5d27fc4c529636682118c945b"
7977 integrity sha512-UxSISjxmguvfYzZdq6d4XAjc3gAocqTIOS1CjgwkDkkGT/LMTsIYiV8agIw42IHFFHf8k4lPOoroCCf4W9oqzg==
7954 dependencies: 7978 dependencies:
7955 once "^1.3.3" 7979 once "^1.3.3"
7956 7980
7957streamify@^0.2.9: 7981streamify@^0.2.9:
7958 version "0.2.9" 7982 version "0.2.9"
7959 resolved "https://registry.yarnpkg.com/streamify/-/streamify-0.2.9.tgz#8938b14db491e2b6be4f8d99cc4133c9f0384f0b" 7983 resolved "https://registry.yarnpkg.com/streamify/-/streamify-0.2.9.tgz#8938b14db491e2b6be4f8d99cc4133c9f0384f0b"
7984 integrity sha512-8pUxeLEef9UO1FxtTt5iikAiyzGI4SZRnGuJ3sz8axZ5Xk+/7ezEV5kuJQsMEFxw7AKYw3xp0Ow+20mmSaJbQQ==
7960 dependencies: 7985 dependencies:
7961 hashish "~0.0.4" 7986 hashish "~0.0.4"
7962 7987
7963streamsearch@0.1.2: 7988streamsearch@0.1.2:
7964 version "0.1.2" 7989 version "0.1.2"
7965 resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 7990 resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
7991 integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=
7966 7992
7967strict-uri-encode@^2.0.0: 7993strict-uri-encode@^2.0.0:
7968 version "2.0.0" 7994 version "2.0.0"
7969 resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" 7995 resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
7996 integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
7970 7997
7971string-argv@^0.0.2: 7998string-argv@^0.0.2:
7972 version "0.0.2" 7999 version "0.0.2"
7973 resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" 8000 resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736"
8001 integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY=
7974 8002
7975string-template@~0.2.1: 8003string-width@^1.0.1:
7976 version "0.2.1"
7977 resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
7978
7979string-width@^1.0.1, string-width@^1.0.2:
7980 version "1.0.2" 8004 version "1.0.2"
7981 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 8005 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
8006 integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
7982 dependencies: 8007 dependencies:
7983 code-point-at "^1.0.0" 8008 code-point-at "^1.0.0"
7984 is-fullwidth-code-point "^1.0.0" 8009 is-fullwidth-code-point "^1.0.0"
@@ -7987,6 +8012,7 @@ string-width@^1.0.1, string-width@^1.0.2:
7987"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 8012"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1:
7988 version "2.1.1" 8013 version "2.1.1"
7989 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 8014 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
8015 integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
7990 dependencies: 8016 dependencies:
7991 is-fullwidth-code-point "^2.0.0" 8017 is-fullwidth-code-point "^2.0.0"
7992 strip-ansi "^4.0.0" 8018 strip-ansi "^4.0.0"
@@ -7994,79 +8020,86 @@ string-width@^1.0.1, string-width@^1.0.2:
7994string2compact@^1.1.1, string2compact@^1.2.5: 8020string2compact@^1.1.1, string2compact@^1.2.5:
7995 version "1.3.0" 8021 version "1.3.0"
7996 resolved "https://registry.yarnpkg.com/string2compact/-/string2compact-1.3.0.tgz#22d946127b082d1203c51316af60117a337423c3" 8022 resolved "https://registry.yarnpkg.com/string2compact/-/string2compact-1.3.0.tgz#22d946127b082d1203c51316af60117a337423c3"
8023 integrity sha512-004ulKKANDuQilQsNxy2lisrpMG0qUJxBU+2YCEF7KziRyNR0Nredm2qk0f1V82nva59H3y9GWeHXE63HzGRFw==
7997 dependencies: 8024 dependencies:
7998 addr-to-ip-port "^1.0.1" 8025 addr-to-ip-port "^1.0.1"
7999 ipaddr.js "^1.0.1" 8026 ipaddr.js "^1.0.1"
8000 8027
8001string_decoder@0.10, string_decoder@~0.10.x: 8028string_decoder@^1.1.1:
8029 version "1.2.0"
8030 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
8031 integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
8032 dependencies:
8033 safe-buffer "~5.1.0"
8034
8035string_decoder@~0.10.x:
8002 version "0.10.31" 8036 version "0.10.31"
8003 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 8037 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
8038 integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
8004 8039
8005string_decoder@^1.1.1, string_decoder@~1.1.1: 8040string_decoder@~1.1.1:
8006 version "1.1.1" 8041 version "1.1.1"
8007 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 8042 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
8043 integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
8008 dependencies: 8044 dependencies:
8009 safe-buffer "~5.1.0" 8045 safe-buffer "~5.1.0"
8010 8046
8011stringify-object@^3.2.2: 8047stringify-object@^3.2.2:
8012 version "3.2.2" 8048 version "3.3.0"
8013 resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd" 8049 resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
8050 integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
8014 dependencies: 8051 dependencies:
8015 get-own-enumerable-property-symbols "^2.0.1" 8052 get-own-enumerable-property-symbols "^3.0.0"
8016 is-obj "^1.0.1" 8053 is-obj "^1.0.1"
8017 is-regexp "^1.0.0" 8054 is-regexp "^1.0.0"
8018 8055
8019stringify-package@^1.0.0: 8056stringify-package@^1.0.0:
8020 version "1.0.0" 8057 version "1.0.0"
8021 resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" 8058 resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b"
8059 integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==
8022 8060
8023strip-ansi@^3.0.0, strip-ansi@^3.0.1: 8061strip-ansi@^3.0.0, strip-ansi@^3.0.1:
8024 version "3.0.1" 8062 version "3.0.1"
8025 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 8063 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
8064 integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
8026 dependencies: 8065 dependencies:
8027 ansi-regex "^2.0.0" 8066 ansi-regex "^2.0.0"
8028 8067
8029strip-ansi@^4.0.0: 8068strip-ansi@^4.0.0:
8030 version "4.0.0" 8069 version "4.0.0"
8031 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 8070 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
8071 integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
8032 dependencies: 8072 dependencies:
8033 ansi-regex "^3.0.0" 8073 ansi-regex "^3.0.0"
8034 8074
8035strip-bom@^2.0.0:
8036 version "2.0.0"
8037 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
8038 dependencies:
8039 is-utf8 "^0.2.0"
8040
8041strip-eof@^1.0.0: 8075strip-eof@^1.0.0:
8042 version "1.0.0" 8076 version "1.0.0"
8043 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 8077 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
8078 integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
8044 8079
8045strip-indent@^1.0.1: 8080strip-json-comments@~1.0.1:
8046 version "1.0.1"
8047 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
8048 dependencies:
8049 get-stdin "^4.0.1"
8050
8051strip-json-comments@1.0.x, strip-json-comments@~1.0.1:
8052 version "1.0.4" 8081 version "1.0.4"
8053 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 8082 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
8083 integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
8054 8084
8055strip-json-comments@~2.0.1: 8085strip-json-comments@~2.0.1:
8056 version "2.0.1" 8086 version "2.0.1"
8057 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 8087 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
8088 integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
8058 8089
8059summon-install@^0.4.3: 8090summon-install@^0.4.3:
8060 version "0.4.3" 8091 version "0.4.6"
8061 resolved "https://registry.yarnpkg.com/summon-install/-/summon-install-0.4.3.tgz#fa98fca67c57c9cf214ac7c48f33b9a49a6f5d97" 8092 resolved "https://registry.yarnpkg.com/summon-install/-/summon-install-0.4.6.tgz#25673446e8b92f8bc0afabc464aa7b73fe946bd5"
8093 integrity sha512-xLiRo8z2srFItquk4VXGfC6AsELPmFCYev5pipARHVCikrgCBdjHMxs2ZGfVcsOOKwTgEL6bVFutf5yF43GBZw==
8062 dependencies: 8094 dependencies:
8063 descrevit "^0.1.1" 8095 descrevit "^0.1.1"
8064 dot-json "^1.0.3" 8096 dot-json "^1.0.3"
8065 npm "^6.4.1" 8097 npm "*"
8066 8098
8067superagent@^3.8.3: 8099superagent@^3.8.3:
8068 version "3.8.3" 8100 version "3.8.3"
8069 resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" 8101 resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128"
8102 integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==
8070 dependencies: 8103 dependencies:
8071 component-emitter "^1.2.0" 8104 component-emitter "^1.2.0"
8072 cookiejar "^2.1.0" 8105 cookiejar "^2.1.0"
@@ -8082,6 +8115,7 @@ superagent@^3.8.3:
8082supertest@^3.0.0: 8115supertest@^3.0.0:
8083 version "3.3.0" 8116 version "3.3.0"
8084 resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.3.0.tgz#79b27bd7d34392974ab33a31fa51a3e23385987e" 8117 resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.3.0.tgz#79b27bd7d34392974ab33a31fa51a3e23385987e"
8118 integrity sha512-dMQSzYdaZRSANH5LL8kX3UpgK9G1LRh/jnggs/TI0W2Sz7rkMx9Y48uia3K9NgcaWEV28tYkBnXE4tiFC77ygQ==
8085 dependencies: 8119 dependencies:
8086 methods "^1.1.2" 8120 methods "^1.1.2"
8087 superagent "^3.8.3" 8121 superagent "^3.8.3"
@@ -8089,42 +8123,72 @@ supertest@^3.0.0:
8089supports-color@5.4.0: 8123supports-color@5.4.0:
8090 version "5.4.0" 8124 version "5.4.0"
8091 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 8125 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
8126 integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
8092 dependencies: 8127 dependencies:
8093 has-flag "^3.0.0" 8128 has-flag "^3.0.0"
8094 8129
8095supports-color@^2.0.0: 8130supports-color@^2.0.0:
8096 version "2.0.0" 8131 version "2.0.0"
8097 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 8132 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
8133 integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
8098 8134
8099supports-color@^4.5.0: 8135supports-color@^4.5.0:
8100 version "4.5.0" 8136 version "4.5.0"
8101 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 8137 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
8138 integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=
8102 dependencies: 8139 dependencies:
8103 has-flag "^2.0.0" 8140 has-flag "^2.0.0"
8104 8141
8105supports-color@^5.2.0, supports-color@^5.3.0: 8142supports-color@^5.2.0, supports-color@^5.3.0:
8106 version "5.5.0" 8143 version "5.5.0"
8107 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 8144 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
8145 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
8108 dependencies: 8146 dependencies:
8109 has-flag "^3.0.0" 8147 has-flag "^3.0.0"
8110 8148
8149swagger-cli@^2.2.0:
8150 version "2.2.0"
8151 resolved "https://registry.yarnpkg.com/swagger-cli/-/swagger-cli-2.2.0.tgz#837b01e1fd6cc6aa324f8884ec1151a3c17ca007"
8152 integrity sha512-coldykHxE3GRLsWMpY8hq08Bbe/z0IvW7P+c9wkEqrBGD3/byfyOGvXplH92N2KjVSHW9vaPBUafX6p+12eYFw==
8153 dependencies:
8154 chalk "^2.4.1"
8155 js-yaml "^3.12.0"
8156 mkdirp "^0.5.1"
8157 swagger-parser "^6.0.1"
8158 yargs "^12.0.2"
8159
8160swagger-methods@^1.0.6:
8161 version "1.0.6"
8162 resolved "https://registry.yarnpkg.com/swagger-methods/-/swagger-methods-1.0.6.tgz#b91c2e4f7f9e5e2c4cd3b285b8be06ca76b3cc6a"
8163 integrity sha512-21HVj5jwEjhTMBPBtJDNINItT5RrehikrlKBphnivELUn66RdVo8yQm/sKpZrUYSbr0ncueQx7vDEEHjl27yTg==
8164
8165swagger-parser@^6.0.1:
8166 version "6.0.2"
8167 resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-6.0.2.tgz#ef3fe95ae17eab2ba04d2646007df106c7b542b9"
8168 integrity sha512-MEl1Y1AfC4XL8050wf5HRE9fH74YVJxgHBrRNyqRwaY8Q+Fiuc5QV4wRtKtWx1ycpUCY1KZcjyc44MmL/CEryw==
8169 dependencies:
8170 call-me-maybe "^1.0.1"
8171 json-schema-ref-parser "^6.0.2"
8172 ono "^4.0.10"
8173 openapi-schema-validation "^0.4.2"
8174 swagger-methods "^1.0.6"
8175 swagger-schema-official "2.0.0-bab6bed"
8176 z-schema "^3.24.1"
8177
8178swagger-schema-official@2.0.0-bab6bed:
8179 version "2.0.0-bab6bed"
8180 resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd"
8181 integrity sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0=
8182
8111symbol-observable@^1.1.0: 8183symbol-observable@^1.1.0:
8112 version "1.2.0" 8184 version "1.2.0"
8113 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 8185 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
8114 8186 integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
8115sync-request@^4.1.0:
8116 version "4.1.0"
8117 resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-4.1.0.tgz#324b4e506fb994d2afd2a0021a455f800725f07a"
8118 dependencies:
8119 command-exists "^1.2.2"
8120 concat-stream "^1.6.0"
8121 get-port "^3.1.0"
8122 http-response-object "^1.1.0"
8123 then-request "^2.2.0"
8124 8187
8125table@^3.7.8: 8188table@^3.7.8:
8126 version "3.8.3" 8189 version "3.8.3"
8127 resolved "http://registry.npmjs.org/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 8190 resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
8191 integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
8128 dependencies: 8192 dependencies:
8129 ajv "^4.7.0" 8193 ajv "^4.7.0"
8130 ajv-keywords "^1.0.0" 8194 ajv-keywords "^1.0.0"
@@ -8136,6 +8200,7 @@ table@^3.7.8:
8136tar-fs@^1.13.0: 8200tar-fs@^1.13.0:
8137 version "1.16.3" 8201 version "1.16.3"
8138 resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" 8202 resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
8203 integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==
8139 dependencies: 8204 dependencies:
8140 chownr "^1.0.1" 8205 chownr "^1.0.1"
8141 mkdirp "^0.5.1" 8206 mkdirp "^0.5.1"
@@ -8143,33 +8208,36 @@ tar-fs@^1.13.0:
8143 tar-stream "^1.1.2" 8208 tar-stream "^1.1.2"
8144 8209
8145tar-stream@^1.1.2: 8210tar-stream@^1.1.2:
8146 version "1.6.1" 8211 version "1.6.2"
8147 resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" 8212 resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
8213 integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
8148 dependencies: 8214 dependencies:
8149 bl "^1.0.0" 8215 bl "^1.0.0"
8150 buffer-alloc "^1.1.0" 8216 buffer-alloc "^1.2.0"
8151 end-of-stream "^1.0.0" 8217 end-of-stream "^1.0.0"
8152 fs-constants "^1.0.0" 8218 fs-constants "^1.0.0"
8153 readable-stream "^2.3.0" 8219 readable-stream "^2.3.0"
8154 to-buffer "^1.1.0" 8220 to-buffer "^1.1.1"
8155 xtend "^4.0.0" 8221 xtend "^4.0.0"
8156 8222
8157tar@^2.0.0: 8223tar@^2.0.0:
8158 version "2.2.1" 8224 version "2.2.1"
8159 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 8225 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
8226 integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=
8160 dependencies: 8227 dependencies:
8161 block-stream "*" 8228 block-stream "*"
8162 fstream "^1.0.2" 8229 fstream "^1.0.2"
8163 inherits "2" 8230 inherits "2"
8164 8231
8165tar@^4, tar@^4.4.3, tar@^4.4.6: 8232tar@^4, tar@^4.4.3, tar@^4.4.6:
8166 version "4.4.6" 8233 version "4.4.8"
8167 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 8234 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
8235 integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
8168 dependencies: 8236 dependencies:
8169 chownr "^1.0.1" 8237 chownr "^1.1.1"
8170 fs-minipass "^1.2.5" 8238 fs-minipass "^1.2.5"
8171 minipass "^2.3.3" 8239 minipass "^2.3.4"
8172 minizlib "^1.1.0" 8240 minizlib "^1.1.1"
8173 mkdirp "^0.5.0" 8241 mkdirp "^0.5.0"
8174 safe-buffer "^5.1.2" 8242 safe-buffer "^5.1.2"
8175 yallist "^3.0.2" 8243 yallist "^3.0.2"
@@ -8177,12 +8245,14 @@ tar@^4, tar@^4.4.3, tar@^4.4.6:
8177term-size@^1.2.0: 8245term-size@^1.2.0:
8178 version "1.2.0" 8246 version "1.2.0"
8179 resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 8247 resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
8248 integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
8180 dependencies: 8249 dependencies:
8181 execa "^0.7.0" 8250 execa "^0.7.0"
8182 8251
8183terraformer-wkt-parser@^1.1.2: 8252terraformer-wkt-parser@^1.1.2:
8184 version "1.2.0" 8253 version "1.2.0"
8185 resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" 8254 resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34"
8255 integrity sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w==
8186 dependencies: 8256 dependencies:
8187 "@types/geojson" "^1.0.0" 8257 "@types/geojson" "^1.0.0"
8188 terraformer "~1.0.5" 8258 terraformer "~1.0.5"
@@ -8190,39 +8260,29 @@ terraformer-wkt-parser@^1.1.2:
8190terraformer@~1.0.5: 8260terraformer@~1.0.5:
8191 version "1.0.9" 8261 version "1.0.9"
8192 resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6" 8262 resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6"
8263 integrity sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag==
8193 optionalDependencies: 8264 optionalDependencies:
8194 "@types/geojson" "^1.0.0" 8265 "@types/geojson" "^1.0.0"
8195 8266
8196text-hex@1.0.x: 8267text-hex@1.0.x:
8197 version "1.0.0" 8268 version "1.0.0"
8198 resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" 8269 resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
8270 integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
8199 8271
8200text-table@~0.2.0: 8272text-table@~0.2.0:
8201 version "0.2.0" 8273 version "0.2.0"
8202 resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 8274 resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
8203 8275 integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
8204then-request@^2.2.0:
8205 version "2.2.0"
8206 resolved "https://registry.yarnpkg.com/then-request/-/then-request-2.2.0.tgz#6678b32fa0ca218fe569981bbd8871b594060d81"
8207 dependencies:
8208 caseless "~0.11.0"
8209 concat-stream "^1.4.7"
8210 http-basic "^2.5.1"
8211 http-response-object "^1.1.0"
8212 promise "^7.1.1"
8213 qs "^6.1.0"
8214 8276
8215thirty-two@^1.0.1: 8277thirty-two@^1.0.1:
8216 version "1.0.2" 8278 version "1.0.2"
8217 resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" 8279 resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a"
8218 8280 integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno=
8219throttleit@^1.0.0:
8220 version "1.0.0"
8221 resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
8222 8281
8223through2@^0.6.3, through2@~0.6.1: 8282through2@^0.6.3, through2@~0.6.1:
8224 version "0.6.5" 8283 version "0.6.5"
8225 resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 8284 resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
8285 integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
8226 dependencies: 8286 dependencies:
8227 readable-stream ">=1.0.33-1 <1.1.0-0" 8287 readable-stream ">=1.0.33-1 <1.1.0-0"
8228 xtend ">=4.0.0 <4.1.0-0" 8288 xtend ">=4.0.0 <4.1.0-0"
@@ -8230,84 +8290,80 @@ through2@^0.6.3, through2@~0.6.1:
8230through2@^1.0.0: 8290through2@^1.0.0:
8231 version "1.1.1" 8291 version "1.1.1"
8232 resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" 8292 resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545"
8293 integrity sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=
8233 dependencies: 8294 dependencies:
8234 readable-stream ">=1.1.13-1 <1.2.0-0" 8295 readable-stream ">=1.1.13-1 <1.2.0-0"
8235 xtend ">=4.0.0 <4.1.0-0" 8296 xtend ">=4.0.0 <4.1.0-0"
8236 8297
8237through2@^2.0.0, through2@^2.0.3: 8298through2@^2.0.0, through2@^2.0.3:
8238 version "2.0.3" 8299 version "2.0.5"
8239 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 8300 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
8301 integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
8240 dependencies: 8302 dependencies:
8241 readable-stream "^2.1.5" 8303 readable-stream "~2.3.6"
8242 xtend "~4.0.1" 8304 xtend "~4.0.1"
8243 8305
8244through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: 8306through@2, "through@>=2.2.7 <3", through@^2.3.6:
8245 version "2.3.8" 8307 version "2.3.8"
8246 resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 8308 resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
8309 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
8247 8310
8248thunky@^1.0.1: 8311thunky@^1.0.1:
8249 version "1.0.2" 8312 version "1.0.3"
8250 resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" 8313 resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
8314 integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
8251 8315
8252timed-out@^4.0.0: 8316timed-out@^4.0.0:
8253 version "4.0.1" 8317 version "4.0.1"
8254 resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 8318 resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
8319 integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
8255 8320
8256timers-ext@^0.1.5: 8321timers-ext@^0.1.5:
8257 version "0.1.5" 8322 version "0.1.7"
8258 resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" 8323 resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
8324 integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
8259 dependencies: 8325 dependencies:
8260 es5-ext "~0.10.14" 8326 es5-ext "~0.10.46"
8261 next-tick "1" 8327 next-tick "1"
8262 8328
8263tiny-lr@^1.1.1:
8264 version "1.1.1"
8265 resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
8266 dependencies:
8267 body "^5.1.0"
8268 debug "^3.1.0"
8269 faye-websocket "~0.10.0"
8270 livereload-js "^2.3.0"
8271 object-assign "^4.1.0"
8272 qs "^6.4.0"
8273
8274tiny-relative-date@^1.3.0: 8329tiny-relative-date@^1.3.0:
8275 version "1.3.0" 8330 version "1.3.0"
8276 resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" 8331 resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
8277 8332 integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
8278tmp@0.0.31:
8279 version "0.0.31"
8280 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
8281 dependencies:
8282 os-tmpdir "~1.0.1"
8283 8333
8284tmp@0.0.x: 8334tmp@0.0.x:
8285 version "0.0.33" 8335 version "0.0.33"
8286 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 8336 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
8337 integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
8287 dependencies: 8338 dependencies:
8288 os-tmpdir "~1.0.2" 8339 os-tmpdir "~1.0.2"
8289 8340
8290to-array@0.1.4: 8341to-array@0.1.4:
8291 version "0.1.4" 8342 version "0.1.4"
8292 resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 8343 resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
8344 integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
8293 8345
8294to-arraybuffer@^1.0.1: 8346to-arraybuffer@^1.0.1:
8295 version "1.0.1" 8347 version "1.0.1"
8296 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 8348 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
8349 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
8297 8350
8298to-buffer@^1.1.0: 8351to-buffer@^1.1.1:
8299 version "1.1.1" 8352 version "1.1.1"
8300 resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 8353 resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
8354 integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
8301 8355
8302to-object-path@^0.3.0: 8356to-object-path@^0.3.0:
8303 version "0.3.0" 8357 version "0.3.0"
8304 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 8358 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
8359 integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
8305 dependencies: 8360 dependencies:
8306 kind-of "^3.0.2" 8361 kind-of "^3.0.2"
8307 8362
8308to-regex-range@^2.1.0: 8363to-regex-range@^2.1.0:
8309 version "2.1.1" 8364 version "2.1.1"
8310 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 8365 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
8366 integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
8311 dependencies: 8367 dependencies:
8312 is-number "^3.0.0" 8368 is-number "^3.0.0"
8313 repeat-string "^1.6.1" 8369 repeat-string "^1.6.1"
@@ -8315,6 +8371,7 @@ to-regex-range@^2.1.0:
8315to-regex@^3.0.1, to-regex@^3.0.2: 8371to-regex@^3.0.1, to-regex@^3.0.2:
8316 version "3.0.2" 8372 version "3.0.2"
8317 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 8373 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
8374 integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
8318 dependencies: 8375 dependencies:
8319 define-property "^2.0.2" 8376 define-property "^2.0.2"
8320 extend-shallow "^3.0.2" 8377 extend-shallow "^3.0.2"
@@ -8324,6 +8381,7 @@ to-regex@^3.0.1, to-regex@^3.0.2:
8324to-utf-8@^1.2.0: 8381to-utf-8@^1.2.0:
8325 version "1.3.0" 8382 version "1.3.0"
8326 resolved "https://registry.yarnpkg.com/to-utf-8/-/to-utf-8-1.3.0.tgz#b2af7be9e003f4c3817cc116d3baed2a054993c9" 8383 resolved "https://registry.yarnpkg.com/to-utf-8/-/to-utf-8-1.3.0.tgz#b2af7be9e003f4c3817cc116d3baed2a054993c9"
8384 integrity sha1-sq976eAD9MOBfMEW07rtKgVJk8k=
8327 dependencies: 8385 dependencies:
8328 charset-detector "0.0.2" 8386 charset-detector "0.0.2"
8329 iconv-lite "^0.4.4" 8387 iconv-lite "^0.4.4"
@@ -8334,10 +8392,12 @@ to-utf-8@^1.2.0:
8334toposort-class@^1.0.1: 8392toposort-class@^1.0.1:
8335 version "1.0.1" 8393 version "1.0.1"
8336 resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 8394 resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
8395 integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=
8337 8396
8338torrent-discovery@^9.1.1: 8397torrent-discovery@^9.1.1:
8339 version "9.1.1" 8398 version "9.1.1"
8340 resolved "https://registry.yarnpkg.com/torrent-discovery/-/torrent-discovery-9.1.1.tgz#56704e6747b24fe00dbb75b442d202051f78d37d" 8399 resolved "https://registry.yarnpkg.com/torrent-discovery/-/torrent-discovery-9.1.1.tgz#56704e6747b24fe00dbb75b442d202051f78d37d"
8400 integrity sha512-3mHf+bxVCVLrlkPJdAoMbPMY1hpTZVeWw5hNc2pPFm+HCc2DS0HgVFTBTSWtB8vQPWA1hSEZpqJ+3QfdXxDE1g==
8341 dependencies: 8401 dependencies:
8342 bittorrent-dht "^9.0.0" 8402 bittorrent-dht "^9.0.0"
8343 bittorrent-tracker "^9.0.0" 8403 bittorrent-tracker "^9.0.0"
@@ -8347,57 +8407,42 @@ torrent-discovery@^9.1.1:
8347torrent-piece@^2.0.0: 8407torrent-piece@^2.0.0:
8348 version "2.0.0" 8408 version "2.0.0"
8349 resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz#6598ae67d93699e887f178db267ba16d89d7ec9b" 8409 resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz#6598ae67d93699e887f178db267ba16d89d7ec9b"
8410 integrity sha512-H/Z/yCuvZJj1vl1IQHI8dvF2QrUuXRJoptT5DW5967/dsLpXlCg+uyhFR5lfNj5mNaYePUbKtnL+qKWZGXv4Nw==
8350 8411
8351touch@^3.1.0: 8412touch@^3.1.0:
8352 version "3.1.0" 8413 version "3.1.0"
8353 resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 8414 resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
8415 integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
8354 dependencies: 8416 dependencies:
8355 nopt "~1.0.10" 8417 nopt "~1.0.10"
8356 8418
8357tough-cookie@~2.3.3:
8358 version "2.3.4"
8359 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
8360 dependencies:
8361 punycode "^1.4.1"
8362
8363tough-cookie@~2.4.3: 8419tough-cookie@~2.4.3:
8364 version "2.4.3" 8420 version "2.4.3"
8365 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 8421 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
8422 integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
8366 dependencies: 8423 dependencies:
8367 psl "^1.1.24" 8424 psl "^1.1.24"
8368 punycode "^1.4.1" 8425 punycode "^1.4.1"
8369 8426
8370trace@^1.1.0:
8371 version "1.2.0"
8372 resolved "https://registry.yarnpkg.com/trace/-/trace-1.2.0.tgz#fc294988fe9b37bf66e41f5f5cd69413fd28159f"
8373 dependencies:
8374 stack-chain "~1.3.1"
8375
8376traverse@>=0.2.4: 8427traverse@>=0.2.4:
8377 version "0.6.6" 8428 version "0.6.6"
8378 resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" 8429 resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
8430 integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
8379 8431
8380tree-kill@^1.1.0: 8432tree-kill@^1.1.0:
8381 version "1.2.0" 8433 version "1.2.1"
8382 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" 8434 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
8383 8435 integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
8384trim-newlines@^1.0.0:
8385 version "1.0.0"
8386 resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
8387 8436
8388triple-beam@^1.2.0, triple-beam@^1.3.0: 8437triple-beam@^1.2.0, triple-beam@^1.3.0:
8389 version "1.3.0" 8438 version "1.3.0"
8390 resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" 8439 resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
8391 8440 integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
8392"true-case-path@^1.0.2":
8393 version "1.0.3"
8394 resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
8395 dependencies:
8396 glob "^7.1.2"
8397 8441
8398ts-node@7.0.1: 8442ts-node@7.0.1:
8399 version "7.0.1" 8443 version "7.0.1"
8400 resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" 8444 resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf"
8445 integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==
8401 dependencies: 8446 dependencies:
8402 arrify "^1.0.0" 8447 arrify "^1.0.0"
8403 buffer-from "^1.1.0" 8448 buffer-from "^1.1.0"
@@ -8411,20 +8456,24 @@ ts-node@7.0.1:
8411tslib@1.9.0: 8456tslib@1.9.0:
8412 version "1.9.0" 8457 version "1.9.0"
8413 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 8458 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
8459 integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
8414 8460
8415tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: 8461tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
8416 version "1.9.3" 8462 version "1.9.3"
8417 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 8463 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
8464 integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
8418 8465
8419tslint-config-standard@^8.0.1: 8466tslint-config-standard@^8.0.1:
8420 version "8.0.1" 8467 version "8.0.1"
8421 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4" 8468 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4"
8469 integrity sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==
8422 dependencies: 8470 dependencies:
8423 tslint-eslint-rules "^5.3.1" 8471 tslint-eslint-rules "^5.3.1"
8424 8472
8425tslint-eslint-rules@^5.3.1: 8473tslint-eslint-rules@^5.3.1:
8426 version "5.4.0" 8474 version "5.4.0"
8427 resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" 8475 resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5"
8476 integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==
8428 dependencies: 8477 dependencies:
8429 doctrine "0.7.2" 8478 doctrine "0.7.2"
8430 tslib "1.9.0" 8479 tslib "1.9.0"
@@ -8433,6 +8482,7 @@ tslint-eslint-rules@^5.3.1:
8433tslint@^5.7.0: 8482tslint@^5.7.0:
8434 version "5.11.0" 8483 version "5.11.0"
8435 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 8484 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
8485 integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0=
8436 dependencies: 8486 dependencies:
8437 babel-code-frame "^6.22.0" 8487 babel-code-frame "^6.22.0"
8438 builtin-modules "^1.1.1" 8488 builtin-modules "^1.1.1"
@@ -8450,53 +8500,63 @@ tslint@^5.7.0:
8450tsutils@^2.27.2: 8500tsutils@^2.27.2:
8451 version "2.29.0" 8501 version "2.29.0"
8452 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 8502 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
8503 integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
8453 dependencies: 8504 dependencies:
8454 tslib "^1.8.1" 8505 tslib "^1.8.1"
8455 8506
8456tsutils@^3.0.0: 8507tsutils@^3.0.0:
8457 version "3.0.0" 8508 version "3.5.2"
8458 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.0.0.tgz#0c5070a17a0503e056da038c48b5a1870a50a9ad" 8509 resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.2.tgz#6fd3c2d5a731e83bb21b070a173ec0faf3a8f6d3"
8510 integrity sha512-qIlklNuI/1Dzfm+G+kJV5gg3gimZIX5haYtIVQe7qGyKd7eu8T1t1DY6pz4Sc2CGXAj9s1izycctm9Zfl9sRuQ==
8459 dependencies: 8511 dependencies:
8460 tslib "^1.8.1" 8512 tslib "^1.8.1"
8461 8513
8462tunnel-agent@^0.6.0: 8514tunnel-agent@^0.6.0:
8463 version "0.6.0" 8515 version "0.6.0"
8464 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 8516 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
8517 integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
8465 dependencies: 8518 dependencies:
8466 safe-buffer "^5.0.1" 8519 safe-buffer "^5.0.1"
8467 8520
8468tv4@~1.2.7: 8521tv4@~1.2.7:
8469 version "1.2.7" 8522 version "1.2.7"
8470 resolved "https://registry.yarnpkg.com/tv4/-/tv4-1.2.7.tgz#bd29389afc73ade49ae5f48142b5d544bf68d120" 8523 resolved "https://registry.yarnpkg.com/tv4/-/tv4-1.2.7.tgz#bd29389afc73ade49ae5f48142b5d544bf68d120"
8524 integrity sha1-vSk4mvxzreSa5fSBQrXVRL9o0SA=
8471 8525
8472tweetnacl@^0.14.3, tweetnacl@~0.14.0: 8526tweetnacl@^0.14.3, tweetnacl@~0.14.0:
8473 version "0.14.5" 8527 version "0.14.5"
8474 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 8528 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
8529 integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
8475 8530
8476type-check@~0.3.2: 8531type-check@~0.3.2:
8477 version "0.3.2" 8532 version "0.3.2"
8478 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 8533 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
8534 integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
8479 dependencies: 8535 dependencies:
8480 prelude-ls "~1.1.2" 8536 prelude-ls "~1.1.2"
8481 8537
8482type-detect@0.1.1: 8538type-detect@0.1.1:
8483 version "0.1.1" 8539 version "0.1.1"
8484 resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 8540 resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
8541 integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI=
8485 8542
8486type-detect@^4.0.0: 8543type-detect@^4.0.0, type-detect@^4.0.5:
8487 version "4.0.8" 8544 version "4.0.8"
8488 resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 8545 resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
8546 integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
8489 8547
8490type-is@1.6.15: 8548type-is@1.6.15:
8491 version "1.6.15" 8549 version "1.6.15"
8492 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 8550 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
8551 integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA=
8493 dependencies: 8552 dependencies:
8494 media-typer "0.3.0" 8553 media-typer "0.3.0"
8495 mime-types "~2.1.15" 8554 mime-types "~2.1.15"
8496 8555
8497type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16, type-is@~1.6.6: 8556type-is@^1.6.4, type-is@~1.6.16, type-is@~1.6.6:
8498 version "1.6.16" 8557 version "1.6.16"
8499 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 8558 resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
8559 integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==
8500 dependencies: 8560 dependencies:
8501 media-typer "0.3.0" 8561 media-typer "0.3.0"
8502 mime-types "~2.1.18" 8562 mime-types "~2.1.18"
@@ -8504,76 +8564,65 @@ type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16, type-is@~1.6.6:
8504typedarray-to-buffer@^3.0.0: 8564typedarray-to-buffer@^3.0.0:
8505 version "3.1.5" 8565 version "3.1.5"
8506 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 8566 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
8567 integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
8507 dependencies: 8568 dependencies:
8508 is-typedarray "^1.0.0" 8569 is-typedarray "^1.0.0"
8509 8570
8510typedarray@^0.0.6: 8571typedarray@^0.0.6:
8511 version "0.0.6" 8572 version "0.0.6"
8512 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 8573 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
8574 integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
8513 8575
8514typescript@^2.5.2: 8576typescript@^3.1.6:
8515 version "2.9.2" 8577 version "3.2.1"
8516 resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" 8578 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192"
8517 8579 integrity sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg==
8518uglify-js@^3.1.4, uglify-js@~3.4.0:
8519 version "3.4.9"
8520 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
8521 dependencies:
8522 commander "~2.17.1"
8523 source-map "~0.6.1"
8524 8580
8525uid-number@0.0.6: 8581uid-number@0.0.6:
8526 version "0.0.6" 8582 version "0.0.6"
8527 resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 8583 resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
8584 integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
8528 8585
8529uint64be@^2.0.2: 8586uint64be@^2.0.2:
8530 version "2.0.2" 8587 version "2.0.2"
8531 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5" 8588 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5"
8589 integrity sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==
8532 dependencies: 8590 dependencies:
8533 buffer-alloc "^1.1.0" 8591 buffer-alloc "^1.1.0"
8534 8592
8535ultron@1.0.x: 8593ultron@1.0.x:
8536 version "1.0.2" 8594 version "1.0.2"
8537 resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" 8595 resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
8596 integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=
8538 8597
8539umask@^1.1.0, umask@~1.1.0: 8598umask@^1.1.0, umask@~1.1.0:
8540 version "1.1.0" 8599 version "1.1.0"
8541 resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" 8600 resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
8601 integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
8542 8602
8543undefsafe@^2.0.2: 8603undefsafe@^2.0.2:
8544 version "2.0.2" 8604 version "2.0.2"
8545 resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" 8605 resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76"
8606 integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=
8546 dependencies: 8607 dependencies:
8547 debug "^2.2.0" 8608 debug "^2.2.0"
8548 8609
8549underscore-keypath@~0.0.22: 8610underscore-keypath@~0.0.22:
8550 version "0.0.22" 8611 version "0.0.22"
8551 resolved "https://registry.yarnpkg.com/underscore-keypath/-/underscore-keypath-0.0.22.tgz#48a528392bb6efc424be1caa56da4b5faccf264d" 8612 resolved "https://registry.yarnpkg.com/underscore-keypath/-/underscore-keypath-0.0.22.tgz#48a528392bb6efc424be1caa56da4b5faccf264d"
8613 integrity sha1-SKUoOSu278QkvhyqVtpLX6zPJk0=
8552 dependencies: 8614 dependencies:
8553 underscore "*" 8615 underscore "*"
8554 8616
8555underscore.string@~2.3.3: 8617underscore@*:
8556 version "2.3.3"
8557 resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d"
8558
8559underscore.string@~3.3.4:
8560 version "3.3.4"
8561 resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
8562 dependencies:
8563 sprintf-js "^1.0.3"
8564 util-deprecate "^1.0.2"
8565
8566underscore@*, underscore@^1.7.0:
8567 version "1.9.1" 8618 version "1.9.1"
8568 resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" 8619 resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
8569 8620 integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
8570unicode-5.2.0@^0.7.5:
8571 version "0.7.5"
8572 resolved "https://registry.yarnpkg.com/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz#e0df129431a28a95263d8c480fb5e9ab2b0973f0"
8573 8621
8574union-value@^1.0.0: 8622union-value@^1.0.0:
8575 version "1.0.0" 8623 version "1.0.0"
8576 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 8624 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
8625 integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
8577 dependencies: 8626 dependencies:
8578 arr-union "^3.1.0" 8627 arr-union "^3.1.0"
8579 get-value "^2.0.6" 8628 get-value "^2.0.6"
@@ -8583,40 +8632,48 @@ union-value@^1.0.0:
8583uniq@^1.0.1: 8632uniq@^1.0.1:
8584 version "1.0.1" 8633 version "1.0.1"
8585 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 8634 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
8635 integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
8586 8636
8587unique-filename@^1.1.0, unique-filename@~1.1.0: 8637unique-filename@^1.1.0, unique-filename@~1.1.0:
8588 version "1.1.0" 8638 version "1.1.1"
8589 resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" 8639 resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
8640 integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
8590 dependencies: 8641 dependencies:
8591 unique-slug "^2.0.0" 8642 unique-slug "^2.0.0"
8592 8643
8593unique-slug@^2.0.0: 8644unique-slug@^2.0.0:
8594 version "2.0.0" 8645 version "2.0.1"
8595 resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" 8646 resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6"
8647 integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==
8596 dependencies: 8648 dependencies:
8597 imurmurhash "^0.1.4" 8649 imurmurhash "^0.1.4"
8598 8650
8599unique-string@^1.0.0: 8651unique-string@^1.0.0:
8600 version "1.0.0" 8652 version "1.0.0"
8601 resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 8653 resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
8654 integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
8602 dependencies: 8655 dependencies:
8603 crypto-random-string "^1.0.0" 8656 crypto-random-string "^1.0.0"
8604 8657
8605universalify@^0.1.0: 8658universalify@^0.1.0:
8606 version "0.1.2" 8659 version "0.1.2"
8607 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 8660 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
8661 integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
8608 8662
8609unordered-array-remove@^1.0.2: 8663unordered-array-remove@^1.0.2:
8610 version "1.0.2" 8664 version "1.0.2"
8611 resolved "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz#c546e8f88e317a0cf2644c97ecb57dba66d250ef" 8665 resolved "https://registry.yarnpkg.com/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz#c546e8f88e317a0cf2644c97ecb57dba66d250ef"
8666 integrity sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=
8612 8667
8613unpipe@1.0.0, unpipe@~1.0.0: 8668unpipe@1.0.0, unpipe@~1.0.0:
8614 version "1.0.0" 8669 version "1.0.0"
8615 resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 8670 resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
8671 integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
8616 8672
8617unset-value@^1.0.0: 8673unset-value@^1.0.0:
8618 version "1.0.0" 8674 version "1.0.0"
8619 resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 8675 resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
8676 integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
8620 dependencies: 8677 dependencies:
8621 has-value "^0.3.1" 8678 has-value "^0.3.1"
8622 isobject "^3.0.0" 8679 isobject "^3.0.0"
@@ -8624,14 +8681,17 @@ unset-value@^1.0.0:
8624unzip-response@^2.0.1: 8681unzip-response@^2.0.1:
8625 version "2.0.1" 8682 version "2.0.1"
8626 resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 8683 resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
8684 integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
8627 8685
8628upath@^1.0.5: 8686upath@^1.0.5:
8629 version "1.1.0" 8687 version "1.1.0"
8630 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" 8688 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
8689 integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==
8631 8690
8632update-notifier@^2.3.0, update-notifier@^2.5.0: 8691update-notifier@^2.3.0, update-notifier@^2.5.0:
8633 version "2.5.0" 8692 version "2.5.0"
8634 resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 8693 resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
8694 integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
8635 dependencies: 8695 dependencies:
8636 boxen "^1.2.1" 8696 boxen "^1.2.1"
8637 chalk "^2.0.1" 8697 chalk "^2.0.1"
@@ -8644,39 +8704,46 @@ update-notifier@^2.3.0, update-notifier@^2.5.0:
8644 semver-diff "^2.0.0" 8704 semver-diff "^2.0.0"
8645 xdg-basedir "^3.0.0" 8705 xdg-basedir "^3.0.0"
8646 8706
8647uri-js@^3.0.2: 8707uri-js@^4.2.2:
8648 version "3.0.2" 8708 version "4.2.2"
8649 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" 8709 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
8710 integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
8650 dependencies: 8711 dependencies:
8651 punycode "^2.1.0" 8712 punycode "^2.1.0"
8652 8713
8653uri-path@^1.0.0:
8654 version "1.0.0"
8655 resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32"
8656
8657urix@^0.1.0: 8714urix@^0.1.0:
8658 version "0.1.0" 8715 version "0.1.0"
8659 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 8716 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
8717 integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
8718
8719url-join@^4.0.0:
8720 version "4.0.0"
8721 resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a"
8722 integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=
8660 8723
8661url-parse-lax@^1.0.0: 8724url-parse-lax@^1.0.0:
8662 version "1.0.0" 8725 version "1.0.0"
8663 resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 8726 resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
8727 integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
8664 dependencies: 8728 dependencies:
8665 prepend-http "^1.0.1" 8729 prepend-http "^1.0.1"
8666 8730
8667use@^3.1.0: 8731use@^3.1.0:
8668 version "3.1.1" 8732 version "3.1.1"
8669 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 8733 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
8734 integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
8670 8735
8671user-home@^2.0.0: 8736user-home@^2.0.0:
8672 version "2.0.0" 8737 version "2.0.0"
8673 resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 8738 resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
8739 integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
8674 dependencies: 8740 dependencies:
8675 os-homedir "^1.0.0" 8741 os-homedir "^1.0.0"
8676 8742
8677useragent@^2.3.0: 8743useragent@^2.3.0:
8678 version "2.3.0" 8744 version "2.3.0"
8679 resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" 8745 resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
8746 integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==
8680 dependencies: 8747 dependencies:
8681 lru-cache "4.1.x" 8748 lru-cache "4.1.x"
8682 tmp "0.0.x" 8749 tmp "0.0.x"
@@ -8684,6 +8751,7 @@ useragent@^2.3.0:
8684ut_metadata@^3.3.0: 8751ut_metadata@^3.3.0:
8685 version "3.3.0" 8752 version "3.3.0"
8686 resolved "https://registry.yarnpkg.com/ut_metadata/-/ut_metadata-3.3.0.tgz#a0e0e861ebc39ed96e506601d1463ade3b548a7e" 8753 resolved "https://registry.yarnpkg.com/ut_metadata/-/ut_metadata-3.3.0.tgz#a0e0e861ebc39ed96e506601d1463ade3b548a7e"
8754 integrity sha512-IK+ke9yL6a4oPLz/3oSW9TW7m9Wr4RG+5kW5aS2YulzEU1QDGAtago/NnOlno91fo3fSO7mnsqzn3NXNXdv8nA==
8687 dependencies: 8755 dependencies:
8688 bencode "^2.0.0" 8756 bencode "^2.0.0"
8689 bitfield "^2.0.0" 8757 bitfield "^2.0.0"
@@ -8693,6 +8761,7 @@ ut_metadata@^3.3.0:
8693ut_pex@^1.1.1: 8761ut_pex@^1.1.1:
8694 version "1.2.1" 8762 version "1.2.1"
8695 resolved "https://registry.yarnpkg.com/ut_pex/-/ut_pex-1.2.1.tgz#472ed0ea5e9bbc9148b833339d56d7b17cf3dad0" 8763 resolved "https://registry.yarnpkg.com/ut_pex/-/ut_pex-1.2.1.tgz#472ed0ea5e9bbc9148b833339d56d7b17cf3dad0"
8764 integrity sha512-ZrxMCbffYtxQDqvREN9kBXK2CB9tPnd5PylHoqQX9ai+3HV9/S39FnA5JnhLOC82dxIQQg0nTN2wmhtAdGNtOA==
8696 dependencies: 8765 dependencies:
8697 bencode "^2.0.0" 8766 bencode "^2.0.0"
8698 compact2string "^1.2.0" 8767 compact2string "^1.2.0"
@@ -8702,26 +8771,31 @@ ut_pex@^1.1.1:
8702utf-8-validate@^5.0.1: 8771utf-8-validate@^5.0.1:
8703 version "5.0.1" 8772 version "5.0.1"
8704 resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.1.tgz#cef1f9011ba4b216f4d7c6ddf5189d750599ff8b" 8773 resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.1.tgz#cef1f9011ba4b216f4d7c6ddf5189d750599ff8b"
8774 integrity sha512-Qef1AuiWWxQeZ1Oa4DTV3ArRafpZvsK+CLrlB8khLfsV+9mwhj58hNSGmel0ns5jYP+3yEwav6vxxW7Gz85bVw==
8705 dependencies: 8775 dependencies:
8706 node-gyp-build "~3.4.0" 8776 node-gyp-build "~3.4.0"
8707 8777
8708util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: 8778util-deprecate@^1.0.1, util-deprecate@~1.0.1:
8709 version "1.0.2" 8779 version "1.0.2"
8710 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 8780 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
8781 integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
8711 8782
8712util-extend@^1.0.1: 8783util-extend@^1.0.1:
8713 version "1.0.3" 8784 version "1.0.3"
8714 resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" 8785 resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
8786 integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=
8715 8787
8716util@^0.10.3: 8788util@^0.10.3:
8717 version "0.10.4" 8789 version "0.10.4"
8718 resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 8790 resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
8791 integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
8719 dependencies: 8792 dependencies:
8720 inherits "2.0.3" 8793 inherits "2.0.3"
8721 8794
8722utile@0.3.x: 8795utile@0.3.x:
8723 version "0.3.0" 8796 version "0.3.0"
8724 resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" 8797 resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a"
8798 integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=
8725 dependencies: 8799 dependencies:
8726 async "~0.9.0" 8800 async "~0.9.0"
8727 deep-equal "~0.2.1" 8801 deep-equal "~0.2.1"
@@ -8733,14 +8807,17 @@ utile@0.3.x:
8733utils-merge@1.0.0: 8807utils-merge@1.0.0:
8734 version "1.0.0" 8808 version "1.0.0"
8735 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 8809 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
8810 integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=
8736 8811
8737utils-merge@1.0.1: 8812utils-merge@1.0.1:
8738 version "1.0.1" 8813 version "1.0.1"
8739 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 8814 resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
8815 integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
8740 8816
8741uue@^3.1.0: 8817uue@^3.1.0:
8742 version "3.1.2" 8818 version "3.1.2"
8743 resolved "https://registry.yarnpkg.com/uue/-/uue-3.1.2.tgz#e99368414e87200012eb37de4dbaebaa1c742ad2" 8819 resolved "https://registry.yarnpkg.com/uue/-/uue-3.1.2.tgz#e99368414e87200012eb37de4dbaebaa1c742ad2"
8820 integrity sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg==
8744 dependencies: 8821 dependencies:
8745 escape-string-regexp "~1.0.5" 8822 escape-string-regexp "~1.0.5"
8746 extend "~3.0.0" 8823 extend "~3.0.0"
@@ -8748,10 +8825,12 @@ uue@^3.1.0:
8748uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: 8825uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2:
8749 version "3.3.2" 8826 version "3.3.2"
8750 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 8827 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
8828 integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
8751 8829
8752validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: 8830validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
8753 version "3.0.4" 8831 version "3.0.4"
8754 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 8832 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
8833 integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
8755 dependencies: 8834 dependencies:
8756 spdx-correct "^3.0.0" 8835 spdx-correct "^3.0.0"
8757 spdx-expression-parse "^3.0.0" 8836 spdx-expression-parse "^3.0.0"
@@ -8759,68 +8838,66 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
8759validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: 8838validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
8760 version "3.0.0" 8839 version "3.0.0"
8761 resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" 8840 resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
8841 integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
8762 dependencies: 8842 dependencies:
8763 builtins "^1.0.3" 8843 builtins "^1.0.3"
8764 8844
8765validator@^10.2.0, validator@^10.4.0: 8845validator@^10.0.0, validator@^10.2.0, validator@^10.4.0:
8766 version "10.7.1" 8846 version "10.9.0"
8767 resolved "https://registry.yarnpkg.com/validator/-/validator-10.7.1.tgz#dd4cc750c2134ce4a15a2acfc7b233669d659c5b" 8847 resolved "https://registry.yarnpkg.com/validator/-/validator-10.9.0.tgz#d10c11673b5061fb7ccf4c1114412411b2bac2a8"
8848 integrity sha512-hZJcZSWz9poXBlAkjjcsNAdrZ6JbjD3kWlNjq/+vE7RLLS/+8PAj3qVVwrwsOz/WL8jPmZ1hYkRvtlUeZAm4ug==
8768 8849
8769vary@^1, vary@~1.1.2: 8850vary@^1, vary@~1.1.2:
8770 version "1.1.2" 8851 version "1.1.2"
8771 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 8852 resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
8853 integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
8772 8854
8773vary@~1.0.1: 8855vary@~1.0.1:
8774 version "1.0.1" 8856 version "1.0.1"
8775 resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" 8857 resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
8858 integrity sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=
8776 8859
8777verror@1.10.0: 8860verror@1.10.0:
8778 version "1.10.0" 8861 version "1.10.0"
8779 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 8862 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
8863 integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
8780 dependencies: 8864 dependencies:
8781 assert-plus "^1.0.0" 8865 assert-plus "^1.0.0"
8782 core-util-is "1.0.2" 8866 core-util-is "1.0.2"
8783 extsprintf "^1.2.0" 8867 extsprintf "^1.2.0"
8784 8868
8785videostream@^2.5.1: 8869videostream@^2.5.1:
8786 version "2.5.1" 8870 version "2.6.0"
8787 resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.5.1.tgz#993a8f3efe277e5c8d26a7814ba0c68f79b20688" 8871 resolved "https://registry.yarnpkg.com/videostream/-/videostream-2.6.0.tgz#7f0b2b84bc457c12cfe599aa2345f5cc06241ab6"
8872 integrity sha512-nSsullx1BYClJxVSt4Fa+Ulsv0Cf7UwaHq+4LQdLkAUdmqNhY1DlGxXDWVY2gui5XV4FvDiSbXmSbGryMrrUCQ==
8788 dependencies: 8873 dependencies:
8789 binary-search "^1.3.4" 8874 binary-search "^1.3.4"
8790 inherits "^2.0.1" 8875 inherits "^2.0.1"
8791 mediasource "^2.0.0" 8876 mediasource "^2.2.2"
8792 mp4-box-encoding "^1.3.0" 8877 mp4-box-encoding "^1.3.0"
8793 mp4-stream "^2.0.0" 8878 mp4-stream "^2.0.0"
8794 multistream "^2.0.2" 8879 multistream "^2.0.2"
8795 pump "^3.0.0" 8880 pump "^3.0.0"
8796 range-slice-stream "^1.2.0" 8881 range-slice-stream "^2.0.0"
8797 8882
8798wcwidth@^1.0.0: 8883wcwidth@^1.0.0:
8799 version "1.0.1" 8884 version "1.0.1"
8800 resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 8885 resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
8886 integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
8801 dependencies: 8887 dependencies:
8802 defaults "^1.0.3" 8888 defaults "^1.0.3"
8803 8889
8804webfinger.js@^2.6.6: 8890webfinger.js@^2.6.6:
8805 version "2.6.6" 8891 version "2.7.0"
8806 resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae" 8892 resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.7.0.tgz#403354a14a65aeeba64c1408c18a387487cea106"
8893 integrity sha512-l+UtsuV4zrBKyVAj9VCtwWgscTgadCsdGgL1OvbV102cvydWwJCGXlFIXauzWLzfheIDHfPNRWfgMuwyC6ZfIA==
8807 dependencies: 8894 dependencies:
8808 xhr2 "^0.1.4" 8895 xhr2 "^0.1.4"
8809 8896
8810websocket-driver@>=0.5.1:
8811 version "0.7.0"
8812 resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
8813 dependencies:
8814 http-parser-js ">=0.4.0"
8815 websocket-extensions ">=0.1.1"
8816
8817websocket-extensions@>=0.1.1:
8818 version "0.1.3"
8819 resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
8820
8821webtorrent@^0.102.1: 8897webtorrent@^0.102.1:
8822 version "0.102.4" 8898 version "0.102.4"
8823 resolved "https://registry.yarnpkg.com/webtorrent/-/webtorrent-0.102.4.tgz#0902f5dddb244c4ca8137d5d678546b733adeb2f" 8899 resolved "https://registry.yarnpkg.com/webtorrent/-/webtorrent-0.102.4.tgz#0902f5dddb244c4ca8137d5d678546b733adeb2f"
8900 integrity sha512-Oa7NatbPlESqf5ETwgVUOXAbUjiZr7XNFbHhd88BRm+4vN9u3JgeIbF9Gnuxb5s26cHxPYpGJRVTtBsc6Z6w9Q==
8824 dependencies: 8901 dependencies:
8825 addr-to-ip-port "^1.4.2" 8902 addr-to-ip-port "^1.4.2"
8826 bitfield "^2.0.0" 8903 bitfield "^2.0.0"
@@ -8863,54 +8940,54 @@ webtorrent@^0.102.1:
8863 ut_metadata "^3.3.0" 8940 ut_metadata "^3.3.0"
8864 ut_pex "^1.1.1" 8941 ut_pex "^1.1.1"
8865 8942
8866what-input@^4.1.3:
8867 version "4.3.1"
8868 resolved "https://registry.yarnpkg.com/what-input/-/what-input-4.3.1.tgz#b8ea7554ba1d9171887c4c6addf28185fec3d31d"
8869
8870which-module@^1.0.0:
8871 version "1.0.0"
8872 resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
8873
8874which-module@^2.0.0: 8943which-module@^2.0.0:
8875 version "2.0.0" 8944 version "2.0.0"
8876 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 8945 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
8946 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
8877 8947
8878which-pm-runs@^1.0.0: 8948which-pm-runs@^1.0.0:
8879 version "1.0.0" 8949 version "1.0.0"
8880 resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" 8950 resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
8951 integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
8881 8952
8882which@1, which@^1.1.1, which@^1.2.10, which@^1.2.9, which@^1.3.0, which@^1.3.1, which@~1.3.0: 8953which@1, which@^1.1.1, which@^1.2.10, which@^1.2.9, which@^1.3.0, which@^1.3.1:
8883 version "1.3.1" 8954 version "1.3.1"
8884 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 8955 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
8956 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
8885 dependencies: 8957 dependencies:
8886 isexe "^2.0.0" 8958 isexe "^2.0.0"
8887 8959
8888wide-align@^1.1.0: 8960wide-align@^1.1.0:
8889 version "1.1.3" 8961 version "1.1.3"
8890 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 8962 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
8963 integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
8891 dependencies: 8964 dependencies:
8892 string-width "^1.0.2 || 2" 8965 string-width "^1.0.2 || 2"
8893 8966
8894widest-line@^2.0.0: 8967widest-line@^2.0.0:
8895 version "2.0.0" 8968 version "2.0.1"
8896 resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" 8969 resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
8970 integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
8897 dependencies: 8971 dependencies:
8898 string-width "^2.1.1" 8972 string-width "^2.1.1"
8899 8973
8900wildstring@1.0.8: 8974wildstring@1.0.8:
8901 version "1.0.8" 8975 version "1.0.8"
8902 resolved "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.8.tgz#80b5f85b7f8aa98bc19cc230e60ac7f5e0dd226d" 8976 resolved "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.8.tgz#80b5f85b7f8aa98bc19cc230e60ac7f5e0dd226d"
8977 integrity sha1-gLX4W3+KqYvBnMIw5grH9eDdIm0=
8903 8978
8904winston-transport@^4.2.0: 8979winston-transport@^4.2.0:
8905 version "4.2.0" 8980 version "4.2.0"
8906 resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.2.0.tgz#a20be89edf2ea2ca39ba25f3e50344d73e6520e5" 8981 resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.2.0.tgz#a20be89edf2ea2ca39ba25f3e50344d73e6520e5"
8982 integrity sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==
8907 dependencies: 8983 dependencies:
8908 readable-stream "^2.3.6" 8984 readable-stream "^2.3.6"
8909 triple-beam "^1.2.0" 8985 triple-beam "^1.2.0"
8910 8986
8911winston@2.1.x: 8987winston@2.1.x:
8912 version "2.1.1" 8988 version "2.1.1"
8913 resolved "http://registry.npmjs.org/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" 8989 resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e"
8990 integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=
8914 dependencies: 8991 dependencies:
8915 async "~1.0.0" 8992 async "~1.0.0"
8916 colors "1.0.x" 8993 colors "1.0.x"
@@ -8923,6 +9000,7 @@ winston@2.1.x:
8923winston@3.1.0: 9000winston@3.1.0:
8924 version "3.1.0" 9001 version "3.1.0"
8925 resolved "https://registry.yarnpkg.com/winston/-/winston-3.1.0.tgz#80724376aef164e024f316100d5b178d78ac5331" 9002 resolved "https://registry.yarnpkg.com/winston/-/winston-3.1.0.tgz#80724376aef164e024f316100d5b178d78ac5331"
9003 integrity sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==
8926 dependencies: 9004 dependencies:
8927 async "^2.6.0" 9005 async "^2.6.0"
8928 diagnostics "^1.1.1" 9006 diagnostics "^1.1.1"
@@ -8934,51 +9012,50 @@ winston@3.1.0:
8934 triple-beam "^1.3.0" 9012 triple-beam "^1.3.0"
8935 winston-transport "^4.2.0" 9013 winston-transport "^4.2.0"
8936 9014
8937winston@^2.4.0:
8938 version "2.4.4"
8939 resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b"
8940 dependencies:
8941 async "~1.0.0"
8942 colors "1.0.x"
8943 cycle "1.0.x"
8944 eyes "0.1.x"
8945 isstream "0.1.x"
8946 stack-trace "0.0.x"
8947
8948wkx@^0.4.1: 9015wkx@^0.4.1:
8949 version "0.4.5" 9016 version "0.4.5"
8950 resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.5.tgz#a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0" 9017 resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.5.tgz#a85e15a6e69d1bfaec2f3c523be3dfa40ab861d0"
9018 integrity sha512-01dloEcJZAJabLO5XdcRgqdKpmnxS0zIT02LhkdWOZX2Zs2tPM6hlZ4XG9tWaWur1Qd1OO4kJxUbe2+5BofvnA==
8951 dependencies: 9019 dependencies:
8952 "@types/node" "*" 9020 "@types/node" "*"
8953 9021
8954wordwrap@~0.0.2:
8955 version "0.0.3"
8956 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
8957
8958wordwrap@~1.0.0: 9022wordwrap@~1.0.0:
8959 version "1.0.0" 9023 version "1.0.0"
8960 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 9024 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
9025 integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
8961 9026
8962worker-farm@^1.6.0: 9027worker-farm@^1.6.0:
8963 version "1.6.0" 9028 version "1.6.0"
8964 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" 9029 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
9030 integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==
8965 dependencies: 9031 dependencies:
8966 errno "~0.1.7" 9032 errno "~0.1.7"
8967 9033
8968wrap-ansi@^2.0.0: 9034wrap-ansi@^2.0.0:
8969 version "2.1.0" 9035 version "2.1.0"
8970 resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 9036 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
9037 integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
8971 dependencies: 9038 dependencies:
8972 string-width "^1.0.1" 9039 string-width "^1.0.1"
8973 strip-ansi "^3.0.1" 9040 strip-ansi "^3.0.1"
8974 9041
9042wrap-ansi@^3.0.1:
9043 version "3.0.1"
9044 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"
9045 integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=
9046 dependencies:
9047 string-width "^2.1.1"
9048 strip-ansi "^4.0.0"
9049
8975wrappy@1: 9050wrappy@1:
8976 version "1.0.2" 9051 version "1.0.2"
8977 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 9052 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
9053 integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
8978 9054
8979write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: 9055write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
8980 version "2.3.0" 9056 version "2.3.0"
8981 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" 9057 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
9058 integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
8982 dependencies: 9059 dependencies:
8983 graceful-fs "^4.1.11" 9060 graceful-fs "^4.1.11"
8984 imurmurhash "^0.1.4" 9061 imurmurhash "^0.1.4"
@@ -8987,53 +9064,63 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
8987write@^0.2.1: 9064write@^0.2.1:
8988 version "0.2.1" 9065 version "0.2.1"
8989 resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 9066 resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
9067 integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
8990 dependencies: 9068 dependencies:
8991 mkdirp "^0.5.1" 9069 mkdirp "^0.5.1"
8992 9070
8993ws@1.1.2: 9071ws@1.1.2:
8994 version "1.1.2" 9072 version "1.1.2"
8995 resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" 9073 resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
9074 integrity sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=
8996 dependencies: 9075 dependencies:
8997 options ">=0.0.5" 9076 options ">=0.0.5"
8998 ultron "1.0.x" 9077 ultron "1.0.x"
8999 9078
9000ws@^6.0.0: 9079ws@^6.0.0, ws@~6.1.0:
9001 version "6.0.0" 9080 version "6.1.2"
9002 resolved "https://registry.yarnpkg.com/ws/-/ws-6.0.0.tgz#eaa494aded00ac4289d455bac8d84c7c651cef35" 9081 resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
9082 integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
9003 dependencies: 9083 dependencies:
9004 async-limiter "~1.0.0" 9084 async-limiter "~1.0.0"
9005 9085
9006wtf-8@1.0.0: 9086wtf-8@1.0.0:
9007 version "1.0.0" 9087 version "1.0.0"
9008 resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" 9088 resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
9089 integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=
9009 9090
9010x-xss-protection@1.1.0: 9091x-xss-protection@1.1.0:
9011 version "1.1.0" 9092 version "1.1.0"
9012 resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7" 9093 resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7"
9094 integrity sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==
9013 9095
9014xdg-basedir@^3.0.0: 9096xdg-basedir@^3.0.0:
9015 version "3.0.0" 9097 version "3.0.0"
9016 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 9098 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
9099 integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
9017 9100
9018xhr2@^0.1.4: 9101xhr2@^0.1.4:
9019 version "0.1.4" 9102 version "0.1.4"
9020 resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" 9103 resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
9104 integrity sha1-f4dliEdxbbUCYyOBL4GMras4el8=
9021 9105
9022xliff@^4.0.0: 9106xliff@^4.0.0:
9023 version "4.1.0" 9107 version "4.1.2"
9024 resolved "https://registry.yarnpkg.com/xliff/-/xliff-4.1.0.tgz#32ea268a6442c122e132e6abf874539b1fc9c6b3" 9108 resolved "https://registry.yarnpkg.com/xliff/-/xliff-4.1.2.tgz#eb6fae21346d82653febd44d478f5748ad79fbd2"
9109 integrity sha512-ru+ya+rz2cb+D3Or9sf5xrj0MCL+q+vZmWOJlqZehIWlG3hqeIXhbfLMDAW9A5BsnRfL+BdMBHaogaTUGHyMyA==
9025 dependencies: 9110 dependencies:
9026 xml-js "1.6.7" 9111 xml-js "1.6.8"
9027 9112
9028xml-js@1.6.7: 9113xml-js@1.6.8:
9029 version "1.6.7" 9114 version "1.6.8"
9030 resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.7.tgz#a99b40c18a16d3e06537b3ae026a27bd60ffe8ab" 9115 resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.8.tgz#e06419c54235f18f4c2cdda824cbd65a782330de"
9116 integrity sha512-kUv/geyN80d+s1T68uBfjoz+PjNUjwwf5AWWRwKRqqQaGozpMVsFsKYnenPsxlbN/VL7f0ia8NfLLPCDwX+95Q==
9031 dependencies: 9117 dependencies:
9032 sax "^1.2.4" 9118 sax "^1.2.4"
9033 9119
9034xml2js@^0.4.4: 9120xml2js@^0.4.4:
9035 version "0.4.19" 9121 version "0.4.19"
9036 resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 9122 resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
9123 integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
9037 dependencies: 9124 dependencies:
9038 sax ">=0.6.0" 9125 sax ">=0.6.0"
9039 xmlbuilder "~9.0.1" 9126 xmlbuilder "~9.0.1"
@@ -9041,70 +9128,84 @@ xml2js@^0.4.4:
9041xml@^1.0.1: 9128xml@^1.0.1:
9042 version "1.0.1" 9129 version "1.0.1"
9043 resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" 9130 resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
9131 integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=
9132
9133xmlbuilder@^10.0.0:
9134 version "10.1.1"
9135 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0"
9136 integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==
9044 9137
9045xmlbuilder@~9.0.1: 9138xmlbuilder@~9.0.1:
9046 version "9.0.7" 9139 version "9.0.7"
9047 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 9140 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
9141 integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
9048 9142
9049xmldom@0.1.19: 9143xmldom@0.1.19:
9050 version "0.1.19" 9144 version "0.1.19"
9051 resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc" 9145 resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc"
9146 integrity sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw=
9052 9147
9053xmlhttprequest-ssl@1.5.3: 9148xmlhttprequest-ssl@1.5.3:
9054 version "1.5.3" 9149 version "1.5.3"
9055 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" 9150 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
9151 integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=
9056 9152
9057xregexp@4.0.0: 9153xmlhttprequest-ssl@~1.5.4:
9058 version "4.0.0" 9154 version "1.5.5"
9059 resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" 9155 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
9156 integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
9060 9157
9061"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: 9158"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
9062 version "4.0.1" 9159 version "4.0.1"
9063 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 9160 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
9161 integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
9064 9162
9065y18n@^3.2.1: 9163y18n@^3.2.1:
9066 version "3.2.1" 9164 version "3.2.1"
9067 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 9165 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
9166 integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
9068 9167
9069"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: 9168"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
9070 version "4.0.0" 9169 version "4.0.0"
9071 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 9170 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
9171 integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
9072 9172
9073yallist@^2.1.2: 9173yallist@^2.1.2:
9074 version "2.1.2" 9174 version "2.1.2"
9075 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 9175 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
9176 integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
9076 9177
9077yallist@^3.0.0, yallist@^3.0.2: 9178yallist@^3.0.0, yallist@^3.0.2:
9078 version "3.0.2" 9179 version "3.0.3"
9079 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 9180 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
9080 9181 integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
9081yargs-parser@^10.1.0:
9082 version "10.1.0"
9083 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
9084 dependencies:
9085 camelcase "^4.1.0"
9086 9182
9087yargs-parser@^5.0.0: 9183yargs-parser@^11.1.1:
9088 version "5.0.0" 9184 version "11.1.1"
9089 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 9185 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
9186 integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
9090 dependencies: 9187 dependencies:
9091 camelcase "^3.0.0" 9188 camelcase "^5.0.0"
9189 decamelize "^1.2.0"
9092 9190
9093yargs-parser@^8.0.0: 9191yargs-parser@^8.0.0:
9094 version "8.1.0" 9192 version "8.1.0"
9095 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" 9193 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
9194 integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
9096 dependencies: 9195 dependencies:
9097 camelcase "^4.1.0" 9196 camelcase "^4.1.0"
9098 9197
9099yargs-parser@^9.0.2: 9198yargs-parser@^9.0.2:
9100 version "9.0.2" 9199 version "9.0.2"
9101 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" 9200 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
9201 integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
9102 dependencies: 9202 dependencies:
9103 camelcase "^4.1.0" 9203 camelcase "^4.1.0"
9104 9204
9105yargs@^11.0.0: 9205yargs@^11.0.0:
9106 version "11.1.0" 9206 version "11.1.0"
9107 resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" 9207 resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
9208 integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
9108 dependencies: 9209 dependencies:
9109 cliui "^4.0.0" 9210 cliui "^4.0.0"
9110 decamelize "^1.1.1" 9211 decamelize "^1.1.1"
@@ -9119,12 +9220,13 @@ yargs@^11.0.0:
9119 y18n "^3.2.1" 9220 y18n "^3.2.1"
9120 yargs-parser "^9.0.2" 9221 yargs-parser "^9.0.2"
9121 9222
9122yargs@^12.0.1: 9223yargs@^12.0.1, yargs@^12.0.2:
9123 version "12.0.2" 9224 version "12.0.5"
9124 resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" 9225 resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
9226 integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
9125 dependencies: 9227 dependencies:
9126 cliui "^4.0.0" 9228 cliui "^4.0.0"
9127 decamelize "^2.0.0" 9229 decamelize "^1.2.0"
9128 find-up "^3.0.0" 9230 find-up "^3.0.0"
9129 get-caller-file "^1.0.1" 9231 get-caller-file "^1.0.1"
9130 os-locale "^3.0.0" 9232 os-locale "^3.0.0"
@@ -9134,49 +9236,41 @@ yargs@^12.0.1:
9134 string-width "^2.0.0" 9236 string-width "^2.0.0"
9135 which-module "^2.0.0" 9237 which-module "^2.0.0"
9136 y18n "^3.2.1 || ^4.0.0" 9238 y18n "^3.2.1 || ^4.0.0"
9137 yargs-parser "^10.1.0" 9239 yargs-parser "^11.1.1"
9138
9139yargs@^7.0.0:
9140 version "7.1.0"
9141 resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
9142 dependencies:
9143 camelcase "^3.0.0"
9144 cliui "^3.2.0"
9145 decamelize "^1.1.1"
9146 get-caller-file "^1.0.1"
9147 os-locale "^1.4.0"
9148 read-pkg-up "^1.0.1"
9149 require-directory "^2.1.1"
9150 require-main-filename "^1.0.1"
9151 set-blocking "^2.0.0"
9152 string-width "^1.0.2"
9153 which-module "^1.0.0"
9154 y18n "^3.2.1"
9155 yargs-parser "^5.0.0"
9156
9157yauzl@2.4.1:
9158 version "2.4.1"
9159 resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
9160 dependencies:
9161 fd-slicer "~1.0.1"
9162 9240
9163yeast@0.1.2: 9241yeast@0.1.2:
9164 version "0.1.2" 9242 version "0.1.2"
9165 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 9243 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
9244 integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
9166 9245
9167yn@^2.0.0: 9246yn@^2.0.0:
9168 version "2.0.0" 9247 version "2.0.0"
9169 resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 9248 resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
9249 integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
9170 9250
9171youtube-dl@^1.12.2: 9251youtube-dl@^1.12.2:
9172 version "1.12.2" 9252 version "1.12.2"
9173 resolved "https://registry.yarnpkg.com/youtube-dl/-/youtube-dl-1.12.2.tgz#11985268564c92b229f62b43d97374f86a605d1d" 9253 resolved "https://registry.yarnpkg.com/youtube-dl/-/youtube-dl-1.12.2.tgz#11985268564c92b229f62b43d97374f86a605d1d"
9254 integrity sha512-TDGmUxzEsQCp1Ux3IEkEhJ2LfRlUjBo5AaaGmW5Hqm8uX8jd2sB+Rq37S9vy505qnFhpy05uUSQsBtpvBuQBYA==
9174 dependencies: 9255 dependencies:
9175 hh-mm-ss "^1.2.0" 9256 hh-mm-ss "^1.2.0"
9176 mkdirp "^0.5.1" 9257 mkdirp "^0.5.1"
9177 request "^2.83.0" 9258 request "^2.83.0"
9178 streamify "^0.2.9" 9259 streamify "^0.2.9"
9179 9260
9261z-schema@^3.24.1:
9262 version "3.24.2"
9263 resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.24.2.tgz#193560e718812d98fdc190c38871b634b92f2386"
9264 integrity sha512-Zb2YLJ9g72MexBXKPRzoypd4OZfVkFghdy10eVbcMNLl9YQsPXtyMpiK7a3sG7IIERg1lEDjEMrG9Km9DPbWLw==
9265 dependencies:
9266 core-js "^2.5.7"
9267 lodash.get "^4.0.0"
9268 lodash.isequal "^4.0.0"
9269 validator "^10.0.0"
9270 optionalDependencies:
9271 commander "^2.7.1"
9272
9180zero-fill@^2.2.3: 9273zero-fill@^2.2.3:
9181 version "2.2.3" 9274 version "2.2.3"
9182 resolved "https://registry.yarnpkg.com/zero-fill/-/zero-fill-2.2.3.tgz#a3def06ba5e39ae644850bb4ca2ad4112b4855e9" 9275 resolved "https://registry.yarnpkg.com/zero-fill/-/zero-fill-2.2.3.tgz#a3def06ba5e39ae644850bb4ca2ad4112b4855e9"
9276 integrity sha1-o97wa6XjmuZEhQu0yirUEStIVek=